public void DoTurnAsync(Turn Turn)
 {
     try
     {
         bool didAnything = false;
         while (!(_Orders.Peek() is NextPhaseOrder))
         {
             var o = _Orders.Dequeue();
             _Match.ExecuteOrder(o);
             didAnything |= !(o is ResetOrder);
         }
         if (didAnything)
         {
             Thread.Sleep(WaitMillis(Turn.TurnInfo.TurnComponent));
         }
         if (_Orders.Count < 2)
         {
             Thread.Sleep(2500);
         }
         _Match.ExecuteOrder(_Orders.Dequeue());
     }
     catch (Exception e) { Console.WriteLine(e); }
 }
 public virtual void EnterUnits(Turn Turn, bool Vehicle)
 {
 }
 public bool AutomateTurn(Match Match, Turn Turn)
 {
     DoBufferedOrders(Match, Turn.TurnInfo);
     return(false);
 }
 public void DoTurn(Turn Turn)
 {
     _PlayerControllers[Turn.TurnInfo.Army].DoTurn(Turn);
 }
 public StartTurnComponentEventArgs(Turn Turn)
 {
     this.Turn = Turn;
 }
 public void DoTurn(Turn Turn)
 {
     Task.Run(() => DoTurnAsync(Turn));
 }
        public bool AutomateTurn(Match Match, Turn Turn)
        {
            Match.ExecuteOrder(new ResetOrder(Turn.TurnInfo.Army, Turn.TurnInfo.TurnComponent == TurnComponent.RESET));

            _MultiTurnAutomater.AutomateTurn(Match, Turn);

            switch (Turn.TurnInfo.TurnComponent)
            {
            case TurnComponent.DEPLOYMENT:
                Turn.TurnInfo.Army.Deployments.ForEach(i => i.AutomateDeployment());
                return(false);

            case TurnComponent.MINEFIELD_ATTACK:
                DoMinefieldAttacks(Match, Turn.TurnInfo.Army);
                return(true);

            case TurnComponent.ARTILLERY:
                return(!Turn.TurnInfo.Army.Units.Any(
                           i => i.CanAttack(AttackMethod.INDIRECT_FIRE) == OrderInvalidReason.NONE));

            case TurnComponent.ATTACK:
                return(!Turn.TurnInfo.Army.Units.Any(
                           i => i.CanAttack(AttackMethod.DIRECT_FIRE) == OrderInvalidReason.NONE));

            case TurnComponent.AIRCRAFT:
                return(!Turn.TurnInfo.Army.Units.Any(
                           i => i.Configuration.IsAircraft() && i.Status == UnitStatus.ACTIVE));

            case TurnComponent.ANTI_AIRCRAFT:
                return(!Turn.TurnInfo.Army.Units.Any(
                           i => i.CanAttack(AttackMethod.ANTI_AIRCRAFT) == OrderInvalidReason.NONE) ||
                       !Match.Armies.Where(i => i.Configuration.Team != Turn.TurnInfo.Army.Configuration.Team)
                       .SelectMany(i => i.Units)
                       .Any(i => i.Configuration.IsAircraft() && i.Position != null));

            case TurnComponent.VEHICLE_COMBAT_MOVEMENT:
                return(!Turn.TurnInfo.Army.Units.Any(i => i.CanMove(true, true) == OrderInvalidReason.NONE &&
                                                     i.CanAttack(AttackMethod.OVERRUN) == OrderInvalidReason.NONE));

            case TurnComponent.VEHICLE_MOVEMENT:
                Turn.TurnInfo.Army.Deployments.ForEach(i => i.EnterUnits(Turn, true));
                Turn.TurnInfo.Army.Deployments.ForEach(i => i.AutomateMovement(true));
                return(!Turn.TurnInfo.Army.Units.Any(i => i.CanMove(true, false) == OrderInvalidReason.NONE));

            case TurnComponent.CLOSE_ASSAULT:
                return(!Turn.TurnInfo.Army.Units.Any(
                           i => i.CanAttack(AttackMethod.CLOSE_ASSAULT) == OrderInvalidReason.NONE));

            case TurnComponent.NON_VEHICLE_MOVEMENT:
                Turn.TurnInfo.Army.Deployments.ForEach(i => i.EnterUnits(Turn, false));
                Turn.TurnInfo.Army.Deployments.ForEach(i => i.AutomateMovement(false));
                return(!Turn.TurnInfo.Army.Units.Any(i => i.CanMove(false, false) == OrderInvalidReason.NONE));

            case TurnComponent.WAIT:
                return(!Match.Scenario.Rules.FogOfWar);

            case TurnComponent.RESET:
                return(true);
            }
            return(false);
        }