跳至主要內容

EternalTD 波次與敵人

plugins/EternalTD/waves/ 下的波次檔案定義了某個關卡的完整敵人陣容,包括一般波次、突然死亡波次以及可選的波前或波次訊息。每個關卡設定透過 wavesConfigFile: 引用一個波次檔案。

頂層欄位​

欄位類型預設值備註
isEnabledbooltrue停用的波次檔案不會載入;缺少這份設定時,相依關卡無法啟動
baseMobAmountint20當條目未指定 amount= 時使用的預設數量
waveEntitiesstring list必填逐波的敵人條目
suddenDeathWaveEntitiesstring list選填在配置波次耗盡後執行的可選循環波次池
prewaveMessageslist of maps選填以目前計數器為鍵的訊息:入場時為 0,第 N 波結束後為 N
waveMessageslist of maps選填波次開始時顯示的訊息

沒有突然死亡條目時,工作階段會在切換至下一波卻找不到對應設定時結束。通常會先經過最後的建造視窗,除非玩家提前推進。

波次實體條目格式​

waveEntities(或 suddenDeathWaveEntities)中的每一行都是以冒號分隔的條目:

- wave=1:entityType=ZOMBIE:healthMultiplier=1.0:amount=10
- wave=2:entityType=SKELETON:fast:treasure
- wave=5:entityType=WITHER_SKELETON:boss
- wave=8:entityType=PHANTOM:air:horde
鍵類型備註
waveint必填。此條目所屬的波次編號
entityTypeenum必填。準確的 Bukkit EntityType 列舉值;請選擇可生成的生命實體
healthMultiplierdouble選填,預設為 1.0。乘以實體的最大生命值
amountint選填。覆寫此條目的 baseMobAmount
namestring選填。自訂名稱字串。會解析並儲存,但目前不會套用至生成的生物;名稱位置顯示的是生命值與護甲條
resistflag將實體標記為免疫減速
fastflag提高移動速度
treasureflag擊殺時的金幣賞金加倍
bossflag使用下述頭目數量規則與生命值縮放,每個頭目都有血條
hordeflagamount 加倍且生命值減半
airflag實體在路徑上方 4 格生成,忽略地面牆壁

鍵與旗標前後不要加空白,實體類型使用大寫,波次編號、數量與生命值倍率使用正數。解析器不會移除空白,也不會拒絕所有無效範圍;未知鍵會被忽略。一般條目格式錯誤會停用波次設定;突然死亡條目格式錯誤會記錄警告,且池中可能保留先前已解析的條目。檔案解析成功並不代表其中的實體能夠生成。

內部數量計算​

  • amount 會加上 wave / 10,再截斷為整數。因此 amount=20 在第 15 波產生 21 隻生物,第 20 波產生 22 隻。
  • boss 條目會將 amount 覆寫為 max(1, floor(wave / 10))。
  • horde 條目會將最終 amount 加倍。
  • 除了每個條目的數量,執行時建立波次還會加入副本。索引針對的是完全展開的生物清單:解析器已為每隻生物建立一個物件,因此一行 amount=20 佔 20 個連續索引。每個既有效又小於波次編號的偶數索引 i(0, 2, 4, ...)都會增加一隻該位置生物的複本。頭目不會以此方式複製。額外數量約為 ceil(min(waveNumber, listSize) / 2):第 1 波多 1 隻、第 3–4 波多 2 隻、第 9–10 波多 5 隻、第 15–16 波多 8 隻,直到波次編號超過清單大小。

生成間隔為 min(floor(200 / totalEntities), 20) tick。一般生成要求計數器大於該間隔的兩倍;horde 節奏要求大於整數減半後間隔的兩倍。由於是嚴格大於比較,還會多一個計數器 tick,並非恰好兩倍。是否採用 horde 節奏取決於波次清單第一隻剩餘生物,因此混合一般與 horde 條目會隨清單變化而改變節奏。每隻生物生成時都會隨機選擇關卡的一個起點格。

訊息區塊格式​

prewaveMessages 和 waveMessages 都接受 maps 列表:

prewaveMessages:
- wave: 0
message:
- "&aWelcome! Build a couple of basic towers along the path."
- wave: 4
message:
- "&6Heads up: a boss is coming next wave."

prewaveMessages[0] 在入場時執行。第 N 波結束後,prewaveMessages[N] 在為下一波建造時執行:要預告第 5 波,請使用鍵 4。waveMessages[N] 在第 N 波開始時執行。這些鍵使用工作階段顯示的計數器,突然死亡期間也一樣。同一鍵的重複訊息條目會覆寫先前的條目。

波次生命週期​

工作階段會經歷這些狀態:

  • STARTING — 玩家第一次執行 /etd start 之前。
  • CONSTRUCTION_PHASE — 防禦階段之間的 10 秒建造視窗。
  • DEFENSIVE_PHASE — 敵人正在生成並沿路徑行走。
  • ENDING — 玩家退出、失敗,或關卡的波次耗盡。

一般建造計時器為 10 秒。/etd start 或 Next Wave 工具可提前推進,但仍須滿足教學要求(請參閱教學關卡)。最初的開始階段會等待開始操作;教學在最後一個要求被接受時可以推進。

波次結束行為:

  • 完成一波會獲得 waveNumber * 10 金幣。
  • 如果你在這波中沒有損失生命,你會獲得價值波次獎勵一半的「完美」獎勵(waveNumber * 10 * 0.5)。宣布的數字與實際給予的金幣現已一致。
  • 每一波只會發放一次獎勵 —— 若某一波不知何故重複回報完成,第二次會被忽略;而在工作階段即將結束時完全不會發放。
  • 波次結束後,若下一波的修飾符字串非空,就會宣布它。它來自第一個設定的敵人,而非混合波次的所有條目。

關卡何時結束​

只有當下一個波次編號存在於 waveEntities 的鍵中,工作階段才會前進,因此波次編號必須從 1 開始連續。當下一個編號不存在時:

  • 若該檔案定義了 suddenDeathWaveEntities,該次遊玩會進入突然死亡;
  • 否則關卡會立即結束,且不會計入那個從未執行的波次。持久化的最高分與完成標題使用的是玩家實際玩過的最後一波。

突然死亡​

如果定義了 suddenDeathWaveEntities,關卡會在配置波次列表結束後繼續執行。

突然死亡池依設定的波次編號循環。每次需要時,EternalTD 會選擇大於目前池鍵的最小非負鍵;若沒有更大的鍵,就回到最小鍵。池計數器初始為 0,所以存在正數鍵時,設定的鍵 0 在第一輪會被跳過。請使用正數鍵;允許跳號,且鍵 0 也不適用於下方的生命值公式。

顯示的波次計數器持續增加。敵人的生命值、護甲、速度、基礎賞金及分裂體門檻使用所選條目設定的 wave=,不會自動隨顯示計數器縮放。執行時的額外複本與元素抽選使用顯示計數器。例如池條目 10 和 20 即使在顯示第 100 波時,也保留各自的敵人縮放值。下一波搜尋仍會先檢查各顯示編號是否有一般條目,因此較早遇到缺號後,仍可能使用後面的普通鍵。

波次實體的元素契合​

每個波次都有自己的元素契合,每波輪換:

  • 第 1 波 → 火
  • 第 2 波 → 風
  • 第 3 波 → 水
  • 第 4 波 → 土
  • (然後重複)

一般波次實體生成時,繼承波次元素的機率為顯示的 waveNumber / 100;從顯示第 100 波起,抽選必定成功。彩色標籤顯示元素。分裂體另外建立,不參與這個抽選。

元素傷害規則由防禦塔的 DamageTower 類別處理:

  • 相同契合的攻擊者對相同契合的目標 — 0.5× 傷害(抗性)。
  • 對立的單一元素(火 vs 水、風 vs 土)— 2× 傷害(暴擊)。
  • 融合契合遵循下表。其他不符合的組合造成 1× 傷害。
  • 無契合的塔對所有人造成 1× 傷害。
塔的契合對以下契合造成 2× 傷害對以下契合造成 0.5× 傷害
岩漿風、水土、火、岩漿
爆裂土、水風、火、爆裂
暴風火、土風、水、暴風
淤泥火、風土、水、淤泥

當基礎塔被具有可組合元素契合的輔助塔接觸時,會形成融合契合:

組合產生的融合
火 + 土岩漿
火 + 風爆裂
水 + 風暴風
水 + 土淤泥

衝突規則有以下限制:

  • 同一座塔上的土 + 風一定會還原為無契合,不論其他輔助塔為何。
  • 火 + 水只有在存在三種以上不同契合時才還原為無契合。只有一座火輔助塔和一座水輔助塔時,塔會任意保留其中之一,因為程式會選取無序集合中的第一個契合。
  • 無契合的輔助塔(Spyglass、Gold Mine)不影響結果;只要有任何元素輔助塔,它們就會被移出集合。

每次重新計算都從基礎塔自身的無契合元素開始,因此移除最後一座元素輔助塔後,塔會回到無契合狀態。

生命值、護甲和賞金縮放​

WaveEntity 生成時使用自身設定的波次編號(分裂體則使用父實體波次的一半),依下列順序計算:

  1. 基礎生命值從 0.5 開始,隨波次增加:health = 0.5 + ((wave - 1)^1.2) / 2。
  2. 頭目乘以baseMobAmount × 0.5。
  3. 群體敵人的生命值減半。
  4. 此時先計算賞金:ceil(health),尚未套用healthMultiplier或空中敵人的減益。treasure會再將賞金加倍。
  5. maxHealth = health × healthMultiplier。
  6. 空中敵人的maxHealth再減半。
  7. 從第10波開始,護甲等於maxHealth / 80。

第 4 步的順序很重要:healthMultiplier 為 3.0 會使生命值增為三倍,但不改變基礎賞金。空中敵人雖然只有一半生命值,基礎賞金仍與同等地面敵人相同。金礦在致命一擊時加入加成,並將結果截斷為整數;小額賞金可能沒有額外金幣。

移動速度:

speed = 0.3 × (1 - slow)
× 1.5 × (1 - slow) if fast
× 0.5 if air
+ wave / 1000

最後的 wave / 1000 使用敵人設定的波次,於空中與減速倍率套用後加上。這個值控制生物的移動速度屬性。非 Mob 實體的替代邏輯則在每個移動 tick 朝下一個目的地傳送 0.1 格,因此這個公式不是通用的「格/tick」速度。

分裂體​

從第 20 波起,非空中敵人在死亡時會生成額外的小型怪物(「分裂體」)。

  • 數量:每次擊殺 floor(wave / 20)。
  • 如果父實體是 CAVE_SPIDER,則分裂體為 SILVERFISH。否則為 CAVE_SPIDER。
  • 分裂體使用 floor(parentWave / 2),並繼承目前路徑位置。它們使用建構函式的 0.5 生命值倍率,不繼承父實體的旗標或元素契合。設定波次夠高時,死亡後仍可產生更多分裂體。
  • 分裂體死亡時給予 0 金幣,且空中敵人永遠不會生成分裂體。

教學關卡特殊情況​

tutorial.yml 關卡使用與地圖座標綁定的硬編碼腳本:

  • 必須在標示格放置要求的塔類型;若同類塔已存在,則在該格升級。允許出售要求格上的錯誤塔。在對應腳本階段,無關的放置、出售和升級會被拒絕。最後一個要求被接受時,會立即請求下一波。
  • 彩色混凝土標示要求格。若 FMM 和 reddownarrow 模型可用,每格上方的紅箭頭會指示所需的塔或升級。
  • 第 1、2、3 波結束並進入建造階段時,教學增加 +100 金幣;第 4 波後增加 +200。這是額外收入,並非保證負擔得起。其他波次編號沒有這筆補充。
  • 每個要求格依塔類型著色:基礎塔使用綠色混凝土、Barricade 為棕色、Sugar 為白色、Spyglass 為青色、Beam Generator 為黃色、Explosion Factory 為紅色、Ice Box 為藍色、Armor Crusher 為灰色、Gold Mine 為橙色、Obsidian Quarry 為紫色,其餘為黑色。
  • 在每個腳本階段中,綠色 Boss 條會以 Build towers! done/total! 的形式計算已放置的要求塔數量。教學每兩分鐘會提醒你可以用 /etd quit 離開,並在仍有未完成要求時重複目前的波次前訊息。

玩家生命和金幣​

  • 起始生命:20。
  • 起始金幣:150。
  • 如果頭目怪物到達終點,會消耗 5 條生命。所有其他怪物消耗 1 條生命。
  • 每次切換 /etd cheat(包括關閉)都會將金幣重設為 10,000,000、生命重設為 1,000,000。該工作階段之後一直沒有更新最高分的資格。
  • /etd setwave <n> 會更改工作階段計數器與獎勵防重複狀態,並將本局標記為已作弊。它不會替換目前敵人,也不會立即開始指定波次。下一次轉換使用 n + 1。

高分追蹤​

每個關卡設定會保留 highscoreWave 和 highscorePlayerName。在非作弊工作階段結束時,插件會將新的波次編號儲存到關卡檔案中,並在打破先前分數時廣播伺服器範圍的訊息。