Saltar al contenido principal

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​

CampoTipoPor defectoNotas
isEnabledbooltrueLos archivos deshabilitados no se cargan; los niveles que dependan de esa configuración ausente no pueden iniciarse
baseMobAmountint20Cantidad por defecto usada cuando una entrada no especifica amount=
waveEntitieslista de stringsrequeridoEntradas de enemigos oleada por oleada
suddenDeathWaveEntitieslista de stringsopcionalConjunto cíclico opcional de oleadas que se ejecuta cuando se agotan las oleadas configuradas
prewaveMessageslista de mapasopcionalMensajes según el contador actual: 0 al entrar, N después de terminar la oleada N
waveMessageslista de mapasopcionalMensajes mostrados cuando comienza una oleada

Sin entradas de muerte súbita, la sesión termina cuando la transición a la siguiente oleada no encuentra una entrada configurada. Normalmente ocurre después de la última ventana de construcción, salvo que el jugador avance antes.

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
ClaveTipoNotas
waveintRequerido. Número de oleada al que pertenece esta entrada
entityTypeenumRequerido. Valor exacto del enum EntityType de Bukkit; elige una entidad viva que pueda generarse
healthMultiplierdoubleOpcional, por defecto 1.0. Multiplica la salud máxima de la entidad
amountintOpcional. Sobrescribe baseMobAmount para esta entrada
namestringOpcional. 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)
resistflagMarca la entidad como inmune a ralentización
fastflagAumenta la velocidad de movimiento
treasureflagDuplica la recompensa de oro al matarla
bossflagUsa la regla de cantidad de jefes indicada abajo, salud escalada y una barra por jefe
hordeflagDuplica amount y reduce la salud a la mitad
airflagLa entidad aparece 4 bloques por encima del camino e ignora los muros del suelo

Escribe las claves y flags sin espacios alrededor, los tipos de entidad en mayúsculas y números de oleada, cantidades y multiplicadores de salud positivos. El analizador no recorta espacios ni rechaza todos los rangos inválidos. Ignora las claves desconocidas. Una entrada normal mal formada deshabilita la configuración; una de muerte súbita genera una advertencia y puede dejar en el grupo las entradas ya analizadas. Que el archivo se analice no demuestra que sus entidades puedan aparecer.

Cálculo interno de cantidades​

  • amount se incrementa en wave / 10 y luego se trunca a un número entero, así que una entrada con amount=20 produce 21 mobs en la oleada 15 y 22 en la oleada 20.
  • Las entradas boss sobrescriben amount a max(1, floor(wave / 10)).
  • Las entradas horde duplican la cantidad amount final.
  • 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=20 aporta 20 índices consecutivos, no uno. Por cada índice par i (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 índice i. Las entradas boss nunca se clonan de esta forma. Así que el número de mobs extra es aproximadamente ceil(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.

El intervalo de aparición es min(floor(200 / totalEntities), 20) ticks. Para una aparición normal, el contador debe superar el doble de ese intervalo; con el ritmo de horda, debe superar el doble del intervalo dividido entre dos mediante división entera. Como la comparación es estricta, hay un tick adicional del contador: no es un intervalo exactamente doble. El ritmo de horda se elige según el primer mob restante de la lista de oleada, por lo que mezclar entradas de horda y normales puede cambiar el ritmo a medida que cambia esa lista. 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: 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] se ejecuta al entrar. Tras terminar la oleada N, prewaveMessages[N] se ejecuta durante la construcción para la siguiente: usa la clave 4 para advertir de la oleada 5. waveMessages[N] se ejecuta al comenzar la oleada N. Las claves usan el contador mostrado de la sesión, también en muerte súbita. Las entradas repetidas con la misma clave sobrescriben las anteriores.

Ciclo de vida de la oleada​

Una sesión atraviesa estos estados:

  • STARTING — antes de que el jugador ejecute /etd start por 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.

El temporizador normal de construcción dura 10 segundos. /etd start o la herramienta Next Wave permiten avanzar antes, pero siguen respetando los requisitos del tutorial (ver Nivel tutorial). La fase inicial espera una acción de inicio; el tutorial puede avanzar al aceptar su último requisito.

Comportamiento al final de la oleada:

  • Completar una oleada otorga waveNumber * 10 de 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.
  • Tras finalizar la oleada se anuncia la cadena de modificadores de la siguiente si no está vacía. Procede del primer enemigo configurado, no de todas las entradas de una oleada mixta.

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 recorre los números de oleada configurados. Cada vez que se necesita, EternalTD elige la menor clave no negativa que sea mayor que la clave actual del grupo, o vuelve a la menor si no hay ninguna superior. El contador inicial del grupo es 0: una clave configurada 0 se omite en la primera vuelta si existen claves positivas. Usa claves positivas; se permiten huecos y la clave 0 tampoco sirve para la fórmula de salud de abajo.

El contador mostrado sigue aumentando. La salud, armadura, velocidad, recompensa base y umbrales de splitterlings usan el valor wave= configurado de la entrada elegida; no escalan automáticamente con el contador mostrado. Los clones adicionales y las tiradas elementales sí usan el contador mostrado. Por ejemplo, las entradas 10 y 20 conservan esos valores de escalado incluso en la oleada mostrada 100. La búsqueda siguiente sigue comprobando si existe una entrada normal para cada número mostrado, por lo que puede usar una clave normal posterior tras un hueco anterior.

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 aparece una entidad normal de oleada, su probabilidad de heredar la sintonía elemental es el waveNumber / 100 mostrado; desde la oleada mostrada 100 siempre la hereda. Una etiqueta de color indica la sintonía. Los splitterlings se crean por separado y no reciben esta tirada.

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 siguen la tabla siguiente. Las demás combinaciones sin coincidencia infligen 1× de daño.
  • Una torre sin sintonía inflige 1× de daño a todos.
Sintonía de la torreDaño de 2× contraDaño de 0.5× contra
MagmaAire, AguaTierra, Fuego, Magma
ExplosiónTierra, AguaAire, Fuego, Explosión
TormentaFuego, TierraAire, Agua, Tormenta
LodoFuego, AireTierra, Agua, Lodo

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ónFusión resultante
Fuego + TierraMagma
Fuego + AireExplosión
Agua + AireTormenta
Agua + TierraLodo

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.

Cada recálculo parte del elemento propio de Basic Tower, Sin sintonía, así que al retirar el último apoyo elemental la torre vuelve a Sin sintonía.

Escalado de salud, armadura y recompensa​

WaveEntity aplica estos pasos al aparecer usando su número de oleada configurado (o la mitad de la oleada del progenitor para un splitterling), en este orden:

  1. La salud base parte de 0.5 y crece con la oleada: health = 0.5 + ((wave - 1)^1.2) / 2.
  2. Las entidades de tipo boss multiplican eso por baseMobAmount × 0.5.
  3. Las entidades de tipo horde lo reducen a la mitad.
  4. La recompensa se calcula aquí, como ceil(health) — antes de healthMultiplier y antes de la penalización aérea. Las entradas treasure la duplican a continuación.
  5. maxHealth = health × healthMultiplier.
  6. Las entidades de tipo air reducen maxHealth a la mitad otra vez.
  7. 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 sin cambiar la recompensa base, y los enemigos aéreos pagan la misma recompensa base que sus equivalentes terrestres pese a tener la mitad de salud. Gold Mine añade su bonificación en el golpe mortal, truncando el resultado a un entero; las recompensas pequeñas pueden no ganar oro extra.

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 usa la oleada configurada del enemigo y se añade después de los multiplicadores de aire y ralentización. El valor controla el atributo de velocidad de movimiento de los mobs. La alternativa para entidades que no son Mob las teletransporta 0.1 bloques hacia su siguiente destino por tick de movimiento; esta fórmula no es una velocidad universal en bloques por tick.

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 son SILVERFISH. De lo contrario son CAVE_SPIDER.
  • Los splitterlings usan floor(parentWave / 2) y heredan la posición actual en la ruta. Usan el multiplicador de salud 0.5 de su constructor y no heredan los flags ni la sintonía elemental del progenitor. Con oleadas configuradas suficientemente altas pueden producir 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 nivel tutorial.yml usa un script fijo vinculado a las coordenadas de su mapa:

  • Debes colocar los tipos de torre requeridos en las casillas resaltadas o mejorarlos allí si ya están presentes. Se permite vender una torre incorrecta en una casilla requerida; las instalaciones, ventas y mejoras ajenas se rechazan mientras se aplica esa etapa. El último requisito aceptado solicita la siguiente oleada inmediatamente.
  • El concreto de colores marca las casillas requeridas. Si están disponibles FMM y el modelo reddownarrow, una flecha roja indica la torre o mejora requerida sobre cada casilla.
  • Al entrar en construcción después de las oleadas 1, 2 y 3, el tutorial añade +100 de oro; después de la 4 añade +200. Es un ingreso extra, no una garantía de que puedas pagar. Los demás números de oleada no reciben esta aportación.
  • 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.
  • Durante cada etapa del guion, una barra de jefe verde cuenta las torres requeridas que has colocado, con el formato Build towers! done/total!. Cada dos minutos, el tutorial te recuerda que /etd quit te saca de la partida y, mientras queden requisitos, repite el mensaje actual previo a la oleada.

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.
  • Cada cambio de /etd cheat, incluso al desactivarlo, restablece el oro a 10,000,000 y las vidas a 1,000,000. La sesión queda permanentemente excluida de las puntuaciones máximas.
  • /etd setwave <n> cambia el contador de la sesión y la protección de recompensas y marca la partida como tramposa; no reemplaza los enemigos activos ni inicia esa oleada inmediatamente. La siguiente transición usa n + 1.

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.