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

Архитектура системы сражений

Система сражений MCE построена на модульной компонентной архитектуре. BattleManager оркестрирует 15+ специализированных модулей, каждый из которых отвечает за один аспект боя. BattleStateMachine управляет ходом, и вся система связана через внедрение зависимостей Zenject.

Обзор архитектуры

BattleLauncher
└─ BattleManager (оркестратор)
├─ BattleStateMachine (ход боя)
├─ BattlersModule (экземпляры бойцов)
├─ HealthModule (HP, нокаут)
├─ MovesModule (выполнение приёмов, PP)
├─ ItemsModule (предметы в бою)
├─ CaptureModule (механики захвата)
├─ AIModule (решения противника)
├─ AnimationModule (боевые анимации)
├─ AudioModule (музыка, SFX)
├─ StatusesModule (ожог, отравление, сон...)
├─ BattlerStatsModule (стадии характеристик)
├─ BattlerSwitchModule (замена монстров в отряде)
├─ RostersModule (управление отрядом)
├─ ScenariosModule (конфигурация типа боя)
├─ MegaModule (Мега-эволюция)
└─ CharactersModule (спрайты тренеров)

BattleManager

BattleManager -- центральный координатор. Он не содержит логику боя напрямую -- вместо этого делегирует модулям. Его обязанности:

  • Инициализация всех модулей при начале боя.
  • Предоставление общей точки отсчёта для межмодульной коммуникации.
  • Получение команд от UI (действия игрока) и ИИ (действия противника).
  • Сигнализация событий начала и конца боя.

BattleManager реализует IBattleManager -- внутренний интерфейс, используемый модулями для взаимодействия друг с другом.

BattleStateMachine

BattleStateMachine контролирует пошаговый ход:

BattleStart
→ Introduction (показ противников, воспроизведение музыки)
→ TurnStart
→ ActionSelection (игрок выбирает Fight/Bag/Monster/Run)
→ ActionExecution (выполнение всех действий в порядке скорости)
→ TurnEffects (погода, урон от статусов, способности конца хода)
→ FaintCheck (проверка, есть ли нокаутированный боец)
→ ReplaceFainted (игрок/ИИ выпускает следующего монстра)
→ TurnEnd
→ [цикл к TurnStart, если бой продолжается]
→ BattleEnd (определение победителя)
→ Results (опыт, EVs, деньги, результат захвата)
BattleCleanup

Каждое состояние -- отдельный класс. Переходы детерминированы -- нет неоднозначности, какое состояние следует за каким.

Модули сражений: подробный обзор

BattlersModule

Управляет экземплярами Battler для обеих сторон. Battler -- это боевое представление MonsterInstance:

  • Отслеживает текущее HP, PP для каждого приёма, стадии характеристик, летучие статусы.
  • Хранит ссылки на базовый MonsterInstance и MonsterEntry.
  • Рассчитывает эффективные характеристики (база + IVs + EVs + природа + стадии характеристик).

HealthModule

Обрабатывает все изменения HP:

  • Применение урона (после эффективности типов, STAB, критических ударов, стадий характеристик).
  • Лечение (предметы, приёмы, способности).
  • Определение нокаута и обработка нокаута.
  • Заменители и эффекты типа Focus Sash.

MovesModule

Основной механизм урона:

  • Выбор и валидация приёмов (проверка PP, отключённые приёмы, заблокированные приёмы).
  • Расчёт урона по формулам Gen V+.
  • Поиск эффективности типов.
  • Определение критического удара.
  • Многоударные приёмы, приёмы с фиксированным уроном, OHKO-приёмы.
  • Проверки точности и уклонения.
  • Эффекты приёмов (изменения характеристик, наложение статусов, полевые эффекты).

ItemsModule

Использование предметов в бою:

  • Лечебные предметы (Potion, Super Potion и т.д.).
  • Предметы лечения статусов (Antidote, Awakening и т.д.).
  • Боевые предметы (X Attack, X Defense и т.д.).
  • Предметы расходуются из инвентаря игрока при использовании.

CaptureModule

Механики захвата диких монстров:

  • Расчёт шанса поимки на основе шанса поимки вида, процента текущего HP, состояния статуса и типа мяча.
  • Анимация покачивания мяча (1-3 покачивания перед захватом или побегом).
  • Шанс критического захвата.
  • Добавление пойманного монстра в отряд игрока или хранилище ПК.

AIModule

Делегирует подключаемой стратегии IBattleAI:

  • Получает текущее состояние боя.
  • Возвращает BattleAction (какой приём использовать, стоит ли переключиться, стоит ли использовать предмет).
  • Подробности о встроенных и пользовательских стратегиях см. в Боевой ИИ.

StatusesModule

Управляет постоянными и летучими состояниями статуса:

Постоянные (только один одновременно):

  • Ожог, Заморозка, Паралич, Отравление, Сильное отравление, Сон.

Летучие (могут накапливаться):

  • Замешательство, Влюблённость, Вздрагивание, Ловушка, Вытягивание энергии и другие.

Каждый статус применяет свои эффекты в правильный момент цикла хода (например, урон от ожога в конце хода, проверка паралича перед выполнением приёма).

BattlerStatsModule

Обрабатывает модификации стадий характеристик:

  • Стадии характеристик варьируются от -6 до +6.
  • Каждая стадия применяет множитель: +1 = 1.5x, +2 = 2.0x, ..., -1 = 0.67x и т.д.
  • Отслеживает, какие характеристики были изменены и на сколько.
  • Обрабатывает способности, предотвращающие снижение характеристик (Clear Body, White Smoke).

MegaModule

Поддержка Мега-эволюции:

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

Пример хода боя

Вот что происходит, когда игрок выбирает "Fight" и выбирает приём:

  1. ActionSelection -- Игрок выбирает приём из панели 4 слотов.
  2. Расчёт приоритета -- Все действия (игрок + ИИ) сортируются по:
    • Приоритету приёма (например, Quick Attack имеет приоритет +1).
    • Характеристике скорости (более высокая ходит первой, со случайным определением ничьей).
  3. Выполнение приёма (для более быстрого бойца):
    • Проверка точности -- попадает ли приём?
    • Расчёт урона (если наносящий урон): ((2*Level/5+2) * Power * Atk/Def) / 50 + 2
    • Применение модификаторов: STAB, эффективность типов, критический удар, случайный фактор (0.85-1.0), предметы, способности, погода.
    • Применение вторичных эффектов (изменения характеристик, наложение статусов).
  4. Выполнение приёма (для более медленного бойца, если ещё стоит).
  5. TurnEffects -- Урон от погоды, урон от статусов, эффекты удерживаемых предметов, срабатывания способностей.
  6. FaintCheck -- Если у бойца 0 HP, обработка нокаута (выдача опыта/EVs, проверка эволюции).

Дикие vs Тренерские сражения

АспектДикий бойТренерский бой
Можно ловитьДаНет
Можно сбежатьДа (с проверкой побега)Нет
Отряд противника1 монстр1-6 монстров
Призовые деньгиНетДа (на основе класса тренера + уровня)
Поведение ИИОбычно случайноеНастраиваемое для каждого тренера
РеваншСлучайная встречаПо скрипту (CommandGraph)

Конфигурация боя

ScriptableObject BattleConfigurationFile контролирует глобальные настройки боя:

  • Стандартная скорость боя.
  • Настройки пропуска анимаций.
  • Шанс критического удара.
  • Эффекты погоды.
  • Модификаторы формулы опыта.
  • Модификаторы шанса захвата.

Доступ к нему по адресу Assets/OpenMon/Core/Runtime/Configuration/.

Прослушивание событий боя

Все уровни (SDK)

IBattleSystem battle = engine.Battle;
battle.OnBattleStarted += () => Debug.Log("Battle started");
battle.OnBattleEnded += (won) => Debug.Log($"Battle ended, won: {won}");

Уровень Source (внутренние события)

С доступом к исходному коду вы можете подписаться на детальные внутренние события отдельных модулей (нанесённый урон, применённый статус, попытка захвата и т.д.).