Half-Life WAD Archiv Spezifikation

Allgemeines

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:

  1. Dem Kopfteil, Header genannt
  2. Den Objektdaten, Lumps genannt
  3. Den Objekttabellen, Lump Tables genannt


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.

WAD Header

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.


C/C++ Code des WAD Headers

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.

Java Code des WAD Headers

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ß.

Header Wertetabelle

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!

Die Verwendung aller Dokumente einschließlich der Abbildungen ausschließlich zu nichtkommerziellen Zwecken. Verbreitung des Dokuments auf Speichermedien, (insbesondere auf CD-ROMs als Beilage zu Zeitschriften und Magazinen oder sog. "Mission-Packs" etc.) ist untersagt.
 
goldsrc/specification/wad.txt · Zuletzt geändert: 2011/07/03 13:05 von 188.107.216.191