using UnityEngine; using System; using System.Collections; using System.Collections.Generic; namespace YLBattle { /// /// 逻辑管理(操作) /// public partial class LogicFighterManager : ILogicFighterOper { /// /// 寻求朋友帮助 /// /// /// public void SetFriendHelp(int seat, bool isShowTip = false) { HeroAdapter friend = this.Env().friend as HeroAdapter; friend.Seat = seat; //占位设置 LogicFighter fighter = new LogicFighter(); ///索引设定为当前己方最大人数+1 int maxindex = this.Env().mLogicFighterOper.FindTeamAllFighter(EBattleTeam.BLUETEAM).Count; string id = (maxindex + 1).ToString(); ///占位为死亡占位 fighter.SetData(id, this.Env(), friend, EBattleTeam.BLUETEAM, seat); this.Env().ShowAdapter().CreatLogicFighter(id, EBattleTeam.BLUETEAM, this.Env().levelMode, friend, true); this.mFighters.Add(fighter.ID(), fighter); this.mFriendFighters.Add(seat, fighter); this.Env().friend = null; //清空好友支援数据 if (isShowTip) { this.Env().ShowAdapter().OnFriendSupportTip(friend.TID()); } //LogHelper.Log("GetFriendHelp...............seat=" + seat + " name=" + friend.FName()); } /// /// 查找指定战斗对象 /// /// 对象唯一编号 /// 目标 public LogicFighter FindFighter(string id) { if (mFighters.ContainsKey(id)) { return mFighters[id]; } return null; } /// /// 获取指定队伍目前存活人员 /// /// 队伍描述 /// 人员列表 public List FindFighter() { List all = new List(); foreach (KeyValuePair kv in this.mFighters) { all.Add(kv.Value); } return all; } /// /// 获取指定队伍目前存活人员 /// /// 队伍描述 /// 人员列表 public List FindAliveFighter() { List all = new List(); foreach (KeyValuePair kv in this.mFighters) { if (kv.Value.IsDead() == true) { continue; } all.Add(kv.Value); } return all; } /// /// 获取指定队伍目前存活人员 /// /// 队伍描述 /// 人员列表 public List FindTeamAliveFighter(EBattleTeam team) { List all = new List(); foreach (KeyValuePair kv in this.mFighters) { if (kv.Value.Team() != team) { continue; } if (kv.Value.IsDead() == true) { continue; } all.Add(kv.Value); } return all; } /// /// 获取指定角色的敌人队伍存活列表 /// /// 参照对象编号 /// 敌方存活角色列表 public List FindEnemyTeam(string id) { LogicFighter who = this.FindFighter(id); EBattleTeam team = who.Team(); return this.FindTeamAliveFighter(team); } /// /// 获取指定角色的友方队伍存活列表 /// /// 参照对象编号 /// 友方存活角色列表,包含自己 public List FindFriendTeam(string id) { LogicFighter who = this.FindFighter(id); EBattleTeam team = who.Team(); return this.FindTeamAliveFighter(team); } /// /// 根据站位查找fighter /// /// 指定占位 /// 所属队列 /// public LogicFighter FindFighterBySeat(int _seat, EBattleTeam team) { LogicFighter target = null; List parter = this.FindTeamAliveFighter(team); foreach (LogicFighter fighter in parter) { if (fighter.Seat() == _seat) { target = fighter; break; } } return target; } /// /// 查找与目标指定关系的对象列表 /// /// 参照对象编号 /// 关系过滤 /// 对象列表 public List FindRelationAliveFighters(string id, EBattleRelation relation) { List result = new List(); LogicFighter who = this.FindFighter(id); if (null == who) { return null; } foreach (KeyValuePair kv in this.mFighters) { if (kv.Value.ID() == id) { continue; } if (kv.Value.IsDead()) { continue; } switch (relation) { case EBattleRelation.EBATTLE_RELATION_NONE: result.Add(kv.Value); break; case EBattleRelation.EBATTLE_RELATION_ENEMY: { if (EBattleRelation.EBATTLE_RELATION_ENEMY == who.Relation(kv.Value)) { result.Add(kv.Value); } } break; case EBattleRelation.EBATTLE_RELATION_FRIEND: { if (EBattleRelation.EBATTLE_RELATION_FRIEND == who.Relation(kv.Value)) { result.Add(kv.Value); } } break; } } return result; } /// /// 获得当前存活的按攻击速度排序的所有人员 /// /// public List FindAliveSortFighter(EBattleTeam _team) { List all = new List(); foreach (KeyValuePair kv in this.mFighters) { if (kv.Value.IsDead() == true) { continue; } if (kv.Value.Team() != _team) { continue; } all.Add(kv.Value); } Reverser reverser = new Reverser(Type.GetType("LogicFighter"), "AttackSpeed", ReverserInfo.Direction.ASC); all.Sort(reverser); return all; } //public List FindAliveFighterByLastAttackTime() //{ // List trgLst = this.FindAliveFighter(); // if (trgLst.Count > 0) // { // foreach (LogicFighter fighter in trgLst) // { // if (sombody == null) // { // sombody = fighter; // continue; // } // int restTime1 = (int)(sombody.AttackSpeed - (this.Env().TimeCenter().Now() - sombody.LastAttackTime)); // int restTime2 = (int)(fighter.AttackSpeed - (this.Env().TimeCenter().Now() - fighter.LastAttackTime)); // if (restTime2 < restTime1) // { // sombody = fighter; // } // } // if (sombody != null && sombody.Team() == EBattleTeam.REDTEAM) // { // sombody.GetState().ChangeState(BaseState.EFighterState.ROTATE, null); // } // } // return trgLst; //} /// /// 获取指定队伍所有人员,不论生死 /// /// 目标队伍 /// 对象列表 public List FindTeamAllFighter(EBattleTeam team) { List all = new List(); foreach (KeyValuePair kv in this.mFighters) { if (kv.Value.Team() == team) { all.Add(kv.Value); } } return all; } /// /// 查找当前地图中间的人 /// /// 己方 /// 敌方角色 public LogicFighter FindCenterEnemy(string whoId, EBattleTeam _team) { #region ---------------------------2017-09-08 修正 //EBattleTeam targetTeam = _team == EBattleTeam.BLUETEAM ? EBattleTeam.REDTEAM : EBattleTeam.BLUETEAM; //int seat = FightingMap.Instance.GetCenterSeat(); //sombody = this.FindFighterBySeat(seat, targetTeam); //if (sombody == null) //{ // List trgLst = FindTeamAliveFighter(targetTeam); // Reverser reverser = new Reverser(System.Type.GetType("LogicFighter"), "AttackSpeed", ReverserInfo.Direction.ASC); // trgLst.Sort(reverser); // if (trgLst.Count > 0) // { // sombody = trgLst[0]; // sombody.GetState().ChangeState(BaseState.EFighterState.ROTATE, null); // } //} #endregion /** * 选取规则 (选择地图中间的人,己方假象也是地图圆盘) * 如果 Blue(Red)CurrentCenterAttacker 为空,则是第一次出手,则攻击占位索引依次为0->4的人(以此类推) * 如果 Blue(Red)CurrentCenterAttacker 不为空,则为上一次出手的角色(当前应该在地图中间位置)如果不为死亡,则选定为目标 * 如果 Blue(Red)CurrentCenterAttacker 不为空,如果死亡,则对敌方队伍按“攻击速度”排序(下一个出手的应该是剩余时间最少的一个人)迭代选择 */ //----是否背叛。。。。。 LogicFighter who = this.FindFighter(whoId); string targetId = _team == EBattleTeam.BLUETEAM ? this.Env().mRedCurrentCenterAttacker : this.Env().mBlueCurrentCenterAttacker; if (targetId != string.Empty) { LogicFighter f = this.FindFighter(targetId); if (f != null && !f.IsDead()) { //Debug.LogError(_team.ToString() + ":[" + who + "] 获取中线目标:" + targetId); return f; } } if (targetId == string.Empty) { LogicFighter sombody = FindFighterBySeat(0, _team == EBattleTeam.BLUETEAM ? EBattleTeam.REDTEAM : EBattleTeam.BLUETEAM); if (sombody != null) { return sombody; } } return this.OnUpdateMapCenterFighter(_team == EBattleTeam.BLUETEAM ? EBattleTeam.REDTEAM : EBattleTeam.BLUETEAM); } /// /// 刷新当前地图中间位置的角色 /// /// 己方队伍 /// 敌方角色 public LogicFighter OnUpdateMapCenterFighter(EBattleTeam _team) { LogicFighter sombody = null; /** * 当前中心位置无角色,已死亡,按攻击速度找到下一个出手的角色,置为中心位置,并地图转向 */ List trgLst = FindTeamAliveFighter(_team); if (trgLst.Count > 0) { foreach (LogicFighter fighter in trgLst) { if (sombody == null) { sombody = fighter; continue; } int restTime1 = (int)(sombody.AttackSpeed - (this.Env().TimeCenter().Now() - sombody.LastAttackTime)); int restTime2 = (int)(fighter.AttackSpeed - (this.Env().TimeCenter().Now() - fighter.LastAttackTime)); if (restTime2 < restTime1) { sombody = fighter; } } if (sombody != null && sombody.Team() == EBattleTeam.REDTEAM) { sombody.GetState().ChangeState(BaseState.EFighterState.ROTATE, null); } } return sombody; } /// /// 禁用指定战斗对象 /// /// 角色编号 public void MarkDeathFighter(string id) { LogicFighter fighter = this.FindFighter(id); if (null == fighter) { return; } this.mDeathFighterss.Add(fighter); } /// /// 从死亡列表中移除指定对象 /// /// 对象id public void RemoveFighterFromDeath(string id) { LogicFighter fighter = null; for (int i = 0; i < this.mDeathFighterss.Count; ++i) { if (this.mDeathFighterss[i].ID() == id) { fighter = this.mDeathFighterss[i]; break; } } if (null != fighter) { this.mDeathFighterss.Remove(fighter); } } /// /// 英雄受到治疗效果 /// /// 目标对象 /// 治疗值 public void OnCureLogicFighter(string who, float cure, float tipdelayTime = 0) { LogicFighter target = this.FindFighter(who); if (null == target) { return; } float cureAdd = 0f; //if (target.GetBuffEffectProperty(EBuffEffect.EBUFF_EFFECT_Cure) > 0) //{ // cureAdd = cure * target.GetBuffEffectProperty(EBuffEffect.EBUFF_EFFECT_Cure) / 100; //} cure = cure + cureAdd; //Debug.Log(who + " cure:" + cure); target.ModifyProperty(EBattleProperty.HP, cure); this.Env().ShowAdapter().BattleTipShowing(who, EBattleTips.EDAMAGE_TIPS_CURE, ((int)cure).ToString()); } /// /// 英雄能量恢复 /// /// 目标对象id /// 能量值 /// 是否需要提示信息 public void OnCurePower(string who, float power, bool isTip = false) { LogicFighter target = this.FindFighter(who); if (null == target) { return; } target.ModifyProperty(EBattleProperty.NPOWER, power); if (isTip) { this.Env().ShowAdapter().BattleTipShowing(who, EBattleTips.EDAMAGE_TIPS_POWERRECOVER, power.ToString()); } } /// /// 英雄受到魔法伤害 /// /// 施法对象ID /// 目标对象id /// 伤害数值 /// 是否暴击 /// 延迟显示 public void OnMagicDamageToBattleFighter(string casterID, string targetID, float damage, bool isCritical = false, float tipdelayTime = 0) { LogicFighter target = this.FindFighter(targetID); LogicFighter caster = this.FindFighter(casterID); if (null == target || true == target.IsDead()) { //LogHelper.LogError("目标死亡 id:" + target.ID()); return; } ///护盾检测【被攻击方】 damage = OnMagicDamageByBuffHandle(caster, target, damage, EBuffEffect.EBUFF_EFFECT_Shield); if (damage == 0) { //Debug.LogError("攻击伤害为零无效"); return; } damage = damage * this.Env().BattleGlobalOper().GetLianJiDamageRate() * 1.0f / 100; //Debug.LogError(targetID + " 伤害 " + damage); target.ModifyProperty(EBattleProperty.HP, damage); #region UI显示信息/动作表现 if (target.GetState().GetCurrentState().Type() == BaseState.EFighterState.IDLE) { target.GetState().ChangeState(BaseState.EFighterState.ONHIT, null); } else { this.Env().ShowAdapter().EnterHitState(target.ID()); } //刷新界面数据 this.Env().ShowAdapter().OnRefreshWindowData(); //伤害提示 if (isCritical) { this.Env().ShowAdapter().BattleTipShowing(targetID, EBattleTips.EDAMAGE_TIPS_CRIT, (Mathf.Abs((int)damage)).ToString(), tipdelayTime); } else { this.Env().ShowAdapter().BattleTipShowing(targetID, EBattleTips.EDAMAGE_TIPS_DAMAGE, (Mathf.Abs((int)damage)).ToString(), tipdelayTime); } // 目标角色处理 if (target.IsDead()) { this.Env().mBattleGlobalOper.OnTriggerPassiveSkill((int)ESkillTrigger.ESkill_TRIGGER_DEAD, string.Empty, casterID, targetID); // 目标对象处理 target.GetState().ChangeState(BaseState.EFighterState.DEAD, null); return; } #endregion } /// /// 攻击行为被(buff)过滤 /// /// /// /// /// private float OnMagicDamageByBuffHandle(LogicFighter caster, LogicFighter target, float damage, EBuffEffect effecttype) { float result = damage; switch (effecttype) { case EBuffEffect.EBUFF_EFFECT_Shield: ///提示用,可抵御的伤害数字 int shieldDefence = target.GetBuffEffectProperty(EBuffEffect.EBUFF_EFFECT_Shield); ///剩余护盾值 int lastShieldDefence = 0; // 伤害百分比加成效果 if (shieldDefence > 0) { int tipDefence = 0; lastShieldDefence = shieldDefence + (int)result; if (lastShieldDefence > 0) { tipDefence = (int)Mathf.Abs(result); result = 0; } else { result = lastShieldDefence; tipDefence = shieldDefence; lastShieldDefence = 0; } LogHelper.LogError(target.ID() + ":护盾效果:抵御" + tipDefence + "点伤害,剩余" + lastShieldDefence); target.SetBuffEffectProperty(EBuffEffect.EBUFF_EFFECT_Shield, lastShieldDefence); this.Env().ShowAdapter().BattleTipShowing(target.ID(), EBattleTips.EDAMAGE_IMMO, tipDefence.ToString()); } if (result == 0) { //LogHelper.LogError(caster.ID() + "-------------" + damage + "---------------------------护盾值剩余" + shieldDefence); } break; } return result; } } }