7akeem0/forzatech-localization-toolkit
GitHub: 7akeem0/forzatech-localization-toolkit
逆向工程并公开记录 ForzaTech 引擎的文本、字体与 UI 归档二进制格式,提供经过逐字节验证的 Python 工具以支持社区进行多语言本地化。
Stars: 3 | Forks: 0
# ForzaTech 本地化工具包
## 这个项目是什么
ForzaTech 是 Playground Games 和 Turn 10 Studios 在《Forza》系列中使用的引擎。直到现在,还没有公开文档说明游戏如何存储其文本(`.str`)、字体(`.vfont` / `.vfont0`),或者其 UI 归档(`UI.zip`)如何在修改后保持 memory-mapped alignment。
本仓库记录了这些二进制格式,并提供了 Python 工具来读取和写入它们,同时在原版游戏文件上进行了逐字节的 roundtrip 验证。
这项工作的参考应用是:[《Forza Horizon 6》的首个完整阿拉伯文本地化 mod](https://www.nexusmods.com/forzahorizon6/mods/65),已发布在 Nexus Mods 上。该 mod 本身不在此仓库的范围内——这里记录的是使该 mod 成为可能的底层工程工作。
## 已破解的内容
| 子系统 | 状态 | 验证 |
|---|---|---|
| `.str` 二进制格式(字符串表) | 完全记录 | 对 287 个文件 × 24 种语言进行逐字节 roundtrip |
| `.vfont`(metrics + slot table) | 完全记录 | 对 20/20 种字体进行逐字节 roundtrip |
| `.vfont0`(mesh blobs: vertex + index) | 完全记录 | 对 19/20 种字体进行逐字节 roundtrip |
| `UI.zip` custom `0x1123` extra field | 已记录 | 在 454 个 entry 上确认了字段的语义 |
| Slot-preserving PKZIP repack | 已记录 + 工具 | 修改 UI 而不破坏 memory-mapped offsets 所必需 |
| Silent integrity checks(索引) | 已记录 | 即使 CRC 正确也无法修改的文件列表 |
| Latin-LSB glyph convention | 已记录 | 影响所有非拉丁语系 scripts 的引擎假设 |
## 快速开始
```
git clone https://github.com/7akeem0/forzatech-localization-toolkit
cd forzatech-localization-toolkit
pip install -r requirements.txt
```
如需查看完整本地化的分步指南(8 个步骤,适用于任何语言):
**📖 [阅读 QUICKSTART.md](QUICKSTART.md)**
`examples/` 中提供了三个现成的示例:
```
# 提取所有文本为可翻译的 JSON 格式
python examples/01_extract_all_strings.py /path/to/EN.zip ./strings_json
# 修改后重建文本表格
python examples/02_modify_one_string.py ./strings_json /path/to/EN.zip output.zip
# 从 TTF 构建自定义 font
python examples/03_build_custom_font.py NotoSans.ttf out.vfont out.vfont0 \
--base Horizon_A.vfont --base0 Horizon_A.vfont0 --range 0x0400 0x04FF
```
## 文档
| 文件 | 主题 |
|---|---|
| [`QUICKSTART.md`](QUICKSTART.md) | 从头到尾的分步指南(从这里开始) |
| [`docs/install.md`](docs/install.md) | 游戏文件布局、备份、安装模式 |
| [`docs/str_format.md`](docs/str_format.md) | `.str` 二进制格式(header、sections、hash-linked key↔value) |
| [`docs/vfont_format.md`](docs/vfont_format.md) | `.vfont`:slot table、glyph records、kerning trailer、font fingerprint tags |
| [`docs/vfont0_format.md`](docs/vfont0_format.md) | `.vfont0`:atlas prelude、per-glyph blob、vertex/index encoding |
| [`docs/ui_zip_repack.md`](docs/ui_zip_repack.md) | `0x1123` extra field、4 KB alignment、slot-preserving repack algorithm |
| [`docs/silent_integrity_checks.md`](docs/silent_integrity_checks.md) | 引擎以非 CRC 方式检查的文件;哪些可行,哪些不可行 |
| [`docs/latin_lsb_convention.md`](docs/latin_lsb_convention.md) | 引擎关于 glyph origin 的假设;非拉丁语系 scripts 所需的 vertex shift |
| [`docs/rtl_in_ltr_engines.md`](docs/rtl_in_ltr_engines.md) | 在从左向右的引擎中渲染从右向左 scripts 的通用方法 |
| [`STORY.md`](STORY.md) | 逆向工程之旅的叙述 |
## 工具
| 工具 | 功能 |
|---|---|
| `tools/str_codec.py` | 读取和写入 `.str` 文件。已验证 roundtrip。 |
| `tools/vfont_codec.py` | 读取和写入 `.vfont` 和 `.vfont0` 文件。已验证 roundtrip。 |
| `tools/build_font_from_ttf.py` | 从 TrueType 字体构建 `.vfont` + `.vfont0`。可处理任何 codepoints 范围。 |
| `tools/patch_fontsettings.py` | 修复 `fontsettings.xml` 中的 fallback 链,以便所有权重(Bold/Condensed)都能返回到你注入新脚本的字体。 |
| `tools/ui_zip_patcher.py` | 用于 `UI.zip` 的 slot-preserving patcher。保留所有 4 KB-aligned data offsets。 |
## 为什么会有这个项目
《Forza》系列内置了 24 种官方语言。许多语言社区(泰语、乌克兰语、越南语、印地语、波斯语等)没有官方支持。在这个仓库之前,粉丝本地化受限于三个未解决的问题:
1. `.str` 格式是封闭的。文本无法提取或重新注入。
2. `.vfont` / `.vfont0` 格式是封闭的。无法添加新的 glyphs。
3. `UI.zip` 使用了 custom `0x1123` extra field,如果保存不当,游戏在启动时会崩溃。
这三个问题在这里都得到了记录和解决。任何业余翻译者现在都可以为任何《Forza》游戏制作其语言的完整本地化。
## 兼容性
已在 **Forza Horizon 6**(2026 年 5 月版本,Steam build)上验证。这些格式在 ForzaTech 的各个版本中保持稳定,预计在对 **Forza Horizon 4**、**Forza Horizon 5** 和 **Forza Motorsport (2023)** 进行微调后也能运行。具体的 offsets 和 font sets 因游戏而异;格式本身不会改变。
## 兼容 Anti-Cheat
ForzaTech 游戏支持联网,发行商的服务条款禁止修改游戏文件。本仓库中的工具仅触及客户端的本地化资源,对游戏性没有任何影响,**但在连接到在线服务时使用任何修改的风险由用户自行承担**。单机离线模式是这些工具产出的唯一支持模式。
## 许可证
- **代码**(`tools/`, `examples/`):MIT License。参见 [`LICENSE`](LICENSE)。
- **文档**(`docs/`, `README.md`, `STORY.md`, `QUICKSTART.md`):Creative Commons Attribution 4.0 (CC-BY-4.0)。
## English(英文原版说明)
首次公开逆向工程 **ForzaTech**(驱动《Forza Horizon 4/5/6》和《Forza Motorsport》的专有游戏引擎)的文本和字体子系统。该工具包允许你提取、修改并重新打包基于该引擎构建的任何游戏的本地化数据。
### 这是什么
ForzaTech 是 Playground Games 和 Turn 10 Studios 用于《Forza》系列的引擎。到目前为止,还没有关于该引擎如何存储其文本字符串(`.str`)、其字体(`.vfont` / `.vfont0`),或者其 UI 归档(`UI.zip`)在修改后如何保持 memory-mapped alignment 的公开文档。
本仓库记录了这些二进制格式,并提供了 Python 工具来读取和写入它们,同时针对已发布的游戏文件验证了逐字节的 roundtrip。
这项工作的伴随项目是:[《Forza Horizon 6》的首个完整阿拉伯文本地化 mod](https://www.nexusmods.com/forzahorizon6/mods/65),作为参考实现发布在 Nexus Mods 上。该 mod 本身不在此仓库的范围内;这里记录的是使其成为可能的底层引擎工作。
### 快速开始
```
git clone https://github.com/7akeem0/forzatech-localization-toolkit
cd forzatech-localization-toolkit
pip install -r requirements.txt
```
如需完整的端到端操作指南(8 个步骤,适用于所有 scripts 通用):请参阅 **[QUICKSTART.md](QUICKSTART.md)**。
### 已逆向工程的内容
| 子系统 | 状态 | 验证 |
|---|---|---|
| `.str` 字符串表二进制格式 | 完全记录 | 对 287 个文件 × 24 种语言进行逐字节 roundtrip |
| `.vfont` font metrics + slot table | 完全记录 | 对 20/20 种受测字体进行逐字节 roundtrip |
| `.vfont0` mesh blob 格式 | 完全记录 | 对 19/20 种受测字体进行逐字节 roundtrip |
| `UI.zip` custom `0x1123` extra field | 已记录 | 在 454 个 entries 上确认了语义 |
| Slot-preserving PKZIP repack 技术 | 已记录 + 工具 | 修改 UI 而不破坏 memory-mapped offsets 所必需 |
| Silent integrity checks(目录) | 已记录 | 即使具有正确的 CRC 也无法修改的文件列表 |
| Latin-LSB glyph convention | 已记录 | 影响所有非拉丁语系 scripts 的引擎假设 |
### 文档
从 [`QUICKSTART.md`](QUICKSTART.md) 和 [`docs/install.md`](docs/install.md) 开始。`docs/` 中的其余文档是每个子系统的正式规范。[`STORY.md`](STORY.md) 是逆向工程之旅的叙述。
### 工具
- `tools/str_codec.py` — `.str` 读取器/写入器(已验证 roundtrip)。
- `tools/vfont_codec.py` — `.vfont` 和 `.vfont0` 读取器/写入器(已验证 roundtrip)。
- `tools/build_font_from_ttf.py` — 从任何 TrueType 字体生成 `.vfont` + `.vfont0`。
- `tools/patch_fontsettings.py` — 重写字体 fallback 链,以便所有权重都能通过你修改后的字体解析。
- `tools/ui_zip_patcher.py` — 用于 `UI.zip` 的 slot-preserving patcher(保留 4 KB-aligned data offsets)。
### 为什么会有这个项目
《Forza》系列提供 24 种官方文本语言。许多语言社区(泰语、乌克兰语、越南语、印地语、波斯语等)没有官方支持。在这个工具包之前,粉丝本地化被三个未解决的问题所阻挡:`.str` 格式是不透明的,`.vfont` / `.vfont0` 格式是不透明的,而 `UI.zip` 使用了 custom `0x1123` extra field,如果保存不当会导致崩溃。这三个问题都在这里得到了记录和解决。
### 兼容 Anti-cheat
ForzaTech 游戏支持联网,发行商的服务条款禁止修改游戏文件。本仓库中的工具仅触及客户端的本地化资源,对游戏性没有任何影响,**但在连接到在线服务时使用任何修改的风险由用户自行承担**。单机离线模式是唯一支持的模式。
### 鸣谢
逆向工程、文档和工具:**Hesham**。Nexus 上的阿拉伯文本地化 mod(参考实现)由同一作者发布。
### 许可证
- **代码**(`tools/`, `examples/`):MIT License。
- **文档**(`docs/`, `README.md`, `STORY.md`, `QUICKSTART.md`):Creative Commons Attribution 4.0 (CC-BY-4.0)。
标签:Python, 云资产清单, 文件格式, 无后门, 本地化, 游戏Modding, 游戏引擎, 逆向工具, 逆向工程