所有格式页面 ↓
文件格式参考

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

来自 coreprime/kbot @ 0ab97bf · 在 GitHub 上编辑

kbot

这是一份关于 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 变体。


如何使用本文档

每个格式页面的结构都相同:

  1. 它是什么——用途,以及它在 TA 安装目录中出现的位置。
  2. 磁盘布局——先是文件头结构体,然后是各载荷部分,并标出字节偏移量。
  3. 读取顺序——能成功解析该文件的定位/读取步骤序列。
  4. 实例解析——逐字节拆解一个真实的 Cavedog 文件。
  5. 自己动手查看——可以在自己的游戏文件上运行、实时查看数据的 kbot 命令。
  6. 坑点——未记载的边界情况、版本差异、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。