换装迷宫文本指针

  • 原标题:神奇误差技术帝请进


    事情是这样的,最近我打算着手换装迷宫的破解,但是这个游戏感觉是C或者是别的计算机语言生成的游戏,频繁对栈进行操作,很烧脑。

    问题是这个文本的指针是不连续的那种,类似于处理流形式的,而且文本跟指针并不放在一个BANK里面,所以呢。

    有什么好的方法可以处理这个问题?因为涉及到文本改双字节需要扩容,指针需要改动。

  • 已追踪到的rom相关地址是多少?

    或许可以分享下,一起来分析看看

    已追踪到开头文本指针在ROM BANK 29:6C83

    这个处理流有个规律是开头以 80XX开头。

    Code
    1. 示例:
    2. 80 02 0A 1B D9 D8 1D 80 C0 04

    这个 80 02就是指针处理流的开头,有些是80 00开头的。

    而这个 0A 1B 即是文本的指针,在程序上,这个指针会跟一个数值相加得出最终的指针数值。

    由于分散得比较乱,所以我目前方法就是断点到读取指针的程序,每发生一次读取指针的时候,就去更改我所需的指针数值。

    至于这个存放文本BANK号是另外存放的,程序会预先读取BANK号存放在WRAM,从而最终去读取 计算后的指针 和 BANK号。
    目前BANK号的更改是不成问题的,总共需要更改的地方不多。
    主要是指针问题,这个处理流的长度并没有固定性的,都是有长有短,所以不能按照地址递进方式来获取数值。

    目前唯一能依靠的就是这个 80 XX 开头的数值,还有就是,我并不会计算机语言,所以并不能通过编写程序来获得这个数值呢。

  • 目前知道的是 80 XX 后面的指针数值是小于 一个BANK的数值,因为在程序上,他会跟一个4001来相加。

    所以80 XX 后面接着的数值 若是小于4000的话就有可能是某个文本的指针。但是具体是哪个BANK的文本并不清楚,

    因为这个游戏 处理流上的指针并不是存放在当前文本同一个BANK的。

  • 再上传一个放大版,方便查看

    这些都不成问题了,文本我都已经导出来了,字模程序都改好了,写成12*12拼接字模送MAP。

    现在我需要解决的问题是,当文本导回去之后的指针修改工作。

    因为单字节文本改双字节文本,原来存放文本的位置肯定是不够的,所以翻译好的文本都是导入的新扩容的BANK。

  • 具体效果就是这样子的。一段文本就是改一个指针。挺头疼的。

    这些都不成问题了,文本我都已经导出来了,字模程序都改好了,写成12*12拼接字模送MAP。

    现在我需要解决的问题是,当文本导回去之后的指针修改工作。

    因为单字节文本改双字节文本,原来存放文本的位置肯定是不够的,所以翻译好的文本都是导入的新扩容的BANK。

    705-bgb00007-bmp706-bgb00008-bmp707-bgb00009-bmp708-bgb00010-bmp

  • 具体效果就是这样子的。一段文本就是改一个指针。挺头疼的。

    705-bgb00007-bmp706-bgb00008-bmp707-bgb00009-bmp708-bgb00010-bmp

    不深入分析前还回答不了你,未完待续。



    不过大致思路是,搞清楚文本指针怎么调用,然后把新的文本写到原文本区,以及其它空白区(比如扩容后的rom),然后更新每段文本的指针。


    如果有的文本指针跨bank了,则要在写新文本时注意bank溢出。


    如有关键bank信息,文本资源偏移地址,不妨分享一二。

  • 不深入分析前还回答不了你,未完待续。


    如有关键bank信息,文本资源偏移地址,不妨分享一二。

    翻译后的文本就不做偏移的了,都是直接往新BANK来放,然后先更改游戏读取这块文本的BANK地址。

    然后在逐一去更改游戏内的指针。

    710-2017-07-20-202628-png这个是文本的开头位置,也就是下面这个指针指向的位置。

    --------------------

    709-2017-07-20-201935-png然后这个就是开头文本的一个指针位置,光标这里。

  • 文本是没什么问题的,没压缩没加密,裸奔形式,有正常的换行 换页 结束控制符。

  • 翻译后的文本就不做偏移的了,都是直接往新BANK来放,然后先更改游戏读取这块文本的BANK地址。

    然后在逐一去更改游戏内的指针。

    710-2017-07-20-202628-png这个是文本的开头位置,也就是下面这个指针指向的位置。

    --------------------

    709-2017-07-20-201935-png然后这个就是开头文本的一个指针位置,光标这里。

    指针并不是直接显示出文本开头的位置的,程序在读取指针之后会适当相加一个数值4001计算得出指针的位置。

    譬如说这个1B 0A就是指向 5B0B的文本。

  • 以下是正常游戏时,普通文本更新的跟踪结果:


    每更新一个场景/进入一个新房间/地图,WRAM0:CCCF,CCD0, CCD1指定当前文本指针的bank号和基地址。

    换言之,在同一个场景内,游戏的主要文本指针(游戏时,屏幕下方的文本)都储存在一个bank内,其bank编号和基地址由CCCF,CCF0, CCD1指定。


    具体来说,bank号和基地址内容由ROM7:40EA这段程序载入到寄存器C和寄存器DE中,之后再将寄存器C和寄存器DE中的内容复制到内存0xCCCF,0xCCF0,0xCCD1中去。在同一个场景内,所有文本指针皆以此为bank号和基地址。


    如下图所示,这是游戏刚开局,主角进入左边的房间,更新游戏地图时的调试截图。



    01 40 27 指明当前场景所有的文本指针计算的基地址4001,和所处bank27


    因此对话文本的处理方法应该是。将同一场景下的文本指针放在同一个bank。


    换言之,如果要将汉化后的文本指针放进新的bank,要做两件事:

    1. 修改原文本指针的基地址(bank地址和偏移地址,如将ROM27:4001 改为 ROM87:4001)。

    2. 同一个场景的文本指针一定要一致


    现在的问题是在哪里改文本指针基地址

    大胆推测1D8D9 ~ 1E2C9皆为各地图索引。地图索引包含文本指针的基地址和bank号码。这里就是要修改的地方。


    游戏序曲阶段和菜单的文本似乎并不是上述业务逻辑,待分析


    未完待续。

  • 不太对、目前我需要做的、并不是修改指针的基地址相加的指针数值,因为修改指针的基地址只能单纯的实现整块文本放到新BANK、但是这并不能做到修改每一句话的开头指针作用。由于原来是单字节的码表、目前我已经改的双字节码表、怎么说译文占用的长度不可能比原文短、所以不能用空白填充方法来完成每段文本指针的开头。

    所以必需要修改的是BANK号,也就是追踪CCD1。4001这个基地址不动。

    从而修改每段话单独的指针。也就是我所说的带有8002开头特征的、后面两个字节的指针。

    但是我现在的问题就是找不到一个 可以批量处理这些指针的方法。

    而并不是我不知道怎么去改。

Join us

Have your own thoughts on this discussion? Wanna help others, avoid the mistakes you met before? Wanna contribute more to this or other topic? Just join us! Registration is free. Join us!