怪物农场2修改日志3 - 年轮
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找到怪物种族).
得到内存中的地址应为 0x975e6-0x2B0 = 0x97336
#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