植物大戰(zhàn)僵尸全屏奶油
早期文章
《植物大戰(zhàn)僵尸》這個游戲中想讓僵尸走慢一點,方法挺多的,可以使用冰凍豌豆射手,也可以使用玉米投手,也可以使用冰川菇。這里使用玉米投手的奶油,讓僵尸走的慢些。
當僵尸走到離房子比較近的時候,讓僵尸的頭上頂一塊奶油,站在那里。這樣的話,需要判斷僵尸的位置,還有就是如何讓僵尸的頭上頂一塊奶油。
僵尸頭上頂奶油,是僵尸的一個狀態(tài),這個狀態(tài)在僵尸基址的 B0 偏移處。僵尸坐標的偏移在僵尸基址的 2C 處。
當僵尸離房子比較近時,讓僵尸頭上頂奶油,那么就需要判斷僵尸的位置。通過分析,僵尸移動的指令在如下位置:
0052AB25 - 74 09 - je 0052AB30
0052AB27 - D9 46 2C - fld dword ptr [esi+2C]
0052AB2A - D8 64 24 08 - fsub dword ptr [esp+08]
0052AB2E - EB 07 - jmp 0052AB37
0052AB30 - D9 46 2C - fld dword ptr [esi+2C]
0052AB33 - D8 44 24 08 - fadd dword ptr [esp+08]
0052AB37 - 83 7E 24 07 - cmp dword ptr [esi+24],07 { 7 }
0052AB3B - D9 5E 2C - fstp dword ptr [esi+2C]
0052AB3E?-?0F85?A4000000?????????-?jne?0052ABE8
0052AB2A 地址用來將僵尸的坐標向左移動,我們想要增加判斷,需要開辟一塊內存寫入判斷的代碼,當離房子比較近的時候,改變僵尸頭頂奶油的狀態(tài)即可。我這里找的是 00400F00 這個位置寫入,因為這個地方空白區(qū)域比較多,容易發(fā)揮。首先,修改 0052AB3E 處的代碼,修改為一條 jmp 指令。為什么選這條指令修改?原因比較簡單,因為指令長度夠,也就是把 jne 改為 jmp 后,不影響其他指令。如果修改上面的代碼,那么修改一條指令會影響后面的多條指令,畢竟影響過的指令,我們是要手動補上的。修改后的代碼如下:
0052AB3E - E9 BD63EDFF - jmp 00400F00
0052AB43 - 90 - nop
在 00400F00 寫入判斷和修改僵尸狀態(tài)的代碼,如下的代碼:
00400F00 - 60 - pushad
00400F01 - 9C - pushfd
00400F02 - D9 46 2C - fld dword ptr [esi+2C]
00400F05 - C7 46 2C 56FB4843 - mov [esi+2C],4348FB56 { 200.98 }
00400F0C - D8 56 2C - fcom dword ptr [esi+2C]
00400F0F - 9BDFE0 - wait:fstsw ax
00400F12 - 9E - sahf
00400F13 - 77 0A - ja 00400F1F
00400F15 - C7 86 B0000000 00010000 - mov [esi+000000B0],00000100 { 256 }
00400F1F - D9 5E 2C - fstp dword ptr [esi+2C]
00400F22 - 9D - popfd
00400F23 - 61 - popad
00400F24 - 0F85 BE9C1200 - jne 0052ABE8
00400F2A?-?E9?159C1200???????????-?jmp?0052AB44
上面的代碼中,當僵尸的坐標小于 200.98 時,讓僵尸頭頂奶油,這里的 200.98 是單精度浮點數(shù),因此在內存中的值是 4348FB56。
代碼不多,還是比較簡單的,效果如下:

從上面的圖中可以看出,僵尸走到紅框的位置處頭上都頂了奶油,并且站在那里不動了,而沒有走到那里的僵尸,將會繼續(xù)往前走,直到走到紅框的位置處。
這樣,全屏奶油的效果就達到了。

公眾號內回復?【mongo】 下載 SpringBoot 整合操作 MongoDB 的文檔。
公眾號內回復?【 cisp知識整理 】 下載 CISP 讀書筆記。
公眾號內 回復【java開發(fā)手冊】獲取《Java開發(fā)手冊》黃山版。
