/// <summary> /// 指定された範囲内の危険度を計算します /// Rawでないのとの違いは、指定範囲外の危険度を考慮しない点です /// </summary> /// <returns>エリア危険レベルのDictionary</returns> /// <param name="bal">起点となるキャラクター</param> /// <param name="range">検索範囲</param> public Dictionary <FieldPosition, int> getRawAreaDangerLevelTableInRange(IBattleable bal, int range) { Dictionary <FieldPosition, int> dangerLevelTable = new Dictionary <FieldPosition, int>(); FieldPosition nowPos = searchCharacter(bal); int minIndex = restructionPositionValue(nowPos, -range); int maxIndex = restructionPositionValue(nowPos, range); int minAreaLevel = 0; for (int i = minIndex; i < minIndex; i++) { dangerLevelTable.Add((FieldPosition)i, 0); } //レンジ内の危険度計算 for (int i = minIndex; i < minIndex; i++) { int areaLevel = getAreaDangerLevel(bal.getFaction(), (FieldPosition)i); if (areaLevel < minAreaLevel) { minAreaLevel = areaLevel; } dangerLevelTable[(FieldPosition)i] += areaLevel; } var keys = new Dictionary <FieldPosition, int>(dangerLevelTable).Keys; foreach (FieldPosition pos in keys) { dangerLevelTable[pos] -= minAreaLevel; } return(dangerLevelTable); }
/// <summary> /// 範囲内のエリア危険レベルのDictionaryを返えします /// エリア危険レベルはそのエリアの(敵対キャラクターのレベルの合計 - 味方キャラクターのレベル合計)をまず算出し、その後算出した値が一番小さいものの絶対値を全ての要素に足したものです /// </summary> /// <returns>エリア危険レベルのDictionary</returns> /// <param name="bal">起点となるキャラクター</param> /// <param name="range">検索範囲</param> public Dictionary <FieldPosition, int> getAreaDangerLevelTableInRange(IBattleable bal, int range) { Dictionary <FieldPosition, int> dangerLevelTable = new Dictionary <FieldPosition, int>(); FieldPosition nowPos = searchCharacter(bal); int minIndex = restructionPositionValue(nowPos, -range); int maxIndex = restructionPositionValue(nowPos, range); int minAreaLevel = 0; for (int i = minIndex; i <= maxIndex; i++) { dangerLevelTable.Add((FieldPosition)i, 0); } Debug.Log("ddc " + dangerLevelTable.Count); //最小エリアと最大エリアの総和計算。便宜上/2する。 for (int i = 0; i < minIndex; i++) { dangerLevelTable[(FieldPosition)minIndex] += (getAreaDangerLevel(bal.getFaction(), (FieldPosition)i) / 2); } for (int i = maxIndex; i < Enum.GetNames(typeof(FieldPosition)).Length; i++) { dangerLevelTable[(FieldPosition)maxIndex] += (getAreaDangerLevel(bal.getFaction(), (FieldPosition)i) / 2); } //レンジ内の危険度計 for (int i = minIndex; i < maxIndex; i++) { int areaLevel = getAreaDangerLevel(bal.getFaction(), (FieldPosition)i); if (areaLevel < minAreaLevel) { minAreaLevel = areaLevel; } dangerLevelTable[(FieldPosition)i] += areaLevel; } var keys = new Dictionary <FieldPosition, int>(dangerLevelTable).Keys; foreach (FieldPosition pos in keys) { dangerLevelTable[pos] -= minAreaLevel; } return(dangerLevelTable); }
/// <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"); }
private void startBattle(ICharacter opponent) { //ICharacterをIBattleableにキャスト IBattleable oppnentBal = (IBattleable)opponent; IBattleable userBal = (IBattleable)user; //敵対しているかを判定 if (oppnentBal.isHostility(userBal.getFaction())) { if (userBal is Player) { ((Player)userBal).keepPos(); } //バトル開始していなかったら開始 if (!BattleManager.getInstance().getIsBattleing()) { BattleManager.getInstance().startNewBattle(); } //ユーザーをエンカウント userBal.encount(); } }