using System.Text.Json.Serialization; using Milimoe.FunGame.Core.Entity; using Milimoe.FunGame.Core.Library.Constant; namespace Milimoe.FunGame.Core.Model { public class DecisionPoints { /// /// 所用的游戏平衡常数 /// [JsonIgnore] public EquilibriumConstant GameplayEquilibriumConstant { get; set; } = General.GameplayEquilibriumConstant; /// /// 当前决策点 /// public int CurrentDecisionPoints { get; set; } = General.GameplayEquilibriumConstant.InitialDecisionPoints; /// /// 决策点上限 /// public int MaxDecisionPoints { get; set; } = General.GameplayEquilibriumConstant.InitialDecisionPoints; /// /// 每回合决策点补充数量 /// public int RecoverDecisionPointsPerRound { get; set; } = General.GameplayEquilibriumConstant.RecoverDecisionPointsPerRound; /// /// 本回合已补充的决策点 /// public int DecisionPointsRecovery { get; set; } = 0; /// /// 是否释放过勇气指令 /// public bool CourageCommandSkill { get; set; } = false; /// /// 记录本回合已使用的行动类型和次数 /// public Dictionary ActionTypes { get; } = []; /// /// 记录本回合行动的硬直时间 /// public List ActionsHardnessTime { get; } = []; /// /// 本回合已进行的行动次数 /// public int ActionsTaken { get; set; } = 0; // 回合内的临时决策点配额加成 private int _tempActionQuotaNormalAttack = 0; private int _tempActionQuotaSuperSkill = 0; private int _tempActionQuotaSkill = 0; private int _tempActionQuotaItem = 0; private int _tempActionQuotaOther = 0; /// /// 获取当前决策点配额 /// /// /// public int this[CharacterActionType type] { get { return type switch { CharacterActionType.NormalAttack => GameplayEquilibriumConstant.ActionQuotaNormalAttack + _tempActionQuotaNormalAttack, CharacterActionType.CastSuperSkill => GameplayEquilibriumConstant.ActionQuotaSuperSkill + _tempActionQuotaSuperSkill, CharacterActionType.CastSkill => GameplayEquilibriumConstant.ActionQuotaSkill + _tempActionQuotaSkill, CharacterActionType.PreCastSkill => GameplayEquilibriumConstant.ActionQuotaMagic, CharacterActionType.UseItem => GameplayEquilibriumConstant.ActionQuotaItem + _tempActionQuotaItem, _ => GameplayEquilibriumConstant.ActionQuotaOther + _tempActionQuotaOther, }; } } /// /// 添加临时决策点配额 [ 回合结束时清除 ] /// /// /// public void AddTempActionQuota(CharacterActionType type, int add = 1) { switch (type) { case CharacterActionType.NormalAttack: _tempActionQuotaNormalAttack += add; break; case CharacterActionType.CastSkill: _tempActionQuotaSkill += add; break; case CharacterActionType.CastSuperSkill: _tempActionQuotaSuperSkill += add; break; case CharacterActionType.UseItem: _tempActionQuotaItem += add; break; default: _tempActionQuotaOther += add; break; } } /// /// 清除临时决策点配额 /// public void ClearTempActionQuota() { _tempActionQuotaNormalAttack = 0; _tempActionQuotaSuperSkill = 0; _tempActionQuotaSkill = 0; _tempActionQuotaItem = 0; _tempActionQuotaOther = 0; } /// /// 累计行动类型和次数 /// /// /// public void AddActionType(CharacterActionType type, bool addActionTaken = true) { if (addActionTaken) ActionsTaken++; if (!ActionTypes.TryAdd(type, 1)) { ActionTypes[type]++; } } /// /// 判断行动类型是否达到配额 /// /// public bool CheckActionTypeQuota(CharacterActionType type) { if (ActionTypes.TryGetValue(type, out int times)) { return times < this[type]; } return true; } /// /// 获取决策点消耗 /// /// /// /// public int GetActionPointCost(CharacterActionType type, Skill? skill = null) { return type switch { CharacterActionType.NormalAttack => GameplayEquilibriumConstant.DecisionPointsCostNormalAttack, CharacterActionType.PreCastSkill when skill?.SkillType == SkillType.SuperSkill => GameplayEquilibriumConstant.DecisionPointsCostSuperSkill, CharacterActionType.PreCastSkill when skill?.SkillType == SkillType.Skill => GameplayEquilibriumConstant.DecisionPointsCostSkill, CharacterActionType.PreCastSkill when skill?.SkillType == SkillType.Magic => GameplayEquilibriumConstant.DecisionPointsCostMagic, CharacterActionType.UseItem => GameplayEquilibriumConstant.DecisionPointsCostItem, CharacterActionType.CastSuperSkill => GameplayEquilibriumConstant.DecisionPointsCostSuperSkillOutOfTurn, // 回合外使用爆发技 _ => GameplayEquilibriumConstant.DecisionPointsCostOther }; } } }