在上一章,我们找到了检测敌人出现条件的地方,并测试成功,但是找到这个位置的思路并不只有这个方法,这里我们提供另一个思路。
我们已经知道,敌人出现需要一个条件,当这个条件满足时,敌人的出现,程序会需要初始化这个敌人出现的位置,也就是说,我们可以利用敌人的坐标位置来一步步找到敌人出现的条件检测位置。
首先,我们需要找到敌人坐标位置的地址,进入游戏,向前走,让敌人出现,我们初始化搜索:
ci sw
我们回到游戏观察敌的走动,我们猜测敌人向左走时敌人的坐标会减少,向右时会增加,我们发现敌人移动了,就进入调试器,如果敌人向左移动了,使用
cn -
如果向右移动了,使用
cn +
同样循环多次,筛选出足够少的地址:
我们可以测试这些数据,当改变数据时敌人会发生突然的移动,那这个地址就是敌人的坐标数据:
通过测试,我们找到了ffd7dc这个地址为敌人的坐标数据。
我们回到游戏开始,向前走一点,走到敌人马上就要出现的临界点,为什么要走到临界点,是因为在敌人出现前,会出现两个飞龙,因为敌人的内存很多是共享的,这两个飞龙很可能会占用掉这个地方的内存。我们需要确保这两个飞龙消失后,再让这个敌人出现。
我们需要注意,这些不起眼的元素,很可以会景响我们的测试结果。
这时,该地址应该为0
我们监控这个位置
wp ffd7dc,1,w
然后,我们向前走,让这个敌人出现,会出现中断
我们可以猜测,这里是设置敌人一些出现数据的子程序。我们查看运行历史:
00FC98: move.w ($744,A5), D1
00FC9C: cmp.w D1, D0 //
00FC9E: bhi $fd02
00FD02: movea.l ($c,A4), A2
00FD06: tst.b ($4dc,A5)
00FD0A: beq $fd1e
00FD1E: move.w (A2), D0
00FD20: move.w ($744,A5), D1
00FD24: cmp.w D1, D0 //
00FD26: bhi $fd44
00FD2A: bsr $fdae
00FDAE: move.w ($2,A2), D0
00FDB2: btst #$7, D0
00FDB6: beq $fdc0
00FDC0: move.w D0, D1
00FDC2: andi.w #$60, D1
00FDC6: beq $fdec
00FDEC: move.w D0, D1
00FDEE: andi.w #$18, D1
00FDF2: beq $fe1a
00FE1A: andi.w #$7, D0
00FE1E: add.w D0, D0
00FE20: add.w D0, D0
00FE22: lea (-$de,PC) ; ($fd46), A0
00FE26: movea.l (A0,D0.w), A0
00FE2A: jsr (A0)
00483C: tst.w ($65f8,A5) //
004840: beq $485a
004844: move.l A4, -(A7)
004846: movea.w ($6602,A5), A4
00484A: movea.w (A4)+, A0
00484C: move.w A4, ($6602,A5)
004850: subq.w #1, ($65f8,A5)
004854: movea.l (A7)+, A4
004856: or.b D0, D0
004858: rts
00FE2C: bcs $fe64
00FE30: move.b #$1, ($0,A0)
00FE36: move.w ($4,A2), ($20,A0)
00FE3C: move.w ($6,A2), ($8,A0)
00FE42: move.w ($8,A2), ($10,A0)
我们向上寻找,找到数据对比的指令,很可能就是我们要找的地方,因为我们在上一章已经找到了这个地址,我们很容易就可以看出来:
00FD1E: move.w (A2), D0
00FD20: move.w ($744,A5), D1
00FD24: cmp.w D1, D0 //
所以,找到自已希望的程序位置并不是只有一个方法,如果一个方法很难找到想要的位置,可以尝试换一个思路,也许可能更快地找到你想要的。