示例#1
0
        // Choose next unit for orders. If all units ended turn, update cities.
        public void ChooseNextUnit()
        {
            var units = _activeCiv.Units.Where(u => !u.Dead).ToList();

            var player = Players[_activeCiv.Id];

            //Look for units on this square or neighbours of this square

            var nextUnit = NextUnit(player, units);

            ActiveUnit = nextUnit;

            // End turn if no units awaiting orders
            if (nextUnit == null)
            {
                var anyUnitsMoved = units.Any(u => u.MovePointsLost > 0);
                if ((!anyUnitsMoved || Options.AlwaysWaitAtEndOfTurn) && _activeCiv.PlayerType != PlayerType.AI)
                {
                    OnPlayerEvent?.Invoke(null, new PlayerEventArgs(PlayerEventType.WaitingAtEndOfTurn, _activeCiv.Id));
                }
                else
                {
                    if (ProcessEndOfTurn())
                    {
                        ChoseNextCiv();
                        return;
                    }
                }
            }
        }
示例#2
0
        public void ChoseNextCiv()
        {
            if (_activeCiv == AllCivilizations[^ 1])
            {
                StartNextTurn();
            }
            else
            {
                _activeCiv = AllCivilizations[_activeCiv.Id + 1];

                if (_activeCiv.Alive)
                {
                    TurnBeginning(Players[_activeCiv.Id]);

                    OnPlayerEvent?.Invoke(null, new PlayerEventArgs(PlayerEventType.NewTurn, _activeCiv.Id));


                    if (_activeCiv.PlayerType == PlayerType.AI)
                    {
                        AiTurn();
                    }
                    else
                    {
                        // Choose next unit
                        ChooseNextUnit();
                    }
                }
                else if (!Options.DontRestartIfEliminated)
                {
                    //Look to restart if possible
                }
            }
        }
示例#3
0
 void Kill()
 {
     OnPlayerEvent?.Invoke(PlayerEventType.DEATH);
     maxHealth    = 3;
     health       = 3;
     lockedHearts = 0;
 }
        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));
        }
示例#5
0
    private void Update()
    {
        switch (currentStates)
        {
        case States.Start:
            OnStartEvent.Invoke();
            break;

        case States.Playtime:
            OnPlayerEvent.Invoke();
            break;

        case States.End:
            OnEndEvent.Invoke();
            break;

        default:
            throw new ArgumentOutOfRangeException();
        }
    }
示例#6
0
        // Choose next unit for orders. If all units ended turn, update cities.
        public void ChooseNextUnit()
        {
            var units = _activeCiv.Units.Where(u => !u.Dead).ToList();

            //Look for units on this square or neighbours of this square
            var nextUnit = ActiveTile.UnitsHere.FirstOrDefault(u => u.AwaitingOrders) ?? CurrentMap
                           .Neighbours(ActiveTile)
                           .SelectMany(t => t.UnitsHere.Where(u => u.Owner == _activeCiv && u.AwaitingOrders))
                           .FirstOrDefault();

            nextUnit ??= units.FirstOrDefault(u => u.AwaitingOrders);

            ActiveUnit = nextUnit;

            // End turn if no units awaiting orders
            if (nextUnit == null)
            {
                var anyUnitsMoved = units.Any(u => u.MovePointsLost > 0);
                if ((!anyUnitsMoved || Options.AlwaysWaitAtEndOfTurn) && _activeCiv.PlayerType != PlayerType.AI)
                {
                    OnPlayerEvent?.Invoke(null, new PlayerEventArgs(PlayerEventType.WaitingAtEndOfTurn, _activeCiv.Id));
                }
                else
                {
                    if (ProcessEndOfTurn())
                    {
                        ChoseNextCiv();
                        return;
                    }
                }
            }
            //
            //
            // if (_activeUnit != null)
            // {
            //     TriggerUnitEvent(new ActivationEventArgs(_activeUnit, false, false));
            // }
        }