Pular para o conteúdo principal

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

CampoTipoPadrãoNotas
isEnabledbooltrueDesabilitar aqui também desabilita o nível que depende deste arquivo
baseMobAmountint20Quantidade padrão usada quando uma entrada não especifica amount=
waveEntitieslista de stringsobrigatórioEntradas de inimigos onda a onda
suddenDeathWaveEntitieslista de stringsopcionalPool cíclico opcional de ondas que roda depois que as ondas configuradas se esgotam
prewaveMessageslista de mapasopcionalMensagens exibidas antes de uma onda específica começar
waveMessageslista de mapasopcionalMensagens 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
ChaveTipoNotas
waveintObrigatório. Número da onda à qual esta entrada pertence
entityTypeenumObrigatório. Valor do enum EntityType do Bukkit
healthMultiplierdoubleOpcional, padrão 1.0. Multiplica a vida máxima da entidade
amountintOpcional. Substitui baseMobAmount para esta entrada
namestringOpcional. 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)
resistflagMarca a entidade como imune a lentidão
fastflagAumenta a velocidade de movimento
treasureflagDobra a recompensa em ouro ao matar
bossflagSpawna como um único chefe com vida escalada e uma barra de chefe
hordeflagDobra o amount e divide a vida pela metade
airflagA entidade spawna 4 blocos acima do caminho e ignora muralhas terrestres

Matemática Interna de Quantidade

  • amount é incrementado por wave / 10 e depois truncado de volta para um número inteiro, então uma entrada com amount=20 gera 21 mobs na onda 15 e 22 na onda 20.
  • Entradas com boss sobrescrevem amount para max(1, floor(wave / 10)).
  • Entradas com horde dobram o amount final.
  • 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=20 contribui com 20 índices consecutivos, e não um só. Para cada índice par i (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 índice i é adicionado. Entradas boss nunca são clonadas dessa forma. Assim, o número de mobs bônus é aproximadamente ceil(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 start pela 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 * 10 de 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çãoFusão resultante
Fogo + TerraMagma
Fogo + ArBlast
Água + ArStorm
Água + TerraSludge

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:

  1. A vida base começa em 0.5 e cresce com a onda: health = 0.5 + ((wave - 1)^1.2) / 2.
  2. Entidades chefe multiplicam isso por baseMobAmount × 0.5.
  3. Entidades de horda dividem pela metade.
  4. A recompensa é calculada aqui, como ceil(health) — antes de healthMultiplier e antes da penalidade aérea. Entradas treasure então a dobram.
  5. maxHealth = health × healthMultiplier.
  6. Entidades aéreas dividem maxHealth pela metade novamente.
  7. 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ão SILVERFISH. Caso contrário, são CAVE_SPIDER.
  • Splitterlings spawnam em wave / 2 da 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: +100 nas ondas 1, 2 e 3, e +200 na 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 como 10.000.000 e as vidas como 1.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.