CSのスプレー その2

前記事(約1年前)
CSのスプレー - 日々量産
結構日が開いたのは途中で投げたからです。仕方ないね。


先に今回気づいた教訓だけ書いておきます。

  • ファイルに使われている規格を調べる時は "フォーマット名(BMP,JPEGなど) specification" と検索すると良い。

日本語の資料はメジャーなモノでさえも少ないので、海外に頼ると良いって事です。


さて、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は興味ないですね。