Outpost 2 Filformat · bei.pm
Filformatene som er beskrevet på denne siden, er basert på teknisk analyse av åndsverk frå Dynamix, Inc. og Sierra Entertainment.
Åndsverka er i dag ein del av Activision Publishing, Inc.- / Activision Blizzard, Inc.-massen og er for tida eid av Microsoft Corp..
Informasjonen er samla inn gjennom Reverse Engineering og dataanalyse med det formål å arkivere og oppnå interoperabilitet med historiske data.
Ingen proprietære eller konfidensielle spesifikasjoner har blitt brukt.
Spelet kan no kjøpast som nedlasting på gog.com.
Denne artikkelserien dokumenterer mine funn om dataformata i sanntidsstrategispelet "Outpost 2: Divided Destiny", som vart publisert av Sierra i 1997 og utvikla av Dynamix.
Jeg har i perioden frå 1. november 2015 til 14. november 2015 primært arbeidd med analysen av dataene frå spelet - og kva som kan gjerast med dei.
I følgje informasjonen eg har fått samla, har Dynamix - som mange kommersielle selskap - ikkje utvikla nokre dataformata spesifikt for Outpost 2, men også brukt dei i andre utviklingar som for eksempel Mechwarrior-serien (tilpassa).
Uavhengig av dette kan ein også konstatere at innovasjonskrafta til dataformata stort sett er avgrensa, og ofte bygga på eldre konsept frå vanlege format som JFIF og RIFF.
For tolking av tabellar og dataformata finst det meir informasjon under Kva er kva? tilgjengeleg.
Dei oppgjevne dataene bør generelt forståast som Little Endian.
Avslutningsvis kan det seiast at reverse engineering var veldig morsomt, sjølv om det ikkje er heilt fullstendig.
Sjølvsagt kan eg også anbefale å spele spelet sjølv, då det tilbyr interessante spelmekanismar.
Innleiing
Dataformata som vert nytta av Outpost 2 har ei struktur som minner om JFIF / PNG - dei enkelte datablocka har alltid ein 8-byte header. Derfor vel eg å ikkje dokumentere dei enkelte headera på dei spesifikke plassane, men dokumenterer berre avvik.
Formatet er alltid det same; dei eigentlege nyttedataene er så innbakt i det:
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | teikn | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Datatype | Betegnelse | Forklaring |
---|---|---|---|
0x0000 | uint(32) | Magiske byte | Inneheld informasjon om kva som kan forventa i den neste datablokka. Kjente verdiar:
|
0x0004 | uint(24) | Blokklengd | Inneheld informasjon om kor stor (i byte) den følgjande datablokken er. Her er det reint nyttedata som er meint - dei 8 header-byte er ikkje inkludert. |
0x0007 | uint(8) | Flagg? | Det er ukjent kva denne blokka nøyaktig er til for. I voluma er denne verdien ofte 0x80, medan den i andre filer ofte er 0x00. Dette tyder på at det er snakk om eit flaggsett. |
Volum
Volumene er ein datakontainer for spelet, liknande eit arkivformat som til dømes Tarball. I alle fall i Outpost 2 kjenner formatet berre til filer - ingen mapper. Det er truleg mogleg å simulere desse gjennom tilsvarande filnamn.
Eit volum består av volumoverskrifta samt fleire volumblokker som tilsvarar dei konkrete filene.
"Volumer" er filene med ending 'vol'
i spelemappa.
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | teikn | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 56 | 4f | 4c | 20 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | V | O | L | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Datatype | Betegnelse | Forklaring |
---|---|---|---|
0x0000 | uint(32) | Magiske byte | |
0x0004 | uint(24) | Blokklengde | |
0x0007 | uint(8) | Flaggar |
Volumoverskrift
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | teikn | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 76 | 6f | 6c | 68 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | v | o | l | h | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Datatype | Betegnelse | Forklaring |
---|---|---|---|
0x0000 | uint(32) | Magiske byte | |
0x0004 | uint(24) | Blokklengde | |
0x0007 | uint(8) | Flaggar |
Volume-headeret inneheld ikkje noko brukardata.
Det fungerar berre som ein container.
Det første elementet i volume-headeret bør vere volume-strengane; deretter følgjer volume-informasjonen.
Volumstrenger
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | teikn | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 76 | 6f | 6c | 69 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | v | o | l | i | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Datatype | Betegnelse | Forklaring |
---|---|---|---|
0x0000 | uint(32) | Magiske byte | |
0x0004 | uint(24) | Blokklengde | |
0x0007 | uint(8) | Flaggar |
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | teikn | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 76 | 6f | 6c | 73 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | v | o | l | s | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Datatype | Betegnelse | Forklaring |
---|---|---|---|
0x0000 | uint(32) | Magiske byte | |
0x0004 | uint(24) | Blokklengde | |
0x0007 | uint(8) | Flaggar | |
0x0008 | uint(32) | Payload-lengde | Gjev opp kor mange byte av dei følgjande dataene som faktisk er nyttedata. Dei resterande dataene i liste over volum-strengar skal åpenbart vurderast som søppel. I filer med seinare dato er desse 'resterande dataene' 0x00, noko som kan tyda på manglar med verktøyserien under utviklinga av spelet, med andre ord, at ein utviklar først tok seg av korrekt initialisering av buffere veldig seint, sidan det ikkje har noko å seie for spelet om dataene er initialiserte eller ikkje. |
0x000c | uint(8)[] | Filnamn-liste | Denne teksten handlar om ei 0-byte-terminert liste av filnamn, som - i alle fall i det noverande datainnhaldet - berre forventar ASCII-teikn. Det er ikkje nødvendig å evaluere denne datablokken nærmare når ein parserer dataene, sidan voluminformasjonen uansett refererer direkte til offsetane til filnamna. |
Volumetekstane er ei liste over filnamn som er innehalde i volumet.
Voluminformasjon
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | teikn | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 76 | 6f | 6c | 69 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | v | o | l | i | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Datatype | Betegnelse | Forklaring |
---|---|---|---|
0x0000 | uint(32) | Magiske byte | |
0x0004 | uint(24) | Blokklengde | |
0x0007 | uint(8) | Flaggar |
Voluminformasjonen inneheld meir detaljerte opplysningar om filene. Dette er på ein måte ein slags FAT-katalogpost (FAT = File Allocation Table).
Antalet filer kjem fram ved å dele blokkerstørrelsen med lengda på katalogpostane - 14 byte.
Dei enkelte katalogpostane har følgjande oppbygging:
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | teikn | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Datatype | Betegnelse | Forklaring |
---|---|---|---|
0x0000 | uint(32) | Filnamn-offset | Angir kva offset (!) innanfor liste over filnamn (volum-strengar) filnamnet på fila ligg. Dette er relatert til starten av nyttedata-blokka. |
0x0004 | uint(32) | Fil-offset | Angir kva offset innan den heile volumfilen filen ligg. |
0x0008 | uint(32) | Filstorleik | Angir kor stor fila er i byte. |
0x000c | uint(16) | Flagg? | Det verkar å vere ekstra informasjon om filkodinga.
|
Volumboks
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | teikn | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 56 | 42 | 4c | 48 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | V | B | L | H | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Datatype | Betegnelse | Forklaring |
---|---|---|---|
0x0000 | uint(32) | Magiske byte | |
0x0004 | uint(24) | Blokklengde | |
0x0007 | uint(8) | Flaggar |
Eit volumeblock er ein container som tar imot filer. Han inneheld berre ein gong - på grunn av blokkformatet - redudant filstorleiken, og deretter følgjer direkte nytteopplysningane.
Fliser
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | teikn | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 50 | 42 | 4d | 50 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | P | B | M | P | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Datatype | Betegnelse | Forklaring |
---|---|---|---|
0x0000 | uint(32) | Magiske byte | |
0x0004 | uint(24) | Blokklengde | |
0x0007 | uint(8) | Flagg |
Tilane er eit spesifikt
Bitmap-grafikkformat for Outpost-2. Dei strekkjer seg over 13 tilesets,
kalla "wells" (well0000.bmp
til well0012.bmp
),
som ligg innanfor voluma maps.vol.
Tilane / Wells inneheld følgjande:
Filnamn | Innhald |
---|---|
well0000.bmp | Ein 32x32px stor, blå grafikk - ideell som test for å sjekke om bildeforhandlaren fungerer |
well0001.bmp | Inneheld lyst berg, fjellkjeder på lyst berg og utallige variantar av nedslagskrater på lyst berg |
well0002.bmp | Inneheld lys berg-'Doodads' - altså element som kan plasserast for å liva opp (eller med vilje som struktur, som t.d. murar) på lyst berg, inkludert vegetasjon |
well0003.bmp | Inneheld ein skorpelignande struktur på lyst berg |
well0004.bmp | Inneheld mørk berg, fjellkjeder på mørkt berg og utallige variantar av nedslagskrater på mørkt berg |
well0005.bmp | Inneheld mørk berg-'Doodads' - altså element som kan plasserast for å liva opp (eller med vilje som struktur, som t.d. murar) på mørkt berg |
well0006.bmp | Inneheld ein skorpelignande struktur på mørkt berg, samt overgangar mellom lyst og mørkt berg |
well0007.bmp | Inneheld lava inkludert kvar 4-5 rammer animasjon av same |
well0008.bmp | Inneheld sand og utallige variantar av nedslagskrater i sand |
well0009.bmp | Inneheld sand-'Doodads' - altså element som kan plasserast for å liva opp (eller med vilje som struktur, som t.d. murar) på sand |
well0010.bmp | Inneheld 48 overgangar frå sand til lyst og mørkt berg |
well0011.bmp | Inneheld polarområda på kartet, med mørkt berg som grunnlag |
well0012.bmp | Inneheld polarområda på kartet, med lyst berg som grunnlag |
Det er tilrådd for ei nøyaktig gjennomføring å ikkje rendere flisene på førehand for å cache dei, då dataene for dag/natt-syklusen må bearbeidast - og det ville oppstå svært, svært mange data.
Flisene er 8bpp-grafikk med indeksert palett med ei oppløysing på 32x32 pikslar, som er ordna i rekkjer. I eit slik oppstått flisesett kan det imidlertid vere langt fleire
Hovud-containeren består av 2 seksjonar: head
og data
.
Fliser Hovud
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | teikn | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 68 | 65 | 61 | 64 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | h | e | a | d | . | . | . | . | . | . | . | . | . | . | . | . |
0x0010 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Datatype | Betegnelse | Forklaring |
---|---|---|---|
0x0000 | uint(32) | Magiske byte | |
0x0004 | uint(24) | Blokklengde | |
0x0007 | uint(8) | Flagg | |
0x0008 | uint(32) | Versjon / Flagga? | Denne verdien kan vere ei versjonsopplysning for filformatet; i alle filene eg har tilgjengeleg, stod det her verdien |
0x000c | uint(32) | Brei (Horisontal oppløysing) | Oppgjev kor brei bildefila er (i pikslar). For alle brønnene i Outpost 2 vil verdien her vere |
0x0010 | uint(32) | Høgd (Vertikal oppløysing) | Angir korleis høg bilete er (i pikslar). For alle brønnene i Outpost 2 vil verdien her vere |
0x0014 | uint(32) | Fargedjup? | Sidan han i alle kontrollerte filer inneheld verdien |
0x0018 | uint(32) | Fargegradering 2? | Det kan hende det er en 'mål'-fargedybde. |
Etter desse opplysningane følgjer det ei palettfil i det standardiserte RIFF-formatet. Den nøyaktige spesifikasjonen finn ein - sidan palettane også dukkar opp andre stader - under Palettane.
Fliser Data
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | teikn | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 64 | 61 | 74 | 61 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | d | a | t | a | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Datatype | Betegnelse | Forklaring |
---|---|---|---|
0x0000 | uint(32) | Magiske byte | |
0x0004 | uint(24) | Blokklengde | |
0x0007 | uint(8) | Flagg |
Til slutt følger dei reine pixeldata, frå venstre-øvre hjørne radvis til høgre-nedre hjørne.
Dataverdien i grafikane som som regel er i 8bpp-bitmaps, tilsvarar indeksen til fargen i fargepaletten.
Spillmotoren teiknar brikkene *sannsynlegvis* på etterspørsel.
Dette ser ut til å vere knytt til dag-kveld-syklusen, som har 32 nivå av individuelle brikker. Det ser ut til at det vert trekt 'litt' frå lysverdien. Nøyaktige verdiar har enno ikkje blitt fastsett, eg arbeider på grunnlag av berekninga
v *= (daylight / 48) + 0.25;
med HSV-dataene til pikselane, der daylight er ein verdi frå 0-31 og v er ein verdi mellom 0-1. Det må også takast med i vurderinga at det på kartet er ein kant på 16 brikker til venstre og høgre (denne vert brukt til usynleg spawning av einingar).
I tillegg ser det ut til at dag-kveld-syklusen oppdaterer berre ein kolonne av kartet per spel-syklus.
Eit akselerert dag-kveld-syklus ser difor slik ut:
PRT
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | teikn | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 43 | 50 | 41 | 4c | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | C | P | A | L | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Datatype | Betegnelse | Forklaring |
---|---|---|---|
0x0000 | uint(32) | Magiske Byte | |
0x0004 | uint(24) | Palettlengde | Gjev, i motsetning til det vanlege blokkformatet, talet på palettar som finst i denne fila - ikkje lengda på blokka i byte. |
0x0007 | uint(8) | Flagg | Sannsynlegvis, som vanleg, flagg. Eg kjenner imidlertid ikkje til nokon flagg; sidan alle kjente verdiar tilsvarar |
Kva PRT
står for er meg ikkje kjent; det kan til dømes vere 'Palette and Resource Table' - då dette er ei fil - å finne som op2_art.prt i maps.vol - som handlar om dette, eller dette ville godt beskrive funksjonen.
Denne fila inneheld ei liste over palettar, ei tabell over alle brukte bitmap-bilete, alle animasjonsdefinisjonar og ei rekkje ukjente data. Den følgjer det tidlegare containerformatet laust, sidan ikkje alle datapostar følgjer dette skjemaet.
CPAL
-seksjonen (som sannsynlegvis står for palettcontainer) omfatar berre palettdata, ved å angi kor mange av dei vanlegvis 1052 byte store 8-bit palettane som finst.
1052-byte spesifikasjonen er ikkje bindande, då palettformatet potensielt kan ha ulike palettstorleikar. Den gjeld berre for datainnhaldet som Outpost 2 blir levert med.
Etter palettlistene følgjer umiddelbart, utan innleiande header, lista over bitmap-bilete; på same måte følgjer animasjonslistene umiddelbart etter.
Begge blir innleia med ein uint(32) (eller igjen uint24+uint8 flagg?) som inneheld talet på datapostar.
Palettane
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | teikn | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 50 | 50 | 41 | 4c | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | P | P | A | L | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Datatype | Betegnelse | Forklaring |
---|---|---|---|
0x0000 | uint(32) | Magiske byte | |
0x0004 | uint(24) | Palettlengde | Gjev, i motsetnad til det vanlege blokkformatet, talet på palettar som finst i denne fila - ikkje lengda på blokka i byte. |
0x0007 | uint(8) | Flagg | Truleg, som vanleg, flagg. Eg kjenner imidlertid ikkje til nokon flagg; sidan alle kjente verdiar er |
Informasjonen om pallane er veldig enkel å lese.
Den består av ein header og eit datasegment.
Palett-header
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | teikn | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 68 | 65 | 61 | 64 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | h | e | a | d | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Datatype | Betegnelse | Forklaring |
---|---|---|---|
0x0000 | uint(32) | Magiske byte | |
0x0004 | uint(24) | Palettlengde | Gjev, i motsetnad til det vanlege blokkformatet, talet på palettar som finst i denne fila - ikkje lengda på blokka i byte. |
0x0007 | uint(8) | Flagg | Truleg, som vanleg, flagg. Eg kjenner imidlertid ikkje til nokon flagg; sidan alle kjente verdiar er |
0x0008 | uint(32) | Palettformat-versjon? | Definerer sannsynlegvis kva palettformatversjon paletten følgjer. Alle Outpost2-palettar ser ut til å ha versjon |
Palettdata
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | teikn | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 64 | 61 | 74 | 61 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | d | a | t | a | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Datatype | Betegnelse | Forklaring |
---|---|---|---|
0x0000 | uint(32) | Magiske byte | |
0x0004 | uint(24) | Blokklengde | |
0x0007 | uint(8) | Flagg |
Data-seksjonen registrerer dei enkelte palletteinlegg. Antallet av palletteinlegg kjem av blokk-lengda / 4.
Dei enkelte innlegga har ein enkel oppbygging som følgjer;
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | teikn | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | 04 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Datatype | Betegnelse | Forklaring |
---|---|---|---|
0x0000 | uint(8) | Rød-komponent | Gjev den raude andelen av fargen |
0x0001 | uint(8) | Grøn komponent | Gjev grønnandelen av fargen |
0x0002 | uint(8) | Blå-komponent | Gir blåandelen av fargen |
0x0003 | uint(8) | Ukjent - Flagg? | Det er uklart kva denne verdien betyr, sidan han tilsynelatande alltid er |
Når det gjeld palettane, er det ellers å seie at for palettar som skal brukast til animasjonar, gjeld følgjande reglar:
- Den første fargen er ALLTID transparent, uansett kva verdi som er oppgitt der.
-
Palett-postane 1-24 vert rekna som spelarfarge i palettane 1-8.
Kor fargane utanom spelar 1 kjem frå, er meg uvisst.
Jeg mistenker at dei resterande fargane er hardkodet.
Bitmaps
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | teikn | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
0x0010 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Datatype | Betegnelse | Forklaring |
---|---|---|---|
0x0000 | uint(32) | Retta breidde | Gir breidda av pikseldata-linjene i byte - sidan desse er justert til 4-byte-grensene. Dersom er det raskt mogleg å hoppe til ei bestemt bildelinje. Kvifor denne verdien vert lagra separat, sjølv om han kunne ha blitt rekna ut, er uklart. |
0x0004 | uint(32) | Offset | Gjev offsetet til den fyrste lina i bitmapen |
0x0008 | uint(32) | Høgd | Gir høgda på biletet i pikslar |
0x000c | uint(32) | Bredde | Angir breidda på biletet i pikslar |
0x0010 | uint(16) | Typ | Gjev typen av bilete. Her ser det ut til å vere ei bitmaske:
|
0x0012 | uint(16) | Palett | Definerer kva palett som skal brukast frå PRT-fila |
Denne datastrukturen i PRT-filen angir korleis bitmapane som vert brukte for spritane er oppbygd. Desse bitmapane fungerer som enkeltkomponentar, der fleire vert sett saman til ein animasjonsramme for ein sprite.
Dei konkrete bileta finst i op2_art.BMP i spelkatalogen.
Kvifor denne bitmapfilen har ein (for det meste korrekt) RIFF-bitmapheader, er uklart. Sannsynlegvis bruker Outpost 2 system-API-ar for å laste grafikk, ved å ta denne headeren midlertidig og overskrive dei tilsvarande, variande felta.
Pixeldata er plassert i BMP-filen på Offset + uint32-offsetet, som kan finnast i BMP-filen på adresse 0x000A (RIFF-bitmap-dataoffset), og svarar igjen til radvis ordning frå øvst til venstre til nedst til høgre.
Monokrome 1bpp-grafikk kan teiknast slik at farge 0 er fullstendig transparent, medan farge 1 er halvtransparent svart/grå, sidan monokrom-grafikk vanlegvis vert brukt til skuggar for køyretøy og bygningar i animasjonane.
Dersom ein kan sette saman mange grafikkar på denne måten.
Animasjonen
no kjem vi til kongeklassen av disiplinar innan Outpost 2 dataformata:
Animasjonane.
Animationslistene blir innleidd med ein global header, som primært er til for dataverifikasjon. Deretter følgjer dei konkrete animasjonsdefinisjonane, som er delt inn i 3 nivå:
-
Animajon
Ein animasjon er den øvste instansen; ho representerer animasjonen av ein eining, ein bygning eller ein 'partikkel-animasjon' (kometnedslag, vêr, eksplosjon) i ein bestemt utgangspunkt. -
Frame
Ein frame er eit enkelt bilete innanfor ei animasjon. Ei animasjon kan innehalde ein eller fleire frames. -
Subframe
Ein subframe er informasjon om at ei bestemt bitmap skal teiknast på ein bestemt posisjon i eit frame under bestemte kriterium. Eit frame kan innehalde ein eller fleire subframes.
Deretter følgjer dei enkelte animasjonsdefinisjonane direkte.
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | teikn | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Datatype | Betegnelse | Forklaring |
---|---|---|---|
0x0000 | uint(32) | Antall animasjonar | Kor mange animasjonsdatasett er det? |
0x0004 | uint(32) | Antall rammer | Kor mykje rammer bør det vere totalt |
0x0008 | uint(32) | Antall underrammer | Kor mykje subrammer skal det vere totalt |
0x000c | uint(32) | Antall valfrie oppføringar | Kor mange "valfrie oppføringar" som finst. |
Animasjon
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | teikn | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
0x0010 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
0x0020 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Datatype | Betegnelse | Forklaring |
---|---|---|---|
0x0000 | uint(32) | Ukjent 1 | Ukjente opplysningar |
0x0004 | uint(32) | Avgrensingsboks: Venstre | Gjev den venstre starten (i pikslar) av Bounding Box. |
0x0008 | uint(32) | Avgrensningsboks: Ovenfor | Angir den øvste starten (i pikslar) av Bounding Box. |
0x000c | uint(32) | Avgrensingsboks: Breidd | Gjev breidd (i pikslar) av Bounding Box. |
0x0010 | uint(32) | Avgrensningsboks: Høgde | Gjev høgda (i pikslar) til Bounding Box. |
0x0014 | uint(32) | Offset: X | Gjev den horisontale midtpunktet av animasjonen |
0x0018 | uint(32) | Offset: Y | Angir den vertikale midtpunkten av animasjonen |
0x001c | uint(32) | Ukjent 2 | Ukjend informasjon |
0x0020 | uint(32) | Antall rammer | Gjev til, kor mange animasjonsrammer som er inkludert i denne animasjonen |
0x0024 | uint(32) | Antall vindauger | Angir kor mange vindauger som skal brukast når ein teiknar |
Dataene til det øvste laget, animasjonen, er først og fremst forvaltningsdata - Boundingbox refererer til koordinatane til merkedomenet rundt kjøretøyet/bygningen, når det er valt, og indikerer også samtidig kva område som skal være klikkbart.
Offsetet bestemmer først og fremst "nullpunktet"; punktet som skal leggjast til eller trekkast frå spelintern koordinatar. Man kan også seie matematisk at offsetet her refererer til koordinatorigins.
Vindauga består, akkurat som offsetet, av 4 uint(32)-verdier per vindauge, som angir eit område som er brukbart for enkelt subrammer. Utenfor vindauga skal det, så lenge det er tiltenkt for bitmapen, ikkje teiknast.
Ramme
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | teikn | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Datatype | Betegnelse | Forklaring |
---|---|---|---|
0x0000 | uint(8) | Subframe-nummer og brytar for Valgfri 1, 2 | Denne verdien inneheld:
|
0x0001 | uint(8) | Ukjent 1 og Toggle for Valgfri 3, 4 | Denne verdien inneheld:
|
0x0002 | uint(8) | Valgfritt 1 | Ukjent |
0x0003 | uint(8) | Valgfri 2 | Ukjent |
0x0004 | uint(8) | Valgfri 3 | Ukjent |
0x0005 | uint(8) | Valgfri 4 | Ukjent |
Underramme
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | teikn | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Datatype | Betegnelse | Forklaring |
---|---|---|---|
0x0000 | uint(16) | Bitmap-ID | Angir kva bitmap som skal nyttast for denne underramma |
0x0002 | uint(8) | Ukjent 1 | Er ukjent - eg mistenker imidlertid sterkt at dette handlar om ein render-prioritet (Z-lag). |
0x0003 | uint(8) | Subramme-ID | Oppgjev kva underkarm vi er i |
0x0004 | sint(16) | Offset - Horisontal | Angir kvar innan rammeverket subramma skal plasserast, eller kor mange pikslar bitmapen skal flyttast horisontalt. |
0x0006 | sint(16) | Offset - Vertikal | Angir kvar innanfor ramma subramma skal plasserast, eller kor mange pikslar bitmapen skal vertikalt flyttast. |
Med dette kan vi no sette saman enkeltbilde og heile animasjonar i samsvar, her demonstrert med eit meir komplisert eksempel, animasjonen med indeks 500.
Animasjon 500
Animasjon 500 viser korleis ein Plymouth-transportar, lasta med vanleg malm, blir lossa. Dette er ein av dei få animasjonane som nyttar vindusfunksjonaliteten.
Og slik kan heile animasjonen setjast saman.
Dessverre er det eit problem med den øvste lasteluka, sidan det aktuelle bitet i grafikktypa-informasjonen ikkje er sett.
Her er nokre fleire, vakkert animerte sprites frå spelet:
Brukargrensesnitt
Når brukergrensesnittet til spelet manglar, er det halde i ein børsta metall-look.
Men også her er det tydeleg at Dynamix ikkje måtte oppfinne hjulet på nytt; her blir ikkje berre dei enkle funksjonane frå Windows sine User32- og GDI32-APIar nytta - spesielt blir også ressursforvaltninga frå User32 brukt.
Desse kan ein for eksempel hente ut ved hjelp av program som det frie programmet Resource Hacker, utvikla av Angus Johnson, eller - dersom ein er skeptisk til å bruke Wine under Linux / Mac OS - ved hjelp av wrestool som er inkludert i icoutils.
Filnamn | Innhald |
---|---|
Outpost2.exe | Inneheld berre ikonet til spelet, som viser romstasjonen føre New Terra |
op2shres.dll | Inneheld i tillegg til grafikk for kontroller som rammer, knappar, radioknappar og avkrysningsboksar også dialogbakgrunnar, følgjebilete for historietekstar og bakgrunnsgrafikk for hovudmenyen |
out2res.dll | Inneheld in-game vindusdekorasjon, ikon for vanleg og spesialmetall, lasteskjerm, grafikk for dialogar samt ytterlegare musepeikar-grafikk, i tillegg til dei animerte i spelmappa |