Архитектура системы сражений
Система сражений 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" и выбирает приём:
- ActionSelection -- Игрок выбирает приём из панели 4 слотов.
- Расчёт приоритета -- Все действия (игрок + ИИ) сортируются по:
- Приоритету приёма (например, Quick Attack имеет приоритет +1).
- Характеристике скорости (более высокая ходит первой, со случайным определением ничьей).
- Выполнение приёма (для более быстрого бойца):
- Проверка точности -- попадает ли приём?
- Расчёт урона (если наносящий урон):
((2*Level/5+2) * Power * Atk/Def) / 50 + 2 - Применение модификаторов: STAB, эффективность типов, критический удар, случайный фактор (0.85-1.0), предметы, способности, погода.
- Применение вторичных эффектов (изменения характеристик, наложение статусов).
- Выполнение приёма (для более медленного бойца, если ещё стоит).
- TurnEffects -- Урон от погоды, урон от статусов, эффекты удерживаемых предметов, срабатывания способностей.
- FaintCheck -- Если у бойца 0 HP, обработка нокаута (выдача опыта/EVs, проверка эволюции).
Дикие vs Тренерские сражения
| Аспект | Дикий бой | Тренерский бой |
|---|---|---|
| Можно ловить | Да | Нет |
| Можно сбежать | Да (с проверкой побега) | Нет |
| Отряд противника | 1 монстр | 1-6 монстров |
| Призовые деньги | Нет | Да (на основе класса тренера + уровня) |
| Поведение ИИ | Обычно случайное | Настраиваемое для каждого тренера |
| Реванш | Случайная встреча | По скрипту (CommandGraph) |
Конфигурация боя
ScriptableObject BattleConfigurationFile контролирует глобальные настройки боя:
- Стандартная скорость боя.
- Настройки пропуска анимаций.
- Шанс критического удара.
- Эффекты погоды.
- Модификаторы формулы опыта.
- Модификаторы шанса захвата.
Доступ к нему по адресу Assets/OpenMon/Core/Runtime/Configuration/.