Outpost 2 Formáty souborů · bei.pm
Formáty souborů popsané na této stránce vycházejí z technické analýzy duševního vlastnictví společnosti Dynamix, Inc. a Sierra Entertainment.
Duševní vlastnictví je dnes součástí majetku Activision Publishing, Inc. / Activision Blizzard, Inc. a v současnosti je ve vlastnictví Microsoft Corp..
Informace byly shromážděny pomocí Reverse Engineering a analýzy dat za účelem archivace a interoperability s historickými daty.
Nebyly použity žádné proprietární nebo důvěrné specifikace.
Hra je v současnosti dostupná ke koupi jako stahování na gog.com.
Následující série článků dokumentuje mé poznatky o datových formátech ve hře v reálném čase "Outpost 2: Divided Destiny", kterou v roce 1997 vydala Sierra a vyvinula Dynamix.
Od 1. listopadu 2015 do 14. listopadu 2015 jsem se převážně věnoval analýze dat hry - a tomu, co s nimi lze dělat.
Podle informací, které jsem dosud získal, Dynamix - jako mnoho komerčních společností - nevyvinul některé datové formáty speciálně pro Outpost 2, ale použil je také v jiných projektech, jako je například série Mechwarrior (v upravené podobě).
Nezávisle na tom lze také konstatovat, že inovační schopnost datových formátů je prakticky omezena a často se zakládá na dlouho existujících konceptech běžných formátů, jako jsou JFIF a RIFF.
Pro interpretaci tabulek a datových formátů jsou k dispozici další informace na Co je co?.
Údaje uvedené zde jsou obecně chápány jako Little Endian.
Závěrem lze říci, že inženýrství zpětného inženýrství bylo velmi zábavné, i když není úplné.
Samozřejmě mohu také doporučit, abyste hru sami hráli, protože nabízí zajímavé herní mechanismy.
Úvod
Formáty dat používané v Outpost 2 mají strukturu připomínající JFIF / PNG - jednotlivé datové bloky vždy obsahují 8 bajtový header. Takže si ušetřím dokumentaci jednotlivých headerů na příslušných specifických místech a dokumentuji pouze odchylky.
Formát je vždy následující; skutečná uživatelská data jsou v něm pak vložena:
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | znaky | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Typ dat | Označení | Vysvětlení |
---|---|---|---|
0x0000 | uint(32) | Magické bajty | Obsahuje informace o tom, co lze očekávat v následujícím datovém bloku. Známé hodnoty:
|
0x0004 | uint(24) | Délka bloku | Obsahuje informaci o velikosti (v bytech) následujícího datového bloku. Jedná se přitom o čistá uživatelská data - 8 bytů hlavičky není zahrnuto. |
0x0007 | uint(8) | Vlajky? | Je neznámé, k čemu tento blok přesně slouží. V objemech je tato hodnota často 0x80, v jiných souborech často 0x00. To naznačuje, že se jedná o nastavení příznaku. |
Objemy
Volumes jsou datové kontejnery pro hru, podobně jako archivní formát jako např. Tarball. Alespoň v Outpost 2 formát obsahuje pouze soubory - žádné složky. Pravděpodobně by se však daly simulovat pomocí odpovídajících názvů souborů.
Volume se skládá z hlavičky volume a několika bloků volume, které odpovídají konkrétním souborům.
"Volumes" jsou soubory s příponou 'vol'
ve herním adresáři.
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 | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Typ dat | Označení | Vysvětlení |
---|---|---|---|
0x0000 | uint(32) | Magické byty | |
0x0004 | uint(24) | Délka bloku | |
0x0007 | uint(8) | Vlajky |
Hlava 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 | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Typ dat | Označení | Vysvětlení |
---|---|---|---|
0x0000 | uint(32) | Magické byty | |
0x0004 | uint(24) | Délka bloku | |
0x0007 | uint(8) | Vlajky |
Objemový hlavička sama o sobě neobsahuje žádná uživatelská data.
Slouží pouze jako kontejner.
A jako první údaj v objemové hlavičce by měly být objemové řetězce; za nimi následují informace o objemu.
Objemové řetězce
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 | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Typ dat | Označení | Vysvětlení |
---|---|---|---|
0x0000 | uint(32) | Magické byty | |
0x0004 | uint(24) | Délka bloku | |
0x0007 | uint(8) | Vlajky |
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 | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Typ dat | Označení | Vysvětlení |
---|---|---|---|
0x0000 | uint(32) | Magické byty | |
0x0004 | uint(24) | Délka bloku | |
0x0007 | uint(8) | Vlajky | |
0x0008 | uint(32) | Délka payloadu | Uvede, kolik bytů z následujících dat je skutečně užitečných. Ostatní zbývající data seznamu volume-strings jsou zjevně považována za garbage. V souborech s pozdějším datem jsou tato 'zbývající data' 0x00, což by mohlo naznačovat nedostatky v nástrojích během vývoje hry, tedy že se až velmi pozdě začal vývojář zabývat správnou inicializací bufferů, protože na hru nemá vliv, zda jsou data inicializována či nikoli. |
0x000c | uint(8)[] | Seznam názvů souborů | Toto je seznam názvů souborů ukončený 0 bajty, který - alespoň v rámci tohoto datového prvku - očekává pouze ASCII znaky. Není nutné při analýze dat tento datový blok podrobněji vyhodnocovat, protože v informacích o svazku jsou stejně přímo odkazovány offsety názvů souborů. |
V případě Volume Strings se jedná o seznam názvů souborů, které jsou obsaženy v daném volume.
Informace o objemu
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 | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Typ dat | Označení | Vysvětlení |
---|---|---|---|
0x0000 | uint(32) | Magické byty | |
0x0004 | uint(24) | Délka bloku | |
0x0007 | uint(8) | Vlajky |
Informace o svazku obsahují podrobnější údaje o souborech. V určitých ohledech se jedná o jakýsi typ záznamu v adresáři FAT (FAT = Tabulka alokace souborů).
Počet souborů se vypočítá jako velikost bloku dělená délkou záznamů v adresáři - 14 bajtů.
Každý jednotlivý záznam v adresáři má přitom následující strukturu:
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | znaky | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Typ dat | Označení | Vysvětlení |
---|---|---|---|
0x0000 | uint(32) | Offset názvu souboru | Uvedeno, na jakém offsetu (!) v seznamu názvů souborů (Volume-Strings) se nachází název souboru daného souboru. Odkazuje se přitom na začátek bloku užitečných dat. |
0x0004 | uint(32) | Offset souboru | Umožňuje určit, na jakém offsetu v rámci celé objemové souboru se soubor nachází. |
0x0008 | uint(32) | Velikost souboru | Určuje, jak velký je soubor v bytech. |
0x000c | uint(16) | Vlajky? | Zdá se, že obsahuje další informace o kódování souboru.
|
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 | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Typ dat | Označení | Vysvětlení |
---|---|---|---|
0x0000 | uint(32) | Magické byty | |
0x0004 | uint(24) | Délka bloku | |
0x0007 | uint(8) | Vlajky |
Objemový blok je kontejner, který obsahuje soubory. Znovu, kvůli formátu bloku, obsahuje redundatně velikost souboru a následně přímo následují uživatelská data.
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 | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Typ dat | Označení | Vysvětlení |
---|---|---|---|
0x0000 | uint(32) | Magické bajty | |
0x0004 | uint(24) | Délka bloku | |
0x0007 | uint(8) | Vlajky |
Tiles jsou specifickým bitmapovým grafickým formátem pro Outpost-2.
Čítají 13 Tilesetů, nazývaných "wells" (well0000.bmp
až well0012.bmp
),
které se nacházejí uvnitř objemu maps.vol.
Tilesety / Wells obsahují následující:
Název souboru | Obsah |
---|---|
well0000.bmp | Grafika o velikosti 32x32px, modrá - ideální jako test, zda funguje váš image-loader |
well0001.bmp | Obsahuje světlé skály, pohoří na světlých skalách a nespočet variant impaktových kráterů na světlých skalách |
well0002.bmp | Obsahuje 'Doodads' na světlých skalách - tedy prvky, které lze umístit na světlé skály pro rozptýlení (nebo vědomě jako strukturu, jako např. zdi), včetně vegetace |
well0003.bmp | Obsahuje krustovou strukturu na světlých skalách |
well0004.bmp | Obsahuje tmavé skály, pohoří na tmavých skalách a nespočet variant impaktových kráterů na tmavých skalách |
well0005.bmp | Obsahuje 'Doodads' na tmavých skalách - tedy prvky, které lze umístit na tmavé skály pro rozptýlení (nebo vědomě jako strukturu, jako např. zdi) |
well0006.bmp | Obsahuje krustovou strukturu na tmavých skalách a přechody mezi světlými a tmavými skálami |
well0007.bmp | Obsahuje lávu včetně 4-5 snímků animace |
well0008.bmp | Obsahuje písek a nespočet variant impaktových kráterů v písku |
well0009.bmp | Obsahuje 'Doodads' na písku - tedy prvky, které lze umístit na písek pro rozptýlení (nebo vědomě jako strukturu, jako např. zdi) |
well0010.bmp | Obsahuje 48 přechodů z písku na světlé a tmavé skály |
well0011.bmp | Obsahuje polární čepice mapy, s tmavými skalami jako podkladem |
well0012.bmp | Obsahuje polární čepice mapy, se světlými skalami jako podkladem |
Doporučuje se pro přesnou realizaci nezobrazovat dlaždice předem, aby se mohly ukládat do cache, protože data pro cyklus den/noc musí být ještě zpracována - a vzniklo by tak velmi, velmi mnoho dat.
Dlaždice jsou 8bpp grafiky s indexovanou paletou o rozlišení 32x32 pixelů, které jsou uspořádány vedle sebe. V takto vytvořeném dlaždicovém souboru však může být mnohem více
Hlavní kontejner se skládá ze 2 sekcí: head
a data
.
Hlavička dlaždic
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 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Typ dat | Označení | Vysvětlení |
---|---|---|---|
0x0000 | uint(32) | Magické bajty | |
0x0004 | uint(24) | Délka bloku | |
0x0007 | uint(8) | Vlajky | |
0x0008 | uint(32) | Verze / Vlajky? | Toto by mohlo být označení verze formátu souboru; ve všech souborech, které mám k dispozici, byla uvedena hodnota |
0x000c | uint(32) | Šířka (Horizontální rozlišení) | Udává, jak široký je obrazový soubor (v pixelech). U všech studní z Outpost 2 se zde očekává hodnota |
0x0010 | uint(32) | Výška (Vertikální rozlišení) | Udává, jak vysoký je obrazový soubor (v pixelech). U všech studní v Outpost 2 se zde očekává hodnota |
0x0014 | uint(32) | Hlubka barev? | Význam této hodnoty není znám. Jelikož ve všech zkontrolovaných souborech obsahuje hodnotu |
0x0018 | uint(32) | Hlubka barev 2? | Význam této hodnoty je neznámý. Možná se jedná o 'cílovou' barevnou hloubku. |
Po těchto údajích následuje ještě soubor palety ve standardizovaném formátu RIFF. Přesná specifikace se nachází - protože se palety objevují i jinde - na stránce Palety.
Data dlaždic
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 | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Typ dat | Označení | Vysvětlení |
---|---|---|---|
0x0000 | uint(32) | Magické bajty | |
0x0004 | uint(24) | Délka bloku | |
0x0007 | uint(8) | Vlajky |
Nakonec následují čistá pixlová data, zleva nahoře řádkově směrem k pravému dolnímu rohu.
Hodnota dat u grafiky, která je obvykle ve formátu 8bpp bitmap, odpovídá indexu barvy v barevné paletě.
Herní engine pravděpodobně vykresluje dlaždice *na vyžádání*.
To je zřejmě částečně způsobeno cyklem dne a noci, který zná 32 odstínů jednotlivých dlaždic. Z hodnoty jasu se zřejmě 'trochu' odečítá. Přesné hodnoty zatím nebylo možné určit, pracuji na základě výpočtu
v *= (daylight / 48) + 0.25;
s HSV daty pixelů, přičemž daylight je hodnota od 0 do 31 a v je hodnota mezi 0 a 1. Dále je třeba vzít v úvahu, že na mapě existuje ještě okraj 16 dlaždic vlevo a vpravo (ten slouží k neviditelnému spawnování jednotek).
Kromě toho se zdá, že cyklus dne a noci aktualizuje každé herní kolo pouze jeden sloupec mapy.
Zrychlený cyklus dne a noci vypadá následovně:
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 | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Typ dat | Označení | Vysvětlení |
---|---|---|---|
0x0000 | uint(32) | Magické byty | |
0x0004 | uint(24) | Délka palety | Uveďte, na rozdíl od běžného blokového formátu, počet palet, které se nacházejí v tomto souboru - nikoli délku bloku v bajtech. |
0x0007 | uint(8) | Vlajky | Pravděpodobně, jak je obvyklé, flagy. Ale žádné flagy mi nejsou známy; protože všechny mi známé hodnoty odpovídají |
Co přesně znamená PRT
mi není známo; mohlo by to například znamenat 'Palette and Resource Table' - protože se jedná o tento soubor - nalezený jako op2_art.prt v maps.vol - který skutečně takovou funkci má, nebo by to tuto funkci docela dobře popsalo.
Tento soubor obsahuje seznam palet, tabulku všech použitých bitmap, všechny definice animací a také řadu neznámých dat. Volně se drží dosavadního formátu kontejneru, protože ne všechny záznamy tomuto schématu odpovídají.
CPAL
sekce (pravděpodobně znamená kontejner palet) zahrnuje pouze data palet tím, že uvádí, kolik z obvykle 1052 bajtových 8-bitových palet je přítomno.
Uvedení 1052 bajtů není považováno za závazné, protože formát palet může potenciálně předpokládat různé velikosti palet. Platí pouze pro datový soubor, se kterým je Outpost 2 dodáván.
Za seznamem palet ihned a bez úvodního záhlaví následuje seznam bitmap; stejně bezprostředně za ním následují seznamy animací.
Oba jsou zahájeny uint(32) (nebo opět uint24+uint8 flagy?) tím, že obsahují počet záznamů.
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 | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Typ dat | Označení | Vysvětlení |
---|---|---|---|
0x0000 | uint(32) | Magické bajty | |
0x0004 | uint(24) | Délka palet | Uvádí počet palet, které lze nalézt v tomto souboru, na rozdíl od běžného blokového formátu - nikoli délku bloku v bytech. |
0x0007 | uint(8) | Vlajky | Pravděpodobně, jak je obvyklé, se jedná o flagy. Nicméně, žádné flagy mi nejsou známy; protože všechny mi známé hodnoty odpovídají |
Informace o paletách se velmi snadno načítají.
Skládají se vždy z hlavičky a datového segmentu.
Hlavička palety
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 | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Typ dat | Označení | Vysvětlení |
---|---|---|---|
0x0000 | uint(32) | Magické bajty | |
0x0004 | uint(24) | Délka palet | Uvádí počet palet, které lze nalézt v tomto souboru, na rozdíl od běžného blokového formátu - nikoli délku bloku v bytech. |
0x0007 | uint(8) | Vlajky | Pravděpodobně, jak je obvyklé, se jedná o flagy. Nicméně, žádné flagy mi nejsou známy; protože všechny mi známé hodnoty odpovídají |
0x0008 | uint(32) | Verze formátu palet? | Pravděpodobně definuje, které verzi formátu palet paleta odpovídá. Všechny palety Outpost2 se zdají mít verzi |
Ú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 | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Typ dat | Označení | Vysvětlení |
---|---|---|---|
0x0000 | uint(32) | Magické bajty | |
0x0004 | uint(24) | Délka bloku | |
0x0007 | uint(8) | Vlajky |
Datová sekce zahrnuje jednotlivé záznamy palet. Počet záznamů palet se určuje jako délka bloku děleno 4.
Jednotlivé záznamy mají následující, jednoduchou strukturu;
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | znaky | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | 04 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Typ dat | Označení | Vysvětlení |
---|---|---|---|
0x0000 | uint(8) | Červená složka | Udává podíl červené barvy |
0x0001 | uint(8) | Zelená složka | Udává podíl zelené barvy |
0x0002 | uint(8) | Modrá složka | Udává podíl modré barvy |
0x0003 | uint(8) | Neznámý - Vlajky? | Je nejasné, co tato hodnota znamená, protože se zdá, že je zásadně |
K paletám lze navíc říci, že pro palety používané v animacích platí následující pravidla:
- První barva je VŽDY transparentní, bez ohledu na to, jaká hodnota je tam uvedena.
-
Položky palety 1-24 se v paletách 1-8 považují za barvy hráče.
Odkud přesně pocházejí barvy mimo hráče 1, není mi známo.
Předpokládám, že zbývající barvy jsou hardcoded.
Bitové mapy
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | znaky | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
0x0010 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Typ dat | Označení | Vysvětlení |
---|---|---|---|
0x0000 | uint(32) | Zarovnaná šířka | Uvádí šířku řádků dat pixelů v bajtech - protože tyto jsou zarovnány na 4-bajtové hranice. Díky tomu je rychle možné přeskočit na určitou řadu obrázku. Proč je tato hodnota uložena samostatně, i když by mohla být vypočítána, není jasné. |
0x0004 | uint(32) | Ofset | Určuje posun první řady v bitmapě |
0x0008 | uint(32) | Výška | Udává výšku obrázku v pixelech |
0x000c | uint(32) | Šířka | Uveďte šířku obrázku v pixelech |
0x0010 | uint(16) | Typ | Určuje typ obrázku. Zde se zdá, že se jedná o bitovou masku:
|
0x0012 | uint(16) | Paleta | Definuje, která paleta z PRT souboru má být použita |
Tato datová struktura souboru PRT udává, jak jsou strukturovány bitmapy používané pro sprity. Tyto bitmapy slouží jako jednotlivé části, z nichž je několik složeno do animačního snímku spritu.
Konkrétní obrazová data se však skrývají v
op2_art.BMP v herním adresáři.
Proč tento bitmapový soubor obsahuje (většinou správný) RIFF bitmapový header, není jasné. Pravděpodobně Outpost 2 používá systémové API pro načítání grafik, přičemž tento header je dočasně převzat a příslušná, variabilní pole jsou přepsána.
Pixelová data se nacházejí v BMP souboru na pozici Offset + uint32-Offset, který lze najít v BMP souboru na adrese 0x000A (RIFF bitmapový datový offset) a znovu odpovídají řádkovému uspořádání zleva doprava a shora dolů.
Monochromatické grafiky 1bpp mohou být vykresleny tak, že barva 0 představuje úplnou průhlednost, zatímco barva 1 je poloprůhledná černá/šedá, protože monochromatické grafiky se obvykle používají pro stíny vozidel a budov v animacích.
Tímto způsobem lze již sestavit mnoho grafik.
Animace
Nyní se dostáváme k vrcholné disciplíně v rámci datových formátů Outpost 2:
k animacím.
Seznamy animací začínají globální hlavičkou, která slouží primárně pro verifikaci dat. Následují konkrétní definice animací, které jsou rozděleny do 3 úrovní:
-
Animace
Animace je nejvyšší instancí; představuje animaci jednotky, budovy nebo 'partiklové animace' (náraz komety, počasí, exploze) v určité výchozí situaci. -
Frame
Frame je jednotlivý snímek v rámci animace. Animace může obsahovat jeden nebo více snímků. -
Subframe
Subframe je informace o tom, že určité bitmapě má být pod určitými kritérii vykresleno na určité pozici snímku. Snímek může obsahovat jeden nebo více subframe.
Následně již přímo následují jednotlivé definice animací.
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | znaky | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Typ dat | Označení | Vysvětlení |
---|---|---|---|
0x0000 | uint(32) | Počet animací | Kolik animačních datových sad je k dispozici |
0x0004 | uint(32) | Počet snímků | Kolik rámců by celkem mělo být přítomno |
0x0008 | uint(32) | Počet subrámců | Kolik subframů by mělo být celkem k dispozici |
0x000c | uint(32) | Počet volitelných položek | Kolik "volitelných položek" je k dispozici. |
Animace
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | znaky | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
0x0010 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
0x0020 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Typ dat | Označení | Vysvětlení |
---|---|---|---|
0x0000 | uint(32) | Neznámý 1 | Neznámé informace |
0x0004 | uint(32) | Ohraničující rámeček: Vlevo | Určuje levý začátek (v pixelech) Bounding Box. |
0x0008 | uint(32) | Ohraničující rámeček: Nahoru | Určuje horní začátek (v pixelech) Bounding Box. |
0x000c | uint(32) | Ohraničující rámeček: Šířka | Udává šířku (v pixelech) ohraničujícího rámečku. |
0x0010 | uint(32) | Ohraničující box: výška | Udává výšku (v pixelech) Bounding Box. |
0x0014 | uint(32) | Offset: X | Určuje horizontální střed animace |
0x0018 | uint(32) | Offset: Y | Určuje vertikální střed animace |
0x001c | uint(32) | Neznámý 2 | Neznámé informace |
0x0020 | uint(32) | Počet snímků | Uvede, kolik animačních snímků je obsaženo v této animaci |
0x0024 | uint(32) | Počet oken | Určuje, kolik oken má být použito při kreslení |
Údaje nejvyšší vrstvy, animace, jsou především administrativními daty - Boundingbox označuje souřadnice značky kolem vozidla/budovy, když je vybráno, a zároveň také určuje, která oblast by měla být klikací.
Offset primárně určuje "nulový bod"; bod, který je třeba připočítat nebo odečíst od herních souřadnic. Mohli bychom také říci matematicky: offset zde označuje počátek souřadnic.
V oknech se, stejně jako u offsetu, jedná o 4 uint(32) hodnoty pro každé okno, které určují oblast, která je považována za použitelnou pro jednotlivé subrámce. Mimo okna se, pokud to není pro bitmapu příslušně určeno, nesmí kreslit.
Rám
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | znaky | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Typ dat | Označení | Vysvětlení |
---|---|---|---|
0x0000 | uint(8) | Počet sub rámů a přepínač pro Volitelný 1, 2 | Tato hodnota obsahuje:
|
0x0001 | uint(8) | Neznámý 1 a přepínač pro volitelné 3, 4 | Tato hodnota obsahuje:
|
0x0002 | uint(8) | Volitelné 1 | Neznámý |
0x0003 | uint(8) | Volitelné 2 | Neznámý |
0x0004 | uint(8) | Volitelné 3 | Neznámý |
0x0005 | uint(8) | Volitelné 4 | Neznámý |
Podrámeček
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | znaky | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Typ dat | Označení | Vysvětlení |
---|---|---|---|
0x0000 | uint(16) | Bitmap-ID | Určuje, která bitmapa má být použita pro tento subframe |
0x0002 | uint(8) | Neznámý 1 | Je neznámé - silně se domnívám, že se jedná o prioritu renderování (Z-Layer). |
0x0003 | uint(8) | Subframe-Id | Uveďte, v jakém subrámu se nacházíme |
0x0004 | sint(16) | Offset - Horizontální | Určuje, kde uvnitř rámce má být subrámec umístěn, nebo o kolik pixelů má být bitmapa horizontálně posunuta. |
0x0006 | sint(16) | Offset - Vertikální | Určuje, kde uvnitř rámce má být subrámec umístěn, nebo o kolik pixelů má být bitmapa vertikálně posunuta. |
Tímto můžeme nyní jednotlivé snímky i kompletní animace sestavovat podle potřeby, zde je to ukázáno na komplexnější animaci s indexem 500.
Animace 500
Animace 500 ukazuje, jak je vykládán Plymouth Transporter naložený běžným rudným materiálem. Jedná se o jednu z mála animací, které využívají funkčnost okna.
A tak lze celou animaci spojit dohromady.
Omlouváme se, ale stále existuje problém s horním nakládacím otvorem, protože zde není nastavený odpovídající bit v informacích o typu grafiky.
Zde je ještě několik dalších nádherně animovaných spriteů ze hry:
Uživatelské rozhraní
Nyní zbývá ještě uživatelské rozhraní hry, které je ve stylu kartáčovaného kovu.
Ale i zde je patrné, že Dynamix nemusel vynalézat kolo znovu; zde se nejen jednoduše využívají API User32 a GDI32 poskytované Windows - zejména se zde také využívá správa zdrojů z User32.
Tyto zdroje lze například extrahovat pomocí programů, jako je Resource Hacker, který vyvinul Angus Johnson jako freeware, nebo - pokud se někdo pod Linuxem / Mac OS vyhýbá použití Wine - pomocí wrestool obsaženého v icoutils.
Název souboru | Obsah |
---|---|
Outpost2.exe | Obsahuje pouze ikonu hry, která zobrazuje vesmírnou stanici před New Terra |
op2shres.dll | Obsahuje kromě grafiky pro ovládací prvky jako jsou rámečky, tlačítka, radio tlačítka a zaškrtávací políčka také pozadí dialogů, obrázky pro příběhové mise a pozadí hlavního menu |
out2res.dll | Obsahuje dekoraci oken ve hře, ikony pro běžný a speciální kov, načítací obrazovku, grafiku pro dialogy a další grafiky kurzorů, kromě animovaných v herním adresáři |