Outpost 2 Obrazci datotek · bei.pm
Na tej strani opisani formati datotek temeljijo na tehnični analizi intelektualne lastnine podjetja Dynamix, Inc. in Sierra Entertainment.
Intelektualna lastnina je danes del mase Activision Publishing, Inc. / Activision Blizzard, Inc. in je trenutno v lasti Microsoft Corp..
Informacije so bile zbrane z obratnim inženiringom in analizo podatkov z namenom arhiviranja in interoperabilnosti s zgodovinskimi podatki.
Niso bile uporabljene nobene lastniške ali zaupne specifikacije.
Igro je trenutno mogoče kupiti v obliki prenosa na gog.com.
Naslednja serija člankov dokumentira moje ugotovitve glede podatkovnih formatov v realnočasovni strateški igri "Outpost 2: Divided Destiny", ki jo je leta 1997 izdal Sierra in jo je razvila Dynamix.
Z analizo podatkov igre - in kako jih uporabiti - sem se ukvarjal od 1. novembra 2015 do 14. novembra 2015.
Informacije, ki sem jih doslej pridobil, kažejo, da je Dynamix - tako kot številna komercialna podjetja - nekaterih podatkovnih formatov ni razvila posebej za Outpost 2, temveč so jih uporabili tudi v drugih projektih, kot je serija Mechwarrior (prilagojeno).
Ne glede na to pa lahko opazimo, da inovativnost podatkovnih formatov v večini primerov ostaja omejena in se pogosto opira na že obstoječe koncepte iz običajnih formatov, kot sta JFIF in RIFF.
Za razlago tabel in podatkovnih formatov so na voljo dodatne informacije na Kaj je kaj?.
Tu navedeni podatki so na splošno razumljeni kot Little Endian.
Na koncu lahko rečem, da je bilo obratno inženirstvo zelo zabavno, čeprav ni popolno.
Naravno lahko priporočam tudi, da igrate igro sami, saj ponuja zanimive igralne mehanike.
Uvod
Podatkovni formati, ki jih uporablja Outpost 2, imajo strukturo, ki spominja na JFIF / PNG - posamezni podatkovni bloki vedno vsebujejo 8-bajtni glavo. Zato se odločim, da ne bom dokumentiral posameznih glav na ustreznih specifičnih mestih, temveč bom tam dokumentiral le odstopanja.
Format je vedno naslednji; dejanski uporabni podatki so nato v njem vgrajeni:
Nasl. | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | znak | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Odmik | Tip podatkov | Oznaka | Razlaga |
---|---|---|---|
0x0000 | uint(32) | Magični bajti | Vsebuje informacije o tem, kaj je mogoče pričakovati v naslednjem podatkovnem bloku. Znane vrednosti:
|
0x0004 | uint(24) | Dolžina bloka | Vsebuje informacijo o tem, kako velika (v bajtih) je naslednja podatkovna enota. Pri tem so mišljeni samo čisti uporabni podatki - 8 bajtov glave ni vključenih. |
0x0007 | uint(8) | Zastave? | Ni znano, čemu ta blok natančno služi. V volumnih je ta vrednost pogosto 0x80, v drugih datotekah pa pogosto 0x00. To nakazuje, da gre za nastavljeno oznako. |
Obsegi
Volumi so podatkovni kontejner za igro, podoben arhivskemu formatu, kot je na primer Tarball. V Outpost 2 to format pozna le datoteke - brez map. Vendar bi jih verjetno lahko simulirali s ustreznimi imeni datotek.
Volumen je sestavljen iz volumske glave in več volumski blokov, ki ustrezajo konkretnim datotekam.
"Volumi" so datoteke z končnico 'vol'
v imeniku igre.
Nasl. | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | znak | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 56 | 4f | 4c | 20 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | V | O | L | . | . | . | . | . | . | . | . | . | . | . | . |
Odmik | Tip podatkov | Oznaka | Razlaga |
---|---|---|---|
0x0000 | uint(32) | Magični bajti | |
0x0004 | uint(24) | Dolžina bloka | |
0x0007 | uint(8) | Zastave |
Glava volumna
Nasl. | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | znak | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 76 | 6f | 6c | 68 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | v | o | l | h | . | . | . | . | . | . | . | . | . | . | . | . |
Odmik | Tip podatkov | Oznaka | Razlaga |
---|---|---|---|
0x0000 | uint(32) | Magični bajti | |
0x0004 | uint(24) | Dolžina bloka | |
0x0007 | uint(8) | Zastave |
Glava volumna ne vsebuje nobenih uporabnih podatkov.
Uporablja se le kot kontejner.
Prvi podatki v glavi volumna bi morali biti nizi volumna; za njimi sledijo informacije o volumnu.
Obsegni Nizi
Nasl. | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | znak | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 76 | 6f | 6c | 69 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | v | o | l | i | . | . | . | . | . | . | . | . | . | . | . | . |
Odmik | Tip podatkov | Oznaka | Razlaga |
---|---|---|---|
0x0000 | uint(32) | Magični bajti | |
0x0004 | uint(24) | Dolžina bloka | |
0x0007 | uint(8) | Zastave |
Nasl. | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | znak | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 76 | 6f | 6c | 73 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | v | o | l | s | . | . | . | . | . | . | . | . | . | . | . | . |
Odmik | Tip podatkov | Oznaka | Razlaga |
---|---|---|---|
0x0000 | uint(32) | Magični bajti | |
0x0004 | uint(24) | Dolžina bloka | |
0x0007 | uint(8) | Zastave | |
0x0008 | uint(32) | Dolžina payloada | Navaja, koliko bajtov naslednjih podatkov je dejansko uporabnih podatkov. Preostali, ostali podatki seznama niza volumnov so očitno obravnavani kot odpadki. V datotekah z novejšimi datumi so ti 'preostali podatki' 0x00, kar bi lahko nakazovalo na pomanjkljivosti orodnih verig med razvojem igre, torej, da se je razvijalec za pravilno inicializacijo pomnilnika poskrbel šele zelo pozno, saj nima vpliva na igro, ali so podatki inicializirani ali ne. |
0x000c | uint(8)[] | Seznam datotečnih imen | Gre za seznam imen datotek, ki je zaključen z 0-byte, in ki - vsaj v tem danem sklopu podatkov - pričakuje le ASCII znake. Pri razčlenjevanju podatkov ni potrebno natančneje obravnavati tega podatkovnega bloka, saj so v informacijah o volumnu neposredno referencirani premiki imen datotek. |
Volume Strings so seznam imen datotek, ki so vključene v volumen.
Informacije o volumnu
Nasl. | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | znak | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 76 | 6f | 6c | 69 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | v | o | l | i | . | . | . | . | . | . | . | . | . | . | . | . |
Odmik | Tip podatkov | Oznaka | Razlaga |
---|---|---|---|
0x0000 | uint(32) | Magični bajti | |
0x0004 | uint(24) | Dolžina bloka | |
0x0007 | uint(8) | Zastave |
Informacije o volumnu zajemajo podrobnejše informacije o datotekah. Gre nekako za vrsto vnosa v FAT imeniku (FAT = tabela dodelitve datotek).
Število datotek izhaja iz velikosti bloka, deljene z dolžino vnosov v imeniku - 14 bajtov.
Posamezni vnosi v imeniku imajo naslednjo strukturo:
Nasl. | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | znak | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Odmik | Tip podatkov | Oznaka | Razlaga |
---|---|---|---|
0x0000 | uint(32) | Offset imena datoteke | Navede, na katerem offsetu (!) znotraj seznama imen datotek (Volume-Strings) se nahaja ime datoteke. To se nanaša na začetek bloka uporabniških podatkov. |
0x0004 | uint(32) | Datotečni odklon | Označuje, na katerem odklonu znotraj celotne datoteke volumna se nahaja datoteka. |
0x0008 | uint(32) | Velikost datoteke | Označuje, koliko je velika datoteka v bajtih. |
0x000c | uint(16) | Zastave? | Očitno daje dodatne informacije o kodiranju datotek.
|
Volumski blok
Nasl. | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | znak | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 56 | 42 | 4c | 48 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | V | B | L | H | . | . | . | . | . | . | . | . | . | . | . | . |
Odmik | Tip podatkov | Oznaka | Razlaga |
---|---|---|---|
0x0000 | uint(32) | Magični bajti | |
0x0004 | uint(24) | Dolžina bloka | |
0x0007 | uint(8) | Zastave |
Volume blok je kontejner, ki shranjuje datoteke. Vsebuje še enkrat - zaradi bloka formata - odvečno velikost datoteke, nato pa sledijo neposredno uporabniški podatki.
Ploščice
Nasl. | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | znak | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 50 | 42 | 4d | 50 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | P | B | M | P | . | . | . | . | . | . | . | . | . | . | . | . |
Odmik | Tip podatkov | Oznaka | Razlaga |
---|---|---|---|
0x0000 | uint(32) | Magicalni bajti | |
0x0004 | uint(24) | Dolžina bloka | |
0x0007 | uint(8) | Zastave |
Tiles predstavljajo specifičen format bitmap grafike za Outpost-2. Raztezajo se čez 13 Tilesetov, imenovanih "wells" (well0000.bmp
do well0012.bmp
), ki se nahajajo znotraj volumna maps.vol.
Tileseti / Wells vsebujejo naslednje:
Ime datoteke | Vsebina |
---|---|
well0000.bmp | Modra grafika velikosti 32x32px - idealna za testiranje delovanja svojega nalagača slik |
well0001.bmp | Vsebuje svetle kamnine, gorske verige na svetlih kamninah in številne različice kraterjev v svetlih kamninah |
well0002.bmp | Vsebuje 'Doodads' svetlih kamnin - torej elemente, ki jih je mogoče postaviti za popestritev (ali zavestno kot strukturo, npr. zidove) na svetlih kamninah, vključno z vegetacijo |
well0003.bmp | Vsebuje skorjasto strukturo na svetlih kamninah |
well0004.bmp | Vsebuje temne kamnine, gorske verige na temnih kamninah in številne različice kraterjev v temnih kamninah |
well0005.bmp | Vsebuje 'Doodads' temnih kamnin - torej elemente, ki jih je mogoče postaviti za popestritev (ali zavestno kot strukturo, npr. zidove) na temnih kamninah |
well0006.bmp | Vsebuje skorjasto strukturo na temnih kamninah ter prehode med svetlimi in temnimi kamninami |
well0007.bmp | Vsebuje lavo, vključno s 4-5 kadri animacije |
well0008.bmp | Vsebuje pesek in številne različice kraterjev v pesku |
well0009.bmp | Vsebuje 'Doodads' peska - torej elemente, ki jih je mogoče postaviti za popestritev (ali zavestno kot strukturo, npr. zidove) na pesku |
well0010.bmp | Vsebuje po 48 prehodov od peska do svetlih in temnih kamnin |
well0011.bmp | Vsebuje polarne kapice mape, z temnimi kamninami kot podlago |
well0012.bmp | Vsebuje polarne kapice mape, s svetlimi kamninami kot podlago |
Priporočljivo je, da se ploščice ne upodabljajo vnaprej za shranjevanje v predpomnilnik, saj je potrebno še obdelati podatke za dan/noč ciklus – in bi nastalo zelo, zelo veliko podatkov.
Ploščice so 8bpp grafike z indeksirano paleto, vsaka z ločljivostjo 32x32 pikslov, ki so razporejene med seboj. V tako nastalem nizu ploščic pa je lahko še veliko več.
Glavni vsebinski blok je sestavljen iz dveh sekcij: head
in data
.
Naslov ploščic
Nasl. | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | znak | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 68 | 65 | 61 | 64 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | h | e | a | d | . | . | . | . | . | . | . | . | . | . | . | . |
0x0010 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Odmik | Tip podatkov | Oznaka | Razlaga |
---|---|---|---|
0x0000 | uint(32) | Magicalni bajti | |
0x0004 | uint(24) | Dolžina bloka | |
0x0007 | uint(8) | Zastave | |
0x0008 | uint(32) | Različica / Zastave? | To bi lahko bila različica datotečnega formata; v vseh datotekah, ki jih imam, je bil tukaj vrednost |
0x000c | uint(32) | Širina (horizontalna ločljivost) | Označuje, koliko široka je slikovna datoteka (v pikselih). Pri vseh vodnjakih iz Outpost 2 bo tukaj vrednost |
0x0010 | uint(32) | Višina (vertikalna ločljivost) | Navede, kako visoka je slikovna datoteka (v pikselih). Pri vseh vodnjakih iz Outpost 2 bo tukaj pričakovana vrednost |
0x0014 | uint(32) | Globina barve? | Pomembnost te vrednosti ni znana. Ker v vseh preverjenih datotekah vsebuje vrednost |
0x0018 | uint(32) | Globina barve 2? | Pomen te vrednosti je neznan. Verjetno gre za 'ciljno' barvno globino. |
Na podlagi teh podatkov sledi še datoteka palete v standardiziranem formatu RIFF. Natančna specifikacija se nahaja - saj se palete pojavljajo tudi drugje - pod Palete.
Podatki o ploščicah
Nasl. | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | znak | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 64 | 61 | 74 | 61 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | d | a | t | a | . | . | . | . | . | . | . | . | . | . | . | . |
Odmik | Tip podatkov | Oznaka | Razlaga |
---|---|---|---|
0x0000 | uint(32) | Magicalni bajti | |
0x0004 | uint(24) | Dolžina bloka | |
0x0007 | uint(8) | Zastave |
Nakonec sledijo še surove podatke o pikselih, ki so razporejeni od zgoraj levo do spodaj desno, vrstično.
Vrednost podatka pri grafiki, ki je ponavadi predstavljena kot 8bpp-bitmapi, ustreza indeksu barve v barvni paleti.
Igračna enačba verjetno *na zahtevo* nariše ploščice.
Zdi se, da je to deloma posledica cikla dneva in noči, ki pozna 32 stopenj posameznih ploščic. Pri tem se očitno od vrednosti svetlosti 'malo' odšteje. Natančne vrednosti še niso bile določene, delam na osnovi izračuna
v *= (daylight / 48) + 0.25;
s podacimi HSV pik, pri čemer je daylight vrednost od 0 do 31, v pa vrednost med 0 in 1. Dodatno je treba upoštevati, da na zemljevidu obstaja še rob 16 ploščic levo in desno (to služi za nevidno pojavljanje enot).
Dodatno se zdi, da cikel dneva in noči na vsakem ciklu igre posodobi le en stolpec zemljevida.
Pospešen cikel dneva in noči je zato videti takole:
PRT
Nasl. | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | znak | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 43 | 50 | 41 | 4c | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | C | P | A | L | . | . | . | . | . | . | . | . | . | . | . | . |
Odmik | Tip podatkov | Oznaka | Razlaga |
---|---|---|---|
0x0000 | uint(32) | Magični bajti | |
0x0004 | uint(24) | Dolžina palet | Navidezno, v nasprotju s običajnim blokovnim formatom, prikazuje število palet, ki jih najdemo v tej datoteki - ne dolžino bloka v bajtih. |
0x0007 | uint(8) | Zastave | Verjetno, kot običajno, zastavice. Vendar mi niso znane nobene zastavice; ker vsi meni znani vrednosti ustrezajo |
Za kaj točno PRT
stoji, mi ni znano; mogoče bi lahko pomenilo 'Tabela palet in virov' - saj ta datoteka, ki jo najdemo kot op2_art.prt v maps.vol, dejansko predstavlja takšno, oziroma bi to funkcijo dobro opisalo.
Ta datoteka vsebuje seznam palet, tabelo vseh uporabljenih bitmapov, vse definicije animacij in še vrsto neznanih podatkov. Sledi do sedaj uporabljeni obliki kontejnerja le ohlapno, saj vsi zapisi ne sledijo temu shemi.
Odsek CPAL
(verjetno pomeni kontejner palet) zajema le podatke o paletah, tako da navaja, koliko običajno 1052 bajtov velikih 8-bitnih palet je prisotnih.
Davčna oznaka 1052 bajtov ni obvezna, saj bi oblikovanje palet potencialno predvidevalo različne velikosti palet. Velja le za podatkovni sklop, s katerim je Outpost 2 dostavljen.
Po seznamu palet sledi takoj, brez uvodnega glave, seznam bitmapov; takoj za tem sledijo še seznami animacij.
Oba se začenjata z uint(32) (ali spet uint24+uint8 zastavice?), ki vsebuje število zapisov.
Palete
Nasl. | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | znak | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 50 | 50 | 41 | 4c | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | P | P | A | L | . | . | . | . | . | . | . | . | . | . | . | . |
Odmik | Tip podatkov | Oznaka | Razlaga |
---|---|---|---|
0x0000 | uint(32) | Magični bajti | |
0x0004 | uint(24) | Dolžina palete | Namesto običajnega blokovnega formata navaja število palet, ki jih je mogoče najti v tej datoteki - ne dolžino bloka v bajtih. |
0x0007 | uint(8) | Zastave | Verjetno, kot običajno, zastavice. Vendar mi niso znane nobene zastavice; saj vsi znani vrednosti ustrezajo |
Informacije o paletah so zelo enostavne za branje.
Sestavljene so iz naslova in podatkovnega segmenta.
Glava Palete
Nasl. | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | znak | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 68 | 65 | 61 | 64 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | h | e | a | d | . | . | . | . | . | . | . | . | . | . | . | . |
Odmik | Tip podatkov | Oznaka | Razlaga |
---|---|---|---|
0x0000 | uint(32) | Magični bajti | |
0x0004 | uint(24) | Dolžina palete | Namesto običajnega blokovnega formata navaja število palet, ki jih je mogoče najti v tej datoteki - ne dolžino bloka v bajtih. |
0x0007 | uint(8) | Zastave | Verjetno, kot običajno, zastavice. Vendar mi niso znane nobene zastavice; saj vsi znani vrednosti ustrezajo |
0x0008 | uint(32) | Različica formata palet? | Verjetno opredeljuje, kateri različici formata palet ta paleta sledi. Vse palete Outpost2 se zdi, da imajo različico |
Podatki o paletah
Nasl. | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | znak | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 64 | 61 | 74 | 61 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | d | a | t | a | . | . | . | . | . | . | . | . | . | . | . | . |
Odmik | Tip podatkov | Oznaka | Razlaga |
---|---|---|---|
0x0000 | uint(32) | Magični bajti | |
0x0004 | uint(24) | Dolžina bloka | |
0x0007 | uint(8) | Zastave |
Podatkovni odsek zajema posamezne vnose palet. Število vnosov palet se izračuna iz dolžine bloka / 4.
Posamezni vnosi imajo preprosto strukturo;
Nasl. | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | znak | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | 04 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Odmik | Tip podatkov | Oznaka | Razlaga |
---|---|---|---|
0x0000 | uint(8) | Rdeča komponenta | Označuje delež rdeče barve |
0x0001 | uint(8) | Zelena komponenta | Označuje delež zelene barve |
0x0002 | uint(8) | Modra komponenta | Označuje delež modre barve |
0x0003 | uint(8) | Neznano - Zastave? | Natančno ni jasno, kaj ta vrednost pomeni, saj je očitno v osnovi |
O paletah pa lahko še rečem, da pri paletah, ki se uporabljajo za animacije, veljajo naslednja pravila:
- Prva barva je Vedno prozorna, ne glede na to, kakšna vrednost je tam navedena.
-
Vnosi palete 1-24 se v paletah 1-8 štejejo kot barva igralca.
Kje točno prihajajo barve izven igralca 1, mi ni jasno.
Sumim, da so preostale barve hardcoded.
Bitmapi
Nasl. | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | znak | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
0x0010 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Odmik | Tip podatkov | Oznaka | Razlaga |
---|---|---|---|
0x0000 | uint(32) | Usmerjena širina | Natančno določa širino vrstic podatkov slik v bajtih - saj so te poravnane na meje 4 bajtov. Tako je hitro možno preskočiti na določeno vrstico slike. Zakaj se ta vrednost shranjuje ločeno, čeprav bi jo bilo mogoče izračunati, ni jasno. |
0x0004 | uint(32) | Odmik | Označuje premik prve vrstice v bitni sliki |
0x0008 | uint(32) | Višina | Označuje višino slike v slikovnih pikah |
0x000c | uint(32) | Širina | Navedite širino slike v pikslih |
0x0010 | uint(16) | Tip | Navede vrsto slike. Zdi se, da gre za bitno masko:
|
0x0012 | uint(16) | Paleta | Določa, katera paleta iz PRT-datoteke naj se uporablja |
Ta podatkovna struktura PRT-datoteke določa, kako so zasnovani bitmapi, ki se uporabljajo za sprite. Ti bitmapi služijo kot posamezna komponenta, iz katere se sestavi več delov za animacijski okvir sprite.
Končni slikovni podatki so shranjeni v
op2_art.BMP v igri.
Zakaj ta datoteka bitmape vsebuje (pretežno pravilno) RIFF-bitmap glavo, ni jasno. Verjetno Outpost 2 uporablja sistemske API-je za nalaganje grafike, pri čemer se ta glava začasno prevzame in ustrezna, spremenljiva polja prepišejo.
Piksli so v BMP-datoteki na položaju Offset + uint32-Offset, ki ga najdemo v BMP-datoteki na naslovu 0x000A (RIFF-bitmap-datotečni offset) - in ponovno ustrezajo vrstičnemu razporedu od zgoraj levo proti desno spodaj.
Monokromatske 1bpp grafike so lahko narisane tako, da barva 0 predstavlja popolno prosojnost, medtem ko barva 1 je polprosojna črna/siva, saj se monokromatske grafike ponavadi uporabljajo za sence vozil in zgradb v animacijah.
Tako lahko že sestavimo mnoge grafike.
Animacije
Zdaj pridemo do kraljevske discipline znotraj formatov podatkov Outpost 2:
Do animacij.
Seznami animacij se začnejo z globalno glavo, ki služi predvsem za verifikacijo podatkov. Nato sledijo konkretne definicije animacij, ki so razdeljene v 3 ravni:
-
Animacija
Animacija je najvišja instanca; predstavlja animacijo enote, stavbe ali 'delčne animacije' (kometski udar, vreme, eksplozija) v določenem izhodišču. -
Frame
Frame je posamezna slika znotraj animacije. Animacija lahko vsebuje enega ali več frame-ov. -
Subframe
Subframe je informacija, da naj se določena bitmapa pod določenimi kriteriji nariše na določeno mesto frame-a. Frame lahko vsebuje enega ali več subframe-ov.
Nato sledijo posamezne definicije animacij.
Nasl. | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | znak | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Odmik | Tip podatkov | Oznaka | Razlaga |
---|---|---|---|
0x0000 | uint(32) | Število animacij | Koliko animacijskih podatkovnih nizov je na voljo |
0x0004 | uint(32) | Število okvirjev | Koliko okvirjev naj bi bilo skupaj na voljo |
0x0008 | uint(32) | Število podokvirov | Koliko podokvotov naj bi bilo na voljo skupaj |
0x000c | uint(32) | Število neobveznih vnosov | Koliko "opcijskih vnosov" je na voljo. |
Animacija
Nasl. | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | znak | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
0x0010 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
0x0020 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Odmik | Tip podatkov | Oznaka | Razlaga |
---|---|---|---|
0x0000 | uint(32) | Neznan 1 | Neznane informacije |
0x0004 | uint(32) | Omejitveni okvir: Levo | Označuje levi začetek (v pikslih) Bounding Box. |
0x0008 | uint(32) | Omejitveni okvir: Zgoraj | Označuje zgornji začetnik (v pikselih) Bounding Box. |
0x000c | uint(32) | Meja: Širina | Navede širino (v slikovnih pikah) Bounding Box. |
0x0010 | uint(32) | Omejitveni okvir: višina | Navede višino (v pikselih) Bounding Box. |
0x0014 | uint(32) | Odmik: X | Označuje horizontalno središče animacije |
0x0018 | uint(32) | Odmik: Y | Označuje vertikalno središče animacije |
0x001c | uint(32) | Neznan 2 | Neznane informacije |
0x0020 | uint(32) | Število okvirjev | Označuje, koliko animacijskih okvirjev je v tej animaciji vsebovanih |
0x0024 | uint(32) | Število oken | Označuje, koliko oken naj se uporabi pri risanju |
Podatki zgornje plasti animacije so predvsem upravljalski podatki - Boundingbox označuje koordinate oznake okoli vozila/poslopja, kadar je to izbrano, in hkrati označuje, kateri del je mogoče klikniti.
Offset predvsem določa "ničelno točko"; točko, ki se mora seštevati ali odštevati od notranjih koordinat igre. Matematično bi lahko rekli: offset tukaj označuje koordinatno izhodišče.
Oken je, prav tako kot offset, vsak (na okno) sestavljen iz 4 uint(32) vrednosti, ki določajo območje, ki velja za posamezne subframe. Zunaj oken se, če to ni predvideno za bitmaps, ne sme risati.
Okvir
Nasl. | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | znak | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Odmik | Tip podatkov | Oznaka | Razlaga |
---|---|---|---|
0x0000 | uint(8) | Število podokvirjev in preklop za Opcionalno 1, 2 | Ta vrednost vsebuje:
|
0x0001 | uint(8) | Neznano 1 in preklopnik za opcionalno 3, 4 | Ta vrednost vsebuje:
|
0x0002 | uint(8) | Neobvezno 1 | Neznano |
0x0003 | uint(8) | Neobvezno 2 | Neznano |
0x0004 | uint(8) | Neobvezno 3 | Neznano |
0x0005 | uint(8) | Opcijsko 4 | Neznano |
Podokvir
Nasl. | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | znak | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Odmik | Tip podatkov | Oznaka | Razlaga |
---|---|---|---|
0x0000 | uint(16) | Bitmap-ID | Navedite, katera bitna slika naj se uporablja za ta podokno |
0x0002 | uint(8) | Neznan 1 | Je neznano - močno pa sumim, da gre za prioriteto upodabljanja (Z-sloj). |
0x0003 | uint(8) | Id podokvira | Navede, v katerem podoknu se nahajamo |
0x0004 | sint(16) | Odmik - Horizontalni | Navede, kje znotraj okvirja naj bo podokno postavljeno, oziroma koliko pikslov naj bo bitna slika horizontalno premaknjena. |
0x0006 | sint(16) | Offset - Vertikalno | Navaja, kje znotraj okvira naj bo podokno postavljeno, oziroma za koliko naj se bitna slika vertikalno premakne v pikselih. |
Tako lahko zdaj sestavljamo posamezne okvire, pa tudi celotne animacije, tukaj pa to ob demonstraciji bolj kompleksne animacije, animacije z indeksom 500.
Animacija 500
Animacija 500 prikazuje, kako se Plymouth transporter, naložen z običajnimi minerali, raztovarja. To je ena redkih animacij, ki uporablja funkcionalnost oken.
In tako lahko sestavimo celotno animacijo.
Žal pa obstaja še en problem z zgornjim tovorom, saj tukaj ustrezni bit v informacijah o grafični vrsti ni nastavljen.
Tukaj je še nekaj drugih, čudovito animiranih sprite-ov iz igre:
Uporabniški vmesnik
Zdaj še manjka uporabniški vmesnik igre, ki je zasnovan v brušeni kovini.
Vendar pa je tudi tukaj očitno, da Dynamix ni bilo treba ponovno izumiti kolesa; tukaj ne izkoriščajo le preprosto API-jev User32 in GDI32, ki jih zagotavlja Windows - še posebej se uporablja upravljanje virov User32.
Ti se lahko na primer izvlečejo s programi, kot je Resource Hacker, ki ga je kot freeware razvil Angus Johnson, ali - če se pod Linuxom / Mac OS izogibate uporabi Wine - s pomočjo wrestool, ki je vključen v icoutils.
Ime datoteke | Vsebina |
---|---|
Outpost2.exe | Vsebuje le ikono igre, ki prikazuje vesoljsko postajo pred New Terra |
op2shres.dll | Vsebuje grafike za kontrolne elemente, kot so obrobe, gumbi, radijske gumbe in potrditvena polja, prav tako pa tudi ozadja dialogov, spremljevalne slike za besedila zgodbenih misij in ozadje glavnega menija |
out2res.dll | Vsebuje dekoracijo oken v igri, ikone za običajno in posebno kovino, zaslon za nalaganje, grafike za dialoge ter dodatne grafike za kazalce, poleg animiranih v imeniku igre |