Пример #1
0
        private FieldPosition decideAreaHealTarget(HealSkill useSkill)
        {
            //keyのposにいる友好的なキャラクターのリスト
            Dictionary <FieldPosition, List <IBattleable> > posCharacters = new Dictionary <FieldPosition, List <IBattleable> >();
            //keyのposの可能性値
            Dictionary <FieldPosition, float> posProbalities = new Dictionary <FieldPosition, float>();
            //可能性値の合計
            int fieldPosMax = Enum.GetNames(typeof(FieldPosition)).Length;
            //現在のpos
            FieldPosition nowPos = BattleManager.getInstance().searchCharacter(user);

            //ループ変数の設定
            int index = BattleManager.getInstance().restructionPositionValue(nowPos, -1 * useSkill.getRange());

            int maxIndex = BattleManager.getInstance().restructionPositionValue(nowPos, useSkill.getRange());

            //2つのdictionaryの設定
            float probalitySum = 0;

            for (; index < maxIndex; index++)
            {
                //範囲にいるキャラクターの取得
                var   targets          = BattleManager.getInstance().getAreaCharacter((FieldPosition)index);
                float areaProbalitySum = 0;

                //リストの初期化
                posCharacters.Add((FieldPosition)index, new List <IBattleable>());
                int hpSum    = 0;
                int maxHpSum = 0;
                //友好的なキャラクターを検索してdictionaryに追加
                foreach (IBattleable target in targets)
                {
                    if (!target.isHostility(user.getFaction()))
                    {
                        hpSum    += target.getHp();
                        maxHpSum += target.getMaxHp();
                        posCharacters[(FieldPosition)index].Add(target);
                    }
                }
                //HPが減っている割合を計算→可能性値にする
                areaProbalitySum = 1 - ((float)hpSum / (float)maxHpSum);
                posProbalities.Add((FieldPosition)index, areaProbalitySum);
                probalitySum += areaProbalitySum;
            }

            //乱数判定
            float rand  = UnityEngine.Random.Range(0, probalitySum);
            var   poses = posCharacters.Keys;

            foreach (FieldPosition pos in poses)
            {
                if (posProbalities[pos] > rand)
                {
                    return(pos);
                }
                else
                {
                    rand += posProbalities[pos];
                }
            }

            throw new InvalidOperationException("cannot decide HealAreaCharacter");
        }
Пример #2
0
        /// <summary>
        /// スキル効果範囲(Extent)がSINGLEの場合の対象を決定します
        /// </summary>
        /// <returns>対象のリスト</returns>
        /// <param name="useSkill">使用するスキル</param>
        private IBattleable decideHealSingleTarget(HealSkill useSkill)
        {
            //keyに可能性値、要素に対象をもつdictionary
            Dictionary <float, IBattleable> characterAndProbalities = new Dictionary <float, IBattleable>();
            float sumProbality = 0;

            List <IBattleable> targets = BattleManager.getInstance().getCharacterInRange(user, useSkill.getRange());

            foreach (IBattleable target in targets)
            {
                //敵対勢力→論外
                if (!target.isHostility(user.getFaction()))
                {
                    //HPの減った割合が可能性値
                    float probality = 1 - ((float)target.getHp() / (float)target.getMaxHp());
                    probality = (probality <= 0) ? 0.001f : probality;
                    characterAndProbalities.Add(probality, target);
                    sumProbality += probality;
                }
            }

            //乱数判定
            float rand        = UnityEngine.Random.Range(0, sumProbality);
            var   probalities = characterAndProbalities.Keys;

            foreach (float probality in probalities)
            {
                if (probality >= rand)
                {
                    return(characterAndProbalities[probality]);
                }
                else
                {
                    rand -= probality;
                }
            }
            throw new InvalidOperationException("cannot decideHealTarget");
        }