メインコンテンツまでスキップ

バトルシステムアーキテクチャ

MCE のバトルシステムはモジュラーコンポーネントアーキテクチャで構築されています。BattleManager が15以上の専門モジュールを統括し、各モジュールは戦闘の1つの側面を担当します。BattleStateMachine がターンフローを制御し、システム全体が Zenject 依存性注入で接続されています。

アーキテクチャ概要

BattleLauncher
└─ BattleManager(オーケストレーター)
├─ BattleStateMachine(ターンフロー)
├─ BattlersModule(バトラーインスタンス)
├─ HealthModule(HP、ひんし)
├─ MovesModule(技の実行、PP)
├─ ItemsModule(バトル中のアイテム)
├─ CaptureModule(捕獲メカニクス)
├─ AIModule(敵の意思決定)
├─ AnimationModule(バトルアニメーション)
├─ AudioModule(音楽、効果音)
├─ StatusesModule(やけど、どく、ねむり...)
├─ BattlerStatsModule(ステータス段階)
├─ BattlerSwitchModule(パーティ交代)
├─ RostersModule(パーティ管理)
├─ ScenariosModule(バトルタイプ設定)
├─ MegaModule(メガシンカ)
└─ CharactersModule(トレーナースプライト)

BattleManager

BattleManager は中央のコーディネーターです。バトルロジック自体は含まず、モジュールに委譲します。その責務は:

  • バトル開始時にすべてのモジュールを初期化する。
  • モジュール間通信のための共有参照ポイントを提供する。
  • UI(プレイヤーアクション)とAI(敵アクション)からコマンドを受信する。
  • バトル開始・終了イベントを通知する。

BattleManagerIBattleManager を実装しており、これはモジュール間の通信に使用される内部インターフェースです。

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、急所、ステータス段階の後)。
  • 回復(アイテム、技、特性)。
  • ひんし判定とひんし処理。
  • みがわりやきあいのタスキ系のエフェクト。

MovesModule

コアダメージエンジンです:

  • 技の選択と検証(PPチェック、使用不可の技、こだわり系ロック)。
  • 第五世代以降のダメージ計算式。
  • タイプ相性の参照。
  • 急所判定。
  • 連続攻撃、固定ダメージ技、一撃必殺技。
  • 命中率と回避率のチェック。
  • 技の追加効果(ステータス変化、状態異常付与、フィールド効果)。

ItemsModule

バトル中のアイテム使用:

  • 回復アイテム(キズぐすり、いいキズぐすりなど)。
  • 状態異常回復アイテム(どくけし、めざましなど)。
  • バトルアイテム(プラスパワー、ディフェンダーなど)。
  • 使用したアイテムはプレイヤーのバッグから消費されます。

CaptureModule

野生モンスターの捕獲メカニクス:

  • 種族捕獲率、現在HP%、状態異常、ボールタイプに基づく捕獲率計算。
  • ボール揺れアニメーション(捕獲または脱出前に1-3回揺れる)。
  • 捕獲クリティカルの確率。
  • 捕獲したモンスターをプレイヤーのパーティまたはPCストレージに追加。

AIModule

プラガブルな IBattleAI ストラテジーに委譲します:

  • 現在のバトル状態を受信。
  • BattleAction を返す(どの技を使うか、交代するか、アイテムを使うか)。
  • 組み込みおよびカスタムストラテジーの詳細はバトルAIをご覧ください。

StatusesModule

非一時的および一時的な状態異常を管理します:

非一時的(同時に1つのみ):

  • やけど、こおり、まひ、どく、もうどく、ねむり。

一時的(重複可能):

  • こんらん、メロメロ、ひるみ、バインド、やどりぎのタネなど。

各状態異常はターンサイクルの正しいタイミングで効果を適用します(例:やけどダメージはターン終了時、まひチェックは技実行前)。

BattlerStatsModule

ステータス段階の変化を処理します:

  • ステータス段階の範囲は -6 から +6。
  • 各段階は倍率を適用:+1 = 1.5倍、+2 = 2.0倍、...、-1 = 0.67倍、など。
  • どのステータスがどの程度変化したかを追跡。
  • ステータス低下を防ぐ特性(クリアボディ、しろいけむりなど)を処理。

MegaModule

メガシンカのサポート:

  • アクティブなバトラーの種族にメガフォームがあるかチェック。
  • プレイヤーが必要なメガアイテムを持っているかチェック。
  • メガシンカアニメーションをトリガー。
  • メガフォームのステータスとタイプのオーバーライドを適用。
  • バトルごとにトレーナー1人につきメガシンカは1回のみ。

バトルフローの例

プレイヤーが「たたかう」を選択して技を選んだ場合の処理:

  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 ティア(内部イベント)

ソースコードにアクセスできる場合、個々のモジュールの詳細な内部イベント(ダメージ発生、状態異常適用、捕獲試行など)を購読できます。