横扫千军与横扫千军:王国格式参考

这是一份关于 Cavedog Entertainment 在《横扫千军》(1997)和《横扫千军:王国》(1999)中所用专有文件格式的实用指南,从实际逆向工程的角度写成。每一页都把磁盘上的字节布局与一条单行 kbot 命令放在一起,让你可以一边读正文,一边动手查看真实文件。
Tip
第一次来? 先读快速入门:五条命令,五分钟内展示这个工具包能做什么。
Note
如果还没有安装,请先安装工具包并注册一个上下文(context):
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 |
横扫千军:王国的真彩色(16 位 ARGB)动画——法术特效、爆炸、菜单背景——以及它们可编辑的文本形式 | TA:K ✅ |
| PCX | .pcx |
ZSoft Paintbrush 位图——单位头像、界面面板,以及 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 位的可变宽度位图字体 | TA ✅ |
| Smacker / ZRB | .smk .zrb |
过场视频(RAD Game Tools 的 Smacker,扩展名改为 .zrb) |
TA ✅ |
| Bink | .bik |
横扫千军:王国的过场视频(RAD Bink 1)——Smacker 的后继者 | TA:K ✅ |
| WAV / 音效 | .wav |
普通 WAV,以及三层音效库的关联方式 | TA ✅ TA:K ✅ |
地图与地形
| 页面 | 扩展名 | 用途 | 一等支持? |
|---|---|---|---|
| SCT | .sct |
可复用的地图区块,拼接起来组成 .tnt 地图 |
TA ✅ |
| TNT | .tnt |
一张完整可玩的地图(图块网格 + 高度图 + 小地图 + 地图物件列表) | TA ✅ |
| TA:K 地图 | .tnt .ota .crt .kmp |
横扫千军:王国的地图管线——纹理映射地形 + 小地图渲染,以及 .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:K 界面 | .gui |
《横扫千军:王国》菜单所用的以空白分隔的控件树 | TA:K ✅ |
教程与参考
| 页面 | 内容 |
|---|---|
| 快速入门 | 先试这五条命令。 |
| 制作单位模组 | 端到端教程:提取 → 编辑 → 重新打包 → 测试(TA)。 |
| 常见陷阱 | 一页汇总各格式文档中的所有坑。 |
| TA 与 TA:K 格式对比 | 一页对照表:哪些相同、哪些相似、哪些为某款游戏独有。 |
| 参考目录 | 独立仓库:coreprime/reference-ta——278 个单位 / 199 种武器 / 45 个建造者;coreprime/reference-tak——203 个单位 / 198 种武器 / 32 个建造者。 |
| 术语表 | 常用术语(piece、axis、sealevel、signal mask 等)。 |
| 图片库 | 文档中的每一张插图,附生成它的命令。 |
图例: ✅ 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
一次挂载整个安装目录。 与其一个压缩包一个压缩包地查看,不如把 kbot mount 指向安装根目录。它会遍历文件夹中的每个 HPI/UFO/CCX,把内容叠加成一个虚拟文件系统,这样你浏览 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 ≈ 世界空间单位。 |
| 游戏 tick 频率 | 每秒 30 tick。COB 和 GAF 中的大多数计时字段以 tick 为单位。 |
| 透明色 | 没有适用于整个调色板的透明索引。GAF 帧自行指定透明色键(通常为 9,有时为 0),压缩帧中被跳过的像素是透明的;地形、小地图、背景图和模型纹理会绘制每一个索引,包括调色板索引 0(黑色)。 |
Important
在信任任何偏移量之前,务必先校验魔数。 有几种格式(HPI、COB、GAF、TNT、SCT)在第一个字段中带有 32 位签名。如果值不匹配,那么这个文件要么已损坏,要么来自使用私有格式的模组,要么——对 TA:K 而言——是版本字不同的 .taf/.tsf 变体。
如何使用本文档
每个格式页面的结构都相同:
- 它是什么——用途,以及它在 TA 安装目录中出现的位置。
- 磁盘布局——先是文件头结构体,然后是各载荷部分,并标出字节偏移量。
- 读取顺序——能成功解析该文件的定位/读取步骤序列。
- 实例解析——逐字节拆解一个真实的 Cavedog 文件。
- 自己动手查看——可以在自己的游戏文件上运行、实时查看数据的
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 界面格式,以及 TA:K 格式难点笔记。
- Cavedog Entertainment——感谢他们做出了一款 25 年多以后仍值得延续下去的游戏。
当本文档与上述原始资料冲突时,以 kbot 源代码为准——这里的格式都经过了针对数千个真实 Cavedog 文件的往返测试。如果你发现不一致之处,请在 https://github.com/coreprime/kbot 提交 issue 或 PR。