Texturen werden in Half-Life in einem speziellen Dateiformat zusammengefasst, dem sogenannten WAD Archiv. Das technische Grundgerüst stammt direkt vom Doom WAD Format ab, d.h. Doom WADs und Half-Life WADs sind technisch kompatibel zueinander. Allerdings hat id-Software nach Doom 1+2 das Ursprungsformat PWAD bzw. IWAD umbenannt in WAD (interner Name WAD2), um eine klare Abgrenzung zu der neuen Spielreihe Quake zu schaffen. Half-Life WAD3s basieren auf dem Format von WAD2, erlauben jedoch statt einer fixen Palette für alle Texturen eine Palette pro Textur.
Im Kern besteht die WAD aus drei Komponenten:
Der Header besitzt eine feste Größe, der Rest ist variabel. Lump bedeutet soviel wie Stück oder Teil. Bemerkenswert ist, daß entgegen der allgemeinen Auffassung nicht nur Texturen allein in einem WAD Archiv gespeichert werden können, sondern im Prinzip auch Fonts (Schriftarten) oder andere Binärdaten. Allerdings hat sich Valve nur auf die Texturen beschränkt und genauso wollen wir das auch hier handhaben: Es werden nur Texturen behandelt.
Lumps können theoretisch komprimiert in einer WAD gespeichert werden (LZSS Komprimierung), aber durchgehend vom Doom WAD Quellcode bis zum Half-Life WAD Quellcode gibt es keine Routinen, die eine LZSS Komprimierung implementieren. Es wurde also nie genutzt bzw. überhaupt zur Nutzung angeboten.
Hinweis: Die benutzten Datentypen entsprechen der allgemeinen Beschreibung und sind nicht an eine bestimmte Programmiersprache gebunden. Am Ende findet ihr eine kurze Definition der internationalisierten Bezeichnungen.
Gesamte Größe = 12 Bytes (0x00 bis 0x0C)
Byte offset | Typ | Inhalt | Beschreibung |
---|---|---|---|
0x00 - 0x04 | BYTE[4] | „WAD3“ | enthält die Zeichenkombination „WAD3“. |
0x05 - 0x08 | DWORD | Lumps | enthält die Anzahl der Lumps. |
0x09 - 0x0C | DWORD | Lumpstabellenoffset | enthält den Offset in Bytes zum Anfang der Lumpstabellen. |
struct wadheader { char wad3[4]; int32_t lumps; int32_t offset; };
Hinweis: Der Header wurde ursprünglich von id-Software/Valve für 32 Bit Systeme entworfen, wo long
auch 32 Bit breit ist. Aktuelle 64 Bit Systeme können für long
allerdings 64 Bit bereitstellen, weshalb es sich empfiehlt fixed stdint
Typen zu verwenden, die in <stdint.h>
zu finden sind.
public class wadheader { public byte wad3[] = new byte[4]; public int lumps; public int offset; }
Hinweis: Die Variable wad2
muß später beim Anzeigen auf dem Bildschirm usw. vorher entweder in ein char
Array oder gleich in einen String
konvertiert werden. In Java ist der Typ int
immer 4 Bytes groß.
Nachfolgend die Werte für einen WAD Header mit seinen Standard-, Minimum- und Maximumwerten:
Bezeichnung | Standard | Minimum | Maximum | Hinweise |
---|---|---|---|---|
WAD3 | „WAD3“ | Muß immer „WAD3“ sein. | ||
Lumps | 1 | 1 | Die Anzahl der Lumps ist theoretisch unbegrenzt. | |
Offset | ELL |
Die Bezeichnung ELL steht für End of Last Lump und bezeichnet die Byteposition innerhalb der WAD, wo sich das Ende des letzten, einzulesenden Lumps befindet. Beim Einlesen vorhandener WADs ist das sehr hilfreich, allerdings muß man beim Schreiben von eigenen WADs stets darauf achten, daß diese Offsetangabe 100%ig korrekt ist, sonst ist die Datei korrupt und ungültig!