/// <summary> /// チーム設定の作成 /// </summary> /// <returns></returns> public TeamSetting CreateTeamSetting(TeamNumber teamNumber) { // チーム番号に即したデータを読み込む string text = Resources.Resource.ResourceManager.GetString(teamNumber.ToString()); TeamSetting teamSetting = null; int basicValue = 0; StringReader reader = new StringReader(text); string line; int lineCount = 0; while ((line = reader.ReadLine()) != null) { if (lineCount == 0) { // 1行目:チーム設定を取得 string[] teamSettingString = line.Split(TextSeparator); basicValue = int.Parse(teamSettingString[0]); string initialName = teamSettingString[1]; string teamName = teamSettingString[2]; teamSetting = new TeamSetting(teamName, initialName, teamNumber); } else if (lineCount == 1) { // 2行目:何もしない } else if (lineCount >= 20) { // 20行目:最大で18人分(LineCountが19)までしか読み込まない break; } else { // 3行目~19行目:能力値の取得 string[] memberSettingString = line.Split(TextSeparator); if (memberSettingString[0] == string.Empty) { // 1列目が空文字であればそれ以上のメンバ無しとみなして取得終了 break; } int columnIndex = 1; Player player = new Player(); DefensePosition defensePosition = (DefensePosition)System.Enum.Parse(typeof(DefensePosition), memberSettingString[columnIndex], true); columnIndex++; player.Name = memberSettingString[columnIndex]; columnIndex++; player.Grade = int.Parse(memberSettingString[columnIndex]); columnIndex++; if (memberSettingString[columnIndex] != string.Empty) { player.IsLeftThrow = bool.Parse(memberSettingString[columnIndex]); } columnIndex++; if (memberSettingString[columnIndex] != string.Empty) { player.IsLeftBox = bool.Parse(memberSettingString[columnIndex]); } columnIndex++; player.BreedType = (BreedType)System.Enum.Parse(typeof(BreedType), memberSettingString[columnIndex], true); columnIndex++; player.FielderAbility.Meet = int.Parse(memberSettingString[columnIndex]) + basicValue; columnIndex++; player.FielderAbility.Power = int.Parse(memberSettingString[columnIndex]) + basicValue; columnIndex++; player.FielderAbility.Run = int.Parse(memberSettingString[columnIndex]) + basicValue; columnIndex++; player.FielderAbility.Defense = int.Parse(memberSettingString[columnIndex]) + basicValue; columnIndex++; player.FielderAbility.Wisdom = int.Parse(memberSettingString[columnIndex]) + basicValue; columnIndex++; columnIndex++;// [計]列はスキップ // 守備適正は未記入であれば守備位置と同じものを設定 if (memberSettingString[columnIndex] != string.Empty) { player.FielderAbility.DefenseType = (DefenseType)System.Enum.Parse(typeof(DefenseType), memberSettingString[columnIndex], true); } else { player.FielderAbility.DefenseType = DefensePositionHelper.ConvertDefenseType(defensePosition); } columnIndex++; // 起用は未記入であればNomalとする UseKind useKind; if (memberSettingString[columnIndex] != string.Empty) { useKind = (UseKind)System.Enum.Parse(typeof(UseKind), memberSettingString[columnIndex], true); } else { useKind = UseKind.Normal; } columnIndex++; // 特殊能力 if (memberSettingString[columnIndex] != string.Empty) { player.FielderAbility.SpecialFilederAbility = SpecialAbilityHelper.GetSpecialFielderAbility(memberSettingString[columnIndex]); } columnIndex++; if (memberSettingString[columnIndex] != string.Empty) { // 投手能力が設定されている場合 player.PitcherAbility.Fastball = int.Parse(memberSettingString[columnIndex]) + basicValue; columnIndex++; player.PitcherAbility.Breakingball = int.Parse(memberSettingString[columnIndex]) + basicValue; columnIndex++; player.PitcherAbility.Control = int.Parse(memberSettingString[columnIndex]) + basicValue; columnIndex++; player.PitcherAbility.Stamina = int.Parse(memberSettingString[columnIndex]) + basicValue; columnIndex++; columnIndex++;// [計]列はスキップ if (memberSettingString[columnIndex] != string.Empty) { player.PitcherAbility.PitchingStyle = (PitchingStyle)System.Enum.Parse(typeof(PitchingStyle), memberSettingString[columnIndex], true); } columnIndex++; // 投手の特殊能力 if (memberSettingString[columnIndex] != string.Empty) { player.PitcherAbility.SpecialPitcherAbility = SpecialAbilityHelper.GetSpecialPitcherAbility(memberSettingString[columnIndex]); } } else { // 投手能力が未設定の場合 const int nothingValue = 0; player.PitcherAbility.Fastball = nothingValue; player.PitcherAbility.Breakingball = nothingValue; player.PitcherAbility.Control = nothingValue; player.PitcherAbility.Stamina = nothingValue; player.PitcherAbility.SpecialPitcherAbility = SpecialPitcherAbility.Nothing; } // メンバの作成 GameMember member = new GameMember(player, defensePosition); member.UseKind = useKind; teamSetting.DefaultGameMembers.Add(member); } lineCount++; } // デフォルトのメンバ設定を元にメンバ設定を作成 teamSetting.CreateCurrentMembersFromDefault(); // チーム設定のチェック(よくある設定ミスをチェック) CheckTeamSetting(teamSetting); return teamSetting; }
/// <summary> /// 通常実行ボタン /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void m_ExecuteButton_Click(object sender, EventArgs e) { this.Enabled = false; Application.DoEvents(); Cursor.Current = Cursors.WaitCursor; // 打撃結果の格納コレクション List<BattingResultKind> results = new List<BattingResultKind>(); // 打点、暴投、投球数を集計 int ribby = 0; int wildPitch = 0; int throwBollCount = 0; // 捕球時間を集計 int catchTime = 0; // チーム設定以外のパラメータ設定 int baseAbilityValue = int.Parse(m_BaseAbilityValue.Text); Constants.FlyPercent = int.Parse(m_FlyPercent.Text); Constants.BaseToFenceDistance = int.Parse(m_FenseValue.Text); Constants.FastBallPercent = int.Parse(m_FastBollPercent.Text); Enum.TryParse(m_Direction.Text, out GameManager.DebugBattingDirection); int executeCount = int.Parse(m_ExecuteCount.Text); // 指定したパラメータで既定回数実行) for (int i = 0; i < executeCount; i++) { GameManager gameManager = GetGameManager(baseAbilityValue); TeamSetting topTeamSetting = gameManager.GameData.TopTeamSetting; TeamSetting bottomTeamSetting = gameManager.GameData.BottomTeamSetting; // 投球戦術の設定 PitchingMissionManager.PitchingMissionsForDebug.Clear(); if (m_PitchingMission.Text != string.Empty) { // 検証用の投球作戦として設定する PitchingMissionKind pitchingMission = (PitchingMissionKind)Enum.Parse(typeof(PitchingMissionKind), m_PitchingMission.Text); PitchingMissionManager.PitchingMissionsForDebug.Add(new PitchingMission(pitchingMission)); // 検証用の投球作戦を設定した場合、「球種変更補正を含めた強い球種を多用」は常に設定する PitchingMissionManager.PitchingMissionsForDebug.Add(new PitchingMission(PitchingMissionKind.StrongBallByChangeBollKind)); } // 打撃戦術の設定 if (m_BattingMission.Text != string.Empty) { // 打者のチーム(先行チーム)がユーザチームであることを利用して // ユーザ指定の作戦として設定する BattingMissionKind battingMission = (BattingMissionKind)Enum.Parse(typeof(BattingMissionKind), m_BattingMission.Text); gameManager.GameData.RequestedBattingMissions.Add(new BattingMission(battingMission)); } // 試合の実行 // (暴投でランナーが生還した場合も継続するため打順変わるまで継続する) gameManager.ContinueGameByOneBatter(false); results.Add(topTeamSetting.CurrentPlayingMembers.First().BattingResults.First()); ribby += topTeamSetting.CurrentPlayingMembers.First().Ribby; wildPitch += bottomTeamSetting.WildPitchCount; throwBollCount += bottomTeamSetting.GetMember(DefensePosition.Pitcher).PitchingResult.ThrowBollCount; if (gameManager.GameData.LatestPitchingBollResult.PitchingBollResultKind == PitchingBollResultKind.BattingBoll) { catchTime += gameManager.CatchTime; } gameManager.Dispose(); } // 打撃結果を出力するためにメンバを作成 GameMember member = new GameMember(new Player(), DefensePosition.Sub); int inFielderHitCount = 0; int inFielderGroundCount = 0; int outFielderGroundCount = 0; int inFielderFlyCount = 0; int outFielderFlyCount = 0; int errorCount = 0; int gounrd1 = 0; int gounrd2 = 0; int gounrd3 = 0; int gounrd4 = 0; int gounrd5 = 0; int gounrd6 = 0; int getTwoCount = 0; int sacrificeCount = 0; foreach (BattingResultKind result in results) { member.AddBattingResult(result, 0); if (BattingResultKindHelper.IsInFielderHit(result)) { // 内安打 inFielderHitCount++; } if (BattingResultKindHelper.IsInFielderGround(result)) { // 内野ゴロ inFielderGroundCount++; if (result == BattingResultKind.PitcherGround || result == BattingResultKind.PitcherGetTwo) gounrd1++; if (result == BattingResultKind.CatcherGround || result == BattingResultKind.CatcherGetTwo) gounrd2++; if (result == BattingResultKind.FirstGround || result == BattingResultKind.FirstGetTwo) gounrd3++; if (result == BattingResultKind.SecondGround || result == BattingResultKind.SecondGetTwo) gounrd4++; if (result == BattingResultKind.ThirdGround || result == BattingResultKind.ThirdGetTwo) gounrd5++; if (result == BattingResultKind.ShortGround || result == BattingResultKind.ShortGetTwo) gounrd6++; } if (BattingResultKindHelper.IsOutFielderGround(result)) { // 外野ゴロ outFielderGroundCount++; } if (BattingResultKindHelper.IsInFielderFly(result)) { // 内野フライ inFielderFlyCount++; } if (BattingResultKindHelper.IsOutFielderFly(result)) { // 外野フライ outFielderFlyCount++; } if (BattingResultKindHelper.IsError(result)) { // 失策 errorCount++; } if (BattingResultKindHelper.IsGetTwo(result)) { // 併殺 getTwoCount++; } if (result == BattingResultKind.SacrificeBunt || result == BattingResultKind.SacrificeFly) { // 犠打 sacrificeCount++; } } int outBatCount = member.BatCount - member.HitCount; // 表示に用いる際の基準の回数に変換する補正値を計算 double executeCountRasio = ((double)executeCount / ExecuteBasicCount); // 打撃結果を出力 StringBuilder stringBuilder = new StringBuilder(); stringBuilder.AppendLine(string.Format("打率 :{0}", member.Player.BattingAverage)); stringBuilder.AppendLine(string.Format("出塁率:{0}", member.Player.OnBasePercentage)); stringBuilder.AppendLine(string.Format("長打率:{0}", member.Player.SluggingAverage)); stringBuilder.AppendLine(string.Format("OPS :{0}", member.Player.OPS)); stringBuilder.AppendLine(string.Format("安打数:{0}", (int)(member.HitCount / executeCountRasio))); stringBuilder.AppendLine(string.Format("二塁打:{0}", (int)(member.TwoBaseHitCount / executeCountRasio))); stringBuilder.AppendLine(string.Format("三塁打:{0}", (int)(member.ThreeBaseHitCount / executeCountRasio))); stringBuilder.AppendLine(string.Format("本塁打:{0}", (int)(member.HomeRunCount / executeCountRasio))); stringBuilder.AppendLine(string.Format("内安打:{0}", (int)(inFielderHitCount / executeCountRasio))); stringBuilder.AppendLine(string.Format("四死球:{0}", (int)(member.FourBollOrDeadBollCount / executeCountRasio))); stringBuilder.AppendLine(string.Format("打点 :{0}", (int)(ribby / executeCountRasio))); stringBuilder.AppendLine(string.Format("三振率:{0}%", (member.StrikeOutCount * 100 / outBatCount))); stringBuilder.AppendLine(string.Format("内野ゴ:{0}%", (inFielderGroundCount * 100 / outBatCount))); stringBuilder.AppendLine(string.Format("外野ゴ:{0}%", (outFielderGroundCount * 100 / outBatCount))); stringBuilder.AppendLine(string.Format("内野飛:{0}%", (inFielderFlyCount * 100 / outBatCount))); stringBuilder.AppendLine(string.Format("外野飛:{0}%", (outFielderFlyCount * 100 / outBatCount))); stringBuilder.AppendLine(string.Format("失策 :{0}%", (errorCount * 100 / outBatCount))); stringBuilder.AppendLine(string.Format("三振数:{0}", (int)(member.StrikeOutCount / executeCountRasio))); stringBuilder.AppendLine(string.Format("投ゴ :{0}", (int)(gounrd1 / executeCountRasio))); stringBuilder.AppendLine(string.Format("捕ゴ :{0}", (int)(gounrd2 / executeCountRasio))); stringBuilder.AppendLine(string.Format("一ゴ :{0}", (int)(gounrd3 / executeCountRasio))); stringBuilder.AppendLine(string.Format("ニゴ :{0}", (int)(gounrd4 / executeCountRasio))); stringBuilder.AppendLine(string.Format("遊ゴ :{0}", (int)(gounrd6 / executeCountRasio))); stringBuilder.AppendLine(string.Format("三ゴ :{0}", (int)(gounrd5 / executeCountRasio))); stringBuilder.AppendLine(string.Format("外ゴ :{0}", (int)(outFielderGroundCount / executeCountRasio))); stringBuilder.AppendLine(string.Format("併殺 :{0}(内ゴ{1})", (int)(getTwoCount / executeCountRasio), (int)(inFielderGroundCount / executeCountRasio))); stringBuilder.AppendLine(string.Format("犠打 :{0}", (int)(sacrificeCount / executeCountRasio))); stringBuilder.AppendLine(string.Format("暴投 :{0}", (int)(wildPitch / executeCountRasio))); stringBuilder.AppendLine(string.Format("投球数:{0}", (int)((double)throwBollCount / outBatCount * 27))); stringBuilder.AppendLine(string.Format("捕球時間平均:{0}", (catchTime / Math.Max(1, executeCount - member.StrikeOutCount - member.FourBollOrDeadBollCount)))); m_ResultText.Text = stringBuilder.ToString(); Cursor.Current = Cursors.Default; this.Enabled = true; }
/// <summary> /// コンストラクタ /// </summary> /// <param name="member">メンバ</param> /// <param name="gameData">試合データ</param> public GameMemberAbility(GameMember member, GameData gameData) { GameMember = member; GameData = gameData; }
/// <summary> /// 基本的な能力を設定する /// </summary> /// <param name="i"></param> /// <param name="basecValue"></param> /// <param name="breedType"></param> /// <param name="teamSetting"></param> /// <returns></returns> private GameMember SetBasicAbility(int i, int basecValue, BreedType breedType, TeamSetting teamSetting) { Player player = new Player(); player.Name = i.ToString(); player.BreedType = breedType; player.FielderAbility.Meet = basecValue; player.FielderAbility.Power = basecValue; player.FielderAbility.Run = basecValue; player.FielderAbility.Defense = basecValue; player.FielderAbility.Wisdom = basecValue; player.PitcherAbility.Fastball = basecValue; player.PitcherAbility.Breakingball = basecValue; player.PitcherAbility.Control = basecValue; player.PitcherAbility.Stamina = basecValue; player.IsLeftThrow = false; player.IsLeftBox = false; // 守備適性の設定 int defensePositionIntValue = i; if (defensePositionIntValue > 9) { defensePositionIntValue = 0; } DefensePosition defensePosition = (DefensePosition)defensePositionIntValue; switch (defensePosition) { case DefensePosition.Pitcher: player.FielderAbility.DefenseType = DefenseType.Pitcher; break; case DefensePosition.Catcher: player.FielderAbility.DefenseType = DefenseType.Catcher; break; case DefensePosition.First: case DefensePosition.Second: case DefensePosition.Third: case DefensePosition.Short: player.FielderAbility.DefenseType = DefenseType.Infielder; break; case DefensePosition.Right: case DefensePosition.Center: case DefensePosition.Left: player.FielderAbility.DefenseType = DefenseType.Outfielder; break; case DefensePosition.Sub: if (i <= 12) { // 控え投手3人 player.FielderAbility.DefenseType = DefenseType.Pitcher; } else if (i == 13) { player.FielderAbility.DefenseType = DefenseType.Catcher; } else if (i <= 16) { player.FielderAbility.DefenseType = DefenseType.Infielder; } else { player.FielderAbility.DefenseType = DefenseType.Outfielder; } break; default: throw new Exception("不明な守備位置"); } // メンバの作成 GameMember member = new GameMember(player, defensePosition); teamSetting.DefaultGameMembers.Add(member); return member; }
/// <summary> /// 指定した選手を交代させる /// </summary> /// <param name="oldMember">試合に出ている古いメンバ</param> /// <param name="newMember">控えにいる新メンバ</param> /// <param name="isOffense">攻撃中の交代か</param> /// <param name="inning">交代するイニング</param> public void ChangeMember(GameMember oldMember, GameMember newMember, bool isOffense, int inning) { Assertion.Assert(CurrentPlayingMembers.Contains(oldMember), "CurrentPlayingMembers.Contains(oldMember)"); Assertion.Assert(CurrentSubMembers.Contains(newMember), "CurrentSubMembers.Contains(newMember)"); // 新メンバのプロパティ設定 newMember.ChangedOffense = isOffense; newMember.ChangedDefense = !isOffense; newMember.IsMidway = true; newMember.StartInning = inning; // 守備位置の入れ替え newMember.DefensePosition = oldMember.DefensePosition; oldMember.DefensePosition = DefensePosition.Sub; // 新メンバを控えリストから除外 CurrentGameMembers.Remove(newMember); // 古いメンバの位置に新メンバを設定 int oldIndex = CurrentGameMembers.IndexOf(oldMember); CurrentGameMembers[oldIndex] = newMember; // 古いメンバを交代済みリストに格納 oldMember.OrderNumber = oldIndex + 1; CurrentChangedMembers.Add(oldMember); }
/// <summary> /// 指定した選手(ベンチメンバ)を投手にする /// </summary> /// <param name="newPitcher"></param> /// <param name="inning"></param> public void ChangeMemberForPitcher(GameMember newPitcher, int inning) { Assertion.Assert(!CurrentPlayingMembers.Contains(newPitcher), "指定したメンバが控えメンバでない"); // 現在の投手を選出 GameMember oldPitcher = CurrentPlayingMembers.Single(m => m.DefensePosition == DefensePosition.Pitcher); // 選手の交代 ChangeMember(oldPitcher, newPitcher, false, inning); }
/// <summary> /// メンバの打順とポジションを設定 /// </summary> /// <param name="allPlayers">全選手一覧(スタメン選定時に同じ能力なら並び順が先を優先)</param> private void SetMembers(List<Player> allPlayers) { // 各ポジションごとに強い順に新しいスタメンを設定 List<GameMember> newGameMembers = new List<GameMember>(); List<GameMember> newOutsideMembers = new List<GameMember>(); List<DefensePosition> pendingPositions = new List<DefensePosition>(); foreach (DefensePosition position in DefensePositionHelper.GetEnums) { Player player; // 守備適正のあるメンバのうち、総合力が最も高いメンバを選定する if (position == DefensePosition.Pitcher) { // コンバートにより投手でも存在しないことがありえるためFirstOrDefaultメソッドで取得 player = allPlayers.Where(m => DefenseTypeHelper.FitDefensePosition(position, m.FielderAbility.DefenseType)).OrderByDescending(m => m.PitcherAbility.Total).FirstOrDefault(); } else { player = allPlayers.Where(m => DefenseTypeHelper.FitDefensePosition(position, m.FielderAbility.DefenseType)).OrderByDescending(m => m.FielderAbility.Total).FirstOrDefault(); } if (player != null) { // 新しいメンバをスタメンに追加 GameMember member = new GameMember(player, position); newGameMembers.Add(member); // 選手一覧から追加メンバを削除 allPlayers.Remove(player); } else { // 適切な守備適性のメンバが存在せずnullの場合は再検討 pendingPositions.Add(position); } } // 適切な守備適性でスタメンが埋まらない場合は、適当に総合力の高い順に選定 if (pendingPositions.Count > 0) { foreach (DefensePosition position in pendingPositions) { // 概ね適正のある守備位置から選定 Player player = allPlayers.Where(m => DefenseTypeHelper.MostFitDefensePosition(position, m.FielderAbility.DefenseType)) .OrderByDescending(m => m.FielderAbility.Total).FirstOrDefault(); // 概ねの適性もなければ投手以外で適当に選定 if (player == null) { player = allPlayers.OrderBy(m => m.IsPitcher).ThenByDescending(m => m.FielderAbility.Total).First(); } // 新しいメンバをスタメンに追加 GameMember member = new GameMember(player, position); newGameMembers.Add(member); // 選手一覧から追加メンバを削除 allPlayers.Remove(player); } } // この時点で9人となるはず Assertion.Assert(newGameMembers.Count == 9, "newGameMembers.Count == 9"); // 打順は、以下の順にメンバの能力値で決める // 9:投手(投手でも打撃強い場合があるが交代も考慮して9番とする) // 4:[ミート+パワー×2]トップ(初期設定で友沢亮が4番になりにくくするため長打力を重視) // 1:[ミート+走力]トップ // 3:打者能力トップ // 2:[ミート+智力]トップ // 5:打者能力トップ // 6:打者能力トップ // 7:打者能力トップ // 8:打者能力トップ GameMember member9 = newGameMembers.OrderByDescending(m => m.DefensePosition == DefensePosition.Pitcher).First(); newGameMembers.Remove(member9); GameMember member4 = newGameMembers.OrderByDescending(m => m.Meet + m.Power * 2).First(); newGameMembers.Remove(member4); GameMember member1 = newGameMembers.OrderByDescending(m => m.Meet + m.Run).First(); newGameMembers.Remove(member1); GameMember member3 = newGameMembers.OrderByDescending(m => m.BatterAbility).First(); newGameMembers.Remove(member3); GameMember member2 = newGameMembers.OrderByDescending(m => m.Meet + m.Wisdom).First(); newGameMembers.Remove(member2); GameMember member5 = newGameMembers.OrderByDescending(m => m.BatterAbility).First(); newGameMembers.Remove(member5); GameMember member6 = newGameMembers.OrderByDescending(m => m.BatterAbility).First(); newGameMembers.Remove(member6); GameMember member7 = newGameMembers.OrderByDescending(m => m.BatterAbility).First(); newGameMembers.Remove(member7); GameMember member8 = newGameMembers.OrderByDescending(m => m.BatterAbility).First(); newGameMembers.Remove(member8); // 一番から打順の順番で追加し直す newGameMembers.Add(member1); newGameMembers.Add(member2); newGameMembers.Add(member3); newGameMembers.Add(member4); newGameMembers.Add(member5); newGameMembers.Add(member6); newGameMembers.Add(member7); newGameMembers.Add(member8); newGameMembers.Add(member9); // 控えとベンチ外メンバの設定 while (allPlayers.Count > 0) { // まず控え投手を優先する Player player = allPlayers.Where(m => m.IsPitcher).OrderByDescending(m => m.PitcherAbility.Total).FirstOrDefault(); if (player == null) { // 投手がいなければ、野手総合力の高い順に選定 player = allPlayers.OrderByDescending(m => m.FielderAbility.Total).First(); } GameMember member = new GameMember(player, DefensePosition.Sub); // 控えメンバが埋まるまでは控え、埋まったらベンチ外に追加 if (newGameMembers.Count < Constants.BenchMemberCount) { newGameMembers.Add(member); } else { newOutsideMembers.Add(member); } allPlayers.Remove(player); } // 最後にチーム設定に反映 TeamSetting.DefaultGameMembers = newGameMembers; TeamSetting.DefaultOutSideMembers = newOutsideMembers; // デフォルトのメンバ設定をもとに現在試合メンバ設定に反映 // (間違って現在試合メンバ設定にアクセスしても問題ないように同期させておく) TeamSetting.CreateCurrentMembersFromDefault(); }
/// <summary> /// 複製する(ただしPlayerは複製しない) /// </summary> /// <returns></returns> public GameMember Clone() { GameMember clone = new GameMember(Player, DefensePosition); clone.UseKind = UseKind; clone.OrderNumber = OrderNumber; clone.IsMidway = IsMidway; clone.RemainingStamina = RemainingStamina; clone.ChangedOffense = ChangedOffense; clone.ChangedDefense = ChangedDefense; clone.StartInning = StartInning; clone.Visible = Visible; clone.SortOrder = SortOrder; clone.BattingResults = new List<BattingResultKind>(BattingResults); clone.BatCount = BatCount; clone.HitCount = HitCount; clone.TwoBaseHitCount = TwoBaseHitCount; clone.ThreeBaseHitCount = ThreeBaseHitCount; clone.HomeRunCount = HomeRunCount; clone.Ribby = Ribby; clone.FourBollOrDeadBollCount = FourBollOrDeadBollCount; clone.SacrificeCount = SacrificeCount; clone.StrikeOutCount = StrikeOutCount; clone.StealCount = StealCount; clone.AssistOutCount = AssistOutCount; clone.PutOutCount = PutOutCount; clone.ErrorCount = ErrorCount; clone.PitchingResult = PitchingResult.Clone(); return clone; }
/// <summary> /// コントロールを試合のデータに合わせて更新 /// </summary> private void UpdateControlInternal() { // 投手の更新 if (!GameData.CurrentPitcher.Player.IsLeftThrow) { RightPicher.Source = UIUtility.GetPlayerImage(GameData.GetDefenseMember(DefensePosition.Pitcher).Player.BreedType); LeftPicher.Source = null; } else { RightPicher.Source = null; LeftPicher.Source = UIUtility.GetPlayerImage(GameData.GetDefenseMember(DefensePosition.Pitcher).Player.BreedType); } // 捕手の更新 Catcher.Source = UIUtility.GetPlayerImage(GameData.GetDefenseMember(DefensePosition.Catcher).Player.BreedType); // (アニメーション後になぜかCanvas.SetXXXで位置更新できないためアニメーションメソッドで位置更新) //Catcher.SetCanvasPoint(CatcherPoint); UIUtility.MoveControlInCanvas(CatcherPoint, Catcher, TimeSpan.Zero, TimeSpan.Zero, true); // 打者の更新 if (!GameData.CurrentBatter.Player.IsLeftBox) { RightBatter.Source = UIUtility.GetPlayerImage(GameData.CurrentBatter.Player.BreedType); LeftBatter.Source = null; } else { RightBatter.Source = null; LeftBatter.Source = UIUtility.GetPlayerImage(GameData.CurrentBatter.Player.BreedType); } // 打者ステータス表示 string orderString = string.Format("{0}番 {1}", GameData.CurrentBattingOrder, GameData.CurrentBatter.DefensePositionName); BattingOrder.Text = orderString; BatterAbility.DataContext = GameData.CurrentBatter; BatterOffset.Text = GameData.CurrentBatter.GetCurrentBatterOffsetInfo(GameData); // 投手ステータス表示(防御率などの成績更新するためにいったんnullを入れて強制更新させる) PitcherAbility.DataContext = null; PitcherAbility.DataContext = GameData.CurrentPitcher; PitcherOffset.Text = GameData.CurrentPitcher.GetCurrentPitcherOffsetInfo(GameData); // イニング情報 InningInfo.Text = GameData.CurrentInningInfo; // どちらが攻撃中か if (GameData.IsCurrentInningTop) { Canvas.SetTop(TopOrBottom, 74); } else { Canvas.SetTop(TopOrBottom, 110); } // ランナー情報 if (GameData.FirstRunnerMember != null) { FirstRunner.Fill = s_RunnerBruch; } else { FirstRunner.Fill = s_NoRunnerBruch; } if (GameData.SecondRunnerMember != null) { SecondRunner.Fill = s_RunnerBruch; } else { SecondRunner.Fill = s_NoRunnerBruch; } if (GameData.ThirdRunnerMember != null) { ThirdRunner.Fill = s_RunnerBruch; } else { ThirdRunner.Fill = s_NoRunnerBruch; } // スコア情報 TopTeamScore.Text = GameData.TopTeamRunScore.ToString(); BottomTeamScore.Text = GameData.BottomTeamRunScore.ToString(); // カウント情報 StrikeCount.Text = GameData.StrikeCount.ToString(); BollCount.Text = GameData.BallCount.ToString(); OutCount.Text = GameData.OutCount.ToString(); // ボール位置 // (アニメーション後になぜかCanvas.SetXXXで位置更新できないためアニメーションメソッドで位置更新) if (!GameData.CurrentPitcher.Player.IsLeftThrow) { //Boll.SetCanvasPoint(BallInitialPointForRight); UIUtility.MoveControlInCanvas(BallInitialPointForRight, Boll, TimeSpan.Zero, TimeSpan.Zero, true); } else { //Boll.SetCanvasPoint(BallInitialPointForLeft); UIUtility.MoveControlInCanvas(BallInitialPointForLeft, Boll, TimeSpan.Zero, TimeSpan.Zero, true); } // 作戦がクリアされている場合は、作戦グリッドを再表示 if (m_GameManager.NeedSettingMission) { if (GameData.UserTeamOffenseOrDefense) { // 攻撃時 BatterMissionGrid.Visibility = Visibility.Visible; PitcherMissionGrid.Visibility = Visibility.Collapsed; // 盗塁ボタンの有効/無効の切り替え StealButton.IsEnabled = (GameData.ThirdRunnerMember == null && GameData.SecondRunnerMember != null) || (GameData.SecondRunnerMember == null && GameData.FirstRunnerMember != null); // 盗塁ボタンの表示切り替え if (StealButton.IsEnabled) { string stealContent = RunnerTactics.GetSetalJudgeString(GameData); StealButton.Content = string.Format("盗塁{0}", stealContent); } else { StealButton.Content = "盗塁"; } // 送りバントボタンの表示切り替え BuntButton.IsEnabled = GameData.CanBunt; // スクイズボタンの表示/非表示の切り替え SqueezeButton.Visibility = (GameData.ThirdRunnerMember != null && GameData.OutCount < 2) ? Visibility.Visible : Visibility.Collapsed; // エンドランボタンの表示切り替え EndRunButton.IsEnabled = GameData.AllRunnerMembers.Count > 0; // 打者が更新されても狙い球のチェック状態は維持する //if (GameData.CurrentBatter != m_PreviousBatter) //{ // m_PreviousBatter = GameData.CurrentBatter; // TargetSweetCourse.IsChecked = false; // TargetFastBoll.IsChecked = false; // TargetBreakingBoll.IsChecked = false; //} // 投手が変更された場合は狙い球のチェック状態はクリアする if (GameData.CurrentPitcher != m_PreviousPitcher) { m_PreviousPitcher = GameData.CurrentPitcher; TargetSweetCourse.IsChecked = false; TargetFastBoll.IsChecked = false; TargetBreakingBoll.IsChecked = false; } } else { // 守備時 BatterMissionGrid.Visibility = Visibility.Collapsed; PitcherMissionGrid.Visibility = Visibility.Visible; // 打者が更新された場合は守備シフトの設定を解除する if (GameData.CurrentBatter != m_PreviousBatter) { // 前回打者の更新 m_PreviousBatter = GameData.CurrentBatter; // 自動で適切な守備位置を判定させる m_GameManager.UpdateDefenseShift(); // UIのチェック状態をモデルに合わせる m_InFielderPositionUpdating = true; try { OutFielderDrawInCheck.IsChecked = m_GameManager.GameData.OutFielderDrawIn; InFielderDrawInCheck.IsChecked = m_GameManager.GameData.InFielderDrawIn && !m_GameManager.GameData.BuntShift; BuntShiftCheck.IsChecked = m_GameManager.GameData.BuntShift; } finally { m_InFielderPositionUpdating = false; } } } // ボタン情報 ButtonInfo.Text = string.Empty; // 守備シフト情報 UpdateDefenseShiftInfo(); // 共通で表示するコントロールを表示 TimeButton.Visibility = Visibility.Visible; CancelInfo.Visibility = Visibility.Collapsed; StealCheckButton.Visibility = GameData.AllRunnerMembers.Count > 0 ? Visibility.Visible : Visibility.Collapsed; // 途中出場メンバの演出を表示する ShowTextForMidWay(); } }
/// <summary> /// 消滅 /// </summary> public void Dispose() { m_GameManager = null; m_PreviousBatter = null; m_PreviousPitcher = null; }
/// <summary> /// 途中出場メンバの演出を表示する /// </summary> /// <param name="member">対象メンバ</param> /// <param name="kind">選手交代種別)</param> /// <returns>演出表示するか</returns> private bool ShowTextForMidWay(GameMember member, ChangeKind kind) { // すでに演出済みのメンバであれば何もしない if (m_GameManager.CurrentInningMidwayShowMember.Contains(member)) { return false; } // 演出済みのメンバとして登録 m_GameManager.CurrentInningMidwayShowMember.Add(member); // 交代種別文字列の設定 ChangeTextForMidWay.Text = StringEnumAttribute.GetStringValue(kind); // 対象メンバ表示の設定 MemberTextForMidWay.Text = member.Name; MemberImageForMidway.Source = UIUtility.GetPlayerImage(member.Player.BreedType); // アニメ完了直後は元のOpacityに戻るため、アニメ後に非表示になるように0を設定しておく BorderForMidWay.Visibility = Visibility.Visible; BorderForMidWay.Opacity = 0; UIUtility.ShowControl(BorderForMidWay, TimeSpan.Zero, UIConstants.ShowLongTextAnimationSpan, 1, ShowTextForMidWay_Completed); return true; }
/// <summary> /// 指定した塁のランナーメンバを設定する /// </summary> /// <param name="baseKind"></param> /// <param name="member"></param> public void SetRunnerMember(BaseKind baseKind, GameMember member) { int orderNumber = 0; if (member != null) { orderNumber = CurrentAttackTeam.CurrentPlayingMembers.IndexOf(member) + 1; } switch (baseKind) { case BaseKind.FirstBase: FirstRunnerOrderNumber = orderNumber; break; case BaseKind.SecondBase: SecondRunnerOrderNumber = orderNumber; break; case BaseKind.ThirdBase: ThirdRunnerOrderNumber = orderNumber; break; default: throw new Exception("Invalid Kind"); } }
/// <summary> /// 投手結果に暴投を追加 /// </summary> /// <param name="member"></param> public void AddWildPitch(GameMember member) { member.AddWildPitch(); }
/// <summary> /// エラー数の追加 /// </summary> /// <param name="member"></param> public void AddError(GameMember member) { member.AddError(); }
/// <summary> /// 能力コントロールの更新 /// </summary> /// <param name="member">対象メンバ</param> private void UpdateAbilityControl(GameMember member) { // 名前変更時にも更新するように、いったんバインドを外してから再バインドする FielderAbility.DataContext = null; PitcherAbility.DataContext = null; FielderAbility.DataContext = member; PitcherAbility.DataContext = member; // 能力コントロールの表示切り替え if (member != null) { FielderAbility.Visibility = Visibility.Visible; // 野手でも投手能力を表示する PitcherAbility.Visibility = Visibility.Visible; } else { FielderAbility.Visibility = Visibility.Collapsed; PitcherAbility.Visibility = Visibility.Collapsed; } }