docs: prioritize tutorial translation and a small HD texture pilot
This commit is contained in:
@@ -3,6 +3,15 @@
|
||||
Working log for the *The I of the Dragon* localization / HD project.
|
||||
Newest entries on top.
|
||||
|
||||
## 2026-09-20 — Accepted fixes and next-step plan
|
||||
|
||||
- User confirmed the tutorial prompt and option-title follow-up in game.
|
||||
- Pushed fix commit `253cc47` to `codex/fix-cjk-tooltip-layout` on Gitea.
|
||||
- Added a prioritized implementation plan: tutorial display-text translation,
|
||||
an eight-texture 2x pilot, then validated 20–50 texture batches and chapter-by-
|
||||
chapter mission translation. The next-stage work is planned, not implemented.
|
||||
- Plan: `docs/superpowers/plans/2026-09-20-high-impact-simple-first.md`.
|
||||
|
||||
## 2026-09-20 — Center option titles and shorten tutorial exit prompt
|
||||
|
||||
- User confirmed the HUD tooltip fix in game.
|
||||
|
||||
@@ -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/Unicorn;DDS 写回先确认编码工具及 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 3:20–50 张高清小批次。** 第 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× 放大,都留到已有小批次收益得到确认后。
|
||||
这些工作仍有价值,但依赖和调试成本更高。
|
||||
Reference in New Issue
Block a user