|
本帖最后由 jiangzhengwenjz 于 2015-6-12 22:34 编辑
。。最近快考试忙的一比,发个帖凑个数,当然昨晚断网前时间仓促,技术含量实在不高,还请各位指教。【不是教程,不得转载】
所有的修改都在火红2012汉化上进行
首先必须得知何处的程序用来读取道具价格,这个断点的截取也是非常简单的,不过为了凑字数还是废话一下:
1、首先找到道具表格的位置(查资料,或修改后数据比对,或搜索道具名称对应的数据)
2、然后发现这个表格里每个道具都是44字节,然后相对每个道具数据开头偏移0x10的位置就是道具的价钱
3、以精灵球为例,0xc8也就是200块,在0x3db0e8,那么在这里下读取断。[083db0e8]?
到尼比市的商店触发脚本,因为有精灵球卖所以break了。通过多次断点截取与寄存器修改不难知道此处修改是可靠的。那么考虑选择位置跳出。- ROM:0809A914 ADDS R0, R0, R4
- ROM:0809A916 LDRH R0, [R0,#item.market_price]
- ROM:0809A918 POP {R4}
- ROM:0809A91A POP {R1}
- ROM:0809A91C BX R1
复制代码 代码的位置也就是在0x9A914,不难发现,执行完马上就跳走到lr的位置了。所以跑到新代码以后直接跳走就完事,不必跳回了。那么跳转就设在0x9A914.其中XX XX XX XX就是新程序指针(thumb模式+1)
也就是:那么,新程序也就呼之欲出了:(随便弄的一个算法,不要在意)- .thumb
- add r0, r0, r4
- ldrh r0, [r0, #0x10]
- push {r2-r3}
- ldr r1, playerdata
- ldr r1, [r1]
- ldrh r1, [r1, #0xe]
- lsr r1, r1, #0x2
- add r1, r1, #0xa
- mul r0, r1
- mov r1, #0xa
- ldr r2, divmod
- bl linker
- ldr r1, nnnn
- cmp r0, r1
- bhs shit
- b back
- shit:
- add r0, r1, #0x0
- back:
- pop {r2-r3}
- pop {r4}
- pop {r1}
- bx r1
- linker:
- bx r2
- .align 2
- playerdata: .word 0x0300500c
- divmod: .word 0x081E4019
- nnnn: .word 0x0000270f
复制代码 其中0x270f是9999,注意到divmod会保护r4,且r4会被pop {r4}刷新,故无必要保护r4.(其他寄存器没用到,虽然未测试但应该错不了)
当然由于这个程序的最后会mov r15, r14,所以会顺畅地跳回。
==========================================================
以下才是研究的重点!
如何扩充商品价格显示上限到65535:
0x9b440及0x9b430的均改成05,并于0x9b428写入00000000
如何扩充金钱上限到999999999 (by JPAN):
0x9fdd4把3f420f00改成ffc99a3b
0x8a000或0x8a006中有一处是06,将06改去09(貌似英文版和新汉化不同)
0x9fe52和0x9fe62的06均改去09
==========================================================
然后目前在看如何保证扩到99999不出问题
问题1:在超出65535(ffff)之后购买时价格会错误
解决:首先要解限,于0x9b428写入00000000
另要在0x9bc4a写入00000000,0x9bdb6写入00000000
问题2:购买时显示位数问题(需从6位扩充到7位)
解决:0x9FEE8和0x9FEF8的06改成07
==========================================================
结论:
0x9b440及0x9b430的04改去05
0x9b428写入00 00 00 00
0x9fdd4把3f420f00改成ffc99a3b
0x8a000或0x8a006中有一处是06,将06改去09
0x9fe52和0x9fe62的06均改去09
0x9bc4a及0x9bdb6写入00 00 00 00
0x9FEE8及0x9FEF8的06改去07
0x10a6ca的06改去07
0x10a7ea改去00 00 40 08
0x10a8a2改去00 00 40 08
0x10a6bc改去00 00 40 08
0x10a982改去00 00 40 08
0x10aa14改去00 00 40 08
0x10a990的06改去07
最后把之前代码里的9999改去99999对应的16进制值即可。
会造成游戏其他部分的bug吗?不知道 |
|