前記事(約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 N
spriteは興味ないですね。