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 | Los archivos deshabilitados no se cargan; los niveles que dependan de esa configuración ausente no pueden iniciarse |
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 según el contador actual: 0 al entrar, N después de terminar la oleada N |
waveMessages | lista de mapas | opcional | Mensajes 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
| Clave | Tipo | Notas |
|---|---|---|
wave | int | Requerido. Número de oleada al que pertenece esta entrada |
entityType | enum | Requerido. Valor exacto del enum EntityType de Bukkit; elige una entidad viva que pueda generarse |
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 | Usa la regla de cantidad de jefes indicada abajo, salud escalada y una barra por 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 |
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
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.
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 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.
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 * 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.
- 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 torre | Daño de 2× contra | Daño de 0.5× contra |
|---|---|---|
| Magma | Aire, Agua | Tierra, Fuego, Magma |
| Explosión | Tierra, Agua | Aire, Fuego, Explosión |
| Tormenta | Fuego, Tierra | Aire, Agua, Tormenta |
| Lodo | Fuego, Aire | Tierra, 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ón | Fusión resultante |
|---|---|
| Fuego + Tierra | Magma |
| Fuego + Aire | Explosión |
| Agua + Aire | Tormenta |
| Agua + Tierra | Lodo |
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:
- 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 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 sonSILVERFISH. De lo contrario sonCAVE_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
+100de 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 quitte 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 a10,000,000y las vidas a1,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 usan + 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.