作者lulaptt (Lula)
看板Emulator
标题[心得] SFC中文化经验谈(三)—指标篇—
时间Fri Nov 16 21:50:04 2012
【杂言】
我会做中文化主要还是松野的错.....。
FF12让我跑一次很high的低等级攻略後,我就很难从一般的玩法获得满足了。
後来因为一直提不起玩游戏的兴致,就开始看起我最喜欢的皇骑2的Rom data。
那时什麽都不懂,所以遇到一堆问题都要半猜半想、硬着头皮解决。
然後.....就解析->翻译->刻字->解析->loop n次....花差不多一年休闲时间做完了。
虽然那一年没玩多少游戏,但满足感倒是前所未有的。
(日文拖U君等人的福,进步了一些XD)
【正文】
所谓的
指标就是Rom里指向图片/字库/文本起始位址的数据,
每个指标通常占用2~3个bytes,游戏会透过指标来快速载入这些资料。
由於中文化所需的字数通常比原日文游戏使用字数多,
所以字库大小与文本长度经常会比原本的长。
如果硬填回原位置的话,势必会覆盖掉後面的资料,
因此需要修改指标,将指向原字库的指标指向一个放新字库/文本的空间位址,
也就是所谓的"扩容"
(注一)。
指向单一种未压缩图或字库的指标通常只有单独一个。
有时候,我们可以用"猜"的猜出这类指标位置,
特别是当你知道字库的开始位置时。
例如我们可以YY-CHR看出
0x4bdd9 (04 BD D9)的位址开始有指令名称的图,
用Lunar Address可以算出对应的SFC位址是
0x9bdd9 (09 BD D9),
又因为SFC位址是高位byte在後面,
所以可以猜测SFC位址在Rom里的数据也许会是
D9 BD 09 (注二)。
於是我们用UltraEdit搜寻绝对位址
D9 BD 09会发现.....没这数据XD。
没关系这常有的事,我们可以再用相对位址
D9 BD去找.....发现有34笔。
我们试着把每一笔轮流改成
D9 BE,也就是把指标指向的位址延後
0x100,
希望将原本指向第一笔指令名称图的位址改成指向第二笔。
如果我们改到的是指标,原本画面该显示第一个图就会改为显示第二个图。
最後我们在改
0x4a390的数据时,发现改到指标了:
http://ppt.cc/OJIZ (又拿到奇怪的短网址...之前是o~mg)
事实上,运气好的话我们可以在附近找到bank值
(注二),也就是上述例子中的
09。
我们将
0x4a39c的09改成0A会发现指令名称图乱掉了,
这是因为它跑去
0xabed9 (0A BE D9)的SFC位址。
如果我们再把
0x4a390的数据改成
20 92,就会存取到
0xa9220 (0A 92 20)的SFC位址,
用Lunar Address可以算出该SFC位址对应的实际Rom里位址是
0x51220,
也就是下图里的あいうえおかきく图像(因为调色盘不同,所以显示出的文字颜色很暗)。
http://ppt.cc/~04w
以上就是不用反组译,用猜就猜出指标的方法概念。
好,有多少人看到这里放弃SFC中文化了(笑
剧情文本指标通常罗唆些(压缩图或字库、名词文本的指标有时也会这样)。
以皇骑1为例,用了三层指标来存取剧情文本(对!三层!)
。
先用一个总指标(第一层)指向连续存放的第一个章节指标(第二层),
再用各章节指标(第二层)指向某章节连续存放的的第一个对话指标(第三层),
最後用各对话指标(第三层,就是上一篇紫色的代码)指向该对话的实际剧情代码
。
如此游戏在进行时,只要知道进行到哪一章第几段对话,就能透过多重指标快速存取。
(不过老实说,皇骑1把对话指标也压缩进去没有意义,甚至还拖累了一点存取时间。)
虽然我觉得大部份指标,只要知道资料起始位址就能反推出来,
但
因为压缩的关系,不少时候是根本不知道图片、字库、文本的开头位置。
这时,就只好靠反组译来知道指标位置跟压缩方法了。
有趣的是,其实真正有必要知道压缩方法的只有剧情文本,
图片跟字库的压缩方法对反组译来说.....根‧本‧不‧重‧要。
找块空间放要取代的未压缩新图片跟字库,用指标改连过去就好了。
下回开始就要进入胃痛的反组译篇(不知道3篇能不能讲完=___=|||),
对中文化有兴趣的人.....请准备胃药!
============================================================================
(注一) 事实上,扩容包含两种层面,一种是上述的
Rom里原空间不足,
另一种是
可使用的文本代码范围不足。例如皇骑1的剧情文字只允许
20 ~ FF, 19 00 ~ 1B FF ,接近1000个不重复代码可供使用,
也就是只能定义最多不到1000个字,这种问题就只能靠反组译解决,
透过修改原程式来增加更多可用代码。
(注二) SFC的Rom\Ram里任何位置都能用
3个byte的绝对位址去存取。
但SFC是16 bits主机(简略的说法),所以会把Rom里空间拆成几十个bank,
每个bank都有0000~FFFF的相对位址空间(
2个bytes=16个 bits存取范围)。
SFC位址09 BD D9也就代表第09个bank中相对位址为BD D9的地方。
游戏程式执行时,bank其实不太常换,大多在处理同一bank里的资料。
所以有时只会用两个bytes来当指标,因为bank可能之前就指定了。
============================================================================
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 111.249.43.151
1F:推 conpo:专业好文推,长知识! 11/16 21:51
2F:推 protect6090:真神人也!!!!!!!!!!! 11/16 22:04
3F:推 UlyssesLin:なるほど、わからん。大丈夫だ、问题ない。 11/16 22:25
4F:推 arcadyii:琼安软体那几款经典作品 从没看过汉化 是根本上做不到吗 11/16 22:57
5F:推 ADHI:好文章,特来拜读!! 11/16 23:02
6F:→ lulaptt:我觉得理论上都可以中文化 只是要"改多大"的程度 11/16 23:02
7F:→ lulaptt:只是SFC技术较麻烦 中文化圈有在弄反组译的大概就那几个人 11/16 23:07
8F:→ lulaptt:不知道这边提的经典作品是....? 11/16 23:08
9F:推 kurenai911:琼安软体的游戏几乎每片都是经典之作,在超任上的有 11/16 23:23
10F:→ kurenai911:弟切草、恐怖惊魂夜、特鲁内克和风尘英雄 11/16 23:23
11F:→ lulaptt:风尘英雄有中文化唷...破解我还认识...=__=||| 11/16 23:35
12F:推 oginome:推lulaptt专业!我超喜欢弟切草的说~破了不下30次呢~ 11/16 23:56
13F:推 busin:专业好文推一个~ 11/17 12:52
※ 编辑: lulaptt 来自: 111.249.79.124 (11/17 18:09)
14F:→ lulaptt:修改一项错误 之前BD D9跟BE D9写反了.... 11/17 18:11
15F:推 katzdx:推专业文~ 11/17 18:53
16F:推 prudence:不得不感谢松野的错 XDD 11/18 13:46
17F:推 qazxswptt:感谢好文 11/18 14:56
18F:推 willkill:推推推 11/18 16:30
19F:推 kaoen:中文化是个「厚工」的工作~有爱有推~ 11/19 01:45
20F:→ djboy:神文推! 11/19 10:14
21F:推 kuchibue:有看有推! 11/21 20:26
22F:推 EDGE: 路人推专业好文! 11/23 01:25