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