Ondas e Inimigos do EternalTD
Um arquivo de onda em plugins/EternalTD/waves/ define toda a lineup de inimigos para um nível, incluindo ondas normais, ondas de morte súbita e mensagens opcionais antes ou durante a onda. Cada config de nível referencia um arquivo de onda através de wavesConfigFile:.
Campos de Nível Superior
| Campo | Tipo | Padrão | Notas |
|---|---|---|---|
isEnabled | bool | true | Desabilitar aqui também desabilita o nível que depende deste arquivo |
baseMobAmount | int | 20 | Quantidade padrão usada quando uma entrada não especifica amount= |
waveEntities | lista de strings | obrigatório | Entradas de inimigos onda a onda |
suddenDeathWaveEntities | lista de strings | opcional | Pool cíclico opcional de ondas que roda depois que as ondas configuradas se esgotam |
prewaveMessages | lista de mapas | opcional | Mensagens exibidas antes de uma onda específica começar |
waveMessages | lista de mapas | opcional | Mensagens exibidas quando uma onda começa |
Se o arquivo de onda não definir nenhuma entrada de morte súbita, o nível termina assim que as ondas configuradas se esgotam.
Formato de Entrada de Entidade de Onda
Cada linha em waveEntities (ou suddenDeathWaveEntities) é uma entrada separada por dois-pontos:
- 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
| Chave | Tipo | Notas |
|---|---|---|
wave | int | Obrigatório. Número da onda à qual esta entrada pertence |
entityType | enum | Obrigatório. Valor do enum EntityType do Bukkit |
healthMultiplier | double | Opcional, padrão 1.0. Multiplica a vida máxima da entidade |
amount | int | Opcional. Substitui baseMobAmount para esta entrada |
name | string | Opcional. String de nome personalizado. É interpretada e armazenada, mas o plugin atualmente não a aplica ao mob spawnado (as nameplates são as barras de vida/armadura em vez disso) |
resist | flag | Marca a entidade como imune a lentidão |
fast | flag | Aumenta a velocidade de movimento |
treasure | flag | Dobra a recompensa em ouro ao matar |
boss | flag | Spawna como um único chefe com vida escalada e uma barra de chefe |
horde | flag | Dobra o amount e divide a vida pela metade |
air | flag | A entidade spawna 4 blocos acima do caminho e ignora muralhas terrestres |
Matemática Interna de Quantidade
amounté incrementado porwave / 10e depois truncado de volta para um número inteiro, então uma entrada comamount=20gera 21 mobs na onda 15 e 22 na onda 20.- Entradas com
bosssobrescrevemamountparamax(1, floor(wave / 10)). - Entradas com
hordedobram oamountfinal. - Além da quantidade por entrada, o runtime da onda adiciona duplicatas quando a onda é montada. Note que a lista que ele indexa é a lista de mobs totalmente expandida — o parser de configuração já emitiu um objeto por mob, então uma única linha
amount=20contribui com 20 índices consecutivos, e não um só. Para cada índice pari(0, 2, 4, ...) que seja ao mesmo tempo um índice válido nessa lista expandida e menor que o número da onda, um clone extra do mob no índiceié adicionado. Entradasbossnunca são clonadas dessa forma. Assim, o número de mobs bônus é aproximadamenteceil(min(waveNumber, listSize) / 2): 1 mob extra na onda 1, 2 nas ondas 3-4, 5 nas ondas 9-10, 8 nas ondas 15-16, e assim por diante até que o número da onda ultrapasse o tamanho da lista.
A cadência de spawn dentro de uma onda é min(200 / totalEntities, 20) ticks, e o runtime espera o dobro disso antes de liberar cada mob. Ondas horde reduzem esse intervalo pela metade, liberando seus mobs no dobro da taxa normal. Cada mob escolhe aleatoriamente um dos tiles de início do nível quando spawna.
Formato de Bloco de Mensagem
Tanto prewaveMessages quanto waveMessages aceitam uma 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 roda no início da fase de construção daquela onda. waveMessages roda no momento em que a fase defensiva começa.
Ciclo de Vida da Onda
Uma sessão passa por estes estados:
STARTING— antes do jogador executar/etd startpela primeira vez.CONSTRUCTION_PHASE— janela de construção de 10 segundos entre fases defensivas.DEFENSIVE_PHASE— inimigos estão spawnando e caminhando pelo caminho.ENDING— o jogador saiu, perdeu, ou o nível ficou sem ondas.
A fase de construção sempre dura 10 segundos, a menos que o tutorial a segure (veja Caso Especial do Nível Tutorial).
Comportamento de fim de onda:
- Completar uma onda concede
waveNumber * 10de ouro. - Se você não perdeu vidas durante a onda, recebe um bônus "Perfect" que vale metade do bônus da onda (
waveNumber * 10 * 0.5). O número anunciado e o ouro efetivamente concedido agora coincidem. - Cada onda só pode pagar uma vez — uma onda que, por alguma razão, reporte conclusão duas vezes é ignorada na segunda, e nenhum pagamento ocorre quando a sessão já está terminando.
- A lista de modificadores da próxima onda é anunciada depois do fim de cada onda.
Quando um Nível Termina
A sessão só avança se o número da próxima onda existir como chave em waveEntities, então os números de onda devem ser contíguos a partir de 1. Quando o próximo número está ausente:
- se o arquivo definir
suddenDeathWaveEntities, a run entra em morte súbita; - caso contrário, o nível termina imediatamente, sem contar a onda que nunca rodou. O recorde persistido e o título de conclusão usam a última onda que o jogador de fato jogou.
Morte Súbita
Se suddenDeathWaveEntities estiver definido, o nível continua a rodar após a lista de ondas configurada.
O pool de morte súbita cicla pelo número de onda configurado, e não por um contador corrente: cada vez que uma onda de morte súbita é necessária, o EternalTD escolhe o menor número wave= do pool que seja maior que o atual, e volta ao menor número configurado quando não há nada maior. Portanto, o pool não precisa ser numerado 1, 2, 3, ... — lacunas e números iniciais arbitrários ciclam corretamente.
O número de onda exibido continua contando a partir da lista de ondas regular; apenas a entrada do pool que é spawnada é que cicla.
Sintonia Elemental em Entidades de Onda
Cada onda tem sua própria sintonia elemental que rotaciona por onda:
- Onda 1 → Fogo
- Onda 2 → Ar
- Onda 3 → Água
- Onda 4 → Terra
- (e então repete)
Quando uma entidade de onda spawna, há uma chance de waveNumber / 100 de a entidade herdar a sintonia elemental da onda, exibida como uma tag colorida flutuando acima do mob.
As regras de dano elemental são tratadas pela classe DamageTower da torre:
- Atacante de mesma sintonia vs alvo de mesma sintonia — 0.5× dano (resist).
- Elementos únicos opostos (Fogo vs Água, Ar vs Terra) — 2× dano (crit).
- Sintonias de fusão (Magma, Blast, Storm, Sludge) seguem interações em pares; veja o código-fonte para a matriz completa.
- Uma torre sem sintonia causa 1× dano a todos.
Sintonias de fusão formam-se quando uma Basic Tower é tocada por torres de suporte com sintonias elementais que se combinam:
| Combinação | Fusão resultante |
|---|---|
| Fogo + Terra | Magma |
| Fogo + Ar | Blast |
| Água + Ar | Storm |
| Água + Terra | Sludge |
As regras de conflito são mais estreitas do que parecem:
- Terra + Ar na mesma torre sempre a revertem para Sem Sintonia, independentemente do que mais estiver anexado.
- Fogo + Água revertem para Sem Sintonia apenas quando três ou mais sintonias distintas estão em jogo. Uma torre tocada por exatamente um suporte de Fogo e um de Água mantém uma das duas arbitrariamente, porque o código cai no caso "escolha a primeira sintonia do conjunto" e esse conjunto não é ordenado.
- Torres de suporte sem sintonia (Spyglass, Gold Mine) nunca afetam o resultado; elas são descartadas do conjunto assim que qualquer torre com sintonia é anexada.
Escalonamento de Vida, Armadura e Recompensa
WaveEntity aplica estes passos no spawn, nesta ordem exata:
- A vida base começa em
0.5e cresce com a onda:health = 0.5 + ((wave - 1)^1.2) / 2. - Entidades chefe multiplicam isso por
baseMobAmount × 0.5. - Entidades de horda dividem pela metade.
- A recompensa é calculada aqui, como
ceil(health)— antes dehealthMultipliere antes da penalidade aérea. Entradastreasureentão a dobram. maxHealth = health × healthMultiplier.- Entidades aéreas dividem
maxHealthpela metade novamente. - A armadura só aparece a partir da onda 10, ajustada para
maxHealth / 80.
A ordem do passo 4 importa: um healthMultiplier de 3.0 triplica a vida de um inimigo sem alterar o pagamento em ouro dele, e inimigos aéreos pagam a mesma recompensa que seus equivalentes terrestres apesar de terem metade da vida. Torres de suporte Gold Mine adicionam seu bônus à recompensa no momento do golpe fatal.
A velocidade de movimento é:
speed = 0.3 × (1 - slow)
× 1.5 × (1 - slow) if fast
× 0.5 if air
+ wave / 1000
O termo final wave / 1000 significa que os inimigos ficam muito ligeiramente mais rápidos a cada onda, independentemente das flags deles, e ele é aplicado depois dos multiplicadores de ar e lentidão, em vez de ser escalado por eles.
Splitterlings
A partir da onda 20, inimigos não aéreos spawnam pequenos mobs adicionais ("splitterlings") ao morrer.
- Quantidade:
floor(wave / 20)por morte. - Se o pai era um
CAVE_SPIDER, os splitterlings sãoSILVERFISH. Caso contrário, sãoCAVE_SPIDER. - Splitterlings spawnam em
wave / 2da onda do pai, então uma run profunda o suficiente ainda pode encadear um splitterling em mais splitterlings em sua própria morte. - Splitterlings dão 0 ouro na morte e inimigos aéreos nunca spawnam splitterlings.
Caso Especial do Nível Tutorial
O mapa tutorial incluído executa um script de onda tutorial codificado:
- A fase de construção não termina automaticamente até que você tenha colocado as torres exatas necessárias nas casas destacadas.
- As torres codificadas são indicadas por manchas coloridas de concreto sob a casa de grade alvo e, se o FMM estiver instalado, um modelo de seta vermelha apontando para baixo flutuando acima.
- O tutorial injeta ouro extra nas ondas iniciais para que a lineup de torres do script seja sempre acessível:
+100nas ondas 1, 2 e 3, e+200na onda 4. Ondas posteriores não recebem nada extra. - Cada casa de torre exigida é colorida pela torre que ela pede: concreto verde para Basic Tower, marrom para Barricade, branco para Sugar, ciano para Spyglass, amarelo para Beam Generator, vermelho para Explosion Factory, azul para Ice Box, cinza para Armor Crusher, laranja para Gold Mine, roxo para Obsidian Quarry, preto para qualquer outra coisa.
Vidas e Ouro do Jogador
- Vidas iniciais: 20.
- Ouro inicial: 150.
- Mobs chefe custam 5 vidas se chegarem ao fim. Todos os outros mobs custam 1 vida.
- Trapacear (
/etd cheat) define o ouro como10.000.000e as vidas como1.000.000, e marca a sessão como trapaceada para fins de highscore. Desligar o modo de trapaça não restaura os valores originais, e a flag de trapaça é permanente para aquela sessão. /etd setwave <n>também define a flag de trapaça e rebaseia a proteção de recompensa de onda, para que a onda à qual você saltou ainda pague quando for concluída.
Rastreamento de Highscore
Cada config de nível persiste highscoreWave e highscorePlayerName. No final de uma sessão sem trapaça, o plugin salva o novo número de onda no arquivo do nível e transmite uma mensagem em todo o servidor se ela bater a pontuação anterior.