Formats de fitxer d'Outpost 2 · bei.pm
Els formats de fitxer descrits en aquesta pàgina es basen en l'anàlisi tècnica de la propietat intel·lectual de Dynamix, Inc. i Sierra Entertainment.
La propietat intel·lectual forma part actualment de la massa d'Activision Publishing, Inc. / Activision Blizzard, Inc. i actualment és propietat de Microsoft Corp..
La informació s'ha recopilat mitjançant Enginyeria inversa i Anàlisi de dades amb l'objectiu d'arxivar i garantir la interoperabilitat amb dades històriques.
No s'han utilitzat especificacions propietàries ni confidencials.
El joc es pot adquirir actualment a gog.com com a descàrrega.
La següent sèrie d'articles documenta les meves conclusions sobre els formats de dades en el joc d'estratègia en temps real "Outpost 2: Divided Destiny", que va ser publicat per Sierra el 1997 i desenvolupat per Dynamix.
Em vaig dedicar principalment a l'anàlisi de les dades del joc - i el que se'n pot fer - aproximadament des de l'1 de novembre de 2015 fins al 14 de novembre de 2015.
Segons la informació que he pogut obtenir fins ara, Dynamix - com tants altres empreses comercials - no va desenvolupar alguns formats de dades específicament per a Outpost 2, sinó que també els va utilitzar en altres projectes com ara la sèrie Mechwarrior (modificats).
A més, es pot constatar que la capacitat d'innovació dels formats de dades es limita pràcticament i sovint es basa en conceptes més antics de formats habituals com JFIF i RIFF.
Per a la interpretació de les taules i formats de dades, hi ha més informació disponible a Què és què?.
Les dades aquí indicades s'han d'entendre generalment com a Little Endian.
En conclusió, es pot dir que l'enginyeria inversa va ser molt divertida, tot i que no és completa.
Naturalment, també recomano jugar al joc per si mateix, ja que ofereix mecàniques de joc interessants.
Introducció
Els formats de dades utilitzats per Outpost 2 tenen una estructura que recorda a JFIF / PNG - els blocs de dades individuals sempre tenen un capçal de 8 bytes. Per tant, m'estalvio documentar els caps individuals als llocs específics corresponents i només documentaré les desviacions.
El format és sempre el següent; les dades útils reals estan incrustades dins d'ell:
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | caràcter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Desplaçament | Tipus de dada | Designació | Explicació |
---|---|---|---|
0x0000 | uint(32) | Bytes màgics | Conté la informació sobre què s'ha d'esperar al pròxim bloc de dades. Valors coneguts:
|
0x0004 | uint(24) | Longitud del bloc | Conté la informació sobre quina mida (en Byte) té el següent bloc de dades. En aquest cas, es refereix només a les dades útils - els 8 bytes d'encapçalat no s'inclouen. |
0x0007 | uint(8) | Banderes? | Es desconeix per a què serveix exactament aquest bloc. En els volums, aquest valor és freqüentment 0x80, mentre que en altres fitxers és sovint 0x00. Això suggereix que es tracta d'un conjunt de flags. |
Volums
Els volums són un contenidor de dades per al joc, similar a un format d'arxiu com ara Tarball. Almenys a Outpost 2, el format només reconeix fitxers - no carpetes. Probablement, però, es podrien simular aquestes últimes mitjançant noms de fitxer adequats.
Un volum consta del capçalera del volum així com de diversos blocs de volum que corresponen als fitxers concrets.
"Volums" són els fitxers amb l'extensió 'vol'
a la carpeta del joc.
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | caràcter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 56 | 4f | 4c | 20 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | V | O | L | . | . | . | . | . | . | . | . | . | . | . | . |
Desplaçament | Tipus de dada | Designació | Explicació |
---|---|---|---|
0x0000 | uint(32) | Bytes màgics | |
0x0004 | uint(24) | Longitud del bloc | |
0x0007 | uint(8) | Banderes |
Capçalera de volum
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | caràcter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 76 | 6f | 6c | 68 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | v | o | l | h | . | . | . | . | . | . | . | . | . | . | . | . |
Desplaçament | Tipus de dada | Designació | Explicació |
---|---|---|---|
0x0000 | uint(32) | Bytes màgics | |
0x0004 | uint(24) | Longitud del bloc | |
0x0007 | uint(8) | Banderes |
El volum header no conté cap dada útil.
Només serveix com a contenidor.
Com a primera dada al volum header s'han de trobar les cadenes del volum; a continuació hi ha les informacions del volum.
Cadenes de volum
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | caràcter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 76 | 6f | 6c | 69 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | v | o | l | i | . | . | . | . | . | . | . | . | . | . | . | . |
Desplaçament | Tipus de dada | Designació | Explicació |
---|---|---|---|
0x0000 | uint(32) | Bytes màgics | |
0x0004 | uint(24) | Longitud del bloc | |
0x0007 | uint(8) | Banderes |
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | caràcter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 76 | 6f | 6c | 73 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | v | o | l | s | . | . | . | . | . | . | . | . | . | . | . | . |
Desplaçament | Tipus de dada | Designació | Explicació |
---|---|---|---|
0x0000 | uint(32) | Bytes màgics | |
0x0004 | uint(24) | Longitud del bloc | |
0x0007 | uint(8) | Banderes | |
0x0008 | uint(32) | Longitud del payload | Indica quants bytes de les dades següents són realment dades útils. Les dades restants de la llista de cadenes de volum semblen ser considerades com a escombraries. En fitxers amb data posterior, aquestes 'dades restants' són 0x00, la qual cosa podria indicar deficiències amb la cadena d'eines durant el desenvolupament del joc, és a dir, que un desenvolupador no es va preocupar de la correcta inicialització dels búfers fins molt tard, ja que no té cap influència en el joc si les dades estan inicialitzades o no. |
0x000c | uint(8)[] | Llista de noms de fitxers | Aquí es tracta d'una llista terminada en 0 bytes de noms de fitxers que, almenys en el component de dades present, només sembla esperar caràcters ASCII. No és necessari, en analitzar les dades, avaluar aquest bloc de dades amb més detall, ja que en la informació del volum es referencien directament els offsets dels noms de fitxers. |
Les cadenes de volum són una llista de noms de fitxers que es troben dins del volum.
Informació del volum
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | caràcter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 76 | 6f | 6c | 69 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | v | o | l | i | . | . | . | . | . | . | . | . | . | . | . | . |
Desplaçament | Tipus de dada | Designació | Explicació |
---|---|---|---|
0x0000 | uint(32) | Bytes màgics | |
0x0004 | uint(24) | Longitud del bloc | |
0x0007 | uint(8) | Banderes |
La informació de volum conté detalls més específics relacionats amb els fitxers. D'alguna manera, és una mena d'entrada de directori FAT (FAT = File Allocation Table).
El nombre de fitxers es calcula dividint la mida del bloc per la longitud de les entrades del directori - 14 bytes.
Les entrades de directori individuals tenen l'estructura següent:
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | caràcter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Desplaçament | Tipus de dada | Designació | Explicació |
---|---|---|---|
0x0000 | uint(32) | Desplaçament del nom del fitxer | Indica en quin desplaçament (!) dins de la llista de noms de fitxer (cadenes de volum) es troba el nom del fitxer. Es refereix al començament del bloc de dades útils. |
0x0004 | uint(32) | Desplaçament de fitxer | Indica en quin offset dins del fitxer de volum s'ubica el fitxer. |
0x0008 | uint(32) | Mida del fitxer | Indica quina és la mida del fitxer en bytes. |
0x000c | uint(16) | Banderes? | Ofereix aparentment informació addicional sobre la codificació de fitxers.
|
Bloc de volum
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | caràcter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 56 | 42 | 4c | 48 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | V | B | L | H | . | . | . | . | . | . | . | . | . | . | . | . |
Desplaçament | Tipus de dada | Designació | Explicació |
---|---|---|---|
0x0000 | uint(32) | Bytes màgics | |
0x0004 | uint(24) | Longitud del bloc | |
0x0007 | uint(8) | Banderes |
Un volum de bloc és un contenidor que allotja fitxers. Conté només una vegada més - a causa del format del bloc - la mida del fitxer, i després segueixen directament les dades útils.
rajoles
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | caràcter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 50 | 42 | 4d | 50 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | P | B | M | P | . | . | . | . | . | . | . | . | . | . | . | . |
Desplaçament | Tipus de dada | Designació | Explicació |
---|---|---|---|
0x0000 | uint(32) | Bytes màgics | |
0x0004 | uint(24) | Longitud del bloc | |
0x0007 | uint(8) | Banderes |
Les fitxes són un format gràfic de bitmap específic d'Outpost-2. S'estenen a través de 13 conjunts de fitxes, anomenats "wells" (well0000.bmp
fins well0012.bmp
), que es troben dins del volum maps.vol.
Així, els conjunts de fitxes / wells contenen el següent:
Nom del fitxer | Contingut |
---|---|
well0000.bmp | Una gràfica de 32x32px, de color blau - ideal per provar si el teu carregador d'imatges funciona |
well0001.bmp | Conté roca clara, cadenes muntanyoses sobre roca clara i nombroses variants de cràters d'impacte en roca clara |
well0002.bmp | Conté 'Doodads' de roca clara - és a dir, elements que poden ser col·locats per decoració (o intencionadament com a estructura, com per exemple murs) sobre roca clara, incloent vegetació |
well0003.bmp | Conté una estructura semblant a una crosta sobre roca clara |
well0004.bmp | Conté roca fosca, cadenes muntanyoses sobre roca fosca i nombroses variants de cràters d'impacte en roca fosca |
well0005.bmp | Conté 'Doodads' de roca fosca - és a dir, elements que poden ser col·locats per decoració (o intencionadament com a estructura, com per exemple murs) sobre roca fosca |
well0006.bmp | Conté una estructura semblant a una crosta sobre roca fosca, així com transicions entre roca clara i roca fosca |
well0007.bmp | Conté lava, incloent 4-5 fotogrames d'animació de la mateixa |
well0008.bmp | Conté sorra i nombroses variants de cràters d'impacte en sorra |
well0009.bmp | Conté 'Doodads' de sorra - és a dir, elements que poden ser col·locats per decoració (o intencionadament com a estructura, com per exemple murs) sobre sorra |
well0010.bmp | Conté 48 transicions de sorra a roca clara i roca fosca |
well0011.bmp | Conté les capes polars del mapa, amb roca fosca com a substrat |
well0012.bmp | Conté les capes polars del mapa, amb roca clara com a substrat |
És molt recomanable per a una implementació acurada no renderitzar les fitxes amb antelació per tal de fer-ne la memòria cau, ja que les dades per al cicle de dia/nit encara s'han de processar - i s'acumularien moltes dades.
Les fitxes són gràfics de 8bpp amb paleta indexada de 32x32 píxels de resolució, que estan disposades de manera col·locada. En un conjunt de fitxes així creat, però, es poden obtenir moltes més
El contenidor principal consta de 2 seccions: head
i data
.
Capçalera de les Fitxes
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | caràcter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 68 | 65 | 61 | 64 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | h | e | a | d | . | . | . | . | . | . | . | . | . | . | . | . |
0x0010 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Desplaçament | Tipus de dada | Designació | Explicació |
---|---|---|---|
0x0000 | uint(32) | Bytes màgics | |
0x0004 | uint(24) | Longitud del bloc | |
0x0007 | uint(8) | Banderes | |
0x0008 | uint(32) | Versió / Banderes? | Això podria ser una indicació de la versió del format de fitxer; en tots els fitxers que tinc, aquí apareixia el valor |
0x000c | uint(32) | Amplada (Resolució horitzontal) | Indica quina és l'amplada del fitxer d'imatge (en píxels). En tots els pous d'Outpost 2 s'espera aquí el valor |
0x0010 | uint(32) | Alçada (Resolució vertical) | Indica quina és l'alçada del fitxer d'imatge (en píxels). En tots els pous d'Outpost 2 s'espera aquí el valor |
0x0014 | uint(32) | Profunditat de color? | La importància d'aquest valor és desconeguda. Com que apareix amb el valor |
0x0018 | uint(32) | Profunditat de color 2? | La importància d'aquest valor és desconeguda. Possiblement es tracta d'una profunditat de color 'objectiu'. |
Després d'aquests detalls, es presentarà un fitxer de paleta en format RIFF estàndard. La especificació exacta es pot trobar - ja que les paletes apareixen en altres llocs - a Paletes.
Dades de les fitxes
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | caràcter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 64 | 61 | 74 | 61 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | d | a | t | a | . | . | . | . | . | . | . | . | . | . | . | . |
Desplaçament | Tipus de dada | Designació | Explicació |
---|---|---|---|
0x0000 | uint(32) | Bytes màgics | |
0x0004 | uint(24) | Longitud del bloc | |
0x0007 | uint(8) | Banderes |
Finalment, segueixen les dades de píxels en brut, de dalt a l'esquerra a baix a la dreta, línia per línia.
El valor de les dades en les gràfiques que normalment es presenten com a imatges de 8bpp correspon a l'índex del color a la paleta de colors.
El motor del joc dibuixa els tiles *probablement* sota demanda.
Això sembla ser degut, entre altres coses, al cicle dia-nit, que coneix 32 graduacions de tiles individuals. Sembla que es resta 'una mica' del valor de brillantor. Encara no s'han pogut determinar els valors exactes, estic treballant sobre la base de càlcul
v *= (daylight / 48) + 0.25;
amb les dades HSV dels píxels, on daylight és un valor de 0-31 i v és un valor entre 0-1. A més, cal tenir en compte que al mapa hi ha un marge de 16 tiles cap a l'esquerra i cap a la dreta (que serveix per aparèixer unitats de manera invisible).
A més, sembla que el cicle dia-nit actualitza només una columna del mapa per cada cicle del joc.
Un cicle dia-nit accelerat és, per tant, així:
PRT
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | caràcter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 43 | 50 | 41 | 4c | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | C | P | A | L | . | . | . | . | . | . | . | . | . | . | . | . |
Desplaçament | Tipus de dada | Designació | Explicació |
---|---|---|---|
0x0000 | uint(32) | Bytes màgics | |
0x0004 | uint(24) | Longitud de palets | Indica, a diferència del format de bloc normal, el nombre de paletes que es poden trobar en aquest fitxer - no la longitud del bloc en bytes. |
0x0007 | uint(8) | Banderes | Probablement, com és habitual, banderes. Tanmateix, no conec cap bandera; ja que tots els valors que conec corresponen a |
No sé exactament què significa PRT
; una possibilitat podria ser 'Palette and Resource Table' - ja que aquest fitxer - que es troba com a op2_art.prt dins de maps.vol - és un d'aquest tipus, o això descriuria força bé la seva funció.
Aquest fitxer conté una llista de paletes, una taula sobre totes les imatges de mapa utilitzades, totes les definicions d'animació i una sèrie de dades desconegudes. Segueix de manera laxa el format de contenidor anterior, ja que no tots els registres segueixen aquest esquema.
La secció CPAL
(que probablement significa contenidor de paletes) només envolta les dades de paleta, especificant quantes de les habituals paletes de 8 bits de 1052 bytes hi ha disponibles.
La indicació de 1052 bytes no es considera vinculant, ja que el format de paleta podria preveure diferents mides de paleta. Només s'aplica al conjunt de dades amb el qual es lliura Outpost 2.
Després de les llistes de paletes, segueix immediatament i sense un encapçalament introductori, la llista d'imatges de mapa; igualment, immediatament segueixen les llistes d'animacions.
Ambdues s'inicien amb un uint(32) (o de nou uint24 + uint8 flags?) que conté el nombre de registres.
Paletes
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | caràcter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 50 | 50 | 41 | 4c | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | P | P | A | L | . | . | . | . | . | . | . | . | . | . | . | . |
Desplaçament | Tipus de dada | Designació | Explicació |
---|---|---|---|
0x0000 | uint(32) | Bytes màgics | |
0x0004 | uint(24) | Longitud de palets | Indica, a diferència del format de bloc normal, el nombre de palets que es poden trobar en aquest fitxer - no la longitud del bloc en bytes. |
0x0007 | uint(8) | Banderes | Probablement, com és habitual, banderes. No obstant això, no conec cap bandera; com que tots els valors que conec corresponen a |
La informació de les palets és molt fàcil de llegir.
Consisteix en un encapçalament i un segment de dades.
Capçalera de paletes
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | caràcter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 68 | 65 | 61 | 64 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | h | e | a | d | . | . | . | . | . | . | . | . | . | . | . | . |
Desplaçament | Tipus de dada | Designació | Explicació |
---|---|---|---|
0x0000 | uint(32) | Bytes màgics | |
0x0004 | uint(24) | Longitud de palets | Indica, a diferència del format de bloc normal, el nombre de palets que es poden trobar en aquest fitxer - no la longitud del bloc en bytes. |
0x0007 | uint(8) | Banderes | Probablement, com és habitual, banderes. No obstant això, no conec cap bandera; com que tots els valors que conec corresponen a |
0x0008 | uint(32) | Versió del format de paleta? | Probablement defineix quina versió del format de paletes segueix la paleta. Totes les paletes d'Outpost2 semblen tenir la versió |
Dades de palets
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | caràcter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 64 | 61 | 74 | 61 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | d | a | t | a | . | . | . | . | . | . | . | . | . | . | . | . |
Desplaçament | Tipus de dada | Designació | Explicació |
---|---|---|---|
0x0000 | uint(32) | Bytes màgics | |
0x0004 | uint(24) | Longitud del bloc | |
0x0007 | uint(8) | Banderes |
La secció de dades inclou les entrades de palets individuals. El nombre d'entrades de palets es calcula a partir de la longitud del bloc / 4.
Les entrades individuals tenen l'estructura següent, senzilla;
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | caràcter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | 04 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Desplaçament | Tipus de dada | Designació | Explicació |
---|---|---|---|
0x0000 | uint(8) | Component de vermell | Indica la proporció de color vermell |
0x0001 | uint(8) | Component verd | Indica la proporció de color verd |
0x0002 | uint(8) | Component blau | Indica la proporció de blau del color |
0x0003 | uint(8) | Desconegut - Bandes? | És poc clar què significa aquest valor, ja que aparentment és fonamentalment |
Respecte a les paletes, només cal dir que per a les paletes que s'utilitzaran en les animacions, s'apliquen les següents normes:
- El primer color és SEMPRE transparent, independentment del valor que s'hi indiqui.
-
Les entrades de paleta 1-24 es consideren com a color del jugador en les paletes 1-8.
On proven exactament els colors fora del jugador 1, no ho sé.
Sospito que els colors restants estan codificats de manera fixa.
Imatges de píxels
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | caràcter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
0x0010 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Desplaçament | Tipus de dada | Designació | Explicació |
---|---|---|---|
0x0000 | uint(32) | Amplada alineada | Indica l'amplada de les línies de dades de píxels en bytes - ja que estan alineades a múltiples de 4 bytes. Així és ràpidament possible accedir a una línia d'imatge específica. Per què aquest valor es desa per separat, tot i que es podria calcular, no està clar. |
0x0004 | uint(32) | Compensació | Indica l'offset de la primera línia en el bitmap |
0x0008 | uint(32) | Alçada | Indica l'alçada de la imatge en píxels |
0x000c | uint(32) | Ample | Indica l'amplada de la imatge en píxels |
0x0010 | uint(16) | Tipus | Indica el tipus d'imatge. Aquí sembla que es tracta d'una màscara de bits:
|
0x0012 | uint(16) | Paleta | Defineix quina paleta s'ha d'utilitzar del fitxer PRT |
Estructura de dades d'arxiu PRT que indica com estan formats els bitmaps que s'utilitzen per als sprites. Aquests bitmaps serveixen com un component individual, del qual es munten diversos en un fotograma d'animació d'un sprite.
Les dades d'imatge concretes es troben a la
op2_art.BMP a la carpeta del joc.
Per què aquest arxiu bitmap té un capçalera RIFF (en la seva majoria correcta) és desconegut.
Probablement Outpost 2 utilitza API de sistema per carregar les gràfiques,
agafant temporalment aquest capçalera i sobreescrivint els camps corresponents i variables.
Les dades de píxels es troben a l'arxiu BMP en la posició Offset + l'offset uint32, que es pot localitzar a l'arxiu BMP a l'adreça 0x000A (offset de dades RIFF-Bitmap), i corresponen de nou a l'organització fila per fila d'esquerra a dreta i de dalt a baix.
Gràfics monocroms de 1bpp es poden dibuixar de tal manera que el color 0 sigui totalment transparent, així com el color 1 sigui un negre/gris semi-transparent, ja que els gràfics monocroms s'utilitzen habitualment per a ombres de vehicles i edificis en les animacions.
Així es poden combinar ja moltes gràfiques.
Animacions
Ara arribem a la classe reina de les disciplines dins dels formats de dades d'Outpost 2:
Les animacions.
Les llistes d'animacions s'inicien amb un encapçalament global, que serveix principalment per a la verificació de dades. A continuació, seguixen les definicions concretes d'animacions, que es divideixen en 3 nivells:
-
Animació
Una animació és la instància més alta; representa l'animació d'una unitat, d'un edifici o d'una 'animació de partícules' (impacte de cometes, temps, explosió) en una situació inicial determinada. -
Fotograma
Un fotograma és una imatge única dins d'una animació. Una animació pot incloure un o més fotogrames. -
Subfotograma
Un subfotograma és la informació sobre que una determinada imatge bitmap s'ha de dibuixar en una posició específica d'un fotograma segons uns criteris determinats. Un fotograma pot incloure un o més subfotogrames.
A continuació, es presenten directament les definicions d'animacions individuals.
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | caràcter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Desplaçament | Tipus de dada | Designació | Explicació |
---|---|---|---|
0x0000 | uint(32) | Nombre d'animacions | Quants conjunts de dades d'animació hi ha disponibles |
0x0004 | uint(32) | Nombre de fotogrames | Quants fotogrames haurien d'estar presents en total |
0x0008 | uint(32) | Nombre de subframes | Quants subframes haurien d'estar presents en total |
0x000c | uint(32) | Nombre d'entrades opcionals | Quants "entrades opcionals" hi ha. |
Animació
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | caràcter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
0x0010 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
0x0020 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Desplaçament | Tipus de dada | Designació | Explicació |
---|---|---|---|
0x0000 | uint(32) | Desconegut 1 | Informacions desconegudes |
0x0004 | uint(32) | Quadre delimitador: Esquerres | Indica l'inici esquerre (en píxels) de la Bounding Box. |
0x0008 | uint(32) | Quadre delimitador: Dalt | Indica l'inici superior (en píxels) de la Bounding Box. |
0x000c | uint(32) | Caixa de delimitació: Amplada | Indica l'amplada (en píxels) de la Bounding Box. |
0x0010 | uint(32) | Quadre delimitador: Altura | Indica l'alçada (en píxels) de la Bounding Box. |
0x0014 | uint(32) | Desviació: X | Indica el punt mitjà horitzontal de l'animació |
0x0018 | uint(32) | Desplaçament: Y | Indica el punt mitjà vertical de l'animació |
0x001c | uint(32) | Desconegut 2 | Informació desconeguda |
0x0020 | uint(32) | Nombre de fotogrames | Indica quants fotogrames d'animació hi ha en aquesta animació |
0x0024 | uint(32) | Nombre de Windows | Indica quantes finestres s'han d'aplicar al dibuix |
Les dades de la capa superior, de l'animació, són principalment dades de gestió - la Boundingbox indica les coordenades de la marca al voltant del vehicle/edifici, quan aquest està seleccionat i també indica quina àrea ha de ser clicable.
El desfasament determina principalment el "punt zero"; el punt que s'ha de sumar o restar a les coordenades internes del joc. Es podria dir també de manera més matemàtica: el desfasament indica aquí l' origen de les coordenades.
En les finestres, igual que en el desfasament, hi ha respectivament (per finestra) 4 valors uint(32), que indiquen una àrea que es considera utilitzable per a submarcs individuals. Fora de les finestres no es pot, sempre que estigui destinat per a la bitmap, dibuixar.
Marc
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | caràcter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Desplaçament | Tipus de dada | Designació | Explicació |
---|---|---|---|
0x0000 | uint(8) | Nombre de subxassís i commutador per a Opcional 1, 2 | Aquest valor conté:
|
0x0001 | uint(8) | Desconegut 1 i Toggle per Opcional 3, 4 | Aquest valor conté:
|
0x0002 | uint(8) | Opcional 1 | Desconegut |
0x0003 | uint(8) | Opcional 2 | Desconegut |
0x0004 | uint(8) | Opcional 3 | Desconegut |
0x0005 | uint(8) | Opcional 4 | Desconegut |
Subxassís
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | caràcter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Desplaçament | Tipus de dada | Designació | Explicació |
---|---|---|---|
0x0000 | uint(16) | Bitmap-ID | Indica quina Bitmap s'ha de fer servir per aquest Subframe |
0x0002 | uint(8) | Desconegut 1 | És desconegut - però sospito fortament que es tracta d'una prioritat de renderització (Z-Layer). |
0x0003 | uint(8) | Subframe-Id | Indica en quin submarco ens trobem |
0x0004 | sint(16) | Desplaçament - Horitzontal | Indica on dins del marc s'ha de col·locar el submarco, o bé quants píxels s'ha de desplaçar horitzontalment la imatge de bitmap. |
0x0006 | sint(16) | Desplaçament - Vertical | Indica on dins del frame s'ha de col·locar el subframe, o bé quants píxels s'ha de desplaçar verticalment la bitmap. |
Així podem ara muntar frames individuals, així com animacions completes, aquí es mostra un exemple d'una animació més complexa, l'animació amb l'índex 500.
Animació 500
La animació 500 mostra com es descarrega un transportador Plymouth carregat amb mineral comú. Es tracta d'una de les poques animacions que utilitza la funcionalitat de finestres.
Així és com es pot combinar tota l'animació.
Desafortunadament, hi ha un problema amb la tapa de càrrega superior, ja que aquí el bit corresponent a la informació del tipus de gràfic no està establert.
Aquí teniu alguns altres sprites animats magnífics del joc:
Interfície d'usuari
Només falta la interfície d'usuari del joc, que té un aspecte de metall polit.
Però aquí també és evident que Dynamix no va haver de reinventar la roda; aquí no només s'utilitzen simplement les API User32 i GDI32 proporcionades per Windows, sinó que també s'aplica la gestió de recursos de User32.
Aquests es poden extreure, per exemple, mitjançant programes com el Resource Hacker, que va desenvolupar Angus Johnson com a programari gratuït, o - si es té por d'utilitzar Wine sota Linux / Mac OS - amb l'ajuda de wrestool que es troba dins icoutils.
Nom del fitxer | Contingut |
---|---|
Outpost2.exe | Conté només la icona del joc, que mostra l'estació espacial davant de New Terra |
op2shres.dll | Conté a més de gràfics per a elements de control com contorns, botons, botons de ràdio i caselles de selecció, també fons de diàlegs, imatges d'acompanyament per als textos de les missions de la història i la gràfica de fons del menú principal |
out2res.dll | Conté la decoració de finestres en el joc, icones per a metall comú i especial, la pantalla de càrrega, gràfics per a diàlegs i altres gràfics de cursor, a més dels animats al directori del joc |