Formatet e skedarëve të Outpost 2 · bei.pm
Formatet e skedarëve të përshkruara në këtë faqe bazohen në analizën teknike të pronësisë intelektuale nga Dynamix, Inc. dhe Sierra Entertainment.
Pronësia intelektuale është sot pjesë e masës së Activision Publishing, Inc. / Activision Blizzard, Inc. dhe aktualisht është në pronësi të Microsoft Corp..
Informacionet janë mbledhur përmes Inxhinierisë së Kundërt dhe Analizës së Të Dhënave me qëllim arkivimin dhe ndërveprimin me të dhëna historike.
Nuk janë përdorur specifikime pronësore apo konfidenciale.
Loja mund të blihet aktualisht si shkarkim në gog.com.
Seria e mëposhtme e artikujve dokumenton njohuritë e mia mbi formatet e të dhënave në lojën e strategjisë në kohë reale "Outpost 2: Divided Destiny", e cila u publikua në vitin 1997 nga Sierra dhe u zhvillua nga Dynamix.
Me datë 1 nëntor 2015 deri më 14 nëntor 2015, kam qenë kryesisht e angazhuar me analizën e të dhënave të lojës - dhe çfarë bën me to.
Sipas informacionit që kam arritur të fitoj deri tani, Dynamix - ashtu si shumë kompani komerciale - nuk ka zhvilluar disa formate të dhënash specifikisht për Outpost 2, por i ka përdorur edhe në zhvillime të tjera si për shembull seria Mechwarrior (të modifikuara).
Pavarësisht nga kjo, gjithashtu mund të konstatohet se fuqia inovative e formateve të të dhënave është praktikisht e kufizuar dhe shpesh ndikohet nga koncepte më të vjetra të formateve të zakonshme si JFIF dhe RIFF.
Për interpretimin e tabelave dhe formateve të të dhënave janë në dispozicion informacione të tjera në Çfarë është çfarë?.
Të dhënat e dhëna këtu janë përgjithësisht të kuptueshme si Little Endian.
Në përfundim, mund të thuhet se inxhinieria e kundërt ishte shumë e këndshme, edhe pse nuk është e plotë.
Sigurisht, unë gjithashtu rekomandoj të luani vetë lojën, pasi ofron mekanika interesante të lojës.
Hyrje
Formatet e të dhënave të përdorura nga Outpost 2 kanë një strukturë që i ngjan JFIF / PNG - blloqet e ndryshme të të dhënave gjithmonë kanë një header prej 8 byte. Për këtë arsye, nuk e shoh të nevojshme të dokumentoj header-at e veçantë në vendet përkatëse specifike, por do të dokumentoj vetëm devijimet atje.
Formati është gjithmonë si më poshtë; të dhënat e vërteta janë të futur brenda tij:
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | karaktere | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Kufiri | Lloji i të dhënave | Emri | Shpjegim |
---|---|---|---|
0x0000 | uint(32) | Bytes Magjike | Përmban informacion në lidhje me atë çfarë pritet në bllokun e të dhënave të ardhshëm. Vlerat e njohura:
|
0x0004 | uint(24) | Gjatësia e bllokut | Përmban informacion rreth madhësisë (në Byte) të bllokut të të dhënave në vijim. Këtu janë të dhënat e pastër të përdorimit - 8 Byte të headers nuk përfshihen në të. |
0x0007 | uint(8) | Flamuj? | Është e panjohur se për çfarë shërben ky bllok saktësisht. Në volume, kjo vlerë shpesh është 0x80, ndërsa në skedarë të tjerë shpesh është 0x00. Kjo sugjeron se bëhet fjalë për një grup flagesh. |
Vëllimet
Volumet janë një enë të dhënash për lojën, të ngjashme me një format arkivi si p.sh. Tarball. Pak a shumë në Outpost 2, formati njeh vetëm skedarët - jo dosjet. Probabilisht këto mund të simulojnë përmes emrave të skedarëve përkatës.
Një volum përbëhet nga titulli i volumit, si dhe nga disa blloqe volumesh që përkojnë me skedarët konkretë.
"Volumet" janë skedarët me përfundimin 'vol'
në drejtorinë e lojës.
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | karaktere | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 56 | 4f | 4c | 20 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | V | O | L | . | . | . | . | . | . | . | . | . | . | . | . |
Kufiri | Lloji i të dhënave | Emri | Shpjegim |
---|---|---|---|
0x0000 | uint(32) | Bytes Magjike | |
0x0004 | uint(24) | Gjatësia e bllokut | |
0x0007 | uint(8) | Flamujt |
Koka e Volumeve
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | karaktere | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 76 | 6f | 6c | 68 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | v | o | l | h | . | . | . | . | . | . | . | . | . | . | . | . |
Kufiri | Lloji i të dhënave | Emri | Shpjegim |
---|---|---|---|
0x0000 | uint(32) | Bytes Magjike | |
0x0004 | uint(24) | Gjatësia e bllokut | |
0x0007 | uint(8) | Flamujt |
Koka e volumit nuk përmban asnjë të dhënë të dobishme.
Ajo shërben vetëm si një konteiner.
Si data e parë në kokën e volumit duhet të ndodhen vargjet e volumit; më pas vijnë informacionet mbi volumet.
Stringat e Volumit
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | karaktere | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 76 | 6f | 6c | 69 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | v | o | l | i | . | . | . | . | . | . | . | . | . | . | . | . |
Kufiri | Lloji i të dhënave | Emri | Shpjegim |
---|---|---|---|
0x0000 | uint(32) | Bytes Magjike | |
0x0004 | uint(24) | Gjatësia e bllokut | |
0x0007 | uint(8) | Flamujt |
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | karaktere | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 76 | 6f | 6c | 73 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | v | o | l | s | . | . | . | . | . | . | . | . | . | . | . | . |
Kufiri | Lloji i të dhënave | Emri | Shpjegim |
---|---|---|---|
0x0000 | uint(32) | Bytes Magjike | |
0x0004 | uint(24) | Gjatësia e bllokut | |
0x0007 | uint(8) | Flamujt | |
0x0008 | uint(32) | Gjatësia e ngarkesës | Tregon se sa byte të të dhënave të mëposhtme janë në të vërtetë të dhëna të dobishme. Të dhënat e mbetura të listës së vargjeve të volumit duket se janë të klasifikuara si mbeturina. Në skedarët me datë më të vonshme, këto 'të dhëna të mbetura' janë 0x00, gjë që mund të tregojë për mangësi me mjetet gjatë zhvillimit të lojës, pra që një zhvillues është kujdesur për inicializimin e saktë të tamponëve shumë vonë, pasi nuk ka ndikim në lojë nëse të dhënat janë të inicializuara apo jo. |
0x000c | uint(8)[] | Lista e emrave të skedarëve | Këtu kemi të bëjmë me një listë të emrave të skedarëve të terminuar në 0 byte, e cila - të paktën në këtë komponent të dhënash - pritet të përmbajë vetëm karaktere ASCII. Nuk është e nevojshme të shqyrtohet më thellë ky bllok të dhënash gjatë përpunimit të të dhënave, pasi në informacionet e volumit referohen drejtpërdrejt offsetet e emrave të skedarëve. |
Volume Strings janë një listë emrash dosjesh që janë të përfshira brenda volumit.
Informacione mbi volumet
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | karaktere | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 76 | 6f | 6c | 69 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | v | o | l | i | . | . | . | . | . | . | . | . | . | . | . | . |
Kufiri | Lloji i të dhënave | Emri | Shpjegim |
---|---|---|---|
0x0000 | uint(32) | Bytes Magjike | |
0x0004 | uint(24) | Gjatësia e bllokut | |
0x0007 | uint(8) | Flamujt |
Informacionet e volumit përmbajnë informacione më të detajuara rreth skedarëve. Ato përfaqësojnë në njëfarë mënyre një lloj ndryshimi të regjistrit të FAT (FAT = Tabela e Alokimit të Skedarëve).
Numri i skedarëve llogaritet duke ndarë madhësinë e bllokut me gjatësinë e regjistrave të direktorëve - 14 byte.
Regjistrat individualë të direktorëve kanë secili këtë strukturë:
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | karaktere | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Kufiri | Lloji i të dhënave | Emri | Shpjegim |
---|---|---|---|
0x0000 | uint(32) | Offseti i emrave të skedarëve | Shpreh se në cilin offset (!) brenda listes së emrave të skedarëve (string-jet e volumit) ndodhet emri i skedarit. Këtu i referohet fillimit të bllokut të të dhënave të përdorura. |
0x0004 | uint(32) | Offset-i i skedarit | Tregon se në cilin offset brenda tërë skedarit të volumit ndodhet skedari. |
0x0008 | uint(32) | Madhësia e skedarit | Shpjegon se sa e madhe është skedari në byte. |
0x000c | uint(16) | Flamuj? | Shumë gjasa ofron informacione shtesë mbi kodimin e skedarit.
|
Bloku i Volumit
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | karaktere | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 56 | 42 | 4c | 48 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | V | B | L | H | . | . | . | . | . | . | . | . | . | . | . | . |
Kufiri | Lloji i të dhënave | Emri | Shpjegim |
---|---|---|---|
0x0000 | uint(32) | Bytes Magjike | |
0x0004 | uint(24) | Gjatësia e bllokut | |
0x0007 | uint(8) | Flamujt |
Në një volum-blok, kemi të bëjmë me një kontejner, i cili përmban skedarë. Ai përmban vetëm një herë - për shkak të formatit të blokut - në mënyrë të tepërt madhësinë e skedarit dhe pas saj vijnë menjëherë të dhënat e përdorimit.
Plakate
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | karaktere | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 50 | 42 | 4d | 50 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | P | B | M | P | . | . | . | . | . | . | . | . | . | . | . | . |
Kufiri | Lloji i të dhënave | Emri | Shpjegim |
---|---|---|---|
0x0000 | uint(32) | Bytes Magjike | |
0x0004 | uint(24) | Gjatësia e bllokut | |
0x0007 | uint(8) | Flamujt |
Tiles janë një format specifik grafik Bitmap për Outpost-2. Ato shtrihen mbi 13 sets të tilesh, të quajtur "wells" (well0000.bmp
deri në well0012.bmp
), që ndodhen brenda volumit maps.vol.
Përveç kësaj, sets e tilesh / Wells përmbajnë sa vijon:
Emri i skedarit | Përmbajtja |
---|---|
well0000.bmp | Një grafikë blu me madhësi 32x32px - ideale si test për të parë nëse ngarkuesi i imazheve funksionon |
well0001.bmp | Përmban shkëmbinj të ndritshëm, male mbi shkëmbinj të ndritshëm dhe pa fund variante të kraterëve të goditjes në shkëmbinj të ndritshëm |
well0002.bmp | Përmban 'Doodads' shkëmbinj të ndritshëm - pra elementë që mund të vendosen për të zbukuruar (ose qëllimisht si strukturë, si për shembull muret) mbi shkëmbinj të ndritshëm, përfshirë edhe vegjetacionin |
well0003.bmp | Përmban një strukturë si krustë mbi shkëmbinj të ndritshëm |
well0004.bmp | Përmban shkëmbinj të errët, male mbi shkëmbinj të errët dhe pa fund variante të kraterëve të goditjes në shkëmbinj të errët |
well0005.bmp | Përmban 'Doodads' shkëmbinj të errët - pra elementë që mund të vendosen për të zbukuruar (ose qëllimisht si strukturë, si për shembull muret) mbi shkëmbinj të errët |
well0006.bmp | Përmban një strukturë si krustë mbi shkëmbinj të errët, si dhe kalime mes shkëmbinjve të ndritshëm dhe të errët |
well0007.bmp | Përmban lavë përfshirë 4-5 kadra të animacionit të saj |
well0008.bmp | Përmban rërë dhe pa fund variante të kraterëve të goditjes në rërë |
well0009.bmp | Përmban 'Doodads' rërë - pra elementë që mund të vendosen për të zbukuruar (ose qëllimisht si strukturë, si për shembull muret) mbi rërë |
well0010.bmp | Përmban 48 kalime nga rëra në shkëmbinj të ndritshëm dhe të errët |
well0011.bmp | Përmban kapakët polarë të hartës, me shkëmbinj të errët si bazë |
well0012.bmp | Përmban kapakët polarë të hartës, me shkëmbinj të ndritshëm si bazë |
Është e rekomandueshme për një implementim të saktë që Tiles të mos renderohen paraprakisht për t'i ruajtur ato në cache, pasi të dhënat për ciklin ditë/natë ende duhet të përpunohen - dhe do të krijoheshin shumë shumë të dhëna.
Tile-t janë grafika 8bpp me paletë të indeksuar me rezolucion 32x32 piksel, të cilat janë të rregulluara njëra mbi tjetrën. Në një set të tillë Tile-esh megjithatë mund të ketë shumë më tepër
Kontaineri kryesor përbëhet nga 2 seksione: head
dhe data
.
Koka e Pllakave
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | karaktere | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 68 | 65 | 61 | 64 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | h | e | a | d | . | . | . | . | . | . | . | . | . | . | . | . |
0x0010 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Kufiri | Lloji i të dhënave | Emri | Shpjegim |
---|---|---|---|
0x0000 | uint(32) | Bytes Magjike | |
0x0004 | uint(24) | Gjatësia e bllokut | |
0x0007 | uint(8) | Flamujt | |
0x0008 | uint(32) | Version / Flamuj? | Këtu mund të jetë një shenjë e versionit të formatit të skedarit; në të gjitha skedarët që kam në dispozicion, vlera ishte |
0x000c | uint(32) | Gjerësia (Zgjidhja horizontale) | Tregon se sa e gjerë është skedari i figurës (në piksel). Te të gjitha Wells në Outpost 2, këtu pritet vlera |
0x0010 | uint(32) | Lartësi (Zgjidhja vertikale) | Tregon se sa e lartë është skedari i imazhit (në piksel). Në të gjitha Wells nga Outpost 2, këtu pritet vlera |
0x0014 | uint(32) | Thellësia e ngjyrës? | Kuptimi i këtij vlerës është i panjohur. Pasi ai përmban vlerën |
0x0018 | uint(32) | Thellësia e ngjyrës 2? | Signifikanca e kësaj vlere është e panjohur. Ndoshta bëhet fjalë për një thellësi ngjyre 'qëllimi'. |
Pas këtyre të dhënave, do të ketë gjithashtu një skedë palete në formatin e standardizuar RIFF. Specifikimi i saktë mund të gjendet - duke qenë se paletat shfaqen edhe në vende të tjera - nën Paletat.
Të dhënat e pllakave
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | karaktere | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 64 | 61 | 74 | 61 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | d | a | t | a | . | . | . | . | . | . | . | . | . | . | . | . |
Kufiri | Lloji i të dhënave | Emri | Shpjegim |
---|---|---|---|
0x0000 | uint(32) | Bytes Magjike | |
0x0004 | uint(24) | Gjatësia e bllokut | |
0x0007 | uint(8) | Flamujt |
Fundamentalisht, ndjekin të dhënat e pastra të pikselëve, nga majtas-lart rresht pas rreshti drejt poshtë-djathtas.
Vlera e të dhënave në grafikat që zakonisht janë në formën e 8bpp-Bitmaps i korrespondon indeksit të ngjyrës në paletën e ngjyrave.
Engjina e lojës regjistron Tiles *mendohet* on-demand.
Kjo duket se është për shkak të ciklit ditë-natë, i cili njeh 32 nivele të ndryshme të Tiles. Duket se për vlerën e ndriçimit hiqet 'pak' nga ajo. Vlerat e sakta ende nuk janë përcaktuar, unë po punoj mbi bazën e llogaritjeve
v *= (daylight / 48) + 0.25;
me të dhënat HSV të pikselëve, ku daylight është një vlerë nga 0-31 dhe v është një vlerë midis 0-1. Përveç kësaj, duhet të merret parasysh se në hartë ekziston gjithashtu një kufi prej 16 Tiles majtas dhe djathtas (që shërben për spavimin e padukshëm të njësive).
Përveç kësaj, cikli ditë-natë për çdo cikël loje, duket se përditëson vetëm një kolonë të hartës.
Një cikël ditë-natë i përshpejtuar duket kështu:
PRT
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | karaktere | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 43 | 50 | 41 | 4c | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | C | P | A | L | . | . | . | . | . | . | . | . | . | . | . | . |
Kufiri | Lloji i të dhënave | Emri | Shpjegim |
---|---|---|---|
0x0000 | uint(32) | Bytes magjike | |
0x0004 | uint(24) | Gjatësia e paletave | Jep, përkundrazi ndaj formatit normal të bllokut, numrin e paletave që mund të gjejmë në këtë skedar - jo gjatësi e bllokut në byte. |
0x0007 | uint(8) | Flamujt | Probabil, si zakonisht, Flamuj. Megjithatë, nuk kam njohuri për asnjë flamur; pasi të gjitha vlerat që njoh janë |
Për çfarë qëllimi që qëndron PRT
saktësisht nuk e di; një mundësi mund të ishte 'Tabela e Paletave dhe Burimeve' - pasi që kjo skedar - e gjetur si op2_art.prt në maps.vol - është një e tillë, dhe kjo do ta përshkruante mjaft mirë funksionin e saj.
Ky skedar përmban një listë paletash, një tabelë mbi të gjitha bitmapet e përdorura, të gjitha definicionet e animacioneve dhe një sërë të dhënash të panjohura. Ai ndjek formatin e deritanishëm të kontejnerit në mënyrë të lirë, pasi jo të gjitha regjistrat i përmbahen këtij skeme.
Seksioni CPAL
(ndoshta që do të thotë kontejner paletesh) përfshin vetëm të dhënat e paletave, duke treguar se sa prej paletave 8-bit, zakonisht me madhësi 1052 byte, janë të pranishme.
Përsa i përket madhësisë 1052 byte, ajo nuk konsiderohet e detyrueshme, pasi formati i paletave mund të parashikojë madhësi të ndryshme paletash. Ajo vlen vetëm për fondin e të dhënave me të cilin dorëzohet Outpost 2.
Pas listave të paletave, menjëherë dhe pa një header fillestar, vjen lista e bitmap-eve; po ashtu, menjëherë pas saj ndjekin listat e animacioneve.
Të dyja fillojnë secila me një uint(32) (ose përsëri uint24+uint8 flamuj?) që përmban numrin e regjistrave.
Paletat
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | karaktere | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 50 | 50 | 41 | 4c | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | P | P | A | L | . | . | . | . | . | . | . | . | . | . | . | . |
Kufiri | Lloji i të dhënave | Emri | Shpjegim |
---|---|---|---|
0x0000 | uint(32) | Bytes Magjike | |
0x0004 | uint(24) | Gjatësia e paletave | Jepni, ndryshe nga formati normal i bllokut, numrin e paletave që mund të gjenden në këtë skedar - jo gjatësi e bllokut në byte. |
0x0007 | uint(8) | Flamujt | Me siguri, si zakonisht, Flamujt. Megjithatë, nuk kam njohuri për flamuj; pasi të gjithë vlerat e njohura për mua përputhen me |
Informacionet mbi paletat janë shumë të lehta për t'u lexuar.
Ato përbëhen secila nga një header dhe një segment të dhënash.
Header i Paletave
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | karaktere | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 68 | 65 | 61 | 64 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | h | e | a | d | . | . | . | . | . | . | . | . | . | . | . | . |
Kufiri | Lloji i të dhënave | Emri | Shpjegim |
---|---|---|---|
0x0000 | uint(32) | Bytes Magjike | |
0x0004 | uint(24) | Gjatësia e paletave | Jepni, ndryshe nga formati normal i bllokut, numrin e paletave që mund të gjenden në këtë skedar - jo gjatësi e bllokut në byte. |
0x0007 | uint(8) | Flamujt | Me siguri, si zakonisht, Flamujt. Megjithatë, nuk kam njohuri për flamuj; pasi të gjithë vlerat e njohura për mua përputhen me |
0x0008 | uint(32) | Versioni i formatit të paletave? | Definon ndoshta se cila version e formatit të paletave ndiqet nga paleta. Te gjitha paletat e Outpost2 duket se kanë versionin |
Të dhënat e paletave
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | karaktere | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 64 | 61 | 74 | 61 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | d | a | t | a | . | . | . | . | . | . | . | . | . | . | . | . |
Kufiri | Lloji i të dhënave | Emri | Shpjegim |
---|---|---|---|
0x0000 | uint(32) | Bytes Magjike | |
0x0004 | uint(24) | Gjatësia e bllokut | |
0x0007 | uint(8) | Flamujt |
Seksioni i të dhënave përfshin hyrjet individuale të paletave. Numri i hyrjeve të paletave llogaritet nga gjatësia e bllokut / 4.
Hyrjet individuale kanë këtë ndërtim të thjeshtë;
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | karaktere | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | 04 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Kufiri | Lloji i të dhënave | Emri | Shpjegim |
---|---|---|---|
0x0000 | uint(8) | Komponenta e kuqe | Përcakton përqindjen e kuqe të ngjyrës |
0x0001 | uint(8) | Komponenti i gjelbër | Shpreh pjesën e gjelbër të ngjyrës |
0x0002 | uint(8) | Komponenta blu | Jep përqindjen e ngjyrës blu |
0x0003 | uint(8) | Të panjohura - Flamuj? | Është e paqartë se çfarë do të thotë ky vlerë, pasi duket se është themelore |
Për paletat, mund të themi se për paletat që përdoren për animacione, vlen rregulli si më poshtë:
- Ngjyra e parë është GJITHMONË transparente, pavarësisht se çfarë vlere është dhënë atje.
-
Përcaktimet e paletave 1-24 konsiderohen si ngjyra lojtari në paletat 1-8.
Ku vijnë ngjyrat përveç lojtarit 1, nuk më është e qartë.
Unë mendoj se ngjyrat e tjera janë hardcoded.
Bitmaps
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | karaktere | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
0x0010 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Kufiri | Lloji i të dhënave | Emri | Shpjegim |
---|---|---|---|
0x0000 | uint(32) | Gjerësia e orientuar | Jep gjerësinë e rreshtave të të dhënave në piksel në byte - pasi këto janë të orientuara në kufij 4-byte. Kështu është e lehtë të skedosh një rresht të caktuar të imazhit. Pse kjo vlerë ruhet ndaras, megjithëse mund të llogaritet, nuk është e qartë. |
0x0004 | uint(32) | Offset | Tregon offsetin e rreshtit të parë në bitmap |
0x0008 | uint(32) | Lartësi | Jep lartësinë e imazhit në pikselë |
0x000c | uint(32) | Gjerësi | Tregon gjerësinë e imazhit në piksel |
0x0010 | uint(16) | Lloji | Jep llojin e imazhit. Këtu duket se bëhet fjalë për një maskë bit:
|
0x0012 | uint(16) | Paleta | Definon se cila paletë nga skedari PRT duhet të përdoret |
Kjo strukturë të dhënash e skedarit PRT tregon se si janë ndërtuar bitmapet e përdorura për spritet. Këto bitmapet shërbejnë si një komponent i vetëm, nga i cili shumë janë bashkuar për të formuar një kornizë animacioni të një sprite.
Të dhënat specifike të imazhit fshihen në op2_art.BMP në direktorinë e lojës.
Pse ky skedar bitmap ka një (në tërësi të saktë) header RIFF-Bitmap, nuk është e qartë. Ndoshta Outpost 2 përdor API-të e sistemit për të ngarkuar grafikët, duke e marrë përkohësisht këtë header dhe duke e mbishkruar fushat përkatëse, të ndryshme.
Të dhënat e pikselëve ndodhen në skedarin BMP në pozitën Offset + uint32-Offset, e cila mund të gjendet në skedarin BMP në adresën 0x000A (offseti i të dhënave RIFF-Bitmap), dhe përsëri përputhen me renditjen rresht pas rreshti nga maja e majtë në të poshtme të djathtë.
Grafikat monochrome 1bpp mund të vizatohen në mënyrë që ngjyra 0 të jetë transparencë e plotë, ndërsa ngjyra 1 të jetë një e zezë/gri gjysmë transparente, pasi grafikat monochrome përdoren zakonisht për hijet e automjeteve dhe ndërtesave në animacione.
Kështu, mund të përbëhen shumë grafika.
Animacionet
Tani po kalojmë në klasën mbretërore të disiplinave brenda formateve të të dhënave të Outpost 2:
Animacionet.
Listat e animacioneve fillojnë me një header global, i cili shërben kryesisht për verifikimin e të dhënave. Pas tij vijnë definicionet konkrete të animacioneve, të cilat ndahen në 3 nivele:
-
Animacioni
Një animacion është instanca kryesore; ai paraqet një animacion të një njësie, një ndërtese ose një 'animacion partikulesh' (rënia e kometave, moti, shpërthimi) në një situatë të caktuar. -
Frame
Një frame është një imazh i vetëm brenda një animacioni. Një animacion mund të përmbajë një ose më shumë frame. -
Subframe
Një subframe është informacioni që tregon se një bitmap e caktuar duhet të tërhiqet në një pozicion të caktuar të një frame nën kritere të caktuara. Një frame mund të përmbajë një ose më shumë subframe.
Pas kësaj, ndjekin direkt definicionet e veçanta të animacioneve.
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | karaktere | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Kufiri | Lloji i të dhënave | Emri | Shpjegim |
---|---|---|---|
0x0000 | uint(32) | Numri i animacioneve | Sa shumë të dhëna animacionesh ekzistojnë |
0x0004 | uint(32) | Numri i kuadrove | Sa shumë kuadro duhet të jenë gjithsej |
0x0008 | uint(32) | Numri i subframe-ve | Sa shumë subframe duhet të jenë gjithsej |
0x000c | uint(32) | Numri i hyrjeve opcionale | Sa "shënime opsionale" ka. |
Animacion
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | karaktere | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
0x0010 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
0x0020 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Kufiri | Lloji i të dhënave | Emri | Shpjegim |
---|---|---|---|
0x0000 | uint(32) | Të panjohur 1 | Informacione të panjohura |
0x0004 | uint(32) | Kuti Kufizuese: Majtas | Jep fillimin e majtë (në piksel) të Bounding Box. |
0x0008 | uint(32) | Kuti Kufizuese: Lart | Jepni fillimin e sipërm (në piksel) të Bounding Box. |
0x000c | uint(32) | Kuti Kufizuese: Gjerësi | Jep gjerësinë (në piksel) të Bounding Box. |
0x0010 | uint(32) | Kuti kufizuese: Lartësia | Jep lartësinë (në piksel) të Bounding Box. |
0x0014 | uint(32) | Offset: X | Jepni qendrën horizontale të animacionit |
0x0018 | uint(32) | Offset: Y | Tregon qendrën vertikale të animacionit |
0x001c | uint(32) | I panjohur 2 | Informacion i panjohur |
0x0020 | uint(32) | Numri i kuadrove | Tregon se sa korniza animacionesh përmban kjo animacion |
0x0024 | uint(32) | Numri i Dritareve | Tregon se sa dritare duhet të përdoren gjatë vizatimit |
Të dhënat e shtresës së sipërme, të animacionit, janë kryesisht të dhëna administrative - Boundingbox përfaqëson koordinatat e shenjës rreth automjetit/ndërtesës, kwhen e njëjta është e zgjedhur dhe gjithashtu tregon se cili rajon duhet të jetë i klikueshëm.
Offset-i përcakton kryesisht "pikën zero"; pikën, e cila duhet të llogaritet ose të hiqet nga koordinatat e brendshme të lojës. Mund të thuhet gjithashtu në mënyrë matematikore: offset-i përfaqëson këtu origjinën e koordinatave.
Windows-t janë, ashtu si offset-i, çdo herë (për secilën window) 4 vlera uint(32), të cilat tregojnë një rajon të cilin e konsiderojmë të përdorshëm për subframe të veçanta. Jashtë Windows-ve, nuk lejohet, përveç nëse është e parashikuar për Bitmap-in, të bëhet vizatim.
Kornizë
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | karaktere | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Kufiri | Lloji i të dhënave | Emri | Shpjegim |
---|---|---|---|
0x0000 | uint(8) | Numri i subframe-ve dhe Toggle për Opsional 1, 2 | Ky vlerë përmban:
|
0x0001 | uint(8) | I panjohur 1 dhe Ndrysho për Opsionale 3, 4 | Ky vlerësim përmban:
|
0x0002 | uint(8) | Opsionale 1 | I panjohur |
0x0003 | uint(8) | Opsionale 2 | I panjohur |
0x0004 | uint(8) | Opsionale 3 | I panjohur |
0x0005 | uint(8) | Opcionale 4 | I panjohur |
Subkornizë
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | karaktere | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Kufiri | Lloji i të dhënave | Emri | Shpjegim |
---|---|---|---|
0x0000 | uint(16) | Bitmap-Id | Tregon se cila Bitmap duhet të përdoret për këtë Subframe |
0x0002 | uint(8) | Të panjohur 1 | Është e panjohur - megjithatë, unë dyshoj fort se bëhet fjalë për një prioritet renderimi (Z-Layer). |
0x0003 | uint(8) | Subframe-Id | Tregon se në cilin nën-kornizë ndodhemi |
0x0004 | sint(16) | Offset - Horizontal | Specifikon se ku brenda frames duhet të vendoset subframe, ose sa piksel duhet të zhvendoset bitmap-i horizontalisht. |
0x0006 | sint(16) | Offset - Vertikalisht | Tregon se ku brenda frames duhet të vendoset subframe, ose për sa shumë pikselë duhet të zhvendoset bitmap vertikalisht |
Kështu mund të përbëjmë tani korniza të veçanta, si dhe animacione të plota, këtu një shembull në një animacion më kompleks, animacioni me indeks 500, demonstruar
Animacioni 500
Animacioni 500 tregon si një transportues Plymouth, i ngarkuar me mineral të zakonshëm, shkarkohet. Kjo është një nga animacionet e pakta që përdor funksionalitetin e Windowing.
Dhe kështu mund të bashkohen të gjithë animacionet.
Për fat të keq, ka ende një problem me hapjen e sipërme të ngarkesës, pasi këtu biti përkatës në informacionin e llojit të grafikës nuk është vendosur.
Këtu ka disa sprite të tjera, të animuara mrekullisht nga loja:
Ndërfaqja e Përdoruesit
Tani na mungon ndërfaqja e përdoruesit të lojës, e cila është në një stil metali të fërkuar.
Por gjithashtu këtu është e dukshme se Dynamix nuk kishte nevojë ta shpikë përsëri rrotën; këtu nuk përdoren thjesht API-të User32 dhe GDI32 të ofruara nga Windows - veçanërisht përdoret edhe menaxhimi i burimeve nga User32.
Këto mund të nxirren, për shembull, përmes programeve si Resource Hacker, e zhvilluar si freeware nga Angus Johnson, ose - nëse dikush heziton të përdorë Wine në Linux / Mac OS - me ndihmën e wrestool, e përfshirë në icoutils.
Emri i skedarit | Përmbajtja |
---|---|
Outpost2.exe | Përmban vetëm ikonën e lojës, e cila tregon stacionin hapësinor para New Terra |
op2shres.dll | Përmban, përveç grafikave për elementet e kontrollit si kufizime, butona, butona radio dhe kutia kontrolli, edhe sfondet e dialogut, imazhet shoqëruese për tekstet e misioneve të historisë dhe grafikën e sfondit të menusë kryesore |
out2res.dll | Përmban dekorimin e dritareve në lojë, ikona për metal të zakonshëm dhe të veçantë, ekranin e ngarkesës, grafikë për dialogët si dhe grafika të tjera për kursorët, përveç atyre të animuara në dosjen e lojës |