どうも。
ネプテューヌmkII、Vに使われているTIDファイル自体は圧縮や暗号化がされていなく画像は1ファイルに1枚のみなので簡単です。
基本的にデータ部分がDXTなのでヘッダ領域を解釈すればDDSファイルに変換できます。
以下のことは私の解釈なので間違いや足りないものがあると思います。
※TIDデータはPS3なのにビッグエンディアンです。
■ファイル構造
1. ヘッダ
2. データ情報
3. イメージデータ
の3つで構成されています。
■ヘッダは32byte or 16byteの2種類があります。
※このBBSシステムだとCの構造体が書けないので書き方を変えてます。
// TIDヘッダ構造体
struct stTID_HEADER
u32 Signature; // TIDx
u32 FileSize; // ファイルサイズ
u32 DataOffset; // データ先頭オフセット
u32 n4; // 謎
u32 Flag;; // 01 or ファイル名
u32 NameOffset; // ファイル名文字列先頭オフセット
u32 n7; // pad?
u32 n8; // pad?
■Signatureはアスキー文字でTIDが入ります。
4byte目の1byteはデータフォーマットとして解釈できます。
0x81:DXT1 or DXT5
0x83:32bit RGBA
0x87:32bit RGBA 高速転送用
0x89:DXT1 or DXT5
0x91:DXT1 or DXT5 (トゥーン用)
0x93:32bit RGBA
0x97:32bit RGBA 高速転送用
0x99:DXT1 or DXT5 (ミップマップ)
■2種類のヘッダを見分ける方法
自分はFlagに入っている値で判別してデータ情報のオフセットを変更しています。
0x00000001であれば0x20から開始
それ以外であれば0x10から開始
■データ情報
Flagから判断したオフセットから始まる構造体です。
Formatが0の場合32bit RGBAとして判断しますがSwizzleされた高速転送用の場合unSwizzleする必要があります。
するかしないかはヘッダの4byte目の値が0x87であるかで判別できます。
Swizzleされたテクスチャは主にキャラクターの3Dモデルの表情に使われるアニメーション用です。
イベントや立ち絵などには使用されていません。
またこの値でDXT1かDXT5かを判別できます。
struct stTID_INFO
s8 name[0x20]; // ファイル名の文字列
u32 InfoSize; // データ情報のサイズ?
u32 Width; // 横幅
u32 Height; // 縦幅
u32 n13; // 謎
u32 n14; // 何かのフラグ?
u32 n15; // 謎
u32 DataSize; // イメージデータサイズ
u32 DataOffset; // イメージデータのオフセット
u32 n18; // 謎
u32 Format; // DXT1/DXT5などの文字列
u32 DataSize2; // イメージデータサイズその2
u32 n21; // 謎
■イメージデータ
イメージデータはDDS用のデータになっていたのでエンディアン変換やRGBAの配置を変更しなくても良かったはずです。
(自分のソースを見た感じ)
では頑張ってください。