docs: prioritize tutorial translation and a small HD texture pilot

This commit is contained in:
DragonHD
2026-09-20 11:28:55 +08:00
parent 253cc47bc5
commit 8ee279864a
4 changed files with 206 additions and 0 deletions
@@ -0,0 +1,162 @@
# DragonHD 高收益、低复杂度优先 Implementation Plan
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** 先补齐可直接影响游玩体验的教程中文,再用少量贴图证明 2× 高清化收益,最后按验证结果扩大范围。
**Architecture:** 沿用已验收的字体补丁、GB2312 文本和资源解包成果。显示文本采用原文校验后的定点替换;高清素材采用独立清单、小批量构建及恢复。中文排版和贴图升级各自交付,避免同时更换多个变量。
**Tech Stack:** Python、Pillow、现有 res 工具;字体回归使用 Keystone/UnicornDDS 写回先确认编码工具及 mipmap 支持。
**Spec:** `docs/superpowers/specs/2026-09-20-next-steps.md`
## Global Constraints
- 游戏目录:`F:\steam\steamapps\common\The I of the Dragon`;工作目录:`E:\DragonHD`
- 保留目前 12px CJK 字库和通过验收的排版补丁。
- 脚本仅改显示调用中的文本字面量;逻辑标识、事件名、路径、单位类型保持字节不变。
- 每批单独记录原文件 SHA256、变更文件清单和可验证的恢复方式。
- 新文本须能 GB2312 编码,保留原有格式占位符和引擎控制符。
- 贴图第一轮只做 2×,保留比例;透明通道、压缩类型及 mipmap 策略逐项核验。
- Git 只提交自制工具、文本映射和文档,原始/生成游戏资源留在本地。
- 先看原比例游戏截图,再判断是否扩大处理范围;局部放大截图只辅助检查。
## 排序与完成条件
| 顺序 | 工作 | 可见收益 | 复杂度 | 首批完成条件 |
|---|---|---|---|---|
| 1 | 教程显示文本汉化 | 入门流程基本不再出现英文讲解 | 低—中 | 教程提示/任务说明中文;关键教程事件正常推进 |
| 2 | 8 张贴图 2× 试做 | 判断实际清晰度提升,避免白做整库 | 中,TGA 较低 | 至少 2 张通过实机原比例对比;逐文件可恢复 |
| 3 | 合格类型批量 20–50 张 | 扩大已确认有效的高清范围 | 低—中,依赖第 2 项 | 常见素材观感提升,未出现黑边、接缝或明显卡顿 |
| 4 | 主线按章翻译 | 扩大中文覆盖到正式任务 | 中,依赖第 1 项 | 首章显示文本完成,任务触发和读档正常 |
第 1、2 项是下一轮可执行任务;第 3、4 项是通过前置验收后再展开的队列。
不以“479/496”补到 100% 为目标:格式串、路径和空值保留其原有用途。
## 开始前复核
在工作目录运行:
```powershell
python tools/test_cjk_layout.py -q
python tools/test_cjk_titles.py -q
python tools/check_translations.py
git status --short
```
预期:14 项排版测试及 2 项标题测试通过,格式占位符不匹配为 0。
记录当前游戏文件哈希,不覆盖 `backup_game/font-layout-20260920` 中的既有快照。
## Task 1: 教程文本完整提取、翻译与回灌
**Files:**
- Create: `tools/script_text.py`(扫描允许的显示调用并精确定位字符串跨度)。
- Create: `tools/test_script_text.py`(编码、转义、续行、只修改显示文本的行为测试)。
- Create: `tools/tutorial_cn.json`(原文校验值及中文映射)。
- Modify: `docs/DEVLOG.md`(验收结果及未覆盖项)。
- Local input: `F:\steam\steamapps\common\The I of the Dragon\Data\Scripts\English\Tutorial.dsc`
- Local output: `build/tutorial/Tutorial.dsc``build/tutorial/manifest.json`
**Interfaces:**
- `patch_display_calls(source: bytes, translations: dict[str, str]) -> bytes`
- 映射键为解码后的原文字面量;同文同步替换,未命中的映射报错。
- 仅允许 `DisplayMessage` 的两个字符串实参与 `SetMissionDescription` 的字符串实参。
- CLI`python tools/script_text.py --source <path> --mapping tools/tutorial_cn.json --out build/tutorial/Tutorial.dsc`
- 工具只生成文件,不在构建时写游戏目录。
- [ ] **Step 1:固定输入。** 复制教程到本批次备份并计算 SHA256。当前文件为 21,166 字节;扫描可见 22 处 `DisplayMessage(`(含函数定义)、15 处 `SetMissionDescription(`,最终以解析出的字面量为准。
- [ ] **Step 2:建立失败测试。** 除下例外,补充注释内伪调用、变量实参、转义引号、反斜杠续行、重复原文、映射缺项与不可编码字符的样例。禁止用匹配全部引号字符串的正则替换脚本。
```python
import unittest
from script_text import patch_display_calls
class ScriptTextTests(unittest.TestCase):
def test_only_display_literals_change(self):
source = b'DisplayMessage("Help", "Move");\r\nEnableEvent("Move");\r\n'
actual = patch_display_calls(source, {'Help': '帮助', 'Move': '移动'})
expected = 'DisplayMessage("帮助", "移动");\r\nEnableEvent("Move");\r\n'.encode('gb2312')
self.assertEqual(actual, expected)
```
- [ ] **Step 3:运行测试并确认失败原因。** `python -m unittest discover -s tools -p test_script_text.py -v`
- [ ] **Step 4:实现字节扫描器。** 逐字节维护注释/字符串/转义/括号状态,只标记允许调用的字面量范围;按原范围倒序替换。输出前检查原文命中、GB2312、占位符与控制符;原文件其他字节全部保留。
- [ ] **Step 5:翻译第一组实机可达提示。** 先做 Tutorial、Camera rotation、Center the camera、Zoom、Flight 及其重复任务说明。表达简洁,键位说明准确,不擅自改变操作要求。
- [ ] **Step 6:执行测试与构建。** 使用上述测试命令和 CLI;核对所有改动仅在提取的字面量跨度中,备份哈希与输入一致。
- [ ] **Step 7:完成其余教程显示文本。** 用同一映射、同一规则补齐;控制符 `\a/\f/\n` 与格式参数单独检查。记录保留英文的专名及理由。
- [ ] **Step 8:退出游戏后部署教程副本。** 依次验收镜头旋转、镜头回正、缩放、飞行及后续教程步骤;检查提示显示和下一事件触发,保存实机截图与结果。中途恢复旧教程后验证哈希一致,再装回新版。
- [ ] **Step 9:提交独立变更。** `git add tools/script_text.py tools/test_script_text.py tools/tutorial_cn.json docs/DEVLOG.md``git commit -m "feat: translate tutorial display text without changing events"`
**完成门槛:** 显示文本中文、脚本逻辑字节不变、教程触发链实机通过,已有字体回归仍通过。仅文件成功生成不算教程已验收。
## Task 2: 8 张 2× 贴图试做,先评估再扩大
**Files:**
- Create: `tools/hd_pilot.json`(本轮选择及源文件哈希)。
- Create: `tools/hd_pilot.py`(选图、对比页、构建清单)。
- Create: `tools/test_hd_pilot.py`(尺寸、通道、清单与误选保护)。
- Create: `docs/hd-pilot-review.md`(每张在游戏中的结论)。
- Existing inputs: `report/upscale_plan.csv``report/textures_report.csv``png/``original/`
- Local outputs: `build/hd-pilot/`;原图不覆盖。
**首批候选(已在当前资源清单中核对存在):**
| 素材 | 原尺寸 | 用途 |
|---|---|---|
| `BigRock.tga` | 128×128 | 简单 TGA 回灌验证 |
| `Black_stone.tga` | 128×128 | 石材细节对比 |
| `creatures\amfibrahiy1.dds` | 256×128 | 不透明 DXT1 生物样本 |
| `creatures\Beatle.dds` | 256×256 | 不透明 DXT1 生物样本 |
| `buildings\arka.dds` | 256×128 | 建筑边缘细节 |
| `buildings\bochka01.dds` | 256×256 | 常见道具细节 |
| `buildings\brev-tor.dds` | 128×128 | 木材端面 |
| `buildings\brev.dds` | 128×256 | 木材表面 |
候选名称仅用于定位;先在游戏中确认可见场景。难以找到的素材换成同组、已确认可见的条目,并更新清单。自动分类可能遗漏平铺用途,实际出现接缝的样本移入后续专项。
**Interfaces:**
- `validate_size(original: tuple[int, int], result: tuple[int, int]) -> None`:只接受精确 2×,否则抛出 `ValueError`
- `hd_pilot.json` 每项:`name``source_sha256``scale: 2``alpha_policy: "preserve"`
- 每张比较原图、Lanczos 2× 基线、可用模型 2× 候选;尚无模型时先完成基线/回灌,不宣称 AI 高清化完成。
- [ ] **Step 1:记录源素材并建清单。** 核对原尺寸、通道、FourCC 和 mipmap;排除字体、UI 图集、烘焙文字、透明特效与已知平铺纹理。
- [ ] **Step 2:添加失败测试。**
```python
import unittest
from hd_pilot import validate_size
class PilotTests(unittest.TestCase):
def test_preserves_aspect_ratio_at_exact_two_times(self):
validate_size((256, 128), (512, 256))
with self.assertRaises(ValueError):
validate_size((256, 128), (512, 512))
```
- [ ] **Step 3:运行失败测试。** `python -m unittest discover -s tools -p test_hd_pilot.py -v`
- [ ] **Step 4:实现构建约束。**
```python
def validate_size(original, result):
if result != (original[0] * 2, original[1] * 2):
raise ValueError('pilot texture must be exactly 2x with unchanged aspect ratio')
```
- [ ] **Step 5:先完成两张 TGA 的原比例/放大对比。** Pillow 生成 Lanczos 基线;若已有可用超分模型,再生成模型版,保留三个版本。不要将普通插值称为新增细节。
- [ ] **Step 6:验证 DDS 写回。** 先做原尺寸 decode/encode 对照,核对 DXT1、通道与 mipmap;确认工具链后再做六张 DDS 的 2×。若编码或材质兼容未通过,本轮仅交付已通过的 TGA 结果,并在审查文档标记 DDS 阻塞原因。
- [ ] **Step 7:逐张回灌。** 优先使用已验证的松散文件覆盖方式;有打包加载差异再以现有 `replace_res_entries` 工具重建副本,逐条核对非目标资源哈希。单独保存每个被覆盖文件及是否原本存在。
- [ ] **Step 8:同存档同视角截图比较。** 记录正常距离的观感、边缘光晕、纹理游动、接缝、加载耗时和帧率;帧率在同一场景预热后测三次。若中位帧率下降超过 5%,调查原因并暂不扩大批次。
- [ ] **Step 9:恢复验证与小批次结论。** 恢复原文件并验哈希;只重新部署“正常视距可见改善、无明显副作用”的样本。逐张标记通过/维持原版/需专项处理。
- [ ] **Step 10:提交工具与结果文档。** `git add tools/hd_pilot.py tools/test_hd_pilot.py tools/hd_pilot.json docs/hd-pilot-review.md``git commit -m "feat: add validated two-times texture pilot"`
**完成门槛:** 至少 2 张实机效果优于原图且可完整恢复。即使模型版更锐,也允许选择观感更自然的基线或原版。
## 后续队列的启动条件
- **Task 32050 张高清小批次。** 第 2 项确认至少一种素材类别收益稳定后再编写该批实施清单。优先玩家常见生物、建筑、道具;按清单逐张记录,不把全部 1195 张自动纳入。
- **Task 4:主线首章汉化。** 第 1 项显示文本工具和事件回归验收后,以 `MainMission.dsc` 的实际显示调用清单确定章节边界,再单独编写实施计划。未证实的调用不加入自动替换白名单。
## 每项交付时报告
报告本项改了什么、实机看到的收益、验证结果、已知未完成点和恢复方式。
每项单独提交;没有明确收益的试验及时止步,不因已经生成文件就继续批处理。
@@ -0,0 +1,32 @@
# DragonHD 下一阶段范围与优先级
用户目标:先做效果明显、实现简单的工作;本轮只保存计划,不开始下一阶段改造。
当前基线:字体提示框与选项页对齐已获用户实测确认,修复提交为 `253cc47`
Strings.dat 已翻译 479/496 个 ID;其余含格式串、空值、路径,并非全部需要翻译。
已提取 1884 个纹理条目并生成 1882 张 PNG。现有分类为普通放大 1195、
平铺素材 499、需审查 182、跳过 8;分类是候选筛选,不等于已经通过视觉验收。
## 交付顺序
1. 教程的显示文本汉化:可直接消除进入游戏后的大段英文,复用现有 GB2312 字库。
2. 八张贴图的 2× 对比试做:先验证观感、回灌和性能,再选出适合批量处理的类型。
3. 已通过试做的贴图按 20–50 张小批次部署:优先实际画面中常见、占屏面积大的素材。
4. 主线任务按章节翻译:沿用教程的文本提取/替换工具,每章做任务触发回归。
## 全局约束
- 游戏目录:`F:\steam\steamapps\common\The I of the Dragon`;工作目录:`E:\DragonHD`
- 保留目前 12px CJK 字库和通过验收的排版补丁。
- 脚本仅改显示调用中的文本字面量;逻辑标识、事件名、路径、单位类型保持字节不变。
- 每批单独记录原文件 SHA256、变更文件清单和可验证的恢复方式。
- 新文本须能 GB2312 编码,保留原有格式占位符和引擎控制符。
- 贴图第一轮只做 2×,保留比例;透明通道、压缩类型及 mipmap 策略逐项核验。
- Git 只提交自制工具、文本映射和文档,原始/生成游戏资源留在本地。
- 先看原比例游戏截图,再判断是否扩大处理范围;局部放大截图只辅助检查。
## 暂后
平铺地形/水面/天空、透明树叶和粒子、带固定像素坐标的 UI 图集、烘焙文字图片、
全字库重做、模型/动画改造、一次性全资源 4× 放大,都留到已有小批次收益得到确认后。
这些工作仍有价值,但依赖和调试成本更高。