Vagues et ennemis d'EternalTD
Un fichier de vagues sous plugins/EternalTD/waves/ définit l'ensemble du contingent ennemi pour un niveau, y compris les vagues normales, les vagues de mort subite et, éventuellement, les messages pré-vague ou de vague. Chaque configuration de niveau référence un fichier de vagues via wavesConfigFile:.
Champs de premier niveau
| Champ | Type | Défaut | Notes |
|---|---|---|---|
isEnabled | bool | true | Désactiver ici désactive également le niveau qui dépend de ce fichier |
baseMobAmount | int | 20 | Quantité par défaut utilisée lorsqu'une entrée ne spécifie pas amount= |
waveEntities | liste de chaînes | requis | Entrées d'ennemis vague par vague |
suddenDeathWaveEntities | liste de chaînes | optionnel | Réserve cyclique optionnelle de vagues qui s'exécute après l'épuisement des vagues configurées |
prewaveMessages | liste de maps | optionnel | Messages affichés avant le démarrage d'une vague spécifique |
waveMessages | liste de maps | optionnel | Messages affichés au début d'une vague |
Si le fichier de vagues ne définit aucune entrée de mort subite, le niveau se termine dès l'épuisement des vagues configurées.
Format des entrées d'entité de vague
Chaque ligne de waveEntities (ou suddenDeathWaveEntities) est une entrée séparée par des deux-points :
- 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
| Clé | Type | Notes |
|---|---|---|
wave | int | Requis. Numéro de la vague à laquelle cette entrée appartient |
entityType | enum | Requis. Valeur de l'enum Bukkit EntityType |
healthMultiplier | double | Optionnel. Multiplie la vie maximale de l'entité |
amount | int | Optionnel. Remplace baseMobAmount pour cette entrée |
name | string | Optionnel. Chaîne de nom personnalisée |
resist | flag | Marque l'entité comme insensible au ralentissement |
fast | flag | Augmente la vitesse de déplacement |
treasure | flag | Double la prime d'or à l'élimination |
boss | flag | Apparaît comme un boss unique avec une vie augmentée et une barre de boss |
horde | flag | Double amount et divise la vie par deux |
air | flag | L'entité apparaît 4 blocs au-dessus du chemin et ignore les murs au sol |
Calculs internes de quantité
amountest incrémenté dewave / 10avant l'apparition.- Les entrées
bossremplacentamountparmax(1, floor(wave / 10)). - Les entrées
hordedoublent leamountfinal. - En plus de la quantité par entrée, le runtime de vague clone également des copies supplémentaires des entrées d'indices premier, troisième, cinquième, ... de la vague (chaque indice pair
0, 2, 4, ...) jusqu'àwaveNumber - 1fois. Les entrées boss ne sont jamais clonées de cette manière. Les vagues plus élevées empilent donc davantage de duplicatas des entrées d'indices inférieurs.
Format des blocs de message
prewaveMessages et waveMessages acceptent tous deux une liste de maps :
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 s'exécute au début de la phase de construction de cette vague. waveMessages s'exécute à l'instant où la phase défensive commence.
Cycle de vie d'une vague
Une session passe par ces états :
STARTING— avant que le joueur n'exécute/etd startpour la première fois.CONSTRUCTION_PHASE— fenêtre de construction de 10 secondes entre les phases défensives.DEFENSIVE_PHASE— les ennemis apparaissent et parcourent le chemin.ENDING— le joueur a quitté, perdu ou le niveau a épuisé ses vagues.
La phase de construction dure toujours 10 secondes sauf si le tutoriel la maintient (voir Cas particulier du niveau tutoriel).
Comportement de fin de vague :
- Terminer une vague accorde
waveNumber * 10d'or. - Si vous n'avez subi aucun dégât pendant la vague, vous recevez une seconde copie de ce bonus en tant que bonus « Parfait ».
- La liste des modificateurs de la vague suivante est annoncée après la fin de chaque vague.
Mort subite
Si suddenDeathWaveEntities est défini, le niveau continue de s'exécuter au-delà de la liste des vagues configurées. Le compteur de mort subite s'incrémente à chaque vague et revient à la vague 1 de la réserve de mort subite dès qu'il dépasse la taille de la réserve.
Affinité élémentaire des entités de vague
Chaque vague a sa propre affinité élémentaire qui tourne d'une vague à l'autre :
- Vague 1 → Feu
- Vague 2 → Air
- Vague 3 → Eau
- Vague 4 → Terre
- (puis répète)
Lorsqu'une entité de vague apparaît, il y a une chance de waveNumber / 100 que l'entité hérite de l'affinité élémentaire de la vague, affichée sous forme d'étiquette colorée flottant au-dessus de la créature.
Les règles de dégâts élémentaires sont gérées par la classe DamageTower de la tour :
- Même affinité attaquant contre même affinité cible — dégâts ×0,5 (résistance).
- Éléments simples opposés (Feu contre Eau, Air contre Terre) — dégâts ×2 (critique).
- Les affinités de fusion (Magma, Souffle, Tempête, Boue) suivent des interactions appariées ; consultez le code source pour la matrice complète.
- Une tour sans affinité inflige des dégâts ×1 à tout le monde.
Les affinités de fusion se forment lorsqu'une Tour de base est touchée par des tours de soutien aux affinités élémentaires combinables :
| Combinaison | Fusion résultante |
|---|---|
| Feu + Terre | Magma |
| Feu + Air | Souffle |
| Eau + Air | Tempête |
| Eau + Terre | Boue |
Les paires conflictuelles (Feu + Eau, Terre + Air) et tout mélange de 3 éléments ou plus ramènent la tour à l'état Sans affinité.
Mise à l'échelle de la vie, de l'armure et du butin
WaveEntity applique ces formules à l'apparition :
health = (currentHealth + ((wave - 1)^1.2) / 2) × healthMultiplier- Les entités boss voient leur vie multipliée par
baseMobAmount × 0.5en plus. - Les entités horde voient leur vie divisée par deux.
- Les entités air voient leur vie à nouveau divisée par deux.
- L'armure n'apparaît qu'à partir de la vague 10, fixée à
maxHealth / 80. - Le butin est
ceil(health × 1)et doublé pour les entréestreasure. Les tours de soutien Mine d'or ajoutent au butin à la mort.
Engeance scindée (Splitterlings)
À partir de la vague 20, les ennemis non aériens font apparaître à la mort de petites créatures supplémentaires (« splitterlings »).
- Nombre :
floor(wave / 20)par élimination. - Si le parent était un
CAVE_SPIDER, les splitterlings sont desSILVERFISH. Sinon, ce sont desCAVE_SPIDER. - Les splitterlings apparaissent à
wave / 2de la vague du parent, donc une partie suffisamment avancée peut encore enchaîner un splitterling en d'autres splitterlings lors de sa propre mort. - Les splitterlings ne donnent aucun or à la mort et les ennemis aériens ne font jamais apparaître de splitterlings.
Cas particulier du niveau tutoriel
La carte du tutoriel fournie s'exécute via un script de vague tutoriel codé en dur :
- La phase de construction ne se termine pas automatiquement tant que vous n'avez pas placé les tours exactes requises sur les cases mises en évidence.
- Les tours codées en dur sont indiquées par des plaques de béton coloré sous la case ciblée et, si FMM est installé, par un modèle de flèche rouge pointant vers le bas flottant au-dessus.
- Le tutoriel triche en ajoutant un peu d'or supplémentaire à la réserve du joueur lors des premières vagues pour que la composition de tours scriptée reste toujours abordable.
Vies et or du joueur
- Vies de départ : 20.
- Or de départ : 150.
- Les boss coûtent 5 vies s'ils atteignent la sortie. Toutes les autres créatures coûtent 1 vie.
- La triche (
/etd cheat) règle les vies et l'or sur des valeurs effectivement illimitées et marque la session comme trichée pour les besoins du meilleur score.
Suivi des meilleurs scores
Chaque configuration de niveau conserve highscoreWave et highscorePlayerName. À la fin d'une session sans triche, le plugin enregistre le nouveau numéro de vague dans le fichier de niveau et diffuse un message à l'échelle du serveur s'il a battu le score précédent.