Exemple #1
0
        /// <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");
        }
Exemple #2
0
 /// <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);
     }
 }