Tiles · bei.pm

Veröffentlicht am 19.11.2015·Aktualisiert am 13.02.2025·Deutsch

Die auf dieser Seite beschriebenen Dateiformate basieren auf der technischen Analyse geistigem Eigentums von Dynamix, Inc. und Sierra Entertainment.
Das geistige Eigentum ist heute Teil der Activision Publishing, Inc.- / Activision Blizzard, Inc.-Masse und derzeit im Besitz von Microsoft Corp..

Die Informationen wurden durch Reverse Engineering und Datenanalyse zum Zwecke der Archivierung und Interoperabilität mit historischen Daten zusammengetragen.
Es wurden keine proprietären oder vertraulichen Spezifikationen verwendet.

Das Spiel kann derzeit bei gog.com käuflich als Download erworben werden.

Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF char
0x0000 50 42 4d 50 -- -- -- -- -- -- -- -- -- -- -- -- P B M P . . . . . . . . . . . .
Offset Datentyp Bezeichnung Erklärung
0x0000 uint(32) Magic Bytes
0x0004 uint(24) Block-Länge
0x0007 uint(8) Flags

Bei den Tiles handelt es sich um ein Outpost-2-Spezifisches Bitmap-Grafikformat. Sie erstrecken sich über 13 Tilesets, "wells" genannt (well0000.bmp bis well0012.bmp), die sich innerhalb des Volumes maps.vol befinden.

Dabei enthalten die Tilesets / Wells folgendes:

Dateiname Inhalt
well0000.bmp Eine 32x32px große, blaue Grafik - ideal als Test, ob der eigene Image-Loader funktioniert
well0001.bmp Enthält helles Gestein, Gebirgszüge auf hellem Gestein und unzählige Varianten von Einschlagskratern in helles Gestein
well0002.bmp Enthält helles-Gestein-'Doodads' - also Elemente, die zur Auflockerung (oder bewusst als Struktur, wie zB Mauern) auf hellem Gestein platziert werden können, darunter auch Vegetation
well0003.bmp Enthält eine krustenartige Struktur auf hellem Gestein
well0004.bmp Enthält dunkles Gestein, Gebirgszüge auf dunklem Gestein und unzählige Varianten von Einschlagskratern in dunkles Gestein
well0005.bmp Enthält dunkles-Gestein-'Doodads' - also Elemente, die zur Auflockerung (oder bewusst als Struktur, wie zB Mauern) auf dunklem Gestein platziert werden können
well0006.bmp Enthält eine Krustenartige Struktur auf dunklem Gestein, sowie Übergänge zwischen hellem und dunklem Gestein
well0007.bmp Enthält Lava inklusive jeweils 4-5 Frames Animation der selbigen
well0008.bmp Enthält Sand und unzählige Varianten von Einschlagskratern in Sand
well0009.bmp Enthält Sand-'Doodads' - also Elemente, die zur Auflockerung (oder bewusst als Struktur, wie zB Mauern) auf Sand platziert werden können
well0010.bmp Enthält je 48 Übergänge von Sand zu hellem und dunklem Gestein
well0011.bmp Enthält die Polarkappen der Map, mit dunklem Gestein als Untergrund
well0012.bmp Enthält die Polarkappen der Map, mit hellem Gestein als Untergrund

Es erschreit ratsam für eine akkurate Umsetzung, die Tiles nicht im Vorraus zu rendern um diese zu cachen, da die Daten für den Tag/Nacht-Zyklus noch bearbeitet werden müssen - und sehr sehr viele Daten anfallen würden.

Die Tiles sind 8bpp-Grafiken mit indexierter Palette zu je 32x32 Pixel Auflösung, welche untereinander angeordnet sind. In einem so entstandenen Tileset können allerdings weitaus mehr

Der Haupt-Container besteht aus 2 Sektionen: head und data.

Tiles Header

Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF char
0x0000 68 65 61 64 -- -- -- -- -- -- -- -- -- -- -- -- h e a d . . . . . . . . . . . .
0x0010 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
Offset Datentyp Bezeichnung Erklärung
0x0000 uint(32) Magic Bytes
0x0004 uint(24) Block-Länge
0x0007 uint(8) Flags
0x0008 uint(32) Version / Flags?

Hierbei könnte es sich um eine Versionsangabe des Dateiformates handeln; in allen mir vorliegenden Dateien stand hier der Wert 0x02

0x000c uint(32) Breite (Horizontale Auflösung)

Gibt an, wie breit die Bilddatei ist (in Pixel).

Bei allen Wells von Outpost 2 wird hier der Wert 0x20 bzw 32 zu erwarten sein.

0x0010 uint(32) Höhe (Vertikale Auflösung)

Gibt an, wie hoch die Bilddatei ist (in Pixel).

Bei allen Wells von Outpost 2 wird hier der Wert 0x20 bzw 32 zu erwarten sein.

0x0014 uint(32) Farbtiefe?

Die Bedeutung dieses Wertes ist unbekannt.

Da er in allen geprüften Dateien den Wert 8 enthält, könnte es sich um eine Farbtiefenangabe handeln.

0x0018 uint(32) Farbtiefe 2?

Die Bedeutung dieses Wertes ist unbekannt.

Möglicherweise handelt es sich um eine 'Ziel'-Farbtiefe.

Nach diesen Angaben erfolgt noch eine im standardisierten RIFF-Format vorliegende Palettendatei. Die genaue Spezifikation findet sich - da die Paletten auch anderswo auftauchen - unter Paletten.

Tiles Daten

Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF char
0x0000 64 61 74 61 -- -- -- -- -- -- -- -- -- -- -- -- d a t a . . . . . . . . . . . .
Offset Datentyp Bezeichnung Erklärung
0x0000 uint(32) Magic Bytes
0x0004 uint(24) Block-Länge
0x0007 uint(8) Flags

Schließlich folgen bereits die blanken Pixeldaten, von links-oben zeilenweise nach rechtsunten.
Der Datenwert bei den in aller Regel als 8bpp-Bitmaps vorliegenden Grafiken entspricht dabei dem Index der Farbe in der Farbpalette.

Pixeldaten beginnen oben links und enden unten rechts.

Die Spiel-Engine zeichnet die Tiles dabei *wahrscheinlich* on-demand.
Dies scheint unter anderem dem Tag-Nacht-Zyklus geschuldet zu sein, der 32 Abstufungen einzelner Tiles kennt. Dabei wird offenbar vom Helligkeitswert jeweils 'ein wenig' abgezogen. Genaue Werte ließen sich noch nicht ermitteln, ich arbeite auf der Berechnungsgrundlage

v *= (daylight / 48) + 0.25;

mit den HSV-Daten der Pixel, wobei daylight ein Wert von 0-31 ist und v ein Wert zwischen 0-1. Darüber hinaus ist zu berücksichtigen, dass auf der Map jeweils noch ein Rand von 16 Tiles nach links und rechts (der dient dem unsichtbaren Spawnen von Einheiten) existiert.

Zusätzlich scheint der Tag-Nacht-Zyklus pro Gamecycle jeweils nur eine Spalte der Map zu aktualisieren.
Ein beschleunigter Tag-Nacht-Zyklus sieht daher wie folgt aus:

Visualisierung des Tag-Nacht-Zyklus