示例#1
0
        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.");
        }