public void Start() { async Task LoopAsync() { try { // Handle any unresolved Initialization action - (ocean/beast) GameState.Phase = Phase.Init; await Spirit.ResolveActions(Spirit.Bind(GameState)); // !!! if this is here, why do we need to put it in the Spirit.Growth() method? Dictionary <int, IMemento <GameState> > savedGameStates = new Dictionary <int, IMemento <GameState> >(); while (true) { savedGameStates[GameState.RoundNumber] = GameState.SaveToMemento(); DateTime lastSaveTimeStamp = DateTime.Now; try { LogRound(); GameState.Phase = Phase.Growth; LogPhase(); await Spirit.DoGrowth(GameState); await Spirit.SelectAndPlayCardsFromHand(); GameState.Phase = Phase.Fast; LogPhase(); await Spirit.ResolveActions(Spirit.BindMyPower(GameState)); GameState.Phase = Phase.Invaders; LogPhase(); await InvaderPhase.ActAsync(GameState); GameState.Phase = Phase.Slow; LogPhase(); await Spirit.ResolveActions(Spirit.BindMyPower(GameState)); await GameState.TriggerTimePasses(); } catch (GameStateCommandException cmdEx) { if (cmdEx.Cmd is Rewind rewind && savedGameStates.ContainsKey(rewind.TargetRound)) { GameState.LoadFrom(savedGameStates[rewind.TargetRound]); foreach (int laterRounds in savedGameStates.Keys.Where(k => k > rewind.TargetRound).ToArray()) { savedGameStates.Remove(laterRounds); } } } } } catch (GameOverException gameOver) { this.GameState.Result = gameOver.Status; GameState.Log(gameOver.Status); } catch (Exception ex) { GameState.Log(new LogException(ex)); } } _ = LoopAsync(); }