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); }