Outpost 2 Формати на файлове · bei.pm
Форматите на файловете, описани на тази страница, се основават на техническия анализ на интелектуалната собственост на Dynamix, Inc. и Sierra Entertainment.
Интелектуалната собственост днес е част от масата на Activision Publishing, Inc. / Activision Blizzard, Inc. и в момента е собственост на Microsoft Corp..
Информацията е събрана чрез обратен инженеринг и анализ на данни с цел архивиране и интероперативност с исторически данни.
Не са използвани собствени или конфиденциални спецификации.
Играта може в момента да бъде закупена за изтегляне на gog.com.
Следната серия статии документира моите открития относно данните формати в реално времевата стратегия "Outpost 2: Divided Destiny", която беше публикувана през 1997 г. от Sierra и разработена от Dynamix.
От 1 ноември 2015 г. до 14 ноември 2015 г. се занимавах основно с анализа на данните от играта - и какво може да се направи с тях.
Според информацията, която успях да събера до момента, Dynamix - както много търговски компании - не е разработила някои от данните формати специално за Outpost 2, а също така е използвала (модифицирани) в други разработки, например от поредицата Mechwarrior.
Независимо от това, може да се отбележи, че иновационната сила на формата на файловете е практически ограничена и често се основава на дългогодишни концепции от обичайни формати като JFIF и RIFF.
За интерпретация на таблиците и данните формати са налични допълнителни информации на Какво е какво?.
Данните, посочени тук, обикновено трябва да се разбират като Little Endian.
В заключение, може да се каже, че обратното инженерство беше много забавно, макар и не напълно завършено.
Разбира се, мога да препоръчам и да играете самата игра, тъй като предлага интересни игрови механики.
Въведение
Данните формати, използвани от Outpost 2, имат структура, напомняща на JFIF / PNG - отделните блокове данни винаги разполагат с 8-байтов заглавен блок. Затова ще спестя усилията си да документирам отделните заглавия на съответните специфични места и ще документирам само отклоненията там.
Форматът винаги е следният; действителните полезни данни са вградени в него:
Адрес | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | символи | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Офсет | Тип данни | Надпис | Обяснение |
---|---|---|---|
0x0000 | uint(32) | Магически байтове | Съдържа информация относно това, какво да се очаква в следващия блок данни. Известни стойности:
|
0x0004 | uint(24) | Дължина на блока | Съдържа информация за това колко голям (в байтове) е следният данен блок. Тук се имат предвид само полезните данни - 8-те байта на заглавката не са включени. |
0x0007 | uint(8) | Знамена? | Не е известно каква точно е функцията на този блок. В обемите тази стойност често е 0x80, а в други файлове често е 0x00. Това предполага, че става въпрос за набор от флагове. |
Томове
Обемите представляват контейнер за данни за играта, подобен на архивен формат като например Tarball. Поне в Outpost 2 форматът познава само файлове - без папки. Възможно е обаче те да бъдат симулирани чрез съответни имена на файлове.
Едно обемче се състои от заглавката на обема, както и от няколко обемни блока, които съответстват на конкретни файлове.
"Обемите" са файловете с разширение 'vol'
в директорията на играта.
Адрес | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | символи | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 56 | 4f | 4c | 20 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | V | O | L | . | . | . | . | . | . | . | . | . | . | . | . |
Офсет | Тип данни | Надпис | Обяснение |
---|---|---|---|
0x0000 | uint(32) | Магически байтове | |
0x0004 | uint(24) | Дължина на блока | |
0x0007 | uint(8) | Знамена |
Обем Заглавие
Адрес | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | символи | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 76 | 6f | 6c | 68 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | v | o | l | h | . | . | . | . | . | . | . | . | . | . | . | . |
Офсет | Тип данни | Надпис | Обяснение |
---|---|---|---|
0x0000 | uint(32) | Магически байтове | |
0x0004 | uint(24) | Дължина на блока | |
0x0007 | uint(8) | Знамена |
Обемният хедър от своя страна не съдържа никакви данни за употреба.
Той служи единствено като контейнер.
Като първи данни в обемния хедър трябва да се намират обемните низове; след това следват информацията за обема.
Обемни низове
Адрес | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | символи | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 76 | 6f | 6c | 69 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | v | o | l | i | . | . | . | . | . | . | . | . | . | . | . | . |
Офсет | Тип данни | Надпис | Обяснение |
---|---|---|---|
0x0000 | uint(32) | Магически байтове | |
0x0004 | uint(24) | Дължина на блока | |
0x0007 | uint(8) | Знамена |
Адрес | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | символи | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 76 | 6f | 6c | 73 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | v | o | l | s | . | . | . | . | . | . | . | . | . | . | . | . |
Офсет | Тип данни | Надпис | Обяснение |
---|---|---|---|
0x0000 | uint(32) | Магически байтове | |
0x0004 | uint(24) | Дължина на блока | |
0x0007 | uint(8) | Знамена | |
0x0008 | uint(32) | Дължина на полезния товар | Посочва колко байта от следните данни всъщност са полезни данни. Останалите, непреработени данни от списъка на обемните низове явно трябва да се считат за боклук. В файловете с по-късна дата тези 'останалите данни' са 0x00, което може да индикира недостатъци в инструменти по време на разработката на играта, а именно, че разработчикът се е погрижил за коректната инициализация на буферите едва много късно, тъй като няма влияние върху играта дали данните са инициализирани или не. |
0x000c | uint(8)[] | Списък с имена на файлове | Това е списък от имена на файлове, завършващ с 0 байта, който - поне в текущия компонент на данните - само очаква ASCII символи. Не е необходимо при парсиране на данните да се анализира този блок с данни по-подробно, тъй като в информацията за тома все пак директно се реферират офсетите на имената на файловете. |
Обемните низове представляват списък с имена на файлове, които са включени в обема.
Информация за обема
Адрес | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | символи | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 76 | 6f | 6c | 69 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | v | o | l | i | . | . | . | . | . | . | . | . | . | . | . | . |
Офсет | Тип данни | Надпис | Обяснение |
---|---|---|---|
0x0000 | uint(32) | Магически байтове | |
0x0004 | uint(24) | Дължина на блока | |
0x0007 | uint(8) | Знамена |
Информацията за обема съдържа по-подробни данни за файловете. По някакъв начин това представлява вид запис в директорията на FAT (FAT = File Allocation Table)
Броят на файловете се определя от размера на блока, разделен на дължината на записите в директорията - 14 байта.
Отделните записи в директорията имат следната структура:
Адрес | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | символи | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Офсет | Тип данни | Надпис | Обяснение |
---|---|---|---|
0x0000 | uint(32) | Име на файл - офсет | Посочва на кой отместване (!) в списъка с имена на файлове (низове на тома) се намира името на файла. Отнася се до началото на блока с полезни данни. |
0x0004 | uint(32) | Файл-офсет | Указва на кой офсет в цялостния обемен файл се намира файлът. |
0x0008 | uint(32) | Размер на файла | Посочва колко е голям файлът в байтове. |
0x000c | uint(16) | Знамена? | Очевидно предоставя допълнителна информация за кодировката на файла.
|
Обемна блок
Адрес | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | символи | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 56 | 42 | 4c | 48 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | V | B | L | H | . | . | . | . | . | . | . | . | . | . | . | . |
Офсет | Тип данни | Надпис | Обяснение |
---|---|---|---|
0x0000 | uint(32) | Магически байтове | |
0x0004 | uint(24) | Дължина на блока | |
0x0007 | uint(8) | Знамена |
Обемният блок е контейнер, който съдържа файлове. Той включва само отново - поради формата на блока - редундантно размера на файла и след това директно следват полезните данни.
Плочки
Адрес | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | символи | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 50 | 42 | 4d | 50 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | P | B | M | P | . | . | . | . | . | . | . | . | . | . | . | . |
Офсет | Тип данни | Надпис | Обяснение |
---|---|---|---|
0x0000 | uint(32) | Магически байтове | |
0x0004 | uint(24) | Дължина на блока | |
0x0007 | uint(8) | Знамена |
Тиловете представляват специфичен за Outpost-2
bitmap графичен формат. Те обхващат 13 набора от тилове,
наречени "well" (well0000.bmp
до well0012.bmp
),
които се намират в обема maps.vol.
Наборите от тилове / well съдържат следното:
Име на файла | Съдържание |
---|---|
well0000.bmp | Синя графика с размери 32x32 пиксела - идеална за тестване на собствения имидж лоадер |
well0001.bmp | Съдържа светла скала, планински вериги върху светла скала и безброй варианти на кратери върху светла скала |
well0002.bmp | Съдържа 'Doodads' от светла скала - елементи, които могат да се поставят за обогатяване (или умишлено като структура, например стени) върху светла скала, включително и растителност |
well0003.bmp | Съдържа коралова структура върху светла скала |
well0004.bmp | Съдържа тъмна скала, планински вериги върху тъмна скала и безброй варианти на кратери върху тъмна скала |
well0005.bmp | Съдържа 'Doodads' от тъмна скала - елементи, които могат да се поставят за обогатяване (или умишлено като структура, например стени) върху тъмна скала |
well0006.bmp | Съдържа коралова структура върху тъмна скала, както и преходи между светла и тъмна скала |
well0007.bmp | Съдържа лава, включваща 4-5 кадъра анимация на същата |
well0008.bmp | Съдържа пясък и безброй варианти на кратери върху пясък |
well0009.bmp | Съдържа 'Doodads' от пясък - елементи, които могат да се поставят за обогатяване (или умишлено като структура, например стени) върху пясък |
well0010.bmp | Съдържа 48 прехода от пясък към светла и тъмна скала |
well0011.bmp | Съдържа полярните шапки на картата, с тъмна скала като основа |
well0012.bmp | Съдържа полярните шапки на картата, с светла скала като основа |
Препоръчително е за точна реализация да не се рендират тайловете предварително, за да се кешират, тъй като данните за цикъла ден/нощ все още трябва да бъдат обработени - и биха възникнали много, много данни.
Тайловете са 8bpp графики с индексирана палитра с размер 32x32 пиксела, които са подредени една под друга. В така създадения тайлсет обаче могат да се съдържат значително повече
Основният контейнер се състои от 2 секции: head
и data
.
Заглавие на плочките
Адрес | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | символи | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 68 | 65 | 61 | 64 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | h | e | a | d | . | . | . | . | . | . | . | . | . | . | . | . |
0x0010 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Офсет | Тип данни | Надпис | Обяснение |
---|---|---|---|
0x0000 | uint(32) | Магически байтове | |
0x0004 | uint(24) | Дължина на блока | |
0x0007 | uint(8) | Знамена | |
0x0008 | uint(32) | Версия / Флагове? | Тук може да става въпрос за версия на файловия формат; във всички налични файлове стойността беше |
0x000c | uint(32) | Ширина (Хоризонтално разрешение) | Посочва колко широк е файловият образ (в пиксели). При всички кладенци в Outpost 2 тук се очаква стойността |
0x0010 | uint(32) | Височина (Вертикална резолюция) | Посочва колко висока е изображенската файл (в пиксели). При всички кладенци от Outpost 2 тук се очаква стойността да бъде |
0x0014 | uint(32) | Дълбочина на цвета? | Значението на тази стойност е неизвестно. Тъй като тя съдържа стойността |
0x0018 | uint(32) | Цветова дълбочина 2? | Значението на тази стойност е неизвестно. Възможно е да става въпрос за 'целева' дълбочина на цвета. |
След тази информация ще последва и файл с палети, представен в стандартизирания формат RIFF. Точната спецификация може да бъде намерена - тъй като палетите се появяват и на други места - под Палети.
Данни за плочките
Адрес | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | символи | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 64 | 61 | 74 | 61 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | d | a | t | a | . | . | . | . | . | . | . | . | . | . | . | . |
Офсет | Тип данни | Надпис | Обяснение |
---|---|---|---|
0x0000 | uint(32) | Магически байтове | |
0x0004 | uint(24) | Дължина на блока | |
0x0007 | uint(8) | Знамена |
Накрая следват чистите пикселни данни, ред по ред от горе вляво надясно долу.
Данните при графиките, които обикновено са с 8bpp-битмап формат, съответстват на индекса на цвета в цветната палитра.
Игровият енджин вероятно рисува тайловете *въз основа на запитвания*.
Това изглежда е свързано с цикъла ден-нощ, който познава 32 степени на отделните тайлове. Очевидно от стойността на яркостта се отнема 'малко'. Точните стойности все още не могат да бъдат установени, работя на основата на изчисленията
v *= (daylight / 48) + 0.25;
с HSV-данните на пикселите, като daylight е стойност от 0-31, а v е стойност между 0-1. Освен това трябва да се има предвид, че на картата съществува и граница от 16 тайла наляво и надясно (която служи за невидимо появяване на единици).
Допълнително, цикълът ден-нощ изглежда актуализира само една колона от картата за всеки игрови цикъл.
Ускореният цикъл ден-нощ изглежда по следния начин:
ПРТ
Адрес | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | символи | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 43 | 50 | 41 | 4c | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | C | P | A | L | . | . | . | . | . | . | . | . | . | . | . | . |
Офсет | Тип данни | Надпис | Обяснение |
---|---|---|---|
0x0000 | uint(32) | Магически байтове | |
0x0004 | uint(24) | Дължина на палетите | Посочва, за разлика от нормалния блоков формат, броя на палетите, които могат да бъдат намерени в този файл - не дължината на блока в байтове. |
0x0007 | uint(8) | Флагове | Вероятно, както обикновено, флагове. Обаче не ми известни флагове; тъй като всички известни стойности са равни на |
За какво точно означава PRT
не ми е известно; възможно е, например, 'Таблица на палетите и ресурсите' - тъй като този файл - намерен като op2_art.prt в maps.vol - представлява такава таблица, или би могъл да опише функцията доста добре.
Този файл съдържа списък с палети, таблица за всички използвани битмапи, всички анимационни дефиниции и още редица неизвестни данни. Той следва досегашния контейнерен формат свободно, тъй като не всички записи спазват тази схема.
Секцията CPAL
(вероятно означаваща контейнер на палетите) включва единствено данните за палетите, като посочва колко от обикновено 1052-байтовите 8-битови палети са налични.
Посочването на 1052 байта не се счита за задължително, тъй като форматът на палетите потенциално предвижда различни размери на палетите. То важи единствено за данните, с които Outpost 2 е доставен.
След списъка с палетите незабавно и без предварителен заглавен ред следва списъкът с битмапи; точно толкова незабавно следват и списъците с анимации.
И двата списъка започват с uint(32) (или отново uint24+uint8 флагове?), който съдържа броя на записите.
Палети
Адрес | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | символи | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 50 | 50 | 41 | 4c | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | P | P | A | L | . | . | . | . | . | . | . | . | . | . | . | . |
Офсет | Тип данни | Надпис | Обяснение |
---|---|---|---|
0x0000 | uint(32) | Магически байтове | |
0x0004 | uint(24) | Дължина на палетите | Посочва, в противовес на нормалния блоков формат, броя на палетите, които могат да се намерят в този файл - а не дължината на блока в байтове. |
0x0007 | uint(8) | Знамена | Вероятно, както обикновено, флагове. Обаче не ми е известен нито един флаг; тъй като всички известни ми стойности съответстват на |
Информацията за палетите е много лесна за прочитане.
Тя се състои от заглавие и сегмент данни.
Заглавие на палетите
Адрес | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | символи | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 68 | 65 | 61 | 64 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | h | e | a | d | . | . | . | . | . | . | . | . | . | . | . | . |
Офсет | Тип данни | Надпис | Обяснение |
---|---|---|---|
0x0000 | uint(32) | Магически байтове | |
0x0004 | uint(24) | Дължина на палетите | Посочва, в противовес на нормалния блоков формат, броя на палетите, които могат да се намерят в този файл - а не дължината на блока в байтове. |
0x0007 | uint(8) | Знамена | Вероятно, както обикновено, флагове. Обаче не ми е известен нито един флаг; тъй като всички известни ми стойности съответстват на |
0x0008 | uint(32) | Версия на палетния формат? | Вероятно определя коя версия на формата на палетите следва палетата. Всички палети на Outpost2 изглежда имат версия |
Данни за палетите
Адрес | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | символи | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 64 | 61 | 74 | 61 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | d | a | t | a | . | . | . | . | . | . | . | . | . | . | . | . |
Офсет | Тип данни | Надпис | Обяснение |
---|---|---|---|
0x0000 | uint(32) | Магически байтове | |
0x0004 | uint(24) | Дължина на блока | |
0x0007 | uint(8) | Знамена |
Данните секция съдържа отделните записи на палетите. Броят на записите на палетите се определя от дължината на блока / 4.
Отделните записи имат следната, проста структура;
Адрес | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | символи | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | 04 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Офсет | Тип данни | Надпис | Обяснение |
---|---|---|---|
0x0000 | uint(8) | Червен компонент | Посочва червения дял на цвета |
0x0001 | uint(8) | Зелена компонента | Посочва зеления дял на цвета |
0x0002 | uint(8) | Синя компонента | Посочва синята част на цвета |
0x0003 | uint(8) | Непознато - Флагове? | Не е ясно какво означава тази стойност, тъй като изглежда, че основно е |
Относно палетите, единственото, което трябва да се каже, е, че за палетите, използвани за анимации, важат следните правила:
- Първият цвят е ВИНАГИ прозрачен, независимо каква стойност е посочена там.
-
Записите на палетите 1-24 се считат за цветове на играчите в палетите 1-8.
Откъде точно произлизат цветовете извън играч 1, не ми е ясно.
Предполагам, че останалите цветове са хардкодирани.
Битмапи
Адрес | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | символи | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
0x0010 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Офсет | Тип данни | Надпис | Обяснение |
---|---|---|---|
0x0000 | uint(32) | Направена ширина | Посочва ширината на пикселните данни в байтове - тъй като те са подредени по 4-байтови граници. Така е бързо възможно да се прескочи до определен ред на изображението. Защо тази стойност се съхранява отделно, въпреки че може да бъде изчислена, не е ясно. |
0x0004 | uint(32) | Отклонение | Посочва офсета на първия ред в битовата карта |
0x0008 | uint(32) | Височина | Посочва височината на изображението в пиксели |
0x000c | uint(32) | Ширина | Посочва ширината на изображението в пиксели |
0x0010 | uint(16) | Тип | Посочва типа на изображението. Изглежда, че става въпрос за битова маска:
|
0x0012 | uint(16) | Палитра | Определя коя палитра от PRT файла да бъде използвана |
Структурата на данните в PRT файла указва как са изградени битмапите, използвани за спрайтовете. Тези битмапи служат като отделен компонент, от който се сглобяват няколко за анимационен кадър на спрайта.
Конкретните изображения се намират в op2_art.BMP в директорията на играта.
Защо този битмап файл разполага с (предимно коректен) RIFF заглавен битмап, е неясно. Вероятно Outpost 2 използва системни API за зареждане на графики, като временно приема този заглавен файл и презаписва съответните вариращи полета.
Пикселните данни в BMP файла се намират на позиция Offset + uint32-Offset, който може да бъде намерен на адрес 0x000A в BMP файла (RIFF-Bитмап данни offset), и отново отговарят на редовното подреждане от горе ляво надясно надолу.
Монохромните 1bpp графики могат да бъдат нарисувани по такъв начин, че цвят 0 да бъде напълно прозрачен, а цвят 1 да е полупрозрачно черно/сиво, тъй като монохромните графики обикновено се използват за сянка на превозни средства и сгради в анимациите.
Така може да се сглобят много графики.
Анимации
Сега преминаваме към кралския клас на дисциплините в данните на Outpost 2:
Анимациите.
Списъците с анимации започват с глобален заглавен ред, който служи основно за верификация на данните. Следват конкретните определения на анимациите, които се разделят на 3 нива:
-
Анимация
Анимацията е най-висшата инстанция; тя представлява анимация на единица, сграда или "частична анимация" (кометен удар, време, взрив) в определена изходна ситуация. -
Кадър
Кадърът е едно единствено изображение в рамките на анимацията. Анимацията може да включва един или повече кадри. -
Подкадър
Подкадрите съдържат информация за това, че определена битмап трябва да бъде нарисувана на определена позиция на кадъра при определени критерии. Един кадър може да включва един или повече подкадри.
След това следват самите определения на анимацията.
Адрес | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | символи | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Офсет | Тип данни | Надпис | Обяснение |
---|---|---|---|
0x0000 | uint(32) | Брой анимации | Колко анимационни набора данни има |
0x0004 | uint(32) | Брой кадри | Колко кадъра трябва да има общо |
0x0008 | uint(32) | Брой подрамки | Колко подрамки общо трябва да присъстват |
0x000c | uint(32) | Брой на опционалните записи | Колко "опционални записи" са налични. |
Анимация
Адрес | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | символи | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
0x0010 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
0x0020 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Офсет | Тип данни | Надпис | Обяснение |
---|---|---|---|
0x0000 | uint(32) | Неизвестен 1 | Неизвестна информация |
0x0004 | uint(32) | Граници: Ляво | Посочва лявото начало (в пиксели) на Bounding Box. |
0x0008 | uint(32) | Ограничителна кутия: Горна | Посочва горния ръб (в пиксели) на ограничителната кутия. |
0x000c | uint(32) | Ограничителна кутия: Ширина | Посочва ширината (в пиксели) на Bounding Box. |
0x0010 | uint(32) | Граници на кутията: Височина | Посочва височината (в пиксели) на ограничителния правоъгълник. |
0x0014 | uint(32) | Офсет: X | Посочва хоризонталния център на анимацията |
0x0018 | uint(32) | Отместване: Y | Посочва вертикалната среда на анимацията |
0x001c | uint(32) | Неизвестен 2 | Неизвестна информация |
0x0020 | uint(32) | Брой кадри | Посочва колко анимационни кадъра са включени в тази анимация |
0x0024 | uint(32) | Брой прозорци | Посочва колко прозорци да се използват при рисуване |
Данните на най-горния слой, анимацията, представляват предимно административни данни - Boundingbox обозначава координатите на маркировката около превозното средство/сградата, когато то е избрано, и също така указва коя област трябва да бъде кликаема.
Офсетът определя предимно "нулевата точка"; точката, която трябва да се изчисли спрямо вътрешните координати на играта или да се извади. Може да се каже и математически: офсетът тук обозначава координатния произход.
При прозорците става въпрос, както и при офсета, за по 4 uint(32)-стойности за всяко прозорче, които определят област, която е валидна за отделни субфреймове. Извън прозорците не трябва, освен ако не е предвидено за битовата карта, да се рисува.
Рамка
Адрес | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | символи | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Офсет | Тип данни | Надпис | Обяснение |
---|---|---|---|
0x0000 | uint(8) | Брой подрамки и превключвател за Опция 1, 2 | Тази стойност съдържа:
|
0x0001 | uint(8) | Неизвестно 1 и превключвател за Опционален 3, 4 | Тази стойност съдържа:
|
0x0002 | uint(8) | Опционално 1 | Непознат |
0x0003 | uint(8) | Опционално 2 | Непознат |
0x0004 | uint(8) | Опционален 3 | Непознат |
0x0005 | uint(8) | Опционално 4 | Непознат |
Подрамка
Адрес | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | символи | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Офсет | Тип данни | Надпис | Обяснение |
---|---|---|---|
0x0000 | uint(16) | Битмап-ID | Указва коя битмап да се използва за този подрамка |
0x0002 | uint(8) | Неизвестен 1 | Не е известно - обаче силно подозирам, че става въпрос за приоритет на рендиране (Z-слой). |
0x0003 | uint(8) | Подрамка-ИД | Указва в кой подрамка се намираме |
0x0004 | sint(16) | Офсет - Хоризонтален | Посочете къде в рамката да бъде поставен субрамката, или с колко пиксела да бъде преместена битовата карта хоризонтално. |
0x0006 | sint(16) | Офсет - Вертикален | Посочва къде в рамката да бъде поставен подрамката, или с колко пиксела да бъде вертикално преместена битмапът |
С това можем да комбинираме отделни рамки, както и цели анимации, тук ще демонстрираме на примера на една по-сложна анимация, анимацията с индекс 500
Анимация 500
Анимация 500 показва как един Plymouth транспортен автомобил, натоварен с обикновен рудник, се разтоварва. Това е една от малкото анимации, които използват функционалността на прозорците.
И така, можем да съберем цялата анимация заедно.
За съжаление, все още има проблем с горния товарен люк, тъй като съответният бит в информацията за графичния тип не е зададен.
Ето и няколко допълнителни, прекрасно анимирани спрайта от играта:
Потребителски интерфейс
Сега остава само потребителският интерфейс на играта, който е в обработен метал стил.
Но и тук е видно, че Dynamix не е трябвало да открива отново колелото; тук не се използват само стандартните User32 и GDI32 API, предоставени от Windows - особено се използва и управлението на ресурсите от User32.
Те могат да бъдат извлечени например с програми като разработения от Angus Johnson безплатен Resource Hacker, или - ако избягвате използването на Wine под Linux / Mac OS - с помощта на wrestool, включен в icoutils.
Име на файла | Съдържание |
---|---|
Outpost2.exe | Съдържа само иконата на играта, която показва космическата станция пред Нова Терра |
op2shres.dll | Съдържа графики за елементи на управление, като рамки, бутони, радио-бутон и чекбоксове, както и фонове на диалози, илюстрации за текстовете на основните мисии и фоновата графика на главното меню |
out2res.dll | Съдържа декорация на инграунд прозорци, икони за обикновен и специален метал, екрана за зареждане, графики за диалози, както и допълнителни графики за курсори, в допълнение към анимираните в директорията на играта |