Outpost 2 failivormingud · bei.pm
Siin lehel kirjeldatud failiformaadid põhinevad Dynamix, Inc. ja Sierra Entertainment intellektuaalomandi tehnilisel analüüsil.
Intellektuaalne omand kuulub praegu Activision Publishing, Inc.-i / Activision Blizzard, Inc.-i varade hulka ja on praegu Microsoft Corp.-i omandis.
Teave on kogutud tagasipööramise inseneritehnika ja andmeanalüüsi abil, eesmärgiga arhiveerida ja tagada ühilduvus ajalooliste andmetega.
Kasutatud ei ole ühtegi patenteeritud või konfidentsiaalset spetsifikatsiooni.
Mängu saab praegu osta allalaadimiseks gog.com.
Järgmine artiklite seeria dokumenteerib minu teadmisi andmeformaatidest reaalajas strateegiamängus "Outpost 2: Divided Destiny", mis ilmus 1997. aastal Sierra poolt ja mille arendas välja Dynamix.
Olen peamiselt analüüsinud mängu andmeid ja nende kasutamist ajavahemikus 1. november 2015 kuni 14. november 2015.
Minu seni kogutud teabe kohaselt ei arendanud Dynamix, nagu paljud kaubanduslikud ettevõtted, teatud andmeformaate spetsiaalselt Outpost 2 jaoks, vaid kasutas neid ka teistes projektides, näiteks Mechwarrior sarjas (muudetud kujul).
Samuti võib märkida, et andmeformaatide uuenduslikkus on praktiliselt piiratud ja sageli põhineb pikaajalistel kontseptsioonidel, mis tulenevad tavapärastest formaatidest nagu JFIF ja RIFF.
Tabelite ja andmeformatide tõlgendamiseks on saadaval täiendav teave aadressil Mis on mis?.
Siin esitatud andmeid tuleb üldiselt mõista kui Little Endian formaadis.
Lõpetuseks võib öelda, et tagasipööramine pakkus palju rõõmu, kuigi see ei ole täielik.
Muidugi soovitan ka lihtsalt mängu ise mängida, kuna see pakub huvitavaid mängumehaanikaid.
Sissejuhatus
Outpost 2 kasutatavad andmeformaatidel on JFIF / PNG-le sarnane struktuur - iga andmeploki puhul on alati olemas 8-baidine päis. Seetõttu jätan enda jaoks vahele individuaalsete päiste dokumenteerimise vastavates spetsiifilistes kohtades ja dokumenteerin seal ainult kõrvalekalded.
Formaat on alati järgmine; tegelikud kasutusandmed on seal sees:
Aadress | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | sümbol | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Andmetüüp | Nimi | Selgitus |
---|---|---|---|
0x0000 | uint(32) | Maagia baitide | Sisaldab teavet selle kohta, mida järgmises andmeplokis oodata on. Tuntud väärtused:
|
0x0004 | uint(24) | Bloki pikkus | Kätkeb teavet selle kohta, kui suur (baitides) on järgmine andmeplokk. Siin on silmas peetud ainult puhast kasulikku sisu - 8 päise baiti ei arvestata. |
0x0007 | uint(8) | Lipud? | On teadmata, milleks see plokk täpselt mõeldud on. Mahtudes on see väärtus sageli 0x80, teistes failides aga sageli 0x00. See viitab sellele, et tegemist on lipu seadistusega. |
Hulgad
Volüümid on mängu jaoks andmekonteiner, sarnane arhiiviformaadile, nagu näiteks Tarball. Outpost 2-s tunneb see formaat siiski vaid faile - mitte kaustasid. Tõenäoliselt saaks neid aga vastavate failinimede kaudu simuleerida.
Volüüm koosneb volüümi päisest ja mitmest volüümi plokist, mis vastavad konkreetsetele failidele.
"Volüümid" on failid, mille laiend on 'vol'
mängu kataloogis.
Aadress | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | sümbol | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 56 | 4f | 4c | 20 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | V | O | L | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Andmetüüp | Nimi | Selgitus |
---|---|---|---|
0x0000 | uint(32) | Magiabaitide | |
0x0004 | uint(24) | Bloki pikkus | |
0x0007 | uint(8) | Lipud |
Helipealkiri
Aadress | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | sümbol | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 76 | 6f | 6c | 68 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | v | o | l | h | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Andmetüüp | Nimi | Selgitus |
---|---|---|---|
0x0000 | uint(32) | Magiabaitide | |
0x0004 | uint(24) | Bloki pikkus | |
0x0007 | uint(8) | Lipud |
Volume'i pealkiri ei sisalda mitte mingit kasulikku teavet.
See teenib vaid konteinerina.
Volume'i pealkirjas peaks esimesena olema Volume'i stringid; nendele järgnevad siis Volume'i andmed.
Heli stringid
Aadress | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | sümbol | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 76 | 6f | 6c | 69 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | v | o | l | i | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Andmetüüp | Nimi | Selgitus |
---|---|---|---|
0x0000 | uint(32) | Magiabaitide | |
0x0004 | uint(24) | Bloki pikkus | |
0x0007 | uint(8) | Lipud |
Aadress | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | sümbol | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 76 | 6f | 6c | 73 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | v | o | l | s | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Andmetüüp | Nimi | Selgitus |
---|---|---|---|
0x0000 | uint(32) | Magiabaitide | |
0x0004 | uint(24) | Bloki pikkus | |
0x0007 | uint(8) | Lipud | |
0x0008 | uint(32) | Kandepinna pikkus | Näitab, kui palju baite järgnevatest andmetest tegelikult on kasulikud andmed. Ülejäänud, allesolevad andmed maht-stringsi loendis on ilmselt prügiks loetletavad. Hiljem kuupäevale kuuluvates failides on need 'allesolevad andmed' 0x00, mis võib viidata probleemidele tööriistade komplektis mängu arendamise ajal, st et arendaja hakkas õigete puhversalvestuste algseadistamisega tegelema alles hilja, kuna andmete algseadistamine ei mõjuta mängu toimimist. |
0x000c | uint(8)[] | Failinimede loend | Siin on tegemist 0-baiti lõpetatud failinimede nimekirjaga, mis - vähemalt käesolevas andmekomponendis - eeldab vaid ASCII märke. Andmete töötlemisel ei ole vajalik selle andmeploki täiendav analüüs, kuna mahtude teabes viidatakse failinimede offset'idele otse. |
Volume Strings on nimekiri failinimedest, mis kuuluvad mahutisse.
Mahuteave
Aadress | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | sümbol | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 76 | 6f | 6c | 69 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | v | o | l | i | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Andmetüüp | Nimi | Selgitus |
---|---|---|---|
0x0000 | uint(32) | Magiabaitide | |
0x0004 | uint(24) | Bloki pikkus | |
0x0007 | uint(8) | Lipud |
Mahtude teave sisaldab üksikasjalikumat teavet failide kohta. See on teatud mõttes nagu FAT-i katalooge (FAT = Faili jaotustabel).
Failide arv tuleneb ploki suurusest, jagatuna katalooge sissekannete pikkusega - 14 baiti.
Igal katalooge sissekandel on järgmine struktuur:
Aadress | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | sümbol | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Andmetüüp | Nimi | Selgitus |
---|---|---|---|
0x0000 | uint(32) | Failinime nihke | Osutab, millisel offset'il (!) failinime loendis (volume-string'id) faili nimi asub. See viitab kasutusandmete ploki algusele. |
0x0004 | uint(32) | Faili-offset | Näitab, millisel nihkel kogu mahufailis asub fail. |
0x0008 | uint(32) | Faili suurus | Osutab, kui suur fail on baitides. |
0x000c | uint(16) | Lippud? | Ilmselt annab see täiendavat teavet faili kodeerimise kohta.
|
Heli plokk
Aadress | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | sümbol | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 56 | 42 | 4c | 48 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | V | B | L | H | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Andmetüüp | Nimi | Selgitus |
---|---|---|---|
0x0000 | uint(32) | Magiabaitide | |
0x0004 | uint(24) | Bloki pikkus | |
0x0007 | uint(8) | Lipud |
Volume-blokk on konteiner, mis sisaldab faile. See sisaldab veel kord - blockformaatide tõttu - redundantselt faili suurust ja seejärel järgivad kohe kasutusandmed.
Plaadid
Aadress | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | sümbol | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 50 | 42 | 4d | 50 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | P | B | M | P | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Andmetüüp | Nimi | Selgitus |
---|---|---|---|
0x0000 | uint(32) | Magiabaitide | |
0x0004 | uint(24) | Bloki pikkus | |
0x0007 | uint(8) | Lipud |
Tiilid on Outpost-2-spetsiifiline
bitmap-graafikafailide formaat. Need katavad 13 tiilide komplekti,
mida nimetatakse "kaevudeks" (well0000.bmp
kuni well0012.bmp
),
mis asuvad mahus maps.vol.
Tiilide komplektid / Kaevud sisaldavad järgmist:
Failinimi | Sisu |
---|---|
well0000.bmp | 32x32px suurune sinine graafika - ideaalne testimiseks, kas teie pildilaadur töötab |
well0001.bmp | Sisaldab heledat kivi, mäeahelikke heledal kivimisel ja lugematuid variante kraatritest heledal kivimisel |
well0002.bmp | Sisaldab heleda kivi 'Doodade', st elemente, mida saab heledal kivimisel paigutada lõdvestamiseks (või teadlikult struktuurina, nagu näiteks müürid), sealhulgas taimestik |
well0003.bmp | Sisaldab koorikulaadset struktuuri heledal kivimisel |
well0004.bmp | Sisaldab tumedat kivi, mäeahelikke tumedal kivimisel ja lugematuid variante kraatritest tumedal kivimisel |
well0005.bmp | Sisaldab tumeda kivi 'Doodade', st elemente, mida saab tumedal kivimisel paigutada lõdvestamiseks (või teadlikult struktuurina, nagu näiteks müürid) |
well0006.bmp | Sisaldab koorikulaadset struktuuri tumedal kivimisel, samuti üleminekud heleda ja tumeda kivi vahel |
well0007.bmp | Sisaldab laavat, sealhulgas 4-5 kaadrit sama animatsiooni |
well0008.bmp | Sisaldab liiva ja lugematuid variante kraatritest liivas |
well0009.bmp | Sisaldab liiva 'Doodade', st elemente, mida saab liivas paigutada lõdvestamiseks (või teadlikult struktuurina, nagu näiteks müürid) |
well0010.bmp | Sisaldab 48 üleminekut liivast heledale ja tumedale kivile |
well0011.bmp | Sisaldab kaardil polar kappe, tumeda kiviga aluspinnana |
well0012.bmp | Sisaldab kaardil polar kappe, heleda kiviga aluspinnana |
On soovitatav, et täpne rakendus ei renderdaks plaatide eelnevalt, et neid vahemälus hoida, kuna andmed päeva/öö tsükli jaoks peavad veel töötlemiseks minema - ja andmeid koguneks väga, väga palju.
Plaatideks on 8bpp graafika indekseeritud paletiga, mille lahutusvõime on 32x32 pikslit, ja need on omavahel paigutatud. Sellises loodud plaatide kogumis võib siiski olla palju rohkem
Pea konteiner koosneb kahest sektsioonist: head
ja data
.
Plaatide pealkiri
Aadress | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | sümbol | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 68 | 65 | 61 | 64 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | h | e | a | d | . | . | . | . | . | . | . | . | . | . | . | . |
0x0010 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Andmetüüp | Nimi | Selgitus |
---|---|---|---|
0x0000 | uint(32) | Magiabaitide | |
0x0004 | uint(24) | Bloki pikkus | |
0x0007 | uint(8) | Lipud | |
0x0008 | uint(32) | Versioon / Lipud? | See võib olla failiformaadi versiooni näitaja; kõikides mulle teadaolevates failides oli siin väärtus |
0x000c | uint(32) | Laius (horisontaalne eraldusvõime) | Osutab, kui lai on pildifail (pikslites). Kõigi Outpost 2 kaevude puhul on oodata, et siin on väärtus |
0x0010 | uint(32) | Kõrgus (vertikaalne eraldusvõime) | Näitab, kui kõrge pildifail on (pikslites). Kõigi Outpost 2 kaevude puhul on siin oodata väärtust |
0x0014 | uint(32) | Värvisügavus? | Oma tähenduselt on see väärtus teadmata. Kuna see esineb kõigis kontrollitud failides väärtusega |
0x0018 | uint(32) | Värvisügavus 2? | Selle väärtuse tähendus on teadmata. Võimalik, et see on 'siht'-värvisügavus. |
nende andmete põhjal järgneb standardiseeritud RIFF-vormingus palettifail. Täpse spetsifikatsiooni leiate - kuna paletid ilmuvad ka mujal - Värvipalettide tabelitest.
Keraamika andmed
Aadress | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | sümbol | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 64 | 61 | 74 | 61 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | d | a | t | a | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Andmetüüp | Nimi | Selgitus |
---|---|---|---|
0x0000 | uint(32) | Magiabaitide | |
0x0004 | uint(24) | Bloki pikkus | |
0x0007 | uint(8) | Lipud |
Lõpuks järgivad juba puhtad pikselandmed, vasakult ülalpool rida-realt paremale alla.
Datanä值, mis tavaliselt esineb 8bpp-bitmappidena, vastab värvi indeksile värvipaletis.
Mängu mootor joonistab plaate *tõenäoliselt* nõudmisel.
Tundub, et see on osaliselt tingitud päeva-öö tsüklist, mis tunneb 32 erinevat taset. Selgub, et heledusväärtusest 'võetakse natuke' ära. Täpsed väärtused pole veel selgunud, töötan arvutuste põhjal
v *= (daylight / 48) + 0.25;
pikslite HSV-andmetega, kusjuures daylight on väärtus vahemikus 0-31 ja v väärtus vahemikus 0-1. Lisaks tuleb arvesse võtta, et kaardil on kummalgi pool veel 16 plaati (need teenivad nähtamatute üksuste spawnimiseks).
Lisaks näib, et päeva-öö tsükkel uuendab iga mängutsükli jooksul ainult ühte kaardiveergu.
Kiirendatud päeva-öö tsükkel näeb seega välja järgmine:
PRT
Aadress | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | sümbol | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 43 | 50 | 41 | 4c | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | C | P | A | L | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Andmetüüp | Nimi | Selgitus |
---|---|---|---|
0x0000 | uint(32) | Magiabaitid | |
0x0004 | uint(24) | Pakkide pikkus | Erinevalt tavalisest plokiformaadist näitab see failis leiduvate palettide arvu - mitte ploki pikkust baitides. |
0x0007 | uint(8) | Lipud | Tõenäoliselt nagu tavaliselt, lipud. Kuid mulle ei ole teada ühtegi lippu; kuna kõik mulle teadaolevad väärtused vastavad |
Millele PRT
täpselt viitab, ei ole mulle teada; võimalik, et see tähistab näiteks 'Palette and Resource Table' - kuna see fail, mida leidub nimega op2_art.prt maps.vol failis, on just selline fail, või see kirjeldaks funktsiooni üsna hästi.
See fail sisaldab nimekirja palettidest, tabelit kõigi kasutatud bitmappide kohta, kõiki animatsiooni määratlusi ja veel mitmeid tundmatuid andmeid. See järgib varasemaid konteinerivormingute lõdvalt, kuna mitte kõik andmerikkad ei vasta sellele skeemile.
CPAL
sektsioon (tõenäoliselt tähendab see palettide konteinerit) sisaldab ainult palettide andmeid, märkides ära, kui palju on tavaliselt 1052 baitist koosnevaid 8-bitiseid palette.
1052-baidine näit on siiski mitte kohustuslik, kuna palettide formaat võib potentsiaalselt näha ette erinevaid palettide suurusi. See kehtib ainult andmekogumi kohta, millega Outpost 2 tarnitakse.
Palettide nimekirjadele järgneb kohe ja ilma sissejuhatava päiseta bitmappide nimekiri; sellele järgneb kohe ka animatsioonide nimekiri.
Kumbki neist algab uint(32) (või jälle uint24+uint8 lipud?) abil, mis sisaldab andmerikkade arvu.
Värvipalettide tabelid
Aadress | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | sümbol | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 50 | 50 | 41 | 4c | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | P | P | A | L | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Andmetüüp | Nimi | Selgitus |
---|---|---|---|
0x0000 | uint(32) | Maagia baitid | |
0x0004 | uint(24) | Plaatide pikkus | Annab, vastupidiselt tavapärasele plokiformaadile, arvu selles failis leiduvate palateid - mitte ploki pikkuse baitides. |
0x0007 | uint(8) | Lipud | Tõenäoliselt, nagu tavaliselt, lipud. Kuid mulle ei ole lipud teada; kuna kõik mulle tuntud väärtused vastavad |
Kaubaaluste teave on väga lihtne lugeda.
Need koosnevad igaühel pealkirjast ja andmesegmentidest.
Palettide päis
Aadress | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | sümbol | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 68 | 65 | 61 | 64 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | h | e | a | d | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Andmetüüp | Nimi | Selgitus |
---|---|---|---|
0x0000 | uint(32) | Maagia baitid | |
0x0004 | uint(24) | Plaatide pikkus | Annab, vastupidiselt tavapärasele plokiformaadile, arvu selles failis leiduvate palateid - mitte ploki pikkuse baitides. |
0x0007 | uint(8) | Lipud | Tõenäoliselt, nagu tavaliselt, lipud. Kuid mulle ei ole lipud teada; kuna kõik mulle tuntud väärtused vastavad |
0x0008 | uint(32) | Palettiformaadi versioon? | Tõenäoliselt määratleb, millise palettide formaadi versioonile palette vastab. Kõik Outpost2 paletid näivad omavat versiooni |
Palettide andmed
Aadress | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | sümbol | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 64 | 61 | 74 | 61 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | d | a | t | a | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Andmetüüp | Nimi | Selgitus |
---|---|---|---|
0x0000 | uint(32) | Maagia baitid | |
0x0004 | uint(24) | Ploki pikkus | |
0x0007 | uint(8) | Lipud |
Andmesection sisaldab üksikute pookimiste sissekandeid. Pookimiste sissekannete arv tuleneb ploki pikkusest / 4.
Üksikutel sissekannetel on järgmine lihtne struktuur;
Aadress | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | sümbol | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | 04 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Andmetüüp | Nimi | Selgitus |
---|---|---|---|
0x0000 | uint(8) | Punane komponent | Osutab värvi punasele osale |
0x0001 | uint(8) | Roheline komponent | Osutab värvi rohelise osa suurusele |
0x0002 | uint(8) | Sinine komponent | Annab värvi sinise osa |
0x0003 | uint(8) | Tundmatu - Lipud? | Ei ole selge, mida see väärtus tähendab, kuna see paistab olevat põhimõtteliselt |
Palettide kohta on veel öelda, et animatsioonide jaoks kasutatavate palettide puhul kehtivad järgmised reeglid:
- Esimene värv on ALATI läbipaistev, olenemata sellest, milline väärtus seal on.
-
Palettide sissekanded 1-24 loetakse palettides 1-8 mängija värviks.
Kust värvid mängijast 1 väljaspool täpselt tulevad, on mulle ebaselge.
Kahtlustan, et ülejäänud värvid on hardcoded.
Bitmape.
Aadress | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | sümbol | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
0x0010 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Andmetüüp | Nimi | Selgitus |
---|---|---|---|
0x0000 | uint(32) | Suunatud laius | Annab pikslite andmereadade laiust baitides - kuna need on joondatud 4-baitiste piiridega. Nii on kiirelt võimalik liikuda teatud pildirea juurde. Miks seda väärtust eraldi salvestatakse, kuigi seda oleks võimalik arvutada, on ebaselge. |
0x0004 | uint(32) | Kohandamine | Osutab bitmap'i esimese rea nihkele |
0x0008 | uint(32) | Kõrgus | Annab pildi kõrguse pikslites |
0x000c | uint(32) | Laius | Väljendab pildi laiust pikslites |
0x0010 | uint(16) | Tüüp | Näitab pildi tüüpi. Tundub, et tegemist on bitmaskiga:
|
0x0012 | uint(16) | Palett | Defineerib, millist paletti PRT-failist kasutada |
PRT-faili andmestruktuur näitab, kuidas sprite'ide jaoks kasutatavad bitmap'id on üles ehitatud. Need bitmap'id toimivad kui üksik komponent, millest mitmed kokku pannakse sprite'i animatsioonikaadriks.
Konkreetne pilditeave peitub aga
op2_art.BMP mängu kaustas.
Miks selle bitmap-failil on (peamiselt õige) RIFF-bitmapi päis, on ebaselge. Tõenäoliselt kasutab Outpost 2 süsteemi-API-sid graafika laadimiseks,
kasutades seda päist ajutiselt ning asendades vastavad, varieeruvad väljad.
Pikslite andmed on BMP-failis asendis offset + uint32-offset, mis asub BMP-failis aadressil 0x000A (RIFF-Bitmapi andmeoffset), ja on jälle järjestatud vasakult ülalpool paremale allapoole.
Monokroomseid 1bpp graafikaid saab joonistada nii, et värv 0 esindab täielikku läbipaistmatust ning värv 1 on poolläbipaistev must/hall, kuna monokroomseid graafikaid kasutatakse tavaliselt sõidukite ja hoonete varjude jaoks animatsioonides.
Nii saab juba palju graafikaid kokku panna.
Animatsioonid
Nüüd liigume edasi väljaannete 2 andmeformaatide kuningaklassi:
Animatsioonid.
Animatsioonide loendid algavad globaalsete peadega, mis teenivad peamiselt andmete kontrollimist. Seejärel järgivad konkreetsed animatsiooni määratlemised, mis jagunevad 3 tasandisse:
-
Animatsioon
Animatsioon on kõrgeim tase; see esindab üksuse, hoone või 'osakeste animatsiooni' (koometaari tabamine, ilm, plahvatus) animatsiooni teatud algtingimustes. -
Raam
Raam on üksikud pilt animatsioonis. Animatsioon võib sisaldada ühte või mitut raami. -
Alaraam
Alaraam on teave selle kohta, et teatud bitmap tuleb teatud kriteeriumide alusel joonistada teatud raami positsioonile. Raam võib sisaldada ühte või mitut alaraami.
Seejärel järgivad kohe konkreetsed animatsiooni määratlemised.
Aadress | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | sümbol | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Andmetüüp | Nimi | Selgitus |
---|---|---|---|
0x0000 | uint(32) | Animatsioonide arv | Kui palju animatsioonide andmekogusid on olemas |
0x0004 | uint(32) | Raamide arv | Kui palju kaadreid peaks kokku olema |
0x0008 | uint(32) | Alamraamide arv | Kui palju subraame kokku peaks olema |
0x000c | uint(32) | Valikuliste kirjete arv | Kui palju "valikulisi kirjeid" on olemas. |
Animatsioon
Aadress | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | sümbol | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
0x0010 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
0x0020 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Andmetüüp | Nimi | Selgitus |
---|---|---|---|
0x0000 | uint(32) | Tundmatu 1 | Tundmatud teated |
0x0004 | uint(32) | Piirav kast: Vasak | Annab Bounding Box vasaku alguse (pikslites). |
0x0008 | uint(32) | Piirbox: Ülal | Annab ülemise alguse (pikslites) Bounding Box jaoks. |
0x000c | uint(32) | Piirkonna kast: Laius | Annab Bounding Box laius (pikslites). |
0x0010 | uint(32) | Piirbox: Kõrgus | Annab Bounding Box kõrguse (pikslites). |
0x0014 | uint(32) | Offset: X | Annab animatsiooni horisontaalse keskpunkti |
0x0018 | uint(32) | Offset: Y | Osutab animatsiooni vertikaalsele keskpunktile |
0x001c | uint(32) | Tundmatu 2 | Tundmatu teave |
0x0020 | uint(32) | Raamide arv | Näitab, kui palju animatsiooniraame see animatsioon sisaldab |
0x0024 | uint(32) | Windowside arv | Näitab, kui palju aknaid joonistamisel rakendada |
Ülemise kihi, animatsiooni, andmed on peamiselt haldusandmed - Boundingbox tähistab siin sõiduki/hoone ümber asuva märgise koordinaate, kui see on valitud, ja näitab samal ajal, milline ala peaks olema klikatav.
Offset määrab peamiselt "nullpunkti"; punkti, mida tuleb mängusiseste koordinaatide pealt arvesse võtta või maha arvestada. Matemaatiliselt öeldes: offset tähistab siin koordinaatide algpunkti.
Aknad koosnevad, nagu ka offset, igaühe kohta (igale aknale) 4 uint(32) väärtusest, mis näitavad ala, mis on kasutatav eraldi subraamide jaoks. Aknadest väljaspool ei tohi, niikaua kui see on bitmapi jaoks ette nähtud, joonistada.
Raam
Aadress | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | sümbol | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Andmetüüp | Nimi | Selgitus |
---|---|---|---|
0x0000 | uint(8) | Subframe'i arv ja lüliti valikulistele 1, 2 | See väärtus sisaldab:
|
0x0001 | uint(8) | Tundmatu 1 ja lüliti valikuliseks 3, 4 | See väärtus sisaldab:
|
0x0002 | uint(8) | Valikuline 1 | Tundmatu |
0x0003 | uint(8) | Valikuline 2 | Tundmatu |
0x0004 | uint(8) | Valikuline 3 | Tundmatu |
0x0005 | uint(8) | Valikuline 4 | Tundmatu |
Alusraam
Aadress | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | sümbol | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Andmetüüp | Nimi | Selgitus |
---|---|---|---|
0x0000 | uint(16) | Bitmap-ID | Näitab, millist bitmapi selle alaraami jaoks kasutada |
0x0002 | uint(8) | Tundmatu 1 | On tundmatu - arvan siiski kindlalt, et see on seotud renderdamise prioriteediga (Z-kihiga). |
0x0003 | uint(8) | Alusraami ID | Näitab, millises alamsalves me oleme |
0x0004 | sint(16) | Offset - Horisontaalne | Näitab, kus raami sees subraam paigutada tuleks, või kui palju pikslit tuleb bitmapi horisontaalselt nihutada |
0x0006 | sint(16) | Offset - Vertikaalne | Näitab, kus raami sees subraam asetada tuleks, või kui palju pikslit bitmap vertikaalselt nihutada tuleks |
Samuti saame nüüd koostada üksikuid kaadreid ning ka terveid animatsioone, siin näidates näitena keerukamat animatsiooni, animatsiooni indeksiga 500.
Animatsioon 500
Animatsioon 500 näitab, kuidas Plymouthi transportija, mis on tavalise rauaga laaditud, tühjendatakse. See on üks väheseid animaatsioone, mis kasutab akende funktsionaalsust.
Nii saab kokku panna kogu animatsiooni.
Kahjuks on ülemise laadimisluugi osas endiselt probleem, kuna graafikateabe bit ei ole seadistatud.
Siin on veel mõned, kaunilt animatsioonitud spritid mängust:
Kasutajaliides
Nüüd on puudu mängu kasutajaliides, mis on valmistatud harjatud metall -näo järgi.
Aga ka siin on selgelt näha, et Dynamix ei pidanud ratast uuesti leiutama; siin ei kasutata mitte ainult Windowsi pakutavaid User32- ja GDI32-API-sid, vaid ka User32 ressursside haldust.
Näiteks saab neid eraldada programmidega nagu Angus Johnson tasuta arendatud Resource Hacker, või - kui keegi ei soovi Linuxis / Mac OS-is kasutada Wine'i - kasutades icoutils paketi sisaldavat wrestool.
Failinimi | Sisu |
---|---|
Outpost2.exe | Sisaldab ainult mängu ikooni, mis kujutab kosmosesidet New Terra ees |
op2shres.dll | Lisaks graafikutele juhtnuppude jaoks, nagu piirjooned, nupud, raadio-nupud ja linnukesed, sisaldab ka dialoogide taustu, saatvaid pilte loo missioonitekstide jaoks ja põhimenüü taustagraafikat |
out2res.dll | Sisaldab mänguaken kaunistust, ikoone tavalise ja erilise metalli jaoks, laadimisekraani, graafikat dialoogide jaoks ning lisaks muid kursorite graafikaid, lisaks animatsioonidele mängu kaustas |