EternalTD 波次与敌人
plugins/EternalTD/waves/ 下的波次文件定义了某关卡的完整敌人阵容,包括普通波次、突袭波次以及可选的波前消息或波次消息。每个关卡配置都通过 wavesConfigFile: 引用一个波次文件。
顶级字段
| 字段 | 类型 | 默认值 | 备注 |
|---|---|---|---|
isEnabled | bool | true | 在此处禁用同样会禁用依赖此文件的关卡 |
baseMobAmount | int | 20 | 当条目未指定 amount= 时使用的默认数量 |
waveEntities | string list | 必填 | 按波次列出的敌人条目 |
suddenDeathWaveEntities | string list | 可选 | 可选的循环波次池,在已配置的波次用尽后运行 |
prewaveMessages | list of maps | 可选 | 在指定波次开始之前显示的消息 |
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 | 可选。乘以实体的最大生命值 |
amount | int | 可选。覆盖此条目的 baseMobAmount |
name | string | 可选。自定义名称字符串 |
resist | flag | 将实体标记为免疫减速 |
fast | flag | 提高移动速度 |
treasure | flag | 击杀时的金币赏金翻倍 |
boss | flag | 以单个 Boss 形式生成,带有缩放后的生命值和 Boss 血条 |
horde | flag | amount 翻倍,生命值减半 |
air | flag | 实体在路径上方 4 格处生成,无视地面墙体 |
内部数量计算
amount在生成前会增加wave / 10。boss条目会将amount覆盖为max(1, floor(wave / 10))。horde条目会使最终amount翻倍。- 在每条目数量之上,波次运行时还会额外克隆该波次第一、第三、第五……条条目(每个偶数索引
0, 2, 4, ...)的副本,最多克隆waveNumber - 1次。Boss 条目永远不会以此方式被克隆。因此更高的波次会叠加更多低索引条目的副本。
消息块格式
prewaveMessages 和 waveMessages 都接受一个 map 列表:
prewaveMessages:
- wave: 1
message:
- "&aWelcome! Build a couple of basic towers along the path."
- wave: 5
message:
- "&6Heads up: a boss is coming next wave."
prewaveMessages 在该波次的建造阶段开始时运行。waveMessages 在防御阶段开始的那一刻运行。
波次生命周期
一次会话会经历以下状态:
STARTING— 玩家第一次运行/etd start之前。CONSTRUCTION_PHASE— 防御阶段之间的 10 秒建造窗口。DEFENSIVE_PHASE— 敌人正在生成并沿路径行走。ENDING— 玩家退出、失败,或关卡用尽了所有波次。
除非教程将其保持(请参阅 教程关卡),否则建造阶段始终持续 10 秒。
波次结束行为:
- 完成一波将奖励
waveNumber * 10金币。 - 如果你在波次中未受到任何伤害,将再获得一份该奖励,作为"完美"奖励。
- 每一波结束后会公布下一波的修饰符列表。
突袭模式
如果定义了 suddenDeathWaveEntities,关卡会继续运行至已配置波次列表之外。突袭计数器每波递增 1,每当超过池大小时会回绕至突袭池的第 1 波。
波次实体的元素属性
每一波都有其各自的元素属性,按波次轮换:
- 第 1 波 → 火
- 第 2 波 → 风
- 第 3 波 → 水
- 第 4 波 → 土
- (然后重复)
当波次实体生成时,有 waveNumber / 100 的几率使该实体继承该波次的元素属性,显示为漂浮在生物上方的彩色标签。
元素伤害规则由塔的 DamageTower 类处理:
- 相同属性的攻击者对相同属性的目标 —— 0.5× 伤害(抗性)。
- 相对的单一元素(火对水、风对土)—— 2× 伤害(暴击)。
- 融合属性(熔岩、爆裂、风暴、淤泥)遵循成对的相互作用;完整矩阵请参阅源代码。
- 无属性的塔对任何目标造成 1× 伤害。
当基础塔被具有相互组合的元素属性的辅助塔接触时,会形成融合属性:
| 组合 | 产生的融合 |
|---|---|
| 火 + 土 | 熔岩 |
| 火 + 风 | 爆裂 |
| 水 + 风 | 风暴 |
| 水 + 土 | 淤泥 |
冲突的搭配(火 + 水、土 + 风)以及任何 3 种以上元素的混合都会让塔恢复为无属性。
生命值、护甲与赏金缩放
WaveEntity 在生成时应用以下公式:
health = (currentHealth + ((wave - 1)^1.2) / 2) × healthMultiplier- Boss 实体的生命值在此基础上再乘以
baseMobAmount × 0.5。 - Horde 实体的生命值减半。
- Air 实体的生命值再次减半。
- 护甲仅从第 10 波开始出现,设为
maxHealth / 80。 - 赏金为
ceil(health × 1),对treasure条目翻倍。Gold Mine 辅助塔会在死亡时增加赏金。
分裂小怪(Splitterlings)
从第 20 波开始,非 air 敌人在死亡时会额外生成小型生物("splitterlings")。
- 数量:每次击杀生成
floor(wave / 20)个。 - 如果父实体是
CAVE_SPIDER,分裂小怪为SILVERFISH。否则为CAVE_SPIDER。 - 分裂小怪以父实体波次的
wave / 2生成,因此足够深入的运行仍可能让分裂小怪在其自身死亡时再链式生成更多分裂小怪。 - 分裂小怪死亡时不给予金币,且 air 敌人永远不会生成分裂小怪。
教程关卡特殊情况
捆绑的教程地图通过硬编码的教程波次脚本运行:
- 在你于高亮方格上放置完所需的精确塔之前,建造阶段不会自动结束。
- 硬编码的塔由所瞄准网格方格下方的彩色混凝土补丁标示,若安装了 FMM,则在其上方还会漂浮一个向下的红色箭头模型。
- 教程会在前几波给玩家的金币池中额外作弊一些金币,以确保脚本化的塔阵容始终买得起。
玩家生命与金币
- 起始生命:20。
- 起始金币:150。
- Boss 生物到达终点会消耗 5 条生命。其他所有生物消耗 1 条生命。
- 作弊(
/etd cheat)会将生命和金币设置为有效的无限值,并将该会话标记为已作弊(用于最高分目的)。
最高分追踪
每个关卡配置都会持久化 highscoreWave 和 highscorePlayerName。在非作弊会话结束时,插件会将新的波次编号保存到关卡文件中,如果超过先前的分数则会广播全服消息。