public void Run() { ConsoleKeyInfo key; bool isRunning = true; bool rerenderFlag = true; do { if (rerenderFlag) { switch (_currentState) { case GameState.World: _gameScreen.Render(); break; case GameState.Inventory: break; case GameState.Stats: _statScreen.Render(); break; case GameState.Fight: _fightScreen.Render(); break; case GameState.GameOver: Console.Clear(); _gameLog.Render(); Console.WriteLine("Press any key to exit."); break; } rerenderFlag = false; } // In case of a fight, don't ask for the key, if we are waiting for someone else's turn. if (_currentState == GameState.Fight && !_fightScreen.Manual) { key = new ConsoleKeyInfo(); } else { key = Console.ReadKey(intercept: true); } switch (_currentState) { case GameState.World: { var processResult = _gameScreen.ProcessInput(key.Key); rerenderFlag = processResult.RerenderFlag; if (processResult.SwitchState != null) { _currentState = processResult.SwitchState.Value; } if (_currentState == GameState.Fight) { var fightChars = new List <FightCharacter> { new FightCharacter(_currentCharacter, FightCharacterFaction.Player) }; fightChars.AddRange( _currentCharacter.CurrentScene.Characters .Except(new [] { _currentCharacter }) .Select(c => new FightCharacter(c, FightCharacterFaction.Enemy)) ); _fightScreen = new FightScreen(new Fight(fightChars), _gameLog, _currentCharacter); } break; } case GameState.Inventory: break; case GameState.Stats: { var processResult = _statScreen.ProcessInput(key.Key); rerenderFlag = processResult.RerenderFlag; if (processResult.SwitchState != null) { _currentState = processResult.SwitchState.Value; } _statScreen.Update(); break; } case GameState.Fight: { var processResult = _fightScreen.ProcessInput(key.Key); rerenderFlag = processResult.RerenderFlag; if (processResult.SwitchState != null) { _currentState = processResult.SwitchState.Value; } break; } case GameState.GameOver: { isRunning = false; break; } } }while (key.Key != KeyMapping.ExitGame && isRunning); Console.Clear(); Console.WriteLine("You have left the game."); }