private FormationAI.BehaviorSide DetermineGatheringSide() { this.DetermineMostImportantInvadingEnemyFormation(); if (this._targetEnemyFormation == null) { if (this._behaviourState == BehaviorEliminateEnemyInsideCastle.BehaviourState.Attacking) { this._behaviourState = BehaviorEliminateEnemyInsideCastle.BehaviourState.UnSet; } return(this.behaviorSide); } int connectedSides = TeamAISiegeComponent.QuerySystem.DeterminePositionAssociatedSide(this._targetEnemyFormation.QuerySystem.MedianPosition.GetNavMeshVec3()); IEnumerable <SiegeLane> source1 = TeamAISiegeComponent.SiegeLanes.Where <SiegeLane>((Func <SiegeLane, bool>)(sl => sl.LaneState != SiegeLane.LaneStateEnum.Conceited && !SiegeQuerySystem.AreSidesRelated(sl.LaneSide, connectedSides))); FormationAI.BehaviorSide behaviorSide = this.behaviorSide; if (source1.Any <SiegeLane>()) { if (source1.Count <SiegeLane>() > 1) { int leastDangerousLaneState = source1.Min <SiegeLane>((Func <SiegeLane, int>)(pgl => (int)pgl.LaneState)); IEnumerable <SiegeLane> source2 = source1.Where <SiegeLane>((Func <SiegeLane, bool>)(pgl => pgl.LaneState == (SiegeLane.LaneStateEnum)leastDangerousLaneState)); behaviorSide = source2.Count <SiegeLane>() <= 1 ? source2.First <SiegeLane>().LaneSide : source2.MinBy <SiegeLane, int>((Func <SiegeLane, int>)(ldl => SiegeQuerySystem.SideDistance(1 << connectedSides, 1 << (int)(ldl.LaneSide & (FormationAI.BehaviorSide) 31)))).LaneSide; } else { behaviorSide = source1.First <SiegeLane>().LaneSide; } } return(behaviorSide); }
public BehaviorEliminateEnemyInsideCastle(Formation formation) : base(formation) { this._teamAISiegeDefender = formation.Team.TeamAI as TeamAISiegeDefender; this._behaviourState = BehaviorEliminateEnemyInsideCastle.BehaviourState.UnSet; this.behaviorSide = formation.AI.Side; this.ResetOrderPositions(); }