Formatos de archivo de Outpost 2 · bei.pm

Este texto fue traducido automáticamente por OpenAI GPT-4o Mini.

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.

Arte del juego

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:

  • 0x204C4F56 ('VOL '):
    Volumen
  • 0x686C6F76 ('VOLH'):
    Encabezado del volumen
  • 0x736C6F76 ('VOLS'):
    Cadenas del volumen
  • 0x696C6F76 ('VOLI'):
    Información del volumen
  • 0x4B4C4256 ('BLCK'):
    Bloque del volumen
  • 0x504D4250 ('PBMP'):
    Datos gráficos
  • 0x4C415050 ('PPAL'):
    Paleta de colores
  • 0x4C415043 ('CPAL'):
    Contenedor de paletas de colores
  • 0x64616568 ('head'):
    Encabezado
  • 0x61746164 ('data'):
    Datos útiles
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.

  • 0x03 está establecido cuando el archivo está comprimido. Aquí parece que se utiliza un árbol de Huffman.
  • 0x80 aparentemente siempre está establecido.

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

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

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

0x0014 uint(32) ¿Profundidad de color?

El significado de este valor es desconocido.

Dado que en todos los archivos examinados contiene el valor 8, podría tratarse de una indicación de la profundidad de color.

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.

Los datos de píxeles comienzan en la parte superior izquierda y terminan en la parte inferior derecha.

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:

Visualización del ciclo de día y noche

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 0x00, también sería potencialmente posible que la cantidad de paletas fuera simplemente un uint(32).

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 0x00, también sería potencialmente posible que la cantidad de paletas fuera simplemente un uint(32).

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 0x00, también sería potencialmente posible que la cantidad de paletas fuera simplemente un uint(32).

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

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

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.

Referencia de paletas

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.
Quizás se trate de una optimización para el código de renderizado.

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:

  • 0x04 está establecido si se trata de una gráfica de 1bpp.
  • 0x40 está establecido si se trata de una gráfica que debe implementar el windowing.
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.

Módulo de vivienda protegido (Plymouth)

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:

  1. 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.
  2. Fotograma
    Un fotograma es una imagen única dentro de una animación. Una animación puede incluir uno o varios fotogramas.
  3. 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:

  • 0x7F (máscara de bits): La cantidad de submarcos que se utilizan en este marco
  • 0x80: La información sobre si Opcional 1 y 2 están presentes
0x0001 uint(8) Desconocido 1 y alternar para opcional 3, 4

Este valor contiene:

  • 0x7F (máscara de bits): Desconocido - Sospecho fuertemente que se refiere a la cantidad de ticks de juego que pasan hasta que se muestra el siguiente fotograma
  • 0x80: La información sobre si las Opciones 3 y 4 están presentes
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:

Renderizado de la animación 500 ilustrado

Animación 500 completamente ensamblada

Fábrica de Edificios Plymouth

Puerto Espacial Eden

Centro Médico Eden

SCAT

Puerto Espacial Plymouth

Huevo de Pascua:
Santa Claus

Huevo de Pascua:
Perro de Dans

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