/// <summary> /// リアクションを決定します /// </summary> /// <returns>決定したリアクションスキル</returns> /// <param name="attacker">攻撃者</param> /// <param name="skill">攻撃されるスキル</param> public ReactionSkill decideReaction(IBattleable attacker, AttackSkill skill) { Dictionary <ReactionSkillType, float> riskTable = new Dictionary <ReactionSkillType, float>(); //ダメージからのリスク:攻撃側の攻撃力/現在HP int atk = skill.getAtkWithoutProgress(attacker); atk = (atk > 0) ? atk : 1; int hp = user.getHp(); hp = (hp > 0) ? hp : 1; float dodgeDammageRisk = atk / hp; //命中からのリスク:命中値/回避値 - 1 float dodgeHitRisk = (skill.getHit(attacker)) / (user.getDodge() + reactionSkills.getReactionSkillFromCategory(ReactionSkillType.DODGE).getDodge()) - 1; //回避合計リスク float dodgeRisk = dodgeHitRisk + dodgeDammageRisk; if (dodgeRisk != 0) { dodgeRisk /= 2; } riskTable.Add(ReactionSkillType.DODGE, dodgeRisk); //攻撃を受けるリスク int sumHpGuard = user.getHp() + user.getDef(); sumHpGuard = (sumHpGuard > 0) ? sumHpGuard : 1; float guardRisk = atk / sumHpGuard; riskTable.Add(ReactionSkillType.GUARD, guardRisk); //乱数判定 float random = UnityEngine.Random.Range(0, dodgeRisk + guardRisk); var keys = riskTable.Keys; foreach (ReactionSkillType category in keys) { if (riskTable[category] >= random) { return(reactionSkills.getReactionSkillFromCategory(category)); } else { random -= riskTable[category]; } } throw new InvalidOperationException("invalid state"); }
/// <summary> /// userにリアクションを起こさせます /// </summary> /// <param name="user">リアクションを起こさせるIBattleable</param> /// <param name="attack">攻撃を試みるスキルの攻撃値</param> /// <param name="hit">攻撃を試みるスキルの命中値</param> /// <param name="attribute">攻撃を試みるスキルの属性</param> public void reaction(IBattleable user, int attack, int hit, AttackSkillAttribute attribute) { if (this.CATEGORY == ReactionSkillType.DODGE) { //命中判定 if (hit > user.getDodge() + DODGE) { //ダメージ処理 user.dammage(attack, attribute); } } else if (this.CATEGORY == ReactionSkillType.GUARD) { int def = user.getDef() + DEF; int dammage = attack - def; dammage = (dammage >= 0) ? dammage : 0; user.dammage(dammage, attribute); } else if (this.CATEGORY == ReactionSkillType.MISS) { user.dammage(attack, attribute); } }