diff --git a/src/Library/DamageCalculator.cs b/src/Library/DamageCalculator.cs index a4f3ce8..843b1f3 100644 --- a/src/Library/DamageCalculator.cs +++ b/src/Library/DamageCalculator.cs @@ -10,9 +10,15 @@ namespace Library; // Es una clase abstracta la cual nos permite evitar que el programa tenga interdependencias innecesarias (Aplicando DIP). public static class DamageCalculator { + /// + /// Proporciona el valor de efectividad de los ataques entre diferentes tipos de Pokémon. + /// + /// + /// Diccionario donde la clave es una tupla que representa el tipo del ataque y el tipo del Pokemon objetivo, + /// y el valor es un factor de efectividad (2.0 para súper efectivo, 0.5 para poco efectivo, 0.0 para sin efecto). + /// private static Dictionary, double> EffectivnessDataBase { - // Izquierda tipo del ataque, derecha tipo del pokemon atacado get { Type fire = Type.Fire; @@ -117,7 +123,16 @@ private static Dictionary, double> EffectivnessDataBase return effectivnessDataBase; } } - + + /// + /// Obtiene la efectividad de un ataque de un tipo específico contra el o los tipos de un Pokemon. + /// + /// El tipo del ataque. + /// Una lista de los tipos del Pokemon objetivo. + /// + /// Valor double indicando el factor de efectividad del ataque. + /// 2.0 para súper efectivo, 0.5 para poco efectivo, 0.0 si no tiene efecto, y 1.0 si no hay una relación específica. + /// public static double GetEffectivness(Type type, List types) { foreach (Type type1 in types) @@ -137,6 +152,13 @@ public static double GetEffectivness(Type type, List types) return 1.0; } + /// + /// Determina si un ataque resulta en un golpe crítico basado en una probabilidad aleatoria. + /// + /// + /// Un valor double: 1.20 si el ataque es crítico (10% de probabilidad), + /// o 1.0 si no es crítico. + /// public static double CriticalCheck() { Random random = new Random(); @@ -147,8 +169,16 @@ public static double CriticalCheck() } return 1.0; } - - public static void SpecialCheck(Pokemon attackedPokemon, IAttack attack) + /// + /// Aplica un efecto especial al Pokemon objetivo, siempre y cuando el ataque recibido sea especial y el Pokemon no tenga ya otro efecto. + /// + /// El Pokemon que recibe el ataque. + /// El ataque ejecutado. + /// + /// Si el ataque es un y el Pokemon objetivo no tiene un estado actual, + /// se aplica el efecto especial del ataque y se setea su cooldown. + /// + public static void SpecialCheck(Pokemon attackedPokemon, Attack attack) { if (attack is SpecialAttack specialAttack && attackedPokemon.CurrentState == null) { @@ -157,6 +187,16 @@ public static void SpecialCheck(Pokemon attackedPokemon, IAttack attack) } } + /// + /// Calcula el daño infligido a un Pokemon objetivo. Para esto tiene en cuenta el valor de ataque, la efectividad de tipos y + /// la probabilidad de golpe crítico, además de revisar si se trata de un ataque especial. + /// + /// El Pokemon que recibe el ataque. + /// El ataque que se está ejecutando. + /// + /// El daño calculado como un double. + /// Devuelve 0.0 si el ataque falla. + /// public static double CalculateDamage(Pokemon attackedPokemon, Attack attack) { Random random = new Random(); diff --git a/src/Library/Facade.cs b/src/Library/Facade.cs index 4da07b5..7991c65 100644 --- a/src/Library/Facade.cs +++ b/src/Library/Facade.cs @@ -1,11 +1,29 @@ namespace Library; + +/// +/// La clase Facade proporciona una interfaz simplificada para interactuar con el sistema de gestión de batallas Pokemon. +/// Incluye funcionalidades para gestionar listas de espera, partidas en curso, ataques, estados de juego, y mucho más. +/// public static class Facade { + /// + /// Lista de espera para jugadores que aún no están en una partida. + /// private static WaitingList WaitingList { get; } = new WaitingList(); - - private static GameList GameList { get; } = new GameList(); - + + /// + /// Lista de partidas en curso. + /// + public static GameList GameList{ get; } = new GameList(); + + /// + /// Historia 1: + /// Permite a un jugador agregar un Pokemon al equipo desde el catálogo. + /// + /// Nombre del jugador. + /// Nombre del Pokemon que se quiere añadir al equipo. + /// Mensaje indicando si el Pokemon fue añadido o si hubo un error. public static string ChooseTeam(string playerName, string cPokemon) { PokemonCatalogue.SetCatalogue(); @@ -36,25 +54,32 @@ public static string ChooseTeam(string playerName, string cPokemon) return "El equipo está incompleto, por favor elige 6 pokemones para poder comenzar la batalla"; } - - public static string ShowCatalogue() - { - PokemonCatalogue.SetCatalogue(); - return PokemonCatalogue.ShowCatalogue(); - } - - // historia de usuario 2 + + + /// + /// Historia de usuario 2: + /// Muestra los ataques disponibles del Pokemon activo de un jugador. + /// + /// Nombre del jugador activo. + /// Una lista de los ataques del Pokémon activo o un mensaje de error en + /// caso de que el jugador no exista. public static string ShowAtacks(string playerName) { - Player player = GameList.FindPlayerByName(playerName); if (player == null) return $"El jugador {playerName} no está en ninguna partida."; - + return player.GetPokemonAttacks(); } - - // historia de usuario 3 + + /// + /// Historia de usuario 3: + /// Muestra los puntos de vida (HP) de los Pokemon de un jugador. + /// + /// Nombre del jugador. + /// Nombre del jugador cuya lista de Pokemon se va a comprobar (opcional). Si es + /// null hace referencia al propio jugador. Si no, hace referencia a otro. + /// Una lista de los Pokemon y sus HP o un mensaje de error. public static string ShowPokemonsHP(string playerName, string playerToCheckName = null) { Player player = GameList.FindPlayerByName(playerName); @@ -84,7 +109,63 @@ public static string ShowPokemonsHP(string playerName, string playerToCheckName } } - //Historia de usuario 5 + /// + /// Historia de usuario 4: + /// Permite a un jugador elegir y ejecutar un ataque durante su turno en una partida. + /// + /// Nombre del jugador que realiza el ataque. + /// Nombre del ataque que se desea utilizar. + /// + /// Un mensaje que indica el resultado de la acción. + /// + public static string ChooseAttack(string playerName, string attackName) + { + Player player = GameList.FindPlayerByName(playerName); + if (player == null) + { + return "Para poder atacar necesitas estar en una batalla"; + } + + if (player.GetPokemonTeam().Count < 6) + { + return "El equipo está incompleto, por favor elige 6 pokemones para poder comenzar la batalla"; + } + + Attack attack = player.FindAttack(attackName); + if (attack == null) + { + return $"El ataque {attackName} no pudo ser encontrado"; + } + + Game actualGame = GameList.FindGameByPlayer(player); + if (actualGame == null) + { + return "Esa partida no está en curso"; + } + + foreach (Game game in GameList.GetGameList()) + { + if (game.GetPlayers().Contains(player)) + { + if (game.GetPlayers()[game.ActivePlayer].Name == player.Name) + { + string gameResult = game.ExecuteAttack(attack); + game.NextTurn(); + string nextTurn = CheckGameStatus(game); + return gameResult + nextTurn; + } + return "No eres el jugador activo"; + } + } + return "Error inesperado"; + } + + /// + /// Historia de usuario 5: + /// Comprueba si es el turno de un jugador y muestra las opciones disponibles. + /// + /// Nombre del jugador. + /// Mensaje indicando si es o no su turno, junto con las opciones. public static string CheckTurn(string playerName) { Player player = GameList.FindPlayerByName(playerName); @@ -110,9 +191,15 @@ public static string CheckTurn(string playerName) return null; } - - //Historia de usuario 6 - private static string CheckGameStatus(Game game) + + /// + /// Historia de usuario 6: + /// Comprueba el estado de una partida y determina si continúa o hay un ganador. + /// + /// La partida actual. + /// "Próximo turno" en caso de que la partida siga o un string conteniendo el + /// ganador y el perdedor. + public static string CheckGameStatus(Game game) { if (game != null) { @@ -127,8 +214,17 @@ private static string CheckGameStatus(Game game) return "La partida no pudo ser encontrada"; } - - //Historia de usuario 7 + + + /// + /// Historia de usuario 7: + /// Permite a un jugador activo cambiar su Pokemon actual durante su turno en una partida. + /// + /// Nombre del jugador que desea cambiar de Pokemon. + /// Nombre del Pokemon al que se desea cambiar. + /// + /// Un mensaje que indica el resultado de la acción. + /// public static string ChangePokemon(string playerName, string pokemonName) { Player player = GameList.FindPlayerByName(playerName); @@ -170,7 +266,14 @@ public static string ChangePokemon(string playerName, string pokemonName) return "No eres el jugador activo, no puedes realizar acciones"; } - //Historia de usuario 8 + /// + /// Historia de usuario 8 + /// Permite a un jugador usar un item en un Pokemon. + /// + /// Nombre del jugador. + /// Nombre del item a usar. + /// Nombre del Pokemon objetivo. + /// Resultado del uso del item. public static string UseAnItem(string playerName, string item, string pokemon) { Player player = GameList.FindPlayerByName(playerName); @@ -188,9 +291,14 @@ public static string UseAnItem(string playerName, string item, string pokemon) return game.UseItem(player.FindItem(item), player.FindPokemon(pokemon)); } - - - // historia de usuario 9 + + + /// + /// Historia de usuario 9: + /// Agrega un jugador a la lista de espera. + /// + /// Nombre del jugador. + /// Mensaje indicando si el jugador fue agregado o ya estaba en la lista. public static string AddPlayerToWaitingList(string playerName) { if (WaitingList.AddPlayer(playerName)) @@ -200,27 +308,51 @@ public static string AddPlayerToWaitingList(string playerName) return $"{playerName} ya está en la lista de espera"; } - + + /// + /// Historia de usuario 9.1: + /// Remueve un jugador de la lista de espera. + /// + /// Nombre del jugador. + /// Mensaje indicando si el jugador fue removido o no estaba en la lista. public static string RemovePlayerFromWaitingList(string playerName) { if (WaitingList.RemovePlayer(playerName)) return $"{playerName} removido de la lista de espera"; return $"{playerName} no está en la lista de espera"; } - - //historia de usuario 10 + + /// + /// Historia de usuario 10 + /// Muestra todos los jugadores actualmente en la lista de espera. + /// + /// Lista de jugadores en espera o un mensaje indicando que no hay nadie esperando. public static string GetAllPlayersWaiting() { if (WaitingList.Count == 0) + { return "No hay nadie esperando"; + } + string result = "Esperan: "; foreach (Player player in WaitingList.GetWaitingList()) + { result = result + player.Name + "; "; + } + return result; } - - //historia de usuario 11 - public static string CreateGame(string playerName, string opponentName) + + // + /// + /// Historia de usuario 11: + /// Crea una nueva partida entre dos jugadores, quitándolos de la lista de espera y agregando la partida a la lista de + /// juegos activos. + /// + /// Nombre del primer jugador. + /// Nombre del oponente. + /// Mensaje confirmando el inicio de la partida entre ambos jugadores. + private static string CreateGame(string playerName, string opponentName) { Player player = WaitingList.FindPlayerByName(playerName); Player opponent = WaitingList.FindPlayerByName(opponentName); @@ -229,7 +361,14 @@ public static string CreateGame(string playerName, string opponentName) GameList.AddGame(player, opponent); return $"Comienza {playerName} vs {opponentName}"; } - + + /// + /// Historia de usuario 11.1: + /// Inicia una batalla entre dos jugadores, eligiendo un oponente específico o con el primer oponente disponible. + /// + /// Nombre del jugador que inicia la batalla. + /// Nombre del oponente (opcional). + /// string indicando si la batalla comenzó o si hubo algún error. public static string StartBattle(string playerName, string opponentName) { Player opponent; @@ -264,47 +403,16 @@ bool OpponentFound() return opponent != null; } } - - //Historia 4 - public static string ChooseAttack(string playerName, string attackName) + + + /// + /// Muestra el catálogo de Pokemon disponibles. + /// + /// Lista de Pokemon en el catálogo. + public static string ShowCatalogue() { - Player player = GameList.FindPlayerByName(playerName); - if (player == null) - { - return "Para poder atacar necesitas estar en una batalla"; - } - - if (player.GetPokemonTeam().Count < 6) - { - return "El equipo está incompleto, por favor elige 6 pokemones para poder comenzar la batalla"; - } - - Attack attack = player.FindAttack(attackName); - if (attack == null) - { - return $"El ataque {attackName} no pudo ser encontrado"; - } - - Game actualGame = GameList.FindGameByPlayer(player); - if (actualGame == null) - { - return "Esa partida no está en curso"; - } - - foreach (Game game in GameList.GetGameList()) - { - if (game.GetPlayers().Contains(player)) - { - if (game.GetPlayers()[game.ActivePlayer].Name == player.Name) - { - string gameResult = game.ExecuteAttack(attack); - game.NextTurn(); - string nextTurn = CheckGameStatus(game); - return gameResult + nextTurn; - } - return "No eres el jugador activo"; - } - } - return "Error inesperado"; + PokemonCatalogue.SetCatalogue(); + return PokemonCatalogue.ShowCatalogue(); } + } \ No newline at end of file