コード例 #1
0
ファイル: GameManager.cs プロジェクト: koji716jp/eikannyain
        /// <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;
        }