嘗試研究了下傳送帶的機(jī)制
植吧鏈接:https://tieba.baidu.com/p/8508992536
文檔下載見Forum(或QQ群):https://forum.crescb.com/postid/4086/
初學(xué)反匯編,學(xué)藝不精,請(qǐng)務(wù)必持有懷疑精神。
在此向?yàn)閜vz機(jī)制探索做出付出的前人、和在我的探索過(guò)程中提供指導(dǎo)的同學(xué)前輩表示感謝。
與傳送帶有關(guān)的函數(shù)主要如下:
【41F380】初始設(shè)定傳送帶倒計(jì)時(shí)和卡片(還包括初始化一些與傳送帶無(wú)關(guān)的內(nèi)容)。
【422CD0】游戲過(guò)程中傳送帶倒計(jì)時(shí)和卡片的更新。
【489C70】傳送帶上卡片位置更新(即卡片的移動(dòng))。
【489A50】在傳送帶上創(chuàng)建新的卡片(主要是卡片坐標(biāo))。
其中【422CD0】比較復(fù)雜,再稍微多說(shuō)兩句,其他的就不解釋了:
422CD0~422D1F 判斷倒計(jì)時(shí)是否歸零,如果未歸零則倒計(jì)時(shí)-1并直接終止,如果歸零則繼續(xù)向下;
422D25~422E0B 重設(shè)倒計(jì)時(shí);
422E10~4232A7 根據(jù)關(guān)卡設(shè)定傳送帶可選的植物種類列表、和各植物的初始權(quán)重;
4232AB~42340F 第一次修改權(quán)重;
423416~423453 第二次修改權(quán)重(這里注意下第一、二次修改不是完全線性進(jìn)行的,是列表中每個(gè)植物依次進(jìn)行兩次修改,前一個(gè)植物進(jìn)行完再進(jìn)行下一個(gè)植物,循環(huán)的指令位于423456~42345E);
423464~42348E 隨機(jī)選擇卡片并收尾。
幾個(gè)相關(guān)的地址,似乎指針表上沒(méi)有:
[[[6A9EC0]+768]+144]+34C:游戲時(shí)鐘(不包括選卡停留的時(shí)間,與[[[6A9EC0]+768]+5568]相同,但僅用于傳送帶關(guān)卡)
[[[6A9EC0]+768]+160]+5C:傳送帶倒計(jì)時(shí)
[[[6A9EC0]+768]+160]+68:傳送帶上一次生成的卡片(并非傳送帶中最后一張卡片)中的植物種類
應(yīng)該還有,不過(guò)我就懶得找了……
?
下文將與初始設(shè)定相對(duì)應(yīng)的稱為“過(guò)程”設(shè)定。
?
目錄
零、省流助手
一、初始倒計(jì)時(shí)和初始卡片
二、過(guò)程倒計(jì)時(shí)
三、過(guò)程卡片
四、傳送帶上卡片的移動(dòng)
五、創(chuàng)建新卡片的位置
?
零、省流助手
以下是一些實(shí)際游戲中可以用到的規(guī)律:
傳送帶中卡片數(shù)量≤4時(shí),下一張卡片來(lái)得最快,≤8時(shí)差別都不大,但≥9時(shí)來(lái)的最慢;
除睡蓮、花盆、墓碑苔蘚外,場(chǎng)地上的植物數(shù)量不影響傳送帶;
對(duì)于絕大部分卡片,傳送帶中同種卡片數(shù)量≤2時(shí),得到該卡片的概率最大;對(duì)于所有卡片≥4時(shí),概率極?。?/p>
獲得花盆、睡蓮的概率與 場(chǎng)地上+傳送帶中該種植物的數(shù)量和 有關(guān),權(quán)重隨數(shù)量和的增加而均勻減小,直至降到極小(不過(guò)正常游戲基本遇不到);
場(chǎng)地上+傳送帶中墓碑苔蘚的數(shù)量和 達(dá)到墓碑?dāng)?shù)量后,不會(huì)再得到墓碑苔蘚;
僵王關(guān)卡中,空花盆≥6時(shí),得到投手的可能性最大;≤2時(shí),得到投手的概率最小。
?
一、初始倒計(jì)時(shí)和初始卡片

這張圖包括三部分內(nèi)容:初始倒計(jì)時(shí)、過(guò)程倒計(jì)時(shí)、初始卡片,下面一樣樣說(shuō)。
?
絕大部分關(guān)卡的初始倒計(jì)時(shí)都是200,但是有兩種例外:
1. 僵王系列(“系列”指包括冒險(xiǎn)、迷你游戲等所有模式)和“你看,他們像柱子一樣”,初始倒計(jì)時(shí)1000(估計(jì)是因?yàn)橛泻脦讖埑跏伎ㄆ?/p>
2. 堅(jiān)果保齡球系列和“你能把它挖出來(lái)嗎?”,初始倒計(jì)時(shí)1,也就是一進(jìn)門就能收到禮。
?
初始卡片除了眾所周知的“你看,他們像柱子一樣”,僵王系列和“隱形食腦者”同樣有,不過(guò)隱形食腦者的初始倒計(jì)時(shí)仍然是200。
?
初始倒計(jì)時(shí)和初始卡片在進(jìn)入游戲時(shí)就已經(jīng)設(shè)定完成。這里尤其要強(qiáng)調(diào)初始卡片,也就是游戲一開始固定會(huì)生成的卡片,它們是一下子就全部設(shè)定好的,而不是等到了某個(gè)時(shí)間點(diǎn)再生成。至于為什么實(shí)際游戲時(shí)是每過(guò)一段時(shí)間才會(huì)出現(xiàn)一張,那是因?yàn)槌跏荚O(shè)定時(shí)它們被拋在了不同的位置,因此進(jìn)入可點(diǎn)擊區(qū)域的時(shí)間也不同,詳細(xì)的內(nèi)容在第五節(jié)再講。
?
如果使用ShowMe,是可以看到傳送帶不可見區(qū)域的卡片的。

?
同樣是由于不可見區(qū)域的卡片,在這種情況下,我們能看到的卡片并不一定是全部的卡片。比如柱子關(guān)開局時(shí)已經(jīng)是6張了,如果不及時(shí)清理掉,就有可能看上去是3張,倒計(jì)時(shí)重置時(shí)卻重置成了1275(5~6張,3*425)之類的情況,遇到莫慌。
二、過(guò)程倒計(jì)時(shí)
除了初始時(shí)設(shè)定的倒計(jì)時(shí),游戲每次添加新的卡片后都需要重設(shè)倒計(jì)時(shí),這個(gè)倒計(jì)時(shí)由兩個(gè)數(shù)值相乘得到。
一是有關(guān)卡自身決定的倍率(也就是表中的基數(shù)),絕大多數(shù)關(guān)卡的倍率都是1(不然也不會(huì)以這個(gè)為1倍了),例外情況如下:
1. 僵王系列:0.875倍(說(shuō)起來(lái)這里CE給取了近似值8.8,害我懵了半天)
2. 保護(hù)傳送門/你能把它挖出來(lái)嗎?:1.5倍
3. 隱形食腦者:2倍
4. 你看,他們像柱子一樣:3倍
二是有傳送帶中已有的卡槽數(shù)決定,具體情況如下:
0~4張:*400
5~6張:*425
7~8張:*500
9~10張:*1000
實(shí)際上,*400和*500的差距倒不大,哪怕是最大的3倍率也只差了(500-400)*3=3s,但是到了*1000差別就大了,延長(zhǎng)到了兩倍以上,因此游戲時(shí)最好卡片不要超過(guò)8張。
注意這個(gè)設(shè)定位于添加新卡片之前,因此使用的是添加新卡片前的卡槽數(shù)。
三、過(guò)程卡片
這應(yīng)該是最大頭的一個(gè)環(huán)節(jié)了……首先根據(jù)關(guān)卡會(huì)創(chuàng)建一個(gè)植物列表,列表中包括植物的種類和“初始權(quán)重”,然后初始權(quán)重再經(jīng)過(guò)兩次修改得到最終的權(quán)重,最后加權(quán)隨機(jī)得到一種植物。具體數(shù)據(jù)如下,表中背景有顏色的單元格表示會(huì)進(jìn)行第一次修改:


接下來(lái)是第一次修改,我又稱之為特殊修改,因?yàn)樗粚?duì)少數(shù)幾種特殊的植物有效。共有4種情況。
?
1. 墓碑苔蘚(4232F8~42331E):
如果場(chǎng)地上該植物數(shù)量+傳送帶中該植物數(shù)量(下文稱“現(xiàn)有總數(shù)量”)≥墓碑?dāng)?shù)量(理論上講其實(shí)不可能出現(xiàn)大于的情況),則權(quán)重改為0,不再參與第二次修改;反之則保留初始權(quán)重,正常參與第二次修改。
?
2. 睡蓮/花盆(423323~423372):
首先會(huì)有一個(gè)“臨界數(shù)量”,分別是:
睡蓮:18(水路鋪滿)
花盆(非柱子關(guān)卡):35(相當(dāng)于1~7列鋪滿)
花盆(柱子關(guān)卡):45(鋪滿)
很顯然,實(shí)際游戲基本上是很難達(dá)到甚至接近的……
?
然后隨著“現(xiàn)有總數(shù)量”從0逐漸接近“臨界數(shù)量”,其權(quán)重也會(huì)均勻地從初始權(quán)重減小到1。
?
具體在內(nèi)存中的公式是:int[(1 - 初始權(quán)重)* 現(xiàn)有總數(shù)量 / 臨界數(shù)量 + 初始權(quán)重 + 0.5 ]。我還給列了個(gè)表:(其實(shí)我就是列完了表才發(fā)現(xiàn)這個(gè)公式就是平均減小的意思……)

?
3. 僵王系列關(guān)卡 投手植物(42337A~4233F9)
與場(chǎng)地上空花盆的數(shù)量有關(guān)。(注意是空的)
卷心菜/西瓜:空花盆0~2,改為2;空花盆3~5,改為3;空花盆>5,保留初始值10。
玉米:空花盆0~5,改為1;空花盆>5,保留初始值5。
?
4. 僵王系列關(guān)卡 花盆(4233FC~42340F)
如果此時(shí)僵王正在砸車(狀態(tài)85),則花盆權(quán)重變?yōu)?00。注意這一條位于第二條后面,會(huì)覆蓋掉第2條的結(jié)果。
?
下文將進(jìn)行過(guò)或跳過(guò)第一次修改后的權(quán)重稱為中間權(quán)重。
?

接下來(lái)是第二次修改,我又稱之為普遍修改,因?yàn)樗毡檫m用于絕大多數(shù)情況,只有以下兩種情況例外:
1. 墓碑苔蘚在第一次修改中,現(xiàn)有總數(shù)量≥墓碑?dāng)?shù)量,權(quán)重設(shè)置為0,不再修改。(實(shí)際上有墓碑苔蘚的只有2-10)
2. 若植物列表中的植物總數(shù)≤2,則跳過(guò)第二次修改。(實(shí)際上滿足條件的只有1-5、堅(jiān)果保齡球1、你能把它挖出來(lái)嗎)
?
第二次修改的內(nèi)容與傳送帶中該種植物的卡片數(shù)量有關(guān),具體如下:
若卡片數(shù)≥4,則權(quán)重改為1。
若卡片數(shù)為3,則權(quán)重改為5。
若卡片數(shù)為0~2,則再進(jìn)行判斷:如果與上一次選擇的植物相同,則改為中間權(quán)重/2;如果不同,則保留中間權(quán)重。
?
一般來(lái)說(shuō),都是卡片數(shù)越多權(quán)重越小的,如果中間權(quán)重≥10,那么中間權(quán)重/2≥5,這是一定符合的。因此大部分卡片最好不要儲(chǔ)存>2張,當(dāng)然如果你不想要那就存4張。
但如果中間權(quán)重=5,那么若卡片數(shù)為3,則最終權(quán)重為5;如果卡片數(shù)為0~2,則最終權(quán)重為5或2,卡片數(shù)增多反而理論上概率會(huì)增大。也就是說(shuō)對(duì)于那些初始權(quán)重為5的植物,在傳送帶中保留3張卡片,能使新卡片最大可能地得到該植物。
不過(guò)這只是在理論上推測(cè),實(shí)際游戲時(shí)如何就不清楚了。除了5,還有一些小于10的情況,此處也不多討論了。

另外還有,如果卡槽已滿(實(shí)際上傳送帶關(guān)卡也是有卡槽格數(shù)限制的,就是10張),倒計(jì)時(shí)是不會(huì)受影響的,并不會(huì)有暫停/重置之類的變化。倒計(jì)時(shí)歸零后照樣會(huì)選擇卡片,只是到了489A50函數(shù)(在傳送帶上創(chuàng)建新的卡片)時(shí)會(huì)跳過(guò),也就是說(shuō),即便卡槽已滿,[[[6A9EC0]+768]+160]+68處的“傳送帶上一次生成的卡片”依然會(huì)不斷變化。
?
四、傳送帶上卡片的移動(dòng)
傳送帶上的卡片每4cs向左移動(dòng)1px。更準(zhǔn)確地說(shuō),是當(dāng)游戲時(shí)間(不包括選卡停留的時(shí)間)是4的整數(shù)倍時(shí),卡片在傳送帶上的位置-1。
五、創(chuàng)建新卡片的位置
傳送帶上的每一張卡片都有對(duì)應(yīng)的“在傳送帶上的位置”,這個(gè)位置是相對(duì)位置,相對(duì)于該卡片所應(yīng)該達(dá)到的最左側(cè)的距離,比如下圖中所有卡片的相對(duì)位置都是0:

此外在指針表中還有一個(gè)“卡牌X坐標(biāo)”,那個(gè)是個(gè)固定的數(shù)值,其中第一張卡牌的X坐標(biāo)是91,每向右一張卡牌+50,而不是傳送帶中卡片的實(shí)時(shí)位置。也就是說(shuō),傳送帶中卡片的橫坐標(biāo) = 卡槽序號(hào) * 50 + 41 + 在傳送帶上的位置。
?
這里為了圖方便,我們就全部以第一張卡片的左邊緣為基準(zhǔn),下文稱之為絕對(duì)位置(其實(shí)也不是絕對(duì)的說(shuō))。
?
每張卡片的寬度是50px,卡片與卡片之間沒(méi)有間隙。也就是說(shuō),第x張卡片的相對(duì)0位置=絕對(duì)50 *(x - 1)位置。
?
經(jīng)手測(cè),鼠標(biāo)可以點(diǎn)擊到的最右端的絕對(duì)位置是503,大概是下圖這個(gè)樣子:(靠音效可以辨認(rèn)出是否點(diǎn)擊到卡片)

向傳送帶中添加新的卡片時(shí),先將其相對(duì)位置設(shè)置為515 – 傳送帶中已有卡片數(shù) * 51。此時(shí)若已有卡片數(shù)>0,則與前一張卡片的相對(duì)位置比較,若新卡片的相對(duì)位置<前一張的相對(duì)位置,則將新卡片的相對(duì)位置設(shè)置成前一張卡片的相對(duì)位置+40。下面詳細(xì)分析。
?
前文有說(shuō),卡片與卡片之間是沒(méi)有空隙的,但這里的*51,我估計(jì)是寶開最初設(shè)計(jì)時(shí)有1px的空隙,這樣新卡片的絕對(duì)位置其實(shí)是固定的515:絕對(duì)x=相對(duì)(515 – 傳送帶中已有卡片數(shù) * 51)+51 * 傳送帶中已有卡片數(shù)=515。
?
但是現(xiàn)在空隙沒(méi)了,要確保卡片絕對(duì)位置仍然是515的話,51應(yīng)該改為50,保留51的話實(shí)際上是多減掉了。而且已有的卡槽數(shù)越多,多減掉的就越多,實(shí)際上每張卡片生成的絕對(duì)位置如下:

?
出生的位置不同,達(dá)到503(也就是最早可被拾取)的時(shí)間也不同,不過(guò)即便是第一張和第十張也只差了9*4=36cs(每4cs移動(dòng)1px沒(méi)忘吧),這(至少以目前的技術(shù)發(fā)展)是完全可以忽略的。
接下來(lái)將兩張卡片的相對(duì)位置進(jìn)行比較,這其實(shí)就是判斷兩張卡片會(huì)不會(huì)重疊甚至倒序(只要有1px的重疊就叫重疊),只要不會(huì)那就沒(méi)問(wèn)題,就這么辦;但如果會(huì),則重新設(shè)置為前一張卡片的相對(duì)位置+40,這里“相對(duì)位置差=40”實(shí)際上就是兩張卡片間距40。

那么什么情況下前后兩張卡片會(huì)重合呢?游戲過(guò)程中,兩張卡片生成的間隔至少是僵王關(guān)的350cs,則相鄰生成兩張卡片間隔350/4-1=77.5,向下取整得兩張卡片的絕對(duì)位置間隔77px>50px,這已經(jīng)是最小的間距了,但兩張卡片仍不可能重合。
因此第二條規(guī)則其實(shí)就是為初始卡片準(zhǔn)備的。

我們?cè)偎阋恍﹥?nèi)容,有初始卡片的關(guān)卡,在不從傳送帶上取下植物的前提下,每?jī)蓮埧ㄆg的間距(未考慮邊界值導(dǎo)致的傳送帶可能多移動(dòng)1px):

這都是不從傳送帶上取下植物的情況,如果要取下的話情況實(shí)在太多,我也就不討論了。但實(shí)際游戲時(shí)其實(shí),尤其是柱子關(guān)和僵王關(guān),是幾乎不會(huì)開局好半天都不種植物的。
僵王關(guān)倒不明顯,基本上都差不多。但柱子關(guān),如果仔細(xì)數(shù)的話會(huì)發(fā)現(xiàn),明明初始卡片只有6張,但是第1~8張都間隔比較近,從第8張往后間隔才變得非常遠(yuǎn)。這就是因?yàn)榈?張創(chuàng)建的時(shí)候,第6張卡片的位置還在509以外,于是第7張直接接在后面,第8張也是同理,接下來(lái)才比較正常。(其實(shí)也未必,但是第8和第9張的間隔太大,不容易察覺(jué)出問(wèn)題)
最詭異的還是隱形關(guān),初始卡片兩張,第三張和第四張間距非常小,第四張和第五張又間距非常大。這也是因?yàn)槌跏嫉褂?jì)時(shí)200比較?。ㄎ疑踔翍岩捎质菍氶_忘了改了),第三張生成時(shí)第二張的位置還大于513,所以被向右調(diào)了很多,但是第四張又是正常生成的。(兩張卡片的間距只有17px,這個(gè)是讀內(nèi)存驗(yàn)證過(guò)的。)
至于第四張和第五張間距非常大,這是正常的,隱形食腦者的傳送帶倒計(jì)時(shí)本就是*2倍的,第四張和第五張的間距正常就是800/4-1-50=149px。

?
差不多結(jié)束了……接下來(lái)比較重要的是各個(gè)小游戲的機(jī)制和出怪列表的填充規(guī)律,沒(méi)人弄的話我總歸要找一找,不過(guò)一段時(shí)間內(nèi)應(yīng)該是不會(huì)再碰反匯編了。當(dāng)然要是有人愿意替我解決那就更好了(。