EternalTDのウェーブと敵
plugins/EternalTD/waves/ 配下のウェーブファイルは、通常のウェーブ、サドンデスのウェーブ、そして任意のプレウェーブまたはウェーブメッセージを含む、レベルの敵編成全体を定義します。各レベル設定は wavesConfigFile: を通じて1つのウェーブファイルを参照します。
トップレベルフィールド
| フィールド | 型 | デフォルト | 注記 |
|---|---|---|---|
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 | 任意。デフォルトは 1.0。エンティティの最大HPに乗算 |
amount | int | 任意。このエントリに対して baseMobAmount を上書き |
name | string | 任意。カスタム名文字列。解析されて保存されますが、現在のプラグインはスポーンしたモブにこれを適用しません(ネームプレートは代わりにHP/アーマーバーになります) |
resist | フラグ | エンティティをスロー無効としてマーク |
fast | フラグ | 移動速度を上昇 |
treasure | フラグ | キル時のゴールドバウンティを2倍 |
boss | フラグ | スケーリングされたHPとボスバーを持つ単一のボスとしてスポーン |
horde | フラグ | amount を2倍にしてHPを半分にする |
air | フラグ | エンティティが経路の4ブロック上にスポーンし、地上の壁を無視 |
内部の数量計算
amountにはwave / 10が加算され、その後整数に切り捨てられます。そのためamount=20のエントリはウェーブ15で21体、ウェーブ20で22体になります。bossエントリはamountをmax(1, floor(wave / 10))に上書きします。hordeエントリは最終的なamountを2倍にします。- エントリごとの数量に加えて、ウェーブランタイムはウェーブの構築時に複製を追加します。ここで参照されるリストは完全に展開されたモブのリストである点に注意してください — 設定パーサはすでにモブ1体につき1つのオブジェクトを生成しているため、
amount=20の1行は1つではなく連続した20個のインデックスを占めます。偶数インデックスi(0, 2, 4, ...)のうち、その展開済みリストの有効なインデックスでありかつウェーブ番号より小さいものそれぞれについて、インデックスiのモブのクローンが1体追加されます。ボスエントリがこの方法でクローンされることはありません。したがってボーナスモブの数はおよそceil(min(waveNumber, listSize) / 2)になります: ウェーブ1で1体、ウェーブ3〜4で2体、ウェーブ9〜10で5体、ウェーブ15〜16で8体、といった具合に、ウェーブ番号がリストの長さを超えるまで増えていきます。
ウェーブ内のスポーン間隔は min(200 / totalEntities, 20) tickで、ランタイムは各モブを解き放つ前にその2倍だけ待機します。horde ウェーブはこの間隔を半分にし、通常の2倍の速さでモブを解き放ちます。すべてのモブは、スポーン時にレベルのスタートタイルの中からランダムに1つを選びます。
メッセージブロックの形式
prewaveMessages と waveMessages はどちらもマップのリストを受け付けます:
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のゴールドが付与されます。 - そのウェーブでライフを1つも失わなかった場合、ウェーブボーナスの半分に相当する「Perfect」ボーナス(
waveNumber * 10 * 0.5)を受け取れます。告知される数値と実際に付与されるゴールドは一致するようになりました。 - 各ウェーブの報酬は1回だけです — 何らかの理由で完了が二重に報告されたウェーブは2回目が無視され、セッションが終了処理に入った後は一切支払われません。
- 次のウェーブの修飾子リストは各ウェーブ終了後に告知されます。
レベルが終了するとき
セッションが進行するのは、次のウェーブ番号が waveEntities のキーとして存在する場合だけです。そのため、ウェーブ番号は1から連続している必要があります。次の番号が存在しない場合:
- ファイルが
suddenDeathWaveEntitiesを定義していれば、実行はサドンデスへ移行します。 - そうでなければ、レベルは直ちに終了し、実行されなかったウェーブはカウントされません。保存されるハイスコアと完了時のタイトルには、プレイヤーが実際にプレイした最後のウェーブが使われます。
サドンデス
suddenDeathWaveEntities が定義されている場合、設定されたウェーブリストを超えてもレベルは継続します。
サドンデスのプールは、進行カウンタではなく設定されたウェーブ番号でサイクルします。サドンデスのウェーブが必要になるたびに、EternalTDはプール内で現在の番号より大きい最小の wave= 番号を選び、それより大きいものがなければ設定されている最小の番号に戻ります。したがってプールは 1, 2, 3, ... と番号付けされている必要はありません — 抜けがあっても、任意の番号から始まっていても正しくサイクルします。
表示されるウェーブ番号は通常のウェーブリストから数え上がり続けます。サイクルするのはスポーンされるプールのエントリだけです。
ウェーブエンティティの属性
各ウェーブは独自の属性を持ち、ウェーブごとにローテーションします:
- ウェーブ1 → 火
- ウェーブ2 → 風
- ウェーブ3 → 水
- ウェーブ4 → 土
- (以降繰り返し)
ウェーブエンティティがスポーンするとき、waveNumber / 100 の確率でそのエンティティはウェーブの属性を継承し、モブの上に浮かぶ色付きタグとして表示されます。
属性ダメージのルールはタワーの DamageTower クラスで処理されます:
- 同属性の攻撃側 vs 同属性のターゲット — 0.5倍ダメージ(耐性)。
- 反対の単一属性(火 vs 水、風 vs 土) — 2倍ダメージ(クリティカル)。
- フュージョン属性(マグマ、爆発、嵐、汚泥)はペアごとの相互作用に従います。完全な行列はソースを参照してください。
- 無属性のタワーは誰に対しても1倍のダメージを与えます。
フュージョン属性は、Basic Towerに組み合わせ可能な属性を持つサポートタワーが接触したときに形成されます:
| 組み合わせ | 結果のフュージョン |
|---|---|
| 火 + 土 | マグマ |
| 火 + 風 | 爆発 |
| 水 + 風 | 嵐 |
| 水 + 土 | 汚泥 |
衝突のルールは見た目より狭い範囲にしか適用されません:
- 同じタワーに 土 + 風 が付くと、他に何が付いていても必ず無属性に戻ります。
- 火 + 水 が無属性に戻すのは、3つ以上の異なる属性が関わっている場合だけです。Fire系サポート1つとWater系サポート1つだけが接触しているタワーは、そのうちどちらか一方を任意に保持します。コードが「セット内の最初の属性を選ぶ」処理にフォールスルーし、そのセットが順序を持たないためです。
- 無属性のサポートタワー(Spyglass、Gold Mine)は結果に一切影響しません。属性を持つタワーが1つでも付いた時点で、セットから除外されます。
HP、アーマー、バウンティのスケーリング
WaveEntity はスポーン時に、以下のステップをこの順序どおりに適用します:
- 基本HPは
0.5から始まり、ウェーブとともに増加します:health = 0.5 + ((wave - 1)^1.2) / 2。 - ボスエンティティはそれに
baseMobAmount × 0.5を乗算します。 - Hordeエンティティはそれを半分にします。
- バウンティはここで計算されます。 値は
ceil(health)であり、healthMultiplierの適用前、かつAirのペナルティの適用前です。treasureエントリはその後これを2倍にします。 maxHealth = health × healthMultiplier。- Airエンティティは
maxHealthをさらに半分にします。 - アーマーはウェーブ10以降にのみ出現し、
maxHealth / 80に設定されます。
ステップ4の順序には意味があります。healthMultiplier が 3.0 の敵はHPが3倍になってもゴールドの支払額は変わりませんし、Airの敵はHPが半分であるにもかかわらず地上の同等の敵と同じバウンティを支払います。Gold Mineサポートタワーは、とどめの一撃の瞬間にそのボーナスをバウンティへ加算します。
移動速度は次のとおりです:
speed = 0.3 × (1 - slow)
× 1.5 × (1 - slow) if fast
× 0.5 if air
+ wave / 1000
末尾の wave / 1000 の項は、フラグに関係なく敵がウェーブごとにごくわずかに速くなることを意味します。これはAirとスローの乗算の後に加算され、それらによってスケーリングされることはありません。
スプリッタリング
ウェーブ20以降、非Airの敵は死亡時に追加の小型モブ(「スプリッタリング」)をスポーンさせます。
- 数: キルごとに
floor(wave / 20)。 - 親が
CAVE_SPIDERの場合、スプリッタリングはSILVERFISHになります。それ以外の場合はCAVE_SPIDERになります。 - スプリッタリングは親のウェーブの
wave / 2でスポーンするため、十分深いランでは、スプリッタリングが自身の死亡時にさらにスプリッタリングを連鎖させることもできます。 - スプリッタリングは死亡時に0ゴールドしか与えず、Air の敵はスプリッタリングをスポーンさせません。
チュートリアルレベルの特殊ケース
同梱されているチュートリアルマップは、ハードコードされたチュートリアルウェーブスクリプトを実行します:
- 建設フェーズは、ハイライトされたマスに必要なタワーを正確に設置するまで自動終了しません。
- ハードコードされたタワーは、ターゲットされているグリッドマスの下の色付きコンクリートパッチによって示され、FMMがインストールされている場合は、その上に浮かぶ下向きの赤い矢印モデルでも示されます。
- チュートリアルは初期のウェーブで追加のゴールドを投入するため、スクリプト化されたタワー編成は常に購入可能です: ウェーブ1、2、3で
+100、ウェーブ4で+200。それ以降のウェーブに追加はありません。 - 必要なタワーの各マスは、要求されるタワーごとに色分けされます。Basic Towerは緑のコンクリート、Barricadeは茶色、Sugarは白、Spyglassはシアン、Beam Generatorは黄色、Explosion Factoryは赤、Ice Boxは青、Armor Crusherは灰色、Gold Mineはオレンジ、Obsidian Quarryは紫、それ以外は黒です。
プレイヤーのライフとゴールド
- 初期ライフ: 20。
- 初期ゴールド: 150。
- ボスモブが終端に到達するとライフを5消費します。その他すべてのモブはライフを1消費します。
- チート(
/etd cheat)はゴールドを10,000,000、ライフを1,000,000に設定し、ハイスコアの目的に対してセッションをチート扱いとしてマークします。チートモードをオフに戻しても元の値は復元されず、チート扱いのフラグはそのセッションの間ずっと残ります。 /etd setwave <n>もチート扱いのフラグを立て、ウェーブ報酬のガードを再設定するため、ジャンプ先のウェーブもクリア時に報酬を支払います。
ハイスコアの追跡
各レベル設定は highscoreWave と highscorePlayerName を永続化します。非チートセッションの終了時、プラグインは新しいウェーブ番号をレベルファイルに保存し、前のスコアを更新した場合はサーバー全体のメッセージをブロードキャストします。