예제 #1
0
        public override Screen Open()
        {
            if (IsDisposed)
            {
                return(null);
            }

            if (State.Enemy == null)
            {
                IsDisposed = true;
                return(new EndGameScreen(true));
            }

            Console.Clear();

            GuiHelper.PlayerStatus(State.Player);
            Console.WriteLine();

            var player = State.Player;

            if (State.EnemyFound)
            {
                GuiHelper.Warning("Você encontrou o inimigo!");
                Console.WriteLine();
            }
            else if (player.Room.IsAdjacent(State.Enemy?.Room))
            {
                GuiHelper.Warning("Você sente a presença do inimigo, ele está por perto! Tome cuidado!");
                Console.WriteLine();
            }

            GetAvailableActions(out List <string> actions, out List <string> options);
            GuiHelper.Menu("Lista de ações possíveis", options);

            Console.WriteLine();

            Console.Write("Selecione uma ação: ");

            var action = Console.ReadLine()?.ToLower();

            if (!actions?.Contains(action) ?? true)
            {
                Console.WriteLine();
                Console.WriteLine("Essa ação não é válida, tente outra...");
                Console.ReadKey();

                return(null);
            }

            switch (action)
            {
            case "inventory":
            case "i":
                return(new InventoryScreen(State));

            case "search":
            case "h":
                return(new SearchRoomScreen(player, player.Room));

            case "north":
            case "n":
                State.NextRoom = State.CurrentMap.Rooms[player.Room.North];
                break;

            case "south":
            case "s":
                State.NextRoom = State.CurrentMap.Rooms[player.Room.South];
                break;

            case "east":
            case "e":
                State.NextRoom = State.CurrentMap.Rooms[player.Room.East];
                break;

            case "west":
            case "w":
                State.NextRoom = State.CurrentMap.Rooms[player.Room.West];
                break;

            case "save":
            case "v":
                Console.WriteLine();

                if (FileHelper.SaveGame(GameSave.From(State)))
                {
                    Console.WriteLine("Jogo salvo com sucesso!");
                }
                else
                {
                    Console.WriteLine("Não foi possível salvar o seu jogo, tente novamente.");
                }

                Console.WriteLine();
                Console.Write("Pressione qualquer tecla para continuar...");
                Console.ReadKey();
                break;

            case "exit":
            case "x":
                IsDisposed = LeaveGame();
                break;

            default:
                Console.WriteLine();
                Console.WriteLine("Essa ação não é válida, tente outra...");
                Console.ReadKey();
                break;
            }

            if (State.NextRoom != null)
            {
                if (State.NextRoom.IsLocked)
                {
                    return(new LockedRoomScreen(State));
                }

                // Se o jogador estava com o inimigo, toma dano
                if (State.EnemyFound)
                {
                    State.Player.TakeDamage(State.Enemy.Power);

                    Console.WriteLine();
                    Console.WriteLine($"Você tomou {State.Enemy.Power} de dano do inimigo...");
                    Console.ReadKey();

                    if (State.Player.IsDead)
                    {
                        IsDisposed = true;
                        return(new EndGameScreen(false));
                    }
                }

                // Move o jogador para a nova posição
                player.MoveTo(State.NextRoom);
                State.NextRoom = null;

                // Move o inimigo em direção ao jogador, se puder
                if (State.CanMoveEnemy)
                {
                    var nextEnemyRoom = RouteHelper.FindNextRoom(State.CurrentMap, State.Enemy.Room, State.Player.Room);
                    if (nextEnemyRoom != null)
                    {
                        State.Enemy.MoveTo(nextEnemyRoom);
                    }
                    else
                    {
                        State.Enemy.MoveToRandom(State.CurrentMap);
                    }
                }

                State.CanMoveEnemy = !State.CanMoveEnemy;
            }

            return(null);
        }