private void ChoseNextCiv()
        {
            // Make a list of active civs
            var civIds = new List <int>();

            foreach (var civ in GetActiveCivs)
            {
                civIds.Add(civ.Id);
            }

            // Increase game turn
            if (_activeCiv.Id == civIds.Last())
            {
                _turnNumber++;
            }

            // Chose next civ
            for (int id = 0; id < civIds.Count; id++)
            {
                if (civIds[id] == _activeCiv.Id)
                {
                    if (civIds[id] == civIds.Last())
                    {
                        _activeCiv = GetActiveCivs[0];
                    }
                    else
                    {
                        _activeCiv = GetActiveCivs[id + 1];
                    }
                    break;
                }
            }

            // Reset turns of all units
            foreach (var unit in GetActiveUnits.Where(n => n.Owner == _activeCiv))
            {
                unit.TurnEnded      = false;
                unit.MovePointsLost = 0;

                // Increase counters
                if ((unit.Order == OrderType.BuildIrrigation) || (unit.Order == OrderType.BuildRoad) || (unit.Order == OrderType.BuildMine))
                {
                    unit.Counter += 1;
                }
            }

            // Update all cities
            CitiesTurn();

            // Choose next unit
            ChooseNextUnit();

            OnPlayerEvent?.Invoke(null, new PlayerEventArgs(PlayerEventType.NewTurn));
        }
示例#2
0
        public void UpdateActiveUnit()
        {
            if (_activeCiv == _playerCiv)
            {
                // If active unit died OR is not waiting order, chose next unit in line, otherwise update its orders
                if (!_activeUnit.AwaitingOrders || !GetActiveUnits.Contains(_activeUnit))
                {
                    ChooseNextUnit();
                }
                else
                {
                    switch (_activeUnit.Order)
                    {
                    case OrderType.BuildIrrigation:
                        if (_activeUnit.Counter == 2)
                        {
                            if (Map.TileC2(_activeUnit.X, _activeUnit.Y).Irrigation == false)     // Build irrigation
                            {
                                Map.TileC2(_activeUnit.X, _activeUnit.Y).Irrigation = true;
                            }
                            else if ((Map.TileC2(_activeUnit.X, _activeUnit.Y).Irrigation == true) && (Map.TileC2(_activeUnit.X, _activeUnit.Y).Farmland == false))     // Build farms
                            {
                                Map.TileC2(_activeUnit.X, _activeUnit.Y).Farmland = true;
                            }
                            //Game.TerrainTile = Draw.DrawMap();  //Update game map
                            //unit.Action = OrderType.NoOrders;
                        }
                        break;

                    case OrderType.BuildRoad:
                        if (_activeUnit.Counter == 2)
                        {
                            if (Map.TileC2(_activeUnit.X, _activeUnit.Y).Road == false)     // Build road
                            {
                                Map.TileC2(_activeUnit.X, _activeUnit.Y).Road = true;
                            }
                            else if ((Map.TileC2(_activeUnit.X, _activeUnit.Y).Road == true) && (Map.TileC2(_activeUnit.X, _activeUnit.Y).Railroad == false))     // Build railroad
                            {
                                Map.TileC2(_activeUnit.X, _activeUnit.Y).Railroad = true;
                            }
                            //Game.TerrainTile = Draw.DrawMap();  //Update game map
                            //unit.Action = OrderType.NoOrders;
                        }
                        break;

                    case OrderType.BuildMine:
                        if (_activeUnit.Counter == 2)
                        {
                            Map.TileC2(_activeUnit.X, _activeUnit.Y).Mining = true;
                            //Game.TerrainTile = Draw.DrawMap();  //Update game map
                            //unit.Action = OrderType.NoOrders;
                        }
                        break;

                    default:
                        break;
                    }
                    OnUnitEvent?.Invoke(null, new UnitEventArgs(UnitEventType.StatusUpdate));
                }
            }
            // AI
            else
            {
                if (!_activeUnit.AwaitingOrders || !GetActiveUnits.Contains(_activeUnit))
                {
                    ChooseNextUnit();
                }
                else
                {
                    Game.IssueUnitOrder(UnitAI.UnitOrder());
                }
            }
        }