/// <summary> /// 練習ごとの経験値 /// </summary> /// <param name="kind">練習種別</param> /// <returns>経験値</returns> public int this[PracticeKind kind] { get { if (!Exp.ContainsKey(kind)) { // キーがなければ0を返す return 0; } return Exp[kind]; } set { Exp[kind] = value; } }
/// <summary> /// 投手用の練習か /// </summary> /// <param name="kind">練習種別</param> /// <returns>投手用の練習か</returns> public static bool IsPitcherPractice(PracticeKind kind) { return kind >= PracticeKind.Fastball && kind <= PracticeKind.Stamina; }
/// <summary> /// 練習が守備適正変更の練習か /// </summary> /// <param name="kind">練習種別</param> /// <returns>守備変更か</returns> private static bool IsChangeDefensePractice(PracticeKind kind) { return kind >= PracticeKind.ChangeCatcher && kind <= PracticeKind.ChangePitcher; }
/// <summary> /// 経験値を加算する /// </summary> /// <param name="kind">練習種別</param> /// <param name="addExp">加算する経験値</param> /// <param name="message">レベルアップメッセージ(なければnullを返す)</param> /// <returns>レベルアップしたか</returns> private bool AddExp(PracticeKind kind, int addExp, out string message) { // EXPを加算できるか判定 if (!CanAddExp(kind)) { // 加算できない場合は「おまかせ」に変更 kind = PracticeKind.Random; } // 「おまかせ」の場合は種別を変換 if (kind == PracticeKind.Random) { kind = GetRandamPraciceKind(); } // 投手練習の場合は、項目が4つしかないため、そのまま加算すると野手能力に比べて成長し過ぎるため // 減算の補正をする if (PracticeKindHelper.IsPitcherPractice(kind)) { addExp = (int)Math.Round((double)addExp * 8 / 10); } // 経験値の加算 PracticeExp[kind] += addExp; // 守備位置変更の場合、1ヶ月分のメイン練習でレベルアップする if (IsChangeDefensePractice(kind) && PracticeExp[kind] >= EventConstants.MainPracticeExp) { PracticeExp[kind] = EventConstants.ExpByLevelUp; } // レベルアップしない場合は終了 if (PracticeExp[kind] < EventConstants.ExpByLevelUp) { message = null; return false; } // 以下、レベルアップした場合 #region 能力アップ // 能力をアップ int abilityValue = 0; switch (kind) { case PracticeKind.Meet: FielderAbility.Meet++; abilityValue = FielderAbility.Meet; break; case PracticeKind.Power: FielderAbility.Power++; abilityValue = FielderAbility.Power; break; case PracticeKind.Run: FielderAbility.Run++; abilityValue = FielderAbility.Run; break; case PracticeKind.Defense: FielderAbility.Defense++; abilityValue = FielderAbility.Defense; break; case PracticeKind.Wisdom: FielderAbility.Wisdom++; abilityValue = FielderAbility.Wisdom; break; case PracticeKind.Fastball: PitcherAbility.Fastball++; abilityValue = PitcherAbility.Fastball; break; case PracticeKind.Breakingball: PitcherAbility.Breakingball++; abilityValue = PitcherAbility.Breakingball; break; case PracticeKind.Control: PitcherAbility.Control++; abilityValue = PitcherAbility.Control; break; case PracticeKind.Stamina: PitcherAbility.Stamina++; abilityValue = PitcherAbility.Stamina; break; case PracticeKind.ChangeCatcher: // 守備適正の変更(守備変更時は守備力がダウンする) UpdateSpecialAbilityFromPitcherToFielder(); FielderAbility.DefenseType = DefenseType.Catcher; if (FielderAbility.Defense > 0) FielderAbility.Defense -= 1; break; case PracticeKind.ChangeFirst: // 守備適正の変更(守備変更時は守備力がダウンする) UpdateSpecialAbilityFromPitcherToFielder(); FielderAbility.DefenseType = DefenseType.First; if (FielderAbility.Defense > 0) FielderAbility.Defense -= 1; break; case PracticeKind.ChangeSecond: // 守備適正の変更(守備変更時は守備力がダウンする) UpdateSpecialAbilityFromPitcherToFielder(); FielderAbility.DefenseType = DefenseType.Second; if (FielderAbility.Defense > 0) FielderAbility.Defense -= 1; break; case PracticeKind.ChangeThird: // 守備適正の変更(守備変更時は守備力がダウンする) UpdateSpecialAbilityFromPitcherToFielder(); FielderAbility.DefenseType = DefenseType.Third; if (FielderAbility.Defense > 0) FielderAbility.Defense -= 1; break; case PracticeKind.ChangeShort: // 守備適正の変更(守備変更時は守備力がダウンする) UpdateSpecialAbilityFromPitcherToFielder(); FielderAbility.DefenseType = DefenseType.Short; if (FielderAbility.Defense > 0) FielderAbility.Defense -= 1; break; case PracticeKind.ChangeLeft: // 守備適正の変更(守備変更時は守備力がダウンする) UpdateSpecialAbilityFromPitcherToFielder(); FielderAbility.DefenseType = DefenseType.Left; if (FielderAbility.Defense > 0) FielderAbility.Defense -= 1; break; case PracticeKind.ChangeCenter: // 守備適正の変更(守備変更時は守備力がダウンする) UpdateSpecialAbilityFromPitcherToFielder(); FielderAbility.DefenseType = DefenseType.Center; if (FielderAbility.Defense > 0) FielderAbility.Defense -= 1; break; case PracticeKind.ChangeRight: // 守備適正の変更(守備変更時は守備力がダウンする) UpdateSpecialAbilityFromPitcherToFielder(); FielderAbility.DefenseType = DefenseType.Right; if (FielderAbility.Defense > 0) FielderAbility.Defense -= 1; break; case PracticeKind.ChangePitcher: // 投手へのコンバート(守備変更時は守備力がダウンする) FielderAbility.DefenseType = DefenseType.Pitcher; if (FielderAbility.Defense > 0) FielderAbility.Defense -= 1; // 野手→投手へのコンバート時は、野手の特殊能力がなくなり、投手の特殊能力を追加する FielderAbility.SpecialFilederAbility = SpecialFilederAbility.Nothing; PitcherAbility.SpecialPitcherAbility = (SpecialPitcherAbility)RandomCreater.GetRandomValue( (int)SpecialPitcherAbility.Nothing + 1, (int)SpecialPitcherAbility.Invalid - 1); break; default: throw new Exception("Invalid PracticeKind"); } #endregion #region EXP減算 // EXPを減算 PracticeExp[kind] -= EventConstants.ExpByLevelUp; if (!CanAddExp(kind)) { // 能力最大に達した場合、経験値をマイナスにしておく(ランダム向上時に選定されないようにするため) PracticeExp[kind] = -EventConstants.ExpByLevelUp; } #endregion #region メッセージ作成 // 野手の場合は投手能力がアップしてもメッセージを生成しない(コンバートしない限り表示されない能力のため) if (FielderAbility.DefenseType != DefenseType.Pitcher && kind >= PracticeKind.Fastball && kind <= PracticeKind.Stamina) { message = null; return true; } // 守備変更時のメッセージ文字列 if (IsChangeDefensePractice(kind)) { message = string.Format("{0} {1} が {2} に変更。守備力が {3} から {4} にダウン!", GradeString, Name, FielderAbility.DefenseTypeString, FielderAbility.Defense + 1, FielderAbility.Defense); return true; } // 通常練習のメッセージ文字列 string abilityName = StringEnumAttribute.GetStringValue(kind); message = string.Format("{0} {5} {1} の {2} が {3} から {4} にアップ!", GradeString, Name, abilityName, abilityValue - 1, abilityValue, FielderAbility.DefenseTypeString); return true; #endregion }
/// <summary> /// 練習によりExpを加算できるか(能力が最大に達していないか) /// </summary> /// <param name="kind"></param> /// <returns></returns> private bool CanAddExp(PracticeKind kind) { // 天才とオールGの場合は、能力値に上限がない if (InitialAbility == InitialAbility.D || InitialAbility == InitialAbility.G) { return true; } // 最大に達していなければtrue、最大に達していればtrueを返す switch (kind) { case PracticeKind.Meet: return FielderAbility.Meet < Constants.MaxDisplayAbilityValueByPractice; case PracticeKind.Power: return FielderAbility.Power < Constants.MaxDisplayAbilityValueByPractice; case PracticeKind.Run: return FielderAbility.Run < Constants.MaxDisplayAbilityValueByPractice; case PracticeKind.Defense: return FielderAbility.Defense < Constants.MaxDisplayAbilityValueByPractice; case PracticeKind.Wisdom: return FielderAbility.Wisdom < Constants.MaxDisplayAbilityValueByPractice; case PracticeKind.Fastball: return PitcherAbility.Fastball < Constants.MaxDisplayAbilityValueByPractice; case PracticeKind.Breakingball: return PitcherAbility.Breakingball < Constants.MaxDisplayAbilityValueByPractice; case PracticeKind.Control: return PitcherAbility.Control < Constants.MaxDisplayAbilityValueByPractice; case PracticeKind.Stamina: return PitcherAbility.Stamina < Constants.MaxDisplayAbilityValueByPractice; default: // それ以外の練習は加算可能としてtrueを返す return true; } }