Animation

Damit sich Häuser und Fahrzeuge bewegen, werden die Bitmaps aus der Datei op2_art.BMP geschickt zusammengesetzt.

Veröffentlicht am 10.06.2018, aktualisiert am 10.06.2018

ADR x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF
0000 0000 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
Anzahl Animationen Datentyp: uint32
Wieviele Animationsdatensätze vorhanden sind
Anzahl Frames Datentyp: uint32
Wieviele Frames insgesamt vorhanden sein sollten
Anzahl Subframes Datentyp: uint32
Wieviele Subframes insgesamt vorhanden sein sollten
Anzahl optionaler Einträge Datentyp: uint32
Wieviele "optionale Einträge" vorhanden sind.

Nun kommen wir zur Königsklasse der Disziplinen innerhalb der Outpost 2 Datenformate: Den Animationen.

Die Animationslisten werden mit einem globalen Header, der primär der Datenverifikation dient, eingeleitet. Daraufhin folgen die konkreten Animationsedefinitionen, die sich in 3 Stufen gliedern:

  1. Animation
    Eine Animation ist die oberste Instanz; sie stellt eine Animation einer Einheit, eines Gebäudes oder einer 'Partikel-Animation' (Kometenschlag, Wetter, Explosion) in einem bestimmten Ausgangslage dar.
  2. Frame
    Ein Frame ist ein einzelnes Bild innerhalb einer Animation. Eine Animation kann ein oder mehrere Frames beinhalten.
  3. Subframe
    Ein Subframe ist die Information darüber, dass eine bestimmte Bitmap unter bestimmten Kriterien an eine bestimmte Position eines Frames gezeichnet werden soll. Ein Frame kann ein oder mehrere Subframes beinhalten.

Anschließend folgen schon direkt die einzelnen Animationsdefinitionen.

Animation

ADR x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF
0000 0000 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
0000 0010 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
0000 0020 xx xx xx xx Frame-Daten - flexible Länge
0000 0030 xx xx xx xx Window-Daten - 16 Byte pro Window
Unbekannt 1 Datentyp: uint32
Unbekannte Informationen
Bounding Box: Links Datentyp: uint32
Gibt den linken Anfang (in Pixel) der Bounding Box an.
Bounding Box: Oben Datentyp: uint32
Gibt den oberen Anfang (in Pixel) der Bounding Box an.
Bounding Box: Breite Datentyp: uint32
Gibt die Breite (in Pixel) der Bounding Box an.
Bounding Box: Höhe Datentyp: uint32
Gibt die Höhe (in Pixel) der Bounding Box an.
Offset: X Datentyp: uint32
Gibt den horizontalen Mittelpunkt der Animation an
Offset: Y Datentyp: uint32
Gibt den vertikalen Mittelpunkt der Animation an
Unbekannt 2 Datentyp: uint32
Unbekannte Informationen
Anzahl Frames Datentyp: uint32
Gibt an, wieviele Animationsframes in dieser Animation enthalten sind
Anzahl Windows Datentyp: uint32
Gibt an, wieviele Fenster beim Zeichnen anzuwenden sind

Die Daten der obersten Schicht, der Animation, sind dabei vorrangig Verwaltungsdaten - die Boundingbox bezeichnet dabei die Koordinaten der Markierung um das Fahrzeug/Gebäude, wenn das selbige ausgewählt ist und gibt auch gleichzeitig an, welcher Bereich anklickbar sein soll.

Das Offset bestimmt vorrangig den "Nullpunkt"; den Punkt, der auf spielinterne Koordinaten aufzurechnen beziehungsweise abzuziehen ist. Man könnte auch mathematischer sagen: das Offset bezeichnet hier den Koordinatenursprung.

Bei den Windows handelt es sich, genauso wie beim Offset, um jeweils (pro Window) 4 uint32-Werte, die einen Bereich angeben, der für einzelne Subframes als verwendbar gilt. Ausserhalb der Windows darf, sofern es für die Bitmap entsprechend vorgesehene ist, nicht gezeichnet werden.

Frame

ADR x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF
0000 0000 xx xx [xx] [xx] [xx] [xx] Subframe-Daten - flexible Länge
Subframe-Anzahl und Toggle für Optional 1,2 Datentyp: uint8
Dieser Wert enthält:
  • 0x7F: Die Anzahl an Subframes, die in diesem Frame verwendet werden
  • 0x80: Die Information darüber, ob Optional 1 und 2 vorhanden sind
Unknown1 und Toggle für Optional 3,4 Datentyp: uint8
Dieser Wert enthält:
  • 0x7F: Unbekannt - Ich vermute stark, dass es sich hierbei um die Anzahl an Gameticks handelt, die vergehen, bis das nächste Frame angezeigt wird
  • 0x80: Die Information darüber, ob Optional 3 und 4 vorhanden sind
Optional 1 Datentyp: uint8
Unbekannt
Optional 2 Datentyp: uint8
Unbekannt
Optional 3 Datentyp: uint8
Unbekannt
Optional 4 Datentyp: uint8
Unbekannt

Subframe

ADR x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF
0000 0000 xx xx xx xx xx xx xx xx  
Bitmap-Id Datentyp: uint16
Gibt an, welche Bitmap für diesen Subframe verwendet werden soll
Unknown1 Datentyp: uint8
Ist unbekannt - ich vermute allerdings stark, das es sich hierbei um eine Render-Priorität (Z-Layer) handelt.
Subframe-Id Datentyp: uint8
Gibt an, in welchem Subframe wir uns befinden
Offset - Horizontal Datentyp: sint16
Achtung: Vorzeichen beachten
Gibt an, wo innerhalb des Frames das Subframe platziert werden soll, bzw. um wieviele Pixel die Bitmap horizontal verschoben werden soll
Offset - Vertikal Datentyp: sint16
Achtung: Vorzeichen beachten
Gibt an, wo innerhalb des Frames das Subframe platziert werden soll, bzw. um wieviele Pixel die Bitmap vertikal verschoben werden soll

Damit können wir nun einzelne Frames, als auch komplette Animationen entsprechend zusammensetzen, hier einmal exemplarisch an einer komplexeren Animationen demonstriert:

Animation 500

Animation 500 zeigt, wie ein Plymouth-Transporter, der mit gewöhnlichem Erz beladen ist, entladen wird. Dabei handelt es sich um eine der wenigen Animationen, die die Windowing-Funktionalität nutzt.

Und so lässt sich die komplette Animation zusammenfügen.
Leider gibt es noch ein Problem mit der oberen Ladeluke, da hier das entsprechende Bit in der Grafiktyp-Information nicht gesetzt ist:

Abschließend lässt sich sagen, dass das Reverse Engineering sehr viel Spaß bereitet hat, auch wenn es noch nicht abgeschlossen sind.
Hier noch ein paar weitere, wunderschön animierte Sprites aus dem Spiel - für mehr empfehle ich es, einen Viewer auf Basis dieser Dokumentation zu entwickeln und das Spiel zu kaufen, denn über zB eBay lässt es sich noch immer für wenig Geld problemlos erstehen. Natürlich kann ich auch nur empfehlen, das Spiel selbst zu spielen, da es interessante Spielmechaniken bietet.

Kommentare

Kommentar hinzufügen

Dein Kommentar wird möglicherweise nicht sofort dargestellt werden. Kommentare werden aus Spamschutzgründen moderiert.