植物大战僵尸植物叠加种植

文章正文
发布时间:2025-07-08 10:07

本帖最后由 无瑕黑心肠 于 2019-5-4 03:13 编辑

楼主的图片挂了,我尝试修复了一下,以下是我找回的内容:

今天我们来研究一下如何在一个位置放多个植物。
首先来思考一下放植物的流程:
选择植物选择地面位置if ( 位置可以放植物) {    扣除阳光    放下植物    设置植物冷却    设置该位置为已使用    ......} else {    提示不能放植物}
因为没有看过源码,所以猜测的流程大致如此,不难得出,如果我们要在某个位置放多个植物,稍加思考可以从两个地方入手:


在if判断处使它总是跳转到能放植物处代码


修改地面位置为未使用

当然可能这两种方法都是错误的。不妨事,我们先来看看第一种方法。
我们要找到种植物相关的代码,所以我们可以从阳光入手。首先使用CE找到阳光地址。

v2-931c8440e91007f132b813b40f0575af_b.png (7.66 KB, 下载次数: 5)

下载附件

2019-5-4 03:12 上传


接下来右键查看谁改写了这个地址,我们放下一个植物可以看到有一条记录,我们记下0041BA76这个地址:

v2-73c1ac4a56cd4b97d53e94a3d8cd70d0_b.png (27.11 KB, 下载次数: 4)

下载附件

2019-5-4 03:13 上传


接下来我们就需要用另外一种调试工具了:OllyDbg
我们打开OD,附加进程,可能附加失败,我们把CE关掉就好了。
打开后ctrl+g,输入0041BA76,跳转到程序开始位置,一次可能跳转不到,再跳一次即可。此时我们看到的就是CPU执行的汇编指令了,我们在这段代码的段首下断点。

v2-ef78880ecf4c32f8ffc94f1864cc5f02_b.png (18.42 KB, 下载次数: 6)

下载附件

2019-5-4 03:07 上传


回到游戏中种下一棵植物,OD会断下来,我们看OD的右下角的堆栈信息追溯回去。

v2-ca732f15c97b76d83cc404ea7aca36c7_b.png (25.3 KB, 下载次数: 4)

下载附件

2019-5-4 03:07 上传


我们可以把这个call标记为减少阳光call,当然不一定正确。

v2-6da793dc9e80f4f3a1c3a55fb94d6ed5_b.png (94.03 KB, 下载次数: 3)

下载附件

2019-5-4 03:07 上传


往上翻再次找到函数头部并下断。
我们在能种植物的地方种植物,发现OD会断下来,我们单步调试往下走,标记出来每个跳转是否实现,跳转的标记为1,不跳转的标记为0。

v2-08ef9e815fc4e534a233a6b56b602e47_b.png (118.21 KB, 下载次数: 5)

下载附件

2019-5-4 03:08 上传


然后再在一颗植物上种植物,OD会断下来,我们单步调试往下走,找到不同的跳转。
我们会发下这条指令在空白区域种植物时是实现的,在有植物的地方种植物是未实现的。那么这条指令很可疑,我们把它改为永远跳转试一下。

v2-895af32108cf7f2c5474c156d2757404_b.png (39.88 KB, 下载次数: 4)

下载附件

2019-5-4 03:08 上传


"右键" -> "汇编" 把je(jump equal)改为 jmp(无条件跳转),单击汇编。

v2-01f2ba64ab6cc05ce4b833ca4b5b93da_b.png (17.34 KB, 下载次数: 2)

下载附件

2019-5-4 03:08 上传


v2-882b5c59fb32887fd69e60785f16a0ab_b.png (9.29 KB, 下载次数: 3)

下载附件

2019-5-4 03:09 上传


进入到游戏中,就会发现可以叠加种植植物了。

v2-9205d0349927da281f2d63c8f738fc94_b.png (528.58 KB, 下载次数: 7)

下载附件

2019-5-4 03:09 上传

 

免费评分 参与人数 5吾爱币 +6 热心值 +4 理由
独行风云   + 1   + 1   谢谢@Thanks!  
KaQqi     + 1   666666你们都怎么复原的  
soyiC   + 1   + 1   热心回复!  
Honey丶Linux   + 2     植物大战僵尸都被师傅们玩坏了  
CrazyNut   + 2   + 1   谢谢@Thanks!  

查看全部评分