關(guān)于出怪列表的填充:級(jí)別容量上限、固定出怪、無(wú)限制出怪……
本文在多個(gè)平臺(tái)發(fā)布,不同平臺(tái)內(nèi)容有細(xì)微差別:
植吧:https://tieba.baidu.com/p/8229511229
Word文檔:https://docs.qq.com/document/DRGRDRWpNV2Vjdm9I
Excel表格:https://docs.qq.com/document/DRGxPVVlZSnRKdXdC
大家應(yīng)該都看過(guò)PT站上的資料吧,那個(gè)有些問(wèn)題的。


在探究冒險(xiǎn)模式和各個(gè)非EL關(guān)卡的過(guò)程中,發(fā)現(xiàn)“級(jí)別容量上限”并非在所有關(guān)卡中都符合這一規(guī)律。借助“級(jí)別上限”,本文將對(duì)各關(guān)出怪列表填充的機(jī)制進(jìn)行簡(jiǎn)單的分析。
注1:以下內(nèi)容未使用反匯編,全部使用修改器+不完全歸納得出,加上up和寶開都存在犯傻的可能,因此并不能保證絕對(duì)正確,大家有發(fā)現(xiàn)問(wèn)題歡迎反應(yīng)。
注2:本文全部使用英文原版1.0.0.1051,對(duì)其他版本不負(fù)責(zé)。

目錄
零、推薦閱讀
一、輔助工具說(shuō)明
二、級(jí)別容量上限
? ? 2.1 第一類
? ??2.2 第二類
? ??2.3 混合類
? ??2.4 特殊說(shuō)明
? ??? ??2.4.1 一周目1-1~1-3、1-5
? ??? ??2.4.2 誰(shuí)笑到最后
? ??? ??2.4.3 一/二周目5-5、蹦極閃電戰(zhàn)
? ??2.5 關(guān)卡一覽
三、固定出怪
? ??3.1 (冒險(xiǎn)模式)新僵尸
? ??3.2 (冒險(xiǎn)模式)最后一波出所有僵尸
? ??3.3 (所有模式)旗幟波出普僵旗幟
? ??3.4 特殊情況
? ??? ??3.4.1 一周目1-1
? ? ? ? 3.4.2 二周目1-5
? ??? ??3.4.3?一/二周目5-5、蹦極閃電戰(zhàn)
? ??? ??3.4.4?植物僵尸、植物僵尸2
? ??? ??3.4.5?你看,他們像柱子一樣
? ??? ??3.4.6?誰(shuí)笑到最后
? ??3.5 順序... 15
四、無(wú)限制出怪
? ??4.1 幾則實(shí)驗(yàn)
? ??4.2 出怪規(guī)律
? ??4.3 具體列表
? ??? ??4.3.1 跳跳舞會(huì)
? ??? ??4.3.2 空襲
? ??? ??4.3.3 雪橇區(qū)
五、下期預(yù)告
?

零、推薦閱讀
標(biāo)題:這兩天研究了一下PVZ的出怪機(jī)制
鏈接:https://tieba.baidu.com/p/2306159144
標(biāo)題:【火星向】分析冒險(xiǎn)6-49為什么有豌豆射手僵尸
鏈接:https://tieba.baidu.com/p/6134448446
標(biāo)題:刷怪相關(guān)數(shù)據(jù)記錄/研究
鏈接:https://tieba.baidu.com/p/6437868025
標(biāo)題:【無(wú)盡開局出怪規(guī)律科普】你知道多少輪以后出怪飽和嗎?
鏈接:https://tieba.baidu.com/p/7861483105
PT站百科
鏈接:https://pvz.tools/wiki/#出怪規(guī)律

一、輔助工具說(shuō)明
使用到的輔助工具有:
1. PT:可以修改出怪種類(會(huì)默認(rèn)選擇普僵);可以顯示w1~20的出怪種類和數(shù)量(PTK只能顯示SE的出怪)。
2.?v1.9:可以修改出怪種類(可以不選擇普僵)。
3.?WPF:可以顯示出怪列表;可以修改出怪種類(會(huì)默認(rèn)選擇普僵);可以顯示所有波的具體出怪列表(即在列表中的順序也能看到)。
其他跳關(guān)、自收、后臺(tái)、倍速等功能與本文關(guān)系不大,略去。
?
關(guān)于輔助工具的一些事:
1.?正常狀態(tài)下出怪列表中普僵似乎是不可更改的?

不過(guò)v1.9的確可以做到不選普僵,并且會(huì)導(dǎo)致一個(gè)神奇的現(xiàn)象:
正常來(lái)說(shuō)只有普僵和豌豆級(jí)別是1(權(quán)重為0的不計(jì));如果出怪沒有這兩種僵尸,可能因?yàn)榍皫撞?jí)別上限為1的就沒法填了,會(huì)把出怪列表中序號(hào)最小的僵尸的級(jí)別變?yōu)?。
這個(gè)推測(cè)是v1.9的效果而非游戲本身的機(jī)制:如果用WPF挑一個(gè)無(wú)普僵、無(wú)豌豆關(guān),并修改出怪種類,得到的并不是這樣的效果(下文“無(wú)限制出怪”會(huì)講);如果挑的是無(wú)普僵、有豌豆關(guān),會(huì)直接閃退。
//(來(lái)自xiao_He)后來(lái)發(fā)現(xiàn)就是作者為了防止閃退故意添加的:

2.?關(guān)于“波數(shù)”,絕大部分地方都是從1開始的,即我們平時(shí)所說(shuō)的第x波,但是(目前發(fā)現(xiàn))有兩處例外,是從0開始的(即內(nèi)存中的數(shù)值,沒有+1):
一處是ShowMe的“僵尸所在波數(shù)”:

還有一處是級(jí)別容量上限公式中的“當(dāng)前波數(shù)”:
可以用w3驗(yàn)證一下:
w3(3):int(int(3*0.8)/2)+1=2
w3(2):int(int(2*0.8)/2)+1=1
下文“波數(shù)”均指平時(shí)所說(shuō)、從1開始的波數(shù)。
//(來(lái)自u(píng)int8_t)補(bǔ)充:
/*
出怪列表可以自行在內(nèi)存中讀取,但是未填充到的部分會(huì)有垃圾數(shù)據(jù)殘留在里面。因此要在同時(shí)讀取每波的總出怪?jǐn)?shù)。
地址表:十六進(jìn)制[[[6a9ec0h]+768h]+ 6b4h],從這個(gè)地址開始的2000個(gè)的數(shù)據(jù),每個(gè)數(shù)據(jù)是unsigned int。其中存放的是僵尸的編號(hào),每50個(gè)數(shù)組一組,為一波的出怪,共可容納40波。
*/
/*
(來(lái)自xiao_He)有時(shí)候用PT讀取冒險(xiǎn)的出怪會(huì)看到w10以后群魔亂舞,就是因?yàn)橹按蜷_其他關(guān)卡留下的出怪記錄沒有刪去。
另外游戲到底是如何得知本次出怪列表取到哪一位的,暫不知曉。
*/

二、級(jí)別容量上限
不考慮多次選卡,PT站的那條公式可以簡(jiǎn)化為:
用這個(gè)公式可以得到w20的級(jí)別容量上限是20,但是實(shí)際上發(fā)現(xiàn)不全是這樣,哪怕是大家最最最最最熟悉的生存無(wú)盡:

w20:12+1+2*2=17≠20。
看來(lái)需要重新統(tǒng)計(jì)一下了……
?
咳,先說(shuō)一下統(tǒng)計(jì)級(jí)別容量上限的方法。第一種是腳本統(tǒng)計(jì)。
第二種,針對(duì)不會(huì)寫腳本的人,前20w可以將出怪設(shè)置為只有普僵,再用PT查看,這樣普僵的數(shù)量就是級(jí)別容量上限(因?yàn)樘厥獬龉?,其?shí)還需要加上一些,但反正是輕松了不少);
20w以后PT就不管用了,在PT更新之前只能用WPF讀取,WPF沒有直接的統(tǒng)計(jì),需要一個(gè)個(gè)數(shù),推薦出怪設(shè)置為普僵和巨人(白/紅眼均可),普僵每只級(jí)別1、巨人每只級(jí)別10。
?
經(jīng)探索發(fā)現(xiàn)游戲中有兩類級(jí)別容量上限:
第一類公式:每波容量上限 = int(int((當(dāng)前波數(shù)) * 0.67~0.68) / 2) + 1。

第二類公式:每波容量上限 = int(int((當(dāng)前波數(shù)) * 0. 8) / 2) + 1。

一個(gè)很簡(jiǎn)單的分辨方法:看開頭,如果是aaabbbccc就是第一類,如果是aaabbccc就是第二類。
此外還有將兩類混合起來(lái)的混合類,還有若干變式,下面詳解:
?
2.1 第一類
基礎(chǔ)公式:每波容量上限 = int(int((當(dāng)前波數(shù)) * 0.67~0.68) / 2) + 1,大波再*2.5。

那個(gè)參數(shù)是0.67或0.68得到的結(jié)論是一樣的:

也可以簡(jiǎn)單地記為“每3波增加1”。
?
此外部分關(guān)卡會(huì)在此基礎(chǔ)上進(jìn)行翻倍,普通波會(huì)全部翻x倍;旗幟波則是加法,w10/20/30每加一倍分別增加5/9/16,具體公式尚未找到。
普通波翻2倍:

適用關(guān)卡:一周目5-5、蹦極閃電戰(zhàn)、隱形食腦者、保護(hù)傳送門、你能挖了它嗎。
?
普通波翻3倍:

適用關(guān)卡:一周目x-10。
?
普通波翻4倍:

適用關(guān)卡:一周目1-5、二周目1-5、堅(jiān)果保齡球、堅(jiān)果保齡球藝術(shù)錦標(biāo)賽、一周目3-5、小僵尸大麻煩。
?
普通波翻6倍:

適用關(guān)卡:你看,他們像柱子一樣
2.2 第二類
基礎(chǔ)公式:每波容量上限 = int(int((當(dāng)前波數(shù)) * 0.8) / 2) + 1,大波再*2.5。

也可以簡(jiǎn)單地記為“每10w的第1、4、6、9波增加1”。
?
翻倍后如下,旗幟波w10/20/30每加一倍分別增加是5/11/21。
普通波翻2倍:

適用關(guān)卡:二周目5-5。
?
普通波翻3倍:

適用關(guān)卡:二周目x-10。
?
普通波翻4倍:

適用關(guān)卡:二周目3-5。
?
2.3 混合類
生存模式(包括簡(jiǎn)單、困難、無(wú)盡),第一次選卡(1~20w)按照第一類公式出怪,之后(>w20)按照第二類公式出怪。
?
2.4 特殊說(shuō)明
2.4.1 一周目1-1~1-3、1-5
一周目1-1:

一周目1-2:

一周目1-3:

一周目1-5:

其實(shí)都是符合前面的結(jié)論的,只是比較特殊就單拿出來(lái)了,1-1的w4沒有旗幟僵尸、容量上限也沒有*2.5(否則就是2*2.5=5了)。
?
2.4.2 誰(shuí)笑到最后

顯然是從常規(guī)第二類的w11開始的。
?
2.4.3 一/二周目5-5、蹦極閃電戰(zhàn)
見下文“固定出怪”部分。
?
2.5 關(guān)卡一覽
其實(shí)前面寫過(guò)一遍了……再放在一起寫一遍,方便查閱。
具體關(guān)卡和對(duì)應(yīng)的公式參數(shù)、倍數(shù)如下:


三、固定出怪
使用v1.9將出怪種類設(shè)置為原本不會(huì)出現(xiàn)的僵尸,就可以得到每一波的“固定出怪”。
絕大多數(shù)情況下,這些“固定出怪”滿足以下特點(diǎn):
不管“固定出怪”的僵尸在不在本關(guān)出怪種類中,總是會(huì)先填充進(jìn)出怪列表。此時(shí)如果已經(jīng)達(dá)到或超過(guò)級(jí)別容量上限,則不會(huì)繼續(xù)出怪(一周目很多關(guān)卡的w11和w20光是把固定出怪填完就滿了);若是沒有達(dá)到,則會(huì)繼續(xù)填充。
至于為什么是“絕大多數(shù)情況下”,因?yàn)橛幸粋€(gè)例外,5-5和蹦極閃電戰(zhàn)。
?
測(cè)試方法:使用v1.9將出怪種類設(shè)置為本關(guān)不會(huì)出現(xiàn)的僵尸(如紅眼),剩下還黏在出怪列表中的就是固定出怪了。
?
固定出怪大致分為4種情況:
(冒險(xiǎn)模式)新僵尸
(冒險(xiǎn)模式)最后一波出所有僵尸
(所有模式)旗幟波出普僵旗幟
特殊情況
3.1 (冒險(xiǎn)模式)新僵尸
一、二周目都有,本關(guān)如果有新出的僵尸,會(huì)選擇其中序號(hào)最小的(如3-6新出冰車和雪橇小隊(duì),會(huì)選擇冰車)進(jìn)行填充,在第 總波數(shù)/2+1 波和最后一波各有一只,特例如下:
氣球、礦工固定于w7和w20(Final Wave)各出一只,一、二周目都是,而不是第 總波數(shù)/2+1 波;
6-49會(huì)出豌豆射手僵尸;//(來(lái)自u(píng)int8_t)實(shí)際上這不是“特例”,只是由于豌豆編號(hào)的特殊性導(dǎo)致的bug,豌豆的編號(hào)正好在6-49,符合規(guī)律((( //(來(lái)自xiao_He)確實(shí)比較特殊嘛。
雪人只會(huì)固定出現(xiàn)于二周目4-10的w16,w30沒有,且擊殺后退出重進(jìn)一次就不會(huì)出現(xiàn)了(重進(jìn)兩次就可以了)。
一、二周目1-1都不會(huì)因?yàn)檫@個(gè)固定于w3和w11生成普僵,1-3的路障是符合的。
話說(shuō)紅眼會(huì)不會(huì)出現(xiàn)啊?
?
3.2 (冒險(xiǎn)模式)最后一波出所有僵尸
一、二周目都有,迷你游戲和生存沒有,最后一波會(huì)先把本關(guān)出怪種類列表中(除雪人僵尸外)所有(權(quán)重不為0的)僵尸都出一只。
?
當(dāng)然這會(huì)與“新僵尸”和“旗幟波出普僵旗幟”重疊,重疊起來(lái)就不用再出一遍了。
并且從6-49可以看出,新僵尸會(huì)出在最后一波是“新僵尸”導(dǎo)致的,而不是(至少不只是)“最后一波出所有僵尸”,因?yàn)橥愣股涫纸┦⒉辉诔龉址N類列表中,卻仍然會(huì)出現(xiàn)在最后一波。
?
順便一提,使用WPF修改出怪種類列表,再用PT修改出怪種類,可以發(fā)現(xiàn)最后一波的固定出怪也會(huì)發(fā)生改變。推測(cè)是兩種修改器改的地方不同,具體什么原因就不清楚了。
?
3.3 (所有模式)旗幟波出普僵旗幟
大名鼎鼎的“大波固定出8普僵1旗幟”,實(shí)際上稍微復(fù)雜一點(diǎn)。這個(gè)和級(jí)別容量上限是有關(guān)的,具體公式推不出來(lái)。
第一類上限:

第二類上限:

這也是個(gè)快速判斷級(jí)別容量上限類別的方法……
?
另外,部分迷你游戲在w40后會(huì)重復(fù)w40的出怪,我稱之為w41+,w41+固定出9普僵,就是那個(gè)旗幟換成了普僵。
?
3.4 特殊情況
3.4.1 一周目1-1
一共4波,上限分別為1,1,1,2,且w4固定出1普僵,至于這個(gè)普僵具體屬于“旗幟波出普僵旗幟”還是“最后一波出所有僵尸”,傾向于后者,因?yàn)闆]出旗幟。
當(dāng)然這個(gè)不需要糾結(jié),因?yàn)?-1只會(huì)出普僵嘛。
3.4.2 二周目1-5
出怪列表中有普僵、路障、撐桿、鐵桶、讀報(bào),但是最后一波固定出怪只有普僵、旗幟、路障。
?
3.4.3?一/二周目5-5、蹦極閃電戰(zhàn)
除最后一波外,前面的旗幟波固定出且只出5只蹦極,普僵旗幟都不出了。
最后一波先填沖5只蹦極,再填充普僵旗幟等出怪:

這是隱形食腦者的出怪,一類2倍:

w20級(jí)別容量上限26。
這是一周目5-5的出怪,一類2倍:

w20不計(jì)蹦極的級(jí)別容量上限:15+1+2+4+4=26。
可見蹦極根本不占級(jí)別。
?
再看蹦極閃電戰(zhàn),一類2倍,共30w:

5只蹦極的總級(jí)別5*4=20<26,即使容量沒有填滿(實(shí)際上前面有說(shuō),蹦極根本不占級(jí)別),也不會(huì)生成其他僵尸。
5-5最后一波照常所有僵尸固定出1只,最后一波普僵、旗幟照出,空降三人組照出不誤。
?
3.4.4?植物僵尸、植物僵尸2
普僵旗幟都不出了,沒有任何固定出怪。
?
3.4.5?你看,他們像柱子一樣
w6/16/26:先固定出10扶梯,(如果沒填滿的話)再出其他僵尸;
w9/19/29:先固定出10小丑,(如果沒填滿的話)再出其他僵尸;
w10:4普僵+1旗幟;
w20:7普僵+1旗幟+3巨人;
w30:8普僵+1旗幟+5巨人。
?
實(shí)際游戲中,開場(chǎng)就已經(jīng)是w9了,會(huì)從w10開始出怪,然后w16固定出且只出10扶梯,w19起就會(huì)有其他僵尸了。

另外,巨人在出怪列表中的位置是在旗幟之后的:

3.4.6?誰(shuí)笑到最后
總是固定出8普僵+1旗幟……其實(shí)完全符合前面的結(jié)論的。
?
3.5 順序
如圖,一周目1-8:

(蹦極閃電戰(zhàn)的蹦極)→普僵→旗幟→(柱子關(guān)的巨人,與后面兩條具體順序不明)→新僵尸→所有僵尸。
“所有僵尸”這一欄應(yīng)該是按照僵尸序號(hào)的,圖為一周目5-9:

最后提一句,使用v1.9設(shè)置無(wú)普僵出怪,設(shè)置的出怪級(jí)別會(huì)變?yōu)?,但是固定出怪中的該種僵尸仍是正常的,因此推薦設(shè)置為關(guān)卡內(nèi)不會(huì)出現(xiàn)的僵尸(如紅眼):



四、無(wú)限制出怪
對(duì)于出怪種類列表中沒有級(jí)別為1且權(quán)重不為0的僵尸的關(guān)卡(就稱為“無(wú)普僵關(guān)”吧),使用的是另一套出怪方式,經(jīng)驗(yàn)證應(yīng)該就是WPF中的“無(wú)限制出怪”。
?
4.1 幾則實(shí)驗(yàn)
實(shí)驗(yàn)一:
使用WPF將植物僵尸的出怪設(shè)置為扶梯+投石車,會(huì)閃退;
將植物僵尸的出怪設(shè)置為豌豆+投石車,可以正常進(jìn)行;
將雪橇區(qū)的出怪設(shè)置為扶梯+投石車,可以正常進(jìn)行。

結(jié)論:植物僵尸并不屬于“無(wú)普僵關(guān)”,雖然它的確沒有普僵。
?
實(shí)驗(yàn)二:
在選卡界面,使用WPF更改出怪,當(dāng)前界面不會(huì)發(fā)生改變,退出重進(jìn)后會(huì)改變;
在選卡界面,使用PT/PTK/v1.9更改出怪,當(dāng)前界面發(fā)生變化,退出重進(jìn)后仍是改變前的樣子。
結(jié)論(推測(cè)):游戲中有兩套“出怪種類列表”,一套與對(duì)應(yīng)關(guān)卡綁定(WPF改變的),一套決定當(dāng)前的出怪(PT改變的)。這個(gè)應(yīng)該是現(xiàn)有結(jié)論了吧……
?
實(shí)驗(yàn)三:
正常打開跳跳舞會(huì),用PT觀察出怪:

使用v1.9將出怪列表設(shè)置為只有跳跳,用PT觀察出怪:

發(fā)現(xiàn)兩者不同(開頭就有提到,v1.9造成的這一效果應(yīng)該是獨(dú)屬于修改器的bug),再使用WPF修改,發(fā)現(xiàn)出怪正常。
結(jié)論:無(wú)普僵關(guān)并不按照常規(guī)的“自然出怪”進(jìn)行,v1.9設(shè)置出怪種類+使用自然出怪一條龍服務(wù)導(dǎo)致出錯(cuò),WPF只設(shè)置出怪種類而正常。
?
4.2 出怪規(guī)律
相比于自然出怪,無(wú)限制出怪有兩處不同:
各波的級(jí)別容量上限和僵尸的級(jí)別均未改變,改變的僅僅是出怪方式:
當(dāng)剩余級(jí)別容量>0時(shí),可以加入任何僵尸(原本需要加入僵尸后剩余級(jí)別容量仍然≥0),直至剩余級(jí)別容量≤0,停止填充。
出怪不受僵尸階數(shù)限制。
下面再把具體出怪情況列一下:
4.3 具體列表
4.3.1 跳跳舞會(huì)

4.3.2 空襲

(PT可以用就不手動(dòng)輸了。)
?
4.3.3 雪橇區(qū)
這個(gè)就比較復(fù)雜了,因?yàn)橛袃煞N僵尸,級(jí)別差距還大(冰車7、雪橇小隊(duì)3),甚至經(jīng)常出現(xiàn)下一波級(jí)別總和大于上一波的情況,前面那種表很難概括。
?
下表羅列了所有可能的情況,0表示冰車,1表示雪橇小隊(duì),數(shù)字順序即出怪列表中的順序:

這個(gè)并不需要一個(gè)個(gè)算,比如某波級(jí)別上限是13,先出一只(四只)雪橇小隊(duì),剩余容量10,那就找到前面上限為10的波次x,“1”后面加上x波的列表就是。不過(guò)w40還是太多了……
?
然后是僵尸個(gè)數(shù):

這個(gè)應(yīng)該也是可以算的,不過(guò)這次就放下了。

五、下期預(yù)告
下期可能會(huì)有:
權(quán)重為0、選卡界面展示、僵王、錘僵尸、PT抽搐、SetZombiesListPlus()、倒計(jì)時(shí)、雪人、墓碑/珊瑚/空降、無(wú)普僵關(guān)計(jì)算法、雪橇小隊(duì)、固定出怪直接填滿列表的統(tǒng)計(jì)、權(quán)重與概率……

(好吧其實(shí)我根本沒打算做下去。)
?
最后感謝和風(fēng)唐舞和blue-carambola的提醒,感謝uint8_t和Umbrella_leaf的幫助和糾錯(cuò),感謝被我站在肩膀上的巨人們。