Exemplo n.º 1
0
        private void ResetOrderPositions()
        {
            this._behaviourState = BehaviorRetakeCastleKeyPosition.BehaviourState.UnSet;
            this._gatheringSide  = this.DetermineGatheringSide();
            SiegeLane  siegeLane        = TeamAISiegeComponent.SiegeLanes.FirstOrDefault <SiegeLane>((Func <SiegeLane, bool>)(sl => sl.LaneSide == this._gatheringSide));
            WorldFrame defenseWaitFrame = siegeLane.DefensePoints.FirstOrDefault <ICastleKeyPosition>().DefenseWaitFrame;

            this._gatheringTacticalPos = siegeLane.DefensePoints.FirstOrDefault <ICastleKeyPosition>().WaitPosition;
            if (this._gatheringTacticalPos != null)
            {
                this._gatherOrder          = MovementOrder.MovementOrderMove(this._gatheringTacticalPos.Position);
                this._gatheringFacingOrder = FacingOrder.FacingOrderLookAtEnemy;
            }
            else if (defenseWaitFrame.Origin.IsValid)
            {
                double num = (double)defenseWaitFrame.Rotation.f.Normalize();
                this._gatherOrder          = MovementOrder.MovementOrderMove(defenseWaitFrame.Origin);
                this._gatheringFacingOrder = FacingOrder.FacingOrderLookAtEnemy;
            }
            else
            {
                this._gatherOrder          = MovementOrder.MovementOrderMove(this.formation.QuerySystem.MedianPosition);
                this._gatheringFacingOrder = FacingOrder.FacingOrderLookAtEnemy;
            }
            this._attackOrder       = MovementOrder.MovementOrderMove(TeamAISiegeComponent.SiegeLanes.FirstOrDefault <SiegeLane>((Func <SiegeLane, bool>)(sl => sl.LaneSide == this.behaviorSide)).DefensePoints.FirstOrDefault <ICastleKeyPosition>().MiddleFrame.Origin);
            this._attackFacingOrder = FacingOrder.FacingOrderLookAtEnemy;
            this.CurrentOrder       = this._behaviourState == BehaviorRetakeCastleKeyPosition.BehaviourState.Attacking ? this._attackOrder : this._gatherOrder;
            this.CurrentFacingOrder = this._behaviourState == BehaviorRetakeCastleKeyPosition.BehaviourState.Attacking ? this._attackFacingOrder : this._gatheringFacingOrder;
        }
 private void ResetFollowOrder()
 {
     this._followedEntity         = (GameEntity)null;
     this._followTacticalPosition = (TacticalPosition)null;
     if (this._ladders.Any <SiegeLadder>())
     {
         this._followedEntity = (this._ladders.FirstOrDefault <SiegeLadder>((Func <SiegeLadder, bool>)(l => !l.IsDeactivated && l.InitialWaitPosition.HasScriptOfType <TacticalPosition>())) ?? this._ladders.FirstOrDefault <SiegeLadder>((Func <SiegeLadder, bool>)(l => !l.IsDeactivated))).InitialWaitPosition;
         if ((NativeObject)this._followedEntity == (NativeObject)null)
         {
             this._followedEntity = this._ladders.FirstOrDefault <SiegeLadder>((Func <SiegeLadder, bool>)(l => !l.IsDeactivated)).InitialWaitPosition;
         }
         this._followOrder = MovementOrder.MovementOrderFollowEntity(this._followedEntity);
     }
     else if (this._breachedWallSegment != null)
     {
         this._followedEntity = this._breachedWallSegment.GameEntity.CollectChildrenEntitiesWithTag("attacker_wait_pos").FirstOrDefault <GameEntity>();
         this._followOrder    = MovementOrder.MovementOrderFollowEntity(this._followedEntity);
     }
     else
     {
         this._followOrder = MovementOrder.MovermentOrderNull;
     }
     if (!((NativeObject)this._followedEntity != (NativeObject)null))
     {
         return;
     }
     this._followTacticalPosition = this._followedEntity.GetFirstScriptOfType <TacticalPosition>();
 }
Exemplo n.º 3
0
        private bool IsTacticalPositionEligible(TacticalPosition tacticalPosition)
        {
            if (!this.CheckAndDetermineFormation(ref this._mainInfantry, (Func <Formation, bool>)(f => f.QuerySystem.IsInfantryFormation)))
            {
                return(false);
            }
            float num1 = this.team.QuerySystem.AveragePosition.Distance(tacticalPosition.Position.AsVec2);
            Vec2  vec2 = this.team.QuerySystem.AverageEnemyPosition;
            float num2 = vec2.Distance(this._mainInfantry.QuerySystem.AveragePosition);

            if ((double)num1 > 20.0 && (double)num1 > (double)num2 * 0.5)
            {
                return(false);
            }
            int countOfUnits = this._mainInfantry.CountOfUnits;

            if ((double)this._mainInfantry.MaximumInterval * (double)(countOfUnits - 1) + (double)this._mainInfantry.UnitDiameter * (double)countOfUnits < (double)tacticalPosition.Width)
            {
                return(false);
            }
            vec2 = this.team.QuerySystem.AverageEnemyPosition - tacticalPosition.Position.AsVec2;
            vec2 = vec2.Normalized();
            float num3 = vec2.DotProduct(tacticalPosition.Direction);

            return(tacticalPosition.IsInsurmountable ? (double)Math.Abs(num3) >= 0.5 : (double)num3 >= 0.5);
        }
Exemplo n.º 4
0
        private void ResetOrderPositions()
        {
            this.behaviorSide = this.DetermineGatheringSide();
            SiegeLane  siegeLane  = TeamAISiegeComponent.SiegeLanes.FirstOrDefault <SiegeLane>((Func <SiegeLane, bool>)(sl => sl.LaneSide == this.behaviorSide));
            WorldFrame worldFrame = siegeLane == null ? WorldFrame.Invalid : siegeLane.DefensePoints.FirstOrDefault <ICastleKeyPosition>().DefenseWaitFrame;

            this._gatheringTacticalPos = siegeLane != null?siegeLane.DefensePoints.FirstOrDefault <ICastleKeyPosition>().WaitPosition : (TacticalPosition)null;

            if (this._gatheringTacticalPos != null)
            {
                this._gatherOrder          = MovementOrder.MovementOrderMove(this._gatheringTacticalPos.Position);
                this._gatheringFacingOrder = FacingOrder.FacingOrderLookAtEnemy;
            }
            else if (worldFrame.Origin.IsValid)
            {
                double num = (double)worldFrame.Rotation.f.Normalize();
                this._gatherOrder          = MovementOrder.MovementOrderMove(worldFrame.Origin);
                this._gatheringFacingOrder = FacingOrder.FacingOrderLookAtEnemy;
            }
            else
            {
                this._gatherOrder          = MovementOrder.MovementOrderMove(this.formation.QuerySystem.MedianPosition);
                this._gatheringFacingOrder = FacingOrder.FacingOrderLookAtEnemy;
            }
            this._attackOrder       = MovementOrder.MovementOrderChargeToTarget(this._targetEnemyFormation);
            this._attackFacingOrder = FacingOrder.FacingOrderLookAtEnemy;
            this.CurrentOrder       = this._behaviourState == BehaviorEliminateEnemyInsideCastle.BehaviourState.Attacking ? this._attackOrder : this._gatherOrder;
            this.CurrentFacingOrder = this._behaviourState == BehaviorEliminateEnemyInsideCastle.BehaviourState.Attacking ? this._attackFacingOrder : this._gatheringFacingOrder;
        }
Exemplo n.º 5
0
        private bool IsTacticalPositionEligible(TacticalPosition tacticalPosition)
        {
            float num1 = this._mainInfantry != null?this._mainInfantry.QuerySystem.AveragePosition.Distance(tacticalPosition.Position.AsVec2) : this.team.QuerySystem.AveragePosition.Distance(tacticalPosition.Position.AsVec2);

            float num2 = this.team.QuerySystem.AverageEnemyPosition.Distance(this._mainInfantry != null ? this._mainInfantry.QuerySystem.AveragePosition : this.team.QuerySystem.AveragePosition);

            return(((double)num1 <= 20.0 || (double)num1 <= (double)num2 * 0.5) && tacticalPosition.IsInsurmountable);
        }
Exemplo n.º 6
0
        private float GetCavalryFactor(TacticalPosition tacticalPosition)
        {
            if (tacticalPosition.TacticalRegionMembership == TacticalRegion.TacticalRegionTypeEnum.Opening)
            {
                return(1f);
            }
            double overallPowerRatio = (double)this.team.QuerySystem.OverallPowerRatio;
            double teamPower         = (double)this.team.QuerySystem.TeamPower;
            float  num = this.team.QuerySystem.EnemyTeams.Sum <TeamQuerySystem>((Func <TeamQuerySystem, float>)(et => et.TeamPower));

            return((float)(teamPower - teamPower * ((double)this.team.QuerySystem.CavalryRatio + (double)this.team.QuerySystem.RangedCavalryRatio) * 0.5) / (num - (float)((double)num * ((double)this.team.QuerySystem.EnemyCavalryRatio + (double)this.team.QuerySystem.EnemyRangedCavalryRatio) * 0.5)) / this.team.QuerySystem.OverallPowerRatio);
        }
Exemplo n.º 7
0
        private List <TacticalPosition> ExtractPossibleTacticalPositionsFromTacticalRegion(
            TacticalRegion tacticalRegion)
        {
            List <TacticalPosition> tacticalPositionList = new List <TacticalPosition>();

            tacticalRegion.LinkedTacticalPositions.Where <TacticalPosition>((Func <TacticalPosition, bool>)(ltp => ltp.TacticalPositionType == TacticalPosition.TacticalPositionTypeEnum.HighGround));
            if (tacticalRegion.tacticalRegionType == TacticalRegion.TacticalRegionTypeEnum.DifficultTerrain || tacticalRegion.tacticalRegionType == TacticalRegion.TacticalRegionTypeEnum.Opening)
            {
                Vec2             direction        = (this.team.QuerySystem.AverageEnemyPosition - tacticalRegion.Position.AsVec2).Normalized();
                TacticalPosition tacticalPosition = new TacticalPosition(tacticalRegion.Position, direction, tacticalRegion.radius, isInsurmountable: true, tacticalRegionMembership: tacticalRegion.tacticalRegionType);
                tacticalPositionList.Add(tacticalPosition);
            }
            return(tacticalPositionList);
        }
Exemplo n.º 8
0
        private float GetTacticalPositionScore(TacticalPosition tacticalPosition)
        {
            if (!this.CheckAndDetermineFormation(ref this._mainInfantry, (Func <Formation, bool>)(f => f.QuerySystem.IsInfantryFormation)) || !this.CheckAndDetermineFormation(ref this._archers, (Func <Formation, bool>)(f => f.QuerySystem.IsRangedFormation)))
            {
                return(0.0f);
            }
            double    num1          = (double)MBMath.Lerp(1f, 1.5f, MBMath.ClampFloat(tacticalPosition.Slope, 0.0f, 60f) / 60f);
            Formation formation     = this.team.Formations.Where <Formation>((Func <Formation, bool>)(f => f.QuerySystem.IsRangedFormation)).MaxBy <Formation, int>((Func <Formation, int>)(f => f.CountOfUnits));
            float     num2          = Math.Max(formation.arrangement.Depth, formation.arrangement.Width);
            float     num3          = MBMath.ClampFloat(tacticalPosition.Width / num2, 0.7f, 1f);
            float     num4          = tacticalPosition.IsInsurmountable ? 1.5f : 1f;
            float     cavalryFactor = this.GetCavalryFactor(tacticalPosition);
            float     num5          = MBMath.Lerp(0.7f, 1f, (float)((150.0 - (double)MBMath.ClampFloat(this._mainInfantry.QuerySystem.AveragePosition.Distance(tacticalPosition.Position.AsVec2), 50f, 150f)) / 100.0));
            double    num6          = (double)num3;

            return((float)(num1 * num6) * num4 * cavalryFactor * num5);
        }
Exemplo n.º 9
0
        private bool IsTacticalPositionEligible(TacticalPosition tacticalPosition)
        {
            if (tacticalPosition.TacticalPositionType == TacticalPosition.TacticalPositionTypeEnum.SpecialMissionPosition)
            {
                return(true);
            }
            Vec2          vec2;
            WorldPosition position;
            double        num1;

            if (this._mainInfantry == null)
            {
                vec2 = this.team.QuerySystem.AveragePosition;
                ref Vec2 local = ref vec2;
                position = tacticalPosition.Position;
                Vec2 asVec2 = position.AsVec2;
                num1 = (double)local.Distance(asVec2);
            }
Exemplo n.º 10
0
        private float GetTacticalPositionScore(TacticalPosition tacticalPosition)
        {
            if (!this.CheckAndDetermineFormation(ref this._mainInfantry, (Func <Formation, bool>)(f => f.QuerySystem.IsInfantryFormation)))
            {
                return(0.0f);
            }
            double num1         = (double)MBMath.Lerp(1f, 1.5f, MBMath.ClampFloat(tacticalPosition.Slope, 0.0f, 60f) / 60f);
            int    countOfUnits = this._mainInfantry.CountOfUnits;
            float  num2         = MBMath.Lerp(0.67f, 1.5f, (float)(((double)MBMath.ClampFloat((float)((double)this._mainInfantry.Interval * (double)(countOfUnits - 1) + (double)this._mainInfantry.UnitDiameter * (double)countOfUnits) / tacticalPosition.Width, 0.5f, 3f) - 0.5) / 2.5));
            float  num3         = 1f;

            if (this.CheckAndDetermineFormation(ref this._archers, (Func <Formation, bool>)(f => f.QuerySystem.IsRangedFormation)) && tacticalPosition.LinkedTacticalPositions.Where <TacticalPosition>((Func <TacticalPosition, bool>)(lcp => lcp.TacticalPositionType == TacticalPosition.TacticalPositionTypeEnum.Cliff)).ToList <TacticalPosition>().Any <TacticalPosition>())
            {
                num3 = MBMath.Lerp(1f, 1.5f, (float)(((double)MBMath.ClampFloat(this.team.QuerySystem.RangedRatio, 0.05f, 0.25f) - 0.0500000007450581) * 5.0));
            }
            float  num4 = MBMath.Lerp(0.7f, 1f, (float)((150.0 - (double)MBMath.ClampFloat(this._mainInfantry.QuerySystem.AveragePosition.Distance(tacticalPosition.Position.AsVec2), 50f, 150f)) / 100.0));
            double num5 = (double)num2;

            return((float)(num1 * num5) * num3 * num4);
        }
Exemplo n.º 11
0
        private void ResetOrderPositions()
        {
            SiegeLane  siegeLane  = TeamAISiegeComponent.SiegeLanes.FirstOrDefault <SiegeLane>((Func <SiegeLane, bool>)(sl => sl.LaneSide == FormationAI.BehaviorSide.Middle));
            WorldFrame worldFrame = (siegeLane != null ? siegeLane.DefensePoints.FirstOrDefault <ICastleKeyPosition>()?.DefenseWaitFrame : new WorldFrame?()) ?? WorldFrame.Invalid;

            this._gatheringTacticalPos = siegeLane != null?siegeLane.DefensePoints.FirstOrDefault <ICastleKeyPosition>()?.WaitPosition : (TacticalPosition)null;

            if (this._gatheringTacticalPos != null)
            {
                this._gatherOrder = MovementOrder.MovementOrderMove(this._gatheringTacticalPos.Position);
            }
            else if (worldFrame.Origin.IsValid)
            {
                double num = (double)worldFrame.Rotation.f.Normalize();
                this._gatherOrder = MovementOrder.MovementOrderMove(worldFrame.Origin);
            }
            else
            {
                this._gatherOrder = MovementOrder.MovementOrderMove(this.formation.QuerySystem.MedianPosition);
            }
            this._attackOrder = MovementOrder.MovementOrderCharge;
            this.CurrentOrder = this._calculateShouldStartAttacking ? this._attackOrder : this._gatherOrder;
        }
Exemplo n.º 12
0
 internal override void ResetBehavior()
 {
     base.ResetBehavior();
     this.TacticalDefendPosition = (TacticalPosition)null;
 }
 internal override void ResetBehavior()
 {
     base.ResetBehavior();
     this._defensePosition        = WorldPosition.Invalid;
     this._tacticalDefendPosition = (TacticalPosition)null;
 }
Exemplo n.º 14
0
        private void ResetOrderPositions()
        {
            this.behaviorSide = this.formation.AI.Side;
            this._innerGate   = (CastleGate)null;
            this._outerGate   = (CastleGate)null;
            this._laddersOnThisSide.Clear();
            int num1 = Mission.Current.ActiveMissionObjects.FindAllWithType <CastleGate>().Any <CastleGate>((Func <CastleGate, bool>)(cg => cg.DefenseSide == this.behaviorSide && cg.GameEntity.HasTag("outer_gate"))) ? 1 : 0;

            this._isDefendingWideGap = false;
            WorldFrame worldFrame1;
            WorldFrame worldFrame2;

            if (num1 != 0)
            {
                CastleGate outerGate = this._teamAISiegeDefender.OuterGate;
                this._innerGate          = this._teamAISiegeDefender.InnerGate;
                this._outerGate          = this._teamAISiegeDefender.OuterGate;
                worldFrame1              = outerGate.MiddleFrame;
                worldFrame2              = outerGate.DefenseWaitFrame;
                this._tacticalMiddlePos  = outerGate.MiddlePosition;
                this._tacticalWaitPos    = outerGate.WaitPosition;
                this._isDefendingWideGap = false;
            }
            else
            {
                WallSegment wallSegment = Mission.Current.ActiveMissionObjects.FindAllWithType <WallSegment>().Where <WallSegment>((Func <WallSegment, bool>)(ws => ws.DefenseSide == this.behaviorSide && ws.IsBreachedWall)).FirstOrDefault <WallSegment>();
                if (wallSegment != null)
                {
                    worldFrame1              = wallSegment.MiddleFrame;
                    worldFrame2              = wallSegment.DefenseWaitFrame;
                    this._tacticalMiddlePos  = wallSegment.MiddlePosition;
                    this._tacticalWaitPos    = wallSegment.WaitPosition;
                    this._isDefendingWideGap = false;
                }
                else
                {
                    IEnumerable <SiegeWeapon> source = Mission.Current.ActiveMissionObjects.FindAllWithType <SiegeWeapon>().Where <SiegeWeapon>((Func <SiegeWeapon, bool>)(sw =>
                    {
                        if (!(sw is IPrimarySiegeWeapon) || (sw as IPrimarySiegeWeapon).WeaponSide != this.behaviorSide)
                        {
                            return(false);
                        }
                        return(!sw.IsDestroyed || (sw as IPrimarySiegeWeapon).HasCompletedAction());
                    }));
                    if (!source.Any <SiegeWeapon>())
                    {
                        worldFrame1             = WorldFrame.Invalid;
                        worldFrame2             = WorldFrame.Invalid;
                        this._tacticalMiddlePos = (TacticalPosition)null;
                        this._tacticalWaitPos   = (TacticalPosition)null;
                    }
                    else
                    {
                        this._laddersOnThisSide = source.Where <SiegeWeapon>((Func <SiegeWeapon, bool>)(aw => aw is SiegeLadder)).Select <SiegeWeapon, SiegeLadder>((Func <SiegeWeapon, SiegeLadder>)(aw => aw as SiegeLadder)).ToList <SiegeLadder>();
                        ICastleKeyPosition targetCastlePosition = (source.FirstOrDefault <SiegeWeapon>() as IPrimarySiegeWeapon).TargetCastlePosition as ICastleKeyPosition;
                        worldFrame1             = targetCastlePosition.MiddleFrame;
                        worldFrame2             = targetCastlePosition.DefenseWaitFrame;
                        this._tacticalMiddlePos = targetCastlePosition.MiddlePosition;
                        this._tacticalWaitPos   = targetCastlePosition.WaitPosition;
                    }
                }
            }
            if (this._tacticalMiddlePos != null)
            {
                this._readyOrder       = MovementOrder.MovementOrderMove(this._tacticalMiddlePos.Position);
                this._readyFacingOrder = FacingOrder.FacingOrderLookAtDirection(this._tacticalMiddlePos.Direction);
            }
            else if (worldFrame1.Origin.IsValid)
            {
                double num2 = (double)worldFrame1.Rotation.f.Normalize();
                this._readyOrder       = MovementOrder.MovementOrderMove(worldFrame1.Origin);
                this._readyFacingOrder = FacingOrder.FacingOrderLookAtDirection(worldFrame1.Rotation.f.AsVec2);
            }
            else
            {
                this._readyOrder       = MovementOrder.MovementOrderStop;
                this._readyFacingOrder = FacingOrder.FacingOrderLookAtEnemy;
            }
            if (this._tacticalWaitPos != null)
            {
                this._waitOrder       = MovementOrder.MovementOrderMove(this._tacticalWaitPos.Position);
                this._waitFacingOrder = FacingOrder.FacingOrderLookAtDirection(this._tacticalWaitPos.Direction);
            }
            else if (worldFrame2.Origin.IsValid)
            {
                double num2 = (double)worldFrame2.Rotation.f.Normalize();
                this._waitOrder       = MovementOrder.MovementOrderMove(worldFrame2.Origin);
                this._waitFacingOrder = FacingOrder.FacingOrderLookAtDirection(worldFrame2.Rotation.f.AsVec2);
            }
            else
            {
                this._waitOrder       = MovementOrder.MovementOrderStop;
                this._waitFacingOrder = FacingOrder.FacingOrderLookAtEnemy;
            }
            this.CurrentOrder       = this._behaviourState == BehaviorDefendCastleKeyPosition.BehaviourState.Ready ? this._readyOrder : this._waitOrder;
            this.CurrentFacingOrder = this.formation.QuerySystem.ClosestEnemyFormation == null || !TeamAISiegeComponent.IsFormationInsideCastle(this.formation.QuerySystem.ClosestEnemyFormation.Formation, true) ? (this._behaviourState == BehaviorDefendCastleKeyPosition.BehaviourState.Ready ? this._readyFacingOrder : this._waitFacingOrder) : FacingOrder.FacingOrderLookAtEnemy;
        }