Total AnnihilationとTA: Kingdomsのファイル形式リファレンス

Cavedog EntertainmentがTotal Annihilation(1997年)とTotal Annihilation: Kingdoms(1999年)に同梱した独自のファイル形式について、実際にリバースエンジニアリングを行ってきた立場から書いた手引きです。どのページでも、ディスク上のバイト配置と一緒に、kbotの1行コマンドを載せているので、説明を読みながら本物のファイルを実際にいじってみることができます。
Tip
初めての方へ:クイックスタートを読んでください。ツールキットの実力を5分で見せてくれる5つのコマンドを紹介しています。
Note
まだの場合は、先にツールキットをインストールして、コンテキストを登録してください。
go install github.com/coreprime/kbot/cmd/kbot@latest
kbot ctx add ~/games/totala --alias ta --game totala
コンテキストを選択しておけば、ほとんどのコマンド(kbot tnt preview …、kbot gaf list …、kbot mount --server)は、パスを含まないファイル名を、インストール先にあるすべてのHPI/UFO/CCX/GP3アーカイブから探してくれます。もう絶対パスを打ち込む必要はありません。
形式の一覧
コンテナとラッパーの形式
| ページ | 拡張子 | 用途 | 本格対応 |
|---|---|---|---|
| HPI / UFO / CCX / GP3 | .hpi .ufo .ccx .gp3 |
暗号化・圧縮されたアーカイブ。ほかのすべてを包む入れ物 | TA ✅ TA:K ✅ |
グラフィックとメディア
| ページ | 拡張子 | 用途 | 本格対応 |
|---|---|---|---|
| GAF | .gaf .taf |
インデックスカラーのスプライトアニメーション(カーソル、爆発、ユニットのガジェット、地形物) | TA ✅ TA:K ✅ |
| TAF / TSF | .taf .tsf |
TA: Kingdomsのトゥルーカラー(16ビットARGB)アニメーション(呪文の効果、爆発、メニューの背景)と、その編集可能なテキスト形式 | TA:K ✅ |
| PCX | .pcx |
ZSoft Paintbrushのビットマップ。ユニットの肖像画、GUIのパネル、TA:Kのパレットを運ぶファイル | TA ✅ TA:K ✅ |
| PAL / ALP / LHT / SHD | .pal .alp .lht .shd |
256エントリのカラーパレット(1,024バイト)と色のルックアップテーブル。.alpは256×256(65,536バイト)、.shd / .lhtは32×256(8,192バイト) |
TA ✅ TA:K ✅ |
| FNT | .fnt |
1ピクセル1ビットの可変幅ビットマップフォント | TA ✅ |
| Smacker / ZRB | .smk .zrb |
カットシーンの動画(RAD Game ToolsのSmackerを.zrbに改名したもの) |
TA ✅ |
| Bink | .bik |
TA: Kingdomsのカットシーンの動画(RAD Bink 1)。Smackerの後継 | TA:K ✅ |
| WAV / サウンド | .wav |
普通のWAVと、3層構造のサウンドバンクの結び付け | TA ✅ TA:K ✅ |
マップと地形
| ページ | 拡張子 | 用途 | 本格対応 |
|---|---|---|---|
| SCT | .sct |
つなぎ合わせて.tntマップを作る、再利用可能なマップのセクション |
TA ✅ |
| TNT | .tnt |
プレイ可能な完全なマップ(タイルのグリッド+ハイトマップ+ミニマップ+地形物の一覧) | TA ✅ |
| TA:Kのマップ | .tnt .ota .crt .kmp |
TA: Kingdomsのマップの処理の流れ。テクスチャを貼った地形とミニマップの描画、そして.crtのシナリオ用サイドカーファイル(配置済みのユニット、ルール、トリガー) |
TA:K 🟡 |
ユニット、スクリプト、設定
| ページ | 拡張子 | 用途 | 本格対応 |
|---|---|---|---|
| 3DO | .3do |
面がパレットインデックスで塗られた、ユニットや地形物の階層型3Dメッシュ | TA ✅ |
| COB / BOS | .cob .bos |
すべてのユニットを動かす、スタックベースのアニメーション・スクリプト用バイトコード | TA ✅ TA:K ✅ |
| TDF / FBI / OTA | .tdf .fbi .ota |
INI風の設定ツリー。ユニットのステータス、武器、マップのメタデータ。FBIフィールド辞典の完全版を収録。 | TA ✅ TA:K ✅ |
| GamedataのTDF | gamedata/*.tdf |
移動クラス、陣営データ、サウンドの割り当て、武器のリファレンス | TA ✅ |
| AIプロファイル | ai/*.txt |
難易度ごとのAIの重みとユニットの上限を書いたプレーンテキスト(TAKのプロファイルにはplanがありません。TAKの注記を参照) | TA ✅ TA:K ✅ |
TA: KingdomsのGUI
| ページ | 拡張子 | 用途 | 本格対応 |
|---|---|---|---|
| TA:KのGUI | .gui |
TA: Kingdomsのメニューに使われる、空白文字区切りのウィジェットツリー | TA:K ✅ |
チュートリアルとリファレンス
| ページ | 内容 |
|---|---|
| クイックスタート | 最初に試したい5つのコマンド。 |
| ユニットのMOD制作 | 取り出し→編集→まとめ直し→テストまでを通して行うチュートリアル(TA)。 |
| 落とし穴 | 形式ドキュメント全体の注意点を1ページにまとめた早見表。 |
| TAとTA:Kの形式の比較 | 共通のもの、似ているもの、一方のゲームにしかないものを1ページにまとめた対照表。 |
| リファレンスカタログ | 独立したリポジトリ:coreprime/reference-ta(ユニット278体、武器199種、建設ユニット45体)、coreprime/reference-tak(ユニット203体、武器198種、建設ユニット32体)。 |
| 用語集 | よく使う用語(ピース、軸、sealevel、シグナルマスクなど)。 |
| 画像ギャラリー | ドキュメント内のすべての図と、それを生成したコマンド。 |
凡例:✅ kbotが本格的に対応 · 🟡 ドキュメントはあるが、現在のkbotでは解析しない
形式どうしの関係
┌───────────────────────────────┐
│ HPI / UFO / CCX / GP3 │
│ (encrypted, compressed VFS) │
└──────────────┬────────────────┘
│ contains
┌──────────────────────┬───────────┼───────────────┬──────────────────┐
▼ ▼ ▼ ▼ ▼
┌───────┐ ┌───────┐ ┌───────┐ ┌────────┐ ┌─────────┐
│ FBI │ unit stats │ COB │ │ 3DO │ mesh │ GAF │ sprites│ TNT │ map
└───┬───┘ └───┬───┘ └───┬───┘ └────┬───┘ └────┬────┘
│ references │ runs on │ textured by │ used by │ built from
▼ ▼ ▼ ▼ ▼
┌───────┐ ┌───────┐ ┌───────┐ ┌────────┐ ┌─────────┐
│ TDF │ weapons │ piece │ │ PCX │ skins │ PAL │ colour │ SCT │ tiles
│ /OTA │ /features │ tree │ │ unitpic│ │ /ALP/LHT/SHD │ + heights
└───────┘ └───────┘ └───────┘ └────────┘ └─────────┘
リバースエンジニアリングの作業は、ほとんどの場合HPIをマウントするところから始まります。展開済みのインストールでさえ、HPIを取り出したものにすぎません。そこから、ユニット(FBI)がメッシュ(3DO)、スクリプト(COB)、ユニットの肖像画(PCX)、アニメーションのガジェット(GAF)を指しています。マップ(TNT)は、セクション(SCT)と地形物の配置から組み立てられ、地形物の配置はTDFの地形物定義に解決されます。
Note
インストール全体を一度にマウントしましょう。アーカイブを1つずついじる代わりに、kbot mountにインストール先のルートを指定します。kbotはフォルダー内のすべてのHPI/UFO/CCXをたどって中身を1つの仮想ファイルシステムに重ねるので、どのアーカイブから来たかを気にせずにunits/ARMCOM.fbiを見て回れます。
kbot mount ~/games/totala --server # opens at http://localhost:8090
エンディアン、文字セット、座標の規則
ページで明示的に別の扱いをしていない限り、このドキュメントのすべての形式に次の規則が当てはまります。
| 項目 | 規則 |
|---|---|
| エンディアン | リトルエンディアン(Intel x86)。 |
| 文字列のエンコーディング | ASCII / CP-437、NUL終端。TA:KではWindows-1252に一部対応しましたが、UTF-8には一度も対応していません。 |
| 数値の幅 | uint8(char)、uint16(short)、uint32(long)。64ビットの値は出てきません。 |
| 座標の原点 | 画像、タイルのグリッド、属性のグリッドでは、(0, 0)が左上です。3DOのメッシュではYが垂直方向(上)です。 |
| 3Dの固定小数点のスケール | 3DOのモデルは小数部16ビットの固定小数点を使います。value / 65536.0 ≈ ワールド空間の単位。 |
| ゲームのティックレート | 毎秒30ティック。COBとGAFのタイミングのフィールドは、ほとんどがティック単位です。 |
| 透過色 | パレット全体で共通の透過インデックスはありません。GAFのフレームは独自のキー(多くは9、ときに0)を指定し、圧縮フレームのスキップされたピクセルが透過になります。地形、ミニマップ、背景、モデルのテクスチャは、パレットインデックス0(黒)も含めて、すべてのインデックスを描きます。 |
Important
オフセットを信用する前に、必ずマジックナンバーを検証してください。いくつかの形式(HPI、COB、GAF、TNT、SCT)は、最初のフィールドに32ビットのシグネチャを持っています。値が一致しない場合、そのファイルは壊れているか、独自の形式を使うMODのものか、あるいはTA:Kなら、バージョンのワードが異なる.taf/.tsfの派生形です。
このドキュメントの使い方
形式ごとのページは、どれも同じ構成になっています。
- それが何か:用途と、TAのインストールのどこに出てくるか。
- ディスク上の配置:ヘッダーの構造体、続いてペイロードの各部分を、バイトオフセットを示しながら説明します。
- 読み込みの順序:ファイルを正しく解析するためのシークと読み込みの手順。
- 実例:Cavedogの本物のファイルを1バイトずつ分解します。
- 自分で確かめる:自分のインストールに対して実行し、データをその場で見られる
kbotのコマンド。 - 注意点:ドキュメントにない境界条件、バージョンによる違い、Cavedogのツールが残した作業用のバイトなど。
次のような囲みがあれば、
Tip
自分で試す
kbot pal swatch palettes/palette.pal --target out.png --cell 24
…そのコマンドは、コンテキストを設定しておけば書かれたとおりに実行できるという意味です。
クレジットと資料
このドキュメントは、コミュニティが数十年にわたって積み重ねてきたリバースエンジニアリングの成果をまとめたものです。個々の発見は各ページの本文中で出典を示していますが、土台になっているのは次の人々の仕事です。
- Joe D.:HPI形式の最初の解析(1997年)。
- Saruman & Bobban / dFR Engineering:最初のTNTの解説(1997年)。
- Scott "me22" McMurray:TNT形式の補足(2003年)。KinboatのAnnihilatorのソースを参考にしたもの。
- Kinboat:SCT形式、GAFのツール、Annihilatorマップエディター。
- Dan Melchione & Dark Rain:3DO形式(1998年、2002年改訂)。
- C_A_P、Switeck、KhalvKalash:COB/BOSのオペコードのリバースエンジニアリングと、Scriptor系のツール。
- Dark Rain:TA:KのGUI形式と、TA:Kの形式の難点についてのメモ。
- Cavedog Entertainment:25年以上たった今も生かし続ける価値のあるゲームを作ってくれたことに。
このドキュメントがそれらの原典と食い違う場合は、kbotのソースコードが正しい情報源です。ここにある形式は、Cavedogの本物のファイル数千個を相手にラウンドトリップのテストを済ませています。食い違いを見つけたら、https://github.com/coreprime/kbotでissueかPRを作成してください。