Outpost 2 Filformat · bei.pm

Denne teksten vart automatisert omsett av OpenAI GPT-4o Mini.

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.

Kunstverk frå spelet

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:

  • 0x204C4F56 ('VOL '):
    Volum
  • 0x686C6F76 ('VOLH'):
    Volum-Header
  • 0x736C6F76 ('VOLS'):
    Volum-Strings
  • 0x696C6F76 ('VOLI'):
    Volum-informasjonar
  • 0x4B4C4256 ('BLCK'):
    Volum-Block
  • 0x504D4250 ('PBMP'):
    Grafikkdata
  • 0x4C415050 ('PPAL'):
    Fargepalett
  • 0x4C415043 ('CPAL'):
    Fargepalett-Container
  • 0x64616568 ('head'):
    Header
  • 0x61746164 ('data'):
    Brukardata
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.

  • 0x03 er sett dersom fila er komprimert. Her kjem det til å bli brukt eit Huffmann-tre.
  • 0x80 er tilsynelatande alltid sett.

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

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 0x20 eller 32.

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 0x20 eller 32.

0x0014 uint(32) Fargedjup?

Sidan han i alle kontrollerte filer inneheld verdien 8, kan det vere snakk om ein fargedjupneindikasjon.

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.

Pixeldata begynner oppe til venstre og ender nede til høgre.

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:

Visualisering av dag-kveld-syklusen

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 0x00, ville det også potensielt vere mogleg at talet på palettar rett og slett er ein uint(32).

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 0x00, ville det også kunne vere mogleg at talet på palettar berre er ein uint(32).

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 0x00, ville det også kunne vere mogleg at talet på palettar berre er ein uint(32).

0x0008 uint(32) Palettformat-versjon?

Definerer sannsynlegvis kva palettformatversjon paletten følgjer.

Alle Outpost2-palettar ser ut til å ha versjon 0x01.

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

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.

Palett-referanse

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.
Kanskje det er ein optimalisering for render-koden.

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:

  • 0x04 er sett dersom det er snakk om eit 1bpp-bilete.
  • 0x40 er sett dersom det er snakk om eit bilete som må implementere vindusfunksjonar.
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.

Beskytta bustadmodul (Plymouth)

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å:

  1. 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.
  2. Frame
    Ein frame er eit enkelt bilete innanfor ei animasjon. Ei animasjon kan innehalde ein eller fleire frames.
  3. 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:

  • 0x7F (Bitmaske): Talet på subrammar som vert brukte i denne rama
  • 0x80: Informasjonen om hendinga av Valfrie 1 og 2
0x0001 uint(8) Ukjent 1 og Toggle for Valgfri 3, 4

Denne verdien inneheld:

  • 0x7F (Bitmaske): Uviss - Eg mistenker sterkt at dette er talet på gameticks som går før neste frame blir vist
  • 0x80: Informasjonen om huruvida Valgfritt 3 og 4 er til stades
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:

Rendering av animasjon 500 illustrert

Animasjon 500 ferdig samansett

Plymouth Byggefabrikk

Eden Romhavn

Eden Medisinsk Senter

SCAT

Plymouth Romhavn

Påskeegg:
Julenisse

Påskeegg:
Dans Hund

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