【PVZ改版教程2】改版制作方法、汇编学习与设计理念
大家好我是Ghastasaucey,距离上期教程已经过了有一段时间了。
第二期,我们讲细说一下改版制作的一些基本事宜。

使用汇编制作改版的基本方法
圈里的新人可能听说过CT、地址等一系列名词。为了方便下文描述,这里先把一些必要的名词讲解清楚。
CT:指Cheat Engine保存的工程文件,你可以理解为汇编改版上的“源代码”;
内存/地址:即内存地址,简单来讲,就是程序运行时,代码、数据所存放的位置;
在一切之前,推荐先过一遍CE自带的教程。CE教程里涉及到的扫描、打开与附加程序等,本教程不再赘述。

红色区域内的按钮,用于保存CT文件、打开CT文件与附加程序。这部分操作教程里有提到(保存文件与打开文件是电脑基本功之一)。
绿色区域的按钮是将来主要使用的按钮,其可以查看程序的内存情况,进一步方便我们修改逻辑。
橙色区域的按钮也是制作中使用很多的按钮,此处不作详细介绍。

制作第一步,使用CE打开PVZ的进程,然后点“查看内存”,然后跳出一个这样的窗口:

这里非常推荐把这个“显示模块地址”关掉,会好看很多。

画面中心,最左侧的即是地址,我们重点关心“操作码”这一部分。
我们现在查看的这些都是汇编语言的东西。什么?你没学过汇编语言?不要紧,先介绍一个好用的快捷键:ctrl+G,使用这个快捷键会出现一个窗口,输入你要跳转的地址,就可以去查看那个地址了。之后说“跳转到XX地址”就是指这个操作。

为了方便大家学习,我们试着做一个简单的修改。
首先跳转到地址“0052B1FD”,这里有一行“jne 0052B204”,双击,修改为“jo 0052B204”,然后你就会神奇的发现,所有的僵尸都开始留冰道了。
试完之后,我们不妨思考一下原因。可以看到上面有一行“cmp dword ptr [esi+24],0C”,而冰车僵尸的编号就是12(C即十六进制的12),而jne是“jmp if not equal”(不相等即跳转)的意思,改成jo("jmp if overflow")后,由于不可能溢出,所以肯定按照冰车的逻辑运行下去。
接下来,你可以试着参照之前所提文件中的函数表与指针表,来试着阅读原版的一些程序逻辑。
这里我推荐试着阅读以下几处:
0045F980 —— 判断植物类型是否为阳光生产类型
0041C170 —— 判断关卡是否含有迷雾
0041D7D0 —— 紫卡判断底座植物是否存在
在读懂之后,你就可以一定程度上了解汇编了(起码可以建立一些简单的理解)。
当然,我需要先讲解一个简单的知识:寄存器。
在阅读过程中,你可能会看到eax、ecx、edx、ebx、esi、ebp、edi之类的东西,它们都是寄存器,有些时候的al、bl什么的,也是寄存器。
所谓寄存器,简单理解就是用于储存数据的“箱子”,它们储存着的数据可能代表着什么,我们通过阅读函数00463EF0来详细理解这件事情。

已知这个函数用于检测植物是否可以被碰到。
cmp dword ptr [eax+24],11
cmp,即compare(比较),即拿[eax+24]与0x11(十进制就是17)作比较。我们可以合理推测这个eax是植物。查阅指针表得知,植物的+24是其类型,那么,这句话的意思就是,判断植物是否为窝瓜。且这段程序中eax寄存器是指向植物的。
jne的含义前文有提,是不相等则跳转(跳走不运行这段)。所以这里是先判断是不是窝瓜,如果是,判断窝瓜的状态(下文的eax+3C,查阅指针表得知植物的+3C为其状态),然后判断这个植物有没有被压扁一类。

可以发现,这里eax是指向植物的,而下文“mov ecx,[eax+3C]”后,ecx就变成了植物的状态。
需要注意的是,寄存器储存的值并不是固定的,并不是所有地方的eax都是植物,也不是所有地方的ecx都是植物的状态。具体哪个寄存器存的是什么,要根据上下文综合判断。
你现在可能很懵逼——寄存器是什么?这么多乱七八糟的英文代码我怎么可能全认识?关于这些,你可以查看第二篇——如何在改版过程中学习汇编

此外,点击ctrl+A,可以呼出这个窗口(自动汇编)。关于这个的使用,我们将会在第三期里具体说明。


如何在改版过程中学习汇编
本教程是教PVZ改版的。我们不可能把汇编完完整整的讲一遍,更多的在于平常自身的积累。
方法1 —— 搜索视频系统学习
该方法时间成本较大。但是比较系统化。有兴趣有时间可以搜索“汇编语言”之类的寻找相关的视频学习。
方法2 —— 通过积累
在制作改版的过程中,你会自然而然的学会使用一些汇编指令。例如你现在应该已经知道“jne”的用途了。实际上,阅读原版程序,然后分析或搜索就是很好的方法。
例如我想知道汇编命令“xor”是什么意思,可以搜索“汇编语言xor”,搜索结果就会有不少相关的文章(可以看一下CSDN里的)。最开始,你可能因为里面大量的计算机词汇感到晦涩难懂,不过看多了也就都懂了。
此外,你也可以在第一期里提到的群里友善的发问一句:“请问一下,xor是什么意思啊?”,有人看到后会给你讲的。注意不要用“xor是啥”这种问法,比较不礼貌。
在一定的积累后,你需要去更系统化的了解汇编。不过这时候,你的系统化了解就轻松多了。
之后的教程也会时不时讲解一些汇编的重要知识,慢慢来就好。

改版设计理念
改版作为一种爱好者性质的创作,我们无权要求也不可能要求改版作者怎么制作改版(除了一些原则性的,比如不要往改版里加入恶意程序)。
以下内容,均是制作一个相当优质的改版应当有的意识(的一部分):
①注意玩家体验,例如Ghtr那个闪光瞎眼土豆地雷就是经典反面教材;
②设计特性时,注意强度、可玩性等综合要素,不要单纯图“爽”;
③注意听觉、视觉等要素,改版不是仅有特性这一项的;
④注意制作过程中的规范性(后面的教程会强调很多规范上的东西)。
设计上的问题是教程的重头戏,这里先把一些比较核心的内容陈述完毕。

本期教程就到这里了,第二期也是以入门为主。
第三期将会教你使用CE的自动汇编功能,并且详细讲解汇编的部分知识。