Zum Hauptinhalt springen

EternalTD-Wellen & Gegner

Eine Wellen-Datei unter plugins/EternalTD/waves/ definiert das gesamte Gegneraufgebot für ein Level, einschließlich normaler Wellen, Sudden-Death-Wellen und optionaler Vorwellen- oder Wellennachrichten. Jede Level-Konfiguration verweist über wavesConfigFile: auf eine Wellen-Datei.

Felder auf oberster Ebene​

FeldTypStandardHinweise
isEnabledbooltrueDeaktivierte Wellendateien werden nicht geladen; abhängige Level können ohne diese Wellenkonfiguration nicht starten
baseMobAmountint20Standardmenge, die verwendet wird, wenn ein Eintrag kein amount= angibt
waveEntitiesstring listerforderlichGegnereinträge für jede Welle
suddenDeathWaveEntitiesstring listoptionalOptionaler zyklischer Wellenpool, der nach Erschöpfung der konfigurierten Wellen läuft
prewaveMessageslist of mapsoptionalNachrichten nach aktuellem Zähler: 0 beim Eintritt, N nach dem Ende von Welle N
waveMessageslist of mapsoptionalNachrichten, die zu Beginn einer Welle angezeigt werden

Ohne Sudden-Death-Einträge endet die Sitzung, wenn der Übergang zur nächsten Welle keinen konfigurierten Eintrag findet. Normalerweise geschieht das nach dem letzten Baufenster, sofern der Spieler nicht früher weitergeht.

Format der Wellen-Entity-Einträge​

Jede Zeile in waveEntities (oder suddenDeathWaveEntities) ist ein durch Doppelpunkte getrennter Eintrag:

- 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
SchlüsselTypHinweise
waveintErforderlich. Nummer der Welle, zu der dieser Eintrag gehört
entityTypeenumErforderlich. Exakter Bukkit-EntityType-Enum-Wert; wähle eine spawnbare lebende Entität
healthMultiplierdoubleOptional, Standard 1.0. Multipliziert die maximale Lebensenergie der Entität
amountintOptional. Überschreibt baseMobAmount für diesen Eintrag
namestringOptional. Benutzerdefinierter Namens-String. Wird geparst und gespeichert, das Plugin wendet ihn derzeit aber nicht auf den gespawnten Mob an (Namensschilder sind stattdessen die Lebens-/Rüstungsleisten)
resistflagMarkiert die Entität als immun gegen Verlangsamung
fastflagErhöht die Bewegungsgeschwindigkeit
treasureflagVerdoppelt das Gold-Kopfgeld bei der Tötung
bossflagVerwendet die unten erklärte Bossmenge, skalierte Lebensenergie und eine Bossleiste pro Boss
hordeflagVerdoppelt amount und halbiert die Lebensenergie
airflagDie Entität spawnt 4 Blöcke über dem Pfad und ignoriert Bodenmauern

Verwende Schlüssel und Flags ohne umgebende Leerzeichen, Entitätstypen in Großbuchstaben sowie positive Wellennummern, Mengen und Lebensmultiplikatoren. Der Parser entfernt keine Leerzeichen und lehnt nicht jeden ungültigen Wertebereich ab. Unbekannte Schlüssel werden ignoriert. Ein fehlerhafter normaler Eintrag deaktiviert die Wellenkonfiguration; ein fehlerhafter Sudden-Death-Eintrag erzeugt eine Warnung und kann zuvor eingelesene Einträge im Pool belassen. Erfolgreiches Einlesen beweist nicht, dass die Entitäten spawnen können.

Interne Mengenberechnung​

  • amount wird um wave / 10 erhöht und anschließend auf eine ganze Zahl abgeschnitten, sodass ein Eintrag mit amount=20 bei Welle 15 21 Mobs und bei Welle 20 22 Mobs ergibt.
  • boss-Einträge überschreiben amount auf max(1, floor(wave / 10)).
  • horde-Einträge verdoppeln den finalen amount.
  • Zusätzlich zur Menge pro Eintrag fügt die Wellen-Laufzeit beim Aufbau der Welle Duplikate hinzu. Beachte, dass die Liste, in die dabei indiziert wird, die vollständig expandierte Mob-Liste ist — der Konfigurationsparser hat bereits ein Objekt pro Mob erzeugt, sodass eine einzelne amount=20-Zeile 20 aufeinanderfolgende Indizes beisteuert, nicht einen. Für jeden geraden Index i (0, 2, 4, ...), der sowohl ein gültiger Index in dieser expandierten Liste als auch kleiner als die Wellennummer ist, wird ein zusätzlicher Klon des Mobs an Index i hinzugefügt. Boss-Einträge werden auf diese Weise nie geklont. Die Anzahl der Bonus-Mobs beträgt also ungefähr ceil(min(waveNumber, listSize) / 2): 1 zusätzlicher Mob bei Welle 1, 2 bei den Wellen 3–4, 5 bei den Wellen 9–10, 8 bei den Wellen 15–16 und so weiter, bis die Wellennummer über die Liste hinauswächst.

Das Spawn-Intervall beträgt min(floor(200 / totalEntities), 20) Ticks. Bei normalen Spawns muss der Zähler das Doppelte dieses Intervalls überschreiten. Bei Horde-Spawns muss er das Doppelte des zuvor ganzzahlig halbierten Intervalls überschreiten. Durch den strikten Vergleich kommt ein zusätzlicher Zählertick hinzu; der Abstand ist also nicht exakt doppelt so groß wie das Intervall. Die Horde-Taktung richtet sich nach dem ersten verbleibenden Mob in der Wellenliste. Gemischte Horde- und gewöhnliche Einträge können die Taktung deshalb im Verlauf der Liste verändern. Jeder Mob wählt beim Spawnen zufällig eines der Startfelder des Levels.

Nachrichtenblockformat​

Sowohl prewaveMessages als auch waveMessages akzeptieren eine Liste von 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] wird beim Eintritt ausgeführt. Nach Welle N läuft prewaveMessages[N] während der Bauphase für die nächste Welle: Verwende Schlüssel 4 für eine Warnung vor Welle 5. waveMessages[N] läuft beim Beginn von Welle N. Die Schlüssel verwenden den angezeigten Sitzungszähler, auch in Sudden Death. Mehrere Nachrichteneinträge mit demselben Schlüssel überschreiben die vorherigen.

Lebenszyklus einer Welle​

Eine Sitzung durchläuft folgende Zustände:

  • STARTING — bevor der Spieler /etd start zum ersten Mal ausführt.
  • CONSTRUCTION_PHASE — 10-sekündiges Baufenster zwischen Verteidigungsphasen.
  • DEFENSIVE_PHASE — Gegner spawnen und laufen den Pfad entlang.
  • ENDING — der Spieler hat aufgegeben, verloren oder das Level ist ohne Wellen.

Der normale Bautimer dauert 10 Sekunden. /etd start oder das Werkzeug Next Wave können früher weitergehen, beachten aber weiterhin die Tutorialanforderungen (siehe Sonderfall Tutorial-Level). Die anfängliche Startphase wartet auf eine Startaktion; das Tutorial kann weitergehen, sobald seine letzte Anforderung akzeptiert wurde.

Verhalten am Wellenende:

  • Das Abschließen einer Welle gewährt waveNumber * 10 Gold.
  • Wenn du während der Welle keine Leben verloren hast, erhältst du einen "Perfekt"-Bonus in Höhe der Hälfte des Wellenbonus (waveNumber * 10 * 0.5). Die angekündigte Zahl und das tatsächlich gewährte Gold stimmen jetzt überein.
  • Jede Welle kann nur einmal auszahlen — eine Welle, die aus irgendeinem Grund zweimal als abgeschlossen gemeldet wird, wird beim zweiten Mal ignoriert, und sobald die Sitzung endet, findet überhaupt keine Auszahlung mehr statt.
  • Nach dem Wellenende wird die Modifikatorzeichenfolge der nächsten Welle angekündigt, wenn sie nicht leer ist. Sie stammt vom ersten konfigurierten Gegner, nicht von allen Einträgen einer gemischten Welle.

Wann ein Level endet​

Die Sitzung rückt nur vor, wenn die nächste Wellennummer als Schlüssel in waveEntities existiert, daher müssen die Wellennummern lückenlos ab 1 laufen. Fehlt die nächste Nummer:

  • geht der Lauf in Sudden Death über, wenn die Datei suddenDeathWaveEntities definiert;
  • andernfalls endet das Level sofort, ohne die nie gelaufene Welle mitzuzählen. Der gespeicherte Highscore und der Abschlusstitel verwenden die letzte Welle, die der Spieler tatsächlich gespielt hat.

Sudden Death​

Wenn suddenDeathWaveEntities definiert ist, läuft das Level über die konfigurierte Wellenliste hinaus weiter.

Der Sudden-Death-Pool durchläuft die konfigurierten Wellennummern. Bei Bedarf wählt EternalTD den kleinsten nicht negativen Schlüssel oberhalb des aktuellen Poolschlüssels oder springt zum kleinsten zurück, wenn kein höherer existiert. Der Poolzähler beginnt bei 0: Ein konfigurierter Schlüssel 0 wird beim ersten Durchlauf übersprungen, wenn positive Schlüssel vorhanden sind. Verwende positive Schlüssel; Lücken sind erlaubt, und Schlüssel 0 eignet sich auch nicht für die Lebensformel unten.

Der angezeigte Wellenzähler steigt weiter. Lebensenergie, Rüstung, Geschwindigkeit, Grundkopfgeld und Splitterlingsschwellen verwenden den konfigurierten wave=-Wert des gewählten Eintrags; sie skalieren nicht automatisch mit dem angezeigten Zähler. Zusätzliche Laufzeitklone und Elementarwürfe verwenden dagegen den angezeigten Zähler. Pooleinträge 10 und 20 behalten beispielsweise ihre Skalierungswerte auch bei angezeigter Welle 100. Die Suche nach der nächsten Welle prüft bei jeder angezeigten Nummer weiterhin auf einen regulären Eintrag. Nach einer früheren Lücke kann daher ein späterer regulärer Schlüssel verwendet werden.

Elementare Ausrichtung bei Welleneinheiten​

Jede Welle hat ihre eigene elementare Ausrichtung, die pro Welle rotiert:

  • Welle 1 → Feuer
  • Welle 2 → Luft
  • Welle 3 → Wasser
  • Welle 4 → Erde
  • (dann wiederholt sich das)

Beim Spawn einer normalen Welleneinheit beträgt die Chance auf das Wellenelement die angezeigte waveNumber / 100; ab angezeigter Welle 100 gelingt der Wurf immer. Ein farbiges Tag zeigt das Element an. Splitterlinge werden separat erzeugt und erhalten diesen Wurf nicht.

Die Regeln für elementaren Schaden werden von der DamageTower-Klasse des Turms verwaltet:

  • Gleiche Ausrichtung Angreifer gegen gleiche Ausrichtung Ziel — 0,5× Schaden (Resistenz).
  • Entgegengesetzte einzelne Elemente (Feuer gegen Wasser, Luft gegen Erde) — 2× Schaden (Krit).
  • Fusionsausrichtungen folgen der Tabelle unten. Andere Kombinationen ohne Übereinstimmung verursachen 1× Schaden.
  • Ein Turm ohne Ausrichtung verursacht 1× Schaden gegen alle.
Turmausrichtung2× Schaden gegen0,5× Schaden gegen
MagmaLuft, WasserErde, Feuer, Magma
DruckwelleErde, WasserLuft, Feuer, Druckwelle
SturmFeuer, ErdeLuft, Wasser, Sturm
SchlammFeuer, LuftErde, Wasser, Schlamm

Fusionsausrichtungen entstehen, wenn ein Basisturm von Unterstützungstürmen mit kombinierbaren elementaren Ausrichtungen berührt wird:

KombinationResultierende Fusion
Feuer + ErdeMagma
Feuer + LuftDruckwelle
Wasser + LuftSturm
Wasser + ErdeSchlamm

Die Konfliktregeln sind enger gefasst, als sie aussehen:

  • Erde + Luft am selben Turm setzt ihn immer auf „Ohne Ausrichtung" zurück, ganz gleich, was sonst noch anliegt.
  • Feuer + Wasser setzt nur dann auf „Ohne Ausrichtung" zurück, wenn drei oder mehr verschiedene Ausrichtungen im Spiel sind. Ein Turm, der von genau einem Feuer- und einem Wasser-Unterstützungsturm berührt wird, behält willkürlich eine der beiden, weil der Code auf „nimm die erste Ausrichtung in der Menge" durchfällt und diese Menge ungeordnet ist.
  • Unterstützungstürme ohne Ausrichtung (Fernrohrturm, Goldmine) beeinflussen das Ergebnis nie; sie fallen aus der Menge heraus, sobald irgendein ausgerichteter Turm anliegt.

Jede Neuberechnung beginnt beim eigenen Element „Ohne Ausrichtung“ des Basisturms. Das Entfernen der letzten elementaren Unterstützung setzt den Turm daher auf „Ohne Ausrichtung“ zurück.

Skalierung von Lebensenergie, Rüstung und Kopfgeld​

WaveEntity führt beim Spawn diese Schritte mit seiner konfigurierten Wellennummer aus (bei Splitterlingen der halbierten Welle des Ursprungsmobs), in dieser Reihenfolge:

  1. Die Grundlebensenergie beginnt bei 0.5 und wächst mit der Welle: health = 0.5 + ((wave - 1)^1.2) / 2.
  2. Boss-Entitäten multiplizieren das mit baseMobAmount × 0.5.
  3. Horde-Entitäten halbieren es.
  4. Hier wird das Kopfgeld berechnet, als ceil(health) — vor healthMultiplier und vor der Luft-Halbierung. treasure-Einträge verdoppeln es anschließend.
  5. maxHealth = health × healthMultiplier.
  6. Luft-Entitäten halbieren maxHealth noch einmal.
  7. Rüstung erscheint erst ab Welle 10 und ist auf maxHealth / 80 gesetzt.

Die Reihenfolge in Schritt 4 ist entscheidend: Ein healthMultiplier von 3.0 verdreifacht die Lebensenergie ohne Änderung des Grundkopfgelds. Luftgegner zahlen trotz halber Lebensenergie dasselbe Grundkopfgeld wie entsprechende Bodengegner. Die Goldmine addiert ihren Bonus beim tödlichen Schlag und schneidet das Ergebnis auf eine ganze Zahl ab; kleine Kopfgelder können deshalb kein zusätzliches Gold bringen.

Die Bewegungsgeschwindigkeit beträgt:

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

Der abschließende Term wave / 1000 verwendet die konfigurierte Gegnerwelle und wird nach den Luft- und Verlangsamungsmultiplikatoren addiert. Dieser Wert steuert das Bewegungsgeschwindigkeitsattribut von Mobs. Der Ersatzpfad für Entitäten, die keine Mob sind, teleportiert stattdessen pro Bewegungstick 0.1 Blöcke zum nächsten Ziel. Die Formel ist daher keine allgemeine Geschwindigkeit in Blöcken pro Tick.

Splitterlinge​

Ab Welle 20 spawnen Nicht-Luft-Gegner beim Tod zusätzliche kleine Mobs ("Splitterlinge").

  • Anzahl: floor(wave / 20) pro Tötung.
  • War das Elternteil ein CAVE_SPIDER, sind die Splitterlinge SILVERFISH. Andernfalls sind es CAVE_SPIDER.
  • Splitterlinge verwenden floor(parentWave / 2) und übernehmen die aktuelle Position auf der Route. Sie verwenden den Lebensmultiplikator 0.5 ihres Konstruktors und erben weder Flags noch elementare Ausrichtung des Ursprungsmobs. Bei ausreichend hohen konfigurierten Wellen können sie beim Tod weitere Splitterlinge erzeugen.
  • Splitterlinge geben beim Tod 0 Gold, und Luft-Gegner spawnen niemals Splitterlinge.

Sonderfall Tutorial-Level​

Das Level tutorial.yml verwendet ein fest codiertes Skript, das an seine Kartenkoordinaten gebunden ist:

  • Die verlangten Turmtypen müssen auf den markierten Feldern platziert oder dort verbessert werden, wenn der passende Turm bereits steht. Ein falscher Turm auf einem verlangten Feld darf verkauft werden; andere Platzierungen, Verkäufe und Verbesserungen werden während dieser Skriptstufe abgelehnt. Die letzte akzeptierte Anforderung fordert sofort die nächste Welle an.
  • Farbiger Beton markiert die verlangten Felder. Sind FMM und das Modell reddownarrow verfügbar, zeigt ein roter Pfeil über jedem Feld den verlangten Turm oder die Verbesserung an.
  • Beim Eintritt in die Bauphase nach den Wellen 1, 2 und 3 fügt das Tutorial +100 Gold hinzu, nach Welle 4 +200. Das ist zusätzliches Einkommen, keine Garantie ausreichenden Goldes. Andere Wellennummern erhalten keine Zugabe.
  • Jedes benötigte Turmfeld ist nach dem gewünschten Turm eingefärbt: grüner Beton für den Basisturm, braun für die Barrikade, weiß für Zucker, cyan für das Fernrohr, gelb für den Strahlengenerator, rot für die Explosionsfabrik, blau für die Eisbox, grau für den Rüstungsbrecher, orange für die Goldmine, violett für den Obsidiansteinbruch, schwarz für alles andere.
  • Während jeder geskripteten Stufe zählt eine grüne Bossleiste die platzierten benötigten Türme als Build towers! done/total!. Alle zwei Minuten erinnert dich das Tutorial daran, dass du mit /etd quit gehen kannst, und wiederholt, solange noch Anforderungen offen sind, die aktuelle Nachricht vor der Welle.

Spielerleben und Gold​

  • Startleben: 20.
  • Startgold: 150.
  • Boss-Mobs kosten 5 Leben, wenn sie das Ende erreichen. Alle anderen Mobs kosten 1 Leben.
  • Jedes Umschalten von /etd cheat, auch das Ausschalten, setzt Gold auf 10,000,000 und Leben auf 1,000,000 zurück. Die Sitzung bleibt dauerhaft von Highscores ausgeschlossen.
  • /etd setwave <n> ändert den Sitzungszähler und die Belohnungssperre und markiert den Lauf als gecheatet. Es ersetzt keine aktiven Gegner und startet diese Welle nicht sofort. Der nächste Übergang verwendet n + 1.

Highscore-Tracking​

Jede Level-Konfiguration speichert highscoreWave und highscorePlayerName. Am Ende einer Nicht-Cheat-Sitzung speichert das Plugin die neue Wellennummer in der Level-Datei und sendet eine serverweite Nachricht, wenn der bisherige Punktestand übertroffen wurde.