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"); }
/// <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"); }