using UnityEngine; using System.Collections; using System.Collections.Generic; /// /// 选择目标处理 /// public sealed class SkillSelectHelper { public delegate bool CheckFighterCallback (Fighter fighter); public delegate int CompareFighterCallback (Fighter fighter1, Fighter fighter2, Target_Select_Rule rule); public static int CompareFighterByRules(Fighter selfFighter, Fighter fighter1, Fighter fighter2, int selectRule, CompareFighterCallback postComparer = null) { int result = CompareFighterByRule(selfFighter, fighter1, fighter2,(Target_Select_Rule)selectRule); if (result != 0) return result; if (postComparer != null) return postComparer(fighter1, fighter2, (Target_Select_Rule)selectRule); return 0; } public static bool CheckFighter (Fighter selfFighter,Fighter fighter, int selectRule) { if (fighter == null || fighter.IsDisposed || !fighter.IsAlive) return false; Target_Select_Rule rule = (Target_Select_Rule)selectRule; switch (rule) { case Target_Select_Rule.Target_Select_Self: return selfFighter == fighter; default: return true; } } public static int CompareFighterByRule (Fighter selfFighter, Fighter fighter1, Fighter fighter2, Target_Select_Rule rule) { if(rule == Target_Select_Rule.Target_Select_LeastBlood) { if (fighter1.Life < fighter2.Life) return 1; if (fighter1.Life > fighter2.Life) return -1; if (fighter1.MaxLife < fighter2.MaxLife) return 1; if (fighter1.MaxLife > fighter2.MaxLife) return -1; } else if(rule == Target_Select_Rule.Target_Select_MostLife) { if (fighter1.Life > fighter2.Life) return 1; if (fighter1.Life < fighter2.Life) return -1; if (fighter1.MaxLife > fighter2.MaxLife) return 1; if (fighter1.MaxLife < fighter2.MaxLife) return -1; } else if(rule == Target_Select_Rule.Target_Select_Most_NegativeBuff) { if (fighter1.NegativeBuffCnt > fighter2.NegativeBuffCnt) return 1; if (fighter1.NegativeBuffCnt < fighter2.NegativeBuffCnt) return -1; } else if(rule == Target_Select_Rule.Target_Select_Most_LeastLifePercent) { if (fighter1.Life/fighter1.MaxLife < fighter2.Life/fighter2.MaxLife) return 1; if (fighter1.Life / fighter1.MaxLife > fighter2.Life / fighter2.MaxLife) return -1; if (fighter1.Life < fighter2.Life) return 1; if (fighter1.Life > fighter2.Life) return -1; } else { //if (fighter1.IsFront && fighter2.IsBack) return 1; //if (fighter1.IsBack && fighter2.IsFront) return -1; } float d1 = Vector3.SqrMagnitude(selfFighter.Position - fighter1.Position) - (selfFighter.ModelSize + fighter1.ModelSize); float d2 = Vector3.SqrMagnitude(selfFighter.Position - fighter2.Position) - (selfFighter.ModelSize + fighter2.ModelSize); if (Mathf.Abs(d1 - d2) < 0.2f) { if (fighter1.Actor.Profession < fighter2.Actor.Profession) return 1; if (fighter1.Actor.Profession > fighter2.Actor.Profession) return -1; return fighter1.PositionValue < fighter2.PositionValue ? 1 : -1; } else { return d1 < d2 ? 1 : d1 > d2 ? -1 : 0; } } public static Fighter SelectTargetsByRules(Fighter selfFighter, List fighters, Target_Select_Rule rule, CheckFighterCallback preFilter = null, CompareFighterCallback postComparer = null) { if (fighters.Count == 0) return null; int selectRule = (int)rule; Fighter fighter = null; int idx = 0; while (idx < fighters.Count) { Fighter f = fighters[idx]; if (f != null && !f.IsDisposed && f.IsAlive && (preFilter == null || preFilter(f)) && CheckFighter(selfFighter,f, selectRule)) { fighter = f; break; } idx++; } if (fighter == null) return null; for (int i = idx + 1; i < fighters.Count; i++) { Fighter f = fighters[i]; if (f == null || f.IsDisposed) continue; if (preFilter != null && !preFilter(f)) continue; if (!CheckFighter(selfFighter,f, selectRule)) continue; int compare = CompareFighterByRules(selfFighter, fighter, f, selectRule, postComparer); if (compare < 0) fighter = f; } return fighter; } static bool CheckTargetTeam (BaseSkill skill, Fighter caster, Fighter target) { return true; } public static bool IsSkillCanTargetSelf (BaseSkill skill) { return true; } public static bool CheckTargetSelectable (BaseSkill skill, Fighter caster, Fighter target) { return target.IsSpawned && !target.IsDisposed && target.IsAlive && (target.IsFighting) && (IsSkillCanTargetSelf(skill) || target != caster) && CheckTargetTeam(skill, caster, target); } }