-
Notifications
You must be signed in to change notification settings - Fork 15
Original Game Resources ru
Данная страница описывает ресурсы, используемые оригинальной игрой (Космические Рейнджеры 1, 2, Перезагрузка, Революция, HD)
Если изучить директорию с игрой (КР2), можно обнаружить несколько типов файлов:
- *.dat в cfg/
- *.pkg в data/
- *.vdo в data/ - видеоролики mpeg4 в контейнере AVI
- matrix/ - все что связано с планетарными битвами
- *.dat в директории music/ - музыка в обычном mp3
- save/ - сохранения игры.
Рассмотрим подробно некоторые файлы.
*.dat - иерархическое хранилище текстовых пар ключ-значение, т.е. по-сути - это база данных. Внутри имеет древовидную структуру. Узел - либо набор пар ключ-значение, либо набор дочерних узлов. При этом, внутри набора, пары или дочерние узлы могут объединяться в массивы. Вот пример структуры:
root
|-node1
| |-value1 = "value1"
| |-array[0]
| | |-subvalue = "some1"
| |-array[1]
| | |-subvalue = "some2"
| |-array[2]
| | |-subvalue = "some3"
| |-value2`
Например, в OpenSR чтобы обратиться к паре subvalue=some3 нужно вызвать (пример для python):
engine.datRoot()['root']['node1']['array'][0]['subvalue']
В данных файлах хранится:
- Вся текстовая информация в игре.
- Все параметры вооружения, предметов, микромодулей
- Разметка GUI
- Типы планет, астероидов, систем
- Возможные названия кораблей, баз, планет, систем, секторов
- Информация о квестах, заданиях, скриптах
- Информация о расах
- ....
В общем, вся функциональная информация игры.
Естественно, данные файлы - простор для читерства в игре, и, поскольку существовал (существует?) глобальный рейтинг рейнджеров, разработчики КР2 начиная с Перезагрузки начали шифровать данные файлы. Однако шифр был взломан. Для OpenSR нужны уже расшифрованные файлы.
Начиная с Революции (и в HD) *.dat файлы подписываются уже настоящей цифровой подписью. Их поддержка в OpenSR пока не планируется. Более подробную структуру можно посмотреть в Ranger/DAT.cpp
*.pkg - архив ресурсов игры. Представляют собой файловый архив. Файлы могут хранится как в сжатом (ZLIB deflate) так и не в сжатом виде. ResourceViewer может просматривать и распаковывать эти архивы.
В архивах pkg хранятся все нетекстовые ресурсы игры. Рассмотрим эти ресурсы подробнее.
*.gi - изображения (фреймы, кадры). В данном формате хранятся все графические изображения игры. Каждый фрейм имеет свой тип и набор слоев. Каждый слой имеет свою позицию на фрейме, из слоев строится итоговое изображение.
Известно 6 типов GI фреймов:
- 1 слой, RGB16 или ARGB32 в зависимости от битовой маски цветов.
- 1 слой, RGB16 с оптимизацией.
- 3 слоя:
- RGB16 с оптимизацией - внутренние пиксели изображенного объекта
- RGB16 с оптимизацией - края объекта.
- 6-битный альфа-канал с оптимизацией.
- 2 слоя
- Индексированный (8-bit) RGB с оптимизацией.
- Индексированный (8-bit) RGBA (pre-multiplied) с оптимизацией.
- 2 слоя
- Индексированный RGBA (8-bit)
- Палитра для первого слоя
- Дельта-фрейм GAI-анимации (рассмотрен ниже)
"c оптимизацией" - значит данные слоя записаны в одном из вариантов RLE.
Подробнее - Ranger/GILoader.cpp
*.gai - анимация. Большинство анимаций хранится в этом формате. Представляет из себя набор GI-фреймов и специальную таблицу времен кадров, где хранятся время показа каждого кадра в мс. Данная таблица разбита на блоки. Достоверно неизвестно зачем, скорее всего для зацикливания анимации. Так, например, анимация гипер-тоннеля состоит из 3 блоков - открытие, открытый тоннель, закрытие.
Отдельно стоит GAI анимация правительств, пилотов и прочая "большая" анимация. Здесь разработчики применили алгоритм сжатия, похожий на современное сжатие видео. Полностью хранится только первый кадр (причем, отдельным gi-файлом), все последующие кадры хранят разность от предыдущего кадра. Это те самые упомянутые фреймы типа 5.
Подробнее - Ranger/GAILoader.cpp
*.hai - более простой формат анимации, используется в основном для анимации кораблей. Каждый кадр состоит из RGBA-палитры (256 цветов = 1024 байта) и массива пикселей (индексов палитры). Времен кадров нет, каждый кадр длительностью 50мс (предположительно), анимация зациклена.
Подробнее - Ranger/HAILoader.cpp
*.qm - текстовые квесты.
Подробнее - QM
При условии что мы делаем не shadow build, находимся в директории с исходниками, а оригинальные файлы игры находятся в ../OpenSrData
.
tools/DATTools/opensr-dat-convert hd ../OpenSrData/cfg/CacheData.dat data/CacheData.dat
tools/DATTools/opensr-dat-convert d ../OpenSrData/cfg/Rus.dat data/rus.dat
tools/DATTools/opensr-dat-convert d ../OpenSrData/cfg/Main.dat data/main.dat
Распаковываются с помощью утилиты tools/ResourceViewer/opensr-resourceviewer
. Всё должно сложиться в директорию ./data/DATA И выглядеть примерно так:
➜ OpenSr git:(rework3) ✗ find -L ./data/DATA -maxdepth 1 |sort
...
./data/DATA
./data/DATA/Asteroid
./data/DATA/Atm
./data/DATA/BGObj
./data/DATA/bv.dat
./data/DATA/Captain
./data/DATA/City
./data/DATA/Comet
./data/DATA/Cursor
./data/DATA/FormAbout
./data/DATA/FormAbout2
./data/DATA/FormAchievements
./data/DATA/FormGalaxy2
./data/DATA/FormGameSet2
./data/DATA/FormGoods2
./data/DATA/FormIntro2
./data/DATA/FormLoad2
./data/DATA/FormLoadAB
./data/DATA/FormLoadQuest
./data/DATA/FormLoadRobot
./data/DATA/FormMain2
./data/DATA/FormMain3
./data/DATA/FormNote
./data/DATA/FormOptions2
....
Пока не все файлы *.pkg
используются. Распаковку стоит начать с common
, english
, ships
, forms
, items
, mainmenu
.