using System; using System.Collections.Generic; using System.Linq; using Org.BouncyCastle.Ocsp; using ProtoCSStruct; using Sog; namespace Battle { public static class BattleHeroSvc { public static bool CheckIsFriend(BattleHero heroA, BattleHero heroB) { //自己是自己的友方 if (heroA.objId == heroB.objId) { return true; } ////公共敌人没有友方 //if (heroA.fightSide == (int)BattleSide.AllEnemy) //{ // return false; //} return heroA.fightSide == heroB.fightSide; } public static List GetHeroBySide(BattleObj battle, BattleSide side) { return GetHeroBySideUnsafe(battle, side); } // 直接返回List, 任何增删改都会改变英雄列表, 后果自负 public static List GetHeroBySideUnsafe(BattleObj battle, BattleSide side) { if (side == BattleSide.SideA) return battle.herosA; if (side == BattleSide.SideB) return battle.herosB; //if (side == (int)BattleSide.AllEnemy) // return battle.pubEnemy; return null; } // 返回只读的IEnumerable相对安全一些 /*public static List GetFriend(BattleObj battle, BattleHero self) { return AIHeroTargetSelect.HeroSelectNearHero(self, false, false, true); }*/ public static List GetAliveFriend(BattleObj battle, BattleHero self) { var friends = GetHeroBySideUnsafe(battle, self.initSide); return friends.Where(h => ! h.isDead).ToList(); } public static List GetAliveFriendNoSelf(BattleObj battle, BattleHero self) { var friends = GetHeroBySideUnsafe(battle, self.initSide); return friends.Where(h => (!h.isDead && h.objId != self.objId)).ToList(); } /*public static List GetEnemy(BattleObj battle, BattleHero self) { return AIHeroTargetSelect.HeroSelectNearHero(self, true, false); }*/ public static BattleSide GetEnemySide(BattleHero self) { return self.initSide == BattleSide.SideA ? BattleSide.SideB : BattleSide.SideA; } public static List GetAliveEnemy(BattleObj battle, BattleHero self) { var enemy = GetHeroBySideUnsafe(battle, GetEnemySide(self)); return enemy.Where(h => !h.isDead).ToList(); } public static BattleHero GetCommander(BattleObj battle, BattleHero self) { return null; } public static List GetHeroByDescId(BattleObj battle, int descId) { return battle.allCreatures.Where(h => !h.isDead && h.DescId == descId).ToList(); } public static bool IsHeroAllDead(BattleObj battle, BattleSide side) { foreach (var hero in GetHeroBySide(battle, side)) { if (! hero.isDead) { return false; } } return true; } public static BattleHero GetAliveBoss(BattleObj battle, BattleSide side) { foreach (var hero in GetHeroBySide(battle, side)) { if (hero.isBoss && hero.isDead == false) { return hero; } } return null; } // attackId不是caster.objId。例如A放闪电链顺序打到B、C、D // 此时caster永远是A,但是对B而言attackId是A,对C而言attackId是B,对D而言attackId是C // 表现层需要attackId来指示技能方向 public static void RemoveHero(BattleHero hero, HeroDieReson dieReson) { if (hero.isDead) { return; } } public static ref HeroInfo GetHeroByBattleHero(BattleObj battle, BattleHero target) { ref HeroInfo _hero = ref battle.battleInfo.HerosA.List[0]; var tobjId = target.objId; if(target.heroType == HeroType.Pet) { tobjId = target.masterObjId; } if (target.initSide == BattleSide.SideA) { // BattleHero 里没有HeroInfo 只能遍历了 后续添加了serialNum 就把descId换成serialNum 现在直接在战斗构造battlerhero时把objId存到serialNum for (int i = 1; i < battle.battleInfo.HerosA.List.Count; i++) { if (battle.battleInfo.HerosA.List[i].Dbhero.SerialNum == tobjId) { return ref battle.battleInfo.HerosA.List[i]; } } } if (target.initSide == BattleSide.SideB) { for (int i = 0; i < battle.battleInfo.HerosB.List.Count; i++) { if (battle.battleInfo.HerosB.List[i].Dbhero.SerialNum == tobjId) { return ref battle.battleInfo.HerosB.List[i]; } } } return ref _hero; } //public static List GetActionHero(BattleObj battle) //{ // return battle.allCreatures.Where(h => !h.isDead) // .OrderByDescending(h => h.prop.GetValueNoCheck(CSPropIDType.Speed)) // .ToList(); //} public static BattleHero GetAttackTarget(BattleObj battle, BattleHero caster) { var enemy = BattleHeroSvc.GetHeroBySideUnsafe(battle, BattleHeroSvc.GetEnemySide(caster)); BattleHero target = null; foreach (BattleHero hero in enemy) { if (!hero.isDead && (target == null || hero.pos < target.pos)) { target = hero; } } return target; } //获取敌方倒数第x名敌人 public static BattleHero GetAttackBackTarget(BattleObj battle, BattleHero caster, int backIdx) { var enemy = BattleHeroSvc.GetHeroBySideUnsafe(battle, BattleHeroSvc.GetEnemySide(caster)).Where(h => !h.isDead).OrderByDescending(h => h.pos).ToList(); BattleHero target = null; for (int i = 0; i < enemy.Count; i++) { if (backIdx > 0) { target = enemy[i]; backIdx--; } } return target; } //获取英雄主人 public static BattleHero GetAliveMasterHero(BattleObj battle, BattleSide side, int masterObjId) { var heroList = GetHeroBySideUnsafe(battle, side).Where(h => !h.isDead && h.objId == masterObjId).ToList(); if (heroList.Count > 0) return heroList[0]; return null; } public static BattleHero GetAliveMate(BattleObj battle, BattleSide side) { var heroList = GetHeroBySideUnsafe(battle, side).Where(h => !h.isDead && h.heroType == HeroType.Pet).ToList(); if (heroList.Count > 0) return heroList[0]; return null; } public static BattleHero GetAliveHeroByObjId(BattleObj battle, int objId) { var heroList = battle.allCreatures.Where(h => !h.isDead && h.objId == objId).ToList(); if (heroList.Count > 0) return heroList[0]; return null; } } }