如何制作一个PVZ改版

```
回到主页    回到帮助中心

```

工具(75df)WASDX的 工具(wasdx)PVZFLJ-CT(pvzFLJ)

请记住：游戏崩溃是正常情况。如果失败了，多试几次

你时间都用来研究技术了还怎么专心想设计……好的设计不是坐着就能出来的，是得花时间构思出来的。
——Ghastasaucey

最近一次更新于22-07-18(23-1-25,此页面不再更新)

## 游戏文件分析

* PlantvsZombies.exe是游戏主题文件，双击可以打开游戏。
* Sounds是音效文件夹，注意改的时候不要忘记转码ogg
* gdi42.dll是汉化字体库，（左图是英文版改动的，所以没有）英文版为内置gdi32.dll，不支持中文字符；
* 如果还有font文件夹，那就是汉化第二版，字符不全，但是可以手动修改（右图）
* 其中每组是对应：
* *字体3*——开始游戏、戴夫、智慧树、（小游戏进场）各种大字，包括致谢名单
* *字体4*——图鉴详细说明，关卡名称（小游戏页面），随机选卡，商店、查看草坪字符
* *字体5*——小游戏奖杯数字“确定要退出游戏吗”
* *字体6*——主菜单文字、图鉴首行文字

```
等待补充

```

* bass.dll是音乐函数
* images、particles、reanim（大多数）是贴图文件夹
* properties文件夹是·部分资源文件(?)·，其中LawnStrings.txt是修改游戏大多数文本的地方
* crash.txt——你游戏崩了就会生成这个
* data文件夹——你别动就行了
* complied——动作文件夹
* 默认存档目录：C:\ProgramData\PopCap Games\PlantsVsZombies\userdata

* 你的界面不是这样？
* ①没有 lawnbgm(x).mp3或者Sample (x).mp3和bass\_b\_2.dll，这就是纯粹原版，这些文件连同bass.dll，是修改了背景音乐的改版，同时生成debugs.txt
* ②有main.pak，没有compiled、data、images、particles、properties、reanim、sounds文件夹，那就需要解包，下文会有打包&解包教程。

## 基础教程

### 贴图修改

请先寻找一个叫main.pak的文件。如果没有，寻找以下几个文件，并跳过“打包&解包”这一步

然后使用链接里的工具：

打开后，界面上我们会看到打包模式和解包模式。

PAK文件：找到植物大战僵尸文件夹里的有个名字为main.pak的文件

PAK目录：就是解压出来的植物大战僵尸材质包的放置的地方（我们一般选择桌面）

接着会解压出来一个名字为PAK的文件夹，这就是植物大战僵尸材质包放置地址。

这些文件夹：（下划线的是贴图）

* compiled->动作文件
* data
* images
* particles
* properties
* reanim（大多数）
* sounds

要替换原先的贴图（不改变名称）；但是这些不是完整的，你要学会拆散。

P图软件：Photoshop，美图秀秀。

最后打包。

*其实自己研究一下也就出来了。*

### 动作修改

有点麻烦，你首先得有以下软件：

An这个软件去网上找（pj版），

备注：2020版win7用不了

后头两个在Fla三件套里，

```
等待补充

```

### 代码基础修改

准备工具：修改器和拦截器（修改器终结者）

学会用拦截器去拦截修改器

2种办法：推荐附加进程

首先选择MsgMonitor.exe，打开

然后“文件——附加进程”

选择进程

修改器使用时，数值的修改会拦截出来，你选择保存；但不是所有都能保存，动态数值、浮点数不可以

保存方式：先方框打勾，然后“保存写入—所有勾选的项”

这样，保存出来的程序就是了

### 出错研究

变量是不可以更改的，比如：阳光数值

如图情况，你可能修改了6Fxxxx区段，导致无法保存，而且游戏变大——所以不能保存这些

”但是，MGCL大佬当时做的这个让PVZ泛滥下去，最后导致了劣质改版数量增多，PVZ圈子已经覆灭。”

“请记住：不要做我做过的，我的到来就是灭亡”——*Sunset*

## 细节修改

### 非LS文字修改

使用工具：Hex Editor Neo（16进制编辑器）

右键Find，输入查找内容

比如：找到如图的标题文字

* 在左边修改16进制

### 存档路径修改

16进制修改器

寻找userdata，4处，修改即可,

注意：第一位必须对齐

（注意使用“Find Previous”和“Find Next”）

## 进阶教程

### 修改出怪

电脑版修改冒险模式出怪：WPF修改器有时候不管用，

（2-5,4-5，5-10不管用,限制在5-10以内，要不然改跳转)

* 6A35B4\\冒险模式1-1出怪是否有普通(+CC下一种僵尸,+4下一关)
	+ ——*一定注意16进制*

想修改列表还得先修改以下两个地方（使用od）

* [40D6A3--jmp 40D6A8]
* [40D6AC--nop,nop]

* 69DA88\\僵尸级别(+1C下一个)
* 69DA94\\僵尸出现的比重(+1C下一个)

出怪依照：

倾斜字符需要你去修改js级别、比重

通用修改出怪CE模版：

* [ENABLE]
* alloc(newmem,2048)
* label(returnhere)
* label(originalcode)
* label(exit)
* cmp esi,僵尸id
* je next
* jne exit
* mov [esi+edi+00054D4],al
* next:
* pushad
* mov ecx,[6A9EC0]
* mov ecx,[ecx+82C]
* cmp [ecx+24],关卡数
* jne exit
* popad
* mov al,1
* mov [esi+edi+00054D4],al
* jmp returnhere
* exit:
* mov [esi+edi+00054D4],al
* jmp returnhere
* "PLANTSVSZOMBIES.exe"+AB97:
* jmp newmem
* nop 2
* returnhere:
* [DISABLE]

### 修改出怪倍数

* [ENABLE]
* alloc(newmem,2048)
* label(returnhere)
* label(originalcode)
* label(exit)
* mov [esp+24],4//出怪倍数
* exit:
* jmp 00409968
* "PlantsVsZombies.exe"+9893:
* jmp newmem
* nop
* returnhere:
* [DISABLE]

### 第六大关保存

#### 场景修改

* [ENABLE]
* alloc(newmem,2048)
* label(returnhere)
* label(originalcode)
* label(exit)
* newmem:
* cmp eax,27//关卡16进制
* je exit

* movzx eax,byte ptr [eax+PLANTSVSZOMBIES.exe+AAC0]
* jmp returnhere

* originalcode:
* jmp PLANTSVSZOMBIES.exe+21EA12

* exit:
* mov eax,07//场景
* jmp returnhere
* //eax=01 白天草坪
* //eax=02 黑夜草坪
* //eax=03 白天泳池
* //eax=04 黑夜泳池
* //eax=05 白天屋顶
* //eax=06 水族馆
* //eax=07 黑夜屋顶
* //eax=08 禅景花园mov eax.ebx
* "PLANTSVSZOMBIES.exe"+A576:
* jmp newmem
* nop 2
* returnhere:
* [DISABLE]

特别地：蘑菇园可以找个空地址写入代码（总共就两行，mov 【esi+0000554C】,00000006和jmp 0040A635）

#### 第七大关的显示问题

* 大关显示上限数44ac8d(主菜单)
* 大关游戏内显示数上限

直接放图

①

②

### OD保存exe

B站专栏

```
等待补充

```

### 僵尸增加防具：

工具：od

用od打开这几个地址，然后在上方第一个（jmp xxx）里汇编入下面的地址，保存就可以了

* 523BDE 机枪、豌豆
* 523AAC 辣椒
* 52396E 高建国
* 523839 建国

```
窝瓜（？）

```

防具：

* 5228A4 铁桶
* 522939 铁门
* 522804 路障
* 523E4E无防具

### 反伤教程

CE代码如下

* [ENABLE]
* alloc(newmem,2048)
* label(returnhere)
* label(originalcode)
* label(exit)
* cmp dword ptr [eax+24],1A//植物
* je pvza
* jne exit
* pvza:
* pushad
* mov esi,edi
* push 20//血量
* mov eax,0000000
* call 005317c0
* popad
* exit:
* jmp returnhere
* 52BC8F:
* jmp newmem
* returnhere:
* [DISABLE]

### 坟墓随机

* [ENABLE]
* alloc(newmem,2048)
* label(zx)

* 75000F:
* （这里可以加判断）
* pushad

* zx:
* mov eax,0x21
* call 005AF400
* cmp eax,0x19//避免出现僵王
* je zx
* mov dword ptr ds:[0x700004],eax
* popad

* zx1:
* mov ebx,dword ptr ds:[0x700004]
* push eax
* push ebx
* mov eax ,edi
* call 0040DDC0
* jmp 00412DE5

* 412DDC:
* jmp 75000F
* nop
* nop
* nop
* nop
* [DISABLE]

### 僵尸死后立马召唤僵尸

//注：会导致选卡结束后出现一部分、

* [ENABLE]
* alloc(newmem,2048)
* label(returnhere)
* label(originalcode)
* label(exit)

* newmem:
* cmp [730040],4
* jnz originalcode
* cmp [edi+24],#16//这里是僵尸代号
* /\*
* 僵尸种类表：
* 00普通 01旗帜 02路障 03撑杆 04铁桶 05读报 06铁门 07橄榄 08舞王 09伴舞 10鸭子 11潜水 12冰车 13雪橇 14海豚 15小丑 16气球 17矿工 18跳跳 19雪人 20小偷 21扶梯 22篮球 23巨人 24小鬼 25僵王 26豌豆 27坚果 28辣椒 29机枪  30窝瓜 31高坚 32红眼
* \*/
* jnz originalcode
* pushad
* mov esi,#5//数量

* while:
* add esi,-1 //循环体，快速减一
* mov eax, [edi+8]
* mov bl,50 //80
* div bl
* movzx eax,al
* push eax
* mov eax,[edi+1C]
* mov ecx,[6A9EC0]
* mov ecx,[ecx+768]
* mov ecx,[ecx+160]
* push #26//召唤的僵尸
* call 0042A0F0
* cmp esi,0
* jnz while
* popad

* originalcode:
* mov byte ptr [edi+000000EC],01

* exit:
* jmp returnhere

* 530602:
* jmp newmem
* nop
* nop

* returnhere:

* [DISABLE]
* dealloc(newmem1)
* 530602:
* mov byte ptr [edi+000000EC],01 //Alt: db C6 87 EC 00 00 00 01

### 老虎机物品修改

("PlantsVsZombies.exe"+8708F)前后(48708F)

* mov [esp+18],00000031
* mov [esp+1C],esi//0(豌豆)
* mov [esp+20],00000012
* mov [esp+24],00000021
* mov [esp+28],00000038
* mov [esp+2C],00000015

### 选卡界面

#### 卡槽背景修改

CE脚本如下

* [ENABLE]
* alloc(newmem,2048)
* label(returnhere)
* label(originalcode)
* label(exit)
* newmem:
* cmp ebp,00
* je *SB1*
* cmp ebp,01
* je *SB2*
* cmp ebp,02
* je *SB*
* cmp ebp,03
* je *plants*
* cmp ebp,04
* je *plants1*
* cmp ebp,05
* je *plants2*
* cmp ebp,06
* je *plants3*
* cmp ebp,07
* je *plants4*
* cmp ebp,08
* je *plants5*
* jmp originalcode
* *SB1*:
* mov ecx,1
* jmp 04877FB
* *SB2*:
* mov ecx,2
* jmp 04877FB
* *SB*:
* mov ecx,3
* jmp 04877FB
* *plants*:
* mov ecx,4
* jmp 04877FB
* *plants1:*
* mov ecx,5
* jmp 04877fb
* *plants2*:
* mov ecx,6
* jmp 04877fb
* *plants3*:
* mov ecx,7
* jmp 04877fb
* *plants4*:
* mov ecx,8
* jmp 04877fb
* *plants5*:
* mov ecx,9
* jmp 04877fb
* originalcode:
* cmp ebp,28
* je 4877B3
* exit:
* jmp returnhere
* 48778B:
* jmp newmem
* returnhere:
* [DISABLE]    【补充】0是灰色

#### 两个隐藏按钮

#如何开启Debug模式（使用后随机选择植物）

* 004837DA 改成je
* 004837B2 按钮<Debug模式>坐标

#让按钮<查看草坪>出现

* 0048397B 改成jo
* 00483989 改成jo
* 48392A 让按钮<查看草坪>出现坐标

#### 选卡界面出现隐藏植物

1. * 484adb （隐藏植物系列)
	* 484b7d
	* 4852bf
	* 485e00
	* 485e6e
	* 483e00的31改35
2. 453bff隐藏植物出现条件

就是这些

```
今天先写到这里

```

> *最终，我在梦境中连日落也看不清——By Sunset*
>
>