Текущая реализация

Боевые системы AS-BUILT

В коде живут три поколения боя одновременно: командные сценарии отрядов, живая симуляция NewBattle и постановочная ComplexBattle4x. Они не работают вместе — какая активна, решает флаг в профиле.

⚠ Снимок кода, не целевой дизайн Три системы сосуществуют, потому что бой переписывается. Это фактическое состояние, а не решение «так и оставить». Контекст — на странице Обзор реализации.

Три поколения — коротко

СистемаПодходСтатус
SquadCommandsСкриптовые боевые сценарии и математическая модель потерь.рабочая
NewBattleДетерминированная симуляция фикс-шагом + утилити-ИИ.рабочая
ComplexBattle4xПредрасчёт хореографии → таймлайн → проигрывание.в разработке

1. SquadCommands — командные сценарии

Исходная боёвка: выполнение боевых команд и манёвров отрядов по паттерну command. Цепочки команд лидера (MasterCommandLine) и юнитов (UnitCommandLine), параллельные действия (ExtraCommandLine), состояния команды (ожидание → в процессе → завершено). Набор боевых сценариев: прорыв центра, окружение, паника, отступление, драконья атака. Отдельная математическая модель боя считает потери и проценты убитых.

Класс / файлРоль
SquadCommand.cs, CommandBehaviour.csКоманды и их выполнение.
BattleMathModel.csРасчёт потерь.
Commands/Battle/BattleScenario/Боевые сценарии.

рабочая Тип команд: formation, relocation, attack, deffence, stop, waitFor, setMoveTarget. Путь: GameEngine/Scripts/SubModSquadCommands/.

2. NewBattle — живая симуляция

Полностью переписанный бой на детерминированной симуляции фиксированным шагом (по умолчанию ~30 Гц, аккумулятор реального времени). Один сид → один результат. Архитектура строго делит логику и визуал.

Orchestrator

Гоняет симуляцию фикс-шагом. Режимы Instant (мгновенный расчёт) и Continuous (пошагово). Поддержка динамического входа отрядов (N-vs-M фазы).

BattleSimulation

Ядро: на каждом шаге таргетинг → смерти → решения ИИ → обновление действий → проверка конца боя. Полностью без визуала.

UtilityUnitBrain

Утилити-ИИ: юнит раз в N тиков оценивает опции (Melee, Ranged, Move, Hold, Retreat) через Score() и выбирает лучшую с гистерезисом.

PresentationBinder

Асинхронно синхронизирует Transform/Animator с состоянием симуляции, не влияя на логику. Анимации отвязаны от расчёта.

Действия (жизненный цикл Begin → Tick → Complete/Cancel): Move To, Melee Engage, Ranged Attack, Idle Hold, Die. BattleUnitState — источник истины по юниту; BattleMovementResolver — движение с коллизиями (юниты, стены); BattleTargeting — авто-таргет ближайших врагов.

Класс / файлРоль
Core/Orchestration/Battle.cs, BattleOrchestrator.csОркестрация.
Core/Simulation/BattleSimulation.csЯдро симуляции.
Integration/NewBattleSwitch.cs, NewBattleBridge.csВключение и стыковка со старым путём.

рабочая Активна при UseNewBattleSystem = true в BattleSystemProfile. Путь: GameEngine/Scripts/NewBattle/.

3. ComplexBattle4x — постановочный бой

Бой, где все действия предрассчитываются заранее в полный таймлайн, а потом проигрываются. Двухфазная схема.

Фаза A · Хореография

Из предрешённого исхода (кто гибнет, кто инициатор) и определения шага выбирается механика боя, и специализированный хореограф строит таймлайн: треки движения всех юнитов + события.

Фаза B · Проигрывание

BattlePlayer интерполирует позы между кейфреймами, выставляет локомоцию, дёргает триггеры событий в точный момент. Пауза/seek; режим Static зацикливает кульминацию до Release().

Поле — сетка (по умолчанию 1×1 м) с занятостью; флоу-поле (BFS от врагов) ведёт юнитов к врагу, огибая своих. Исход считается снаружи, хореография лишь показывает его.

Хореографы механик (IBattleStepChoreographer)

Clash · сходка Volley · залп стрелков Charge · кав-атака Surround · окружение AreaCast · площадь RangedThenMelee · композит GrandMelee · композит

Класс / файлРоль
Choreography/ChoreographerRegistry.csРеестр хореографов механик.
Timeline/BattleTimeline.csПредрассчитанный таймлайн (треки + события).
Playback/BattlePlayer.csПроигрыватель таймлайна.
Field/BattleField.csСетка поля и флоу-поле.
Outcome/BattleOutcome.csПредрешённый исход.
Integration/ComplexBattle4xBridge.cs, ComplexBattle4xSwitch.csСтыковка со старым путём.

в разработке Отключена по умолчанию (RouteRealBattles = false). Путь: GameEngine/Scripts/ComplexBattle4x/.

Ключевое различие NewBattle считает бой вживую (что будет — решает симуляция). ComplexBattle4x знает исход заранее и красиво его ставит (кинематографично, зацикленная кульминация в Static). SquadCommands — исходный скриптовый подход через сценарии и математику потерь.