Outpost 2 Lêerformate · bei.pm

Hierdie teks is outomaties vertaal deur OpenAI GPT-4o Mini.

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.

Kunstwerk van die spel

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:

  • 0x204C4F56 ('VOL '):
    Volume
  • 0x686C6F76 ('VOLH'):
    Volume-Header
  • 0x736C6F76 ('VOLS'):
    Volume-Strings
  • 0x696C6F76 ('VOLI'):
    Volume-Inligting
  • 0x4B4C4256 ('BLCK'):
    Volume-Block
  • 0x504D4250 ('PBMP'):
    Grafika-data
  • 0x4C415050 ('PPAL'):
    Kleurpalet
  • 0x4C415043 ('CPAL'):
    Kleurpalet-Container
  • 0x64616568 ('head'):
    Header
  • 0x61746164 ('data'):
    Nutsdata
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.

  • 0x03 is gestel as die lêer gecomprimeer is. Hier blyk 'n Huffman-boom gebruik te word.
  • 0x80 is blykbaar altyd gestel.

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

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 0x20 of 32 verwag word.

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 0x20 of 32 verwag word.

0x0014 uint(32) Kleurdiepte?

Die betekenis van hierdie waarde is onbekend.

Aangesien dit in alle getoetsde lêers die waarde 8 bevat, kan dit 'n aanduiding van kleurdiepte wees.

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.

Pixeldata begin bo links en eindig onder regs.

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:

Visualisering van die dag-nag siklus

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 0x00 is, kan dit ook moontlik wees dat die aantal palet eenvoudig 'n uint(32) is.

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 0x00 is, kan dit ook moontlik wees dat die aantal palet eenvoudig 'n uint(32) is.

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 0x00 is, kan dit ook moontlik wees dat die aantal palet eenvoudig 'n uint(32) is.

0x0008 uint(32) Paletformaat-weergawes?

Definieer waarskynlik watter paletformaat weergawe die palet volg.

Alle Outpost2-palettes blyk weergawe 0x01 te hê.

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

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.

Palet-verwysing

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.
Miskien is dit 'n optimalisering vir die renderkode.

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:

  • 0x04 is ingestel as dit 'n 1bpp-grafiek is.
  • 0x40 is ingestel as dit 'n grafiek is wat vensterimplementering moet hê.
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.

Beskermde woonmodule (Plymouth)

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:

  1. 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.
  2. Raam
    'n Raam is 'n enkele beeld binne 'n animasie. 'n Animasie kan een of meer rame bevat.
  3. 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:

  • 0x7F (Bitmasker): Die aantal subraamwerke wat in hierdie raam gebruik word
  • 0x80: Die inligting oor of Opsioneel 1 en 2 teenwoordig is
0x0001 uint(8) Onbekend 1 en Tipe vir Opsioneel 3, 4

Hierdie waarde bevat:

  • 0x7F (Bitmasker): Onbekend - Ek vermoed sterk dat dit die aantal gametiks is wat verbygaan voordat die volgende raam vertoon word
  • 0x80: Die inligting oor of Opsioneel 3 en 4 teenwoordig is
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:

Rendering van animasie 500 geïllustreer

Animasie 500 klaar saamgestel

Plymouth Gebou-Fabriek

Eden Ruimtelike Hawe

Eden Mediese Sentrum

SCAT

Plymouth Ruimtelike Hawe

Easteregg:
Kersvader

Easteregg:
Dans Hond

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