Oleadas y enemigos de EternalTD
Un archivo de oleadas bajo plugins/EternalTD/waves/ define toda la alineación de enemigos de un nivel, incluyendo oleadas normales, oleadas de muerte súbita y mensajes opcionales de pre-oleada o de oleada. Cada configuración de nivel hace referencia a un archivo de oleadas mediante wavesConfigFile:.
Campos de nivel superior
| Campo | Tipo | Por defecto | Notas |
|---|---|---|---|
isEnabled | bool | true | Deshabilitar aquí también deshabilita el nivel que depende de este archivo |
baseMobAmount | int | 20 | Cantidad por defecto usada cuando una entrada no especifica amount= |
waveEntities | lista de strings | requerido | Entradas de enemigos oleada por oleada |
suddenDeathWaveEntities | lista de strings | opcional | Conjunto cíclico opcional de oleadas que se ejecuta cuando se agotan las oleadas configuradas |
prewaveMessages | lista de mapas | opcional | Mensajes mostrados antes de que comience una oleada específica |
waveMessages | lista de mapas | opcional | Mensajes mostrados cuando comienza una oleada |
Si el archivo de oleadas no define ninguna entrada de muerte súbita, el nivel termina en cuanto se agotan las oleadas configuradas.
Formato de entrada de entidad de oleada
Cada línea en waveEntities (o suddenDeathWaveEntities) es una entrada separada por dos puntos:
- 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
| Clave | Tipo | Notas |
|---|---|---|
wave | int | Requerido. Número de oleada al que pertenece esta entrada |
entityType | enum | Requerido. Valor del enum EntityType de Bukkit |
healthMultiplier | double | Opcional, por defecto 1.0. Multiplica la salud máxima de la entidad |
amount | int | Opcional. Sobrescribe baseMobAmount para esta entrada |
name | string | Opcional. Cadena de nombre personalizado. Se analiza y se almacena, pero actualmente el plugin no la aplica al mob generado (las placas de nombre son en su lugar las barras de salud/armadura) |
resist | flag | Marca la entidad como inmune a ralentización |
fast | flag | Aumenta la velocidad de movimiento |
treasure | flag | Duplica la recompensa de oro al matarla |
boss | flag | Aparece como un único jefe con salud escalada y una barra de jefe |
horde | flag | Duplica amount y reduce la salud a la mitad |
air | flag | La entidad aparece 4 bloques por encima del camino e ignora los muros del suelo |
Cálculo interno de cantidades
amountse incrementa enwave / 10y luego se trunca a un número entero, así que una entrada conamount=20produce 21 mobs en la oleada 15 y 22 en la oleada 20.- Las entradas
bosssobrescribenamountamax(1, floor(wave / 10)). - Las entradas
hordeduplican la cantidadamountfinal. - Además de la cantidad por entrada, el runtime de oleada añade duplicados al construir la oleada. Ten en cuenta que la lista que indexa es la lista de mobs completamente expandida — el analizador de la configuración ya ha emitido un objeto por mob, así que una sola línea
amount=20aporta 20 índices consecutivos, no uno. Por cada índice pari(0, 2, 4, ...) que sea a la vez un índice válido de esa lista expandida y menor que el número de oleada, se añade un clon extra del mob del índicei. Las entradasbossnunca se clonan de esta forma. Así que el número de mobs extra es aproximadamenteceil(min(waveNumber, listSize) / 2): 1 mob extra en la oleada 1, 2 en las oleadas 3-4, 5 en las oleadas 9-10, 8 en las oleadas 15-16, y así hasta que el número de oleada supera el tamaño de la lista.
La cadencia de aparición dentro de una oleada es min(200 / totalEntities, 20) ticks, y el runtime espera el doble de eso antes de soltar cada mob. Las oleadas horde reducen ese intervalo a la mitad, soltando sus mobs al doble del ritmo normal. Cada mob elige al azar una de las casillas de inicio del nivel cuando aparece.
Formato del bloque de mensajes
Tanto prewaveMessages como waveMessages aceptan una lista de mapas:
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 se ejecuta al comienzo de la fase de construcción para esa oleada. waveMessages se ejecuta en el momento en que comienza la fase defensiva.
Ciclo de vida de la oleada
Una sesión atraviesa estos estados:
STARTING— antes de que el jugador ejecute/etd startpor primera vez.CONSTRUCTION_PHASE— ventana de construcción de 10 segundos entre fases defensivas.DEFENSIVE_PHASE— los enemigos están apareciendo y recorriendo el camino.ENDING— el jugador salió, perdió o el nivel se quedó sin oleadas.
La fase de construcción siempre dura 10 segundos a menos que el tutorial la retenga (ver Nivel tutorial).
Comportamiento al final de la oleada:
- Completar una oleada otorga
waveNumber * 10de oro. - Si no perdiste ninguna vida durante la oleada, recibes una bonificación "Perfect" que vale la mitad de la bonificación de oleada (
waveNumber * 10 * 0.5). El número anunciado y el oro realmente otorgado ahora coinciden. - Cada oleada solo puede pagar una vez — una oleada que de algún modo informe de su finalización dos veces se ignora la segunda vez, y no hay ningún pago en absoluto una vez que la sesión está terminando.
- La lista de modificadores de la siguiente oleada se anuncia tras el final de cada oleada.
Cuándo termina un nivel
La sesión solo avanza si el siguiente número de oleada existe como clave en waveEntities, así que los números de oleada deben ser contiguos empezando en 1. Cuando falta el siguiente número:
- si el archivo define
suddenDeathWaveEntities, la partida pasa a muerte súbita; - de lo contrario, el nivel termina de inmediato, sin contar la oleada que nunca llegó a ejecutarse. La puntuación máxima guardada y el título de finalización usan la última oleada que el jugador jugó realmente.
Muerte súbita
Si suddenDeathWaveEntities está definido, el nivel sigue ejecutándose más allá de la lista de oleadas configuradas.
El grupo de muerte súbita cicla por número de oleada configurado, no por un contador acumulativo: cada vez que hace falta una oleada de muerte súbita, EternalTD elige el número wave= más bajo del grupo que sea mayor que el actual, y vuelve al número configurado más bajo cuando no hay ninguno superior. Por tanto, el grupo no necesita estar numerado 1, 2, 3, ...: los huecos y los números de inicio arbitrarios ciclan correctamente.
El número de oleada mostrado sigue subiendo desde la lista de oleadas normales; lo único que cicla es la entrada del grupo que se genera.
Sintonía elemental en las entidades de oleada
Cada oleada tiene su propia sintonía elemental que rota por oleada:
- Oleada 1 → Fuego
- Oleada 2 → Aire
- Oleada 3 → Agua
- Oleada 4 → Tierra
- (luego se repite)
Cuando una entidad de oleada aparece, hay una probabilidad de waveNumber / 100 de que la entidad herede la sintonía elemental de la oleada, mostrada como una etiqueta de color flotando sobre el mob.
Las reglas de daño elemental son manejadas por la clase DamageTower de la torre:
- Atacante con la misma sintonía vs objetivo con la misma sintonía — 0.5× de daño (resist).
- Elementos individuales opuestos (Fuego vs Agua, Aire vs Tierra) — 2× de daño (crit).
- Las sintonías de fusión (Magma, Blast, Storm, Sludge) siguen interacciones por pares; ver el código fuente para la matriz completa.
- Una torre sin sintonía inflige 1× de daño a todos.
Las sintonías de fusión se forman cuando una Torre Básica es tocada por torres de apoyo con sintonías elementales combinables:
| Combinación | Fusión resultante |
|---|---|
| Fuego + Tierra | Magma |
| Fuego + Aire | Blast |
| Agua + Aire | Storm |
| Agua + Tierra | Sludge |
Las reglas de conflicto son más estrechas de lo que parecen:
- Tierra + Aire en la misma torre siempre la revierten a Sin sintonía, sea lo que sea lo demás que tenga adjunto.
- Fuego + Agua revierten a Sin sintonía solo cuando hay tres o más sintonías distintas en juego. Una torre tocada por exactamente una torre de apoyo de Fuego y una de Agua conserva una de las dos de forma arbitraria, porque el código acaba cayendo en "elige la primera sintonía del conjunto" y ese conjunto no está ordenado.
- Las torres de apoyo sin sintonía (Spyglass, Gold Mine) nunca afectan al resultado; se descartan del conjunto en cuanto hay adjunta cualquier torre con sintonía.
Escalado de salud, armadura y recompensa
WaveEntity aplica estos pasos al aparecer, exactamente en este orden:
- La salud base parte de
0.5y crece con la oleada:health = 0.5 + ((wave - 1)^1.2) / 2. - Las entidades de tipo boss multiplican eso por
baseMobAmount × 0.5. - Las entidades de tipo horde lo reducen a la mitad.
- La recompensa se calcula aquí, como
ceil(health)— antes dehealthMultipliery antes de la penalización aérea. Las entradastreasurela duplican a continuación. maxHealth = health × healthMultiplier.- Las entidades de tipo air reducen
maxHealtha la mitad otra vez. - La armadura solo aparece a partir de la oleada 10, establecida en
maxHealth / 80.
El orden del paso 4 importa: un healthMultiplier de 3.0 triplica la salud de un enemigo sin cambiar su pago en oro, y los enemigos aéreos pagan la misma recompensa que sus equivalentes terrestres a pesar de tener la mitad de salud. Las torres de apoyo Gold Mine añaden su bonificación a la recompensa en el momento del golpe mortal.
La velocidad de movimiento es:
speed = 0.3 × (1 - slow)
× 1.5 × (1 - slow) if fast
× 0.5 if air
+ wave / 1000
El término final wave / 1000 significa que los enemigos se vuelven muy ligeramente más rápidos cada oleada independientemente de sus flags, y se aplica después de los multiplicadores de aire y ralentización en lugar de ser escalado por ellos.
Splitterlings
A partir de la oleada 20, los enemigos no aéreos generan mobs pequeños adicionales ("splitterlings") al morir.
- Cantidad:
floor(wave / 20)por muerte. - Si el progenitor era un
CAVE_SPIDER, los splitterlings sonSILVERFISH. De lo contrario sonCAVE_SPIDER. - Los splitterlings aparecen en
wave / 2de la oleada del progenitor, por lo que una partida lo suficientemente profunda aún puede encadenar un splitterling en más splitterlings al morir. - Los splitterlings dan 0 de oro al morir y los enemigos aéreos nunca generan splitterlings.
Caso especial del nivel tutorial
El mapa tutorial incluido se ejecuta a través de un script de oleadas tutorial codificado:
- La fase de construcción no termina automáticamente hasta que hayas colocado las torres requeridas exactas en las casillas resaltadas.
- Las torres codificadas se indican mediante parches de concreto coloreados bajo la casilla de la cuadrícula objetivo y, si FMM está instalado, un modelo de flecha roja apuntando hacia abajo flotando sobre ella.
- El tutorial inyecta oro extra en las primeras oleadas para que la alineación de torres con script siempre sea asequible:
+100en las oleadas 1, 2 y 3, y+200en la oleada 4. Las oleadas posteriores no reciben nada extra. - Cada casilla de torre requerida se colorea según la torre que pide: concreto verde para Basic Tower, marrón para Barricade, blanco para Sugar, cian para Spyglass, amarillo para Beam Generator, rojo para Explosion Factory, azul para Ice Box, gris para Armor Crusher, naranja para Gold Mine, morado para Obsidian Quarry, negro para cualquier otra cosa.
Vidas y oro del jugador
- Vidas iniciales: 20.
- Oro inicial: 150.
- Los mobs jefe cuestan 5 vidas si llegan al final. Todos los demás mobs cuestan 1 vida.
- Hacer trampa (
/etd cheat) establece el oro a10.000.000y las vidas a1.000.000, y marca la sesión como tramposa a efectos de puntuación máxima. Volver a desactivar el modo trampa no restaura los valores originales, y el flag de trampa es permanente para esa sesión. /etd setwave <n>también establece el flag de trampa, y reajusta la salvaguarda de recompensa de oleada para que la oleada a la que saltas siga pagando cuando se complete.
Seguimiento de puntuaciones máximas
Cada configuración de nivel persiste highscoreWave y highscorePlayerName. Al final de una sesión sin trampas, el plugin guarda el nuevo número de oleada en el archivo del nivel y emite un mensaje a todo el servidor si superó la puntuación anterior.