Как движок Fallout2 работает с файлами
Данные исследования проводились Red!'ом с целью ускорения загрузки
игрой файлов ("быстрый Fallout"). В ходе исследований были получены
некоторые "побочные", но очень интересные результаты. Прочтение этого
документа позволит вам лучше понять то, как игра (и маппер) загружает и
сохраняет свои файлы. Перед прочтением рекомендуется ознакомиться с Файловой структурой Fallout2.
Оригинальную версию его исследований вы найдете здесь: How the FO2 engine finds it's data, перевод - здесь: Как движок Fallout2 обнаруживает файлы с данными.
Исследования публиковались Red!'ом на форуме NMA. Ниже они сформулированы в виде кратких тезисов, для вашего удобства.
Тезисы
- Концепция "корня данных" - игра загружает файлы из заранее
определенных мест, называемых "корнями данных". Назовем корнеь данных
просто «root».
Порядок загрузки данных:
0. SAVEGAME
1. patchXXX.dat
2. critter_patches
3. critter_dat
4. master_patches
5. master_dat
6. Текущая директория
7. Если найти данные не получилось, движок пытается продолжить без них, настолько изящно, насколько может.
- Движок может загружать данные как из DAT файлов, так и из
директорий, при этом различий в том, на что указывает корень данных -
на DAT-файл или директорию, практически нет (замечу, что движок
загружает из DAT-файлов только стандартные папки (см. Файловую
структуру) - папки, задаваемые в скриптах, он из DAT-файлов загружать
не может).
- Если файл/директория отсутствуют, движок их создаст (за исключением patchXXX.dat).
- Если "корни данных" совпадают, движок не будет искать файл в той же
директории дважды (это не касается текущей директории - в ней он будет
искать файлы в любом случае).
- Движок ищет (в текущей директории, не в директории Фоллаута) файлы
от patch000.dat до patch998.dat через шаг (т.е. только четные номера).
Найдя первый файл (с младшим номером), последующие он не ищет.
- Игра удаляет все master_patches\proto\items\*.pro и master_patches\proto\critters\*.pro.
Решения этой проблемы пока найдено 3:
1. Ставить на файлы атрибут "только чтение"
2. Использовать другие корни
3. Использовать bat-файл (который будет использовать один из двух вышеуказанных методов)
Подробнее см. FAQ.
- Чтобы сохраненки работали, нужно чтобы critter_patches и master_patches указывали на одну и ту же директорию!
- mapper2 в основном работает также, однако он не ищет patchXXX.dat! Он сохраняет свои данные в master_patches.
- Опция "language" в Fallout2.cfg указывает директорию с текстом (можно сохранять текст, например, в text\russian\).
- Интересны пути music_path1 и music_path2. По существу, игра ищет в
этих папках (сначала в первой, я полагаю) музыку. Отмечу, что, в
отличие от dat'ов, она не смотрит в текущих директориях и плюс ко
всему, ищет в обеих, даже если они совпадают. Также вы не можете
указать их на DAT файлы.
- Игра не видит файлы в DAT'е, если они расположены не в алфавитном
порядке. Игра не различает регистра символов при поиске в DAT'е.
- Если игра находит *.SAV файлы в любой другой «root»/MAPS
директории, кроме master_patches, игра будет жаловаться, что сохранение
невозможно. Так что удостоверьтесь, что удалили все *.SAV файлы,
находящиеся не в директории SAVEGAME.
- Для "быстрого" Фоллаута: извлеките все в главную директорию
Фоллаута (не в \data!) Таким образом, если файл отсутствует, будет
проверяться тот же файл (что должно быть быстрее, чем проверять другой
файл, так как он непременно будет кеширован). Отредактируйте
Fallout2.cfg и пропишите полный путь до главной директории Фоллаута.
Наконец, не забудьте поставить на ваши proto/items/*.pro и
proto/critters/*.pro флаг "только чтение"! После этого игра должна
загружать данные быстрее (при втором запуске - помните, что при первом
запуске она может создавать файлы (wolrdmap.dat) и кеш не заполнен).
Главной причиной увеличения скорости будет, однако, распаковка, а не
изменения "корней", хотя все, конечно, помогает).
- Всякий раз, когда вы выходите с карты (это означает, что вы
переходите с карты на карту, сохраняете игру или выходите на карту
мира), сначала игра пытается создать \MAPS, \proto\items и
\proto\critters (я не пытался помешать этому, чтобы посмотреть, не
пытается ли игра создать другие директории, если не получится создать
эти); затем игра записывает все critter PIDs, содержащиеся в
data/party.txt в первую доступную директорию proto/critters, также
записывается 00000455.pro (багажник) в первую найденную proto/items в
списке корней и наконец, сохраняет карту под ее стандартным именем,
изменяя расширение на SAV, в первой найденной директории MAPS. [Есть
еще несколько обновляемых файлов, но они не заслуживают внимания.]
Когда сохраняете игру (после того, как пройден предыдущий шаг), это
много раз повторяется для корректных слотов /SAVEGAME/SLOTXX.
Когда переходите на другую карту, игра находит прохи, которые она
только что записала и использует их вместо тех, что лежат в данных (это
могло быть причиной того, почему пути должны совпадать, хотя это может
не соблюдаться, если patch000.dat - файл, а не директория - недосмотр?
Или, возможно, они не позаботились об этом, потому что в патче нет
"рискованных" прох).
Об авторе
Автор исследований - Red! (red_nnnno@hotmail.com) (DAC, NMA)
Перевод - Perceptron (perceptron@pisem.net)