Vagas e inimigos do EternalTD
Um ficheiro em plugins/EternalTD/waves/ define todos os inimigos de um nível, incluindo vagas normais, morte súbita e mensagens opcionais antes ou durante cada vaga. O nível referencia esse ficheiro por wavesConfigFile:.
Campos principais
| Campo | Tipo | Predefinição | Observações |
|---|---|---|---|
isEnabled | booleano | true | Os ficheiros desativados não são carregados; os níveis dependentes não podem iniciar sem essa configuração de vagas |
baseMobAmount | inteiro | 20 | Quantidade usada quando a entrada não especifica amount= |
waveEntities | lista de textos | obrigatório | Entradas de inimigos por vaga |
suddenDeathWaveEntities | lista de textos | opcional | Conjunto cíclico de vagas usado depois de esgotar as vagas configuradas |
prewaveMessages | lista de mapas | opcional | Mensagens pelo contador atual: 0 à entrada, N depois de terminar a vaga N |
waveMessages | lista de mapas | opcional | Mensagens no início de uma vaga |
Sem entradas de morte súbita, a sessão termina quando a transição para a próxima vaga não encontra uma entrada configurada. Normalmente isto acontece depois da última janela de construção, salvo se o jogador avançar antes.
Formato das entradas de inimigos
Cada linha de waveEntities ou suddenDeathWaveEntities contém 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 | Observações |
|---|---|---|
wave | inteiro | Obrigatória. Número da vaga desta entrada |
entityType | enum | Obrigatória. Valor exato do enum Bukkit EntityType; escolha uma entidade viva que possa aparecer |
healthMultiplier | decimal | Opcional, predefinido como 1.0. Multiplica a vida máxima |
amount | inteiro | Opcional. Substitui baseMobAmount nesta entrada |
name | texto | Nome personalizado opcional. É lido e guardado, mas não aplicado ao mob atualmente; no lugar do nome aparecem as barras de vida e armadura |
resist | indicador | Imunidade à lentidão |
fast | indicador | Aumenta a velocidade de movimento |
treasure | indicador | Duplica a recompensa de ouro por abate |
boss | indicador | Usa a regra de quantidade de bosses abaixo, vida ajustada e uma barra por boss |
horde | indicador | Duplica amount e reduz a vida a metade |
air | indicador | Faz aparecer a entidade 4 blocos acima do caminho, ignorando barreiras terrestres |
Escreva as chaves e os indicadores sem espaços à volta, os tipos de entidade em maiúsculas e números de vaga, quantidades e multiplicadores de vida positivos. O leitor não remove espaços nem rejeita todos os intervalos inválidos. Ignora chaves desconhecidas. Uma entrada normal mal formada desativa a configuração; uma entrada de morte súbita mal formada gera um aviso e pode deixar no conjunto as entradas já lidas. A leitura bem-sucedida não prova que as entidades possam aparecer.
Cálculo interno das quantidades
- Acrescenta-se
wave / 10aamount, truncando depois para inteiro. Assim,amount=20produz 21 mobs na vaga 15 e 22 na vaga 20. - Entradas
bosssubstituemamountpormax(1, floor(wave / 10)). - Entradas
hordeduplicam oamountfinal. - Além da quantidade por entrada, são acrescentadas cópias ao montar a vaga. Os índices referem-se à lista de mobs já expandida: o leitor da configuração criou um objeto por mob, pelo que uma linha
amount=20ocupa 20 índices consecutivos. Para cada índice pari, como0, 2, 4, ..., válido na lista e inferior ao número da vaga, acrescenta-se uma cópia do mob nesse índice. Os bosses nunca são copiados desta forma. O número adicional é aproximadamenteceil(min(waveNumber, listSize) / 2): 1 na vaga 1, 2 nas vagas 3–4, 5 nas vagas 9–10, 8 nas vagas 15–16, até o número da vaga ultrapassar o tamanho da lista.
O intervalo de aparecimento é min(floor(200 / totalEntities), 20) ticks. Num aparecimento normal, o contador deve ultrapassar o dobro desse intervalo; numa horda, deve ultrapassar o dobro do intervalo dividido por dois com divisão inteira. A comparação estrita acrescenta um tick ao contador, em vez de produzir exatamente o dobro. O ritmo de horda depende do primeiro mob restante na lista, pelo que misturar entradas normais e de horda pode alterar o ritmo ao longo da vaga. Cada mob escolhe aleatoriamente uma célula inicial ao aparecer.
Formato dos blocos de mensagens
prewaveMessages e waveMessages aceitam uma 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] é apresentado à entrada. Depois de terminar a vaga N, prewaveMessages[N] aparece durante a construção para a próxima: use a chave 4 para avisar da vaga 5. waveMessages[N] aparece ao começar a vaga N. As chaves usam o contador apresentado da sessão, incluindo na morte súbita. Entradas repetidas para a mesma chave substituem as anteriores.
Ciclo de vida das vagas
A sessão passa por estes estados:
STARTING: antes do primeiro/etd start.CONSTRUCTION_PHASE: período de construção de 10 segundos entre fases defensivas.DEFENSIVE_PHASE: os inimigos aparecem e percorrem o caminho.ENDING: o jogador saiu, perdeu ou esgotou as vagas.
O temporizador normal de construção dura 10 segundos. /etd start ou a ferramenta Next Wave permitem avançar antes, mas continuam a respeitar os requisitos do tutorial; consulte Caso especial do tutorial. A fase inicial espera uma ação de início; o tutorial pode avançar ao aceitar o último requisito.
Ao concluir uma vaga:
- recebe
waveNumber * 10de ouro - se não perdeu vidas, recebe um bónus de vaga perfeita igual a metade da recompensa,
waveNumber * 10 * 0.5. O valor anunciado corresponde ao ouro atribuído - cada vaga só paga uma vez: uma segunda notificação de conclusão é ignorada, e não há pagamentos quando a sessão já está a terminar
- é anunciada a descrição dos modificadores da próxima vaga se não estiver vazia; vem do primeiro inimigo configurado, não de todas as entradas de uma vaga mista
Quando termina um nível
A sessão só avança se o próximo número existir como chave em waveEntities. Os números devem ser consecutivos a partir de 1. Se faltar o seguinte:
- com
suddenDeathWaveEntities, começa a morte súbita - sem esse campo, o nível termina imediatamente, sem contar a vaga que não chegou a decorrer. O recorde guardado e o título final usam a última vaga realmente jogada
Morte súbita
Com suddenDeathWaveEntities, o nível continua depois das vagas normais.
O conjunto de morte súbita percorre os números de vaga configurados. Quando é necessário, escolhe-se a menor chave não negativa superior à chave atual do conjunto, ou regressa-se à menor se não houver nenhuma superior. O contador inicial do conjunto é 0: uma chave configurada 0 é ignorada na primeira passagem se existirem chaves positivas. Use chaves positivas; os intervalos são aceites e a chave 0 também não serve para a fórmula de vida abaixo.
O contador apresentado continua a aumentar. A vida, armadura, velocidade, recompensa base e limiares dos splitterlings usam o wave= configurado da entrada escolhida; não acompanham automaticamente o contador apresentado. As cópias adicionais criadas durante a execução e os sorteios elementais usam o contador apresentado. Por exemplo, as entradas 10 e 20 mantêm os seus valores de progressão mesmo na vaga apresentada 100. A procura da próxima vaga continua a verificar se existe uma entrada normal para cada número apresentado, pelo que pode usar uma chave normal posterior após uma lacuna anterior.
Afinidade elemental dos inimigos
A afinidade roda a cada vaga:
- Vaga 1 → Fogo
- Vaga 2 → Ar
- Vaga 3 → Água
- Vaga 4 → Terra
- Depois repete-se
Ao aparecer, uma entidade normal da vaga tem uma probabilidade igual ao waveNumber / 100 apresentado de herdar o elemento da vaga. A partir da vaga apresentada 100, o sorteio resulta sempre. Um rótulo colorido indica o elemento. Os splitterlings são criados separadamente e não recebem este sorteio.
As regras de dano são aplicadas por DamageTower:
- mesma afinidade no atacante e no alvo: 0.5× de dano, por resistência
- elementos simples opostos, fogo/água e ar/terra: 2× de dano, por crítico
- as fusões seguem a tabela abaixo; outras combinações não correspondentes causam 1× de dano
- uma torre sem afinidade causa 1× de dano a todos
| Afinidade da torre | Dano 2× contra | Dano 0.5× contra |
|---|---|---|
| Magma | Ar, Água | Terra, Fogo, Magma |
| Explosão | Terra, Água | Ar, Fogo, Explosão |
| Tempestade | Fogo, Terra | Ar, Água, Tempestade |
| Lodo | Fogo, Ar | Terra, Água, Lodo |
As fusões formam-se quando torres de suporte com elementos combináveis ficam adjacentes à mesma torre básica:
| Combinação | Fusão resultante |
|---|---|
| Fogo + Terra | Magma |
| Fogo + Ar | Explosão |
| Água + Ar | Tempestade |
| Água + Terra | Lodo |
As regras de conflito têm estas particularidades:
- Terra + Ar elimina sempre a afinidade da torre, independentemente dos restantes suportes.
- Fogo + Água só elimina a afinidade com três ou mais afinidades distintas. Com exatamente um suporte de fogo e um de água, a torre conserva arbitrariamente um deles: o código escolhe o primeiro elemento de um conjunto sem ordem definida.
- Suportes sem afinidade, como a luneta e a mina de ouro, não afetam o resultado. São retirados do conjunto assim que existe algum suporte com afinidade.
Cada recálculo parte do elemento próprio da torre básica, Sem afinidade, pelo que retirar o último suporte elemental devolve a torre ao estado Sem afinidade.
Progressão de vida, armadura e recompensa
WaveEntity aplica estes passos ao aparecer usando o seu número de vaga configurado (ou metade da vaga do original para um splitterling), por esta ordem:
- A vida base começa em
0.5e cresce com a vaga:health = 0.5 + ((wave - 1)^1.2) / 2. - Bosses multiplicam esse valor por
baseMobAmount × 0.5. - Entidades de horda reduzem-no a metade.
- A recompensa é calculada aqui, como
ceil(health), antes dehealthMultipliere da redução aérea. Entradastreasureduplicam-na depois. maxHealth = health × healthMultiplier.- Entidades aéreas reduzem novamente
maxHealtha metade. - A armadura só aparece a partir da vaga 10, com
maxHealth / 80.
A ordem do passo 4 importa: um healthMultiplier de 3.0 triplica a vida sem alterar a recompensa base. Inimigos aéreos dão a mesma recompensa base que os terrestres equivalentes, apesar de terem metade da vida. A mina de ouro acrescenta o seu bónus no golpe fatal, truncando o resultado para inteiro; recompensas pequenas podem não ganhar ouro adicional.
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 usa a vaga configurada do inimigo e é acrescentado depois dos multiplicadores de voo e lentidão. O valor controla o atributo de velocidade de movimento dos mobs. Para entidades que não são Mob, o mecanismo alternativo teletransporta 0.1 blocos em direção ao próximo destino por tick de movimento. A fórmula não é, portanto, uma velocidade universal em blocos por tick.
Splitterlings
A partir da vaga 20, os inimigos terrestres criam pequenos mobs adicionais, chamados splitterlings, ao morrer.
- Quantidade:
floor(wave / 20)por abate. - Se o original era
CAVE_SPIDER, surgemSILVERFISH; caso contrário, surgemCAVE_SPIDER. - Os splitterlings usam
floor(parentWave / 2)e herdam a posição atual no percurso. Usam o multiplicador de vida 0.5 do seu construtor e não herdam os indicadores nem a afinidade elemental do original. Com vagas configuradas suficientemente altas, podem gerar mais splitterlings ao morrer. - Não dão ouro ao morrer. Inimigos aéreos nunca os geram.
Caso especial do tutorial
O nível tutorial.yml usa um script definido no código e ligado às coordenadas do seu mapa:
- os tipos de torre pedidos devem ser colocados nas células destacadas, ou melhorados aí se a torre correspondente já existir. É permitido vender uma torre errada numa célula pedida; outras colocações, vendas e melhorias são rejeitadas enquanto essa etapa se aplica. O último requisito aceite pede imediatamente a próxima vaga
- o betão colorido marca as células pedidas. Com FMM e o modelo
reddownarrowdisponíveis, uma seta vermelha indica a torre ou melhoria necessária acima de cada célula - ao entrar em construção depois das vagas 1, 2 e 3, o tutorial acrescenta
+100de ouro; depois da vaga 4, acrescenta+200. É rendimento extra, não uma garantia de poder pagar. Outros números de vaga não recebem este acréscimo - cada célula usa a cor da torre pedida: verde para básica, castanho para barricada, branco para açúcar, ciano para luneta, amarelo para gerador de feixe, vermelho para fábrica de explosões, azul para caixa de gelo, cinzento para esmagador de armadura, laranja para mina de ouro, roxo para pedreira de obsidiana e preto para as restantes
- durante cada etapa do script, uma barra de boss verde conta as torres pedidas já colocadas, no formato
Build towers! done/total!. A cada dois minutos, o tutorial lembra que/etd quitpermite sair e, enquanto houver requisitos por cumprir, repete a mensagem atual de antes da vaga
Vidas e ouro
- Vidas iniciais: 20.
- Ouro inicial: 150.
- Um boss que chega ao fim custa 5 vidas. Os restantes mobs custam 1.
- Cada alternância de
/etd cheat, incluindo ao desativá-lo, repõe o ouro em10,000,000e as vidas em1,000,000. A sessão fica permanentemente excluída dos recordes. /etd setwave <n>altera o contador da sessão e a proteção de recompensas e marca a partida como tendo usado batota. Não substitui os inimigos ativos nem inicia essa vaga imediatamente. A próxima transição usan + 1.
Recordes
Cada nível guarda highscoreWave e highscorePlayerName. No fim de uma sessão sem batota, se a vaga alcançada superar o recorde, o plugin guarda o novo número no ficheiro do nível e anuncia-o a todo o servidor.