Exemple #1
0
        // Choose next unit for orders. If all units ended turn, update cities.
        private void ChooseNextUnit()
        {
            // End turn if no units awaiting orders
            if (!_activeCiv.AnyUnitsAwaitingOrders)
            {
                ChoseNextCiv();

                // TODO: implement wait at end of turn
                //if (Options.AlwaysWaitAtEndOfTurn)
                //{
                //    OnWaitAtTurnEnd?.Invoke(null, new WaitAtTurnEndEventArgs());
                //}
                //else
                //{

                //}
            }
            // Choose next unit
            else
            {
                // Create an list of indexes of units awaiting orders
                var indexUAO = new List <int>();
                foreach (IUnit unit in _units.Where(u => u.Owner == _activeCiv && !u.Dead && u.AwaitingOrders && _activeUnit != u))
                {
                    indexUAO.Add(unit.Id);
                }

                //int indexActUnit = Game.GetUnits.FindIndex(unit => unit == Game.ActiveUnit);  //Determine index of unit that is currently still active but just ended turn

                if (_activeUnit.Id < indexUAO.First())
                {
                    _activeUnit = _units[indexUAO.First()];
                }
                else if (_activeUnit.Id == indexUAO.First())
                {
                    _activeUnit = _units[indexUAO.First() + 1];
                }
                else if (_activeUnit.Id >= indexUAO.Last())
                {
                    _activeUnit = _units[indexUAO.First()];
                }
                else
                {
                    for (int i = 0; i < indexUAO.Count; i++)
                    {
                        if ((_activeUnit.Id >= indexUAO[i]) && (_activeUnit.Id < indexUAO[i + 1]))
                        {
                            _activeUnit = _units[indexUAO[i + 1]];
                            break;
                        }
                    }
                }

                OnUnitEvent?.Invoke(null, new UnitEventArgs(UnitEventType.NewUnitActivated));

                // Set new unit command if player=AI
                if (_activeCiv != _playerCiv)
                {
                    Game.IssueUnitOrder(UnitAI.UnitOrder());
                }
            }
        }
Exemple #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());
                }
            }
        }