Outpost 2 failų formatas · bei.pm

Šis tekstas buvo automatiškai išverstas naudojant OpenAI GPT-4o Mini.

Šioje svetainėje aprašyti failų formatai remiasi technine Dynamix, Inc. ir Sierra Entertainment intelektualinio turto analize.
Intelektualusis turtas šiuo metu yra Activision Publishing, Inc. / Activision Blizzard, Inc. nuosavybė ir šiuo metu priklauso Microsoft Corp..

Informacija buvo surinkta naudojant atvirkštinį inžineriją ir duomenų analizę archyvavimo ir istorinių duomenų tarpusavio suderinamumo tikslais.
Nebuvo naudojamos jokios nuosavybės ar konfidencialios specifikacijos.

Žaidimą šiuo metu galima įsigyti kaip atsisiuntimą gog.com.

Žaidimo meno kūrinys

Ši straipsnių serija dokumentuoja mano žinias apie duomenų formatus realaus laiko strategijos žaidime "Outpost 2: Divided Destiny", kuris 1997 metais buvo išleistas Sierra ir sukurtas Dynamix.

Aš daugiausia analizavau žaidimo duomenis ir kaip jie yra naudojami nuo 2015 m. lapkričio 1 d. iki 2015 m. lapkričio 14 d.

Pagal iki šiol gautą informaciją, Dynamix - kaip ir dauguma komercinių įmonių - sukūrė kai kuriuos duomenų formatus ne specialiai "Outpost 2", bet taip pat naudojo kitose plėtros srityse, pavyzdžiui, Mechwarrior serijoje (modifikuotai).
Be to, galima pastebėti, kad duomenų formatų inovatyvumas praktiškai yra ribotas ir dažnai remiasi ilgalaikiais koncepcijomis iš įprastų formatų, tokių kaip JFIF ir RIFF.

Daugiau informacijos apie lentelėse ir duomenų formatuose pateikiamą informaciją rasite Kas yra kas?.
Čia pateikti duomenys paprastai yra suprantami kaip Little Endian.

Galima pasakyti, kad atvirkštinis inžineravimas buvo labai smagus, nors ir nevisiškas.
Žinoma, taip pat rekomenduoju žaisti patį žaidimą, nes jis siūlo įdomias žaidimo mechanikas.

Įvadas

Outpost 2 naudojami duomenų formatai turi struktūrą, primenančią JFIF / PNG - kiekvienas duomenų blokas visuomet turi 8 baitų antraštę. Dėl to aš taupysiu savo laiką ir nesirašysiu apie atskiras antraštes atitinkamose specifinėse vietose, o dokumentuosiu tik nuokrypius.

Formatas visada yra toks; tikrieji naudingi duomenys jame yra įterpti:

Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF simboliai
0x0000 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
Ofsetas Duomenų tipas Pavadinimas Paaiškinimas
0x0000 uint(32) Magic Bytes

Informacija apie tai, ko galima tikėtis kitame duomenų bloke.

Žinomi vertės:

  • 0x204C4F56 ('VOL '):
    Garso takelis
  • 0x686C6F76 ('VOLH'):
    Garso takelio antraštė
  • 0x736C6F76 ('VOLS'):
    Garso takelio eilutės
  • 0x696C6F76 ('VOLI'):
    Garso takelio informacija
  • 0x4B4C4256 ('BLCK'):
    Garso takelio blokas
  • 0x504D4250 ('PBMP'):
    Grafikos duomenys
  • 0x4C415050 ('PPAL'):
    Spalvų paletė
  • 0x4C415043 ('CPAL'):
    Spalvų paletės konteineris
  • 0x64616568 ('head'):
    Antraštė
  • 0x61746164 ('data'):
    Naudojami duomenys
0x0004 uint(24) Bloko ilgis

Ši informacija nurodo, kiek baitų yra tolimesniame duomenų bloke.

Čia kalbama apie grynus duomenis - 8 antraštės baitai į tai neįtraukti.

0x0007 uint(8) Vėliavos?

Nežinoma, kam tiksliai tarnauja šis blokas.

Apimtyse ši vertė dažnai yra 0x80, kitose bylose dažnai 0x00. Tai rodo, kad tai gali būti vėliavų rinkinys.

Apimtis

Tūriniai yra duomenų konteineriai žaidimui, panašūs į archyvų formatą, pavyzdžiui, Tarball. Mažiausiai „Outpost 2“ šis formatas žino tik failus - jokių aplankų. Galima būtų juos simuliuoti naudodamiesi atitinkamais failų pavadinimais.

Tūrinys susideda iš tūrinio antraštės ir kelių tūrinio blokų, kurie atitinka konkrečius failus.

„Tūriniai“ yra failai su plėtiniu 'vol' žaidimo kataloge.

Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF simboliai
0x0000 56 4f 4c 20 -- -- -- -- -- -- -- -- -- -- -- -- V O L . . . . . . . . . . . .
Ofsetas Duomenų tipas Pavadinimas Paaiškinimas
0x0000 uint(32) Magijos baitai
0x0004 uint(24) Bloko ilgis
0x0007 uint(8) Vėliavos

Apimtis

Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF simboliai
0x0000 76 6f 6c 68 -- -- -- -- -- -- -- -- -- -- -- -- v o l h . . . . . . . . . . . .
Ofsetas Duomenų tipas Pavadinimas Paaiškinimas
0x0000 uint(32) Magijos baitai
0x0004 uint(24) Bloko ilgis
0x0007 uint(8) Vėliavos

Apimties antraštėje nėra jokių naudotojų duomenų.
Ji tarnauja tik kaip konteineris.

Pirmieji duomenys apimties antraštėje turėtų būti apimties eilutės; po to seka apimties informacija.

Garso eilutės

Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF simboliai
0x0000 76 6f 6c 69 -- -- -- -- -- -- -- -- -- -- -- -- v o l i . . . . . . . . . . . .
Ofsetas Duomenų tipas Pavadinimas Paaiškinimas
0x0000 uint(32) Magijos baitai
0x0004 uint(24) Bloko ilgis
0x0007 uint(8) Vėliavos
Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF simboliai
0x0000 76 6f 6c 73 -- -- -- -- -- -- -- -- -- -- -- -- v o l s . . . . . . . . . . . .
Ofsetas Duomenų tipas Pavadinimas Paaiškinimas
0x0000 uint(32) Magijos baitai
0x0004 uint(24) Bloko ilgis
0x0007 uint(8) Vėliavos
0x0008 uint(32) Krovinių ilgis

Nurodo, kiek baitų iš šių duomenų iš tikrųjų yra naudingų duomenų.

Likę duomenys iš tūrio eilutės sąrašo akivaizdžiai laikytini šalutiniais duomenimis.

Savo data vėlesniuose failuose šie 'likę duomenys' yra 0x00, kas gali rodyti įrankių grandinės trūkumus žaidimo kūrimo metu, t. y. kad kūrėjas pasirūpino teisingu buferių inicializavimu tik labai vėlai, nes tai neturi įtakos žaidimui, ar duomenys yra inicializuoti, ar ne.

0x000c uint(8)[] Failų pavadinimų sąrašas

Čia kalbama apie 0 baitų terminą turinčią failų pavadinimų sąrašą, kuris - bent jau esamame duomenų rinkinyje - leidžia tikėtis tik ASCII simbolių.

Duomenų bloką nereikia detaliau analizuoti, nes tūrio informacijoje tiesiogiai nurodomi failų pavadinimų ofsetai.

Tūrinio eilutėse pateikiama failų, esančių tūryje, pavadinimų sąrašas.

Apimtis informacija

Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF simboliai
0x0000 76 6f 6c 69 -- -- -- -- -- -- -- -- -- -- -- -- v o l i . . . . . . . . . . . .
Ofsetas Duomenų tipas Pavadinimas Paaiškinimas
0x0000 uint(32) Magijos baitai
0x0004 uint(24) Bloko ilgis
0x0007 uint(8) Vėliavos

Apimties informacija teikia detalesnę informaciją apie failus. Tai tam tikra prasme yra panaši į FAT katalogo įrašą (FAT = Failų paskirstymo lentelė).

Failų skaičius gaunamas padalijus blokų dydį iš katalogo įrašų ilgio - 14 baitų.

Kiekvienas katalogo įrašas turi tokį patį struktūrą:

Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF simboliai
0x0000 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
Ofsetas Duomenų tipas Pavadinimas Paaiškinimas
0x0000 uint(32) Failų pavadinimo poslinkis

Nurodo, kuriame ofsete (!) failų pavadinimų sąraše (tūrinių grandžių) randamas failo pavadinimas.

Tai susiję su duomenų bloko pradžia.

0x0004 uint(32) Failo ofsetas

Nurodo, kuriame poskyryje visoje tūrinio faile yra ši byla.

0x0008 uint(32) Failo dydis

Nurodo, kokio dydžio byla baitais.

0x000c uint(16) Vėliavos?

Atrodo, kad teikia papildomos informacijos apie failo kodavimą.

  • 0x03 yra nustatytas, kai failas yra kompresuotas. Čia matyt naudojamas Huffmano medis.
  • 0x80 atrodo, kad visada yra nustatytas.

Apimties blokas

Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF simboliai
0x0000 56 42 4c 48 -- -- -- -- -- -- -- -- -- -- -- -- V B L H . . . . . . . . . . . .
Ofsetas Duomenų tipas Pavadinimas Paaiškinimas
0x0000 uint(32) Magijos baitai
0x0004 uint(24) Bloko ilgis
0x0007 uint(8) Vėliavos

Volume blokas yra konteineris, kuriame saugomos bylos. Jame dar kartą - dėl bloko formato - reduntantiškai pateikiama failo dydis, o po to tiesiogiai seka naudingi duomenys.

Tinkleliai

Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF simboliai
0x0000 50 42 4d 50 -- -- -- -- -- -- -- -- -- -- -- -- P B M P . . . . . . . . . . . .
Ofsetas Duomenų tipas Pavadinimas Paaiškinimas
0x0000 uint(32) Magijos baitai
0x0004 uint(24) Bloko ilgis
0x0007 uint(8) Vėliavos

Tiles yra Outpost-2 specifinis bitmap grafikos formatas. Jie apima 13 tilesetų, "well" vadinamų (well0000.bmp iki well0012.bmp), kuriuos galima rasti tūryje maps.vol.

Tilesetai / Wells apima šiuos elementus:

Failo pavadinimas Turinys
well0000.bmp 32x32px dydžio mėlyna grafika - ideali testui, ar veikia jūsų vaizdų įkėlėjas
well0001.bmp Turinys šviesios uolienos, kalnų grandinės ant šviesios uolienos ir nesuskaičiuojamos kraterių variacijos šviesioje uolienoje
well0002.bmp Turinys šviesios uolienos 'Doodads' - elementai, kurie gali būti naudojami šviesios uolienos dekoravimui (arba sąmoningai kaip struktūros, pavyzdžiui, sienos), įskaitant ir augmeniją
well0003.bmp Turinys šviesios uolienos plokščia struktūra
well0004.bmp Turinys tamsios uolienos, kalnų grandinės ant tamsios uolienos ir nesuskaičiuojamos kraterių variacijos tamsioje uolienoje
well0005.bmp Turinys tamsios uolienos 'Doodads' - elementai, kurie gali būti naudojami tamsios uolienos dekoravimui (arba sąmoningai kaip struktūros, pavyzdžiui, sienos)
well0006.bmp Turinys tamsios uolienos plokščia struktūra, taip pat perėjimai tarp šviesios ir tamsios uolienos
well0007.bmp Turinys lava, įskaitant 4-5 animacijos kadrus
well0008.bmp Turinys smėlio ir nesuskaičiuojamos kraterių variacijos smėlyje
well0009.bmp Turinys smėlio 'Doodads' - elementai, kurie gali būti naudojami smėlio dekoravimui (arba sąmoningai kaip struktūros, pavyzdžiui, sienos)
well0010.bmp Turinys 48 perėjimų nuo smėlio iki šviesios ir tamsios uolienos
well0011.bmp Turinys žemėlapio poliarinės kepurės, su tamsia uoliena kaip pagrindu
well0012.bmp Turinys žemėlapio poliarinės kepurės, su šviesia uoliena kaip pagrindu

Patartina, kad tiksliai įgyvendinti, nereikėtų iš anksto renderinti plytelių, kad jas būtų galima talpinti, nes duomenys dienos/nakties ciklui dar turi būti apdoroti - ir tai sukeltų labai daug duomenų.

Plyteles sudaro 8bpp grafika su indeksuojama palete, kurių kiekvienos raiška yra 32x32 pikseliai ir jos yra išdėstytos viena šalia kitos. Tačiau tokioje sukurtame plytelių rinkinyje gali būti daug daugiau.

Pagrindinis konteineris susideda iš 2 sekcijų: head ir data.

Keraminių plytelių antraštė

Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF simboliai
0x0000 68 65 61 64 -- -- -- -- -- -- -- -- -- -- -- -- h e a d . . . . . . . . . . . .
0x0010 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
Ofsetas Duomenų tipas Pavadinimas Paaiškinimas
0x0000 uint(32) Magijos baitai
0x0004 uint(24) Bloko ilgis
0x0007 uint(8) Vėliavos
0x0008 uint(32) Versija / Vėliavos?

Šiuo atveju tai gali būti failo formato versijos nurodymas; visuose man prieinamuose failuose čia buvo nurodyta reikšmė 0x02

0x000c uint(32) Plotis (horizontalioji rezoliucija)

Nurodo, kiek pločio yra vaizdo failas (pikseliais).

Visiems Wells iš Outpost 2 čia bus tikėtinas vertė 0x20 arba 32.

0x0010 uint(32) Aukštis (vertikali rezoliucija)

Indikuoja, koks yra vaizdo failo aukštis (pikseliais).

Visiems Outpost 2 šuliniams čia bus tikimasi vertės 0x20 arba 32.

0x0014 uint(32) Spalvų gylis?

Šios reikšmės reikšmė nėra žinoma.

Kadangi jis visuose patikrintuose failuose turi reikšmę 8, tai gali būti spalvų gylio nurodymas.

0x0018 uint(32) Spalvų gylis 2?

Šios reikšmės prasmė nežinoma.

Galbūt tai yra 'tikslo' spalvų gylis.

Pagal šiuos duomenis dar bus pateikta paletės failas, esantis standartizuotame RIFF formate. Tiksli specifikacija yra - kadangi paletės pasirodo ir kitur - Paletėse.

Šalti duomenys

Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF simboliai
0x0000 64 61 74 61 -- -- -- -- -- -- -- -- -- -- -- -- d a t a . . . . . . . . . . . .
Ofsetas Duomenų tipas Pavadinimas Paaiškinimas
0x0000 uint(32) Magijos baitai
0x0004 uint(24) Bloko ilgis
0x0007 uint(8) Vėliavos

Galiausiai seka gryni pikselių duomenys, nuo kairės viršaus po eilutę į dešinę apačią.
Duomenų vertė grafiko, kuris paprastai pateikiamas kaip 8bpp bitmap, atitinka spalvos indeksą spalvų paletėje.

Pikselių duomenys prasideda iš viršaus kairėje ir baigiasi apačioje dešinėje.

Žaidimo variklis, matyt, atvaizduoja plyteles *pagal poreikį*.
Tai, be kita ko, atrodo, yra susiję su dienos-nakties ciklu, kuris žino 32 atskiras plytelių pakopas. Akivaizdu, kad nuo ryškumo vertės kiekvieną kartą 'šiek tiek' atimama. Tikslių vertybių dar nepavyko nustatyti, dirbu pagal skaičiavimo pagrindą

v *= (daylight / 48) + 0.25;

su pikselių HSV duomenimis, kur daylight yra vertė nuo 0 iki 31, o v yra vertė nuo 0 iki 1. Taip pat reikėtų atsižvelgti į tai, kad žemėlapyje kiekvienoje pusėje yra 16 plytelių kraštas (tai naudojama nematomam vienetų atsiradimui).

Priedo, dienos-nakties ciklas kiekviename žaidimo cikle atnaujina tik vieną žemėlapio stulpelį.
Paspartintas dienos-nakties ciklas atrodo taip:

Dienos-nakties ciklo vizualizacija

PRT

Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF simboliai
0x0000 43 50 41 4c -- -- -- -- -- -- -- -- -- -- -- -- C P A L . . . . . . . . . . . .
Ofsetas Duomenų tipas Pavadinimas Paaiškinimas
0x0000 uint(32) Magijos baitai
0x0004 uint(24) Paletės ilgis

Nurodo paletėms šioje byloje, o ne bloko ilgį baitais, priešingai nei įprastame bloko formate.

0x0007 uint(8) Vėliavos

Greiciausiai, kaip įprasta, vėliavos.

Tačiau man nėra žinomų vėliavų; kadangi visi man žinomi vertės atitinka 0x00, galbūt galėtų būti, kad paletės skaičius tiesiog yra uint(32).

Ką tiksliai reiškia PRT, man nežinoma; galėtų būti pavyzdžiui 'Paletė ir Išteklių Lentelė' - nes šiame faile, randamame kaip op2_art.prt maps.vol, yra tokia informacija, arba tai gana gerai apibūdintų funkciją.

Šis failas apima paletėse esančių duomenų sąrašą, lentelę su visomis naudojamomis bitmap’ais, visas animacijų apibrėžtis ir dar daugybę nežinomų duomenų. Jis laisvai seka ankstesnį konteinerio formatą, kadangi ne visi įrašai atitinka šią schemą.

CPAL skyrius (greičiausiai reiškia paletės konteinerį) apima tik paletės duomenis, nurodydamas, kiek yra įprastai 1052 baitų dydžio 8-bitų paletė.

1052 baitų nurodymas nelaikomas privalomu, kadangi paletės formatas potencialiai gali turėti skirtingus paletės dydžius. Jis galioja tik duomenų rinkiniui, su kuriuo „Outpost 2“ pristatomas.

Po paletėse esančių sąrašų nedelsiant ir be įžanginio antraštės seka bitmap’ų sąrašas; taip pat nedelsiant po to seka animacijų sąrašai.
Abi sekos prasideda su uint(32) (arba vėl uint24 + uint8 žymenys?) nurodydamos įrašų skaičių.

Paletės

Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF simboliai
0x0000 50 50 41 4c -- -- -- -- -- -- -- -- -- -- -- -- P P A L . . . . . . . . . . . .
Ofsetas Duomenų tipas Pavadinimas Paaiškinimas
0x0000 uint(32) Magijos baitai
0x0004 uint(24) Palletės ilgis

Nurodo paletės skaičių, randamą šiame faile, o ne bloko ilgį baitais, skirtingai nei įprastame bloko formate.

0x0007 uint(8) Vėliavos

Greitai, kaip įprasta, vėliavos.

Tačiau man nėra žinomų vėliavų; kadangi visi man žinomi vertės atitinka 0x00, taip pat galėtų būti, kad paletės skaičius paprasčiausiai būtų uint(32).

Informacija apie paletes yra labai lengvai skaitoma.
Ji sudaryta iš antraštės ir duomenų segmento.

Paletės antraštė

Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF simboliai
0x0000 68 65 61 64 -- -- -- -- -- -- -- -- -- -- -- -- h e a d . . . . . . . . . . . .
Ofsetas Duomenų tipas Pavadinimas Paaiškinimas
0x0000 uint(32) Magijos baitai
0x0004 uint(24) Palletės ilgis

Nurodo paletės skaičių, randamą šiame faile, o ne bloko ilgį baitais, skirtingai nei įprastame bloko formate.

0x0007 uint(8) Vėliavos

Greitai, kaip įprasta, vėliavos.

Tačiau man nėra žinomų vėliavų; kadangi visi man žinomi vertės atitinka 0x00, taip pat galėtų būti, kad paletės skaičius paprasčiausiai būtų uint(32).

0x0008 uint(32) Paletės formato versija?

Greičiausiai apibrėžia, kuriai paletės formato versijai paletė priklauso.

Visos Outpost2 paletės atrodo turi versiją 0x01.

Paletų duomenys

Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF simboliai
0x0000 64 61 74 61 -- -- -- -- -- -- -- -- -- -- -- -- d a t a . . . . . . . . . . . .
Ofsetas Duomenų tipas Pavadinimas Paaiškinimas
0x0000 uint(32) Magijos baitai
0x0004 uint(24) Bloko ilgis
0x0007 uint(8) Vėliavos

Duomenų skyrius apima atskirus paletės įrašus. Paletės įrašų skaičius priklauso nuo blokų ilgio / 4.

Atskirų įrašų struktūra yra tokia paprasta;

Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF simboliai
0x0000 -- -- -- 04 -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
Ofsetas Duomenų tipas Pavadinimas Paaiškinimas
0x0000 uint(8) Raudonos komponentės

Nurodo raudonos spalvos dalį

0x0001 uint(8) Žalia komponentė

Nurodo žalios spalvos dalį

0x0002 uint(8) Mėlynos komponentas

Nurodo mėlynos spalvos dalį

0x0003 uint(8) Nežinomas - Vėliavos?

Nepaisant to, kas šis skaičius reiškia, atrodo, kad jis iš esmės yra 0x04.

Apie paletes dar galima pasakyti, kad animacijoms naudojamoms paletėms galioja šios taisyklės:

  • Pirmasis spalvos elementas VISADA yra skaidrus, nesvarbu, koks ten nurodytas vertė.
  • Paletės įrašai 1-24 yra laikomi žaidėjo spalvomis paletėse 1-8.
    Kur tos spalvos, išskyrus žaidėjo 1, tiksliai kyla, man neaišku.
    Aš spėju, kad likusios spalvos yra įrašytos kodo viduje

Paletės nuoroda

Bitmapai

Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF simboliai
0x0000 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
0x0010 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
Ofsetas Duomenų tipas Pavadinimas Paaiškinimas
0x0000 uint(32) Išdėstyta plotis

Nurodo pikselių duomenų eilučių plotį baitais - kadangi jos yra suorientuotos pagal 4 baitų ribas.

Tai leidžia greitai pasiekti tam tikrą vaizdo eilutę.

Kodėl ši vertė saugoma atskirai, nors ją būtų galima apskaičiuoti, nėra aišku.
Galbūt tai yra optimizacija renderingo kodui.

0x0004 uint(32) Ofsetas

Nurodo pirmos eilutės poslinkį bitmap'e

0x0008 uint(32) Aukštis

Nurodo vaizdo aukštį pikseliais

0x000c uint(32) Plotis

Nurodo vaizdo plotį pikseliais

0x0010 uint(16) Tipas

Nurodo vaizdo tipą. Atrodo, kad tai yra bitų maske:

  • 0x04 yra nustatyta, jei tai yra 1bpp grafika.
  • 0x40 yra nustatyta, jei tai yra grafika, kuri turi įgyvendinti langų sistemą.
0x0012 uint(16) Paletė

Apibrėžia, kuri paletė turi būti naudojama iš PRT failo

Ši PRT failo duomenų struktūra nurodo, kaip yra sukurti bitmai, naudojami spritem. Šie bitmai tarnauja kaip atskira dalis, iš kurios keli yra sujungiami į sprito animacijos kadrą.

Konkreti vaizdo duomenys slepiasi op2_art.BMP žaidimo kataloge.
Nėra aišku, kodėl ši bitma failas turi (daugiausia teisingą) RIFF bitmapių antraštę. Tikėtina, kad Outpost 2 naudoja sistemines API grafikai įkelti, laikinas priėmimas šios antraštės ir atitinkamų, kintančių laukų perrašymas.

Pikselių duomenys yra BMP faile pozicijoje Offset + uint32-Offset, kuri randama BMP faile adresu 0x000A (RIFF bitmapių duomenų ofsetas), ir vėl atitinka eilučių išdėstymą iš viršaus kairėje į dešinę apačioje.

Monochrome 1bpp grafikos gali būti piešiamos taip, kad spalva 0 yra visiškai skaidri, o spalva 1 yra pusiau skaidri juoda/pilka, kadangi monochrominės grafikos dažniausiai naudojamos transporto priemonių ir pastatų šešėliams animacijose sudaryti.

Taigi jau galima sukurti daugelį grafikų.

Apsaugotas gyvenamasis modulis (Plymouth)

Animacijos

Dabar pereikime prie aukščiausios disciplinos Outpost 2 duomenų formatuose:
Prie animacijų.

Animacijų sąrašai pradedami globaliu antrašte, kuri pirmiausia tarnauja duomenų patvirtinimui. Po to pateikiamos konkrečios animacijų definicijos, kurios skirstomos į 3 lygius:

  1. Animacija
    Animacija yra aukščiausias lygmuo; ji vaizduoja vieneto, pastato ar 'dalelių animacijos' (kometos smūgis, oras, sprogimas) animaciją tam tikroje pradinėje padėtyje.
  2. Rėmas
    Rėmas yra vienas vaizdas animacijoje. Animacija gali apimti vieną ar kelis rėmus.
  3. Podrėmas
    Podrėmas yra informacija apie tai, kad tam tikra bitmap tam tikromis sąlygomis turi būti nupiešta į konkrečią rėmo vietą. Rėmas gali apimti vieną ar kelis podrėmus.

Toliau pateikiamos pačios animacijų definicijos.

Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF simboliai
0x0000 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
Ofsetas Duomenų tipas Pavadinimas Paaiškinimas
0x0000 uint(32) Animacijų skaičius

Kiek yra animacijų duomenų įrašų

0x0004 uint(32) Rėmelių skaičius

Kiek viso turėtų būti rėmų

0x0008 uint(32) Subrėžinių skaičius

Kiek iš viso turėtų būti subrėžių

0x000c uint(32) Pasirinktinų įrašų skaičius

Kiek yra "pasirinktinų įrašų".

Animacija

Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF simboliai
0x0000 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
0x0010 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
0x0020 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
Ofsetas Duomenų tipas Pavadinimas Paaiškinimas
0x0000 uint(32) Nežinomas 1

Nežinomi duomenys

0x0004 uint(32) Ribinė dėžutė: Kairė

Nurodo kairįjį Bounding Box pradžią (pikseliais).

0x0008 uint(32) Kraštinė dėžė: Viršuje

Nurodo viršutinį pradžios tašką (pikseliais) Bounding Box.

0x000c uint(32) Ribų dėžutė: Plotis

Nurodo Bounding Box pločio (pikseliais) reikšmę.

0x0010 uint(32) Ribų langelis: aukštis

Nurodo Bounding Box aukštį (pikseliais).

0x0014 uint(32) Atstumas: X

Nurodo horizontalų animacijos centrą

0x0018 uint(32) Ofsetas: Y

Nurodo vertikalų animacijos centrą

0x001c uint(32) Nežinomas 2

Nežinoma informacija

0x0020 uint(32) Rėmelių skaičius

Nurodo, kiek animacijos kadrų yra šioje animacijoje

0x0024 uint(32) Langų skaičius

Nurodo, kiek langų reikia naudoti piešiant

Aukščiausios pakopos, animacijos, duomenys pirmiausia yra administraciniai duomenys - Boundingbox nurodo koordinates, žyminčias transporto priemonės / pastato ribas, kai jis yra pasirinktas, ir taip pat nurodo, kuris plotas turi būti paspaudžiamas.

Ofsetas pirmiausia nustato "nulio tašką"; tašką, kuris turi būti apskaičiuotas pagal žaidimo koordinates arba atimtas. Galima būtų matematiškai pasakyti: ofsetas čia nurodo koordinačių pradžią.

Langai, kaip ir ofsetas, sudaryti iš 4 uint(32) reikšmių (kiekvienam langui), kuriomis nurodomas plotas, laikomas tinkamu atskiriems subframe'ams. Uždaroje langų zonoje, jei tai yra skirta bitmap'ui, nereikia piešti.

Rėmas

Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF simboliai
0x0000 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
Ofsetas Duomenų tipas Pavadinimas Paaiškinimas
0x0000 uint(8) Subrėžinio skaičius ir perjungiklis pasirenkamam 1, 2

Ši vertė apima:

  • 0x7F (Bitmasė): Subrėžinių, naudojamų šiame rėmelyje, skaičius
  • 0x80: Informacija apie tai, ar yra Pasirinktiniai 1 ir 2
0x0001 uint(8) Nežinomas 1 ir perjungiklis pasirenkamajam 3, 4

Ši vertė apima:

  • 0x7F (Bitmasė): Nežinoma - Tvirtai spėju, kad tai yra žaidimo takelio skaičius, kol bus parodytas kitas rėmas
  • 0x80: Informacija apie tai, ar yra parinktys 3 ir 4
0x0002 uint(8) Pasirinktinai 1

Nežinoma

0x0003 uint(8) Pasirinktinai 2

Nežinoma

0x0004 uint(8) Pasirinktinai 3

Nežinoma

0x0005 uint(8) Pasirinktinai 4

Nežinoma

Podrėžis

Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF simboliai
0x0000 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
Ofsetas Duomenų tipas Pavadinimas Paaiškinimas
0x0000 uint(16) Bitmap-ID

Nurodo, kuri bitmap turėtų būti naudojama šiam subrėžiui

0x0002 uint(8) Nežinomas 1

Nėra žinoma - tačiau aš labai įtariu, kad tai susiję su renderavimo prioritetu (Z-layere).

0x0003 uint(8) Subrėmės ID

Nurodo, kuriame subrėžinyje esame

0x0004 sint(16) Ofsetas - Horizontaliai

Nurodo, kur viduje rėmelio turi būti išdėstytas subrėmelis, arba kiek pikselių bitmapas turi būti perkeliamas horizontalioje atžvilgyje.

0x0006 sint(16) Offset - Vertikalus

Nurodo, kur viduje rėmo turi būti išdėstytas subrėmas, arba kiek pikselių bitmaps turi būti vertikaliai perkeltas

Dabar galime sudėti atskirus kadrus, taip pat ir visas animacijas, čia pavyzdžiui, demonstruojama kompleksiškesnė animacija su indeksu 500

Animacija 500

Animacija 500 rodo, kaip Plymouth furgonas, pilnas įprasto mineralinio vandens, yra iškraunamas. Tai yra viena iš nedaugelio animacijų, kuri naudoja langų funkcionalumą.

Taigi, visa animacija gali būti sujungta.
Dėl viršutinio krovimo angos vis dar yra problema, nes atitinkamas bitas grafikos tipo informacijoje nėra nustatytas.

Štai dar kelios nuostabiai animuotos sprite iš žaidimo:

Animacijos 500 vaizdavimas iliustruotas

Animacija 500 baigtai sujungta

Plymuto pastatų fabrikas

Edeno kosminis uostas

Edeno medicinos centras

SCAT

Plymuto kosminis uostas

Velykinis kiaušinis:
Kalėdų senelis

Velykinis kiaušinis:
Dans Dog

Vartotojo sąsaja

Dabar trūksta žaidimo vartotojo sąsajos, kuri yra pagaminta šlifuoto metalo stiliumi.

Bet ir čia aišku, kad Dynamix nereikėjo iš naujo išradinėti rato; čia ne tik paprastai naudojamos Windows teikiamos User32 ir GDI32 API, bet ir User32 resursų valdymas.

Jos gali būti išgaunamos, pavyzdžiui, naudojant nemokamą programą Angus Johnson, vadinamą Resource Hacker, arba - jei nenorite naudoti Wine po Linux / Mac OS - naudojant icoutils paketo wrestool.

Failo pavadinimas Turinys
Outpost2.exe Turintis tik žaidimo ikoną, vaizduojančią kosminę stotį prieš New Terra
op2shres.dll Be grafikų, skirtų valdymo elementams, tokiems kaip rėmeliai, mygtukai, radijo mygtukai ir langeliai, taip pat turi dialogų fonus, papildomas nuotraukas istorijos misijų tekstams ir pagrindinio meniu foninę grafiką
out2res.dll Turintis žaidimo langų dekoracijas, įprasto ir specialaus metalo ikonėles, įkėlimo ekraną, grafiką dialogams bei papildomas žymeklio grafikas, be animuotų žaidimo kataloge