Outpost 2 Lêerformate · bei.pm
Die op hierdie bladsy beskryfde lêerformate is gebaseer op die tegniese analise van intellektuele eiendom deur Dynamix, Inc. en Sierra Entertainment.
Die intellektuele eiendom is vandag deel van die Activision Publishing, Inc.- / Activision Blizzard, Inc.-massa en is tans in besit van Microsoft Corp..
Die inligting is saamgestel deur Reverse Engineering en Data-analyse vir die doeleindes van argivering en interoperabiliteit met historiese data.
Geen eiendoms- of vertroulike spesifikasies is gebruik nie.
Die spel kan tans by gog.com as 'n aflaai gekoop word.
Die volgende artikelreeks dokumenteer my bevindinge oor die databestande in die regstreekse strategiespel "Outpost 2: Divided Destiny", wat in 1997 deur Sierra vrygestel en deur Dynamix ontwikkel is.
Ek het van ongeveer 01 November 2015 tot 14 November 2015 hoofsaaklik met die ontleding van die data van die spel - en wat daarmee gedoen kan word - besig gehou.
Volgens die inligting wat ek tot dusver kon verkry, het Dynamix - soos soveel kommersiële maatskappye - 'n paar databestande nie spesifiek vir Outpost 2 ontwikkel nie, maar ook in ander ontwikkelings soos die Mechwarrior-reeks (aangepas) gebruik.
Ongeag dit, kan daar ook opgemerk word dat die innovasiekracht van die databestande prakties beperk is en dikwels op langer bestaande konsepte van gewone formate soos JFIF en RIFF gebou word.
Vir die interpretasie van die tabelle en databestande is daar verdere inligting beskikbaar onder Wat is wat?.
Die data wat hier verskaf word, moet in die algemeen as Little Endian verstaan word.
Ten slotte kan ek sê dat die omgekeerde ingenieurswese baie pret was, selfs al is dit nie volledig nie.
Natuurlik kan ek ook net aanbeveel om die spel self te speel, aangesien dit interessante spelmeganismes bied.
Inleiding
Die dataformate wat deur Outpost 2 gebruik word, het 'n struktuur wat herinner aan JFIF / PNG - die individuele datablokke het altyd 'n 8 Byte kop. Daarom spaar ek myself die moeite om die individuele koppe op die spesifieke plekke te dokumenteer en dokumenteer ek slegs afwykings daar.
Die formaat is altyd die volgende; die werklike nuttige data is dan daarin ingebed:
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | karakter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Verskuiwing | Data tipe | Benaming | Verklaring |
---|---|---|---|
0x0000 | uint(32) | Tover Bytes | Bevat die inligting oor wat in die volgende datablok verwag kan word. Bekende waardes:
|
0x0004 | uint(24) | Blok-lengte | Bevat die inligting oor hoe groot (in Byte) die volgende datablok is. Dit verwys na die suiwer nutdata - die 8 kopbyte is nie daarin ingesluit nie. |
0x0007 | uint(8) | Vlae? | Dit is onbekend waarvoor hierdie blok presies dien. In die volumes is hierdie waarde dikwels 0x80, terwyl dit in ander lêers dikwels 0x00 is. Dit dui daarop dat dit 'n vlagstel is. |
Volumes
Volumes is 'n datakonteiner vir die spel, soortgelyk aan 'n argiefformaat soos byvoorbeeld Tarball. In Outpost 2 ken die formaat egter net lêers - geen vouers nie. Waarskynlik kan hierdie egter deur middel van toepaslike lêernaam gesimuleer word.
'Een Volume bestaan uit die Volume-koptekst sowel as verskeie Volume-blokke wat die spesifieke lêers verteenwoordig.
"Volumes" is die lêers met die uitbreiding 'vol'
in die spelgids.
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | karakter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 56 | 4f | 4c | 20 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | V | O | L | . | . | . | . | . | . | . | . | . | . | . | . |
Verskuiwing | Data tipe | Benaming | Verklaring |
---|---|---|---|
0x0000 | uint(32) | Tover Bytes | |
0x0004 | uint(24) | Blok-lengte | |
0x0007 | uint(8) | Vlaggies |
Volume Kop
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | karakter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 76 | 6f | 6c | 68 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | v | o | l | h | . | . | . | . | . | . | . | . | . | . | . | . |
Verskuiwing | Data tipe | Benaming | Verklaring |
---|---|---|---|
0x0000 | uint(32) | Tover Bytes | |
0x0004 | uint(24) | Blok-lengte | |
0x0007 | uint(8) | Vlaggies |
Die Volume-header bevat op sy beurt geen gebruikersdata nie.
Dit dien slegs as 'n houer.
As eerste data in die Volume-header behoort die Volume-stringe te wees; gevolg deur die Volume-inligting.
Volume Strings
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | karakter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 76 | 6f | 6c | 69 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | v | o | l | i | . | . | . | . | . | . | . | . | . | . | . | . |
Verskuiwing | Data tipe | Benaming | Verklaring |
---|---|---|---|
0x0000 | uint(32) | Tover Bytes | |
0x0004 | uint(24) | Blok-lengte | |
0x0007 | uint(8) | Vlaggies |
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | karakter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 76 | 6f | 6c | 73 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | v | o | l | s | . | . | . | . | . | . | . | . | . | . | . | . |
Verskuiwing | Data tipe | Benaming | Verklaring |
---|---|---|---|
0x0000 | uint(32) | Tover Bytes | |
0x0004 | uint(24) | Blok-lengte | |
0x0007 | uint(8) | Vlaggies | |
0x0008 | uint(32) | Payload-lengte | Gee dit aan hoeveel Bytes van die volgende data werklik nuttige data is. Die oorblywende data van die volume-string lys moet duidelik as rommel beskou word. In lêers met 'n latere datum is hierdie 'oorblywende data' 0x00, wat op tekortkominge met die toolchain tydens die ontwikkeling van die speletjie kan dui, naamlik dat 'n ontwikkelaar eers baie laat na die korrekte inisialisering van die buffers gekyk het, aangesien dit geen invloed op die speletjie het of die data geinisialiseer is of nie. |
0x000c | uint(8)[] | Lys van lêernamen | Hierdie is 'n 0-byte-terminerende lys van lêername, wat - ten minste in die huidige databestandelement - slegs ASCII-karakters verwag. Dit is nie nodig om hierdie datablok meer in detail te ontleed wanneer die data gepars word nie, aangesien die offstes van die lêername direk in die volume-inligting verwys word. |
Die Volume Strings is 'n lys van lêernommers wat binne die volume ingesluit is.
Volume Inligting
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | karakter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 76 | 6f | 6c | 69 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | v | o | l | i | . | . | . | . | . | . | . | . | . | . | . | . |
Verskuiwing | Data tipe | Benaming | Verklaring |
---|---|---|---|
0x0000 | uint(32) | Tover Bytes | |
0x0004 | uint(24) | Blok-lengte | |
0x0007 | uint(8) | Vlaggies |
Die Volume-inligting neem meer gedetailleerde inligting oor die lêers op. Dit is op 'n sekere manier 'n tipe FAT-gidsinskrywing (FAT = File Allocation Table)
Die aantal lêers spruit voort uit die blokgrootte gedeel deur die lengte van die gidsinskrywing - 14 Byte.
Die individuele gidsinskrywings het elk die volgende struktuur:
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | karakter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Verskuiwing | Data tipe | Benaming | Verklaring |
---|---|---|---|
0x0000 | uint(32) | Lêernaam-afwyking | Gee aan by watter offset (!) binne die lêernaamlys (Volume-Strings) die lêernaam van die lêer gevind word. Dit verwys na die begin van die nutdata-blok. |
0x0004 | uint(32) | Lêer-offset | Gee aan op watter offset binne die hele volume-lêer die lêer geleë is. |
0x0008 | uint(32) | Lêergrootte | Gee die grootte van die lêer in bytes aan. |
0x000c | uint(16) | Vlae? | Gee blijkbaar addisionele inligting oor die lêerkodering aan.
|
Volume Blok
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | karakter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 56 | 42 | 4c | 48 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | V | B | L | H | . | . | . | . | . | . | . | . | . | . | . | . |
Verskuiwing | Data tipe | Benaming | Verklaring |
---|---|---|---|
0x0000 | uint(32) | Tover Bytes | |
0x0004 | uint(24) | Blok-lengte | |
0x0007 | uint(8) | Vlaggies |
'n Volume-blok is 'n houer wat lêers opneem. Dit bevat net weer - weens die blokformaat - die lêergrootte op 'n redundante manier, en daarna volg die nutdata direk.
Tegels
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | karakter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 50 | 42 | 4d | 50 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | P | B | M | P | . | . | . | . | . | . | . | . | . | . | . | . |
Verskuiwing | Data tipe | Benaming | Verklaring |
---|---|---|---|
0x0000 | uint(32) | Tover Bytes | |
0x0004 | uint(24) | Blok-lengte | |
0x0007 | uint(8) | Vlae |
Die tegels is 'n Outpost-2-spesifieke
bitmap-grafiekformaat. Hulle strek oor 13 tegelstelle,
""wells"" genoem (well0000.bmp
tot well0012.bmp
),
wat binne die volume maps.vol geleë is.
Die tegelstelle / Wells bevat die volgende:
Bestandsnaam | Inhoud |
---|---|
well0000.bmp | ‘n 32x32px groot, blou grafika - ideaal om te toets of jou eie beeldlaaier werk |
well0001.bmp | Bevat ligte rots, berge op ligte rots en ontelbare variasies van impakkraters in ligte rots |
well0002.bmp | Bevat ligte-rots-'Doodads' - dus elemente wat gebruik kan word om die area te verlig (of doelbewus as struktuur, soos byvoorbeeld mure) op ligte rots, insluitend plantegroei |
well0003.bmp | Bevat 'n korsagtige struktuur op ligte rots |
well0004.bmp | Bevat donker rots, berge op donker rots en ontelbare variasies van impakkraters in donker rots |
well0005.bmp | Bevat donker-rots-'Doodads' - dus elemente wat gebruik kan word om die area te verlig (of doelbewus as struktuur, soos byvoorbeeld mure) op donker rots |
well0006.bmp | Bevat 'n korsagtige struktuur op donker rots, sowel as oorgange tussen ligte en donker rots |
well0007.bmp | Bevat lava insluitend 4-5 rame animasie van dieselfde |
well0008.bmp | Bevat sand en ontelbare variasies van impakkraters in sand |
well0009.bmp | Bevat sand-'Doodads' - dus elemente wat gebruik kan word om die area te verlig (of doelbewus as struktuur, soos byvoorbeeld mure) op sand |
well0010.bmp | Bevat elk 48 oorgange van sand na ligte en donker rots |
well0011.bmp | Bevat die pole van die kaart, met donker rots as ondergrond |
well0012.bmp | Bevat die pole van die kaart, met ligte rots as ondergrond |
Dit is raadsaam om die teëls nie vooraf te render om dit te kas te maak nie, aangesien die data vir die dag/nag siklus nog verwerk moet word - en daar sou baie, baie data ontstaan.
Die teëls is 8bpp grafika met 'n geïndekseerde palet van 32x32 pixels resolusie, wat in 'n rooster georganiseer is. In 'n so gevormde teëls stel kan egter baie meer wees.
Die hoofhouer bestaan uit 2 afdelings: head
en data
.
Teëls Kop
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | karakter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 68 | 65 | 61 | 64 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | h | e | a | d | . | . | . | . | . | . | . | . | . | . | . | . |
0x0010 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Verskuiwing | Data tipe | Benaming | Verklaring |
---|---|---|---|
0x0000 | uint(32) | Tover Bytes | |
0x0004 | uint(24) | Blok-lengte | |
0x0007 | uint(8) | Vlae | |
0x0008 | uint(32) | Weergawe / Vlaggies? | Hierdie kan 'n weergawenaam van die lêerformaat wees; in al die lêers wat ek ontvang het, was die waarde hier |
0x000c | uint(32) | Breedte (Horizontale Resolusie) | Gee aan hoe breed die beeldlêer is (in pixels). Vir alle wells van Outpost 2 sal die waarde hier |
0x0010 | uint(32) | Hoogte (Vertikale Resolusie) | Gee aan hoe hoog die beeldlêer is (in pixels). By alle wells van Outpost 2 sal hier die waarde |
0x0014 | uint(32) | Kleurdiepte? | Die betekenis van hierdie waarde is onbekend. Aangesien dit in alle getoetsde lêers die waarde |
0x0018 | uint(32) | Kleurdiepte 2? | Die betekenis van hierdie waarde is onbekend. Miskien is dit 'n 'teiken'-kleurdiepte. |
Na hierdie inligting volg daar nog 'n paletlêer wat in die gestandaardiseerde RIFF-formaat beskikbaar is. Die presiese spesifikasie kan gevind word - aangesien die palette ook elders verskyn - onder Palet.
Teëls Gegewens
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | karakter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 64 | 61 | 74 | 61 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | d | a | t | a | . | . | . | . | . | . | . | . | . | . | . | . |
Verskuiwing | Data tipe | Benaming | Verklaring |
---|---|---|---|
0x0000 | uint(32) | Tover Bytes | |
0x0004 | uint(24) | Blok-lengte | |
0x0007 | uint(8) | Vlae |
Uiteindelik volg die blote pixeldata, van links-bo na regs-benede in rye.
Die datavalue van die grafika, wat gewoonlik as 8bpp-bitmaps voorkom, stem ooreen met die indeks van die kleur in die kleurskaal.
Die spel-enjin teken die teëls *waarskynlik* op aanvraag.
Dit blyk onder andere te wees as gevolg van die dag-nag siklus, wat 32 gradasie van individuele teëls het. Daar word blykbaar 'n bietjie van die helderheidswaarde afgetrek. Presiese waardes kon nog nie bepaal word nie, ek werk op die berekeningsgrondslag
v *= (daylight / 48) + 0.25;
met die HSV-data van die pixels, terwyl daylight 'n waarde van 0-31 is en v 'n waarde tussen 0-1. Boonop moet daar in ag geneem word dat daar op die kaart 'n rand van 16 teëls aan die linkerkant en regterkant is (dit dien om eenhede onsigbaar te laat spawne).
Daarbenewens blyk die dag-nag siklus per speletjie-kik net een kolom van die kaart te werk.
‘n Versnelde dag-nag siklus lyk dus soos volg:
PRT
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | karakter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 43 | 50 | 41 | 4c | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | C | P | A | L | . | . | . | . | . | . | . | . | . | . | . | . |
Verskuiwing | Data tipe | Benaming | Verklaring |
---|---|---|---|
0x0000 | uint(32) | Tover Bytes | |
0x0004 | uint(24) | Paletlengte | Gee, anders as die normale blokformaat, die aantal palet wat in hierdie lêer gevind kan word aan - nie die lengte van die blok in byte nie. |
0x0007 | uint(8) | Vlae | Waarskynlik, soos altyd, vlaggies. Ek is egter nie bewus van enige vlaggies nie; aangesien al die waardes wat ek ken |
Waartoe PRT
presies staan, is vir my nie bekend nie; dit sou moontlik 'Palette and Ressource Table' kan wees - aangesien hierdie lêer - gevind as op2_art.prt in die maps.vol - 'n sulke is, of dit die funksie heel goed sou beskryf.
Diese lêer bevat 'n lys van paletten, 'n tabel oor al die gebruikte bitmapte, al die animasiedefinisies en nog 'n reeks onbekende data. Dit volg die vorige houerformaat losweg, aangesien nie al die datastelle hierdie skema volg nie.
Die CPAL
-seksie (waarskynlik vir palet-houer) sluit slegs die paletdata in deur aan te dui hoeveel van die gewoonlik 1052-byte groot 8-bits paletten teenwoordig is.
Die 1052-byte-aanduiding word nie as bindend beskou nie, aangesien die paletformaat potensieel verskillende paletgroottes kan hê. Dit geld slegs vir die databasis waarmee Outpost 2 afgelewer word.
Na die paletlys volg onmiddellik en sonder 'n inleidende kop, reeds die lys van bitmaps; sowel as onmiddellik daaropvolgend die animasielyste.
Albei word elk met 'n uint(32) (of weer uint24+uint8 vlae?) ingelei, wat die aantal datastelle bevat.
Palet
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | karakter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 50 | 50 | 41 | 4c | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | P | P | A | L | . | . | . | . | . | . | . | . | . | . | . | . |
Verskuiwing | Data tipe | Benaming | Verklaring |
---|---|---|---|
0x0000 | uint(32) | Tover Bytes | |
0x0004 | uint(24) | Paletlengte | Gee, teen die normale blokformaat, die aantal paletten wat in hierdie lêer gevind kan word aan - nie die lengte van die blok in byte nie. |
0x0007 | uint(8) | Vlae | Waarskynlik, soos gewoonlik, vlae. Ek is egter nie bewus van enige vlae nie; aangesien al die waardes wat ek ken |
Die palet-inligting is baie maklik om te lees.
Hulle bestaan uit 'n kopstuk en 'n data-segment.
Palet-Kop
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | karakter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 68 | 65 | 61 | 64 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | h | e | a | d | . | . | . | . | . | . | . | . | . | . | . | . |
Verskuiwing | Data tipe | Benaming | Verklaring |
---|---|---|---|
0x0000 | uint(32) | Tover Bytes | |
0x0004 | uint(24) | Paletlengte | Gee, teen die normale blokformaat, die aantal paletten wat in hierdie lêer gevind kan word aan - nie die lengte van die blok in byte nie. |
0x0007 | uint(8) | Vlae | Waarskynlik, soos gewoonlik, vlae. Ek is egter nie bewus van enige vlae nie; aangesien al die waardes wat ek ken |
0x0008 | uint(32) | Paletformaat-weergawes? | Definieer waarskynlik watter paletformaat weergawe die palet volg. Alle Outpost2-palettes blyk weergawe |
Paletdata
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | karakter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 64 | 61 | 74 | 61 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | d | a | t | a | . | . | . | . | . | . | . | . | . | . | . | . |
Verskuiwing | Data tipe | Benaming | Verklaring |
---|---|---|---|
0x0000 | uint(32) | Tover Bytes | |
0x0004 | uint(24) | Blok-lengte | |
0x0007 | uint(8) | Vlae |
Die dataseksie neem die individuele paletinskrywings op. Die aantal paletinskrywings is gebaseer op die bloklengte / 4.
Die individueleinskrywings het die volgende eenvoudige struktuur;
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | karakter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | 04 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Verskuiwing | Data tipe | Benaming | Verklaring |
---|---|---|---|
0x0000 | uint(8) | Rooi-komponent | Gee die rooi aandeel van die kleur aan |
0x0001 | uint(8) | Groen-komponent | Gee die groen aandeel van die kleur aan |
0x0002 | uint(8) | Blou-komponent | Gee die blou aandeel van die kleur aan |
0x0003 | uint(8) | Onbekend - Vlaggies? | Dit is onduidelik wat hierdie waarde beteken, aangesien dit blykbaar basies |
Wat die palet aanbetref, is daar verder net te sê dat die volgende reëls van toepassing is op palet wat vir animasies gebruik word:
- Die eerste kleur is ALTYD deurskynend, maak nie saak watter waarde daar aangedui word nie.
-
Die paletinskrywings 1-24 tel as spelerkleur in die palet 1-8.
Hoe die kleure, behalwe vir speler 1, presies verkry word, is vir my onduidelik.
Ek vermoed dat die oorblywende kleure hardcoded is.
Bitmaps
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | karakter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
0x0010 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Verskuiwing | Data tipe | Benaming | Verklaring |
---|---|---|---|
0x0000 | uint(32) | Gelykgestelde breedte | Gee die breedte van die pixeldata-rye in bytes aan - aangesien dit op die 4-byte grense georiënteer is. Dit maak dit vinnig moontlik om 'n spesifieke beeldry op te roep. Waarom hierdie waarde apart gestoor word, alhoewel dit bereken kan word, is onduidelik. |
0x0004 | uint(32) | Afwyking | Gee die verskuiwing van die eerste lyn in die bitmap aan |
0x0008 | uint(32) | Hoogte | Gee die hoogte van die prent in pixels aan |
0x000c | uint(32) | Breedte | Gee die breedte van die prent in pixels aan |
0x0010 | uint(16) | Tipe | Gee die tipe van die beeld aan. Hier lyk dit of dit 'n bitmasker is:
|
0x0012 | uint(16) | Palet | Definieer watter palet uit die PRT-lêer gebruik moet word |
Diese Datenstruktur der PRT-Datei geeu die hoe die vir die sprites gebruikte bitmaps gebou is. Hierdie bitmaps dien as 'n enkele komponent, waarvan verskeie saamgestel word tot 'n animasiekader van 'n sprite.
Die konkrete beelddata versteek egter in die
op2_art.BMP in die speletjie-gids.
Waarom hierdie bitmaplêer 'n (meestal korrekte) RIFF-bitmapkop het,
is onduidelik. Waarskynlik gebruik Outpost 2 stelsels-API's om die grafika te laai,
deur hierdie kop tydelik oorgeneem te word en die ooreenstemmende, wisselende velde te oorskryf.
Die pixeldata is in die BMP-lêer op die posisie Offset + die uint32-offset, dit wat in die BMP-lêer op adres 0x000A te vind is (RIFF-bitmap-data-offset), te vind - en stem weer ooreen met die rygewys rangskikking van bo links na regs onder.
Monochrome 1bpp-grafika kan so geteken word, dat kleur 0 volle deursigtigheid is, sowel as kleur 1 'n semi-deursigtige swart/grys is, omdat die monochroom-grafika gewoonlik vir voertuig- en geboueskaduwees in die animasies gebruik word.
Dit maak dit moontlik om reeds baie grafika saam te stel.
Animasies
Kom ons kom by die koninklike klas van dissiplines binne die Outpost 2 dataformate:
Die animasies.
Die animasielyste begin met 'n globale kop wat primêr vir dataverifikasie dien. Daarop volg die konkrete animasiedefinisies wat in 3 vlakke verdeel is:
-
Animatie
'n Animatie is die hoogste instansie; dit stel 'n animasie van 'n eenheid, 'n gebou of 'n 'partikel-animasie' (kometebotsing, weer, ontploffing) in 'n bepaalde uitgangstoestand voor. -
Raam
'n Raam is 'n enkele beeld binne 'n animasie. 'n Animasie kan een of meer rame bevat. -
Subraam
'n Subraam is die inligting dat 'n bepaalde bitmap onder bepaalde kriteria op 'n bepaalde posisie van 'n raam geteken moet word. 'n Raam kan een of meer subrame bevat.
Daarna volg die individuele animasiedefinisies onmiddellik.
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | karakter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Verskuiwing | Data tipe | Benaming | Verklaring |
---|---|---|---|
0x0000 | uint(32) | Aantal animasies | Hoeveel animasiedatasette is daar |
0x0004 | uint(32) | Aantal rame | Hoeveel rame daar in totaal teenwoordig moet wees |
0x0008 | uint(32) | Aantal subraamwerke | Hoeveel subraamwerke daar in totaal moet wees |
0x000c | uint(32) | Aantal opsionele inskrywings | Hoeveel "opsionele inskrywings" is daar. |
Animasie
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | karakter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
0x0010 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
0x0020 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Verskuiwing | Data tipe | Benaming | Verklaring |
---|---|---|---|
0x0000 | uint(32) | Onbekend 1 | Onbekende inligting |
0x0004 | uint(32) | Begrenzingsboks: Links | Gee die linker beginpunt (in Pixel) van die Bounding Box aan. |
0x0008 | uint(32) | Grensboks: Boonste | Gee die boonste begin (in pixels) van die Bounding Box aan. |
0x000c | uint(32) | Begrenzingskassie: Breedte | Gee die breedte (in pixels) van die Bounding Box aan. |
0x0010 | uint(32) | Grensdoos: Hoogte | Gee die hoogte (in pixels) van die Bounding Box aan. |
0x0014 | uint(32) | Afwyking: X | Gee die horisontale middelpunt van die animasie aan |
0x0018 | uint(32) | Verskuiwing: Y | Gee die vertikale middelpunt van die animasie aan |
0x001c | uint(32) | Onbekend 2 | Onbekende Inligting |
0x0020 | uint(32) | Aantal rame | Gee aanduiding van hoeveel animasieraamwerke in hierdie animasie ingesluit is |
0x0024 | uint(32) | Aantal vensters | Gee dit aan hoeveel vensters gebruik moet word tydens die teken. |
Die data van die boonste laag, die animasie, is hoofsaaklik bestuursdata - die Boundingbox dui die koördinate van die merk rondom die voertuig/gebou aan, as dit gekies is en dui ook terselfdertyd aan watter area klikbaar moet wees.
Die offset bepaal hoofsaaklik die "nulpunt"; die punt wat op spelinterne koördinate bygevoeg of afgetrek moet word. Mens kan ook wiskundig sê: die offset dui hier die koördinaat oorsprong aan.
Die windows is, net soos die offset, elk (per window) 4 uint(32)-waardes, wat 'n area aandui wat as bruikbaar vir individuele subframes beskou word. Buite die windows mag, sover dit vir die bitmap ooreenkomstig bedoel is, nie geteken word nie.
Raam
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | karakter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Verskuiwing | Data tipe | Benaming | Verklaring |
---|---|---|---|
0x0000 | uint(8) | Subraam aantal en Wissel vir Opsioneel 1, 2 | Hierdie waarde bevat:
|
0x0001 | uint(8) | Onbekend 1 en Tipe vir Opsioneel 3, 4 | Hierdie waarde bevat:
|
0x0002 | uint(8) | Opsionele 1 | Onbekend |
0x0003 | uint(8) | Opsioneel 2 | Onbekend |
0x0004 | uint(8) | Opsioneel 3 | Onbekend |
0x0005 | uint(8) | Opsioneel 4 | Onbekend |
Subraam
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | karakter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Verskuiwing | Data tipe | Benaming | Verklaring |
---|---|---|---|
0x0000 | uint(16) | Bitmap-ID | Gee aan watter bitmap vir hierdie subraam gebruik moet word |
0x0002 | uint(8) | Onbekend 1 | Dit is onbekend - ek vermoed egter sterk dat dit 'n render prioriteit (Z-laag) is. |
0x0003 | uint(8) | Subraam-ID | Gee aan in watter subraam ons is |
0x0004 | sint(16) | Offset - Horisontaal | Gee aan waar binne die raam die subraam geplaas moet word, of hoeveel pixel die bitmap horisontaal verskuif moet word |
0x0006 | sint(16) | Offset - Vertikaal | Gee aan waar binne die raam die subraam geplaas moet word, of met hoeveel pixels die bitmap vertikaal verskuif moet word |
Hiermee kan ons nou individuele rame sowel as volledige animasies saamstel, hier een keer as 'n voorbeeld aan 'n meer komplekse animasie, die animasie met die indeks 500, demonstreer
Animasie 500
Animasie 500 toon hoe 'n Plymouth-vragmotor, wat met gewone ertse laai, afgelaai word. Dit is een van die min animasies wat die Windowing-funksionaliteit gebruik.
En so kan die volledige animasie saamgestel word.
Helaas is daar steeds 'n probleem met die boonste laai-opening, aangesien die toepaslike bit in die grafiektipe-inligting nie gestel is nie.
Hier is nog 'n paar ander, pragtig geanimeerde sprites uit die speletjie:
Gebruikerskoppelvlak
Nou ontbreek nog die gebruikerskoppelvlak van die speletjie, wat in 'n geborstelde metaal-voorkoms uitgevoer is.
Maar ook hier is dit duidelik dat Dynamix nie die wiel weer moes uitvind nie; hier word nie net eenvoudig die User32- en GDI32-API's wat deur Windows verskaf word, gebruik nie - veral word ook die hulpbronnebestuur van User32 benut.
Dit kan byvoorbeeld deur programme soos die deur Angus Johnson as gratis sagteware ontwikkelde Resource Hacker of - as jy huiwer om Wine op Linux / Mac OS te gebruik - met die hulp van die in icoutils ingeslote wrestool onttrek word.
Bestandsnaam | Inhoud |
---|---|
Outpost2.exe | Bevat slegs die ikoon van die spel, wat die ruimte-stasie voor New Terra toon |
op2shres.dll | Bevat, benewens grafika vir bedieningselemente soos raamwerke, knoppies, radio-knoppies en kiesvakke, ook dialoog-agtergronde, die begeleidende prente vir die storie-missie teks en die hoofmenu agtergrond grafika |
out2res.dll | Bevat die ingame venster dekorasie, ikone vir gewone en spesiale metaal, die laai-skerm, grafika vir dialoë sowel as ander cursor grafika, benewens die geanimeerde in die speletjie se gids |