怪物农场2修改日志3 - 年轮
2016-05-08 17:54
176 查看
接上篇,怪物农场2修改日志2 - 奇妙能力歌
bgm是神秘妹纸唱的超好听的年轮
上篇中,我们顺利找到了"已收集怪物Id"这个列表.
接下来该做什么呢?
根据上篇的推理,当玩家生成新的怪物时,游戏程序会更新这个列表,加上新的怪物的id.
我们可以设置内存断点,在生成新怪物的时机中断,然后反推出生成怪物的数据(主要是id)来自何处.
我们读取没有生成169号クリック小朋友时的游戏记录,查看9703C,也就是"已收集怪物Id"列表.
可以看到,0x97151(278号的モッチー,0x9703C+278-1)为1,已经收集.
而0x970E4(169号的クリック小朋友,0x9703C+169-1)处为0,还未收集.
我们在0x970E4处下一个内存断点,然后从神殿生成クリック小朋友,看会不会触发断点.
在成功生成怪物后,给怪物取完名字,发现断点被触发了.因此是在生成怪物后,并且玩家确定要领养该怪物,并且给怪物取完名字,才会将该id添加到"已收集怪物Id"列表.
之前错误的认为,在生成怪物的时候,游戏程序便会去更新这个列表,现在看来是在生成怪物之后,游戏程序才会去更新该列表.
我们的确可以从这个时间点,反推出怪物id是从哪里得到的,但是路途似乎比较长了,难度似乎也很大.
再重新思考下游戏的处理过程.
1,从CDROM中读取数据.
2,根据数据计算出要生成的怪物的ID,以及其他初始数据.
3,如果怪物的生成条件不满足,则提示玩家该怪物还无法生成.
4,播放生成怪物的动画.
5,确认玩家是否要收养怪物,如果确定,将怪物ID添加到"已收集怪物Id"列表.
从步骤3可以知道,在生成怪物前,需要先查询指定id的怪物是否满足生成条件(实际是查询该种族的怪物是否能生成,而不是id,但是或许有办法通过怪物id找到怪物种族).
根据自己之前的资料,猜测怪物是否允许生成的条件也是存成一个数组(类似"已收集怪物Id"列表),且是按种族来存储的数组.
我们可以根据这些信息进行搜索.
1号种族 ピクシー 初期可再生,所以应该是01
2号种族ドラゴン 初期不可再生,所以应该是00
3ケンタウロス 初期不可再生,所以应该是00
4号 初期可再生 01
5 6 7 8号种族 初期都不能再生,因此是 00 00 00 00
一共有38个种族,根据初期是否可再生,在Snapshot文件中搜索如下字节系列.
01 00 00 01 00 00 00 00 00 01
Bingo! 在内存中确实能找到该字节序列.
得到内存中的地址应为 0x975e6-0x2B0 = 0x97336
我们用初期无法生成的三色鸟来验证该"种族允许生成"列表是否正确.
默认三色鸟初期是不能再生的,必须完成收集果冻贴纸相关事件后才能再生.
33ダックン 种族id是33.
那么地址是0x97336 + 33-1 = 0x97356
将0x97356处的内存修改为1,进入神殿,成功生成了三色鸟.
顺便找了下怪物农场2的金手指,发现9703C和97336这两个地址,其他人已经有找到了,不过没有关系,现在离目标更近一步了.
以下是我修改过的金手指,增加了#Unlock All Species部分.虽然比较丑,但是修改后可以生成所有种族的怪物了.
To be continued...
bgm是神秘妹纸唱的超好听的年轮
上篇中,我们顺利找到了"已收集怪物Id"这个列表.
接下来该做什么呢?
根据上篇的推理,当玩家生成新的怪物时,游戏程序会更新这个列表,加上新的怪物的id.
我们可以设置内存断点,在生成新怪物的时机中断,然后反推出生成怪物的数据(主要是id)来自何处.
我们读取没有生成169号クリック小朋友时的游戏记录,查看9703C,也就是"已收集怪物Id"列表.
可以看到,0x97151(278号的モッチー,0x9703C+278-1)为1,已经收集.
而0x970E4(169号的クリック小朋友,0x9703C+169-1)处为0,还未收集.
我们在0x970E4处下一个内存断点,然后从神殿生成クリック小朋友,看会不会触发断点.
在成功生成怪物后,给怪物取完名字,发现断点被触发了.因此是在生成怪物后,并且玩家确定要领养该怪物,并且给怪物取完名字,才会将该id添加到"已收集怪物Id"列表.
之前错误的认为,在生成怪物的时候,游戏程序便会去更新这个列表,现在看来是在生成怪物之后,游戏程序才会去更新该列表.
我们的确可以从这个时间点,反推出怪物id是从哪里得到的,但是路途似乎比较长了,难度似乎也很大.
再重新思考下游戏的处理过程.
1,从CDROM中读取数据.
2,根据数据计算出要生成的怪物的ID,以及其他初始数据.
3,如果怪物的生成条件不满足,则提示玩家该怪物还无法生成.
4,播放生成怪物的动画.
5,确认玩家是否要收养怪物,如果确定,将怪物ID添加到"已收集怪物Id"列表.
从步骤3可以知道,在生成怪物前,需要先查询指定id的怪物是否满足生成条件(实际是查询该种族的怪物是否能生成,而不是id,但是或许有办法通过怪物id找到怪物种族).
根据自己之前的资料,猜测怪物是否允许生成的条件也是存成一个数组(类似"已收集怪物Id"列表),且是按种族来存储的数组.
我们可以根据这些信息进行搜索.
1号种族 ピクシー 初期可再生,所以应该是01
2号种族ドラゴン 初期不可再生,所以应该是00
3ケンタウロス 初期不可再生,所以应该是00
4号 初期可再生 01
5 6 7 8号种族 初期都不能再生,因此是 00 00 00 00
一共有38个种族,根据初期是否可再生,在Snapshot文件中搜索如下字节系列.
01 00 00 01 00 00 00 00 00 01
Bingo! 在内存中确实能找到该字节序列.
得到内存中的地址应为 0x975e6-0x2B0 = 0x97336
我们用初期无法生成的三色鸟来验证该"种族允许生成"列表是否正确.
默认三色鸟初期是不能再生的,必须完成收集果冻贴纸相关事件后才能再生.
33ダックン 种族id是33.
那么地址是0x97336 + 33-1 = 0x97356
将0x97356处的内存修改为1,进入神殿,成功生成了三色鸟.
顺便找了下怪物农场2的金手指,发现9703C和97336这两个地址,其他人已经有找到了,不过没有关系,现在离目标更近一步了.
以下是我修改过的金手指,增加了#Unlock All Species部分.虽然比较丑,但是修改后可以生成所有种族的怪物了.
#Money Max 80096F6C E0FF 80096F6E 05F5 #Combat playerr Infinite Energy 801FFCDC 03E7 #Combat player Guts Infinite 801FFCFC 00FF #Combat enemy energy 0 801FFC5C 0000 #Combat enemy energy 0 R2 + SELECT D009185E 0102 801FFC5C 0000 #Enemy Guts Zero R2 + SELECT D009185E 0102 801FFC7C 0000 #All Monster Cards 50009802 0000 8009703C 0101 #All Emblem S 80097010 0001 80097014 0001 80097018 0001 8009701C 0001 80097020 0001 #Alway's Rank S 30095B42 0005 #Max Status 800959D0 03E7 800959D2 03E7 800959D4 03E7 800959D6 03E7 800959D8 03E7 800959DA 03E7 800959E0 03E7 800959E8 03E7 #Max Loyalty 300959EC 00C8 300959ED 00C8 #Unlock All Species 80097336 0101 80097338 0101 8009733A 0101 8009733C 0101 8009733E 0101 80097340 0101 80097342 0101 80097344 0101 80097346 0101 80097348 0101 8009734A 0101 8009734C 0101 8009734E 0101 80097350 0101 80097352 0101 80097354 0101 80097356 0101 80097358 0101 8009735A 0101
To be continued...
相关文章推荐
- Eclipse中有效解决安卓R文件丢失
- 一文读懂机器学习,大数据/自然语言处理/算法全有了
- preg_match_2.php
- React Native学习笔记(一)Mac OS X下React Native的环境搭建
- java 中的抽象类
- acm_最长相同子序列
- ipad itunes 恢复
- 数据、消息的传递
- 如何在Unity中播放视频?
- LINUX下软件包的安装与使用
- struts2工作流程
- strpos.php
- 阅读WebKit最近搞的一个存储开销小的、快速自适应的Locking机制
- IntelliJ IDEA中如何设置忽略@param注释中的参数与方法中的参数列表不一致的检查
- 心得11
- POJ3728 LCA RMQ 动态规划
- strrpos.php
- JavaScript获取元素的方式总结
- strripos stripos()函数
- 提高篇项目3(1)——求最大公约数