Расковырял текстуры с помощью ИИ
Мне захотелось поковыряться в потрохах игры Escape From The Monster Manor для 3DO. Это такой Wolf 3D-клон с атмосферой ужастика и более богатой графикой. Играл в неё в конце 90-х, она была уже слишком примитивной после игр на PS1, но запомнилась, и время от времени я её вспоминаю.
Меня интересовали некоторые вещи: как игра рисует изображение, почему так медленно для такого простого движка, но также — почему она выглядит так, как выглядит, куда богаче, чем Wolf.
С первым всё просто: четыре года назад автор игры выложил её исходники на GitHub. Также он снял одно видео про то, как устроена игра, и обещал продолжить пояснения, но забил. Идея примерно та же, что и в моём движке, который я сгенерировал с помощью ИИ: рейкастинг находит все потенциально видимые стены, далее их рисует растеризатор. В случае с 3DO это CEL Engine.
Но есть одно но: выложен был только код, но не ресурсы. Сегодня я захотел на них посмотреть: я слышал, что в игре всего 8 текстур, и это звучало сомнительно. К тому же интересно было посмотреть на текстуры поздних уровней, меняются ли они, и вообще, почему они так выглядят.
Для начала я попробовал существующие утилиты. Есть 3DOResExplorer. Но он не работает с образами CD напрямую. Образ нужно было разобрать на отдельные файлы. На 3DO своя собственная файловая система OperaFS, а не CDFS, поэтому стандартные инструменты не работают. Есть специальные: 3dt и Un-CdRom. Первая у меня вообще не заработала, жалуется на какой-то utf8 (почему, отчего?). Вторая отказалась работать с образом, потому что он в Mode 1/2352, а ей надо Mode 2/2048.
Крутил-вертел эти образы, скачивал, передампливал — хоть ты тресни, выходит Mode 1. Попросил помочь ИИ. Он дал мне скрипт на Питоне. Пара секунд, и у меня есть образ в Mode 0, который смогла разобрать на файле утилита Un-CdRom. Файлы есть, и 3DOResExplorer их видит. Там есть музыка и звуки в AIFF, картинки оформления в CEL, спрайты врагов в CELS. Но нигде нет текстур стен.
Выяснилось, что игра использует кастомный формат LEAF, в котором хранит текстуры каждого уровня и иные вещи. Что делать? Снова просить ИИ помочь. Дал ему исходник загрузчика loadloaf.c. Он попытался сделать скрипт на Питоне, но получалась ерунда: сплошной шум и ни намёка на текстуры. Долго пытался, потом дал ему исходник рендера, который пользуется загруженными данными. Снова долго пытался, снова либо шум, либо рандомные полоски, либо сплошная заливка. Тогда я дал ИИ кусок исходника FreeDO, который использует эти данные. И после ещё десятка попыток он наконец понял, что это за хитрый формат.
Как оказалось, внутри LOAF хранятся CEL’ы в железном формате, который сразу идёт на рендер, и этот формат — палитровый 6-битный RLE. Тот самый, полумифический. Он реально использовался! Фактически он содержит 5-битный индекс, а шестой бит признак RLE, соответственно, текстуры 32-цветные.
Рабочий скрипт прилагаю.
py
loaf_extract.py7.98 Kb
разное
ии