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