Formats de fichiers Outpost 2 · bei.pm

Ce texte a été traduit automatiquement par OpenAI GPT-4o Mini.

Les formats de fichiers décrits sur cette page sont basés sur l'analyse technique de la propriété intellectuelle de Dynamix, Inc. et Sierra Entertainment.
La propriété intellectuelle fait aujourd'hui partie de l'actif de Activision Publishing, Inc. / Activision Blizzard, Inc. et est actuellement détenue par Microsoft Corp..

Les informations ont été collectées par Reverse Engineering et Analyse de données dans le but d'archivage et d'interopérabilité avec des données historiques.
Aucune spécification propriétaire ou confidentielle n’a été utilisée.

Le jeu peut actuellement être acheté en téléchargement sur gog.com.

Illustration du jeu

La série d'articles suivante documente mes découvertes sur les formats de données du jeu de stratégie en temps réel "Outpost 2: Divided Destiny", publié par Sierra en 1997 et développé par Dynamix.

J'ai principalement analysé les données du jeu - et ce qu'on peut en faire - entre le 1er novembre 2015 et le 14 novembre 2015.

D'après les informations que j'ai pu recueillir jusqu'à présent, il semble que Dynamix - comme tant d'entreprises commerciales - n'ait pas spécifiquement développé certains formats de données pour Outpost 2, mais les ait également utilisés dans d'autres développements, comme par exemple la série Mechwarrior (avec des adaptations).
Cela dit, il est également à noter que l'innovation dans les formats de fichiers est pratiquement limitée et repose souvent sur des concepts plus anciens issus de formats courants tels que JFIF et RIFF.

Pour l'interprétation des tableaux et des formats de données, d'autres informations sont disponibles sous Qu'est-ce que c'est ?.
Les données indiquées ici sont généralement à comprendre comme étant en Little Endian.

En conclusion, je dirais que le reverse engineering a été très amusant, même s'il n'est pas complet.
Bien sûr, je ne peux que recommander de jouer au jeu vous-même, car il propose des mécanismes de jeu intéressants.

Introduction

Les formats de données utilisés par Outpost 2 ont une structure rappelant JFIF / PNG - chaque bloc de données comporte toujours un en-tête de 8 octets. C'est pourquoi je ne prends pas la peine de documenter les en-têtes individuels aux endroits spécifiques correspondants et je ne documente que les écarts.

Le format est toujours le suivant ; les données utiles y sont ensuite intégrées :

Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF caractères
0x0000 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
Décalage Type de données Désignation Explication
0x0000 uint(32) Octets magiques

Contient des informations sur ce à quoi s'attendre dans le prochain bloc de données.

Valeurs connues :

  • 0x204C4F56 ('VOL '):
    Volume
  • 0x686C6F76 ('VOLH'):
    En-tête de volume
  • 0x736C6F76 ('VOLS'):
    Chaînes de volume
  • 0x696C6F76 ('VOLI'):
    Informations sur le volume
  • 0x4B4C4256 ('BLCK'):
    Bloc de volume
  • 0x504D4250 ('PBMP'):
    Données graphiques
  • 0x4C415050 ('PPAL'):
    Palette de couleurs
  • 0x4C415043 ('CPAL'):
    Conteneur de palettes de couleurs
  • 0x64616568 ('head'):
    En-tête
  • 0x61746164 ('data'):
    Données utiles
0x0004 uint(24) Longueur de bloc

Contains information about the size (in bytes) of the following data block.

This refers to the actual payload - the 8 header bytes are not included.

0x0007 uint(8) Drapeaux ?

Il est inconnu à quoi sert exactement ce bloc.

Dans les volumes, cette valeur est souvent 0x80, tandis que dans d'autres fichiers, elle est souvent 0x00. Cela suggère qu'il s'agit d'un ensemble de drapeaux.

Volumes

Les volumes sont des conteneurs de données pour le jeu, similaires à un format d'archive comme par exemple Tarball. Au moins dans Outpost 2, le format ne connaît que des fichiers - pas de dossiers. Il est probablement possible de simuler ces derniers à l'aide de noms de fichiers appropriés.

Un volume se compose de l'en-tête du volume ainsi que de plusieurs blocs de volume, qui correspondent aux fichiers concrets.

Les "volumes" sont les fichiers avec l'extension 'vol' dans le répertoire du jeu.

Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF caractères
0x0000 56 4f 4c 20 -- -- -- -- -- -- -- -- -- -- -- -- V O L . . . . . . . . . . . .
Décalage Type de données Désignation Explication
0x0000 uint(32) Octets magiques
0x0004 uint(24) Longueur de bloc
0x0007 uint(8) Drapeaux

En-tête du volume

Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF caractères
0x0000 76 6f 6c 68 -- -- -- -- -- -- -- -- -- -- -- -- v o l h . . . . . . . . . . . .
Décalage Type de données Désignation Explication
0x0000 uint(32) Octets magiques
0x0004 uint(24) Longueur de bloc
0x0007 uint(8) Drapeaux

Le Volume Header ne contient aucune donnée utile.
Il sert uniquement de conteneur.

En premier lieu, on devrait trouver les chaînes de volume dans le Volume Header ; ensuite viennent les informations sur le volume.

Chaînes de volume

Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF caractères
0x0000 76 6f 6c 69 -- -- -- -- -- -- -- -- -- -- -- -- v o l i . . . . . . . . . . . .
Décalage Type de données Désignation Explication
0x0000 uint(32) Octets magiques
0x0004 uint(24) Longueur de bloc
0x0007 uint(8) Drapeaux
Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF caractères
0x0000 76 6f 6c 73 -- -- -- -- -- -- -- -- -- -- -- -- v o l s . . . . . . . . . . . .
Décalage Type de données Désignation Explication
0x0000 uint(32) Octets magiques
0x0004 uint(24) Longueur de bloc
0x0007 uint(8) Drapeaux
0x0008 uint(32) Longueur de la charge utile

Indique combien d'octets des données suivantes sont réellement des données utiles.

Les données restantes de la liste des chaînes de volume doivent apparemment être considérées comme des données non valides.

Dans les fichiers à date plus récente, ces 'données restantes' sont 0x00, ce qui pourrait indiquer des lacunes dans la chaîne d'outils pendant le développement du jeu, c'est-à-dire qu'un développeur n'a commencé à s'occuper de l'initialisation correcte des tampons que très tard, car cela n'a aucune incidence sur le jeu que les données soient initialisées ou non.

0x000c uint(8)[] Liste des noms de fichiers

Il s'agit d'une liste de noms de fichiers terminée par un octet de valeur 0, qui - du moins dans le présent composant de données - ne semble attendre que des caractères ASCII.

Il n'est pas nécessaire d'analyser ce bloc de données plus en détail lors du parsing, car dans les informations de volume, les offsets des noms de fichiers sont de toute façon référencés directement.

Les chaînes de volume sont une liste de noms de fichiers qui sont contenus dans le volume.

Informations sur le volume

Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF caractères
0x0000 76 6f 6c 69 -- -- -- -- -- -- -- -- -- -- -- -- v o l i . . . . . . . . . . . .
Décalage Type de données Désignation Explication
0x0000 uint(32) Octets magiques
0x0004 uint(24) Longueur de bloc
0x0007 uint(8) Drapeaux

Les informations sur le volume contiennent des informations plus détaillées sur les fichiers. Il s'agit en quelque sorte d'une sorte d'entrée de répertoire FAT (FAT = File Allocation Table)

Le nombre de fichiers est déterminé par la taille des blocs divisée par la longueur des entrées de répertoire - 14 octets.

Les entrées de répertoire individuelles ont chacune la structure suivante :

Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF caractères
0x0000 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
Décalage Type de données Désignation Explication
0x0000 uint(32) Décalage du nom de fichier

Indique à quel offset (!) dans la liste des noms de fichiers (Volume-Strings) se trouve le nom de fichier du fichier.

Cela fait référence au début du bloc de données utilisateur.

0x0004 uint(32) Décalage de fichier

Indique à quel décalage au sein du fichier volume total se trouve le fichier.

0x0008 uint(32) Taille du fichier

Indique la taille du fichier en octets.

0x000c uint(16) Drapeaux ?

Il semble qu'il y ait des informations supplémentaires sur le codage des fichiers.

  • 0x03 est activé lorsque le fichier est compressé. Il semble qu'un arbre de Huffman soit utilisé ici.
  • 0x80 est apparemment toujours activé.

Bloc de Volume

Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF caractères
0x0000 56 42 4c 48 -- -- -- -- -- -- -- -- -- -- -- -- V B L H . . . . . . . . . . . .
Décalage Type de données Désignation Explication
0x0000 uint(32) Octets magiques
0x0004 uint(24) Longueur de bloc
0x0007 uint(8) Drapeaux

Un bloc de volume est un conteneur qui stocke des fichiers. Il contient simplement - en raison du format de bloc - une redondance de la taille du fichier, suivie directement des données utiles.

Tuiles

Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF caractères
0x0000 50 42 4d 50 -- -- -- -- -- -- -- -- -- -- -- -- P B M P . . . . . . . . . . . .
Décalage Type de données Désignation Explication
0x0000 uint(32) Octets magiques
0x0004 uint(24) Longueur de bloc
0x0007 uint(8) Drapeaux

Les tiles sont un format graphique bitmap spécifique à Outpost-2. Ils s'étendent sur 13 ensembles de tiles, appelés "wells" (well0000.bmp à well0012.bmp), qui se trouvent dans le volume maps.vol.

Les ensembles de tiles / wells contiennent ce qui suit :

Nom de fichier Contenu
well0000.bmp Une image de 32x32px, bleue - idéale pour tester si votre chargeur d'images fonctionne
well0001.bmp Contient des roches claires, des chaînes de montagnes sur des roches claires et d'innombrables variantes de cratères d'impact dans des roches claires
well0002.bmp Contient des 'Doodads' de roches claires - c'est-à-dire des éléments qui peuvent être placés pour aérer (ou délibérément comme structure, par exemple des murs) sur des roches claires, y compris de la végétation
well0003.bmp Contient une structure en croûte sur des roches claires
well0004.bmp Contient des roches sombres, des chaînes de montagnes sur des roches sombres et d'innombrables variantes de cratères d'impact dans des roches sombres
well0005.bmp Contient des 'Doodads' de roches sombres - c'est-à-dire des éléments qui peuvent être placés pour aérer (ou délibérément comme structure, par exemple des murs) sur des roches sombres
well0006.bmp Contient une structure en croûte sur des roches sombres, ainsi que des transitions entre des roches claires et sombres
well0007.bmp Contient de la lave, y compris 4-5 images d'animation de celle-ci
well0008.bmp Contient du sable et d'innombrables variantes de cratères d'impact dans le sable
well0009.bmp Contient des 'Doodads' de sable - c'est-à-dire des éléments qui peuvent être placés pour aérer (ou délibérément comme structure, par exemple des murs) sur du sable
well0010.bmp Contient 48 transitions de sable vers des roches claires et sombres
well0011.bmp Contient les calottes polaires de la carte, avec des roches sombres comme sous-sol
well0012.bmp Contient les calottes polaires de la carte, avec des roches claires comme sous-sol

Il est fortement conseillé de ne pas rendre les tuiles à l'avance pour les mettre en cache, car les données pour le cycle jour/nuit doivent encore être traitées - et cela générerait une quantité énorme de données.

Les tuiles sont des graphiques 8bpp avec une palette indexée de 32x32 pixels de résolution, disposées les unes à côté des autres. Cependant, dans un ensemble de tuiles ainsi créé, il peut y en avoir bien plus.

Le conteneur principal se compose de 2 sections : head et data.

En-tête des carreaux

Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF caractères
0x0000 68 65 61 64 -- -- -- -- -- -- -- -- -- -- -- -- h e a d . . . . . . . . . . . .
0x0010 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
Décalage Type de données Désignation Explication
0x0000 uint(32) Octets magiques
0x0004 uint(24) Longueur de bloc
0x0007 uint(8) Drapeaux
0x0008 uint(32) Version / Drapeaux ?

Cela pourrait être une indication de version du format de fichier ; dans tous les fichiers que j'ai, la valeur ici était 0x02

0x000c uint(32) Largeur (Résolution horizontale)

Indique la largeur du fichier image (en pixels).

Pour tous les puits d'Outpost 2, la valeur 0x20 ou 32 est attendue ici.

0x0010 uint(32) Hauteur (Résolution verticale)

Indique la hauteur du fichier image (en pixels).

Pour tous les puits d'Outpost 2, la valeur attendue ici sera 0x20 ou 32.

0x0014 uint(32) Profondeur de couleur ?

La signification de cette valeur est inconnue.

Étant donné qu'elle contient la valeur 8 dans tous les fichiers examinés, il pourrait s'agir d'une indication de profondeur de couleur.

0x0018 uint(32) Profondeur de couleur 2 ?

La signification de cette valeur est inconnue.

Il s'agit peut-être d'une profondeur de couleur 'cible'.

Après ces informations, un fichier de palette au format RIFF standardisé sera fourni. La spécification exacte se trouve - puisque les palettes apparaissent également ailleurs - sous Palettes.

Données des tuiles

Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF caractères
0x0000 64 61 74 61 -- -- -- -- -- -- -- -- -- -- -- -- d a t a . . . . . . . . . . . .
Décalage Type de données Désignation Explication
0x0000 uint(32) Octets magiques
0x0004 uint(24) Longueur de bloc
0x0007 uint(8) Drapeaux

Enfin, les données de pixels brutes suivent, ligne par ligne de haut à gauche vers bas à droite.
La valeur des données pour les graphiques, qui sont généralement au format bitmap 8bpp, correspond à l'index de la couleur dans la palette de couleurs.

Les données de pixels commencent en haut à gauche et se terminent en bas à droite.

Le moteur de jeu dessine les tuiles *probablement* à la demande.
Cela semble être en partie dû au cycle jour-nuit, qui connaît 32 nuances de tuiles individuelles. Il paraît qu'on soustrait à chaque fois 'un peu' de la valeur de luminosité. Des valeurs exactes n'ont pas encore pu être déterminées, je travaille sur la base de calcul suivante :

v *= (daylight / 48) + 0.25;

avec les données HSV des pixels, où daylight est une valeur de 0 à 31 et v est une valeur entre 0 et 1. De plus, il faut prendre en compte qu'il existe sur la carte une bordure de 16 tuiles à gauche et à droite (qui sert à faire apparaître des unités de manière invisible).

De plus, il semble que le cycle jour-nuit ne mette à jour qu'une colonne de la carte par cycle de jeu.
Un cycle jour-nuit accéléré se présente donc comme suit :

Visualisation du cycle jour-nuit

PRT

Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF caractères
0x0000 43 50 41 4c -- -- -- -- -- -- -- -- -- -- -- -- C P A L . . . . . . . . . . . .
Décalage Type de données Désignation Explication
0x0000 uint(32) Octets Magiques
0x0004 uint(24) Longueur des palettes

Indique, contrairement au format de bloc normal, le nombre de palettes à trouver dans ce fichier - et non la longueur du bloc en octets.

0x0007 uint(8) Drapeaux

Probablement, comme d'habitude, des drapeaux.

Cependant, je ne connais aucun drapeau ; comme toutes les valeurs que je connais correspondent à 0x00, il serait également potentiellement envisageable que le nombre de palettes soit simplement un uint(32).

Je ne sais pas exactement ce que signifie PRT; il pourrait s'agir par exemple de 'Palette and Resource Table' - car ce fichier - trouvé sous le nom op2_art.prt dans maps.vol - en est un, ou cela décrirait bien sa fonction.

Ce fichier contient une liste de palettes, un tableau de toutes les bitmaps utilisées, toutes les définitions d'animations et encore un certain nombre de données inconnues. Il suit de manière assez lâche le format de conteneur précédent, car tous les enregistrements ne suivent pas ce schéma.

La section CPAL (qui signifie probablement conteneur de palettes) englobe uniquement les données de palette, en indiquant combien de palettes 8 bits de 1052 octets sont généralement présentes.

La mention de 1052 octets n'est pas considérée comme contraignante, car le format de palette pourrait prévoir des tailles de palette différentes. Cela s'applique uniquement aux données fournies avec Outpost 2.

Après la liste des palettes, vient immédiatement et sans en-tête introductif, la liste des bitmaps ; de la même manière, les listes d'animations suivent immédiatement.
Ces deux listes sont chacune introduites par un uint(32) (ou encore uint24 + uint8 flags ?) qui contient le nombre d'enregistrements.

Palettes

Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF caractères
0x0000 50 50 41 4c -- -- -- -- -- -- -- -- -- -- -- -- P P A L . . . . . . . . . . . .
Décalage Type de données Désignation Explication
0x0000 uint(32) Octets magiques
0x0004 uint(24) Longueur de palette

Indique, contrairement au format de bloc normal, le nombre de palettes que l'on peut trouver dans ce fichier - pas la longueur du bloc en octets.

0x0007 uint(8) Drapeaux

Probablement, comme d'habitude, des drapeaux.

Cependant, je ne connais aucun drapeau ; étant donné que toutes les valeurs que je connais correspondent à 0x00, il serait également potentiellement envisageable que le nombre de palettes soit simplement un uint(32).

Les informations sur les palettes sont très simples à lire.
Elles se composent chacune d'un en-tête et d'un segment de données.

En-tête de palette

Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF caractères
0x0000 68 65 61 64 -- -- -- -- -- -- -- -- -- -- -- -- h e a d . . . . . . . . . . . .
Décalage Type de données Désignation Explication
0x0000 uint(32) Octets magiques
0x0004 uint(24) Longueur de palette

Indique, contrairement au format de bloc normal, le nombre de palettes que l'on peut trouver dans ce fichier - pas la longueur du bloc en octets.

0x0007 uint(8) Drapeaux

Probablement, comme d'habitude, des drapeaux.

Cependant, je ne connais aucun drapeau ; étant donné que toutes les valeurs que je connais correspondent à 0x00, il serait également potentiellement envisageable que le nombre de palettes soit simplement un uint(32).

0x0008 uint(32) Version de format de palette ?

Définit probablement quelle version du format de palette la palette suit.

Toutes les palettes Outpost2 semblent avoir la version 0x01.

Données des palettes

Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF caractères
0x0000 64 61 74 61 -- -- -- -- -- -- -- -- -- -- -- -- d a t a . . . . . . . . . . . .
Décalage Type de données Désignation Explication
0x0000 uint(32) Octets magiques
0x0004 uint(24) Longueur de bloc
0x0007 uint(8) Drapeaux

La section de données contient les entrées individuelles des palettes. Le nombre d'entrées de palettes est calculé à partir de la longueur du bloc / 4.

Les entrées individuelles ont la structure simple suivante ;

Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF caractères
0x0000 -- -- -- 04 -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
Décalage Type de données Désignation Explication
0x0000 uint(8) Composante rouge

Indique la proportion de rouge dans la couleur

0x0001 uint(8) Composante verte

Indique la proportion de vert dans la couleur

0x0002 uint(8) Composante bleue

Indique la proportion de bleu dans la couleur

0x0003 uint(8) Inconnu - Drapeaux ?

Il est unclear ce que cette valeur signifie, car elle semble fondamentalement être 0x04.

Concernant les palettes, il convient d'ajouter que pour les palettes utilisées pour les animations, les règles suivantes s'appliquent :

  • La première couleur est TOUJOURS transparente, peu importe la valeur qui y est indiquée.
  • Les entrées de palette 1-24 sont considérées comme des couleurs de joueur dans les palettes 1-8.
    Il m'est peu clair d'où proviennent exactement les couleurs en dehors du joueur 1.
    Je suppose que les autres couleurs sont codées en dur.

Référence des palettes

Bitmaps

Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF caractères
0x0000 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
0x0010 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
Décalage Type de données Désignation Explication
0x0000 uint(32) Largeur alignée

Indique la largeur des lignes de données en pixels en octets - car celles-ci sont alignées sur les limites de 4 octets.

Il est donc facile d'accéder rapidement à une ligne d'image spécifique.

Pourquoi cette valeur est stockée séparément, bien qu'elle puisse être calculée, n'est pas clair.
C'est peut-être une optimisation pour le code de rendu.

0x0004 uint(32) Décalage

Indique le décalage de la première ligne dans la bitmap

0x0008 uint(32) Hauteur

Indique la hauteur de l'image en pixels

0x000c uint(32) Largeur

Indique la largeur de l'image en pixels

0x0010 uint(16) Type

Indique le type de l'image. Il semble s'agir d'un masque de bits :

  • 0x04 est défini si c'est une image 1bpp.
  • 0x40 est défini si c'est une image qui doit implémenter le fenêtrage.
0x0012 uint(16) Palette

Définit quelle palette doit être utilisée à partir du fichier PRT

Cette structure de données du fichier PRT indique comment les bitmaps utilisés pour les sprites sont construits. Ces bitmaps servent de composant individuel, dont plusieurs sont assemblés pour constituer une image d'animation d'un sprite.

Les données d'image concrètes se trouvent dans le op2_art.BMP dans le répertoire du jeu.
On ne sait pas pourquoi ce fichier bitmap possède un en-tête RIFF (principalement correct), mais il est probable qu'Outpost 2 utilise des API système pour charger les graphiques, en adoptant temporairement cet en-tête et en écrasant les champs correspondants et variables.

Les données de pixels se trouvent dans le fichier BMP à la Position Offset + l'offset uint32, qui se trouve à l'adresse 0x000A dans le fichier BMP (offset des données RIFF Bitmap), et correspondent à l'agencement ligne par ligne de gauche à droite et de haut en bas.

Les graphiques monochromes 1bpp peuvent être dessinés de manière à ce que la couleur 0 représente une transparence totale, tandis que la couleur 1 est un noir/gris semi-transparent, car les graphiques monochromes sont généralement utilisés pour les ombres des véhicules et des bâtiments dans les animations.

Ainsi, on peut déjà assembler de nombreux graphiques.

Module résidentiel protégé (Plymouth)

Animations

Maintenant, nous arrivons à la classe maîtresse des disciplines au sein des formats de données d'Outpost 2 :
Les animations.

Les listes d'animations commencent par un en-tête global, qui sert principalement à la vérification des données. S'ensuivent les définitions concrètes des animations, qui se divisent en 3 niveaux :

  1. Animation
    Une animation est la plus haute instance ; elle représente une animation d'une unité, d'un bâtiment ou d'une 'animation de particules' (impact de comète, météo, explosion) dans une situation donnée.
  2. Frame
    Une frame est une image unique au sein d'une animation. Une animation peut contenir une ou plusieurs frames.
  3. Subframe
    Un subframe est l'information indiquant qu'une certaine bitmap doit être dessinée à une position spécifique d'une frame selon certains critères. Une frame peut contenir un ou plusieurs subframes.

Ensuite, suivent directement les définitions des animations individuelles.

Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF caractères
0x0000 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
Décalage Type de données Désignation Explication
0x0000 uint(32) Nombre d'animations

Combien de jeux de données d'animation sont disponibles

0x0004 uint(32) Nombre de frames

Combien de cadres devraient être présents au total

0x0008 uint(32) Nombre de sous-cadres

Combien de sous-structures devraient être présentes au total

0x000c uint(32) Nombre d'entrées optionnelles

Combien de "entrées optionnelles" sont présentes.

Animation

Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF caractères
0x0000 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
0x0010 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
0x0020 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
Décalage Type de données Désignation Explication
0x0000 uint(32) Inconnu 1

Informations inconnues

0x0004 uint(32) Boîte de délimitation : Liens

Indique le début gauche (en pixels) de la Bounding Box.

0x0008 uint(32) Boîte englobante : Haut

Indique le début supérieur (en pixels) de la Bounding Box.

0x000c uint(32) Boîte englobante : Largeur

Indique la largeur (en pixels) de la Bounding Box.

0x0010 uint(32) Boîte englobante : Hauteur

Indique la hauteur (en pixels) de la Bounding Box.

0x0014 uint(32) Décalage : X

Indique le point médian horizontal de l'animation

0x0018 uint(32) Décalage : Y

Indique le point central vertical de l'animation

0x001c uint(32) Inconnu 2

Information inconnue

0x0020 uint(32) Nombre de frames

Indique combien de frames d'animation sont contenues dans cette animation

0x0024 uint(32) Nombre de fenêtres

Indiquez combien de fenêtres doivent être utilisées lors du dessin

Les données de la couche supérieure, de l'animation, sont principalement des données administratives - la Boundingbox désigne les coordonnées de la marque autour du véhicule/bâtiment, lorsque celui-ci est sélectionné, et indique également quelle zone doit être cliquable.

L'offset détermine principalement le "point zéro" ; le point à additionner ou à soustraire aux coordonnées internes du jeu. On pourrait également dire de manière mathématique : l'offset désigne ici l'origine des coordonnées.

Les fenêtres, tout comme l'offset, se composent chacune de 4 valeurs uint(32), qui définissent une zone considérée comme utilisable pour des sous-images individuelles. En dehors des fenêtres, il ne doit pas être dessiné, sauf si cela est prévu pour la bitmap.

Cadre

Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF caractères
0x0000 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
Décalage Type de données Désignation Explication
0x0000 uint(8) Nombre de sous-cadres et bascule pour Option 1, 2

Cette valeur contient :

  • 0x7F (Masque de bits) : Le nombre de sous-images utilisées dans ce cadre
  • 0x80 : L'information sur la présence de l'option 1 et 2
0x0001 uint(8) Inconnu 1 et bascule pour Optionnel 3, 4

Cette valeur contient :

  • 0x7F (Masque de bits) : Inconnu - Je soupçonne fortement qu'il s'agit du nombre de ticks de jeu qui s'écoulent avant que le prochain cadre ne soit affiché
  • 0x80 : L'information sur la présence des options 3 et 4
0x0002 uint(8) Optionnel 1

Inconnu

0x0003 uint(8) Optionnel 2

Inconnu

0x0004 uint(8) Optionnel 3

Inconnu

0x0005 uint(8) Optionnel 4

Inconnu

Sous-châssis

Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF caractères
0x0000 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
Décalage Type de données Désignation Explication
0x0000 uint(16) Id de bitmap

Indiquez quelle image bitmap doit être utilisée pour ce sous-cadre

0x0002 uint(8) Inconnu 1

C'est inconnu - je soupçonne cependant fortement qu'il s'agit d'une priorité de rendu (couche Z).

0x0003 uint(8) Identifiant de sous-châssis

Indique dans quel sous-cadre nous nous trouvons

0x0004 sint(16) Décalage - Horizontal

Indique où le sous-frame doit être placé au sein du cadre, ou de combien de pixels la bitmap doit être déplacée horizontalement.

0x0006 sint(16) Offset - Vertical

Indique où le sous-cadre doit être placé à l'intérieur du cadre, ou de combien de pixels la bitmap doit être déplacée verticalement.

Nous pouvons désormais assembler des cadres individuels ainsi que des animations complètes, comme démontré ici par un exemple d'une animation plus complexe, l'animation avec l'index 500.

Animation 500

L'animation 500 montre comment un fourgon Plymouth, chargé de minéraux ordinaires, est déchargé. C'est l'une des rares animations qui utilise la fonctionnalité de fenêtrage.

Voici comment l'ensemble de l'animation peut être assemblé.
Malheureusement, il y a encore un problème avec la trappe de chargement supérieure, car le bit correspondant dans les informations de type graphique n'est pas défini.

Voici quelques autres sprites magnifiquement animés du jeu :

Rendu de l'animation 500 illustré

Animation 500 entièrement assemblée

Usine de bâtiments de Plymouth

Port spatial d'Eden

Centre médical d'Eden

SCAT

Port spatial de Plymouth

Easteregg :
Père Noël

Easteregg :
Dans le chien

Interface utilisateur

Il ne reste plus qu'à finaliser l'interface utilisateur du jeu, qui est réalisée dans un style métal brossé.

Cependant, il est également évident que Dynamix n'a pas eu besoin de réinventer la roue ; ici, il ne s'agit pas seulement d'utiliser les API User32 et GDI32 fournies par Windows - en particulier, la gestion des ressources de User32 est également utilisée.

Celles-ci peuvent être extraites par des programmes comme le Resource Hacker, développé en tant que freeware par Angus Johnson, ou - si l'on hésite à utiliser Wine sous Linux / Mac OS - avec l'outil wrestool inclus dans icoutils.

Nom du fichier Contenu
Outpost2.exe Contient uniquement l'icône du jeu, représentant la station spatiale devant New Terra
op2shres.dll Contient, en plus des graphiques pour les éléments de contrôle tels que les bordures, les boutons, les boutons radio et les cases à cocher, également des arrière-plans de dialogue, des images d'accompagnement pour les textes de missions de l'histoire ainsi que le graphique d'arrière-plan du menu principal
out2res.dll Contient la décoration des fenêtres en jeu, des icônes pour le métal ordinaire et spécial, l'écran de chargement, des graphiques pour les dialogues ainsi que d'autres graphiques de curseur, en plus des animés dans le répertoire du jeu