砸率计算器
注意:此工具除了测试砸率,还可以测试炮伤、刷新意外率、跳跳等。
详见此。
太长不看:
直接戳 https://marketplace.visualstudio.com/items?itemName=Crescendo.seml

什么是砸率计算?
如某不知名专栏中所述,砸率主要有以下几种(朴素砸率就别提了):
1级:极端值零砸率——最快的巨人不会砸
2级:个体零砸率——考虑单个巨人,不论出生点和途中速度如何,都不可能砸
3级:群体零砸率——考虑(无穷)多个巨人,不论出生点和途中速度如何,都不可能砸
虽是2年多前的定义,但放到今天也还算好用。
对于极端值砸率,直接使用速度计算器即可,还不会的可以戳蓝链学习。
绝大多数垫材存活充分时间的情况下,极端值砸率是【够用】的。但在一些场合,如垫材需提前铲的,或是施垫时机过于诡异的,就可能存在【没被垫到的巨人】反而成为最大威胁的情况。这也就是神秘的【群体砸率】了,也是砸率计算器着重解决的。

快速使用
Talk is cheap, show me how to use.
首先下载并安装 VSCode(教程略)。然后进入插件页,搜索“seml”并下载:

新建任意 “.seml”后缀的文件名,输入以下内容:
然后 Ctrl + Shift + P 呼出 VSCode 命令菜单,键入“测试砸率”后回车即可。

测试结果
其实测试结果是很好懂的,但这里还是解说一下。
点开生成的 .csv 文件:

上面的表是摘要:

一目了然,就是每波每路炮的砸率。注意所有砸率都指【单波砸率】,也就是每有5只红眼,某炮被砸的概率。以PDc为例,在每波5只红眼的出怪下,每波有~5%的砸率,每门炮有~1.25%的砸率。
之所以这样计算砸率,是为了和炮伤的计算方式保持一致。
下面的表是详细:

红框部分是玩家侧的操作。HIT 代表红眼受到此操作影响(被炮炸到,或被垫垫到),MISS代表未受影响。空白代表红眼尚未出生,或已死亡。
以砸率最高的这一行为例:

可以看到,这些(3303只)红眼的共同特点是被第一波垫材垫到,但未被第二波垫材垫到,必定砸炮。这也符合常识,因为PDc的砸率来源就是快速红眼在第二波下垫前就对炮举锤。

话说 Seml 是什么?
Seml 的全称是 Survival Endless Markup Language,是专为描述 SE 操作定制的标记语言。
它的语法结构是很简单的(从上面的例子就能看到),具体细节请参考 https://marketplace.visualstudio.com/items?itemName=Crescendo.seml.
PS:Seml 插件有语法高亮,且若格式错误则执行“测试砸率”命令时会有提示,所以不用担心“语法没搞懂写错了怎么办”之类的问题。

我想知道原理
对写程序没兴趣的同学可以叉叉了,后面都是纯技术讨论的部分。(
以上面给出的数据为例,总共测试了 999000 只红眼,耗时是多少呢?
答案是:耗时 12.98 秒, 使用了 32 个线程.
如果使用常规 AvZ 跳帧,由于游戏限制每波最多 50 只红眼,每次选卡就是 50*20 = 1000 只,要测 991 次选卡才行。一次选卡算它 3s 好了,那么就是要 991*3 = 2973s,即使 10 开(开 10 个 PvZ 进程)也要 297.3s,这还没算上 10 开其实并不是简单的效率*10,而是会有折扣。
换句话说,砸率计算器的运行效率是 AvZ 跳帧的 ~100倍左右,拉开了 2 个数量级的差距。
这是怎么做到的?这就要感谢二代技术党 testla 在 2020 年编写的 PvZ-Emulator (https://github.com/dnartz/PvZ-Emulator)。他通过 IDA 反编译 PvZ,复写了游戏里与 SE 相关的所有逻辑,作为可调用的 C++ 静态库。由于免去了所有和更新游戏数据无关的内容,其运行效率比所有基于 PvZ 原版的测试框架都要快许多。砸率计算器便是基于此实现的。
据他本人说他当年是用这个训练无炮的,也就是真·智能无炮,在基本不设定规则的情况下让模型自行学习打无炮的最佳方式(这也是当年智能无炮的设想,而不是现在常见的“键控”无炮),不过这就是另一件事了,暂且不表。
当然,使用者应该注意,这不代表 PE 是没有 bug 的,因此测试数据前,尽可能先测已有历史数据的(如 PDc 砸率,在历史上也认为是 5% 左右,因此可以认为砸率计算器基本没有问题),然后再测新的场景。就砸率计算而言,因为全程只是模拟巨人行动,所以出问题的概率虽然存在但应该不大。遇到 bug 欢迎反馈。

其它
基于 PE,笔者已经写了测试时空数据(坐标极值),测试全收跳跳落点,以及测试刷新概率的程序,均与旧有数据一致,相关源码公开于 https://github.com/Rottenham/pvz-emulator-examples。使用这些的门槛比砸率计算器稍高写,需要你懂 git 并配有 C++ 编译环境。
之后有计划将这些测试也内置进 seml,使得可以基于 seml 文件一键测试,敬请期待咯。除此之外,PE 可以解决的问题还有很多,砸率炮伤刷新都能测,技术党不再开游戏指日可待。(