C4Group
Aus Clonk Wiki
| Für das Kommandozeilenprogramm zur Bearbeitung von C4Group-Dateien, siehe C4Group.exe. |
C4Group ist der Name des Gruppendatei-Formats, in dem die Spieldaten von Clonk gepackt sind, also Szenarien (c4s), Rundenordner (c4f), Objektdefinitionen (c4d) usw.
Gruppendateien können im Entwicklermodus des Menüsystems geöffnet, bearbeitet, entpackt und gepackt oder zerlegt werden.
Inhaltsverzeichnis |
Aufbau
C4Group-Dateien haben folgenden Aufbau:
- GZIP-Header (mit geänderten Magic Bytes 0x1e und 0x8c)
- Deflate-komprimierter Datenbereich.
- GZIP-Footer (CRC32 und unkomprimierte Länge)
Gruppen-Header
Der Datenbereich beginnt mit dem 204 Byte langen Gruppenheader des Hauptordners der Gruppendatei. Jeder Ordner innerhalb einer Gruppendatei beginnt mit seinem Gruppenheader, der Informationen über ihn liefert. Er ist auf folgende weise verschlüsselt:
for position = 0 to Datenlänge - 1 step 3
Vertausche(puffer[position], puffer[position + 2])
next
for position = 0 to Datenlänge - 1
puffer[position] = puffer[position] xor 0xED
next
Implementierungen in C, C# und Python sind in der entsprechenden Unterseite zu finden.
Aufbau des Gruppenheaders (im source code: C4GroupHeader):
| Offset (in Bytes) | Größe (in Bytes) | Datentyp | Beschreibung (Clonk Rage) | Beschreibung (OpenClonk) |
|---|---|---|---|---|
| 0 | 25 | String | Muss RedWolf Design GrpFolder sein. | |
| 25 | 3 | - | Reserviert. | |
| 28 | 4 | Integer | Versionsnummer 1. Muss 1 sein. | |
| 32 | 4 | Integer | Versionsnummer 2. Muss 2 sein. | |
| 36 | 4 | Integer | Anzahl der Unterordner und Dateien. | |
| 40 | 32 | String | Name des Autors. | Reserviert. |
| 72 | 32 | - | Reserviert. | |
| 104 | 4 | time_t (Integer) | Erstellungsdatum. | |
| 108 | 4 | Integer | 1234567 falls die Gruppe ein Originalpaket ist, oder ein beliebiger anderer Wert andernfalls. | |
| 112 | 92 | - | Reserviert. | |
Inhaltsverzeichnis
Auf den Gruppenheader folgt das (unverschlüsselte) Inhaltsverzeichnis des Ordners. Es enthält Informationen über die sich im Ordner befindenden Dateien und Ordner. Jeder Eintrag des Inhaltsverzeichnisses hat eine Größe von 316 Byte. Die Anzahl der Einträge wird im Gruppenheader angegeben.
Aufbau eines Eintrags aus dem Inhaltsverzeichnis (im source code: C4GroupEntryCore):
| Offset (in Bytes) | Größe (in Bytes) | Datentyp | Beschreibung (Clonk Rage) | Beschreibung (OpenClonk) |
|---|---|---|---|---|
| 0 | 257 | String | Dateiname. | |
| 257 | 3 | - | Reserviert. | |
| 260 | 4 | Integer | Muss ein beliebiger Wert außer 0 sein. | |
| 264 | 4 | Integer | 0 wenn der Eintrag eine Datei ist, 1 wenn es sich um einen Ordner handelt. | |
| 268 | 4 | Integer | Dateigröße. | |
| 272 | 4 | - | Reserviert. | |
| 276 | 4 | Integer | Abstand des Dateiinhalts vom Ende des Inhaltsverzeichnisses. | |
| 280 | 4 | time_t (Integer) | Datum der letzten Modifikation. | Reserviert. |
| 284 | 1 | Byte | 0: Keine Prüfsumme vorhanden 1: Prüfsumme des Dateiinhalts 2: Prüfsumme über Dateiinhalt und Dateiname | |
| 285 | 4 | Vorzeichenloser Integer | CRC32-Prüfsumme. | |
| 289 | 1 | Byte | Gibt an ob die Datei ausführbar ist. (Wird nur unter Linux benötigt) 0: Nicht ausführbar 1-255: Ausführbar | |
| 290 | 26 | - | Reserviert. | |
Es folgen die Dateiinhalte.
Nachteile
C4Group ist ein progressiv komprimiertes Format, d.h. wenn eine Datei entpackt werden soll, muss die C4Group-Datei vom Anfang bis zu der angefragten Datei entpackt werden. Dadurch werden auch nicht benötigte Dateien entpackt, die verworfen werden. Außerdem muss die C4Group-Datei jedesmal zurück an den Anfang springen, wenn eine Datei angefragt wird, die vor der aktuellen Leseposition liegt. Für OpenClonk ist daher geplant, auf ein anderes Kompressionsformat umzusteigen, wie z.B. ZIP, das einen wahlfreien Zugriff ermöglicht.
Änderungen
| Datum | Änderung |
|---|---|
| 30.05.98 | * C4Group new magic (load old/new, save new), file version 1.2 |
| 22.12.98 | + C4Group creation stamp |
| 23.05.99 | + C4Group::EntryTime |
| 28.03.04 | + automatic contents checksum creation and caching |
| 13.05.06 | * C4Group: use file names for crc, too |
| 25.07.06 | ! C4Group: Calc new-style CRC32 of entries using entry filename instead of group filename |