// 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()); } } }
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()); } } }