跳到主要内容

战斗系统架构

MCE 的战斗系统基于模块化组件架构BattleManager 协调 15+ 个专用模块,每个模块负责战斗的一个方面。BattleStateMachine 驱动回合流程,整个系统通过 Zenject 依赖注入连接在一起。

架构概述

BattleLauncher
└─ BattleManager(协调器)
├─ BattleStateMachine(回合流程)
├─ BattlersModule(战斗单位实例)
├─ HealthModule(HP、濒死)
├─ MovesModule(招式执行、PP)
├─ ItemsModule(战斗道具)
├─ CaptureModule(捕获机制)
├─ AIModule(敌方决策)
├─ AnimationModule(战斗动画)
├─ AudioModule(音乐、音效)
├─ StatusesModule(灼伤、中毒、睡眠……)
├─ BattlerStatsModule(能力值等级)
├─ BattlerSwitchModule(队伍切换)
├─ RostersModule(队伍管理)
├─ ScenariosModule(战斗类型配置)
├─ MegaModule(Mega 进化)
└─ CharactersModule(训练师精灵图)

BattleManager

BattleManager 是中央协调器。它本身不包含战斗逻辑——而是委派给各个模块。其职责包括:

  • 在战斗开始时初始化所有模块。
  • 为模块间通信提供共享引用点。
  • 接收来自 UI(玩家操作)和 AI(敌方操作)的命令。
  • 发出战斗开始和结束的事件信号。

BattleManager 实现了 IBattleManager,这是模块之间相互通信所使用的内部接口。

BattleStateMachine

BattleStateMachine 控制回合制流程:

BattleStart
→ Introduction(展示对手、播放音乐)
→ TurnStart
→ ActionSelection(玩家选择战斗/背包/怪兽/逃跑)
→ ActionExecution(按速度顺序解析所有行动)
→ TurnEffects(天气、状态伤害、回合结束特性)
→ FaintCheck(检查是否有战斗单位濒死)
→ ReplaceFainted(玩家/AI 派出下一只怪兽)
→ TurnEnd
→ [如果战斗继续则循环回 TurnStart]
→ BattleEnd(决定胜者)
→ Results(经验值、努力值、金钱、捕获结果)
BattleCleanup

每个状态都是一个独立的类。转换是确定性的——没有任何关于哪个状态跟随哪个状态的模糊性。

战斗模块深入解析

BattlersModule

管理双方的 Battler 实例。BattlerMonsterInstance 的战斗内表示:

  • 追踪当前 HP、每个招式的 PP、能力值等级、暂时性状态。
  • 持有对底层 MonsterInstanceMonsterEntry 的引用。
  • 计算有效能力值(基础 + 个体值 + 努力值 + 性格 + 能力值等级)。

HealthModule

处理所有 HP 变化:

  • 伤害应用(考虑属性克制、STAB、要害、能力值等级之后)。
  • 治疗(道具、招式、特性)。
  • 濒死检测和濒死处理。
  • 替身和 Focus Sash 类效果。

MovesModule

核心伤害引擎:

  • 招式选择和验证(PP 检查、禁用招式、锁定招式)。
  • 使用第五世代+公式进行伤害计算。
  • 属性克制查找。
  • 要害判定。
  • 多次攻击招式、固定伤害招式、一击必杀招式。
  • 命中率和回避率检查。
  • 招式附加效果(能力值变化、状态施加、场地效果)。

ItemsModule

战斗中使用道具:

  • 治疗道具(药水、超级药水等)。
  • 状态恢复道具(解毒药、唤醒药等)。
  • 战斗道具(力量提升、防御提升等)。
  • 使用时从玩家背包中消耗道具。

CaptureModule

野生怪兽捕获机制:

  • 基于物种捕获率、当前 HP 百分比、状态异常和球种类计算捕获率。
  • 球体晃动动画(捕获或逃脱前 1-3 次晃动)。
  • 暴击捕获概率。
  • 将捕获的怪兽添加到玩家队伍或 PC 存储。

AIModule

委派给可插拔的 IBattleAI 策略:

  • 接收当前战斗状态。
  • 返回一个 BattleAction(使用哪个招式、是否切换、是否使用道具)。
  • 有关内置和自定义策略的详情,请参阅战斗 AI

StatusesModule

管理非暂时性和暂时性状态异常:

非暂时性(同时只能有一个):

  • 灼伤、冰冻、麻痹、中毒、剧毒、睡眠。

暂时性(可叠加):

  • 混乱、着迷、畏缩、束缚、寄生种子等。

每种状态在回合周期的正确时机应用其效果(例如灼伤伤害在回合结束时、麻痹检查在招式执行前)。

BattlerStatsModule

处理能力值等级修改:

  • 能力值等级范围从 -6 到 +6。
  • 每个等级应用一个倍率:+1 = 1.5x,+2 = 2.0x,……,-1 = 0.67x 等。
  • 追踪哪些能力值已被修改及修改幅度。
  • 处理防止能力值下降的特性(硬壳盔甲、白色烟雾)。

MegaModule

Mega 进化支持:

  • 检查当前战斗单位的物种是否有 Mega 形态。
  • 检查玩家是否拥有所需的 Mega 道具。
  • 触发 Mega 进化动画。
  • 应用 Mega 形态的能力值和属性覆盖。
  • 每场战斗每个训练师只能使用一次 Mega 进化。

战斗流程示例

以下是玩家选择"战斗"并选取一个招式后发生的事情:

  1. ActionSelection -- 玩家从 4 个招式槽中选择一个招式。
  2. 优先级计算 -- 所有行动(玩家 + AI)按以下顺序排序:
    • 招式优先级(例如电光一闪有 +1 优先级)。
    • 速度能力值(越高越先行动,平局时随机决定)。
  3. 招式执行(较快的战斗单位):
    • 检查命中率——招式是否命中?
    • 计算伤害(如果是伤害招式):((2*Level/5+2) * Power * Atk/Def) / 50 + 2
    • 应用修正值:STAB、属性克制、要害、随机因子(0.85-1.0)、道具、特性、天气。
    • 应用次要效果(能力值变化、状态异常)。
  4. 招式执行(较慢的战斗单位,如果仍然站立)。
  5. TurnEffects -- 天气伤害、状态伤害、携带道具效果、特性触发。
  6. FaintCheck -- 如果战斗单位 HP 为 0,处理濒死(给予经验值/努力值,检查进化)。

野生战斗 vs 训练师战斗

方面野生战斗训练师战斗
可以捕获
可以逃跑是(有逃跑检查)
对手队伍1 只怪兽1-6 只怪兽
奖金有(基于训练师等级和等级)
AI 行为通常随机可按训练师配置
重新挑战随机遭遇脚本触发(CommandGraph)

战斗配置

BattleConfigurationFile ScriptableObject 控制全局战斗设置:

  • 默认战斗速度。
  • 动画跳过偏好。
  • 要害率。
  • 天气效果。
  • 经验值公式修正值。
  • 捕获率修正值。

访问路径: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 版本(内部事件)

拥有源代码访问权限后,你可以订阅各个模块上的细粒度内部事件(造成伤害、施加状态、尝试捕获等)。