Volumes · 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.

Bei den Volumes handelt es sich um einen Datencontainer für das Spiel, ähnlich zu einem Archivformat wie z.B. Tarball. Zumindest in Outpost 2 kennt das Format dabei lediglich Dateien - keine Ordner. Wahrscheinlich ließen sich diese allerdings über entsprechende Dateinamen simulieren.

Ein Volume besteht dabei aus dem Volume-Header sowie aus mehreren Volume Blöcken, die den konkreten Dateien entsprechen.

"Volumes" sind die Dateien mit der Endung 'vol' im Spielverzeichnis.

Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF char
0x0000 56 4f 4c 20 -- -- -- -- -- -- -- -- -- -- -- -- V O L . . . . . . . . . . . .
Offset Datentyp Bezeichnung Erklärung
0x0000 uint(32) Magic Bytes
0x0004 uint(24) Block-Länge
0x0007 uint(8) Flags

Volume Header

Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF char
0x0000 76 6f 6c 68 -- -- -- -- -- -- -- -- -- -- -- -- v o l h . . . . . . . . . . . .
Offset Datentyp Bezeichnung Erklärung
0x0000 uint(32) Magic Bytes
0x0004 uint(24) Block-Länge
0x0007 uint(8) Flags

Der Volume Header enthält seinerseits keinerlei Nutzdaten.
Er dient lediglich als Container.

Als erstes Datum im Volume Header sollten sich die Volume Strings finden; darauf folgen dann die Volume-Informationen.

Volume Strings

Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF char
0x0000 76 6f 6c 69 -- -- -- -- -- -- -- -- -- -- -- -- v o l i . . . . . . . . . . . .
Offset Datentyp Bezeichnung Erklärung
0x0000 uint(32) Magic Bytes
0x0004 uint(24) Block-Länge
0x0007 uint(8) Flags
Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF char
0x0000 76 6f 6c 73 -- -- -- -- -- -- -- -- -- -- -- -- v o l s . . . . . . . . . . . .
Offset Datentyp Bezeichnung Erklärung
0x0000 uint(32) Magic Bytes
0x0004 uint(24) Block-Länge
0x0007 uint(8) Flags
0x0008 uint(32) Payload-Länge

Gibt an, wieviele Bytes der folgenden Daten tatsächlich Nutzdaten sind.

Die restlichen, verbleibenden Daten der Volume-Strings-Liste sind offenbar als garbage zu werten.

In Dateien mit späterem Datum sind diese 'verbleibenden Daten' 0x00, was auf Unzulänglichkeiten mit der Toolchain während der Entwicklung des Spieles deuten könnte, sprich, dass sich erst sehr spät ein Entwickler um die korrekte Initialisierung der Puffer gekümmert hat, da es keinen Einfluss auf das Spiel hat, ob die Daten initialisiert sind oder nicht.

0x000c uint(8)[] Dateinamen-Liste

Hierbei handelt es sich um eine 0-Byte-Terminierte Liste von Dateinamen, die - zumindest im vorliegenden Datenbestandteil - lediglich ASCII-Zeichen erwarten lässt.

Es ist nicht nötig, beim Parsen der Daten diesen Datenblock genauer auszuwerten, da in den Volume-Informationen ohnehin direkt die Offsets der Dateinamen referenziert werden.

Bei den Volume Strings handelt es sich um eine Liste von Dateinamen, die innerhalb des Volumes enthalten sind.

Volume Informationen

Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF char
0x0000 76 6f 6c 69 -- -- -- -- -- -- -- -- -- -- -- -- v o l i . . . . . . . . . . . .
Offset Datentyp Bezeichnung Erklärung
0x0000 uint(32) Magic Bytes
0x0004 uint(24) Block-Länge
0x0007 uint(8) Flags

Die Volume-Informationen nehmen detailliertere Informationen zu den Dateien auf. Dabei handelt es sich in gewisser Weise um eine Art FAT-Verzeichniseintrag (FAT = File Allocation Table)

Die Anzahl an Dateien ergibt sich aus der Blockgröße geteilt durch die Länge der Verzeichniseinträge - 14 Byte.

Die einzelnen Verzeichniseinträge haben dabei jeweils folgenden Aufbau:

Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF char
0x0000 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
Offset Datentyp Bezeichnung Erklärung
0x0000 uint(32) Dateinamen-Offset

Gibt an, an welchem Offset (!) innerhalb der Dateinamensliste (Volume-Strings) der Dateiname der Datei findet.

Bezieht sich dabei auf den Anfang des Nutzdatenblocks.

0x0004 uint(32) Datei-Offset

Gibt an, an welchem Offset innerhalb der gesamten Volume-Datei sich die Datei befindet.

0x0008 uint(32) Datei-Größe

Gibt an, wie groß die Datei in Byte ist.

0x000c uint(16) Flags?

Gibt offenbar zusätzliche Informationen über die Dateikodierung an.

  • 0x03 ist gesetzt, wenn die Datei komprimiert ist. Hier kommt offenbar ein Huffmann-Baum zum Einsatz.
  • 0x80 ist scheinbar immer gesetzt.

Volume Block

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

Bei einem Volume-Block handelt es sich um einen Container, der Dateien aufnimmt. Er enthält lediglich noch einmal - aufgrund des Blockformates - redundant die Dateigröße und anschließend folgen direkt die Nutzdaten.