0x00 前言
此前,在《「RO 笔记」汉化个人信息面板的职业名》中介绍了如何汉化职业名称:
但是此方法是通过修改 data/msgstringtable.txt
实现的,汉化的职业范围只有:
- 一转
- 二转
- 进阶二转
- 扩展一转
- 扩展二转
但是除此之外的职业就汉化不了了:
- 三转
- 进阶三转
- 四转
- 扩展突破
- 扩展上位
- 宝宝系列
在本篇会教大家如何汉化剩下的这些职业名称。
0x10 分析
之前不少同学看过我之前的汉化教程后,都有在问我三转、四转要如何汉化。
其实如果你翻遍了所有地方都没找到配置位置时,可以猜测它被硬编码在 Ragexe.exe 中了。
但不是所有配置项都可以通过 Nemo/Warp 找到的,此时我们就要学会自己分析。
以四转职业【天籁颂者】为例,他在个人面板的英文名是 Troubadour
。
通过 c32asm 以十六进制编辑 Ragexe.exe,然后搜索 Troubadour
(大小写完全匹配),只会找到一个地方。
我们尝试把 Troubadour
修改为 Txxxxyyyyz
,重新进入游戏:
个人面板的英文名变成了 Txxxxyyyyz
,由此即可验证四转的职业名称是被硬编码了。
0x20 职业名分布
以 20220406 版本的 Ragexe.exe 为例,根据我分析,职业名主要分布在三个位置。
对应可以搜索这三个字符串:
_滚努矾
: %d俺
7 vs 7
至于怎么找到这三个字符串,其实是通过在游戏逐个职业切换,查看它在 Ragexe 修改后有没有发生变化而倒推出来的
0x21 关键字 _滚努矾
这个关键字后面跟着 83 个英文职业名,主要包括:
- 四转
- 扩展突破
- 扩展上位
- 宝宝系列
0x22 关键字 : %d俺
这个关键字后面跟着 3 个英文职业名,都是 四转。
0x23 关键字 7 vs 7
这个关键字后面跟着 15 个英文职业名,主要包括:
- 三转
- 进阶三转
0x30 职业名修改方法
这里以 Troubadour..Trouvere
为例说明是如何汉化的:
不难发现这些职业名都是用不等长的 ...
分割的,其实每一个 .
都是十六进制中的 00
空字节。
需要注意的是,
.
只是为了方便表示空字节,它实际上不是一个点,正常编辑文本是无法输入空字节的,十六进制的空字节00
必须借助脚本写入
那这些空字节有什么用呢 ?
首先我们得知道,编辑 exe 文件有一个必须遵守的规则: 编辑前后的 exe 大小不能发生改变。
以 Troubadour
为例,我们修改为另一个字符串时,会出现 3 种情况:
- 新字符串 长度与
Troubadour
一致,例如前面我们修改成Txxxxyyyyz
,此时不需要特殊处理。 - 新字符串 长度比
Troubadour
短,例如修改成Txyz
,因为长度不够完全覆盖原字符串,就会变成Txyzbadour
,后面的badour
需要特殊处理。 - 新字符串 长度比
Troubadour
长,例如修改成Troubadour1234
,因为长度越界了,就会挤占并覆写后一个字符串Trouvere
的存储空间,变成了一个字符串Troubadour1234ouvere
,此时运行 Ragexe.exe 就会出现意想不到的错误。
尤其是我们在汉化时,这个长度就更难把握了,因为 GBK 编码中:
- 英文的
1 个字母/数字/字符 = 1 字节
- 简体中文的
1 个汉字/字符 = 2 字节
汉化时,绝大多数情况下,新串的长度都和原串不一样。
那么要怎么处理才能确保 exe 大小不变呢 ?
0x31 新串比原串短
先处理最简单的情况,还是这个例子:
- 原串
Troubadour
长度为 10 字节 - 汉化的新串
天籁颂者
长度为 8 字节(4 个汉字)
汉化后末尾就会多出 2 个字节 ur
。
我们只需要在新串末尾补 2 个空字节 ..
,汉化成 天籁颂者..
就可以覆盖掉 ur
了。
0x32 新串比原串长
前面已经说过,这些职业名都是用不等长的空字节 ...
分割的,例如 Troubadour..Trouvere
就有两个空字节。
为了不出异常,每个字符串之间最少需要保留末尾的 1 个空字节用于分割,前面多出来的 .
空字节就可以利用起来了,譬如:
- 原串
Troubadour
长度为 10 字节 - 紧接着
Troubadour
后有 2 个空字节,留下末尾的 1 个空字节做分割 - 实际新串可以利用的最大长度一共有
10 + (2 - 1) = 11
字节,即Troubadour.
- 譬如汉化成
4th天籁颂者
(11 字节),覆盖后就会变成4th天籁颂者.Trouvere
但不是所有字符串都会留有足够的空字符的,例如 Meister.Shadow Cross
:
- 原串
Meister
长度为 7 字节 - 后面紧跟只有 1 个空字节,没法被使用
- 汉化新串为
机械神匠
长度为 8 字节(4 个汉字)
如果强行汉化,就会和后一个字符串 “串台” 拼接成 机械神匠Shadow Cross
,游戏中就会显示错误:
这种情况只能减少汉化的中文长度:
- 汉化新串为
机神匠
长度为 6 字节(3 个汉字) - 为了覆盖原串,还需要补
7 - 6 = 1
个空字节 - 最终汉化成
机神匠.
0x40 批量汉化脚本
前面已经说过,单是 20220406 版本的 Ragexe.exe 中,分布的职业名就有:
_滚努矾
: 83 个: %d俺
: 3 个7 vs 7
: 15 个
多达 101 个职业名,如果每次 DIFF 后都要手动配置一次,工程量会极大。
尤其是长度计算、空字符的编辑等,人工方式几乎不可能完成。
于是我就写了一个 python3 脚本批量替换:
脚本默认提供了 20220406 版本的 Ragexe.exe 的配置字典。
由于 Ragexe 每个版本的偏移可能都不同,如果你有其他版本的配置需求,可以根据上文的方法,编辑 20220406 的配置字典。
文末提供了脚本下载地址
0x50 效果演示
0x51 零转
职业 | 普通 | 进阶 |
---|---|---|
初心者 | ![]() |
![]() |
杜兰族 | ![]() |
- |
0x52 一转
职业 | 普通 | 进阶 |
---|---|---|
剑士 | ![]() |
![]() |
魔法师 | ![]() |
![]() |
弓箭手 | ![]() |
![]() |
服侍 | ![]() |
![]() |
商人 | ![]() |
![]() |
盗贼 | ![]() |
![]() |
0x53 二转
职业 | 普通 | 进阶 |
---|---|---|
骑士 | ![]() |
![]() |
十字军 | ![]() |
![]() |
巫师 | ![]() |
![]() |
贤者 | ![]() |
![]() |
猎人 | ![]() |
![]() |
诗人 | ![]() |
![]() |
舞娘 | ![]() |
![]() |
祭司 | ![]() |
![]() |
武道家 | ![]() |
![]() |
铁匠 | ![]() |
![]() |
炼金术士 | ![]() |
![]() |
刺客 | ![]() |
![]() |
流氓 | ![]() |
![]() |
0x54 三转
职业 | 效果图 |
---|---|
卢恩骑士 | ![]() |
皇家禁卫队 | ![]() |
咒术士 | ![]() |
妖术师 | ![]() |
游侠 | ![]() |
宫廷乐师 | ![]() |
浪姬舞者 | ![]() |
大主教 | ![]() |
修罗 | ![]() |
机械工匠 | ![]() |
基因学者 | ![]() |
十字斩首者 | ![]() |
魅影追踪者 | ![]() |
0x55 四转
职业 | 效果图 |
---|---|
卢恩龙爵 | ![]() |
帝国圣卫军 | ![]() |
禁咒魔导士 | ![]() |
元素支配者 | ![]() |
风鹰狩猎者 | ![]() |
天籁颂者 | ![]() |
乐之舞灵 | ![]() |
枢机主教 | ![]() |
圣裁者 | ![]() |
机械神匠 | ![]() |
生命缔造者 | ![]() |
十字影武 | ![]() |
深渊追迹者 | ![]() |
0x56 扩展一转
职业 | 效果图 |
---|---|
超级初心者 | ![]() |
神枪手 | ![]() |
忍者 | ![]() |
跆拳少年 | ![]() |
跆拳少女 | ![]() |
0x57 扩展二转
职业 | 效果图 |
---|---|
拳圣/星际角斗士 | ![]() |
悟灵士 | ![]() |
0x58 扩展突破
职业 | 效果图 |
---|---|
突破初心者 | ![]() |
反叛者 | ![]() |
日影/影狼 | ![]() |
月影/胧 | ![]() |
拳皇/星帝 | ![]() |
猎灵士 | ![]() |
0x59 扩展上位
职业 | 效果图 |
---|---|
顶级初心者 | ![]() |
夜巡者 | ![]() |
蜃气楼 | ![]() |
不知火 | ![]() |
天帝 | ![]() |
灵导士 | ![]() |
魂灵师 | ![]() |
0x5A 宝宝零转
职业 | 效果图 |
---|---|
初心者 | ![]() |
杜兰族 | ![]() |
0x5B 宝宝一转
职业 | 效果图 |
---|---|
剑士 | ![]() |
魔法师 | ![]() |
弓箭手 | ![]() |
服侍 | ![]() |
商人 | ![]() |
盗贼 | ![]() |
0x5B 宝宝二转
职业 | 效果图 |
---|---|
骑士 | ![]() |
十字军 | ![]() |
巫师 | ![]() |
贤者 | ![]() |
猎人 | ![]() |
诗人 | ![]() |
舞娘 | ![]() |
祭司 | ![]() |
武道家 | ![]() |
铁匠 | ![]() |
炼金术士 | ![]() |
刺客 | ![]() |
流氓 | ![]() |
0x5C 宝宝三转
职业 | 效果图 |
---|---|
卢恩骑士 | ![]() |
皇家禁卫队 | ![]() |
咒术士 | ![]() |
妖术师 | ![]() |
游侠 | ![]() |
宫廷乐师 | ![]() |
浪姬舞者 | ![]() |
大主教 | ![]() |
修罗 | ![]() |
机械工匠 | ![]() |
基因学者 | ![]() |
十字斩首者 | ![]() |
魅影追迹者 | ![]() |
0x5D 宝宝扩展一转
职业 | 效果图 |
---|---|
超级初心者 | ![]() |
神枪手 | ![]() |
忍者 | ![]() |
跆拳道 | ![]() |
0x5E 宝宝扩展二转
职业 | 效果图 |
---|---|
拳圣/星际角斗士 | ![]() |
悟灵士 | ![]() |
0x5F 宝宝扩展突破
职业 | 效果图 |
---|---|
突破初心者 | ![]() |
反叛者 | ![]() |
日影/影狼 | ![]() |
月影/胧 | ![]() |
拳皇/星帝 | ![]() |
猎灵士 | ![]() |
0xF0 脚本下载
- 腾讯微云: https://share.weiyun.com/8WQl8ouw
- 解压密码: 请在微信扫码到公众号获取