无尽场地

PvZ 的六大无尽场地分别是:白天 / 白昼 (Day)、夜晚 / 黑夜 (Night)、泳池 (Pool)、浓雾 / 雾夜 (Fog)、屋顶 (Roof)、月夜 (Moon);对应的生存无尽模式 (Survival: Endless) 分别简称为:DE、NE、PE、FE、RE、ME。

场地元素的称谓

横行称为“路”或“行”,从上到右称呼依次从 1 路开始递增;纵列称为“列”,从左至右称呼依次从 1 列开始递增。

对前院和屋顶场地,1、5 路称为边路,2、4 路称为旁路,3 路称为中路。

对后院场地,1、2、5、6 称为陆路,1、6 路称为边路,2、5 路称为岸路,3、4 路称为水路。

场地的坐标表示

游戏窗口分辨率:800 * 600;左上角坐标为 (0, 0),右下角坐标为 (799, 599)。

格子的尺寸:所有场地每个格子的宽度均为 80(第 n 格的右边线横坐标 = 80 * n);前院场地格子高度为 100,后院和屋顶场地格子高度为 85。

格子坐标:可表示为(r, c),其中 r 为行数,c 为列数。植物一般可由此表示;特别地,占两格的玉米加农炮的坐标由左侧一格指代。而僵尸坐标:具有横坐标连续(但严格地,最小元为 1px)、纵坐标离散(路)的特点,因此引出:

像素坐标:可表示为(x, y)。

r – c 坐标与 x – y 坐标具有以下换算关系:

前院场地:

$$ \begin{cases} x = 80 \times c \\ y = 40 + 100 \times r \end{cases} $$

后院场地:

$$ \begin{cases} x = 80 \times c \\ y = 55 + 85 \times r \end{cases} $$

屋顶场地:

$$ \begin{cases} x = 80 \times c \\ y = 45 + 85 \times r & c>=6 \\ y = 45 + 85 \times r + 20 \times \left( 6-c \right) & 其他\end{cases} $$

注意:转换时为了更精确,路数和列数都可用小数,但最终得到的像素坐标必须取整。

白天场地和夜晚场地

白天场地即 DE、PE、RE;夜晚场地即 NE、FE、ME。

天降阳光

白天场地有天降阳光,且掉落间隔满足公式:

$$ 掉落间隔 = min {已掉落阳光数量 \times 10 + 425, 950 } + rand ( 275 ) $$

亦即:刚开局时掉落较快,掉落 52 个之后间隔稳定在 950 ~ 1224 范围内。

夜晚场地无天降阳光。

蘑菇与咖啡豆

白天场地中,蘑菇需用咖啡豆唤醒;夜晚场地中,蘑菇可直接种植并生效,无需咖啡豆。

NE 无冰车、NE 墓碑和 FE 浓雾

NE 不出冰车——这极大方便了垫材的使用。

NE 墓碑:关底(W20)前五列(5 – 9 列)随机一格冒出一块墓碑,且已存在的每块墓碑下会冒出一只僵尸(普僵 / 路障);场上最多 12 块墓碑,墓碑未满且前场没空位则随机顶掉植物(玉米炮顶掉前轮不受影响,即“压碑”)。

FE 浓雾:即前场(6 – 9 列)有浓雾覆盖(6 列较浅),可用三叶草临时吹走 / 用灯笼照亮 / 用火树照亮(仅小片十字区域)。

前院场地、后院场地和屋顶场地

前院场地即 DE、NE;后院场地即 PE、FE;屋顶场地即 RE、ME。前院和屋顶场地尺寸为 5 9;后院场地尺寸为 6 9。

后院水池和珊瑚三人组

水池:后院场地中间两路为水池,陆生植物需种在睡莲上;水路出特有僵尸:鸭子、潜水、海豚;水池特有珊瑚三人组:即关底(W20)水路 6 – 9 列随机出现三只僵尸(普僵 / 路障 / 铁桶),在需特别考虑其威胁的阵型中,可冰消或灰烬处理。

屋顶花盆、斜坡、空降三人组和玉米炮的误差

屋顶植物需种在花盆上;屋顶场地不出矿工 / 舞王(常识上可以理解,因为它们需要从土里冒出,而屋顶没有土)。

斜坡:屋顶场地后场五列(1 列 – 5 列)为斜坡。射手类植物的子弹被前一列斜坡挡住(仙人掌被 5 列挡住);反向子弹会因斜坡打不中僵尸(火豌豆除外);斜坡上不会留冰道。

空降三人组:屋顶场地关底(W20)前五列(5 – 9列)随机三格由蹦极送下三只僵尸(普僵 / 路障 / 铁桶)

屋顶场地玉米加农炮的飞行时间和落点会随列数波动。另外还有一个被称为“上界之风”的现象:疑似游戏 bug,即屋顶底线玉米炮打不准,只能炸两行的步行僵尸及三行的巨人 / 小鬼 / 冰车 / 气球 / 跳跳

出怪规则

僵尸的等价和伴随关系

等价关系

选怪里的一个选项,实际表现为多种形象。如水路的鸭子僵尸,其实是普僵 / 路障 / 铁桶出现在水路所分别对应的特殊形态,比如若后院出怪有铁桶,则水路的铁桶表现为铁桶鸭子,二者共享“铁桶”这一选怪类别的列表容量。

注:两种僵尸有种间等价关系不代表它们代号相同。

伴随关系

一种僵尸的出现,需跟随或依赖其他僵尸,不参与选怪。如伴舞必须在舞王召唤后出现、小鬼必须靠巨人投出、雪橇小队(无尽不出)必须行驶于冰车的冰道。

选怪

选怪的选项共有 33 个,对应 PvZ 各模式所有 33 种僵尸的代号(在无尽中并非每种僵尸都有机会出场)。这些选项对应位于 [[[6a9ec0] +768] +54d4] 开始的连续 33 个 bool 类型的地址。

选怪规则

每次选怪将出现 9 – 11 种僵尸(但由于种间伴随与包含关系,实际种数显然更多)。

选怪需先满足场地特性(见 1.3 和 1.4),这决定了可出怪类型数 m 的值。

普僵必选。

无尽第一次选卡出普僵、路障、铁桶;已完成旗帜数小于 4 时不出白眼 / 冰车;已完成旗帜数小于 10 时不出红眼。

若冒险模式已达到二周目 4 – 10,则无尽可选雪人。

不选旗帜(包含于普僵);不选鸭子(等价于普僵 / 路障 / 铁桶);不选伴舞(伴随舞王);不选小鬼(伴随巨人);

不选雪橇小队;不选僵博;不选植物僵尸。

选怪概率

令可出怪类型数为 m,剩余出怪类型数为 n,则选怪概率满足以下规则:

有 20% 的概率出读报,否则在这个位置出路障(两者中落选的也可能在后续选择剩下种类时被选中)。

除普僵 + 读报 / 路障外剩余出怪类型数为:

$$ \min {完成选卡次数+1, 9 } $$

普僵 / 路障 / 读报 / 其他僵尸出现的概率分别为:

$$ 1、 0.8 + 0.2 \times \dfrac{n}{m}、 0.2 + 0.8 \times \dfrac{n}{m}、\dfrac{n}{m} $$

僵尸类型总数为 9 / 10 / 11 的概率分别为:

$$ \dfrac{n \times (n-1 )}{m \times (m-1)}、\dfrac{n \times (m-n) \times 2}{m \times (m-1)}、 \dfrac{(m-n) \times (m-n-1) }{m \times (m-1)} $$

六大场地的 m 取值依次为 18 / 17 / 20 / 20 / 16 / 16,n 从第九次选卡开始取值为 9,计算可得下表:

普僵 路障 读报 其他 9 种 10 种 11 种
DE 1 90.00% 60.00% 50.00% 23.53% 52.94% 23.53%
NE 1 90.59% 62.35% 52.94% 26.47% 52.94% 20.59%
PE 1 89.00% 56.00% 45.00% 18.95% 52.11% 28.95%
FE 1 89.00% 56.00% 45.00% 18.95% 52.11% 28.95%
RE 1 91.25% 65.00% 56.25% 30.00% 52.50% 17.50%
ME 1 91.25% 65.00% 56.25% 30.00% 52.50% 17.50%

随机数生成器算法为 MT19937,种子由以下几个数值相加:

[[[6a9ec0] +82c] +20]              // 用户序号
[[[6a9ec0] +768] +561c]            // 出怪种子
[[[[6a9ec0] +768] +160] +6c] * 65  // 完成选卡次数 * 101
[[6a9ec0] +7f8]                    // 游戏模式

——经过满足以上规律的伪随机过程后,本次选卡要出的僵尸类型被依次决定。

慢速关、变速关、快速关

慢速关一般指同时出红眼、白眼的关卡。因每波僵尸总血量较大,激活刷新较慢且下半场不会因红眼消失而变速得名。

快速关一般指无巨人的关卡,每波僵尸总血量较低,在自然输出较高的阵型(如水路顶满构型、边路加速构型等)中刷新极快,加速了对存冰、灰烬、南瓜等的消耗,提高了运阵压力。而极速关尤指铁桶 / 冰车等血量相对较高的僵尸较少而全是高速脆皮僵尸的快速关。

变速关一般指有红眼、无白眼的关卡。从 W11 开始的某一波后,红眼不再出现在普通波(仅 W20 重新出现),每波僵尸总血量下降、刷新阈值降低(刷新变快)。

红眼关的各种概率的参考数值如下(数据来自 植僵百科知识 – 植僵工具箱 ) :

红眼关概率:0.449391

红眼关每波出红概率:

波次 概率 波次 概率
1 0.975322 11 0.641114
2 0.975378 12 0.489569
3 0.975634 13 0.345826
4 0.975364 14 0.227808
5 0.975342 15 0.139364
6 0.975313 16 0.0801017
7 0.975184 17 0.0431896
8 0.97404 18 0.0219252
9 0.968664 19 0.0103585
10 1 20 1

红眼关自然全红概率:0.00149536

旗帜波平均红眼数:12.9391

非旗帜出红波平均红眼数:3.62818

每轮平均红眼总数:64.95187

出怪列表

出怪列表作为数组

出怪列表决定了选出来的各种僵尸最终的数量与出场顺序。

出怪列表即每次选卡中要出现的每只僵尸组成的列表(相当于数组);每种僵尸对应一个级别和一个权重数据(详见下文),而数组的每一个元素由可出的僵尸种类按权重加权随机后算得。

旗帜波固定先出 1 只旗帜和 8 只普僵;有红眼的关卡,出完 50 只红眼(不是全部出完)后不再继续出红眼(即所谓的“变速关”,变速之后仅旗帜波可以继续出红眼,旗帜波红眼数计入其中但不受变速影响)。

容量上限

出怪列表容量上限为 1000 只,对应位于 [[[6a9ec0] +768] +6b4] 开始的连续 1000 个 int_32 类型的地址。前期实际僵尸数会少于 1000,理论上 125f 后、实际约 42 次选卡(84f)后列表将被填满(数据来自 植僵百科知识 – 植僵工具箱 ),称之为出怪饱和。

出怪列表被划为 20 段,每段数量容量上限为 50(不含伴舞 / 小鬼),分别对应选卡的每一波。僵尸逐波按列表顺序刷出。

每波出怪还受另一条件约束,即:每波僵尸的级别总和不超过该波级别容量上限

每波级别容量上限满足公式:

$$ 级别容量上限 = int(\dfrac{int ( (当前波数+已完成选卡数 \times 每轮总波数 ) \times 0.8 )}{2} ) +1 $$

大波再乘以 2.5 并取整。

计算后不难得知:前期级别容量不够用,大多数波次处在被填满的状态;后期每波即使满 50 只了级别容量依然有富余,但由于列表区段的限制,50 即为每波实际容量上限。

级别和权重的数值

前文所提到的级别和权重的计算规则和详细数值如下:

权重调整:非大波红眼权重 1000;10f 之后普僵 / 路障每轮 -180 / -150, 50f 之后为 400 / 1000。

设僵尸代号为 i,则每种僵尸的级别对应地址为 [0x0069da88 + i * 0x1c],权重对应地址为 [0x0069da94 + i * 0x1c]

各种僵尸的代号、级别和权重见下表:

名称 代号 级别 权重
普僵 0 1 4000
旗帜 1 1 0
路障 2 2 4000
撑杆 3 2 2000
铁桶 4 4 3000
读报 5 2 1000
铁门 6 4 3500
橄榄 7 7 2000
舞王 8 5 1000
伴舞 9 1 0
鸭子 10 1 0
潜水 11 3 2000
冰车 12 7 2000
雪橇 13 3 2000
海豚 14 3 1500
小丑 15 3 1000
气球 16 2 2000
矿工 17 4 1000
跳跳 18 4 1000
雪人 19 4 1
蹦极 20 3 1000
扶梯 21 4 1000
投篮 22 5 1500
白眼 23 10 1500
小鬼 24 10 0
僵博 25 10 0
豌豆 26 1 4000
坚果 27 4 3000
辣椒 28 3 1000
机枪 29 3 2000
窝瓜 30 3 2000
高坚果 31 4 2000
红眼 32 10 6000

刷新规律

选卡与波次

每次选卡(一关 / 2f)共 20 波僵尸,上半场 9 波、下半场 10 波、关底 1 波;W10、W20称为旗帜波 / 大波,其余称为普通波。

刷新倒计时

刷新真空:触发刷新条件后 200 刷新下一波僵尸,这段时间即“刷新真空”;刷新真空是计入本波波长的。

每关开场倒计时:600(第一次选卡为1800);游戏开始后从 599 减至 1 后刷出 W1。

普通波刷新倒计时:2500 + rand(600) ;倒计时减少至 1 或本波僵尸总血量 ≤ 刷新激活血量后,进入刷新真空,之后刷出下一波。

自然上限:普通波波长至少为 601。 即本波刷出至少 401 才可能激活下一波刷新,进入刷新真空。

W9 / W19 刷新时,倒计时从 4500 开始减少。

  • 若自然减少至 200 或本波刷出至少 401 时将本波僵尸(除伴舞)全部消灭,则进入一段时长同样为 200 的“伪刷新真空”。
  • 这个 4500 的倒计时减少至 5 时显示红字,此时倒计时被另一地址接管,它从 750 开始减少。25cs 后最初的倒计时变为 4 并停止,新的倒计时从 725 减少至 0 后刷出旗帜波。即:W9 / W19 激活伪刷新真空后最多能拖 945,W9 / W19 收尾理论最多能拖 4300 + 945 = 5245。
  • 视觉红字约在刷出前 85 消失。

W20 刷新时,倒计时从 5500 开始减少。

  • 若自然减少至 0 或本波刷出后僵尸全部被消灭,则立即激活白字(不受伪自然上限约束)。
  • 白字显示 500 后结束本次选卡,并将倒计时重置为 600。

刷新激活血量和僵尸血量计算方式

刷新激活血量为本波总血量的 0.50 – 0.65 倍。若本波僵尸总血量小于此值且刷出至少 401,则立即激活刷新,进入刷新真空。

本波僵尸总血量计算方式为:

$$ 本体血量 + I类饰品血量 + 0.20 \times II类饰品血量 $$

其中本体不包括:魅惑状态 / 已不存在 / 消失状态 / 变黑状态 / 秒杀状态 / 蹦极类型的僵尸;I 类饰品包括: 路障 / 铁桶 / 橄榄球帽 / 雪橇车 / 气球 / 矿工帽 / 僵尸坚果 / 僵尸高坚果;II 类饰品包括:报纸 / 铁栅门 / 扶梯。

与刷新相关的内存地址

6A9EC0
├┬768
│├―5564  // 本轮总波数
│├―5568  // 游戏时钟
│├―556C  // 游戏时钟(包括选卡时)
│├―557C  // 已刷新波数
│├―5594  // 刷新触发血量
│├―5598  // 本波总血量
│├―559C  // 刷新倒计时
│├―55A0  // 刷新倒计时初始值
│├―55A4  // 旗帜波刷新倒计时