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