public override void Run(GameEvent gameEvent, GameEventArgs eventArgs)
{
Game game = Game.CurrentGame;
Player currentPlayer = eventArgs.Source;
if (currentPlayer.IsImprisoned)
{
currentPlayer.IsImprisoned = false;
GameDelays.Delay(GameDelays.Imprisoned);
return;
}
game.CurrentPlayer = currentPlayer;
game.PhasesSkipped.Clear();
Game.CurrentGame.Emit(GameEvent.PhaseBeforeStart, new GameEventArgs() { Source = currentPlayer });
while (true)
{
if (game.PhasesSkipped.Contains(game.CurrentPhase) && game.CurrentPhaseEventIndex < Game.PhaseEvents.Length - 1)
{
game.CurrentPhaseEventIndex = Game.PhaseEvents.Length - 1;
Game.CurrentGame.NotificationProxy.NotifyLogEvent(new LogEvent("SkipPhase", currentPlayer, new LogEventArg(string.Format("Phase.{0}", (int)game.CurrentPhase))),
new List<Player>() { currentPlayer },
false);
continue;
}
GameEventArgs args = new GameEventArgs() { Source = currentPlayer };
Trace.TraceInformation("Main game loop running {0}:{1}", currentPlayer.Id, game.CurrentPhase);
try
{
var phaseEvent = Game.PhaseEvents[game.CurrentPhaseEventIndex];
if (phaseEvent.ContainsKey(game.CurrentPhase))
{
game.Emit(Game.PhaseEvents[game.CurrentPhaseEventIndex][game.CurrentPhase], args);
}
}
catch (TriggerResultException e)
{
if (e.Status == TriggerResult.End)
{
}
}
catch (EndOfTurnException)
{
break;
}
game.CurrentPhaseEventIndex++;
if (game.CurrentPhaseEventIndex >= Game.PhaseEvents.Length || currentPlayer.IsDead)
{
game.CurrentPhaseEventIndex = 0;
game.CurrentPhase++;
if ((int)game.CurrentPhase >= Enum.GetValues(typeof(TurnPhase)).Length - 2 || (int)game.CurrentPhase < 0 || currentPlayer.IsDead)
{
break;
}
GameDelays.Delay(GameDelays.ChangePhase);
}
}
game.CurrentPhase = TurnPhase.Inactive;
Game.CurrentGame.Emit(GameEvent.PhasePostEnd, new GameEventArgs() { Source = currentPlayer });
if (game.Decks[null, DeckType.Compute].Count > 0)
{
game.PlaceIntoDiscard(null, new List<Card>(game.Decks[null, DeckType.Compute]));
}
}