前記事(約1年前)
CSのスプレー - 日々量産
結構日が開いたのは途中で投げたからです。仕方ないね。
先に今回気づいた教訓だけ書いておきます。
日本語の資料はメジャーなモノでさえも少ないので、海外に頼ると良いって事です。
さて、CSのスプレーに使われているフォーマット'WAD3'についてわかったので今回の更新に至りました。
わかったというか、有志が作成したファイルが公開されてただけなんですけどね。
http://yuraj.ucoz.com/half-life-formats.pdf
あら、わかりやすい。
試しに簡単なリーダとライタを作成して、適当なwadファイルを読み込ませたらうまい具合に読み取ってくれました。
勢いに乗ってHLTVのデモファイルの仕様もあるかな、と思ったけど、やっぱりあんまりなかったです。
日本にいたってはゼロですからね。お前等どんだけ興味ないのry
適当に日本語っぽくしておきました。僕の都合に合わせてる部分もあるので、間違ってる部分もあるかもしれません。
WADヘッダ
4byte char マジックナンバー "WAD3"(57 41 44 33)
4byte uint テクスチャの数(スプレーならだいたい1, テクスチャによっては複数ある場合も?)
4byte uint TextureInfoまでのオフセット
TextureInfo(テクスチャの数だけ並んでいるはず)
4byte uint TextureDataの開始位置のオフセット(0x0Cなら、WADヘッダの次から1つ目のテクスチャがあるという事)
4byte uint そのテクスチャあたりの情報の大きさ(圧縮済みの場合)
4byte uint そのテクスチャあたりの情報の大きさ
1byte Byte テクスチャの属性 0x43が一般的。
他のフォーマットによっては0x40(tempdecal.wad),0x42(cached.wad),0x46(fontフォーマットや、gfx.wad)になることも。
1byte Byte 圧縮されているか否か(0=圧縮されていない)
2byte None 穴埋めデータ
16byte char テクスチャ名 先頭1文字目でそのテクスチャのタイプを表現できる。
'{' = transparent
'!' = water
'+' = toggling
'-' = random tiling
'~' = something like computers, lights
TextureData
if(テクスチャ属性 == 0x40 or 0x43) then
16byte char テクスチャ名
end
4byte uint 横幅(Width)
4byte uint 縦幅(Height)
if(テクスチャ属性 == 0x40 or 0x43) then
4byte uint 自身のテクスチャ情報の開始位置からimageデータへのオフセット
4byte uint 自身のテクスチャ情報の開始位置からmipmap1へのオフセット
4byte uint 自身のテクスチャ情報の開始位置からmipmap2へのオフセット
4byte uint 自身のテクスチャ情報の開始位置からmipmap3へのオフセット
end
Nbyte byte (N=Width*Height) imageデータ。N個のデータが並んでいる。1byteはパレット番号を示す。
if(テクスチャ属性 == 0x40 or 0x43) then
Nbyte byte (N=Width/2*Height/2) mipmap1データ。同上
Nbyte byte (N=Width/4*Height/4) mipmap2データ。同上
Nbyte byte (N=Width/8*Height/8) mipmap3データ。同上
end
2byte byte 不明 (0x00 0x01固定)
if(テクスチャ属性 == 0x40 or 0x43) then
256 * 3byte byte パレット。RGB値を3byteで示す。256個まで登録可能。RGB=(0,0,255)=transparent color
end
2byte byte 穴埋めデータ
データの並び順
1つのWADファイル中にN個のテクスチャデータが含まれている場合は以下。
WADヘッダ
TextureData x N
TextureInfo x Nspriteは興味ないですね。