// Update is called once per frame void Update() { if (user != null) { hpBar.fillAmount = (float)user.getHp() / (float)user.getMaxHp(); hpValue.text = user.getHp() + " / " + user.getMaxHp(); mpBar.fillAmount = (float)user.getMp() / (float)user.getMaxMp(); mpValue.text = user.getMp() + " / " + user.getMaxMp(); } }
/// <summary> /// 与えられたAffectSkillが、その使用者によって対象に使用できるかを判定します /// </summary> /// <returns><c>true</c>, 使用可能, <c>false</c> 使用不可</returns> /// <param name="actioner">スキル使用者</param> /// <param name="targets">スキル対象</param> /// <param name="skill">使用するスキル AffectSkillである必要があります</param> public static bool canUseAffectSkill(IBattleable actioner, List <IBattleable> targets, IActiveSkill skill) { if (!isAffectSkill(skill)) { throw new ArgumentException("gave skill isn't an affectSkill"); } //スキル使用者のMPが足りるか if (actioner.getMp() < skill.getCost()) { return(false); } //スキル使用対象はちゃんと存在するか if (targets.Count <= 0) { return(false); } //スキル使用対象まで射程が届くか int actionerPos = (int)BattleManager.getInstance().searchCharacter(actioner); int targetPos = (int)BattleManager.getInstance().searchCharacter(targets[0]); int distance = (actionerPos < targetPos) ? targetPos - actionerPos : actionerPos - targetPos; if (distance > searchRange(skill, actioner)) { return(false); } //以上が満たされればtrue return(true); }
public void action(IBattleable actioner, BattleTask task) { //MPが足りないと終わり if (actioner.getMp() < this.COST) { return; } move(actioner, task.getMove()); actioner.minusMp(this.COST); }
public IActiveSkill decideSkill() { //ボーナス値のテーブルです。最終的に足されます。 Dictionary <ActiveSkillCategory, int> probalityBonus = new Dictionary <ActiveSkillCategory, int>() { { ActiveSkillCategory.NORMAL, 0 }, { ActiveSkillCategory.CAUTION, 0 }, { ActiveSkillCategory.DANGER, 0 }, { ActiveSkillCategory.POWER, 0 }, { ActiveSkillCategory.FULL_POWER, 0 }, { ActiveSkillCategory.SUPPORT, 0 }, { ActiveSkillCategory.HEAL, 0 }, { ActiveSkillCategory.MOVE, 0 } }; //div0を防ぐための処理 int maxMp = (user.getMaxMp() > 0) ? user.getMaxMp() : 1; //HPが50%以下の場合、caution可能性値を+20します if (this.user.getHp() / maxMp <= 0.5f) { probalityBonus[ActiveSkillCategory.CAUTION] += 20; } //HPが20%以下の場合、danger可能性値を+30します if (this.user.getHp() / maxMp <= 0.2f) { probalityBonus[ActiveSkillCategory.DANGER] += 30; } //HPが70%以下の場合、攻撃する可能性値を-5、移動する可能性を+10します if (this.user.getHp() / maxMp <= 0.7f) { probalityBonus[ActiveSkillCategory.NORMAL] -= 5; probalityBonus[ActiveSkillCategory.POWER] -= 5; probalityBonus[ActiveSkillCategory.FULL_POWER] -= 5; probalityBonus[ActiveSkillCategory.MOVE] += 10; } List <ActiveSkillCategory> categories = new List <ActiveSkillCategory>(probalityBonus.Keys); //スキルの射程内に何もいない、またはコスト外の時、ボーナス値を使って可能性値を0にします。 foreach (ActiveSkillCategory category in categories) { IActiveSkill categorySkill = activeSkills.getSkillFromSkillCategory(category); if (!ActiveSkillSupporter.isAffectSkill(categorySkill)) { continue; } int range = ActiveSkillSupporter.searchRange(categorySkill, user); bool isInRange = BattleManager.getInstance().sumFromAreaTo(user, range) > 0; bool canUse = categorySkill.getCost() <= user.getMp(); if (!isInRange || !canUse) { probalityBonus[category] = -1 * probalityTable[category]; } } //基礎値 + ボーナス値が負の値の場合、可能性値が0になるように設定し直します foreach (ActiveSkillCategory category in categories) { if (probalityTable[category] + probalityBonus[category] < 0) { probalityBonus[category] = -1 * probalityTable[category];; } } //可能性値を合計します int sum = 0; foreach (ActiveSkillCategory category in categories) { sum += probalityTable[category] + probalityBonus[category]; } //合計が0の場合、攻撃不可と判断して移動します if (sum <= 0) { return(activeSkills.getSkillFromSkillCategory(ActiveSkillCategory.MOVE)); } //乱数でスキルを選択します int choose = UnityEngine.Random.Range(0, sum); foreach (ActiveSkillCategory category in categories) { int probality = probalityTable[category] + probalityBonus[category]; if (choose < probality) { return(activeSkills.getSkillFromSkillCategory(category)); } choose -= probalityTable[category] + probalityBonus[category]; } throw new InvalidOperationException("exception state"); }