Formatos de archivo de Outpost 2 · bei.pm
Los formatos de archivo descritos en esta página se basan en el análisis técnico de la propiedad intelectual de Dynamix, Inc. y Sierra Entertainment.
La propiedad intelectual es actualmente parte de la masa de Activision Publishing, Inc. / Activision Blizzard, Inc. y está en posesión de Microsoft Corp..
La información fue recopilada mediante Ingeniería Inversa y Análisis de Datos con el propósito de archivado e interoperabilidad con datos históricos.
No se utilizaron especificaciones propietarias o confidenciales.
El juego se puede adquirir actualmente como descarga en gog.com.
La siguiente serie de artículos documenta mis hallazgos sobre los formatos de datos en el juego de estrategia en tiempo real "Outpost 2: Divided Destiny", que fue publicado en 1997 por Sierra y desarrollado por Dynamix.
Me he dedicado principalmente al análisis de los datos del juego - y lo que se puede hacer con ellos - desde el 01 de noviembre de 2015 hasta el 14 de noviembre de 2015.
Según la información que he podido obtener hasta ahora, Dynamix - como tantas empresas comerciales - no desarrolló algunos formatos de datos específicamente para Outpost 2, sino que también los utilizó (modificados) en otros desarrollos como, por ejemplo, la serie Mechwarrior.
Independientemente de esto, se puede afirmar que la capacidad de innovación de los formatos de archivo se mantiene bastante limitada y a menudo se basa en conceptos más antiguos de formatos comunes como JFIF y RIFF.
Para la interpretación de las tablas y formatos de datos, hay más información disponible en ¿Qué es qué?.
Los datos aquí indicados se entienden en general como Little Endian.
En conclusión, se puede decir que el reverse engineering fue muy divertido, aunque no está completo.
Por supuesto, también recomiendo jugar el juego en sí, ya que ofrece mecánicas de juego interesantes.
Introducción
Los formatos de datos utilizados por Outpost 2 tienen una estructura similar a JFIF / PNG; cada bloque de datos siempre tiene un encabezado de 8 bytes. Por lo tanto, omito documentar los encabezados individuales en los lugares específicos correspondientes y solo documentaré las desviaciones.
El formato es siempre el siguiente; los datos útiles reales están incrustados en él:
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | carácter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Desplazamiento | Tipo de dato | Denominación | Explicación |
---|---|---|---|
0x0000 | uint(32) | Bytes Mágicos | Contiene la información sobre lo que se puede esperar en el siguiente bloque de datos. Valores conocidos:
|
0x0004 | uint(24) | Longitud del bloque | Contiene la información sobre cuán grande (en bytes) es el siguiente bloque de datos. Se refiere únicamente a los datos útiles; los 8 bytes de encabezado no están incluidos. |
0x0007 | uint(8) | ¿Banderas? | No se sabe exactamente para qué sirve este bloque. En los volúmenes, este valor suele ser 0x80, mientras que en otros archivos a menudo es 0x00. Esto sugiere que se trata de un conjunto de flags. |
Volúmenes
Los volúmenes son un contenedor de datos para el juego, similar a un formato de archivo como, por ejemplo, Tarball. Al menos en Outpost 2, el formato solo reconoce archivos, no carpetas. Probablemente, sin embargo, estos podrían simularse a través de nombres de archivo correspondientes.
Un volumen consiste en el encabezado del volumen y varios bloques de volumen que corresponden a los archivos concretos.
"Volúmenes" son los archivos con la extensión 'vol'
en el directorio del juego.
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 | . | . | . | . | . | . | . | . | . | . | . | . |
Desplazamiento | Tipo de dato | Denominación | Explicación |
---|---|---|---|
0x0000 | uint(32) | Bytes Mágicos | |
0x0004 | uint(24) | Longitud del bloque | |
0x0007 | uint(8) | Banderas |
Encabezado de Volumen
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 | . | . | . | . | . | . | . | . | . | . | . | . |
Desplazamiento | Tipo de dato | Denominación | Explicación |
---|---|---|---|
0x0000 | uint(32) | Bytes Mágicos | |
0x0004 | uint(24) | Longitud del bloque | |
0x0007 | uint(8) | Banderas |
El encabezado del volumen no contiene datos útiles.
Sirve únicamente como contenedor.
Como primera fecha en el encabezado del volumen deberían encontrarse las cadenas del volumen; a continuación siguen las informaciones del volumen.
Cadenas de Volumen
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 | . | . | . | . | . | . | . | . | . | . | . | . |
Desplazamiento | Tipo de dato | Denominación | Explicación |
---|---|---|---|
0x0000 | uint(32) | Bytes Mágicos | |
0x0004 | uint(24) | Longitud del bloque | |
0x0007 | uint(8) | Banderas |
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 | . | . | . | . | . | . | . | . | . | . | . | . |
Desplazamiento | Tipo de dato | Denominación | Explicación |
---|---|---|---|
0x0000 | uint(32) | Bytes Mágicos | |
0x0004 | uint(24) | Longitud del bloque | |
0x0007 | uint(8) | Banderas | |
0x0008 | uint(32) | Longitud de la carga útil | Indica cuántos bytes de los siguientes datos son realmente datos útiles. Los datos restantes de la lista de cadenas de volumen parecen considerarse como basura. En archivos con una fecha posterior, estos 'datos restantes' son 0x00, lo que podría indicar deficiencias en la cadena de herramientas durante el desarrollo del juego, es decir, que un desarrollador solo se ocupó de la correcta inicialización de los buffers muy tarde, ya que no tiene impacto en el juego si los datos están inicializados o no. |
0x000c | uint(8)[] | Lista de nombres de archivos | Se trata de una lista de nombres de archivo terminada en 0 bytes, que - al menos en el presente componente de datos - solo parece esperar caracteres ASCII. No es necesario evaluar este bloque de datos con más detalle al analizar los datos, ya que en la información del volumen se referencian directamente los offsets de los nombres de archivo. |
Los Volume Strings son una lista de nombres de archivos que se encuentran dentro del volumen.
Información del volumen
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 | . | . | . | . | . | . | . | . | . | . | . | . |
Desplazamiento | Tipo de dato | Denominación | Explicación |
---|---|---|---|
0x0000 | uint(32) | Bytes Mágicos | |
0x0004 | uint(24) | Longitud del bloque | |
0x0007 | uint(8) | Banderas |
La información de volumen contiene detalles más específicos sobre los archivos. De alguna manera, se trata de una especie de entrada de directorio FAT (FAT = Tabla de Asignación de Archivos).
La cantidad de archivos se obtiene al dividir el tamaño del bloque por la longitud de las entradas del directorio - 14 bytes.
Cada entrada de directorio tiene la siguiente estructura:
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | carácter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Desplazamiento | Tipo de dato | Denominación | Explicación |
---|---|---|---|
0x0000 | uint(32) | Desplazamiento del nombre del archivo | Indica en qué desplazamiento (!) dentro de la lista de nombres de archivo (cadenas de volumen) se encuentra el nombre del archivo. Se refiere al inicio del bloque de datos. |
0x0004 | uint(32) | Desplazamiento de archivo | Indica en qué desplazamiento dentro del archivo de volumen completo se encuentra el archivo. |
0x0008 | uint(32) | Tamaño del archivo | Indica cuán grande es el archivo en bytes. |
0x000c | uint(16) | ¿Banderas? | Parece que hay información adicional sobre la codificación de archivos.
|
Bloque de Volumen
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 | . | . | . | . | . | . | . | . | . | . | . | . |
Desplazamiento | Tipo de dato | Denominación | Explicación |
---|---|---|---|
0x0000 | uint(32) | Bytes Mágicos | |
0x0004 | uint(24) | Longitud del bloque | |
0x0007 | uint(8) | Banderas |
Un bloque de volumen es un contenedor que almacena archivos. Contiene, debido al formato del bloque, de manera redundante, el tamaño del archivo y a continuación siguen directamente los datos útiles.
Mosaicos
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 | . | . | . | . | . | . | . | . | . | . | . | . |
Desplazamiento | Tipo de dato | Denominación | Explicación |
---|---|---|---|
0x0000 | uint(32) | Bytes Mágicos | |
0x0004 | uint(24) | Longitud del bloque | |
0x0007 | uint(8) | Banderas |
Los tiles son un formato gráfico en bitmap específico de Outpost-2. Se extienden a través de 13 conjuntos de tiles, llamados "wells" (well0000.bmp
hasta well0012.bmp
), que se encuentran dentro del volumen maps.vol.
Los conjuntos de tiles / Wells contienen lo siguiente:
Nombre de archivo | Contenido |
---|---|
well0000.bmp | Una gráfica de 32x32px en azul - ideal para probar si su cargador de imágenes funciona |
well0001.bmp | Contiene roca clara, cordilleras sobre roca clara y numerosas variantes de cráteres de impacto en roca clara |
well0002.bmp | Contiene 'Doodads' de roca clara - elementos que se pueden colocar sobre roca clara para dar variedad (o intencionalmente como estructura, como muros), incluyendo vegetación |
well0003.bmp | Contiene una estructura similar a una corteza sobre roca clara |
well0004.bmp | Contiene roca oscura, cordilleras sobre roca oscura y numerosas variantes de cráteres de impacto en roca oscura |
well0005.bmp | Contiene 'Doodads' de roca oscura - elementos que se pueden colocar sobre roca oscura para dar variedad (o intencionalmente como estructura, como muros) |
well0006.bmp | Contiene una estructura similar a una corteza sobre roca oscura, así como transiciones entre roca clara y oscura |
well0007.bmp | Contiene lava, incluyendo de 4 a 5 fotogramas de animación de la misma |
well0008.bmp | Contiene arena y numerosas variantes de cráteres de impacto en arena |
well0009.bmp | Contiene 'Doodads' de arena - elementos que se pueden colocar sobre arena para dar variedad (o intencionalmente como estructura, como muros) |
well0010.bmp | Contiene 48 transiciones de arena a roca clara y oscura |
well0011.bmp | Contiene las capas polares del mapa, con roca oscura como fondo |
well0012.bmp | Contiene las capas polares del mapa, con roca clara como fondo |
Es recomendable para una implementación precisa no renderizar las baldosas de antemano para poder almacenarlas en caché, ya que los datos del ciclo día/noche aún deben procesarse, y se generarían muchos datos.
Las baldosas son gráficos de 8bpp con paletas indexadas de 32x32 píxeles de resolución, dispuestas en fila. Sin embargo, en un conjunto de baldosas así creado se pueden tener muchas más.
El contenedor principal consiste en 2 secciones: head
y data
.
Encabezado de Azulejos
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 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Desplazamiento | Tipo de dato | Denominación | Explicación |
---|---|---|---|
0x0000 | uint(32) | Bytes Mágicos | |
0x0004 | uint(24) | Longitud del bloque | |
0x0007 | uint(8) | Banderas | |
0x0008 | uint(32) | ¿Versión / Banderas? | Esto podría ser una indicación de la versión del formato de archivo; en todos los archivos que tengo, el valor fue |
0x000c | uint(32) | Anchura (Resolución Horizontal) | Indica cuán ancho es el archivo de imagen (en píxeles). En todos los pozos de Outpost 2, se espera que aquí el valor sea |
0x0010 | uint(32) | Altura (Resolución vertical) | Indica cuán alta es la imagen (en píxeles). En todos los pozos de Outpost 2, se espera que aquí el valor sea |
0x0014 | uint(32) | ¿Profundidad de color? | El significado de este valor es desconocido. Dado que en todos los archivos examinados contiene el valor |
0x0018 | uint(32) | ¿Profundidad de color 2? | El significado de este valor es desconocido. Posiblemente se trate de una profundidad de color 'objetivo'. |
Después de esta información, se proporcionará un archivo de paleta en formato RIFF estandarizado. La especificación exacta se puede encontrar - dado que las paletas también aparecen en otros lugares - en Paletas.
Datos de los Azulejos
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 | . | . | . | . | . | . | . | . | . | . | . | . |
Desplazamiento | Tipo de dato | Denominación | Explicación |
---|---|---|---|
0x0000 | uint(32) | Bytes Mágicos | |
0x0004 | uint(24) | Longitud del bloque | |
0x0007 | uint(8) | Banderas |
Finalmente, llegan los datos de píxeles en bruto, de arriba a la izquierda hacia abajo a la derecha, línea por línea.
El valor de los datos en las gráficas que generalmente están en formato de 8bpp-Bitmaps corresponde al índice del color en la paleta de colores.
El motor del juego probablemente dibuja los tiles *a demanda*.
Esto parece deberse, entre otras cosas, al ciclo de día y noche, que conoce 32 niveles diferentes de los tiles individuales. Al parecer, se reduce 'un poco' el valor de luminosidad. Aún no se han podido determinar valores exactos, estoy trabajando sobre la base de cálculo
v *= (daylight / 48) + 0.25;
con los datos HSV de los píxeles, donde daylight es un valor de 0-31 y v es un valor entre 0-1. Además, hay que tener en cuenta que en el mapa existe un borde de 16 tiles a la izquierda y a la derecha (que sirve para el spawn invisible de unidades).
Además, parece que el ciclo de día y noche actualiza solo una columna del mapa por ciclo de juego.
Un ciclo de día y noche acelerado se ve de la siguiente manera:
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 | . | . | . | . | . | . | . | . | . | . | . | . |
Desplazamiento | Tipo de dato | Denominación | Explicación |
---|---|---|---|
0x0000 | uint(32) | Bytes Mágicos | |
0x0004 | uint(24) | Longitud de paletas | Indica, a diferencia del formato de bloque normal, la cantidad de paletas que se pueden encontrar en este archivo, no la longitud del bloque en bytes. |
0x0007 | uint(8) | Banderas | Probablemente, como de costumbre, flags. No obstante, no conozco ninguna flag; dado que todos los valores que conozco corresponden a |
No estoy seguro de lo que significa exactamente PRT
; podría ser, por ejemplo, 'Tabla de Paletas y Recursos' - ya que este archivo, que se encuentra como op2_art.prt en maps.vol, es de este tipo, o al menos esa descripción podría reflejar bien su función.
Este archivo contiene una lista de paletas, una tabla de todos los bitmaps utilizados, todas las definiciones de animaciones y una serie de datos desconocidos. Se adhiere de manera laxa al formato de contenedor anterior, ya que no todos los registros siguen este esquema.
La sección CPAL
(que probablemente significa contenedor de paletas) solo abarca los datos de la paleta, indicando cuántas de las paletas de 8 bits, que normalmente son de 1052 bytes, están presentes.
La especificación de 1052 bytes no se considera vinculante, ya que el formato de la paleta podría prever diferentes tamaños de paleta. Solo se aplica al conjunto de datos con el que se entrega Outpost 2.
Después de las listas de paletas, sigue inmediatamente y sin un encabezado introductorio, la lista de bitmaps; de la misma manera, las listas de animaciones siguen de inmediato.
Cada una de ellas se inicia con un uint(32) (¿o nuevamente uint24+uint8 flags?) que contiene la cantidad de registros.
Paletas
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 | . | . | . | . | . | . | . | . | . | . | . | . |
Desplazamiento | Tipo de dato | Denominación | Explicación |
---|---|---|---|
0x0000 | uint(32) | Bytes mágicos | |
0x0004 | uint(24) | Longitud de la paleta | Indica, a diferencia del formato de bloque normal, la cantidad de paletas que se pueden encontrar en este archivo - no la longitud del bloque en bytes. |
0x0007 | uint(8) | Banderas | Probablemente, como de costumbre, flags. No tengo conocimiento de flags; dado que todos los valores que conozco corresponden a |
La información de las paletas es muy fácil de leer.
Consiste en un encabezado y un segmento de datos.
Encabezado de Paletas
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 | . | . | . | . | . | . | . | . | . | . | . | . |
Desplazamiento | Tipo de dato | Denominación | Explicación |
---|---|---|---|
0x0000 | uint(32) | Bytes mágicos | |
0x0004 | uint(24) | Longitud de la paleta | Indica, a diferencia del formato de bloque normal, la cantidad de paletas que se pueden encontrar en este archivo - no la longitud del bloque en bytes. |
0x0007 | uint(8) | Banderas | Probablemente, como de costumbre, flags. No tengo conocimiento de flags; dado que todos los valores que conozco corresponden a |
0x0008 | uint(32) | ¿Versión de formato de paleta? | Define probablemente qué versión del formato de paletas sigue la paleta. Todas las paletas de Outpost2 parecen tener la versión |
Datos de Paletas
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 | . | . | . | . | . | . | . | . | . | . | . | . |
Desplazamiento | Tipo de dato | Denominación | Explicación |
---|---|---|---|
0x0000 | uint(32) | Bytes mágicos | |
0x0004 | uint(24) | Longitud del bloque | |
0x0007 | uint(8) | Banderas |
La sección de datos incluye las entradas individuales de palets. La cantidad de entradas de palets se calcula a partir de la longitud del bloque / 4.
Las entradas individuales tienen la siguiente estructura simple;
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | carácter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | 04 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Desplazamiento | Tipo de dato | Denominación | Explicación |
---|---|---|---|
0x0000 | uint(8) | Componente rojo | Indica la proporción de rojo en el color |
0x0001 | uint(8) | Componente verde | Indica la proporción de verde del color |
0x0002 | uint(8) | Componente azul | Indica la proporción de azul en el color |
0x0003 | uint(8) | Desconocido - ¿Banderas? | No está claro qué significa este valor, ya que aparentemente es fundamentalmente |
En cuanto a las paletas, solo cabe mencionar que para las paletas que se utilizan en animaciones, las siguientes reglas son aplicables:
- El primer color es SIEMPRE transparente, sin importar el valor que se indique allí.
-
Las entradas de la paleta 1-24 se consideran como color de jugador en las paletas 1-8.
No tengo claro de dónde provienen exactamente los colores fuera del jugador 1.
Sospecho que los colores restantes están codificados de forma fija.
Mapas de bits
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | carácter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
0x0010 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Desplazamiento | Tipo de dato | Denominación | Explicación |
---|---|---|---|
0x0000 | uint(32) | Ancho alineado | Indica el ancho de las líneas de datos de píxeles en bytes, ya que están alineadas a límites de 4 bytes. Así, es rápido saltar a una línea de imagen específica. Por qué este valor se almacena por separado, aunque podría calcularse, no está claro. |
0x0004 | uint(32) | Desplazamiento | Indica el desplazamiento de la primera línea en el mapa de bits |
0x0008 | uint(32) | Altura | Indica la altura de la imagen en píxeles |
0x000c | uint(32) | Ancho | Indica el ancho de la imagen en píxeles |
0x0010 | uint(16) | Tipo | Indica el tipo de imagen. Parece que se trata de una máscara de bits:
|
0x0012 | uint(16) | Paleta | Define qué paleta de la archivo PRT se debe utilizar |
Estructura de datos del archivo PRT que indica cómo están construidos los bitmaps utilizados para los sprites. Estos bitmaps sirven como un componente individual, de los cuales varios se ensamblan en un marco de animación de un sprite.
Los datos de imagen concretos se encuentran en
op2_art.BMP en el directorio del juego.
Por qué este archivo de bitmap tiene un encabezado de bitmap RIFF (en su mayoría correcto) es incierto. Probablemente Outpost 2 utiliza APIs del sistema para cargar los gráficos, adoptando temporalmente este encabezado y sobrescribiendo los campos correspondientes y variables.
Los datos de píxeles se encuentran en el archivo BMP en la posición Offset + el offset uint32, que se puede encontrar en la dirección 0x000A del archivo BMP (offset de datos del bitmap RIFF), y corresponden nuevamente a la disposición fila por fila de arriba a izquierda a derecha y abajo.
Gráficos monocromos de 1bpp pueden dibujarse de tal manera, que el color 0 sea completamente transparente, y el color 1 sea un negro/gris semi-transparente, ya que los gráficos monocromos se utilizan comúnmente para sombras de vehículos y edificios en las animaciones.
Con esto ya se pueden ensamblar muchas gráficas.
Animaciones
Ahora pasamos a la clase maestra de las disciplinas dentro de los formatos de datos de Outpost 2:
Las animaciones.
Las listas de animación comienzan con un encabezado global, que sirve principalmente para la verificación de datos. A continuación, siguen las definiciones concretas de animación, que se dividen en 3 niveles:
-
Animación
Una animación es la instancia superior; representa una animación de una unidad, un edificio o una 'animación de partículas' (impacto de cometas, clima, explosiones) en una situación inicial determinada. -
Fotograma
Un fotograma es una imagen única dentro de una animación. Una animación puede incluir uno o varios fotogramas. -
Subfotograma
Un subfotograma es la información sobre que un determinado bitmap debe ser dibujado en una posición específica de un fotograma bajo ciertos criterios. Un fotograma puede incluir uno o varios subfotogramas.
A continuación, ya vienen directamente las definiciones individuales de animación.
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | carácter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Desplazamiento | Tipo de dato | Denominación | Explicación |
---|---|---|---|
0x0000 | uint(32) | Número de animaciones | Cuántos conjuntos de datos de animación hay |
0x0004 | uint(32) | Número de cuadros | ¿Cuántos frames deberían estar presentes en total? |
0x0008 | uint(32) | Número de subtramas | ¿Cuántos submarcos deberían estar presentes en total? |
0x000c | uint(32) | Número de entradas opcionales | Cuántas "entradas opcionales" hay. |
Animación
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | carácter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
0x0010 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
0x0020 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Desplazamiento | Tipo de dato | Denominación | Explicación |
---|---|---|---|
0x0000 | uint(32) | Desconocido 1 | Información desconocida |
0x0004 | uint(32) | Caja delimitadora: Izquierda | Indica el inicio izquierdo (en píxeles) de la Bounding Box. |
0x0008 | uint(32) | Caja delimitadora: Arriba | Indica el inicio superior (en píxeles) de la Bounding Box. |
0x000c | uint(32) | Caja delimitadora: Ancho | Indica el ancho (en píxeles) de la Bounding Box. |
0x0010 | uint(32) | Caja delimitadora: altura | Indica la altura (en píxeles) de la Bounding Box. |
0x0014 | uint(32) | Desplazamiento: X | Indica el punto medio horizontal de la animación |
0x0018 | uint(32) | Desplazamiento: Y | Indica el punto medio vertical de la animación |
0x001c | uint(32) | Desconocido 2 | Información desconocida |
0x0020 | uint(32) | Número de cuadros | Indica cuántos fotogramas de animación contiene esta animación |
0x0024 | uint(32) | Número de ventanas | Indica cuántas ventanas se deben aplicar al dibujar |
Los datos de la capa superior, de la animación, son principalmente datos administrativos - la Boundingbox se refiere a las coordenadas de la marca alrededor del vehículo/edificio, cuando este ha sido seleccionado y también indica qué área debería ser clickable.
El offset determina principalmente el "punto cero"; el punto que debe ser sumado o restado a las coordenadas internas del juego. Se podría decir de manera más matemática: el offset se refiere aquí al origen de coordenadas.
En las ventanas, al igual que con el offset, hay 4 valores uint(32) por cada ventana, que indican un área que es considerada utilizable para submarcos individuales. Fuera de las ventanas, a menos que esté destinado a la bitmap correspondiente, no se puede dibujar.
Marco
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | carácter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Desplazamiento | Tipo de dato | Denominación | Explicación |
---|---|---|---|
0x0000 | uint(8) | Número de submarcos y alternar para Opcional 1, 2 | Este valor contiene:
|
0x0001 | uint(8) | Desconocido 1 y alternar para opcional 3, 4 | Este valor contiene:
|
0x0002 | uint(8) | Opcional 1 | Desconocido |
0x0003 | uint(8) | Opcional 2 | Desconocido |
0x0004 | uint(8) | Opcional 3 | Desconocido |
0x0005 | uint(8) | Opcional 4 | Desconocido |
Subestructura
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | carácter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Desplazamiento | Tipo de dato | Denominación | Explicación |
---|---|---|---|
0x0000 | uint(16) | Bitmap-ID | Indica qué bitmap se debe utilizar para este subcuadro |
0x0002 | uint(8) | Desconocido 1 | Es desconocido - sin embargo, sospecho fuertemente que se trata de una prioridad de renderizado (capa Z). |
0x0003 | uint(8) | Subframe-Id | Indica en qué submarco nos encontramos |
0x0004 | sint(16) | Desplazamiento - Horizontal | Indica dónde dentro del marco se debe colocar el submarco, o cuántos píxeles se debe mover horizontalmente la imagen de mapa de bits. |
0x0006 | sint(16) | Desplazamiento - Vertical | Indica dónde dentro del marco debe colocarse el submarco, o cuántos píxeles debe desplazarse verticalmente la imagen de mapa de bits. |
Con esto, ahora podemos ensamblar tanto cuadros individuales como animaciones completas; aquí se demuestra con un ejemplo de una animación más compleja, la animación con el índice 500.
Animación 500
La animación 500 muestra cómo se descarga un transportador Plymouth cargado con mineral común. Esta es una de las pocas animaciones que utiliza la funcionalidad de ventanas.
Así es como se puede ensamblar la animación completa.
Desafortunadamente, todavía hay un problema con la escotilla superior, ya que el bit correspondiente en la información del tipo de gráfico no está configurado.
Aquí hay algunos otros sprites maravillosamente animados del juego:
Interfaz de usuario
Aún falta la interfaz de usuario del juego, que tiene un aspecto de metal cepillado.
Pero aquí también es evidente que Dynamix no tuvo que reinventar la rueda; aquí no solo se utilizan simplemente las APIs User32 y GDI32 proporcionadas por Windows, sino que también se emplea la gestión de recursos de User32.
Estas se pueden extraer, por ejemplo, mediante programas como Resource Hacker, desarrollado como software gratuito por Angus Johnson, o - si se teme usar Wine en Linux / Mac OS - utilizando wrestool que se incluye en icoutils.
Nombre de archivo | Contenido |
---|---|
Outpost2.exe | Contiene únicamente el ícono del juego, que muestra la estación espacial frente a New Terra |
op2shres.dll | Además de gráficos para elementos de control como bordes, botones, botones de opción y casillas de verificación, contiene fondos de diálogo, imágenes complementarias para los textos de las misiones de la historia y el fondo gráfico del menú principal |
out2res.dll | Contiene la decoración de ventanas en el juego, íconos para metal común y especial, la pantalla de carga, gráficos para diálogos, así como otros gráficos de cursor, además de los animados en el directorio del juego |