战斗系统架构
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 实例。Battler 是 MonsterInstance 的战斗内表示:
- 追踪当前 HP、每个招式的 PP、能力值等级、暂时性状态。
- 持有对底层
MonsterInstance和MonsterEntry的引用。 - 计算有效能力值(基础 + 个体值 + 努力值 + 性格 + 能力值等级)。
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 进化。
战斗流程示例
以下是玩家选择"战斗"并选取一个招式后发生的事情:
- ActionSelection -- 玩家从 4 个招式槽中选择一个招式。
- 优先级计算 -- 所有行动(玩家 + AI)按以下顺序排序:
- 招式优先级(例如电光一闪有 +1 优先级)。
- 速度能力值(越高越先行动,平局时随机决定)。
- 招式执行(较快的战斗单位):
- 检查命中率——招式是否命中?
- 计算伤害(如果是伤害招式):
((2*Level/5+2) * Power * Atk/Def) / 50 + 2 - 应用修正值:STAB、属性克制、要害、随机因子(0.85-1.0)、道具、特性、天气。
- 应用次要效果(能力值变化、状态异常)。
- 招式执行(较慢的战斗单位,如果仍然站立)。
- TurnEffects -- 天气伤害、状态伤害、携带道具效果、特性触发。
- FaintCheck -- 如果战斗单位 HP 为 0,处理濒死(给予经验值/努力值,检查进化)。
野生战斗 vs 训练师战斗
| 方面 | 野生战斗 | 训练师战斗 |
|---|---|---|
| 可以捕获 | 是 | 否 |
| 可以逃跑 | 是(有逃跑检查) | 否 |
| 对手队伍 | 1 只怪兽 | 1-6 只怪兽 |
| 奖金 | 无 | 有(基于训练师等级和等级) |
| AI 行为 | 通常随机 | 可按训练师配置 |
| 重新挑战 | 随机遭遇 | 脚本触发(CommandGraph) |
战斗配置
BattleConfigurationFile ScriptableObject 控制全局战斗设置:
- 默认战斗速度。
- 动画跳过偏好。
- 要害率。
- 天气效果。
- 经验值公式修正值。
- 捕获率修正值。
访问路径:Assets/OpenMon/Core/Runtime/Configuration/。