【PVZ改版教程2】改版制作方法、匯編學(xué)習(xí)與設(shè)計(jì)理念
大家好我是Ghastasaucey,距離上期教程已經(jīng)過(guò)了有一段時(shí)間了。
第二期,我們講細(xì)說(shuō)一下改版制作的一些基本事宜。

使用匯編制作改版的基本方法
圈里的新人可能聽(tīng)說(shuō)過(guò)CT、地址等一系列名詞。為了方便下文描述,這里先把一些必要的名詞講解清楚。
CT:指Cheat Engine保存的工程文件,你可以理解為匯編改版上的“源代碼”;
內(nèi)存/地址:即內(nèi)存地址,簡(jiǎn)單來(lái)講,就是程序運(yùn)行時(shí),代碼、數(shù)據(jù)所存放的位置;
在一切之前,推薦先過(guò)一遍CE自帶的教程。CE教程里涉及到的掃描、打開(kāi)與附加程序等,本教程不再贅述。

紅色區(qū)域內(nèi)的按鈕,用于保存CT文件、打開(kāi)CT文件與附加程序。這部分操作教程里有提到(保存文件與打開(kāi)文件是電腦基本功之一)。
綠色區(qū)域的按鈕是將來(lái)主要使用的按鈕,其可以查看程序的內(nèi)存情況,進(jìn)一步方便我們修改邏輯。
橙色區(qū)域的按鈕也是制作中使用很多的按鈕,此處不作詳細(xì)介紹。

制作第一步,使用CE打開(kāi)PVZ的進(jìn)程,然后點(diǎn)“查看內(nèi)存”,然后跳出一個(gè)這樣的窗口:

這里非常推薦把這個(gè)“顯示模塊地址”關(guān)掉,會(huì)好看很多。

畫(huà)面中心,最左側(cè)的即是地址,我們重點(diǎn)關(guān)心“操作碼”這一部分。
我們現(xiàn)在查看的這些都是匯編語(yǔ)言的東西。什么?你沒(méi)學(xué)過(guò)匯編語(yǔ)言?不要緊,先介紹一個(gè)好用的快捷鍵:ctrl+G,使用這個(gè)快捷鍵會(huì)出現(xiàn)一個(gè)窗口,輸入你要跳轉(zhuǎn)的地址,就可以去查看那個(gè)地址了。之后說(shuō)“跳轉(zhuǎn)到XX地址”就是指這個(gè)操作。

為了方便大家學(xué)習(xí),我們?cè)囍鲆粋€(gè)簡(jiǎn)單的修改。
首先跳轉(zhuǎn)到地址“0052B1FD”,這里有一行“jne 0052B204”,雙擊,修改為“jo?0052B204”,然后你就會(huì)神奇的發(fā)現(xiàn),所有的僵尸都開(kāi)始留冰道了。
試完之后,我們不妨思考一下原因??梢钥吹缴厦嬗幸恍小癱mp dword ptr [esi+24],0C”,而冰車僵尸的編號(hào)就是12(C即十六進(jìn)制的12),而jne是“jmp if not equal”(不相等即跳轉(zhuǎn))的意思,改成jo("jmp if overflow")后,由于不可能溢出,所以肯定按照冰車的邏輯運(yùn)行下去。
接下來(lái),你可以試著參照之前所提文件中的函數(shù)表與指針表,來(lái)試著閱讀原版的一些程序邏輯。
這里我推薦試著閱讀以下幾處:
0045F980 —— 判斷植物類型是否為陽(yáng)光生產(chǎn)類型
0041C170 —— 判斷關(guān)卡是否含有迷霧
0041D7D0 —— 紫卡判斷底座植物是否存在
在讀懂之后,你就可以一定程度上了解匯編了(起碼可以建立一些簡(jiǎn)單的理解)。
當(dāng)然,我需要先講解一個(gè)簡(jiǎn)單的知識(shí):寄存器。
在閱讀過(guò)程中,你可能會(huì)看到eax、ecx、edx、ebx、esi、ebp、edi之類的東西,它們都是寄存器,有些時(shí)候的al、bl什么的,也是寄存器。
所謂寄存器,簡(jiǎn)單理解就是用于儲(chǔ)存數(shù)據(jù)的“箱子”,它們儲(chǔ)存著的數(shù)據(jù)可能代表著什么,我們通過(guò)閱讀函數(shù)00463EF0來(lái)詳細(xì)理解這件事情。

已知這個(gè)函數(shù)用于檢測(cè)植物是否可以被碰到。
cmp dword ptr [eax+24],11
cmp,即compare(比較),即拿[eax+24]與0x11(十進(jìn)制就是17)作比較。我們可以合理推測(cè)這個(gè)eax是植物。查閱指針表得知,植物的+24是其類型,那么,這句話的意思就是,判斷植物是否為窩瓜。且這段程序中eax寄存器是指向植物的。
jne的含義前文有提,是不相等則跳轉(zhuǎn)(跳走不運(yùn)行這段)。所以這里是先判斷是不是窩瓜,如果是,判斷窩瓜的狀態(tài)(下文的eax+3C,查閱指針表得知植物的+3C為其狀態(tài)),然后判斷這個(gè)植物有沒(méi)有被壓扁一類。

可以發(fā)現(xiàn),這里eax是指向植物的,而下文“mov ecx,[eax+3C]”后,ecx就變成了植物的狀態(tài)。
需要注意的是,寄存器儲(chǔ)存的值并不是固定的,并不是所有地方的eax都是植物,也不是所有地方的ecx都是植物的狀態(tài)。具體哪個(gè)寄存器存的是什么,要根據(jù)上下文綜合判斷。
你現(xiàn)在可能很懵逼——寄存器是什么?這么多亂七八糟的英文代碼我怎么可能全認(rèn)識(shí)?關(guān)于這些,你可以查看第二篇——如何在改版過(guò)程中學(xué)習(xí)匯編

此外,點(diǎn)擊ctrl+A,可以呼出這個(gè)窗口(自動(dòng)匯編)。關(guān)于這個(gè)的使用,我們將會(huì)在第三期里具體說(shuō)明。


如何在改版過(guò)程中學(xué)習(xí)匯編
本教程是教PVZ改版的。我們不可能把匯編完完整整的講一遍,更多的在于平常自身的積累。
方法1 —— 搜索視頻系統(tǒng)學(xué)習(xí)
該方法時(shí)間成本較大。但是比較系統(tǒng)化。有興趣有時(shí)間可以搜索“匯編語(yǔ)言”之類的尋找相關(guān)的視頻學(xué)習(xí)。
方法2 —— 通過(guò)積累
在制作改版的過(guò)程中,你會(huì)自然而然的學(xué)會(huì)使用一些匯編指令。例如你現(xiàn)在應(yīng)該已經(jīng)知道“jne”的用途了。實(shí)際上,閱讀原版程序,然后分析或搜索就是很好的方法。
例如我想知道匯編命令“xor”是什么意思,可以搜索“匯編語(yǔ)言xor”,搜索結(jié)果就會(huì)有不少相關(guān)的文章(可以看一下CSDN里的)。最開(kāi)始,你可能因?yàn)槔锩娲罅康挠?jì)算機(jī)詞匯感到晦澀難懂,不過(guò)看多了也就都懂了。
此外,你也可以在第一期里提到的群里友善的發(fā)問(wèn)一句:“請(qǐng)問(wèn)一下,xor是什么意思???”,有人看到后會(huì)給你講的。注意不要用“xor是啥”這種問(wèn)法,比較不禮貌。
在一定的積累后,你需要去更系統(tǒng)化的了解匯編。不過(guò)這時(shí)候,你的系統(tǒng)化了解就輕松多了。
之后的教程也會(huì)時(shí)不時(shí)講解一些匯編的重要知識(shí),慢慢來(lái)就好。

改版設(shè)計(jì)理念
改版作為一種愛(ài)好者性質(zhì)的創(chuàng)作,我們無(wú)權(quán)要求也不可能要求改版作者怎么制作改版(除了一些原則性的,比如不要往改版里加入惡意程序)。
以下內(nèi)容,均是制作一個(gè)相當(dāng)優(yōu)質(zhì)的改版應(yīng)當(dāng)有的意識(shí)(的一部分):
①注意玩家體驗(yàn),例如Ghtr那個(gè)閃光瞎眼土豆地雷就是經(jīng)典反面教材;
②設(shè)計(jì)特性時(shí),注意強(qiáng)度、可玩性等綜合要素,不要單純圖“爽”;
③注意聽(tīng)覺(jué)、視覺(jué)等要素,改版不是僅有特性這一項(xiàng)的;
④注意制作過(guò)程中的規(guī)范性(后面的教程會(huì)強(qiáng)調(diào)很多規(guī)范上的東西)。
設(shè)計(jì)上的問(wèn)題是教程的重頭戲,這里先把一些比較核心的內(nèi)容陳述完畢。

本期教程就到這里了,第二期也是以入門(mén)為主。
第三期將會(huì)教你使用CE的自動(dòng)匯編功能,并且詳細(xì)講解匯編的部分知識(shí)。