コード例 #1
0
        private uint LoopUntilCombatComplete()
        {
            uint winningParty;

            while (!_winningPartyCalculator.GetWinningPartyId(_parties, out winningParty))
            {
                // Get Active Entity
                IInitiativeActor activeEntity = _initiativeQueue.GetNext();
                _eventQueue.EnqueueEvent(new ActiveActorChangedEvent(activeEntity.Id));

                // Prompt Action
                if (!activeEntity.IsAlive())
                {
                    // Move dead/inactive actor to end of queue
                    _initiativeQueue.Update(activeEntity.Id, _initiativeQueue.InitiativeThreshold);
                }
                else
                {
                    IEnumerable <IAction> actorSelectedActions = _turnController.TakeTurn(
                        activeEntity,
                        _controllerByPartyId[activeEntity.Party],
                        _allTargets,
                        _standardActionGenerator);
                    foreach (IAction selectedAction in actorSelectedActions)
                    {
                        // Update active entity's initiative value
                        _initiativeQueue.Update(activeEntity.Id, selectedAction.Speed);

                        // Inform event queue we're applying an action
                        _eventQueue.EnqueueEvent(new ActorActionTakenEvent(activeEntity.Id, selectedAction));

                        // Pay cost(s) for Action
                        _eventQueue.EnqueueEvents(ApplyActionCost(selectedAction, _actorChangeCalculator));

                        // Apply effect(s) for Action
                        _eventQueue.EnqueueEvents(ApplyActionEffect(selectedAction, _actorChangeCalculator));
                    }
                }

                // Rest for a bit
                Thread.Sleep(ACTOR_CHANGE_SLEEP_TIME);
            }

            return(winningParty);
        }