Outpost 2 formati datoteka · bei.pm
Format datoteka opisani na ovoj stranici temelje se na tehničkoj analizi intelektualnog vlasništva Dynamix, Inc. i Sierra Entertainment.
Intelektualno vlasništvo danas je dio Activision Publishing, Inc. / Activision Blizzard, Inc. grupe i trenutno je u vlasništvu Microsoft Corp..
Informacije su prikupljene putem obrnute inženjering i analize podataka u svrhu arhiviranja i interoperabilnosti s povijesnim podacima.
Nisu korištene nikakve vlasničke ili povjerljive specifikacije.
Igra se trenutno može kupiti kao preuzimanje na gog.com.
Sljedeća serija članaka dokumentira moja saznanja o formatima podataka u realnom vremenu strategijskoj igri "Outpost 2: Divided Destiny", koja je 1997. godine objavljena od strane Siere i razvijena od strane Dynamixa.
Od 01. studenog 2015. do 14. studenog 2015. godine, uglavnom sam se bavio analizom podataka iz igre - i što se s njima može učiniti.
Prema informacijama koje sam do sada uspio prikupiti, Dynamix - kao i mnoga komercijalna poduzeća - nije razvio neke formate podataka posebno za Outpost 2, već ih je također koristio u drugim razvojnim projektima, poput serije Mechwarrior (izmijenjeno).
Neovisno o tome, može se također primijetiti da inovativnost formata podataka praktički ima svoja ograničenja i često se oslanja na dugo postojeće koncepte iz uobičajenih formata poput JFIF-a i RIFF-a.
Za interpretaciju tablica i formata podataka dostupne su dodatne informacije na Što je što?.
Ovdje navedeni podaci općenito se razumiju kao Little Endian.
Na kraju se može reći da je inverzno inženjerstvo bilo vrlo zabavno, iako nije potpuno.
Naravno, također bih preporučio igranje igre samostalno, jer nudi zanimljive mehanike igre.
Uvod
Podaci koje koristi Outpost 2 imaju strukturu koja podsjeća na JFIF / PNG - pojedini podaci blokovi uvijek imaju 8-byte zaglavlje. Zato ću izostaviti dokumentiranje pojedinačnih zaglavlja na odgovarajućim specifičnim mjestima i dokumentirati samo odstupanja.
Format je uvijek sljedeći; stvarni korisni podaci su tada u njega ugrađeni:
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | znak | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Pomak | Tip podataka | Naziv | Objašnjenje |
---|---|---|---|
0x0000 | uint(32) | Magični bajtovi | Sadrži informacije o tome što se može očekivati u sljedećem podatkovnom bloku. Poznate vrijednosti:
|
0x0004 | uint(24) | Dužina bloka | Obuhvaća informaciju o veličini (u bajtovima) sljedećeg podatkovnog bloka. Pri tome se misli na čiste korisničke podatke - 8 bajtova zaglavlja nije uključeno. |
0x0007 | uint(8) | Zastave? | Nije poznato čemu točno služi ova blok. U volumima je ova vrijednost često 0x80, dok je u drugim datotekama često 0x00. To sugerira da se radi o skupu zastavica. |
Volumeni
Volumeni su kontejneri podataka za igru, slični arhivskom formatu kao što je Tarball. Bar u Outpost 2, format poznaje samo datoteke - nema mapa. Vjerojatno bi se mape mogle simulirati odgovarajućim imenima datoteka.
Volume se sastoji od Volume zaglavlja kao i od nekoliko Volume blokova koji odgovaraju konkretnim datotekama.
"Volumes" su datoteke s ekstenzijom 'vol'
u direktoriju igre.
Adr | 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 | . | . | . | . | . | . | . | . | . | . | . | . |
Pomak | Tip podataka | Naziv | Objašnjenje |
---|---|---|---|
0x0000 | uint(32) | Magični bajtovi | |
0x0004 | uint(24) | Duljina bloka | |
0x0007 | uint(8) | Zastave |
Naslov volumena
Adr | 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 | . | . | . | . | . | . | . | . | . | . | . | . |
Pomak | Tip podataka | Naziv | Objašnjenje |
---|---|---|---|
0x0000 | uint(32) | Magični bajtovi | |
0x0004 | uint(24) | Duljina bloka | |
0x0007 | uint(8) | Zastave |
Volumenski zaglavlje ne sadrži nikakve korisničke podatke.
Slijži samo kao kontejner.
Prvi podaci u volumenskom zaglavlju trebali bi biti volumenski stringovi; nakon toga slijede informacije o volumenu.
Volumenski nizovi
Adr | 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 | . | . | . | . | . | . | . | . | . | . | . | . |
Pomak | Tip podataka | Naziv | Objašnjenje |
---|---|---|---|
0x0000 | uint(32) | Magični bajtovi | |
0x0004 | uint(24) | Duljina bloka | |
0x0007 | uint(8) | Zastave |
Adr | 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 | . | . | . | . | . | . | . | . | . | . | . | . |
Pomak | Tip podataka | Naziv | Objašnjenje |
---|---|---|---|
0x0000 | uint(32) | Magični bajtovi | |
0x0004 | uint(24) | Duljina bloka | |
0x0007 | uint(8) | Zastave | |
0x0008 | uint(32) | Duljina tereta | Navodi koliko je bajtova od sljedećih podataka zapravo korisnih podataka. Preostali podaci s popisa volumena stringova očigledno se smatraju garbage. U datotekama s kasnijim datumima, ti 'preostali podaci' su 0x00, što bi moglo ukazivati na nedostatke u alatnom lancu tijekom razvoja igre, odnosno da se tek vrlo kasno jedan od developera pobrinuo za pravilnu inicijalizaciju bafera, budući da nema utjecaja na igru je li podaci inicijalizirani ili ne. |
0x000c | uint(8)[] | Popis imena datoteka | Ovo je lista imena datoteka terminirana s 0 bajtova, koja - barem u ovom dijelu podataka - očekuje samo ASCII znakove. Nije potrebno detaljnije analizirati ovaj blok podataka prilikom parsiranja, budući da se u informacijama o volumenu izravno referenciraju ofseti imena datoteka. |
Volume Strings predstavljaju popis imena datoteka koje se nalaze unutar volumena.
Informacije o volumenu
Adr | 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 | . | . | . | . | . | . | . | . | . | . | . | . |
Pomak | Tip podataka | Naziv | Objašnjenje |
---|---|---|---|
0x0000 | uint(32) | Magični bajtovi | |
0x0004 | uint(24) | Duljina bloka | |
0x0007 | uint(8) | Zastave |
Informacije o volumenu sadrže detaljnije informacije o datotekama. To je na određeni način vrsta FAT unosa u direktorij (FAT = File Allocation Table)
Broj datoteka dobiva se dijeljenjem veličine bloka sa duljinom unosa u direktorij - 14 bajtova.
pojedinačni unosi u direktoriju imaju sljedeću strukturu:
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | znak | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Pomak | Tip podataka | Naziv | Objašnjenje |
---|---|---|---|
0x0000 | uint(32) | Offset imena datoteka | Navodi na kojem offsetu (!) unutar popisa imena datoteka (Volume-Strings) se nalazi naziv datoteke. Odnosi se na početak bloka korisničkih podataka. |
0x0004 | uint(32) | Datotečni offset | Navodi na kojem se offsetu unutar cijele volumenske datoteke nalazi datoteka. |
0x0008 | uint(32) | Veličina datoteke | Navodi koliko je velika datoteka u bajtovima. |
0x000c | uint(16) | Zastave? | Izgleda da pruža dodatne informacije o kodiranju datoteka.
|
Volumenski blok
Adr | 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 | . | . | . | . | . | . | . | . | . | . | . | . |
Pomak | Tip podataka | Naziv | Objašnjenje |
---|---|---|---|
0x0000 | uint(32) | Magični bajtovi | |
0x0004 | uint(24) | Duljina bloka | |
0x0007 | uint(8) | Zastave |
Volume blok je kontejner koji sadrži datoteke. U njemu se redundantno, zbog formata bloka, ponavlja veličina datoteke, a zatim odmah slijede korisni podaci.
Kamenčići
Adr | 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 | . | . | . | . | . | . | . | . | . | . | . | . |
Pomak | Tip podataka | Naziv | Objašnjenje |
---|---|---|---|
0x0000 | uint(32) | Magijski bajtovi | |
0x0004 | uint(24) | Duljina bloka | |
0x0007 | uint(8) | Zastave |
Tiles su specifičan Bitmap grafički format za Outpost-2.
Protežu se kroz 13 tileseta, koji se nazivaju "wells"
(well0000.bmp
do well0012.bmp
),
a nalaze se unutar volumena maps.vol.
Tileseti / Wells sadrže sljedeće:
Ime datoteke | Sadržaj |
---|---|
well0000.bmp | Grafika veličine 32x32px, plava - idealna za testiranje funkcionira li vlastiti loader za slike |
well0001.bmp | Sadrži svijetlu stijenu, planinske lance na svijetloj stijeni i bezbroj varijanti kratera na svijetloj stijeni |
well0002.bmp | Sadrži 'Doodads' od svijetle stijene - dakle, elemente koji se mogu postaviti za razbibrigu (ili namjerno kao struktura, poput zidova) na svijetloj stijeni, uključujući i vegetaciju |
well0003.bmp | Sadrži strukturu nalik kori na svijetloj stijeni |
well0004.bmp | Sadrži tamnu stijenu, planinske lance na tamnoj stijeni i bezbroj varijanti kratera na tamnoj stijeni |
well0005.bmp | Sadrži 'Doodads' od tamne stijene - dakle, elemente koji se mogu postaviti za razbibrigu (ili namjerno kao struktura, poput zidova) na tamnoj stijeni |
well0006.bmp | Sadrži strukturu nalik kori na tamnoj stijeni, kao i prijelaze između svijetle i tamne stijene |
well0007.bmp | Sadrži lavu uključujući po 4-5 okvira animacije iste |
well0008.bmp | Sadrži pijesak i bezbroj varijanti kratera u pijesku |
well0009.bmp | Sadrži 'Doodads' od pijeska - dakle, elemente koji se mogu postaviti za razbibrigu (ili namjerno kao struktura, poput zidova) na pijesku |
well0010.bmp | Sadrži po 48 prijelaza s pijeska na svijetlu i tamnu stijenu |
well0011.bmp | Sadrži polarne kapice mape, s tamnom stijenom kao podlogom |
well0012.bmp | Sadrži polarne kapice mape, s svijetlom stijenom kao podlogom |
Preporučuje se da se pločice ne renderiraju unaprijed kako bi se izbjeglo njihovo keširanje, jer podaci za ciklus dana/noći još uvijek trebaju biti obrađeni - a nastalo bi jako puno podataka.
Pločice su 8bpp grafike s indeksiranom paletom, svaka rezolucije 32x32 piksela, koje su raspoređene jedna ispod druge. U tako stvorenom setu pločica može biti znatno više
Glavni kontejner sastoji se od 2 sekcije: head
i data
.
Naslov pločica
Adr | 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 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Pomak | Tip podataka | Naziv | Objašnjenje |
---|---|---|---|
0x0000 | uint(32) | Magijski bajtovi | |
0x0004 | uint(24) | Duljina bloka | |
0x0007 | uint(8) | Zastave | |
0x0008 | uint(32) | Verzija / Zastave? | Ovo bi mogla biti verzija datotečnog formata; u svim datotekama koje imam ovdje je bio zapis |
0x000c | uint(32) | Širina (Horizontalna rezolucija) | Navodi koliko je široka slika (u pikselima). Za sve bunare iz Outpost 2 ovdje se očekuje vrijednost |
0x0010 | uint(32) | Visina (Vertikalna razlučivost) | Navodi koliko je visoka slika (u pikselima). Za sve bunare iz Outpost 2 ovdje će se očekivati vrijednost |
0x0014 | uint(32) | Dubina boje? | Značenje ove vrijednosti je nepoznato. Budući da u svim provjerenim datotekama ima vrijednost |
0x0018 | uint(32) | Dubina boje 2? | Značenje ove vrijednosti je nepoznato. Možda se radi o 'ciljanoj' dubini boje. |
Nakon ovih podataka slijedi još jedan datoteka palete u standardiziranom RIFF formatu. Točna specifikacija može se pronaći - budući da se palete pojavljuju i drugdje - na Palete.
Podaci o pločicama
Adr | 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 | . | . | . | . | . | . | . | . | . | . | . | . |
Pomak | Tip podataka | Naziv | Objašnjenje |
---|---|---|---|
0x0000 | uint(32) | Magijski bajtovi | |
0x0004 | uint(24) | Duljina bloka | |
0x0007 | uint(8) | Zastave |
Nakon toga slijede sirovi podaci o pikselima, redom s lijeva prema desnoj donjoj strani.
Vrijednost podataka kod grafika koje su obično u formatu 8bpp-Bitmaps odgovara indeksu boje u paleti boja.
Igračka Engina vjerojatno *na zahtjev* crta pločice.
To je, između ostalog, posljedica ciklusa dana i noći, koji poznaje 32 razine pojedinačnih pločica. Čini se da se od vrijednosti svjetlosti 'malo' oduzima. Točne vrijednosti još nisu utvrđene, radim na osnovi izračuna
v *= (daylight / 48) + 0.25;
s HSV podacima piksela, pri čemu je daylight vrijednost od 0-31, a v vrijednost između 0-1. Dodatno, treba uzeti u obzir da na karti postoji još rub od 16 pločica lijevo i desno (koji služi za nevidljivo pojavljivanje jedinica).
Dodatno, čini se da ciklus dana i noći po ciklusu igre ažurira samo jedan stupac karte.
Ubrzani ciklus dana i noći izgleda ovako:
PRT
Adr | 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 | . | . | . | . | . | . | . | . | . | . | . | . |
Pomak | Tip podataka | Naziv | Objašnjenje |
---|---|---|---|
0x0000 | uint(32) | Magijski bajtovi | |
0x0004 | uint(24) | Duljina paleta | U odnosu na normalni blok format, navodi broj paleta koje se mogu pronaći u ovoj datoteci - a ne duljinu bloka u bajtovima. |
0x0007 | uint(8) | Zastave | Vjerojatno, kao i obično, zastavice. Međutim, nisu mi poznate nikakve zastavice; budući da svi meni poznati vrijednosti odgovaraju |
Za što točno PRT
stoji, nije mi poznato; moglo bi se, na primjer, raditi o 'Paleta i Resursna Tablica' - budući da je ova datoteka - koja se nalazi kao op2_art.prt u maps.vol - upravo takva, odnosno to bi dobro opisalo njezinu funkciju.
Ova datoteka sadrži popis paleta, tablicu svih korištenih bitmapa, sve definicije animacija i još niz nepoznatih podataka. Pridržava se dosadašnjeg formata kontejnera, ali ne svi zapisi slijede ovu shemu.
CPAL
sekcija (vjerojatno označava kontejner paleta) obuhvaća isključivo podatke o paletama, navodeći koliko ima uobičajenih 8-bitnih paleta, koje obično imaju 1052 bajta.
Izjava o 1052 bajta nije obvezujuća, budući da format paleta potencijalno može imati različite veličine paleta. Ona se odnosi samo na skup podataka koji se isporučuje s Outpost 2.
Odmah nakon popisa paleta, bez uvodnog zaglavlja, slijedi popis bitmapa; a odmah nakon toga slijede popisi animacija.
Oba će biti započeta s uint(32) (ili ponovno uint24+uint8 zastavice?), koji sadrži broj zapisa.
Palete
Adr | 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 | . | . | . | . | . | . | . | . | . | . | . | . |
Pomak | Tip podataka | Naziv | Objašnjenje |
---|---|---|---|
0x0000 | uint(32) | Magični bajtovi | |
0x0004 | uint(24) | Duljina palete | U suprotnosti s normalnim blok formatom, navodi broj paleta koji se može pronaći u ovoj datoteci - ne duljinu bloka u bajtovima. |
0x0007 | uint(8) | Zastave | Vjerojatno, kao i obično, zastavice. Međutim, nisam upoznat s nijednom zastavicama; budući da su svi poznati vrijednosti |
Informacije o paletama su veoma jednostavne za čitanje.
Sastoje se od zaglavlja i segmenta podataka.
Glava Paleta
Adr | 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 | . | . | . | . | . | . | . | . | . | . | . | . |
Pomak | Tip podataka | Naziv | Objašnjenje |
---|---|---|---|
0x0000 | uint(32) | Magični bajtovi | |
0x0004 | uint(24) | Duljina palete | U suprotnosti s normalnim blok formatom, navodi broj paleta koji se može pronaći u ovoj datoteci - ne duljinu bloka u bajtovima. |
0x0007 | uint(8) | Zastave | Vjerojatno, kao i obično, zastavice. Međutim, nisam upoznat s nijednom zastavicama; budući da su svi poznati vrijednosti |
0x0008 | uint(32) | Verzija formata paleta? | Vjerojatno definira koja verzija formata paleta slijedi paletu. Sve Outpost2 palete čini se da imaju verziju |
Podaci o paletama
Adr | 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 | . | . | . | . | . | . | . | . | . | . | . | . |
Pomak | Tip podataka | Naziv | Objašnjenje |
---|---|---|---|
0x0000 | uint(32) | Magični bajtovi | |
0x0004 | uint(24) | Duljina bloka | |
0x0007 | uint(8) | Zastave |
Odjeljak s podacima uključuje pojedinačne unose paleta. Broj unosa paleta dobiva se dijeljenjem duljine bloka s 4.
Pojedinačni unosi imaju sljedeću, jednostavnu strukturu;
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | znak | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | 04 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Pomak | Tip podataka | Naziv | Objašnjenje |
---|---|---|---|
0x0000 | uint(8) | Crvena komponenta | Navodi udio crvene boje |
0x0001 | uint(8) | Zelena komponenta | Navodi udio zelene boje |
0x0002 | uint(8) | Plava komponenta | Navodi plavu komponentu boje |
0x0003 | uint(8) | Nepoznato - Zastave? | Nije jasno što ova vrijednost znači, budući da se očigledno temelji na |
O paletama se može reći samo to da za palete koje se koriste za animacije vrijede sljedeća pravila:
- Prva boja je UVIJEK prozirna, bez obzira na vrijednost koja je navedena.
-
Unosi paleta 1-24 smatraju se igračkim bojama u paletama 1-8.
Odakle ostale boje, osim boje igrača 1, nije mi jasno.
Pretpostavljam da su preostale boje hardkodirane.
Bitmape
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | znak | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
0x0010 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Pomak | Tip podataka | Naziv | Objašnjenje |
---|---|---|---|
0x0000 | uint(32) | Usmjerena širina | Navodi širinu redova podataka piksela u bajtovima - jer su oni usklađeni s granicama od 4 bajta. Na taj način je brzo moguće skočiti na određeni redak slike. Zašto se ova vrijednost pohranjuje odvojeno, iako bi se mogla izračunati, nije jasno. |
0x0004 | uint(32) | Pomak | Navodi pomak prve linije u bitmapi |
0x0008 | uint(32) | Visina | Navodi visinu slike u pikselima |
0x000c | uint(32) | Širina | Navodi širinu slike u pikselima |
0x0010 | uint(16) | Tip | Navodi vrstu slike. Ovdje se čini da se radi o bitmaski:
|
0x0012 | uint(16) | Paleta | Definira koja paleta iz PRT datoteke treba biti korištena |
Ova struktura podataka PRT datoteke pokazuje kako su izgrađene bitmape korištene za spriteove. Te bitmape služe kao pojedinačni sastavni dijelovi, od kojih se nekoliko sastavlja u animacijski okvir spritea.
Konkretniji podaci o slikama nalaze se u
op2_art.BMP u mapi igre.
Zašto ova bitmap datoteka ima (pretežno točan) RIFF bitmap zaglavlje,
nije jasno. Vjerojatno Outpost 2 koristi sistemske API-e za učitavanje grafike,
time privremeno preuzimajući ovo zaglavlje i prepisujući odgovarajuća, varijabilna polja.
Pikselski podaci nalaze se u BMP datoteci na poziciji Offset + uint32-offset, koji se može pronaći u BMP datoteci na adresi 0x000A (RIFF bitmap podaci offset), i ponovno odgovaraju redoslijedu od vrha lijevo prema dolje desno.
Monokromatske 1bpp grafike mogu se crtati tako da boja 0 predstavlja potpunu prozirnost, dok boja 1 ima poluprozirnu crnu/sivu, budući da se monokromatske grafike uglavnom koriste za sjene vozila i zgrada u animacijama.
Na taj način već se može sastaviti mnogo grafika.
Animacije
Sada dolazimo do kraljevske discipline unutar Outpost 2 formata podataka:
Animacija.
Popisi animacija započinju globalnim zaglavljem, koje prvenstveno služi za verifikaciju podataka. Nakon toga slijede konkretne definicije animacija, koje su podijeljene u 3 razine:
-
Animacija
Animacija je najviša instanca; predstavlja animaciju jedinice, zgrade ili 'čestice-animacije' (udar kometa, vrijeme, eksplozija) u određenoj početnoj situaciji. -
Okvir
Okvir je pojedinačna slika unutar animacije. Animacija može sadržavati jedan ili više okvira. -
Podokvir
Podokvir je informacija o tome da se određena bitmapa pod određenim kriterijima treba nacrtati na određenu poziciju okvira. Okvir može sadržavati jedan ili više podokvira.
Nakon toga slijede konkretne definicije animacija.
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | znak | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Pomak | Tip podataka | Naziv | Objašnjenje |
---|---|---|---|
0x0000 | uint(32) | Broj animacija | Koliko animacijskih podataka postoji |
0x0004 | uint(32) | Broj okvira | Koliko ukupno okvira bi trebalo biti prisutno |
0x0008 | uint(32) | Broj podokvira | Koliko ukupno subframe-ova bi trebalo biti prisutno |
0x000c | uint(32) | Broj opcionalnih unosa | Koliko "opcionalnih unosa" postoji. |
Animacija
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | znak | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
0x0010 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
0x0020 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Pomak | Tip podataka | Naziv | Objašnjenje |
---|---|---|---|
0x0000 | uint(32) | Nepoznato 1 | Nepoznate informacije |
0x0004 | uint(32) | Okvir za ograničavanje: Lijevo | Određuje lijevi početak (u pikselima) Bounding Box. |
0x0008 | uint(32) | Bounding Box: Gore | Određuje gornju granicu (u pikselima) Bounding Box. |
0x000c | uint(32) | Okvir: Širina | Određuje širinu (u pikselima) okvira. |
0x0010 | uint(32) | Okvir za ograničavanje: Visina | Navodi visinu (u pikselima) Bounding Box. |
0x0014 | uint(32) | Pomak: X | Postavlja horizontalnu središnju točku animacije |
0x0018 | uint(32) | Offset: Y | Navodi vertikalnu središnju točku animacije |
0x001c | uint(32) | Nepoznato 2 | Nepoznata informacija |
0x0020 | uint(32) | Broj okvira | Navodi koliko animacijskih okvira sadrži ova animacija |
0x0024 | uint(32) | Broj prozora | Navodi koliko prozora treba primijeniti prilikom crtanja |
Podaci gornjeg sloja, animacije, prvenstveno su upravni podaci - Boundingbox označava koordinate oznake oko vozila/zgrade, kada je ona odabrana, i također označava koji dio treba biti klikabilan.
Offset prvenstveno određuje "nulte točke"; točka koja se mora izračunati ili oduzeti od unutarnjih koordinata igre. Moglo bi se reći i matematički: offset ovdje označava izvor koordinata.
Windows se, kao i offset, sastoje od 4 uint(32) vrijednosti po prozoru, koje označavaju područje koje se može koristiti za pojedinačne subframeove. Izvan prozora ne smije se, osim ako nije predviđeno za bitmapu, crtati.
Okvir
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | znak | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Pomak | Tip podataka | Naziv | Objašnjenje |
---|---|---|---|
0x0000 | uint(8) | Broj podokvira i prekidač za Opcionalno 1, 2 | Ova vrijednost sadrži:
|
0x0001 | uint(8) | Nepoznato 1 i prekidač za Opcionalno 3, 4 | Ova vrijednost sadrži:
|
0x0002 | uint(8) | Opcionalno 1 | Nepoznat |
0x0003 | uint(8) | Opcionalno 2 | Nepoznat |
0x0004 | uint(8) | Opcionalno 3 | Nepoznat |
0x0005 | uint(8) | Opcionalno 4 | Nepoznat |
Subokvir
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | znak | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Pomak | Tip podataka | Naziv | Objašnjenje |
---|---|---|---|
0x0000 | uint(16) | Bitmap-ID | Navodi koja bitmapa treba biti korištena za ovaj podokvir |
0x0002 | uint(8) | Nepoznato 1 | Nije poznato - međutim, snažno sumnjam da se ovdje radi o prioritetu renderiranja (Z-sloj). |
0x0003 | uint(8) | Id podokvira | Navodi u kojem se podokviru nalazimo |
0x0004 | sint(16) | Offset - Horizontalni | Navodi gdje unutar okvira treba smjestiti podokvir, odnosno za koliko piksela treba horizontalno pomaknuti bitmapu |
0x0006 | sint(16) | Offset - Vertikalno | Navodi gdje unutar okvira treba postaviti podokvir, odnosno za koliko piksela treba vertikalno pomaknuti bitmapu |
Tako možemo sada sastaviti pojedinačne okvire, kao i kompletne animacije, ovdje jednom primjerom na složenijoj animaciji, animaciji s indeksom 500, demonstrirano
Animacija 500
Animacija 500 prikazuje kako se Plymouth transporter, koji je opterećen običnim željezom, istovara. Ovo je jedna od rijetkih animacija koja koristi funkcionalnost prozora.
Tako se može sastaviti cijela animacija.
Nažalost, još uvijek postoji problem s gornjim otvorom za utovar, jer ovdje odgovarajući bit u informacijama o tipu grafike nije postavljen.
Evo još nekoliko prekrasno animiranih spriteova iz igre:
Korisničko sučelje
Sada nedostaje još korisničko sučelje igre, koje je u brušenom metalu stilu.
No, i ovdje je jasno da Dynamix nije morao izmišljati toplu vodu; ovdje se ne koriste samo jednostavno API-ji User32 i GDI32 koje pruža Windows - posebno se koristi i upravljanje resursima iz User32.
Ti se resursi mogu, na primjer, izvući pomoću programa kao što je Resource Hacker, koji je razvio Angus Johnson kao freeware, ili - ako se ne želi koristiti Wine na Linuxu / Mac OS-u - uz pomoć wrestool koji dolazi s icoutils.
Ime datoteke | Sadržaj |
---|---|
Outpost2.exe | Sadrži samo ikonu igre koja prikazuje svemirsku stanicu ispred New Terra |
op2shres.dll | Sadrži grafike za kontrolne elemente kao što su okviri, dugmadi, radio dugmadi i potvrdnih okvira, kao i pozadine dijaloga, prateće slike za tekstove misija i pozadinsku grafiku glavnog izbornika |
out2res.dll | Sadrži ukrase prozora unutar igre, ikone za obični i specijalni metal, ekran za učitavanje, grafike za dijaloge, kao i dodatne grafike kursora, uz animirane u mapi igre |