/// <summary> /// 試合進行モードの変更 /// </summary> private void ChangeGameMode() { // デバッグモードは常に高速試合モード if (EVManager.Instance.DebugMode) { HighSpeedGameMode = true; return; } // 最終回より前で、安全圏で勝っているか大差で負けている場合、高速試合モード if (GameData.CurrentInning < 9 && (GameData.RunScoreDeltaForUser <= Constants.GiveUpRunScore || GameData.RunScoreDeltaForUser >= Constants.FlaccidRunScore)) { HighSpeedGameMode = true; return; } // 最終回の表の攻撃で、安全圏で勝っていれば高速試合モード if (GameData.CurrentInning >= 9 && GameData.IsCurrentInningTop && GameData.RunScoreDeltaForAttackTeam >= Constants.FlaccidRunScore) { HighSpeedGameMode = true; return; } // 格下との対戦かどうかを設定 double teamTotalDelta = GameData.UserTeamSetting.Total - GameData.ComTeamSetting.Total; bool rankedLower = teamTotalDelta >= 2.0; // 以下の条件を満たさなければ高速試合モードとする bool isHighSpeed = true; #region 初回・最終回 // 初回の攻撃 if (GameData.CurrentInning == 1 && GameData.UserTeamOffenseOrDefense) isHighSpeed = false; // 初回の通常モードは攻撃のみとする(守備は面白みが少ないから) //// 初回の守備(ただし大差で負けていない場合) //if (GameData.CurrentInning == 1 && !GameData.UserTeamOffenseOrDefense && // GameData.RunScoreDeltaForUser > Constants.GiveUpRunScore) // isHighSpeed = false; // 9回以降での決着回か同点か延長 if (GameData.IsLastInning) { isHighSpeed = false; } #endregion #region ピンチ・チャンス時 // ランナーの数で得点期待値を数値化する // (一塁ランナーは7回以降のみ得点期待値に加算) // (ランナーが二人以上の場合、リスクの高さを表すために別途1点分の期待値を加算) int expectedRibby = 0; if (GameData.FirstRunnerMember != null && GameData.CurrentInning >= 7) expectedRibby += 1; if (GameData.SecondRunnerMember != null) expectedRibby += 1; if (GameData.ThirdRunnerMember != null) expectedRibby += 1; if (GameData.AllRunnerMembers.Count >= 2) expectedRibby += 1; // 要注意打者は得点期待値を加算 if (!GameData.UserTeamOffenseOrDefense) { string[] specialMemberNames = new[] { "火神 大我", "黒崎 一護", "キン肉マン", "サスケ", "DIO", "空条 承太郎", }; if (specialMemberNames.Any(name => GameData.CurrentBatter.Name.StartsWith(name))) { expectedRibby += 1; } } if (expectedRibby > 0 && GameData.UserTeamOffenseOrDefense) { // 攻撃中(得点期待値が1以上) if (GameData.CurrentInning <= 3) { // 序盤は同点以下で大チャンスで格下でない場合のみ、通常モード if (GameData.RunScoreDeltaForUser <= 0 && expectedRibby >= 2 && rankedLower == false) { isHighSpeed = false; } } else if (GameData.CurrentInning <= 6) { // 中盤 if (GameData.RunScoreDeltaForUser >= -2 && GameData.RunScoreDeltaForUser <= 1) { // 接戦ならば得点期待値が1以上で通常モード isHighSpeed = false; } else if ((GameData.RunScoreDeltaForUser <= -3 || GameData.RunScoreDeltaForUser == 2) && expectedRibby >= 2) { // 3点以上負けているか2点勝っている場合は、得点期待値が2以上の場合のみ、通常モード isHighSpeed = false; } } else { // 終盤 if (GameData.RunScoreDeltaForUser <= 2) { // 2点リード以下の場合は得点期待値1以上で通常モード isHighSpeed = false; } } } else if (expectedRibby > 0 && !GameData.UserTeamOffenseOrDefense) { // 守備中(得点期待値が1以上) // リードを守れる範囲で、得点を許容する点数を設定 // (3点リードの場合、3点未満の得点期待値であれば高速モード) int permitRibby = GameData.RunScoreDeltaForUser; if (GameData.CurrentInning <= 3) { // 序盤は2点リードされるまでは許容する permitRibby += 2; } else if (GameData.CurrentInning <= 6) { // 中盤は2点以上自チームが得点できており、格下相手ならば // 逆転可能とみなして1点リードされるまでは許容する // それ以外は同点まで許容する if (GameData.UserTeamRunScore >= 2 && rankedLower == true) { permitRibby += 1; } } else { // 終盤はリード時に1点差まで詰め寄られるまでは許容する permitRibby -= 1; } // 得点期待値が許容範囲を超える場合は通常操作モードへ if (expectedRibby > permitRibby) isHighSpeed = false; } #endregion #region チャンスが少なすぎる場合 // ユーザの得点が1点以下で同点か負けていて7回以降の場合、ユーザの攻撃を通常モードにする if (GameData.UserTeamOffenseOrDefense && GameData.UserTeamRunScore <= 1 && GameData.RunScoreDeltaForUser <= 0 && GameData.CurrentInning >= 7) { isHighSpeed = false; } #endregion #region ユーザが代打か代走を出した場合 // 代打・代走で出場した選手のリストを交代候補として取得 if (GameData.UserTeamOffenseOrDefense == false && GameData.CurrentDefenseTeam.CurrentPlayingMembers.Any(member => member.ChangedOffense)) { // 高速試合モードは変更せず、メンバー変更画面を表示 NeedMemberSelectView = true; } #endregion HighSpeedGameMode = isHighSpeed; }