Outpost 2 failu formāti · bei.pm
Šajā lapā aprakstītie failu formāti balstās uz tehnisko analīzi par intelektuālo īpašumu no Dynamix, Inc. un Sierra Entertainment.
Intelektuālais īpašums šobrīd ir daļa no Activision Publishing, Inc. / Activision Blizzard, Inc. mases un pašreiz pieder Microsoft Corp..
Informācija tika apkopota, izmantojot Reverse Engineering un Datu analīzi, lai arhivētu un nodrošinātu savietojamību ar vēsturiskajiem datiem.
Nekādas patentētas vai konfidenciālas specifikācijas netika izmantotas.
Spēli pašlaik var iegādāties kā lejupielādi gog.com.
Šī rakstu sērija dokumentē manas atziņas par datu formātiem reāllaika stratēģijas spēlē "Outpost 2: Divided Destiny", kuru 1997. gadā izdeva Sierra un izstrādāja Dynamix.
Es galvenokārt analizēju spēles datus un to izmantošanu no 2015. gada 1. novembra līdz 2015. gada 14. novembrim.
Pēc līdz šim iegūtajām informācijām, Dynamix - kā daudzi komerciālie uzņēmumi - dažus datu formātus nav speciāli izstrādājuši Outpost 2, bet arī izmantojuši citos projektos, piemēram, Mechwarrior sērijā (pārveidoti).
Tajā pašā laikā ir jāatzīmē, ka datu formātu inovācijas spēks ir diezgan ierobežots un bieži vien balstās uz ilgstošām koncepcijām no parastajiem formātiem, piemēram, JFIF un RIFF.
Datu un tabulu interpretācijai ir pieejama papildus informācija šeit: Kas ir kas?.
Šeit norādītie dati vispārīgi tiek saprasti kā Little Endian.
Noslēgumā varu teikt, ka reverse engineering bija ļoti aizraujoša nodarbe, lai gan tā nav pilnīga.
Dabīgi, es arī ieteiktu spēlēt pašu spēli, jo tā piedāvā interesantas spēlēšanas mehānikas.
Ievads
Outpost 2 izmantotie datu formāti ir līdzīgi JFIF / PNG struktūrai - katram datu blokam ir 8 baitus liels virsraksts. Tādēļ es izlaidu katra virsraksta dokumentēšanu atbilstošajās specifiskajās vietās un dokumentēšu tikai novirzes.
Formāts vienmēr ir šāds; faktiskie lietotnes dati ir tajā iekļauti:
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | rakstz. | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Novirze | Datu tips | Nosaukums | Skaidrojums |
---|---|---|---|
0x0000 | uint(32) | Burvju baiti | Satur informāciju par to, ko gaidīt nākamajā datu blokā. Zināmās vērtības:
|
0x0004 | uint(24) | Bloka garums | Saturs informāciju par to, cik liels (baitos) ir nākamais datu bloks. Šeit tiek domāti tikai tīrie lietotāju dati - 8 galvenes baitus tajā nav iekļauti. |
0x0007 | uint(8) | Karogi? | Nav zināms, kam tieši šis bloks kalpo. Apjomos šī vērtība bieži ir 0x80, citās failos bieži ir 0x00. Tas liecina, ka tas varētu būt karoga kopums. |
Apjomi
Apjomi ir datu konteiners spēlei, līdzīgs arhīva formātam, piemēram, Tarball. Vismaz spēlē Outpost 2 šajā formātā ir tikai faili - nav mapju. Iespējams, ka tās varētu simulēt, izmantojot atbilstošus failu nosaukumus.
Apjoms sastāv no apjoma galvenes un vairākiem apjoma blokiem, kas atbilst konkrētajiem failiem.
"Apjomi" ir faili ar paplašinājumu 'vol'
spēles direktorijā.
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | rakstz. | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 56 | 4f | 4c | 20 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | V | O | L | . | . | . | . | . | . | . | . | . | . | . | . |
Novirze | Datu tips | Nosaukums | Skaidrojums |
---|---|---|---|
0x0000 | uint(32) | Burvju baiti | |
0x0004 | uint(24) | Bloka garums | |
0x0007 | uint(8) | Karogi |
Apjoma virsraksts
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | rakstz. | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 76 | 6f | 6c | 68 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | v | o | l | h | . | . | . | . | . | . | . | . | . | . | . | . |
Novirze | Datu tips | Nosaukums | Skaidrojums |
---|---|---|---|
0x0000 | uint(32) | Burvju baiti | |
0x0004 | uint(24) | Bloka garums | |
0x0007 | uint(8) | Karogi |
Apjoma galvene pati par sevi nesatur nekādas lietotāja datus.
T tā kalpo tikai kā konteineris.
Pirmajā datumā apjoma galvenē vajadzētu atrasties apjoma virknes; pēc tam seko apjoma informācija.
Apjoma virknēs
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | rakstz. | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 76 | 6f | 6c | 69 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | v | o | l | i | . | . | . | . | . | . | . | . | . | . | . | . |
Novirze | Datu tips | Nosaukums | Skaidrojums |
---|---|---|---|
0x0000 | uint(32) | Burvju baiti | |
0x0004 | uint(24) | Bloka garums | |
0x0007 | uint(8) | Karogi |
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | rakstz. | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 76 | 6f | 6c | 73 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | v | o | l | s | . | . | . | . | . | . | . | . | . | . | . | . |
Novirze | Datu tips | Nosaukums | Skaidrojums |
---|---|---|---|
0x0000 | uint(32) | Burvju baiti | |
0x0004 | uint(24) | Bloka garums | |
0x0007 | uint(8) | Karogi | |
0x0008 | uint(32) | Payload garums | Norāda, cik daudz baitus no šiem datiem patiesībā ir lietderīgi dati. Atlikušos, palikušos datus no Volume-Strings saraksta acīmredzot jāuzskata par atkritumiem. Failos ar vēlākām datumiem šie 'palikušie dati' ir 0x00, kas varētu liecināt par nepilnībām rīku komplektā spēles izstrādes laikā, proti, ka izstrādātājs par pareizu buferu inicializāciju rūpējās tikai ļoti vēlu, jo tam nav ietekmes uz spēli, vai dati ir inicializēti vai nav. |
0x000c | uint(8)[] | Failu nosaukumu saraksts | Šeit ir runa par 0-baitu terminētu failu nosaukumu sarakstu, kas - vismaz šajā datu sastāvdaļā - sagaida tikai ASCII simbolus. Nav nepieciešams, analizējot datus, šo datu bloku detalizētāk izvērtēt, jo apjoma informācijā jau tieši tiek norādītas failu nosaukumu ofseti. |
Apjoma virknes ir failu nosaukumu saraksts, kas iekļauti apjomā.
Apjoma informācija
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | rakstz. | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 76 | 6f | 6c | 69 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | v | o | l | i | . | . | . | . | . | . | . | . | . | . | . | . |
Novirze | Datu tips | Nosaukums | Skaidrojums |
---|---|---|---|
0x0000 | uint(32) | Burvju baiti | |
0x0004 | uint(24) | Bloka garums | |
0x0007 | uint(8) | Karogi |
Apjoma informācija ietver sīkākas ziņas par failiem. Tas ir zināmā mērā līdzīgs FAT direktorija ierakstam (FAT = Failu sadales tabula).
Failu skaits ir iegūts, dalot bloka izmēru ar direktorija ierakstu garumu - 14 baitiem.
Katram direktorija ierakstam ir šāda struktūra:
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | rakstz. | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Novirze | Datu tips | Nosaukums | Skaidrojums |
---|---|---|---|
0x0000 | uint(32) | Datnes nosaukuma nobīde | Norāda, kurā pozīcijā (!) faila nosaukumu sarakstā (apjoma virknes) atrodas faila nosaukums. Tas attiecas uz datu blokā esošo saturu sākumu. |
0x0004 | uint(32) | Faila nobīde | Norāda, kurā ofsetā visā apjoma failā atrodas fails. |
0x0008 | uint(32) | Faila izmērs | Norāda, cik liela ir faila izmērs baitos. |
0x000c | uint(16) | Karogi? | Acīmredzot sniedz papildu informāciju par failu kodējumu.
|
Tilpuma bloks
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | rakstz. | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 56 | 42 | 4c | 48 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | V | B | L | H | . | . | . | . | . | . | . | . | . | . | . | . |
Novirze | Datu tips | Nosaukums | Skaidrojums |
---|---|---|---|
0x0000 | uint(32) | Burvju baiti | |
0x0004 | uint(24) | Bloka garums | |
0x0007 | uint(8) | Karogi |
Apjoma bloks ir konteineris, kurš satur failus. Tajā vēlreiz - blokformāta dēļ - ir redundanti norādīta faila lielums, un pēc tam seko tieši lietotājdati.
Flīzes
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | rakstz. | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 50 | 42 | 4d | 50 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | P | B | M | P | . | . | . | . | . | . | . | . | . | . | . | . |
Novirze | Datu tips | Nosaukums | Skaidrojums |
---|---|---|---|
0x0000 | uint(32) | Burvju baiti | |
0x0004 | uint(24) | Bloka garums | |
0x0007 | uint(8) | Karogi |
Tiles ir Outpost-2 specifisks
bitmap grafikas formāts. Tie aptver 13 Tileset,
"wells" sauktas (well0000.bmp
līdz well0012.bmp
),
kuri atrodas tilpumā maps.vol.
Tileseti / Wells satur sekojošo:
Faila nosaukums | Saturs |
---|---|
well0000.bmp | 32x32px liela zila grafika - ideāli piemērota, lai pārbaudītu, vai jūsu attēlu ielādētājs darbojas |
well0001.bmp | Izsistā gaiša akmens, kalnu grēdas uz gaiša akmens un neskaitāmas krāteru variācijas gaišā akmens |
well0002.bmp | Izsistā gaiša akmens 'Doodads' - elementi, kurus var novietot uz gaiša akmens, lai tos atbrīvotu (vai apzināti kā struktūru, piemēram, sienas), tostarp veģetācija |
well0003.bmp | Izsistā kraukšķīga struktūra uz gaiša akmens |
well0004.bmp | Izsistā tumša akmens, kalnu grēdas uz tumša akmens un neskaitāmas krāteru variācijas tumšā akmens |
well0005.bmp | Izsistā tumša akmens 'Doodads' - elementi, kurus var novietot uz tumša akmens, lai tos atbrīvotu (vai apzināti kā struktūru, piemēram, sienas) |
well0006.bmp | Izsistā kraukšķīga struktūra uz tumša akmens, kā arī pārejas starp gaišu un tumšu akmeni |
well0007.bmp | Izsistā lava, tostarp katrai 4-5 animācijas kadri |
well0008.bmp | Izsistā smiltis un neskaitāmas krāteru variācijas smiltīs |
well0009.bmp | Izsistā smilšu 'Doodads' - elementi, kurus var novietot uz smiltīm, lai tos atbrīvotu (vai apzināti kā struktūru, piemēram, sienas) |
well0010.bmp | Izsistā 48 pārejas no smiltīm uz gaišu un tumšu akmeni |
well0011.bmp | Izsistās kartes polārie cepures, ar tumšu akmeni kā pamatu |
well0012.bmp | Izsistās kartes polārie cepures, ar gaišu akmeni kā pamatu |
Ir ieteicams, lai nodrošinātu precīzu īstenošanu, nesagatavot flīzes iepriekš, lai tās varētu kešot, jo dati dienas/nakts ciklam vēl ir jāapstrādā - un radīsies ļoti, ļoti daudz datu.
Flīzes ir 8bpp grafikas ar indeksētu paleti, katra ar 32x32 pikseļu izšķirtspēju, kas ir sakārtotas viena virs otras. Tomēr šādā veidā radītajā flīžu komplektā var būt ievērojami vairāk
Pamatsastāvdaļa sastāv no 2 sekcijām: head
un data
.
Flīžu virsraksts
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | rakstz. | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 68 | 65 | 61 | 64 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | h | e | a | d | . | . | . | . | . | . | . | . | . | . | . | . |
0x0010 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Novirze | Datu tips | Nosaukums | Skaidrojums |
---|---|---|---|
0x0000 | uint(32) | Burvju baiti | |
0x0004 | uint(24) | Bloka garums | |
0x0007 | uint(8) | Karogi | |
0x0008 | uint(32) | Versija / Karogi? | Šeit varētu būt faila formāta versijas norāde; visās man pieejamajās failēs šeit bija vērtība |
0x000c | uint(32) | Platums (Horizontālā izšķirtspēja) | Norāda, cik plats ir attēla fails (pikseļos). Visiem Wells no Outpost 2 šeit jābūt vērtībai |
0x0010 | uint(32) | Augstums (vertikālā izšķirtspēja) | Norāda, cik liels ir attēla fails (pikseļos). Visiem Wells no Outpost 2 šeit tiks gaidīts vērtība |
0x0014 | uint(32) | Krāsu dziļums? | Šī vērtība nav zināma. Tā kā visos pārbaudītajos failos ir iekļauts vērtība |
0x0018 | uint(32) | Krāsu dziļums 2? | Šī vērtības nozīme nav zināma. Iespējams, ka tā ir 'mērķa' krāsas dziļums. |
Pēc šiem datiem seko standarta RIFF formātā sagatavota paletes faila. Precīzu specifikāciju var atrast - jo paletes parādās arī citur - zem Paletes.
Flīžu dati
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | rakstz. | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 64 | 61 | 74 | 61 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | d | a | t | a | . | . | . | . | . | . | . | . | . | . | . | . |
Novirze | Datu tips | Nosaukums | Skaidrojums |
---|---|---|---|
0x0000 | uint(32) | Burvju baiti | |
0x0004 | uint(24) | Bloka garums | |
0x0007 | uint(8) | Karogi |
Visbeidzot seko jau neapstrādātie pikseļu dati, sākot no kreisā augšējā stūra un virzoties pa rindām uz labo apakšējo stūri.
Datu vērtība grafikai, kas parasti ir 8bpp bitkarti, atbilst krāsas indeksam krāsu paletē.
Spēļu dzinējs izsauc lauku *visticamāk* pēc pieprasījuma.
Tas, iespējams, ir saistīts ar dienas-nakts ciklu, kuram ir 32 atsevišķu lauku pakāpes. Šajā procesā, šķiet, tiek atņemts 'mazliet' no gaismas vērtības. Precīzi rādītāji vēl nav noteikti, es strādāju ar aprēķinu pamatu
v *= (daylight / 48) + 0.25;
ar pikseļu HSV datiem, kur daylight ir vērtība no 0-31, un v ir vērtība no 0-1. Tāpat ir jāņem vērā, ka kartē katrā pusē ir vēl 16 lauki (tie kalpo neredzamai vienību izsaukšanai).
Turklāt dienas-nakts cikls katrā spēles ciklā atjaunina tikai vienu kolonu kartē.
Paātrināts dienas-nakts cikls izskatās šādi:
PRT
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | rakstz. | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 43 | 50 | 41 | 4c | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | C | P | A | L | . | . | . | . | . | . | . | . | . | . | . | . |
Novirze | Datu tips | Nosaukums | Skaidrojums |
---|---|---|---|
0x0000 | uint(32) | Burvju baiti | |
0x0004 | uint(24) | Paletes garums | Norāda paletēm šajā failā pieejamo skaitu, atšķirībā no parastā bloka formāta - nevis bloka garumu baitos. |
0x0007 | uint(8) | Karogi | Visticamāk, kā parasti, ir karogi. Tomēr man nav zināmu karogu; jo visi man zināmie vērtības atbilst |
Ko precīzi nozīmē PRT
, man nav zināms; iespējams, tas varētu nozīmēt 'Paletes un Resursu Tabula' - jo šī faila, kas atrodas kā op2_art.prt mapē maps.vol, saturs ir tieši saistīts ar to, un tas diezgan labi aprakstītu funkciju.
Šis fails satur sarakstu ar paletēm, tabulu par visām izmantotajām bitmap attēliem, visām animāciju definīcijām un vēl virkni nezināmu datu. Tas brīvi seko iepriekšējā konteineru formātam, jo ne visi datu ieraksti atbilst šai shēmai.
CPAL
sekcija (visticamāk, nozīmē paletes konteineru) ietver tikai paletēm datus, norādot, cik daudz no parasti 1052 baitiem lielajām 8-bit paletēm ir pieejamas.
1052 baitus skaitlis nav uzskatāms par saistošu, jo paletes formāts potenciāli varētu paredzēt dažādas paletes izmērus. Tas attiecas tikai uz datu kopumu, ar kuru tiek piegādāts Outpost 2.
Pēc paletes saraksta nekavējoties un bez ievada virsraksta seko bitmapu saraksts; tāpat nekavējoties seko animāciju saraksti.
Abi tiek uzsākti ar uint(32) (vai atkal uint24+uint8 karodziņi?) skaitli, kas satur ierakstu skaitu.
Paletes
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | rakstz. | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 50 | 50 | 41 | 4c | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | P | P | A | L | . | . | . | . | . | . | . | . | . | . | . | . |
Novirze | Datu tips | Nosaukums | Skaidrojums |
---|---|---|---|
0x0000 | uint(32) | Burvju baiti | |
0x0004 | uint(24) | Paletes garums | Norāda, pretēji parastajam bloka formātam, paletju skaitu, kas atrodams šajā failā - nevis bloka garumu baitos. |
0x0007 | uint(8) | Karogi | Visticamāk, kā parasti, ir karogi. Tomēr man nav zināmu karogu; jo visi man zināmie vērtības atbilst |
Informācija par paletēm ir ļoti viegli lasāma.
Tā sastāv no galvenes un datu segmenta.
Paletņu virsraksts
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | rakstz. | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 68 | 65 | 61 | 64 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | h | e | a | d | . | . | . | . | . | . | . | . | . | . | . | . |
Novirze | Datu tips | Nosaukums | Skaidrojums |
---|---|---|---|
0x0000 | uint(32) | Burvju baiti | |
0x0004 | uint(24) | Paletes garums | Norāda, pretēji parastajam bloka formātam, paletju skaitu, kas atrodams šajā failā - nevis bloka garumu baitos. |
0x0007 | uint(8) | Karogi | Visticamāk, kā parasti, ir karogi. Tomēr man nav zināmu karogu; jo visi man zināmie vērtības atbilst |
0x0008 | uint(32) | Paletes formāta versija? | Visticamāk, tas nosaka, kurai paletēm formāta versijai palete seko. Visām Outpost2 paletēm šķiet, ka ir versija |
Paletes dati
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | rakstz. | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 64 | 61 | 74 | 61 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | d | a | t | a | . | . | . | . | . | . | . | . | . | . | . | . |
Novirze | Datu tips | Nosaukums | Skaidrojums |
---|---|---|---|
0x0000 | uint(32) | Burvju baiti | |
0x0004 | uint(24) | Blocka garums | |
0x0007 | uint(8) | Karogi |
Datu sekcija iekļauj katru atsevišķo paletes ierakstu. Paletes ierakstu skaits ir atkarīgs no bloka garuma / 4.
Atsevišķiem ierakstiem ir šāda vienkārša struktūra;
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | rakstz. | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | 04 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Novirze | Datu tips | Nosaukums | Skaidrojums |
---|---|---|---|
0x0000 | uint(8) | Sarkana komponente | Norāda krāsas sarkano komponenti |
0x0001 | uint(8) | Zaļā komponente | Norāda krāsas zaļās sastāvdaļas proporciju |
0x0002 | uint(8) | Zilā komponente | Norāda krāsas zilo komponentu |
0x0003 | uint(8) | Nezināms - Karogi? | Nav skaidrs, ko šī vērtība nozīmē, jo tā acīmredzot pamatā ir |
Par paletēm jāatzīmē, ka animācijām izmantotajām paletēm pastāv šādi noteikumi:
- Pirmā krāsa vienmēr ir CAURSPIDĪGA, neatkarīgi no tā, kāda vērtība tur ir norādīta.
-
Paletes ieraksti 1-24 tiek uzskatīti par spēlētāju krāsām paletēs 1-8.
Man nav skaidrs, no kurienes nāk krāsas, kas nav saistītas ar spēlētāju 1.
Es pieņemu, ka pārējās krāsas ir cieti kodētas.
Bitkartiņas
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | rakstz. | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
0x0010 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Novirze | Datu tips | Nosaukums | Skaidrojums |
---|---|---|---|
0x0000 | uint(32) | Izvietotā platums | Norāda pikseļu datu rindu platumu baitos - jo tās ir izlīdzinātas uz 4 baitiem. Tādējādi ir ātri iespējams pāriet uz noteiktu attēla rindu. Kāpēc šī vērtība tiek glabāta atsevišķi, lai gan to varētu aprēķināt, nav skaidrs. |
0x0004 | uint(32) | Novirze | Norāda pirmās rindas nobīdi bitmapā |
0x0008 | uint(32) | Augstums | Norāda attēla augstumu pikseļos |
0x000c | uint(32) | Platums | Norāda attēla platumu pikseļos |
0x0010 | uint(16) | Tips | Norāda attēla veidu. Šajā gadījumā šķiet, ka tas ir bitmaskas formātā:
|
0x0012 | uint(16) | Palete | Definē, kuru paleti no PRT faila izmantot |
Šī PRT faila datu struktūra norāda, kā ir veidoti bitmapi, kas tiek izmantoti spritē. Šie bitmapi kalpo kā atsevišķas sastāvdaļas, no kurām vairākas tiek apkopotas, veidojot sprita animācijas kadru.
Konkrētie attēlu dati slēpjas
op2_art.BMP spēles direktorijā.
Kāpēc šai bitmapii ir (galvenokārt pareizs) RIFF bitmapa galvene,
nav skaidrs. Iespējams, ka Outpost 2 izmanto sistēmas API, lai ielādētu grafikas,
uztverot šo galveni pagaidu veidā un pārrakstot attiecīgās, mainīgās laukus.
Pikseļu dati BMP failā atrodas pozīcijā Offset + uint32-Offset, kas BMP failā atrodas adresē 0x000A (RIFF bitmapa datu offsets), - un atkal atbilst rindu kārtībai no augšas pa kreisi uz apakšu pa labi.
Monohromās 1bpp grafikas var zīmēt tā, ka krāsa 0 ir pilnīga caurspīdība, bet krāsa 1 ir puscaurspīdīga melna/ pelēka, jo monohromās grafikas parasti tiek izmantotas transportlīdzekļu un ēku ēnu animācijās.
Tādējādi var jau kombinēt daudzus grafikus.
Animācijas
Tagad mēs pārejam pie augstākās klases disciplīnām Outpost 2 datu formātos:
Animācijām.
Animāciju saraksti sākas ar globālu galveni, kas galvenokārt kalpo datu verificēšanai. Tam seko konkrēto animāciju definīcijas, kas iedalās trīs līmeņos:
-
Animācija
Animācija ir augstākā instance; tā attēlo vienības, ēkas vai 'daļiņu animāciju' (komētas trieciens, laika apstākļi, eksplozija) animāciju noteiktā izsākuma situācijā. -
Rāmītis
Rāmītis ir viens attēls animācijā. Animācija var ietvert vienu vai vairākus rāmīšus. -
Apakšrāmītis
Apakšrāmītis ir informācija par to, ka noteikta bitmapa noteiktos kritērijos jāizvieto noteiktā rāmīša pozīcijā. Rāmītī var būt viens vai vairāki apakšrāmīši.
Pēc tam seko tieši konkrētās animāciju definīcijas.
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | rakstz. | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Novirze | Datu tips | Nosaukums | Skaidrojums |
---|---|---|---|
0x0000 | uint(32) | Animāciju skaits | Cik daudz animāciju datu kopu ir pieejams |
0x0004 | uint(32) | Rāmi skaits | Cik kopumā būtu jābūt kadriem |
0x0008 | uint(32) | Apakšrāmju skaits | Cik daudz subrāmju kopumā vajadzētu būt |
0x000c | uint(32) | Nepieciešamo izvēles ierakstu skaits | Cik daudz "papildu ierakstu" ir pieejami. |
Animācija
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | rakstz. | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
0x0010 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
0x0020 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Novirze | Datu tips | Nosaukums | Skaidrojums |
---|---|---|---|
0x0000 | uint(32) | Nepazīstams 1 | Nezināma informācija |
0x0004 | uint(32) | Apkārtmējo kasti: Kreisi | Norāda kreiso sākumu (pikseļos) Bounding Box. |
0x0008 | uint(32) | Apvilkšanas kaste: Augšā | Norāda augšējo sākumu (pikseļos) Bounding Box. |
0x000c | uint(32) | Robusta kaste: platums | Norāda Bounding Box platumu (pikseļos). |
0x0010 | uint(32) | Ierobežojošais lodziņš: augstums | Norāda Bounding Box augstumu (pikseļos). |
0x0014 | uint(32) | Noregulējums: X | Norāda animācijas horizontālo centru |
0x0018 | uint(32) | Nostāde: Y | Norāda animācijas vertikālo centru |
0x001c | uint(32) | Nepazīstams 2 | Nezināma informācija |
0x0020 | uint(32) | Rāmi skaits | Norāda, cik daudz animāciju rādu ir šajā animācijā |
0x0024 | uint(32) | Logu skaits | Norāda, cik daudz logu jāizmanto zīmēšanā |
Augstākās slāņa dati, kas attiecas uz animāciju, galvenokārt ir administratīvie dati - Boundingbox apzīmē koordinātas ap transportlīdzekli/ēku, kad tas ir izvēlēts, un norāda arī to, kurš apgabals ir klikšķināms.
Ofsets galvenokārt nosaka "nulles punktu"; punktu, kas jāaprēķina vai jāatņem no spēles iekšējām koordinātām. Matemātiski sakot, ofsets šeit apzīmē koordinātu izcelsmi.
Windows ir, tāpat kā ofsets, katram logam 4 uint(32) vērtības, kuras norāda apgabalu, kas tiek uzskatīts par izmantojamu atsevišķiem subframe. Ārpus logiem nedrīkst zīmēt, ja vien tas nav paredzēts bitmap.
Rāmja
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | rakstz. | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Novirze | Datu tips | Nosaukums | Skaidrojums |
---|---|---|---|
0x0000 | uint(8) | Subrāmis skaits un pārslēdzējs opcijai 1, 2 | Šī vērtība satur:
|
0x0001 | uint(8) | Nepazīstams 1 un pārslēgs izvēles 3, 4 | Šī vērtība satur:
|
0x0002 | uint(8) | Nepieciešams 1 | Nezināms |
0x0003 | uint(8) | Opcionalais 2 | Nezināms |
0x0004 | uint(8) | Izvēles 3 | Nezināms |
0x0005 | uint(8) | Opcija 4 | Nezināms |
Apakšrāmis
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | rakstz. | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Novirze | Datu tips | Nosaukums | Skaidrojums |
---|---|---|---|
0x0000 | uint(16) | Bitmap-ID | Norāda, kura bitmap jāizmanto šim apakšrāmim |
0x0002 | uint(8) | Nepazīstams 1 | Nav zināms - tomēr stipri pieļauju, ka šeit ir runa par renderēšanas prioritāti (Z-līmenis). |
0x0003 | uint(8) | Apakšrāmja ID | Norāda, kurā apakšrāmī mēs atrodamies |
0x0004 | sint(16) | Noslēgums - Horizontāls | Norāda, kur ietvarā jānovieto apakšrāmis, vai arī par cik pikseļiem bitmapa jānovirza horizontāli. |
0x0006 | sint(16) | Offset - Vertikāls | Norāda, kur ietvarā jānovieto apakšsistēma, vai arī par cik pikseļiem attēls jānovieto vertikāli. |
Tādējādi mēs tagad varam salikt atsevišķus kadrus, kā arī pilnīgas animācijas, šeit piemēram tiek demonstrēta sarežģītāka animācija ar indeksu 500
Animācija 500
Animācija 500 parāda, kā Plymouth transportieris, kas ir iekrauts ar parasto ore, tiek izkrauts. Tā ir viena no nedaudzajām animācijām, kas izmanto logu funkcionalitāti.
Tādējādi var savienot visu animāciju kopā.
Diemžēl joprojām pastāv problēma ar augšējo kravas atveri, jo šeit attiecīgais bits grafikas tipa informācijā nav iestatīts.
Šeit ir vēl daži, skaisti animēti sprite no spēles:
Lietotāja interfeiss
Tagad trūkst spēles lietotāja saskarne, kas ir izstrādāta slīpēta metāla stilā.
Tomēr arī šeit ir skaidrs, ka Dynamix nebija jāizgudro ritenis no jauna; šeit tiek izmantotas ne tikai vienkāršās User32 un GDI32 API, ko nodrošina Windows, bet īpaši tiek izmantota arī resursu pārvaldība no User32.
Šos resursus var izvilkt, piemēram, izmantojot programmas, ko izstrādājis Angus Johnson kā bezmaksas programmatūru Resource Hacker, vai - ja jūs nevēlaties izmantot Wine Linux / Mac OS - izmantojot icoutils iekļauto wrestool.
Faila nosaukums | Saturs |
---|---|
Outpost2.exe | Saturs tikai spēles ikona, kas attēlo kosmosa staciju pie New Terra |
op2shres.dll | Saturs grafikas, kas paredzētas vadības elementiem, piemēram, apmalēm, pogām, radio pogām un izvēles rūtiņām, kā arī dialogu fona attēlus, pavadītājus stāsta misiju tekstiem un galvenā izvēlnes fona grafiku |
out2res.dll | Saturs spēles logu dekorācijas, ikonas parastajam un īpašajam metālam, ielādes ekrānu, grafikas dialogiem, kā arī papildu kursoru grafikas, papildus animētajiem spēles direktorijā |