![The Full Throttle Remastered logo](https://habrastorage.org/getpro/habr/post_images/40f/c00/6dd/40fc006dd06eebb1329bdf47f34f0f3b.png)
Full Throttle — это point-and-click адвенчура, выпущенная компанией LucasArts ещё в двадцатом веке, 30 апреля 1995 года. В дополнение к стандартному визуальному стилю геймплея point-and-click тех времён (спрайты персонажей движутся на статичном фоне) в игре также присутствовало FMV-видео в неинтерактивных катсценах и в интерактивных режимах игрового процесса. Эта технология FMV ещё больше усилила сюжетный аспект жанра, потому что позволила создателям использовать отрендеренные компьютером последовательности кадров, не требующие большой нагрузки на процессор. К тому же сжатые FMV занимали меньше пространства и помещались на целевой носитель — CD-ROM объёмом примерно 650 мегабайт.
В классической версии Full Throttle использовалась видеотехнология, разработанная сотрудником LucasArts Винсом Ли под названием INSANE. INSANE расшифровывается как INteractive Streaming ANimation Engine («движок интерактивной потоковой анимации»). Впервые она была создана и использована в Star Wars: Rebel Assault. Технология усовершенствовалась и применялась также в более поздних играх:
- Star Wars: Rebel Assault (ноябрь 1993 года)
- Full Throttle (апрель 1995 года)
- Star Wars: Rebel Assault II (ноябрь 1995 года)
- The Dig (ноябрь 1995 года)
- Outlaws (март 1997 года)
Эта система воспроизведения видео позволила создателям сжимать большие фрагменты данных в меньший формат, который вместе с другими игровыми данными вмещался на CD-ROM. На тот момент скорости ввода-вывода диска и увеличившаяся вычислительная мощь были достаточными для потоковой передачи c CD-ROM сжатых FMV, распаковки их в кадры видео и отображения на экране. FMV из Full Throttle кодировались с разрешением 320x200 и частотой 10 кадров в секунду. Кроме того, перед отправкой в аудиоустройство в реальном времени обрабатывались и микшировались встроенные в видео аудиотреки.
Для кодирования и сжатия видео в файл .SAN (Smush ANimation) использовался инструмент под названием SMUSHFT.EXE (SMUSH for Full Throttle). В отличие от стандартных систем воспроизведения видео с одной видеодорожкой и одной аудиодорожкой, файл .SAN мог содержать одну или несколько видеодорожек, а также несколько аудиодорожек для воспроизведения пользователю в зависимости от состояния игры. На рисунке ниже показан SMUSHFT.EXE с исходным файлом проекта. Можно заметить, что при прокрутке по временной шкале зелёные полосы обозначают кадры видео, а тёмно-жёлтые полосы — аудиофайлы. Также там присутствуют серые полосы, которые обозначают строки текста, соответствующие информации субтитров.
![An example of SMUSHFT.EXE in which a project file contains audio and video on a timeline](https://habrastorage.org/getpro/habr/post_images/43f/9cc/9ee/43f9cc9ee819f17df0083259c60e64c7.gif)
Важнейшим аспектом нашего подхода при ремастеринге классических адвенчур LucasArts было сохранение целостности оригинальной игры вместе с улучшением старого контента. Мы хотели, чтобы игра ощущалась и игралась точно так же, как и в 90-х, но с новой графикой, намного более качественным звуком и поддержкой новых, более удобных способов ввода. Для этого мы сначала решили портировать оригинальную игру на современное оборудование. Затем при выполнении игры для пользователя мы каждый кадр составляли очередь из состояний игры и получали достаточное количество данных о состоянии игры, чтобы предоставить пользователю более современный контент. То есть игра по-прежнему работает точно так же, как работала тогда, в 1995 году.
![An example of a remastered FMV sequence compared to the original](https://habrastorage.org/getpro/habr/post_images/6d5/c42/2c1/6d5c422c1026f06a1f06b6099df90a59.gif)
Это означает, что мы адаптировали все технологии, использованные игрой, в том числе движок INSANE. Чтобы выполнить ремастеринг всего видеоконтента, нам нужно было начать с исходных видеофайлов из игры 1995 года, и использовать их как схему для обновлённого контента. Конечный результат покадрово совпадает с оригиналом, однако с более высоким разрешением и значительно улучшенным звуком.
Извлечение
Первой задачей стало получение исходных видеофайлов (файлов .SAN) и извлечение всей звуковой и визуальной информации в формат, на основе которого можно изготовить «схему». У нас уже был код, который использовался для декодирования этих файлов, поэтому мы написали на C# инструмент, являвшийся интерфейсом к оригинальному декодеру через скомпилированную нативную DLL. Этот инструмент, названный SanExtract, анализирует файл .SAN и разделяет аудио- и видеоконтент на удобную структуру каталогов, с которой можно работать.
Если у вас есть оригинальная игра и вы можете получить доступ к файлам на CD, то попробуйте извлечь видео самостоятельно! Вот ссылка на инструмент SanExtract: SanExtract.zip
MD5 [ac951d858cd8d252222d31fee61b1ce4]
SHA-1 [2915295a260306292f979788fe047a208e5f4e3b]
Просто запустите SanExtract.exe в командной строке, используя в качестве входных данных оригинальные файлы (скорее всего, они находятся в [CD_DRIVE]:/RESOURCE/VIDEO/ и в [CD_DRIVE]:/RESOURCE/DATA/).
Полученные в результате данные будут одним или несколькими потоками кадров линейного видео, а также всеми аудиофайлами, используемыми во время воспроизведения. И я не ошибся: движок был достаточно динамичным, чтобы обеспечивать включение или отключение элементов (аудио и видео) во время выполнения. Подробнее я расскажу об этом позже. Извлечение было только началом этого процесса. Нам нужно было знать, как создавались оригинальные кадры, чтобы мы могли воссоздать похожий рабочий процесс для проекта ремастеринга. Например, некоторые кадры или последовательности содержат сочетание нескольких источников графики. Посмотрите на анимацию из исходной игры:
![An example of a classic frame sequence](https://habrastorage.org/getpro/habr/post_images/3b2/4eb/c2c/3b24ebc2c42fc5c3197c8318b25db9b2.gif)
Может быть, сразу такого и не скажешь, но в кадре присутствуют и нарисованные от руки, и отрендеренные трёхмерные элементы. Мотоцикл Бена, лимузин и тень мотоцикла Бена, падающая на лимузин, взяты из отрендеренной в 3D последовательности. Позолоченное разбитое украшение на капоте — это отдельная нарисованная вручную анимационная последовательность. Конечным результатом оказывается композиция из 3D-рендера, нарисованной анимации и статичного фонового изображения облаков.
Ниже показаны все составляющие части, использованные для создания готового видео. Левая последовательность — это отрисованное вручную украшение капота. Правая — маска, использованная при композитинге 3D-рендеров (мотоцикла и лимузина) с облаками на фоне. А в центре показана последовательность из 3D-рендера + фона из облаков. Затем нарисованные вручную и отрендеренные в 3D элементы соединяются для создания показанного выше фрагмента.
![](https://habrastorage.org/getpro/habr/post_images/d16/bf7/6eb/d16bf76eb68554a63210b36e0c3ee805.gif)
Для сохранения уровня эстетики оригинала мы не могли просто взять каждый кадр видео (примерно 16 000 кадров) и вручную рисовать на них. Нам нужно было правильно повторить твёрдые поверхности мотоциклов и машин из оригинала, в том числе тени, отбрасываемые в сцене. В конце концов нам нужно найти исходные 3D-модели и нарисованную вручную анимацию, а потом выполнить ремастеринг этих отдельных частей, чтобы соединить их композитингом.
Итак, я упомянул, что нам нужно найти исходные 3D-файлы и нарисованные вручную анимации. Сначала мы думали «о, возможно есть какие-то метаданные, использованные для наложения исходных составляющих частей видео, которые можно извлечь». Но на самом деле файлы переименовали и информация со временем была утеряна. Метаданные ничего не дают, и даже при поисках в архивах мы находим множество файлов с теми же именами, но с разными датами и разным содержимым. Мы понятия не имеем, какие из файлов изначально использовались для генерирования готового кадра, поэтому нам нужно было найти решение этой проблемы.
Архивы
Наш архив состоял примерно из 67 гигабайт данных, а полезные данные, относящиеся к оригинальным FMV, были разбросаны по всему этому объёму. Изучив схему данных в резервной копии, можно сделать вывод, что к концу проекта все файлы данных со всех компьютеров были скопированы в папку резервного копирования. В результате получился бардак, похожий на стиль хранения вещей у Индианы Джонса. У нас осталась куча дисков, содержавших копии жёстких дисков всех сотрудников. При дальнейшем изучении оказалось. что нет одного диска, на котором собраны все нужные нам данные. Полезная информация разбросана по всем архивам. Более того, часты случаи дублирования имён файлов, содержащих различный контент, отличающихся датами изменений и т.д. Чтобы двигаться вперёд, нам нужен был способ проиндексировать все дубликаты файлов и выполнить сравнение CRC для выявления всех уникальных файлов.
Мы решили найти расширения файлов, которые использовались в процессе работы с FMV и создать манифест для следующих типов файлов: .ANM, .CEL, .FLC, .FLI, .GIF, .MAX, .NUT, .OBJ, .PRO. Мы написали отслеживающий дубликаты скрипт на Python для обхода всех доступных архивов и создания XML-карты каждого названия файла с нужными нам расширениями. В результате у нас получился очищенный каталог полезных файлов, в которых было проще разобраться и искать. Вот пример узла в файле манифеста xml:
<file> <name>b_cm1</name> <most_recent>C:\Backup\Lleslle backup\THROT-C\RESTSTOP\STUFF\B_CM1.ANM</most_recent> <unique_files count="2"> <file_item> <path>C:\Backup\Lleslle backup\THROT-C\RESTSTOP\STUFF\B_CM1.ANM</path> <modify_date>1994/07/30</modify_date> <size_bytes>115829</size_bytes> <crc_value>2D31393738373530333931</crc_value> </file_item> <file_item> <path>C:\Backup\PC2\FUL528_Davi_DV2\BEN\RESTOP\FLICS\B_CM1.ANM</path> <modify_date>1994/07/13</modify_date> <size_bytes>115829</size_bytes> <crc_value>32303432363131303937</crc_value> </file_item> </unique_files> <all_files count="4"> <file_item> <path>C:\Backup\Lleslle backup\THROT-C\RESTSTOP\STUFF\B_CM1.ANM</path> <modify_date>1994/07/30</modify_date> <size_bytes>115829</size_bytes> <crc_value>2D31393738373530333931</crc_value> </file_item> <file_item> <path>C:\Backup\Lleslle backup\THROT-C\RESTSTOP\STUFF\B_CM1.ANM</path> <modify_date>1994/07/30</modify_date> <size_bytes>115829</size_bytes> <crc_value>2D31393738373530333931</crc_value> </file_item> <file_item> <path>C:\Backup\cleslie's-backup\THROT-C\RESTSTOP\STUFF\B_CM1.ANM</path> <modify_date>1994/07/30</modify_date> <size_bytes>115829</size_bytes> <crc_value>2D31393738373530333931</crc_value> </file_item> <file_item> <path>C:\Backup\PC2\FUL528_Davi_DV2\BEN\RESTOP\FLICS\B_CM1.ANM</path> <modify_date>1994/07/13</modify_date> <size_bytes>115829</size_bytes> <crc_value>32303432363131303937</crc_value> </file_item> </all_files> </file>
Представленный выше фрагмент XML показывает, что в архиве найдено два уникальных файла с именем b_cm1. Эти файлы манифестов позволили нам сузить пространство поиска при изучении зависимостей кадров.
Сортируем зависимости
Даже обнаружив все эти зависимости в архивах, мы не могли определить, какие именно зависимости использовались в готовых FMV. Мы могли делать предположения и использовать какую-нибудь нечёткую логику, но в конце концов решили создать специальный инструмент, с которым может взаимодействовать человек и сортировать все необходимые ресурсы визуально. Этот инструмент, названный SanWrangler, позволил нам загрузить исходную последовательность кадров, а потом просмотреть все архивные данные в поисках промежуточных составляющих частей, использованных для создания этого кадра.
Посмотрев на представленный ниже пример SanWrangler, можно увидеть слева в страничной форме банк из 36 отдельных потоков последовательностей изображений, которые может изучать пользователь. Этот массив последовательностей представляет собой все кадры, найденные в архивах, за исключением двоичных дубликатов. Справа от архивного массива, в самом верху показана оригинальная последовательность, извлечённая из .SAN описанным выше процессом. Пользователь может нажимать Shift+Click на потоках из архивного массива слева, чтобы перемещать их в правый массив. Этот правый массив выбранных последовательностей кадров представляет собой все потоки, содержащие части, использованные для генерирования готовой последовательности кадров.
![An example of SanWrangler being used to scrub linear frames](https://habrastorage.org/getpro/habr/post_images/948/305/c98/948305c98db5649cd7ce8839f906bc9d.gif)
SanWrangler позволяет осуществлять поиск в следующих файлах из архивного массива:
- .ANM — файлы анимации, созданные в собственном инструменте LucasArts. Эти файлы содержат ячейки нарисованной вручную анимации. Позже они при необходимости соединялись с другими файлами.
- .FLC/.FLI — файлы Autodesk Animator и Autodesk Animator Pro
- .NUT — в них содержатся последовательности несжатых линейных кадров, передаваемых в SMUSHFT.EXE и позже кодируемые в сжатый формат, записываемый в файл .SAN
- .MAX — исходный файл 3D-сеток, созданный в 3D Studio 2.0. Нам удалось запустить пакетный процесс для рендеринга последовательностей, использованных в SanWrangler, чтобы мы могли знать, что содержится в двоичных файлах .MAX. Эти кадры были критически важны для понимания того, какой файл .MAX использовался в конкретной последовательности FMV.
Итак, мы достигли точки, в которой начинается непосредственный ремастеринг старых файлов. SanWrangler умеет сохранять список выбранных зависимостей файлов в более чистый формат. С этого момента рабочий процесс ремастеринга разделяется на три ветки: ремастеринг нарисованных вручную кадров, ремастеринг 3D-моделей и ремастеринг звука.
Ждите вторую часть статьи! В следующей части я расскажу о способах автоматизации и преобразования, использованных нами для сборки заново всего контента.