Ejemplo n.º 1
0
        private FormationAI.BehaviorSide DetermineGatheringSide()
        {
            IEnumerable <SiegeLane> source = TeamAISiegeComponent.SiegeLanes.Where <SiegeLane>((Func <SiegeLane, bool>)(sl => sl.LaneSide != this.behaviorSide && sl.LaneState != SiegeLane.LaneStateEnum.Conceited));

            if (!source.Any <SiegeLane>())
            {
                return(this.behaviorSide);
            }
            int nearestSafeSideDistance = source.Min <SiegeLane>((Func <SiegeLane, int>)(pgl => SiegeQuerySystem.SideDistance(1 << (int)(this.behaviorSide & (FormationAI.BehaviorSide) 31), 1 << (int)(pgl.LaneSide & (FormationAI.BehaviorSide) 31))));

            return(source.Where <SiegeLane>((Func <SiegeLane, bool>)(pgl => SiegeQuerySystem.SideDistance(1 << (int)(this.behaviorSide & (FormationAI.BehaviorSide) 31), 1 << (int)(pgl.LaneSide & (FormationAI.BehaviorSide) 31)) == nearestSafeSideDistance)).MinBy <SiegeLane, float>((Func <SiegeLane, float>)(pgl => pgl.DefenderOrigin.GetGroundVec3().DistanceSquared(this.formation.QuerySystem.MedianPosition.GetGroundVec3()))).LaneSide);
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
 internal void SetSiegeQuerySystem(SiegeQuerySystem siegeQuerySystem) => this._siegeQuerySystem = siegeQuerySystem;