Перейти к основному содержимому

Волны и враги EternalTD

Файл волны в plugins/EternalTD/waves/ определяет весь состав врагов для уровня, включая обычные волны, волны внезапной смерти и опциональные сообщения перед волной или во время волны. Каждая конфигурация уровня ссылается на один файл волны через wavesConfigFile:.

Поля верхнего уровня

ПолеТипПо умолчаниюПримечания
isEnabledbooltrueОтключение здесь также отключает уровень, зависящий от этого файла
baseMobAmountint20Количество по умолчанию, используемое, когда запись не указывает amount=
waveEntitiesсписок строкобязательноЗаписи врагов по волнам
suddenDeathWaveEntitiesсписок строкопциональноОпциональный циклический пул волн, запускаемый после исчерпания настроенных волн
prewaveMessagesсписок картопциональноСообщения, показываемые перед началом определённой волны
waveMessagesсписок картопциональноСообщения, показываемые при начале волны

Если файл волны не определяет ни одной записи внезапной смерти, уровень заканчивается, как только настроенные волны исчерпываются.

Формат записи сущности волны

Каждая строка в waveEntities (или suddenDeathWaveEntities) — это запись, разделённая двоеточиями:

- 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
КлючТипПримечания
waveintОбязательно. Номер волны, к которой относится эта запись
entityTypeenumОбязательно. Значение Bukkit EntityType
healthMultiplierdoubleОпционально. Умножает максимальное здоровье сущности
amountintОпционально. Переопределяет baseMobAmount для этой записи
namestringОпционально. Пользовательская строка имени
resistфлагПомечает сущность как невосприимчивую к замедлению
fastфлагУвеличивает скорость передвижения
treasureфлагУдваивает золотую награду за убийство
bossфлагСоздаёт одного босса с увеличенным здоровьем и полосой здоровья босса
hordeфлагУдваивает amount и уменьшает здоровье вдвое
airфлагСущность появляется в 4 блоках над путём и игнорирует наземные стены

Внутренняя математика количества

  • amount увеличивается на wave / 10 перед спавном.
  • Записи boss переопределяют amount в max(1, floor(wave / 10)).
  • Записи horde удваивают итоговое amount.
  • Поверх количества для каждой записи рантайм волны также клонирует дополнительные копии первой, третьей, пятой, ... записей волны (каждый чётный индекс 0, 2, 4, ...) до waveNumber - 1 раз. Записи боссов никогда не клонируются таким образом. Поэтому более высокие волны накапливают больше дубликатов записей с меньшими индексами.

Формат блока сообщений

И prewaveMessages, и waveMessages принимают список карт:

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 запускается в начале фазы строительства для этой волны. waveMessages запускается в момент начала оборонительной фазы.

Жизненный цикл волны

Сессия проходит через эти состояния:

  • STARTING — до того, как игрок впервые выполнит /etd start.
  • CONSTRUCTION_PHASE — 10-секундное окно строительства между оборонительными фазами.
  • DEFENSIVE_PHASE — враги появляются и идут по пути.
  • ENDING — игрок вышел, проиграл или у уровня закончились волны.

Фаза строительства всегда длится 10 секунд, если её не задерживает обучение (см. Особый случай уровня обучения).

Поведение окончания волны:

  • Завершение волны даёт waveNumber * 10 золота.
  • Если вы не получили урона во время волны, вы получаете вторую копию этого бонуса как «Идеальный» бонус.
  • Список модификаторов следующей волны объявляется после окончания каждой волны.

Внезапная смерть

Если определён suddenDeathWaveEntities, уровень продолжает работать после списка настроенных волн. Счётчик внезапной смерти увеличивается за каждую волну и возвращается к волне 1 пула внезапной смерти, когда превышает размер пула.

Стихийная привязка сущностей волны

Каждая волна имеет свою стихийную привязку, которая чередуется по волнам:

  • Волна 1 → Огонь
  • Волна 2 → Воздух
  • Волна 3 → Вода
  • Волна 4 → Земля
  • (затем повторяется)

Когда сущность волны появляется, есть шанс waveNumber / 100, что сущность унаследует стихийную привязку волны, отображаемую как цветной тег, плавающий над мобом.

Правила стихийного урона обрабатываются классом DamageTower башни:

  • Атакующий с той же привязкой против цели с той же привязкой — урон 0.5× (сопротивление).
  • Противоположные одиночные стихии (Огонь против Воды, Воздух против Земли) — урон 2× (крит).
  • Слитые привязки (Магма, Взрыв, Шторм, Слизь) следуют парным взаимодействиям; полную матрицу см. в исходном коде.
  • Башня без привязки наносит урон 1× всем.

Слитые привязки образуются, когда Basic Tower касаются вспомогательные башни с комбинирующимися стихийными привязками:

КомбинацияРезультирующее слияние
Огонь + ЗемляМагма
Огонь + ВоздухВзрыв
Вода + ВоздухШторм
Вода + ЗемляСлизь

Конфликтующие пары (Огонь + Вода, Земля + Воздух) и любая смесь из 3+ стихий возвращают башню к состоянию «Без привязки».

Масштабирование здоровья, брони и награды

WaveEntity применяет эти формулы при спавне:

  • health = (currentHealth + ((wave - 1)^1.2) / 2) × healthMultiplier
  • Здоровье сущностей-боссов дополнительно умножается на baseMobAmount × 0.5.
  • Здоровье сущностей-орд делится пополам.
  • Здоровье воздушных сущностей делится пополам ещё раз.
  • Броня появляется только с волны 10, установлена в maxHealth / 80.
  • Награда — ceil(health × 1) и удваивается для записей treasure. Вспомогательные башни Gold Mine добавляют к награде при смерти.

Splitterlings (мини-споуны)

С волны 20 и далее неполётные враги при смерти спавнят дополнительных малых мобов («splitterlings»).

  • Количество: floor(wave / 20) за убийство.
  • Если родитель был CAVE_SPIDER, splitterlings будут SILVERFISH. В противном случае это CAVE_SPIDER.
  • Splitterlings появляются на wave / 2 от волны родителя, поэтому достаточно глубокий забег всё равно может породить цепочку splitterling в новые splitterlings при их собственной смерти.
  • Splitterlings не дают золота при смерти, а воздушные враги никогда не спавнят splitterlings.

Особый случай уровня обучения

Встроенная карта обучения проходит по жёстко закодированному скрипту волн обучения:

  • Фаза строительства не завершается автоматически, пока вы не разместите точно требуемые башни на выделенных квадратах.
  • Жёстко закодированные башни обозначаются цветными участками бетона под целевым квадратом сетки и, если установлен FMM, моделью красной стрелки, направленной вниз, плавающей над ним.
  • Обучение начисляет игроку дополнительное золото на ранних волнах, чтобы заскриптованный набор башен всегда был доступен.

Жизни и золото игрока

  • Стартовые жизни: 20.
  • Стартовое золото: 150.
  • Мобы-боссы стоят 5 жизней, если они достигают конца. Все остальные мобы стоят 1 жизнь.
  • Читы (/etd cheat) устанавливают жизни и золото в эффективно неограниченные значения и помечают сессию как читерскую для целей таблицы рекордов.

Отслеживание рекордов

Каждая конфигурация уровня сохраняет highscoreWave и highscorePlayerName. В конце нечитерской сессии плагин сохраняет новый номер волны в файл уровня и транслирует сообщение по всему серверу, если он побил предыдущий рекорд.