Exemplo 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);
        }
Exemplo n.º 2
0
        public static Agent.UsageDirection GetShieldDirectionOfUnit(
            Formation formation,
            Agent unit,
            ArrangementOrder.ArrangementOrderEnum orderEnum)
        {
            Agent.UsageDirection usageDirection;
            if (formation.IsUnitDetached(unit))
            {
                usageDirection = Agent.UsageDirection.None;
            }
            else
            {
                switch (orderEnum)
                {
                case ArrangementOrder.ArrangementOrderEnum.Circle:
                case ArrangementOrder.ArrangementOrderEnum.Square:
                    usageDirection = ((IFormationUnit)unit).FormationRankIndex != 0 ? Agent.UsageDirection.AttackEnd : Agent.UsageDirection.DefendDown;
                    break;

                case ArrangementOrder.ArrangementOrderEnum.ShieldWall:
                    IFormationUnit unit1 = (IFormationUnit)unit;
                    usageDirection = unit1.FormationRankIndex != 0 ? (formation.arrangement.GetNeighbourUnitOfLeftSide(unit1) != null ? (formation.arrangement.GetNeighbourUnitOfRightSide(unit1) != null ? Agent.UsageDirection.AttackEnd : Agent.UsageDirection.DefendRight) : Agent.UsageDirection.DefendLeft) : Agent.UsageDirection.DefendDown;
                    break;

                default:
                    usageDirection = Agent.UsageDirection.None;
                    break;
                }
            }
            return(usageDirection);
        }
Exemplo n.º 3
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);
 }
Exemplo n.º 4
0
 internal static int GetUnitSpacingOf(ArrangementOrder.ArrangementOrderEnum a)
 {
     if (a == ArrangementOrder.ArrangementOrderEnum.Loose)
     {
         return(2);
     }
     return(a == ArrangementOrder.ArrangementOrderEnum.ShieldWall ? 0 : 1);
 }
Exemplo n.º 5
0
 internal static bool GetUnitLooseness(ArrangementOrder.ArrangementOrderEnum a) => a != ArrangementOrder.ArrangementOrderEnum.ShieldWall;