Formatet e skedarëve të Outpost 2 · bei.pm

Ky tekst u përkthye automatikisht nga OpenAI GPT-4o Mini.

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.

Artizmi i lojës

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:

  • 0x204C4F56 ('VOL '):
    Vëllimi
  • 0x686C6F76 ('VOLH'):
    Header-i i Vëllimit
  • 0x736C6F76 ('VOLS'):
    Strings të Vëllimit
  • 0x696C6F76 ('VOLI'):
    Informacionet e Vëllimit
  • 0x4B4C4256 ('BLCK'):
    Blloku i Vëllimit
  • 0x504D4250 ('PBMP'):
    Të dhënat grafike
  • 0x4C415050 ('PPAL'):
    Paleta e Ngjyrave
  • 0x4C415043 ('CPAL'):
    Container-i i Paletave të Ngjyrave
  • 0x64616568 ('head'):
    Header-i
  • 0x61746164 ('data'):
    Të dhënat e përdoruesit
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.

  • 0x03 është vendosur, kur skedari është i kompresuar. Këtu duket se përdoret një pemë Huffman.
  • 0x80 duket se është gjithmonë e vendosur.

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 0x02

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 0x20 ose 32.

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 0x20 ose 32.

0x0014 uint(32) Thellësia e ngjyrës?

Kuptimi i këtij vlerës është i panjohur.

Pasi ai përmban vlerën 8 në të gjitha skedarët e kontrolluar, mund të jetë një tregues i thellësisë së ngjyrave.

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.

Të dhënat e pikselëve fillojnë nga majtas lart dhe përfundojnë poshtë djathtas.

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:

Visualizimi i ciklit ditë-natë

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ë 0x00, është gjithashtu potencialisht e mundur që numri i paletave të jetë thjesht një uint(32).

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.prtmaps.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 0x00, është gjithashtu potencialisht e mundur që numri i paletave të jetë thjesht një uint(32).

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 0x00, është gjithashtu potencialisht e mundur që numri i paletave të jetë thjesht një uint(32).

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 0x01.

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 0x04.

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.

Referenca e paletave

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ë.
Mund të jetë një optimizim për kodin e renderimit.

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:

  • 0x04 është vendosur, nëse bëhet fjalë për një grafik 1bpp.
  • 0x40 është vendosur, nëse bëhet fjalë për një grafik që duhet të zbatojë Windows.
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.

Moduli i mbrojtur të banesave (Plymouth)

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:

  1. 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.
  2. Frame
    Një frame është një imazh i vetëm brenda një animacioni. Një animacion mund të përmbajë një ose më shumë frame.
  3. 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:

  • 0x7F (Maska e bitëve): Numri i subframe-ve që përdoren në këtë frame
  • 0x80: Informacioni nëse Opcional 1 dhe 2 janë të pranishme
0x0001 uint(8) I panjohur 1 dhe Ndrysho për Opsionale 3, 4

Ky vlerësim përmban:

  • 0x7F (Maska e bitëve): E panjohur - Kam dyshime të forta se kjo është numri i Gameticks që kalojnë deri sa të shfaqet kadri i ardhshëm
  • 0x80: Informacion mbi praninë e Opsionalit 3 dhe 4
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:

Rendering i Animacionit 500 ilustruar

Animacioni 500 i përfunduar dhe i bashkuar

Fabrika e Ndërtesave Plymouth

Porti Koestar Eden

Qendra Mjekësore Eden

SCAT

Porti Koestar Plymouth

Easteregg:
Shën Nënë Tereza

Easteregg:
Qeni i Dansit

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