Принцип

Бой идёт автоматически и полностью автономно: «Сосуды» сражаются самостоятельно согласно настроенным правилам. Ввода игрока во время боя нет — все решения принимаются в фазе подготовки. Бой намеренно простой и читаемый.

Решено (2026-07): заклинания Гильдмастера и любые другие способности «вне юнитов» вырезаны. Бой — чистый результат подготовки: расстановки, распределения Мементо, AI-профилей, предметов и билда. Это делает исход полностью объяснимым решениями игрока (см. guildmaster).

Референс: Teamfight Manager.


Подготовка к бою

Перед каждым сражением игроки:

  • Распределяют Мементо между «Сосудами»
  • Выбирают позиции на поле (дальник / ближник)
  • Настраивают приоритеты целей
  • Опционально задают простые AI-команды для «Сосудов»

Ход боя

  • «Сосуды» атакуют и используют способности своих Мементо автоматически
  • Игрок наблюдает за боем и не вмешивается в него
  • Бой можно ставить на паузу — это средство просмотра и разбора (осмотреться, прочитать состояние), а не боевая механика

Способности

Активные способности Мементо:

  • перезаряжаются по времени (cooldown в секундах);
  • или требуют особый ресурс Мементо (мана, ярость и т.п.).

Типы боёв

ТипОписание
Обычный бойСражение с безымянными гильдиями, монстрами (волки, слаймы и т.д.)
Элитный бойСражение с известной гильдией; есть короткое приветствие и предыстория
Финал актаБой-босс против «гильдии-финалиста»

Итог боя

После сражения:

  • Награды — Мементо, ресурсы, золото
  • Травмы — негативные последствия для «Сосудов» (если есть)
  • Обновление билда — перераспределение Мементо и тактики

Перезапуск

Перезапуски — ограниченный ресурс акта: у игрока есть 2 перезапуска на акт (число — баланс, живёт в GameConfig). Каждый перезапуск боя тратит одну попытку из пула. В начале каждого акта пул сбрасывается до 2 — неизрасходованные попытки не переносятся и не копятся.

Поражение при пустом пуле = конец забега. Перезапуски — единственная страховка от проигрыша; кончились — следующее поражение завершает забег.

Перезапуск — это тот же самый бой. Противники, их расстановка и эффекты не меняются между попытками. Меняется только то, что игрок сам переделал в подготовке: распределение Мементо, позиции на арене, AI-профили, предметы.

Смысл: перезапуск — это отладка билда, а не переролл. Игрок должен видеть, что победу принесло его изменение, а не другой расклад. Если бы каждая попытка была новым боем, любое поражение списывалось бы на невезение, и петля обучения ломалась бы.

Цена перезапуска — сам дефицит пула, а не штраф. Осознанно не берём золото / урезание награды / травму: они ослабляют игрока после поражения и рискуют «молчаливой спиралью смерти». Дефицитный пул наказывает исчерпанием страховки, но следующую попытку не делает слабее — и создаёт решение на уровне акта: приберечь перезапуск на элитку/босса или потратить на обычный бой.

Идея (не решено): оформить трату перезапуска как кооп-ритуал воскрешения — короткий совместный QTE-кликер, чтобы «поднять павших» ощущалось командным усилием, а не кликом кнопки. Оговорки (не на каждый ретрай; церемония, не гейт исхода) — Meta - Roadmap Блок 3.

Канон-дом правила перезапуска — этот раздел

Тех-вика (флоу забега (код Assets/_Project/Scripts/Game/Flow/) §6) описывает реализацию BattleFlow, но держит прежнюю дизайн-модель: «до 2 ретраев на каждый бой», «3-е поражение финальное», «цена ретрая — TBD». Всё это замещено решением 2026-07-15/65 (пул на акт, цена = сама попытка). Инженерная часть того раздела — саб-сид runSeed + индекс_боя без номера попытки — актуальна и живёт там по праву.

UI и статистика

  • Полосы здоровья (HP bar)
  • Числа урона (damage numbers)
  • Таблица эффективности бойцов:
    • Урон нанесён
    • Урон поглощён
    • Исцеление / щиты
    • Контроль (CC)

Статы юнитов

Боевая мощь юнита описывается набором из 30 числовых статов (выживаемость, атака, исцеление/щиты, снаряд, подвижность, эффективность эффектов, ресурс). База собирается каскадом: StatsConfig → Боевой класс → Персона (Мементо) → «Сосуд». Базу HP и скорости передвижения задаёт класс (Танк 150%/85%, Брузер 100%/100% — эталон, Убийца 75%/110%, бэклайн 65%/75%), Мементо даёт дельту героя поверх; перки «Сосуда», предметы и эффекты — модификаторы сверху. У врагов между классом и юнитом стоят ещё Вид и Подвид. Дизайн-описание «что каждый стат значит для билда» — stats; техническая спецификация (имена, формулы, клампы) — Planning - Stat System.

Ключевое для дизайна боя: детерминированность без крита и уклонения (читаемость + честное сравнение AI-профилей), процентная броня (убывающая отдача, не блокирует 100%), двусторонние урон и исцеление/щиты, а эффективности эффектов меняют только длительность (удлинение HoT/DoT пропорционально увеличивает суммарный итог).


Позиционика

Юниты не стоят в ряд перед целью: у каждой цели есть слоты боевого контакта по окружности (слот — это сектор направления, а не точка, поэтому копейщик держит свою дистанцию), а удар с фланга и тыла даёт бонус: +20% обычным юнитам, +40% фланкёрам.

Окружение — общая механика всех мили-классов: спереди занято — заходишь сбоку. Целенаправленный обход за спину — не отдельная механика, а AI-тактика выбора маршрута у Убийцы («идти дольше, но ударить сильнее»), и включается, только если он уже дерётся и фокусит кого-то ещё.

Зона контроля отклонена окончательно — проход сквозь строй свободный, юниты не держат друг друга. Линию фронта держит угроза, а не стена: автоатака танка переводит фокус цели на себя (5 сек, на всех кроме танков), а идущего мимо танк пытается перехватить и ударить. Снаряды летят сквозь союзников.

Дизайн-проработка, каталог поведения по классам и правила «чтобы не бесило» — Combat - Positioning (круг вердиктов закрыт 2026-07-26; числа черновые). В коде позиционика пока не реализована — это принятый дизайн, а не существующее поведение.


Барьеры

Решено 2026-07-26. В бою есть барьеры — объекты в мире, а не числа на юните: они перехватывают то, что летит через них, имеют собственный запас прочности и могут быть обойдены. Это отдельная механика, а не разновидность Щита: щит — буфер HP на цели, барьер — пространственное правило.

Форм две, и они закрывают разные угрозы:

ФормаЛовитВскрывается
Стена (дуга)всё, что летит по траектории: снаряды, линии, лучиобойти — зайти так, чтобы линия огня её не пересекала
Купол (окружность, носимый)всё, что приходит площадью извне: круговые АОЕ, залпы по кластерувойти внутрь — под куполом он уже не помогает

Тела ходят сквозь барьеры: линию фронта по-прежнему держит угроза, а не стена. Пробитие — явное свойство отдельных источников («игнорирует барьеры»), а не побочный эффект школы урона.

Полные правила обеих форм, требования к AI и что осталось на баланс — Combat - Barriers. План реализации — Planning - Barriers; заход идёт после позиционики. В коде барьеров пока нет.


Таймер боя и правило затягивания

Сделано: бой ведёт счётчик прошедшего боевого времени (по симуляционным тикам, а не по стенным часам — пауза и slowmo его не искажают). Показывается в верхней панели HUD.

Ориентир нормального темпа — 30-60 секунд (уточнено 2026-07-28 по первому замеру TTK; прежние 90 секунд не соответствовали ничему в игре).

Замер стендом, круговые бои всего ростера: медиана боя 20.3 с в дуэлях, 21.3 с в тройках, 28.8 с в отрядах. Половина боёв укладывается в 16-35 секунд. То есть бои у нас не затянуты, а короче прежнего норматива втрое — и правило анти-затягивания должно срабатывать на хвосте, а не на типичном бою.

Сделано (2026-07-28) — рампа урона:

  • С 90-й секунды наносимый урон растёт на +5% за каждую секунду сверх порога, накопительно и одинаково для обеих сторон. К 150-й секунде это учетверённый урон.
  • Растёт только урон. Лечение, щиты, реген — нет. В этой асимметрии весь смысл: клинч «танк+хил против танк+хил» бессмертен ровно до тех пор, пока урон ниже лечения, и никакое ожидание его не решает. Ускорение симуляции здесь бесполезно — оно крутит быстрее ту же патовую формулу.
  • Числа живут в SimTuningConfig (вкладка «Овертайм»), ноль в рампе = овертайм выключен.
  • Стенд ведёт колонку Overtime% — долю боёв, доехавших до порога. Овертайм обязан оставаться редким: его рост читается как сигнал о поломке TTK, а не как повод крутить рампу.

Решено, но пока НЕ реализовано:

  • Ускорение ×2 после порога — чтобы застой не превращался в пытку ожиданием. Это комфорт зрителя, не баланс: на исход не влияет.
  • Ещё через 60 секунд (т.е. на ~150-й) — ничья. Ничья засчитывается игрокам как поражение (никто не победил → в ретрай, см. teams-not-player-team в модели исхода).

Техническая модель (кратко)

  • Поле боя — непрерывное 2D (не клеточное): дальности и AOE считаются в мировых координатах (радиусы, точки), размер юнита влияет на дальность.
  • Бой — детерминированная симуляция с фиксированным тиком (без Unity-физики), что даёт реплеи, сравнение AI-профилей и синхронный мультиплеер.
  • AI «Сосудов» (фокус цели, отступление, условия каста, позиционирование) строится по схеме Filter / Score / Override — настраивается вне боя, в бою не меняется.

Детали реализации — Journal - Library Picks And The Alternatives We Turned Down и Reference - Seed & RNG. Полный список статов — Planning - Stat System. Сырые заметки по AI и статам — Meta - Open Forks.