Outpost 2 formáty súborov · bei.pm
Formáty súborov popísané na tejto stránke sú založené na technickej analýze duševného vlastníctva od Dynamix, Inc. a Sierra Entertainment.
Duševné vlastníctvo je dnes súčasťou majetku Activision Publishing, Inc. / Activision Blizzard, Inc. a aktuálne ho vlastní Microsoft Corp..
Informácie boli zhromaždené prostredníctvom analýzy spätnej inžinierie a analýzy dát za účelom archivácie a interoperability s historickými dátami.
Neboli použité žiadne proprietárne alebo dôverné špecifikácie.
Hra je momentálne dostupná na zakúpenie ako download na gog.com.
Následná séria článkov dokumentuje moje poznatky o dátových formátoch v reálnom čase strategickej hry "Outpost 2: Divided Destiny", ktorá bola vydaná v roku 1997 spoločnosťou Sierra a vyvinutá firmou Dynamix.
Od 1. novembra 2015 do 14. novembra 2015 som sa prevažne zaoberal analýzou dát hry - a tým, čo s nimi robiť.
Podľa informácií, ktoré som doteraz získal, Dynamix - ako mnohé komerčné spoločnosti - nevytvoril niektoré dátové formáty špeciálne pre Outpost 2, ale použil ich aj v iných projektoch, ako napríklad v sérii Mechwarrior (modifikované).
Nezávisle od toho sa dá tiež konštatovať, že inovačná sila dátových formátov je prakticky obmedzená a často sa zakladá na dlhodobo existujúcich konceptoch bežných formátov ako JFIF a RIFF.
Ďalšie informácie na interpretáciu tabuliek a dátových formátov sú dostupné na Čo je čo?.
Tu uvedené dáta sú vo všeobecnosti chápané ako Little Endian.
Na záver sa dá povedať, že reverzné inžinierstvo bolo veľmi zábavné, aj keď nie je úplné.
Samozrejme, odporúčam aj hrať samotnú hru, pretože ponúka zaujímavé herné mechaniky.
Úvod
Dáta formátov používaných v Outpost 2 majú štruktúru pripomínajúcu JFIF / PNG - jednotlivé dátové bloky vždy obsahujú 8-bajtový header. Z tohto dôvodu si ušetrím čas na dokumentovanie jednotlivých headerov na príslušných špecifických miestach a dokumentujem tam iba odchýlky.
Formát je vždy nasledujúci; skutočné užitočné dáta sú v ňom vložené:
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | znaky | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Posun | Typ dát | Názov | Vysvetlenie |
---|---|---|---|
0x0000 | uint(32) | Magické bajty | Obsahuje informácie o tom, čo sa dá očakávať v nasledujúcom dátovom bloku. Známé hodnoty:
|
0x0004 | uint(24) | Dĺžka bloku | Obsahuje informáciu o tom, aká veľká (v bajtoch) je nasledujúca dátová blok. Pri tom sa myslí na čisté užívateľské údaje - 8 bajtov hlavičky nie je zahrnutých. |
0x0007 | uint(8) | Zástavy? | Nie je známe, na čo presne tento blok slúži. V objemoch je táto hodnota často 0x80, v iných súboroch často 0x00. To naznačuje, že ide o nastavenie príznakov. |
Objemy
Volume sú dátové kontajnery pre hru, podobné archívovému formátu, ako napríklad Tarball. V Outpost 2 tento formát pozná iba súbory - žiadne priečinky. Zrejme by sa však dali simulovať pomocou príslušných názvov súborov.
Volume sa skladá z hlavičky volume a viacerých blokov volume, ktoré zodpovedajú konkrétnym súborom.
"Volumes" sú súbory s príponou 'vol'
v hernom adresári.
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | znaky | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 56 | 4f | 4c | 20 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | V | O | L | . | . | . | . | . | . | . | . | . | . | . | . |
Posun | Typ dát | Názov | Vysvetlenie |
---|---|---|---|
0x0000 | uint(32) | Magické bajty | |
0x0004 | uint(24) | Dĺžka bloku | |
0x0007 | uint(8) | Zástavy |
Hlavička objemu
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | znaky | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 76 | 6f | 6c | 68 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | v | o | l | h | . | . | . | . | . | . | . | . | . | . | . | . |
Posun | Typ dát | Názov | Vysvetlenie |
---|---|---|---|
0x0000 | uint(32) | Magické bajty | |
0x0004 | uint(24) | Dĺžka bloku | |
0x0007 | uint(8) | Zástavy |
Objemový hlavička neobsahuje žiadne užitočné údaje.
Slúži iba ako kontajner.
V prvom dátume v objemovej hlavičke by sa mali nachádzať objemové reťazce; za nimi nasledujú objemové informácie.
Objemové reťazce
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | znaky | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 76 | 6f | 6c | 69 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | v | o | l | i | . | . | . | . | . | . | . | . | . | . | . | . |
Posun | Typ dát | Názov | Vysvetlenie |
---|---|---|---|
0x0000 | uint(32) | Magické bajty | |
0x0004 | uint(24) | Dĺžka bloku | |
0x0007 | uint(8) | Zástavy |
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | znaky | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 76 | 6f | 6c | 73 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | v | o | l | s | . | . | . | . | . | . | . | . | . | . | . | . |
Posun | Typ dát | Názov | Vysvetlenie |
---|---|---|---|
0x0000 | uint(32) | Magické bajty | |
0x0004 | uint(24) | Dĺžka bloku | |
0x0007 | uint(8) | Zástavy | |
0x0008 | uint(32) | Dĺžka payloadu | Uvedie, koľko bajtov z nasledujúcich údajov sú skutočne užitočné dáta. Ostatné, zostávajúce údaje zo zoznamu Volume-Strings sú zjavne považované za garbage. V súboroch s neskorším dátumom sú tieto 'zostávajúce dáta' 0x00, čo by mohlo naznačovať nedostatky v nástrojoch počas vývoja hry, inak povedané, že sa až veľmi neskoro vývojár začal zaoberať správnou inicializáciou bufferov, pretože nemá vplyv na hru, či sú dáta inicializované alebo nie. |
0x000c | uint(8)[] | Zoznam názvov súborov | Ide o zoznam názvov súborov terminovaných na 0 bajtov, ktorý - aspoň v tomto súbore údajov - očakáva iba ASCII znaky. Nie je potrebné podrobnejšie analyzovať tento blok údajov pri parsovaní, pretože v informáciách o zväzku sú aj tak priamo referencované ofsety názvov súborov. |
Volume reťazce predstavujú zoznam názvov súborov, ktoré sú obsiahnuté v objeme.
Informácie o objeme
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | znaky | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 76 | 6f | 6c | 69 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | v | o | l | i | . | . | . | . | . | . | . | . | . | . | . | . |
Posun | Typ dát | Názov | Vysvetlenie |
---|---|---|---|
0x0000 | uint(32) | Magické bajty | |
0x0004 | uint(24) | Dĺžka bloku | |
0x0007 | uint(8) | Zástavy |
Informácie o Volume obsahujú podrobnejšie údaje o súboroch. Ide v istom zmysle o akýsi záznam v adresári FAT (FAT = File Allocation Table)
Počet súborov sa určuje ako veľkosť bloku delená dlžkou záznamov v adresári - 14 bajtov.
Každý jednotlivý záznam v adresári má nasledujúcu štruktúru:
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | znaky | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Posun | Typ dát | Názov | Vysvetlenie |
---|---|---|---|
0x0000 | uint(32) | Offset názvu súboru | Uvádza, na akom offsete (!) v zozname názvov súborov (Volume-Strings) sa nachádza názov súboru. Vzťahuje sa pritom na začiatok bloku užitočných dát. |
0x0004 | uint(32) | Offset súboru | Uvedie, na akom offsete v celkovej objemovej súbore sa súbor nachádza. |
0x0008 | uint(32) | Veľkosť súboru | Uvedie, aká veľká je súbor v bajtoch. |
0x000c | uint(16) | Zástavy? | Zjavne poskytuje ďalšie informácie o kódovaní súborov.
|
Objemový blok
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | znaky | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 56 | 42 | 4c | 48 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | V | B | L | H | . | . | . | . | . | . | . | . | . | . | . | . |
Posun | Typ dát | Názov | Vysvetlenie |
---|---|---|---|
0x0000 | uint(32) | Magické bajty | |
0x0004 | uint(24) | Dĺžka bloku | |
0x0007 | uint(8) | Zástavy |
Objemový blok je kontajner, ktorý uchováva súbory. Obsahuje iba znova - z dôvodu bloku formátu - redundatne veľkosť súboru a po nej nasledujú priamo údaje.
dlaždice
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | znaky | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 50 | 42 | 4d | 50 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | P | B | M | P | . | . | . | . | . | . | . | . | . | . | . | . |
Posun | Typ dát | Názov | Vysvetlenie |
---|---|---|---|
0x0000 | uint(32) | Magické bajty | |
0x0004 | uint(24) | Dĺžka bloku | |
0x0007 | uint(8) | Zástavy |
Tiles predstavujú špecifický formát bitmapovej grafiky pre Outpost-2.
Tiahnu sa cez 13 Tilesetov, nazývaných "wells"
(well0000.bmp
až well0012.bmp
),
ktoré sa nachádzajú v objeme maps.vol.
Tilesety / Wells obsahujú nasledujúce:
Názov súboru | Obsah |
---|---|
well0000.bmp | Modrá grafika veľkosti 32x32px - ideálna na testovanie, či váš vlastný načítač obrázkov funguje |
well0001.bmp | Obsahuje svetlý kameň, pohoria na svetlom kameni a nespočetné varianty kráterov na svetlom kameni |
well0002.bmp | Obsahuje 'Doodads' zo svetlého kameňa - teda prvky, ktoré môžu byť umiestnené na svetlom kameni na rozptýlenie (alebo úmyselne ako štruktúra, ako napr. múry), vrátane vegetácie |
well0003.bmp | Obsahuje štruktúru podobnú kôrke na svetlom kameni |
well0004.bmp | Obsahuje tmavý kameň, pohoria na tmavom kameni a nespočetné varianty kráterov na tmavom kameni |
well0005.bmp | Obsahuje 'Doodads' z tmavého kameňa - teda prvky, ktoré môžu byť umiestnené na tmavom kameni na rozptýlenie (alebo úmyselne ako štruktúra, ako napr. múry) |
well0006.bmp | Obsahuje štruktúru podobnú kôrke na tmavom kameni, ako aj prechody medzi svetlým a tmavým kameňom |
well0007.bmp | Obsahuje lávu vrátane 4-5 snímok animácie |
well0008.bmp | Obsahuje piesok a nespočetné varianty kráterov v piesku |
well0009.bmp | Obsahuje 'Doodads' z piesku - teda prvky, ktoré môžu byť umiestnené na piesku na rozptýlenie (alebo úmyselne ako štruktúra, ako napr. múry) |
well0010.bmp | Obsahuje 48 prechodov medzi pieskom a svetlým a tmavým kameňom |
well0011.bmp | Obsahuje pólové čiapky mapy, s tmavým kameňom ako základom |
well0012.bmp | Obsahuje pólové čiapky mapy, so svetlým kameňom ako základom |
Je vhodné pre presnú realizáciu, aby sa dlaždice nevykresľovali vopred na účely cacheovania, pretože údaje pre cyklus deň/noc ešte musia byť spracované - a bolo by potrebné veľmi veľa údajov.
Dlaždice sú 8bpp grafiky s indexovanou paletou o rozlíšení 32x32 pixelov, ktoré sú usporiadané vedľa seba. V takto vytvorenom setu dlaždíc však môže byť omnoho viac
Hlavný kontajner pozostáva z 2 sekcií: head
a data
.
Hlavička dlaždíc
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | znaky | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 68 | 65 | 61 | 64 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | h | e | a | d | . | . | . | . | . | . | . | . | . | . | . | . |
0x0010 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Posun | Typ dát | Názov | Vysvetlenie |
---|---|---|---|
0x0000 | uint(32) | Magické bajty | |
0x0004 | uint(24) | Dĺžka bloku | |
0x0007 | uint(8) | Zástavy | |
0x0008 | uint(32) | Verzia / Vlajky? | Tu by mohlo ísť o verziu formátu súboru; vo všetkých súboroch, ktoré mám k dispozícii, bola hodnota |
0x000c | uint(32) | Šírka (horizontálne rozlíšenie) | Uvádza, aká široká je obrázková súbor (v pixeloch). Pri všetkých studniach z Outpost 2 sa tu očakáva hodnota |
0x0010 | uint(32) | Výška (Vertikálne rozlíšenie) | Uvedie, aká vysoká je obrazová súbor (v pixeloch). Pri všetkých studniach z Outpost 2 sa tu očakáva hodnota |
0x0014 | uint(32) | Hĺbka farieb? | Význam tejto hodnoty je neznámy. Keďže sa vo všetkých skontrolovaných súboroch nachádza hodnota |
0x0018 | uint(32) | Hĺbka farby 2? | Význam tejto hodnoty je neznámy. Možno ide o 'cieľovú' hĺbku farieb. |
Na základe týchto údajov bude k dispozícii aj súbor paliet vo štandardizovanom formáte RIFF. Presná špecifikácia sa nachádza - keďže palety sa objavujú aj inde - na Palety.
Údaje dlaždíc
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | znaky | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 64 | 61 | 74 | 61 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | d | a | t | a | . | . | . | . | . | . | . | . | . | . | . | . |
Posun | Typ dát | Názov | Vysvetlenie |
---|---|---|---|
0x0000 | uint(32) | Magické bajty | |
0x0004 | uint(24) | Dĺžka bloku | |
0x0007 | uint(8) | Zástavy |
Nakoniec nasledujú prázdne pixeldáta, ktoré sú usporiadané zľava nahor po riadkoch smerom doprava a nadol.
Hodnota dát v grafike, ktorá je zvyčajne vo forme 8bpp bitmapy, zodpovedá indexu farby v farebnej palete.
Herný engine pravdepodobne vykresľuje dlaždice *na požiadanie*.
Toto sa zdá byť čiastočne spôsobené cyklom dňa a noci, ktorý pozná 32 odstupňovaní jednotlivých dlaždíc. Pri tom sa zjavne od hodnoty jasu 'trochu' odpočítava. Presné hodnoty sa zatiaľ nepodarilo zistiť, pracujem na výpočtovom základe
v *= (daylight / 48) + 0.25;
s HSV údajmi pixelov, pričom daylight je hodnota od 0 do 31 a v je hodnota medzi 0 a 1. Navyše je potrebné zohľadniť, že na mape existuje okraj 16 dlaždíc naľavo a napravo (ten slúži na neviditeľné spawnovanie jednotiek).
Ďalej sa zdá, že cyklus dňa a noci aktualizuje každú hernú cyklu iba jeden stĺpec mapy.
Urýchlený cyklus dňa a noci vyzerá preto takto:
PRT
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | znaky | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 43 | 50 | 41 | 4c | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | C | P | A | L | . | . | . | . | . | . | . | . | . | . | . | . |
Posun | Typ dát | Názov | Vysvetlenie |
---|---|---|---|
0x0000 | uint(32) | Magické bajty | |
0x0004 | uint(24) | Dĺžka palety | Uveďte počet paliet, ktoré sa nachádzajú v tomto súbore, na rozdiel od normálneho blokového formátu - nie dĺžku bloku v bajtoch. |
0x0007 | uint(8) | Zástavy | Pravdepodobne, ako obvykle, vlajky. Avšak nie sú mi známe žiadne vlajky; keďže všetky mi známe hodnoty zodpovedajú |
Čo presne znamená PRT
, neviem; možné by bolo napríklad 'Tabuľka paliet a zdrojov' - keďže ide o tento súbor - nachádzajúci sa ako op2_art.prt v maps.vol - ktorý presne takýto súbor predstavuje, alebo by to veľmi dobre vystihovalo jeho funkciu.
Tento súbor obsahuje zoznam paliet, tabuľku všetkých použitých bitmap, všetky definície animácií a množstvo neznámych dát. Voľne nasleduje doterajší formát kontajnerov, pretože nie všetky záznamy sa riadia týmto schémom.
Časť CPAL
(pravdepodobne znamená kontajner paliet) obsahuje iba dáta paliet, pričom uvádza, koľko z obvykle 1052 bajtových 8-bitových paliet je k dispozícii.
Uvedenie 1052 bajtov sa nepovažuje za záväzné, pretože formát paliet by mohol potenciálne predpokladať rôzne veľkosti paliet. Platí len pre súbor dát, s ktorým sa Outpost 2 dodáva.
Za zoznamom paliet nasleduje bezprostredne a bez úvodného záhlavia už zoznam bitmap; takisto bezprostredne za tým nasledujú zoznamy animácií.
Oba sa začínajú s uint(32) (alebo opäť uint24+uint8 vlajky?), ktorý obsahuje počet záznamov.
Palety
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | znaky | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 50 | 50 | 41 | 4c | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | P | P | A | L | . | . | . | . | . | . | . | . | . | . | . | . |
Posun | Typ dát | Názov | Vysvetlenie |
---|---|---|---|
0x0000 | uint(32) | Magické bajty | |
0x0004 | uint(24) | Dĺžka palety | Uvádza počet paliet, ktoré sa nachádzajú v tomto súbore, na rozdiel od normálneho blokového formátu - nie dĺžku bloku v bajtoch. |
0x0007 | uint(8) | Zástavy | Pravdepodobne, ako zvyčajne, vlajky. Ale nie sú mi známe žiadne vlajky; keďže všetky mne známe hodnoty zodpovedajú |
Informácie o paletách sa veľmi jednoducho čítajú.
Skladajú sa vždy z hlavičky a dátového segmentu.
Hlavička paliet
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | znaky | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 68 | 65 | 61 | 64 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | h | e | a | d | . | . | . | . | . | . | . | . | . | . | . | . |
Posun | Typ dát | Názov | Vysvetlenie |
---|---|---|---|
0x0000 | uint(32) | Magické bajty | |
0x0004 | uint(24) | Dĺžka palety | Uvádza počet paliet, ktoré sa nachádzajú v tomto súbore, na rozdiel od normálneho blokového formátu - nie dĺžku bloku v bajtoch. |
0x0007 | uint(8) | Zástavy | Pravdepodobne, ako zvyčajne, vlajky. Ale nie sú mi známe žiadne vlajky; keďže všetky mne známe hodnoty zodpovedajú |
0x0008 | uint(32) | Verzia formátu paliet? | Definuje pravdepodobne, ktorej verzii formátu paliet paleta vyhovuje. Všetky Outpost2 palety sa zdajú mať verziu |
Údaje o paletách
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | znaky | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 64 | 61 | 74 | 61 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | d | a | t | a | . | . | . | . | . | . | . | . | . | . | . | . |
Posun | Typ dát | Názov | Vysvetlenie |
---|---|---|---|
0x0000 | uint(32) | Magické bajty | |
0x0004 | uint(24) | Dĺžka bloku | |
0x0007 | uint(8) | Zástavy |
Úsek dát obsahuje jednotlivé záznamy paliet. Počet záznamov paliet sa určuje na základe dĺžky bloku / 4.
Jednotlivé záznamy majú pritom nasledujúcu, jednoduchú štruktúru;
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | znaky | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | 04 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Posun | Typ dát | Názov | Vysvetlenie |
---|---|---|---|
0x0000 | uint(8) | Červená komponenta | Určuje podiel červenej farby |
0x0001 | uint(8) | Zelená zložka | Udáva podiel zelenej farby |
0x0002 | uint(8) | Modrá zložka | Určuje podiel modrej farby |
0x0003 | uint(8) | Neznáme - Vlajky? | Nie je jasné, čo tento hodnot znamená, pretože sa zdá, že je v podstate |
K paletám sa inak dá povedať len to, že pre palety používané v animáciách platia nasledujúce pravidlá:
- Prvá farba je VŽDY transparentná, bez ohľadu na to, aká hodnota je tam uvedená.
-
Počiatočné položky palety 1-24 sú v paletách 1-8 považované za farbu hráča.
Odkiaľ presne farby pochádzajú mimo hráča 1, mi nie je jasné.
Predpokladám, že ostatné farby sú hardcoded.
Bitmapy
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | znaky | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
0x0010 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Posun | Typ dát | Názov | Vysvetlenie |
---|---|---|---|
0x0000 | uint(32) | Zarovnaná šírka | Udáva šírku riadkov pixelových údajov v bytoch - keďže sú zarovnané na 4-bajtové hranice. Takže je rýchlo možné preskočiť na konkrétny riadok obrázka. Prečo sa táto hodnota uchováva samostatne, hoci by mohla byť vypočítaná, je nejasné. |
0x0004 | uint(32) | Offset | Udáva posun prvej riadku v bitmape |
0x0008 | uint(32) | Výška | Uvedie výšku obrázku v pixeloch |
0x000c | uint(32) | Šírka | Uvedie šírku obrázka v pixeloch |
0x0010 | uint(16) | Typ | Udáva typ obrázka. Zdá sa, že ide o bitovú masku:
|
0x0012 | uint(16) | Paleta | Definuje, ktorá paleta z PRT súboru sa má použiť |
Táto dátová štruktúra súboru PRT uvádza, ako sú zostavené bitmapy použité pre sprity. Tieto bitmapy slúžia ako jednotlivý prvok, z ktorého sa niekoľko skladá do animačného rámca spritu.
Konkrétne obrazové dáta sa nachádzajú v
op2_art.BMP v hernom adresári.
Prečo táto bitmapová súbor má (väčšinou správny) RIFF bitmapový hlavičku,
nie je jasné. Pravdepodobne Outpost 2 používa systémové API na načítanie grafiky,
keďže táto hlavička je dočasne prebraná a príslušné, variabilné polia sú prepísané.
Pixelové dáta sa nachádzajú v BMP súbore na polohe Offset + uint32-Offset, ktoré nájdete v BMP súbore na adrese 0x000A (RIFF bitmapové dátové offset), a opäť zodpovedajú radenie po riadkoch zľava hore doprava dole.
Monochromatické 1bpp grafiky môžu byť nakreslené tak, že farba 0 je úplná transparentnosť, a farba 1 je polotransparentná čierna/sivá, pretože monochromatické grafiky sú zvyčajne používané pre tiene vozidiel a budov v animáciách.
Týmto spôsobom je možné zostaviť už veľa grafík.
Animácie
Teraz prechádzame na kráľovskú triedu disciplín v rámci formátov dát Outpost 2:
Na animácie.
Zoznamy animácií začínajú globálnym hlavičkovým riadkom, ktorý primárne slúži na overenie dát. Následne nasledujú konkrétne definície animácií, ktoré sú rozdelené do 3 úrovní:
-
Animácia
Animácia je najvyššia inštancia; predstavuje animáciu jednotky, budovy alebo 'časticovej animácie' (náraz kométy, počasie, výbuch) v určitej počiatočnej situácii. -
Frame
Frame je jednotlivý obrázok v rámci animácie. Animácia môže obsahovať jeden alebo viac frame-ov. -
Subframe
Subframe je informácia o tom, že určité bitmapy by sa mali za určitých kritérií nakresliť na konkrétne miesto frame-u. Frame môže obsahovať jeden alebo viac subframe-ov.
Následne už nasledujú jednotlivé definície animácií.
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | znaky | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Posun | Typ dát | Názov | Vysvetlenie |
---|---|---|---|
0x0000 | uint(32) | Počet animácií | Koľko animačných záznamov je k dispozícii |
0x0004 | uint(32) | Počet snímok | Koľko rámcov by malo byť celkovo prítomných |
0x0008 | uint(32) | Počet subrámcov | Koľko subrámcov by malo byť celkovo prítomných |
0x000c | uint(32) | Počet voliteľných položiek | Koľko "voliteľných položiek" je k dispozícii. |
Animácia
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | znaky | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
0x0010 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
0x0020 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Posun | Typ dát | Názov | Vysvetlenie |
---|---|---|---|
0x0000 | uint(32) | Neznáme 1 | Neznáme informácie |
0x0004 | uint(32) | Ohraničujúci rám: Vľavo | Určuje ľavý začiatok (v pixeloch) Bounding Box. |
0x0008 | uint(32) | Ohraničujúci rámec: Hore | Určuje horný začiatok (v pixeloch) Bounding Box. |
0x000c | uint(32) | Ohraničujúci rám: Šírka | Uvádza šírku (v pixeloch) obmedzujúcej oblasti. |
0x0010 | uint(32) | Ohraničujúci rám: výška | Udáva výšku (v pixeloch) obdĺžnikovej oblasti. |
0x0014 | uint(32) | Posun: X | Určuje horizontálne stredisko animácie |
0x0018 | uint(32) | Offset: Y | Určuje vertikálny stred animácie |
0x001c | uint(32) | Neznáme 2 | Neznáme informácie |
0x0020 | uint(32) | Počet snímok | Uveďte, koľko animačných snímok je obsiahnutých v tejto animácii |
0x0024 | uint(32) | Počet okien | Uvedie, koľko okien sa má použiť pri kreslení |
Údaje najvyššej vrstvy, animácie, sú predovšetkým administratívne údaje - Boundingbox označuje súradnice značky okolo vozidla/budovy, kedy je vybrané a zároveň udáva, ktorá oblasť by mala byť klikateľná.
Offset primárne určuje "nulový bod"; bod, na ktorý sa majú vypočítať či odpočítať herné interné súradnice. Mohli by sme to tiež povedať matematicky: offset tu označuje súradnicový pôvod.
Windows sa, rovnako ako offset, skladajú z 4 uint(32) hodnôt pre každé okno, ktoré určujú oblasť, ktorá je považovaná za použiteľnú pre jednotlivé subrámce. Mimo windows sa nesmie, pokým to nie je vhodne určené pre bitmapu, kresliť.
Rám
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | znaky | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Posun | Typ dát | Názov | Vysvetlenie |
---|---|---|---|
0x0000 | uint(8) | Počet subrámov a prepínač pre voliteľné 1, 2 | Táto hodnota obsahuje:
|
0x0001 | uint(8) | Neznáme 1 a prepínač pre voliteľné 3, 4 | Táto hodnota obsahuje:
|
0x0002 | uint(8) | Voliteľné 1 | Neznáme |
0x0003 | uint(8) | Voliteľné 2 | Neznáme |
0x0004 | uint(8) | Voliteľné 3 | Neznáme |
0x0005 | uint(8) | Voliteľné 4 | Neznáme |
Subrám
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | znaky | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Posun | Typ dát | Názov | Vysvetlenie |
---|---|---|---|
0x0000 | uint(16) | Bitmap-ID | Určuje, ktorá bitmapa má byť použitá pre tento subframe |
0x0002 | uint(8) | Neznáme 1 | Je neznáme - avšak silne predpokladám, že ide o prioritu renderovania (Z-layer). |
0x0003 | uint(8) | Subframe-Id | Určuje, v akom subrámci sa nachádzame |
0x0004 | sint(16) | Offset - Horizontálny | Určuje, kde v rámci rámca by sa malo umiestniť subrámec, respektíve o koľko pixelov by sa mala bitmapa horizontálne posunúť. |
0x0006 | sint(16) | Offset - Vertikálne | Určuje, kde v rámci rámca má byť subrámec umiestnený, resp. o koľko pixelov má byť bitmapa vertikálne posunutá. |
Týmto môžeme teraz jednotlivé rámce, ako aj kompletné animácie, zodpovedajúcim spôsobom skombinovať, čo je demonštrované na príklade zložitejšej animácie s indexom 500.
Animácia 500
Animácia 500 ukazuje, ako sa vykladá Plymouth-transportér naložený bežným orechom. Ide o jednu z mála animácií, ktoré využívajú funkciu okien.
Takto je možné zložiť celú animáciu.
Žiaľ, stále existuje problém s horným nakladacím otvorom, pretože v informáciách o type grafiky nie je nastavený príslušný bit.
Tu je niekoľko ďalších nádherne animovaných spriteov zo hry:
Používateľské rozhranie
Teraz chýba už len používateľské rozhranie hry, ktoré je spracované v brúsenom kovovom vzhľade.
Ale aj tu je jasné, že Dynamix nemusel vynájsť koleso; tu sa nielen využívajú jednoduché API User32 a GDI32 poskytované Windows, ale najmä sa tu využíva aj správa zdrojov od User32.
Tie sa dajú napríklad extrahovať pomocou programov ako Resource Hacker, ktorý bol vyvinutý ako freeware od Angus Johnson, alebo - ak sa bojíte použiť Wine na Linuxe / Mac OS - s pomocou wrestool, ktorý je súčasťou icoutils.
Názov súboru | Obsah |
---|---|
Outpost2.exe | Obsahuje iba ikonu hry, ktorá zobrazuje vesmírnu stanicu pred New Terra |
op2shres.dll | Obsahuje grafiku pre ovládacie prvky ako sú okraje, tlačidlá, rádiové tlačidlá a zaškrtávacie políčka, ako aj pozadia dialógov, sprievodné obrázky pre texty príbehových misií a pozadievú grafiku hlavného menu |
out2res.dll | Obsahuje dekoráciu okien v hre, ikony pre bežný a špeciálny kov, obrazovku načítania, grafiku pre dialógy a ďalšie grafiky kurzora, okrem animovaných v hernom adresári |