Outpost 2 failų formatas · bei.pm
Š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.
Š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:
|
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ą.
|
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ė |
0x000c | uint(32) | Plotis (horizontalioji rezoliucija) | Nurodo, kiek pločio yra vaizdo failas (pikseliais). Visiems Wells iš Outpost 2 čia bus tikėtinas vertė |
0x0010 | uint(32) | Aukštis (vertikali rezoliucija) | Indikuoja, koks yra vaizdo failo aukštis (pikseliais). Visiems Outpost 2 šuliniams čia bus tikimasi vertės |
0x0014 | uint(32) | Spalvų gylis? | Šios reikšmės reikšmė nėra žinoma. Kadangi jis visuose patikrintuose failuose turi reikšmę |
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.
Ž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:
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 |
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 |
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 |
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ą |
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 |
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
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. |
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:
|
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ų.
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:
-
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. -
Rėmas
Rėmas yra vienas vaizdas animacijoje. Animacija gali apimti vieną ar kelis rėmus. -
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:
|
0x0001 | uint(8) | Nežinomas 1 ir perjungiklis pasirenkamajam 3, 4 | Ši vertė apima:
|
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:
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 |