/// <summary> /// 一球投球ハンドラ /// </summary> /// <param name="obj"></param> void GameManager_AfterPitchAndBat(PitchingBollResult obj) { m_TextBox.Text = obj.ToStringForDebug(); label15.Text = m_GameManager.GameData.CurrentBatter.Player.Name; // 試合データ表示更新 UpdateGameDataDisplay(); }
/// <summary> /// 一球投球確定後ハンドラ /// </summary> /// <param name="obj"></param> private void m_GameManager_AfterPitchAndBat(PitchingBollResult obj) { // 高速試合モードか投球アニメ省略モードであれば何もしない if (m_GameManager.HighSpeedGameMode || OmitPitchingAnime) { return; } // 投球アニメーションの実行 m_PitchingView.ExecuteAnimation(); // アニメーションの実行時間を加算 m_DispatcherTimer.Interval += UIConstants.PitchingBollAnimationSpan; if (GameData.LatestPitchingBollResult.PitchingBollResultKind != PitchingBollResultKind.BattingBoll) { // ミートしなかった場合、カウントコール表示分のアニメのために、少し長めに硬直 // (現在は便宜的にテキスト表示時間を加算) m_DispatcherTimer.Interval += UIConstants.ShowTextAnimationSpan; } }
/// <summary> /// 投球を捕逸するか(捕逸する場合は打球データに設定) /// </summary> /// <param name="actualBall"></param> /// <param name="result"></param> private void JudgePassBoll(PitchingBallData actualBall, PitchingBollResult result) { // デバッグでの確率検証中は捕逸しない if (Constants.IsDebugValidationMode) { return; } // 三振か四死球かランナーがいない場合は捕逸しない if (GameData.StrikeCount == 3 || GameData.BallCount == 4 || result.PitchingBollResultKind == PitchingBollResultKind.DeadBoll || GameData.AllRunnerMembers.Count == 0) { return; } // ウエスト、ど真ん中、甘いコースは捕逸しない if (actualBall.PitchingCourse == PitchingCourse.PitchOut || actualBall.PitchingCourse == PitchingCourse.Center || actualBall.PitchingCourse == PitchingCourse.Sweet) { return; } // 捕球成功率 // =(固定90%)+(守備力補正10%)-(守備力とコースによる変動25%) // =(固定9/10)+ (守備力1/9)- (守備力とコースによる変動25%) // 厳しいコース、わずかにボール:期待値=90%+(2.5~10%) // 完全にボール:期待値=90%+(2.5~10%)-(0~9.4%) // 暴投 :期待値=90%+(2.5~10%)-(0~18.8%) GameMemberAbility memberAbility = GameData.GetDefenseMemberAbility(DefensePosition.Catcher); double JudgmentAbilityVallue = Constants.MaxAbilityValue * 9 / 10 + memberAbility.Defense / 10; if (actualBall.PitchingCourse == PitchingCourse.NormalBoll) { // 完全にボールの場合、最小値5で最大値20ならば、実質0%~9.375%の成功率低下 JudgmentAbilityVallue -= GameMemberAbility.GetLowerValue(memberAbility.Defense, Constants.MaxAbilityValue) / 8; } if (actualBall.PitchingCourse == PitchingCourse.WildPitchBoll) { // 暴投の場合、最小値5で最大値20ならば、実質0%~18.75%の成功率低下 JudgmentAbilityVallue -= GameMemberAbility.GetLowerValue(memberAbility.Defense, Constants.MaxAbilityValue) / 4; } int failDelta; if (!memberAbility.JudgByRandom(JudgmentAbilityVallue, out failDelta)) { // 捕逸する // 打球と同じ扱いにするため、打球データを設定する // 打球速度は走塁速度と同程度の速度をランダムに設定(捕手が追いつける程度にするため) result.BattedBoll = new BattedBoll(); result.BattedBoll.IsPassBoll = true; result.BattedBoll.SideDirection = RandomCreater.GetRandomValue(-190, -170); int bollSpeedValue = RandomCreater.GetRandomValue((int)Constants.SpecialAbilityBasicValue, (int)Constants.MaxAbilityValue); result.BattedBoll.Speed = bollSpeedValue * Constants.RunSpeedOffSet; // 成績更新(わかりやすいようにすべて投手の暴投としてカウントする) GameData.AddWildPitch(GameData.CurrentPitcherAbirity.GameMember); } }