在WOF的OPEN BETA客戶端里面,我看到很多TGL文件。看同事在玩這個游戲,我覺得畫面挺精致的,于是想把它的圖像文件解開。
用HEDIT打開一個TGL文件,一開始有個DFX的頭標(biāo)記。跳過一堆很多00的數(shù)據(jù)之后,我看到了78 9C,再根據(jù)游戲目錄下的ZLIB的DLL,基本可以確定后面就是壓縮過的圖像數(shù)據(jù)。
從78 9C往前看,有兩個BYTE[4]的數(shù)字,前面的一個比后面的大,而且后面一個等于后面78 9C開頭的數(shù)據(jù)的長度。推斷這兩個分別是壓縮前和壓縮后的數(shù)據(jù)長度。
然后,我就寫了個小程序解開了TGL。它里面壓縮的圖像數(shù)據(jù)經(jīng)過檢查,是DDS文件,也就是DIRECTX可以使用的一種貼圖格式。用DXSDK的貼圖工具即可打開。
經(jīng)過仔細推敲,TGL文件的格式也基本解開,如下所描述
//文件頭格式
char[4] sign; //文件標(biāo)記
int specialflag; //特殊標(biāo)記(據(jù)猜測用來表示后面需要單獨指定每幀的顯示時間)
int unknown; //未知(據(jù)猜測,用來指定后面的SIZE的個數(shù))
struct SIZE{long x; long y;} sizes[4]; //圖像大小描述 (據(jù)猜測用來指定圖像的實際大小,文件大小,開始點和結(jié)束點)
int frameCount; //圖像幀數(shù)
int frameDispalyTime; //據(jù)猜測是圖像每幀顯示時間
struct RECT { long left;long top;long right;long bottom;} rects[frameCount]; //圖像的顯示RECT(據(jù)猜測用來確定每幀圖像在實際大小里面的顯示RECT)
if( specialflag == 1 ){ int frameDisplayTime[frameCount];} // 如果標(biāo)記是真,這里就是每幀的單獨顯示時間(猜測)
根據(jù)幀數(shù),后面有幀數(shù)個圖像塊,他們的格式如下:
// 圖像塊格式
int blockflag; //標(biāo)記塊是否有效,一般為1有效
int originSize; // 圖像塊的原始大小
int compressedSize; // 圖像塊的壓縮后的大小
byte[compressedSize] data; //圖像塊壓縮數(shù)據(jù)
用這個格式就可以解出TGL里面的圖像了。我為了省力,直接用HGE來進行DDS的顯示,做了一個TGL查看器。下面就是程序下載。
/Files/johndragon/tglviewer.zip查看器使用方法:直接將TGL文件拖放到窗口上即可。