Ejemplo n.º 1
0
        internal ArrangementOrder(ArrangementOrder.ArrangementOrderEnum orderEnum)
        {
            this.OrderEnum        = orderEnum;
            this._walkRestriction = new float?();
            switch (this.OrderEnum)
            {
            case ArrangementOrder.ArrangementOrderEnum.Circle:
                this._runRestriction = new float?(0.5f);
                break;

            case ArrangementOrder.ArrangementOrderEnum.Line:
                this._runRestriction = new float?(0.8f);
                break;

            case ArrangementOrder.ArrangementOrderEnum.Loose:
            case ArrangementOrder.ArrangementOrderEnum.Scatter:
            case ArrangementOrder.ArrangementOrderEnum.Skein:
                this._runRestriction = new float?(0.9f);
                break;

            case ArrangementOrder.ArrangementOrderEnum.ShieldWall:
            case ArrangementOrder.ArrangementOrderEnum.Square:
                this._runRestriction = new float?(0.3f);
                break;

            default:
                this._runRestriction = new float?(1f);
                break;
            }
            this._unitSpacing = ArrangementOrder.GetUnitSpacingOf(this.OrderEnum);
            this.tickTimer    = new Timer(MBCommon.GetTime(MBCommon.TimeType.Mission), 0.5f);
        }
Ejemplo n.º 2
0
 internal void OnApply(Formation formation)
 {
     formation.SetPositioning(unitSpacing: new int?(this.GetUnitSpacing()));
     this.Rearrange(formation);
     if (this.OrderEnum == ArrangementOrder.ArrangementOrderEnum.Scatter)
     {
         this.TickOccasionally(formation);
     }
     ArrangementOrder.ArrangementOrderEnum orderEnum = this.OrderEnum;
     formation.ApplyActionOnEachUnit((Action <Agent>)(agent =>
     {
         if (agent.IsAIControlled)
         {
             Agent.UsageDirection shieldDirectionOfUnit = ArrangementOrder.GetShieldDirectionOfUnit(formation, agent, orderEnum);
             agent.EnforceShieldUsage(shieldDirectionOfUnit);
         }
         agent.UpdateAgentProperties();
     }));
     if (formation.MovementOrder.OrderEnum != MovementOrder.MovementOrderEnum.Charge && formation.MovementOrder.OrderEnum != MovementOrder.MovementOrderEnum.ChargeToTarget)
     {
         if (this.OrderEnum != ArrangementOrder.ArrangementOrderEnum.Circle && this.OrderEnum != ArrangementOrder.ArrangementOrderEnum.ShieldWall && (this.OrderEnum != ArrangementOrder.ArrangementOrderEnum.Square && this.OrderEnum != ArrangementOrder.ArrangementOrderEnum.Column))
         {
             formation.ApplyActionOnEachUnit(new Action <Agent>(MovementOrder.SetDefaultMoveBehaviorValues));
         }
         else if (this.OrderEnum != ArrangementOrder.ArrangementOrderEnum.Column)
         {
             formation.ApplyActionOnEachUnit(new Action <Agent>(MovementOrder.SetDefensiveArrangementMoveBehaviorValues));
         }
         else
         {
             formation.ApplyActionOnEachUnit(new Action <Agent>(MovementOrder.SetFollowBehaviorValues));
         }
     }
     this.tickTimer = new Timer(MBCommon.GetTime(MBCommon.TimeType.Mission), 0.5f);
 }
Ejemplo n.º 3
0
 protected internal override void TickOccasionally()
 {
     if (this.formation.IsInfantry())
     {
         bool flag = this.formation.QuerySystem.ClosestEnemyFormation != null && (this.formation.QuerySystem.IsUnderRangedAttack || (double)this.formation.QuerySystem.AveragePosition.DistanceSquared(this.CurrentOrder.GetPosition(this.formation).AsVec2) < 25.0 + (this._isInShieldWallDistance ? 75.0 : 0.0)) && (double)this.formation.QuerySystem.AveragePosition.DistanceSquared(this.formation.QuerySystem.ClosestEnemyFormation.MedianPosition.AsVec2) > 100.0 - (this._isInShieldWallDistance ? 75.0 : 0.0);
         if (flag != this._isInShieldWallDistance)
         {
             this._isInShieldWallDistance = flag;
             if (this._isInShieldWallDistance)
             {
                 ArrangementOrder arrangementOrder = this.formation.QuerySystem.HasShield ? ArrangementOrder.ArrangementOrderShieldWall : ArrangementOrder.ArrangementOrderLoose;
                 if (this.formation.ArrangementOrder != arrangementOrder)
                 {
                     this.formation.ArrangementOrder    = arrangementOrder;
                     this._switchedToShieldWallRecently = true;
                     this._switchedToShieldWallTimer.Reset(Mission.Current.Time, 5f);
                 }
             }
             else if (!(this.formation.ArrangementOrder == ArrangementOrder.ArrangementOrderLine))
             {
                 this.formation.ArrangementOrder = ArrangementOrder.ArrangementOrderLine;
             }
         }
     }
     this.CalculateCurrentOrder();
     this.formation.MovementOrder = this.CurrentOrder;
     this.formation.FacingOrder   = this.CurrentFacingOrder;
 }
        protected override void CalculateCurrentOrder()
        {
            switch (this._behaviourState)
            {
            case BehaviorAssaultWalls.BehaviorState.Deciding:
                this.CurrentOrder = this._stopOrder;
                break;

            case BehaviorAssaultWalls.BehaviorState.ClimbWall:
                this.CurrentOrder            = this._wallSegmentMoveOrder;
                this.CurrentFacingOrder      = FacingOrder.FacingOrderLookAtDirection(-this._wallSegment.MiddleFrame.Rotation.f.AsVec2.Normalized());
                this.CurrentArrangementOrder = ArrangementOrder.ArrangementOrderLine;
                break;

            case BehaviorAssaultWalls.BehaviorState.AttackEntity:
                if (!this._teamAISiegeComponent.OuterGate.IsGateOpen)
                {
                    this.CurrentOrder = this._attackEntityOrderOuterGate;
                }
                else
                {
                    this.CurrentOrder = this._attackEntityOrderInnerGate;
                }
                this.CurrentFacingOrder      = FacingOrder.FacingOrderLookAtEnemy;
                this.CurrentArrangementOrder = ArrangementOrder.ArrangementOrderLine;
                break;

            case BehaviorAssaultWalls.BehaviorState.TakeControl:
                if (this.formation.QuerySystem.ClosestEnemyFormation != null)
                {
                    this.CurrentOrder = MovementOrder.MovementOrderChargeToTarget(this.formation.QuerySystem.ClosestEnemyFormation.Formation);
                }
                else
                {
                    this.CurrentOrder = MovementOrder.MovementOrderCharge;
                }
                this.CurrentFacingOrder      = FacingOrder.FacingOrderLookAtDirection(-this._wallSegment.MiddleFrame.Rotation.f.AsVec2.Normalized());
                this.CurrentArrangementOrder = ArrangementOrder.ArrangementOrderLine;
                break;

            case BehaviorAssaultWalls.BehaviorState.MoveToGate:
                this.CurrentOrder            = this._castleGateMoveOrder;
                this.CurrentFacingOrder      = FacingOrder.FacingOrderLookAtDirection(-this._innerGate.MiddleFrame.Rotation.f.AsVec2.Normalized());
                this.CurrentArrangementOrder = ArrangementOrder.ArrangementOrderLine;
                break;

            case BehaviorAssaultWalls.BehaviorState.Charging:
                this.CurrentOrder            = this._chargeOrder;
                this.CurrentFacingOrder      = FacingOrder.FacingOrderLookAtEnemy;
                this.CurrentArrangementOrder = ArrangementOrder.ArrangementOrderLoose;
                break;

            case BehaviorAssaultWalls.BehaviorState.Stop:
                this.CurrentOrder = this._stopOrder;
                break;
            }
        }
Ejemplo n.º 5
0
        internal void RearrangeAux(Formation formation, bool isDirectly)
        {
            float num           = Math.Max(1f, Math.Max(formation.Depth, formation.Width) * 0.8f);
            float lengthSquared = (formation.CurrentPosition - formation.OrderPosition.AsVec2).LengthSquared;

            if (!isDirectly && (double)lengthSquared < (double)num * (double)num)
            {
                ArrangementOrder.TransposeLineFormation(formation);
                formation.OnTick += new Action <Formation>(formation.TickForColumnArrangementInitialPositioning);
            }
            else
            {
                formation.OnTick           -= new Action <Formation>(formation.TickForColumnArrangementInitialPositioning);
                formation.ReferencePosition = new Vec2?();
                formation.Rearrange(this.GetArrangement(formation));
            }
        }
Ejemplo n.º 6
0
        private static IEnumerable <StrategicArea> CreateStrategicAreas(
            Mission mission,
            int count,
            WorldPosition center,
            float distance,
            WorldPosition target,
            float width,
            int capacity,
            BattleSideEnum side)
        {
            Scene scene = mission.Scene;
            float distanceMultiplied   = distance * 0.7f;
            Func <WorldPosition> func1 = (Func <WorldPosition>)(() =>
            {
                WorldPosition worldPosition = center;
                float rotation = (float)((double)MBRandom.RandomFloat * 3.14159274101257 * 2.0);
                worldPosition.SetVec2(center.AsVec2 + Vec2.FromRotation(rotation) * distanceMultiplied);
                return(worldPosition);
            });

            WorldPosition[] worldPositionArray = ((Func <WorldPosition[]>)(() =>
            {
                float rotation = (float)((double)MBRandom.RandomFloat * 3.14159274101257 * 2.0);
                switch (count)
                {
                case 2:
                    WorldPosition worldPosition1 = center;
                    worldPosition1.SetVec2(center.AsVec2 + Vec2.FromRotation(rotation) * distanceMultiplied);
                    WorldPosition worldPosition2 = center;
                    worldPosition2.SetVec2(center.AsVec2 + Vec2.FromRotation(rotation + 3.141593f) * distanceMultiplied);
                    return(new WorldPosition[2]
                    {
                        worldPosition1,
                        worldPosition2
                    });

                case 3:
                    WorldPosition worldPosition3 = center;
                    worldPosition3.SetVec2(center.AsVec2 + Vec2.FromRotation(rotation + 0.0f) * distanceMultiplied);
                    WorldPosition worldPosition4 = center;
                    worldPosition4.SetVec2(center.AsVec2 + Vec2.FromRotation(rotation + 2.094395f) * distanceMultiplied);
                    WorldPosition worldPosition5 = center;
                    worldPosition5.SetVec2(center.AsVec2 + Vec2.FromRotation(rotation + 4.18879f) * distanceMultiplied);
                    return(new WorldPosition[3]
                    {
                        worldPosition3,
                        worldPosition4,
                        worldPosition5
                    });

                case 4:
                    WorldPosition worldPosition6 = center;
                    worldPosition6.SetVec2(center.AsVec2 + Vec2.FromRotation(rotation + 0.0f) * distanceMultiplied);
                    WorldPosition worldPosition7 = center;
                    worldPosition7.SetVec2(center.AsVec2 + Vec2.FromRotation(rotation + 1.570796f) * distanceMultiplied);
                    WorldPosition worldPosition8 = center;
                    worldPosition8.SetVec2(center.AsVec2 + Vec2.FromRotation(rotation + 3.141593f) * distanceMultiplied);
                    WorldPosition worldPosition9 = center;
                    worldPosition9.SetVec2(center.AsVec2 + Vec2.FromRotation(rotation + 4.712389f) * distanceMultiplied);
                    return(new WorldPosition[4]
                    {
                        worldPosition6,
                        worldPosition7,
                        worldPosition8,
                        worldPosition9
                    });

                default:
                    return(new WorldPosition[0]);
                }
            }))();
            List <WorldPosition> positions = new List <WorldPosition>();

            foreach (WorldPosition worldPosition in worldPositionArray)
            {
                WorldPosition center1            = worldPosition;
                WorldPosition position           = mission.FindPositionWithBiggestSlopeTowardsDirectionInSquare(ref center1, distance * 0.25f, ref target);
                Func <WorldPosition, bool> func2 = (Func <WorldPosition, bool>)(p =>
                {
                    float pathDistance;
                    if (positions.Any <WorldPosition>((Func <WorldPosition, bool>)(wp => (double)wp.AsVec2.DistanceSquared(p.AsVec2) < 1.0)) || (!scene.GetPathDistanceBetweenPositions(ref center, ref p, 0.0f, out pathDistance) ? 0 : ((double)pathDistance < (double)center.AsVec2.Distance(p.AsVec2) * 2.0 ? 1 : 0)) == 0)
                    {
                        return(false);
                    }
                    positions.Add(position);
                    return(true);
                });
                if (!func2(position) && !func2(worldPosition))
                {
                    int num = 0;
                    do
                    {
                        ;
                    }while (num++ < 10 && !func2(func1()));
                    if (num >= 10)
                    {
                        positions.Add(center);
                    }
                }
            }
            Vec2 direction = (target.AsVec2 - center.AsVec2).Normalized();

            foreach (WorldPosition position in positions)
            {
                yield return(ArrangementOrder.CreateStrategicArea(scene, position, direction, width, capacity, side));
            }
        }