EternalTD 波次與敵人
plugins/EternalTD/waves/ 下的波次檔案定義了某個關卡的完整敵人陣容,包括一般波次、突然死亡波次以及可選的波前或波次訊息。每個關卡設定透過 wavesConfigFile: 引用一個波次檔案。
頂層欄位
| 欄位 | 類型 | 預設值 | 備註 |
|---|---|---|---|
isEnabled | bool | true | 停用的波次檔案不會載入;缺少這份設定時,相依關卡無法啟動 |
baseMobAmount | int | 20 | 當條目未指定 amount= 時使用的預設數量 |
waveEntities | string list | 必填 | 逐波的敵人條目 |
suddenDeathWaveEntities | string list | 選填 | 在配置波次耗盡後執行的可選循環波次池 |
prewaveMessages | list of maps | 選填 | 以目前計數器為鍵的訊息:入場時為 0,第 N 波結束後為 N |
waveMessages | list 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
| 鍵 | 類型 | 備註 |
|---|---|---|
wave | int | 必填。此條目所屬的波次編號 |
entityType | enum | 必填。準確的 Bukkit EntityType 列舉值;請選擇可生成的生命實體 |
healthMultiplier | double | 選填,預設為 1.0。乘以實體的最大生命值 |
amount | int | 選填。覆寫此條目的 baseMobAmount |
name | string | 選填。自訂名稱字串。會解析並儲存,但目前不會套用至生成的生物;名稱位置顯示的是生命值與護甲條 |
resist | flag | 將實體標記為免疫減速 |
fast | flag | 提高移動速度 |
treasure | flag | 擊殺時的金幣賞金加倍 |
boss | flag | 使用下述頭目數量規則與生命值縮放,每個頭目都有血條 |
horde | flag | amount 加倍且生命值減半 |
air | flag | 實體在路徑上方 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 生成時使用自身設定的波次編號(分裂體則使用父實體波次的一半),依下列順序計算:
- 基礎生命值從
0.5開始,隨波次增加:health = 0.5 + ((wave - 1)^1.2) / 2。 - 頭目乘以
baseMobAmount × 0.5。 - 群體敵人的生命值減半。
- 此時先計算賞金:
ceil(health),尚未套用healthMultiplier或空中敵人的減益。treasure會再將賞金加倍。 maxHealth = health × healthMultiplier。- 空中敵人的
maxHealth再減半。 - 從第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。在非作弊工作階段結束時,插件會將新的波次編號儲存到關卡檔案中,並在打破先前分數時廣播伺服器範圍的訊息。