diff --git a/src/Library/Attack.cs b/src/Library/Attack.cs index bc549d0..8e68137 100644 --- a/src/Library/Attack.cs +++ b/src/Library/Attack.cs @@ -58,7 +58,7 @@ public Attack(string name, Type type, double accuracy, int power) /// Genera una descripción formateada del ataque. /// Incluye el nombre, tipo, precisión y potencia del ataque. /// - public string InfoAttack() + public virtual string InfoAttack() { return $"**{this.Name}**: tipo *{this.Type}*, precisión *{this.Accuracy*100}*, potencia *{this.Power}*\n"; } diff --git a/src/Library/DamageCalculator.cs b/src/Library/DamageCalculator.cs index 33c3dc9..0074f99 100644 --- a/src/Library/DamageCalculator.cs +++ b/src/Library/DamageCalculator.cs @@ -193,6 +193,10 @@ public string SpecialCheck(Pokemon attackedPokemon, Attack attack) } return $"{attackedPokemon.Name} fue afectado con {specialAttack.SpecialEffect}\n"; } + if (attack is SpecialAttack specialAttack2) + { + specialAttack2.SetCooldown(); + } return""; } diff --git a/src/Library/Facade.cs b/src/Library/Facade.cs index a011581..0e4bd28 100644 --- a/src/Library/Facade.cs +++ b/src/Library/Facade.cs @@ -1,5 +1,4 @@ -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; + using Library.Strategies; namespace Library; @@ -14,12 +13,12 @@ public class Facade /// /// Lista de espera para jugadores que aún no están en una partida. /// - private WaitingList WaitingList { get; set; } = new WaitingList(); + private WaitingList WaitingList { get; set; } /// /// Lista de partidas en curso. /// - private GameList GameList { get; } = new GameList(); + private GameList GameList { get; } /// /// Catalogo de Pokemons. @@ -234,7 +233,7 @@ public string ChooseAttack(string playerName, string attackName) { string result = ""; result += game.ExecuteAttack(attack); - if (result.Contains("no se puede usar hasta que pasen")) + if (result.Contains("no se puede usar hasta que pasen", StringComparison.Ordinal)) {return result;} result += game.NextTurn(); result += CheckGameStatus(game); @@ -273,8 +272,7 @@ public string CheckTurn(string playerName) return $"{playerName}, no es tu turno"; } } - - return null; + return "No se encontró la partida."; } /// @@ -353,13 +351,14 @@ public string ChangePokemon(string playerName, string pokemonName) public string UseAnItem(string playerName, string item, string pokemon) { Player player = GameList.FindPlayerByName(playerName); - Game game = GameList.FindGameByPlayer(player); if (player == null) { return $"El jugador {playerName} no está en ninguna partida."; } - + + Game game = GameList.FindGameByPlayer(player); + if (game == null) { return "Partida inexistente."; @@ -440,7 +439,6 @@ public string GetAllPlayersWaiting() return result; } - // /// /// 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 @@ -448,6 +446,7 @@ public string GetAllPlayersWaiting() /// /// Nombre del primer jugador. /// Nombre del oponente. + /// Estrategia que determinara como se va a determinar que jugador tiene el primer turno /// Mensaje string confirmando el inicio de la partida entre ambos jugadores. private string CreateGame(string playerName, string opponentName, IStrategyStartingPlayer strategyStartingPlayer) { diff --git a/src/Library/Game.cs b/src/Library/Game.cs index 515d6bd..5c6b403 100644 --- a/src/Library/Game.cs +++ b/src/Library/Game.cs @@ -22,15 +22,22 @@ public class Game /// public int TurnCount { get; private set; } - public IStrategyStartingPlayer StrategyStartingPlayer { get; set; } + /// + /// Estrategia que determina de que jugador es el primer turno + /// + public IStrategyStartingPlayer StrategyStartingPlayer { get; } - private DamageCalculator GameDamageCalculator { get; set; } = new DamageCalculator(); + /// + /// Calculadora de daño, encargada de realizar los cálculos de daño. + /// + private DamageCalculator GameDamageCalculator { get; } = new DamageCalculator(); /// - /// Constructor de la clase. Agrega a los jugadores a la partida y determina de forma aleatoria cual comienza la partida. Inicializa el contador de turnos en 0. + /// Constructor de la clase. Agrega a los jugadores a la partida y según su estrategia determinará cuál de los jugadores tiene el primer turno. Inicializa el contador de turnos en 0. /// /// Primer jugador. /// Segundo jugador. + /// Estrategia que determinara como se va a determinar que jugador tiene el primer turno public Game(Player player1, Player player2, IStrategyStartingPlayer strategyStartingPlayer) { this.Players.Add(player1); @@ -121,6 +128,10 @@ public void CooldownCheck() } } + /// + /// Método que se encarga de verificar si los pokemones de los jugadores tienen los estados Burned (Quemado) o Poisoned (Envenenado ) + /// + /// string indicando public string SpecialEffectExecute() { string result = ""; @@ -137,14 +148,13 @@ public string SpecialEffectExecute() player.ActivePokemon.EditState(null); if (player.SetActivePokemon()) { - return result += $"El {pokemon.Name} de {player.Name} perdió {(int)(lifeBeforeBurnedEffect-pokemon.CurrentLife)}HP por estar {State.Burned}.\n" + $"PERECIÓ :'( \n\n{player.ActivePokemon.Name} es el nuevo Pokemon activo de {player.Name}\n";; + return $"El {pokemon.Name} de {player.Name} perdió {(int)(lifeBeforeBurnedEffect-pokemon.CurrentLife)}HP por estar {State.Burned}.\n" + $"PERECIÓ :'( \n\n{player.ActivePokemon.Name} es el nuevo Pokemon activo de {player.Name}\n"; } - return result += $"El {pokemon.Name} de {player.Name} perdió {(int)(lifeBeforeBurnedEffect - pokemon.CurrentLife)}HP por estar {State.Burned}.\n" + "PERECIÓ :'( \n"; + return $"El {pokemon.Name} de {player.Name} perdió {(int)(lifeBeforeBurnedEffect - pokemon.CurrentLife)}HP por estar {State.Burned}.\n" + "PERECIÓ :'( \n"; } - return result += - $"El {pokemon.Name} de {player.Name} perdió {(int)(lifeBeforeBurnedEffect - pokemon.CurrentLife)}HP por estar {State.Burned}.\n"; + return $"El {pokemon.Name} de {player.Name} perdió {(int)(lifeBeforeBurnedEffect - pokemon.CurrentLife)}HP por estar {State.Burned}.\n"; } if (pokemon.CurrentState == State.Poisoned) @@ -156,12 +166,12 @@ public string SpecialEffectExecute() Players[ActivePlayer].ActivePokemon.EditState(null); if (Players[ActivePlayer].SetActivePokemon()) { - return result += $"El {pokemon.Name} de {player.Name} perdió {(int)(lifeBeforePoisonedEffect-pokemon.CurrentLife)}HP por estar {State.Poisoned}.\n" + $"PERECIÓ :'( \n\n {player.ActivePokemon.Name} es el nuevo Pokemon activo de {player.Name}\n";; + return $"El {pokemon.Name} de {player.Name} perdió {(int)(lifeBeforePoisonedEffect-pokemon.CurrentLife)}HP por estar {State.Poisoned}.\n" + $"PERECIÓ :'( \n\n {player.ActivePokemon.Name} es el nuevo Pokemon activo de {player.Name}\n"; } - return result += $"El {pokemon.Name} de {player.Name} perdió {(int)(lifeBeforePoisonedEffect - pokemon.CurrentLife)}HP por estar {State.Poisoned}.\n" + "PERECIÓ :'( \n"; + return $"El {pokemon.Name} de {player.Name} perdió {(int)(lifeBeforePoisonedEffect - pokemon.CurrentLife)}HP por estar {State.Poisoned}.\n" + "PERECIÓ :'( \n"; } - return result += $"El {pokemon.Name} de {player.Name} perdió {(int)(lifeBeforePoisonedEffect - pokemon.CurrentLife)}HP por estar {State.Poisoned}.\n"; + return $"El {pokemon.Name} de {player.Name} perdió {(int)(lifeBeforePoisonedEffect - pokemon.CurrentLife)}HP por estar {State.Poisoned}.\n"; } } } @@ -246,7 +256,7 @@ public string UseItem(IItem? item, Pokemon? pokemon) } string message = item.Use(pokemon); - if (message.Contains("éxito")) + if (message.Contains("éxito", StringComparison.Ordinal)) { player.GetItemList().Remove(item); } @@ -289,7 +299,7 @@ public string ChangePokemon(Pokemon? pokemon) /// /// El jugador a buscar /// true si lo encontró, false en caso contrario - public bool CheckPlayerInGame(Player checkPlayer) + public bool CheckPlayerInGame(Player? checkPlayer) { if (checkPlayer != null) { diff --git a/src/Library/GameList.cs b/src/Library/GameList.cs index b45bc4d..deb42a6 100644 --- a/src/Library/GameList.cs +++ b/src/Library/GameList.cs @@ -16,6 +16,7 @@ public class GameList /// /// Jugador 1. /// Jugador 2. + /// Estrategia que determinara como se va a determinar que jugador tiene el primer turno. /// La partida agregada. public Game AddGame(Player player1, Player player2, IStrategyStartingPlayer strategyStartingPlayer) { diff --git a/src/Library/Library.xml b/src/Library/Library.xml index 23f8c5a..cbdde11 100644 --- a/src/Library/Library.xml +++ b/src/Library/Library.xml @@ -7,6 +7,7 @@ Esta clase representa un ataque básico que puede aprender el pokémon. + Implementa la interfaz . @@ -309,6 +310,12 @@ jugadores esperando para jugar. + + + Es una clase a la cual le delegamos la función de calcular el daño para aplicar SRP así game tiene una única responsabilidad + Es la clase Experta al momento de calcular daño + + Proporciona el valor de efectividad de los ataques entre diferentes tipos de Pokemon. @@ -318,6 +325,11 @@ y el valor es un factor de efectividad (2.0 para súperefectivo, 0.5 para poco efectivo, 0.0 para sin efecto). + + + Contstructor de la clase DamageCalculator. Aplica el patrón Grasp Creator al asignar una estrategia predefinida. + + Obtiene la efectividad de un ataque de un tipo específico contra el o los tipos de un Pokemon. @@ -361,6 +373,12 @@ Devuelve 0.0 si el ataque falla. + + + Asigna una estrategia para el cálculo de daño crítico. + + Estrategia a asignar + Esta clase representa el Pokemon Dragonite. @@ -397,7 +415,7 @@ - Esta clase representa la fachada, la cual tiene los métodos escenciales para el funcionamiento del chatbot + Esta clase representa la fachada, la cual tiene los métodos escenciales para el funcionamiento del chatbot. Esta clase es un singleton. @@ -417,7 +435,7 @@ - Crea una nueva instancia de Fachada si aún no existe. Implementando así el patrón singleton + Crea una nueva instancia de la clase Fachada si aún no existe. Implementando así el patrón singleton @@ -540,6 +558,7 @@ Nombre del primer jugador. Nombre del oponente. + Estrategia que determinara como se va a determinar que jugador tiene el primer turno Mensaje string confirmando el inicio de la partida entre ambos jugadores. @@ -582,7 +601,7 @@ - + Este método se encarga de cambiar la estrategia asignada en la calculadora de daño. Se utiliza solo para tests Nombre del jugador La estrategia que determinará el cálculo de daño crítico de la calculadora @@ -631,12 +650,23 @@ Obtiene la cantidad de turnos que lleva la partida. + + + Estrategia que determina de que jugador es el primer turno + + + + + Calculadora de daño, encargada de realizar los cálculos de daño. + + - Constructor de la clase. Agrega a los jugadores a la partida y determina de forma aleatoria cual comienza la partida. Inicializa el contador de turnos en 0. + Constructor de la clase. Agrega a los jugadores a la partida y según su estrategia determinará cuál de los jugadores tiene el primer turno. Inicializa el contador de turnos en 0. Primer jugador. Segundo jugador. + Estrategia que determinara como se va a determinar que jugador tiene el primer turno @@ -667,6 +697,12 @@ Reduce el tiempo de enfriamiento (cooldown) de todos los ataques especiales de cada Pokemon en los equipos de los jugadores. + + + Método que se encarga de verificar si los pokemones de los jugadores tienen los estados Burned (Quemado) o Poisoned (Envenenado ) + + string indicando + Avanza al siguiente turno del juego. Actualiza el contador de turnos, reduce el cooldown de los ataques especiales @@ -737,6 +773,7 @@ Jugador 1. Jugador 2. + Estrategia que determinara como se va a determinar que jugador tiene el primer turno. La partida agregada. @@ -799,6 +836,12 @@ Constructor de Gengar, implementa el patron GRASP creator. + + + Este método retorna una copia del pokemon aplicando así, el patrón prototype. + + Pokemon del subtipo Gengar + Esta clase representa el Pokemon Haxorus. @@ -810,6 +853,29 @@ Constructor de Haxorus, implementa el patron GRASP creator. + + + Este método retorna una copia del pokemon aplicando así, el patrón prototype. + + Pokemon del subtipo Haxorus + + + + Esta clase representa el Pokemon Hydreigon. + Al ser un Pokemon hereda de la clase . + + + + + Constructor de Hydreigon, implementa el patron GRASP creator. + + + + + Este método retorna una copia del pokemon aplicando así, el patrón prototype. + + Pokemon del subtipo Hydreigon + Interfaz de Ataque. Creada para subir la cohesión y bajar el acoplamiento. @@ -863,6 +929,12 @@ Constructor de Jigglypuff, implementa el patron GRASP creator. + + + Este método retorna una copia del pokemon aplicando así, el patrón prototype. + + Pokemon del subtipo Jigglypuff + Esta clase representa el Pokemon Mewtwo. @@ -874,6 +946,12 @@ Constructor de Mewtwo, implementa el patron GRASP creator. + + + Este método retorna una copia del pokemon aplicando así, el patrón prototype. + + Pokemon del subtipo Mewtwo + Esta clase representa el Pokemon Pikachu. @@ -885,6 +963,12 @@ Constructor de Pikachu, implementa el patron GRASP creator. + + + Este método retorna una copia del pokemon aplicando así, el patrón prototype. + + Pokemon del subtipo Pikachu + Esta clase representa un jugador. @@ -1112,7 +1196,7 @@ - Método abstracto para obtener una nueva instancia del Pokemon deseado. + Método abstracto para obtener una nueva instancia del Pokemon deseado. Aplicando así el patrón prototype @@ -1186,6 +1270,12 @@ Constructor de Scyther, implementa el patron GRASP creator. + + + Este método retorna una copia del pokemon aplicando así, el patrón prototype. + + Pokemon del subtipo Scyther + Esta clase representa un ataque especial. @@ -1219,7 +1309,7 @@ - Le asigna 2 a el contador de turnos que se deben esperar para usar el ataque. + Le asigna 2 al contador de turnos que se deben esperar para usar el ataque. @@ -1233,6 +1323,26 @@ Representa los estados negativos que puede tener un Pokemon. + + + Estado dormido + + + + + Estado paralizado + + + + + Estado envenenado + + + + + Estado Quemado + + Esta clase representa la lógia de los estados del Pokemon. @@ -1405,6 +1515,81 @@ Representa los tipos. + + + Tipo bicho + + + + + Tipo dragón + + + + + Tipo eléctrico + + + + + Tipo lucha + + + + + Tipo fuego + + + + + Tipo volador + + + + + Tipo ghost + + + + + Tipo grass + + + + + Tipo ground + + + + + Tipo ice + + + + + Tipo normal + + + + + Tipo veneno + + + + + Tipo Psíquico + + + + + Tipo roca + + + + + Tipo agua + + Esta clase representa la lista de espera. @@ -1469,6 +1654,12 @@ Constructor de Zeraora, implementa el patron GRASP creator. + + + Este método retorna una copia del pokemon aplicando así, el patrón prototype. + + Pokemon del subtipo Hydreigon + Esta clase implementa el bot de Discord. diff --git a/src/Library/SpecialAttack.cs b/src/Library/SpecialAttack.cs index 4d11cd3..77dccf9 100644 --- a/src/Library/SpecialAttack.cs +++ b/src/Library/SpecialAttack.cs @@ -53,7 +53,7 @@ public void SetCooldown() /// Genera una descripción formateada del ataque. /// Incluye el nombre, tipo, precisión, potencia del ataque, efecto especial y cooldown. /// - public string InfoAttack() + public override string InfoAttack() { return $"**{this.Name}**: tipo *{this.Type}*, precisión *{this.Accuracy*100}*, potencia *{this.Power}*, efecto especial *{this.SpecialEffect}*, cooldown de uso actual *{this.Cooldown}*\n"; } diff --git a/src/Library/State.cs b/src/Library/State.cs index 484a08b..57fa920 100644 --- a/src/Library/State.cs +++ b/src/Library/State.cs @@ -5,8 +5,20 @@ namespace Library; /// public enum State { + /// + /// Estado dormido + /// Asleep, + /// + /// Estado paralizado + /// Paralized, + /// + /// Estado envenenado + /// Poisoned, + /// + /// Estado Quemado + /// Burned } \ No newline at end of file diff --git a/src/Library/Type.cs b/src/Library/Type.cs index a06fea2..8850c1f 100644 --- a/src/Library/Type.cs +++ b/src/Library/Type.cs @@ -5,19 +5,64 @@ namespace Library; /// public enum Type { + /// + /// Tipo bicho + /// Bug, + /// + /// Tipo dragón + /// Dragon, + /// + /// Tipo eléctrico + /// Electric, + /// + /// Tipo lucha + /// Fighting, + /// + /// Tipo fuego + /// Fire, + /// + /// Tipo volador + /// Flying, + /// + /// Tipo ghost + /// Ghost, + /// + /// Tipo grass + /// Grass, + /// + /// Tipo ground + /// Ground, + /// + /// Tipo ice + /// Ice, + /// + /// Tipo normal + /// Normal, + /// + /// Tipo veneno + /// Poison, + /// + /// Tipo Psíquico + /// Psychic, + /// + /// Tipo roca + /// Rock, + /// + /// Tipo agua + /// Water } \ No newline at end of file diff --git a/test/LibraryTests/DragoniteTest.cs b/test/LibraryTests/DragoniteTest.cs index 742d095..b0ba2ae 100644 --- a/test/LibraryTests/DragoniteTest.cs +++ b/test/LibraryTests/DragoniteTest.cs @@ -154,14 +154,14 @@ public void TestAttacks() Assert.That(attack3Accuracy.Equals(attack3ExcpectedAccuracy)); Assert.That(attack3Power.Equals(attack3ExcpectedPower)); - if (attack2 is SpecialAttack specialAttack2) + if (attack3 is SpecialAttack specialAttack3) { - State sAttack2SpecialEffect = specialAttack2.SpecialEffect; - int sAttack2Cooldown = specialAttack2.Cooldown; - State attack2ExcpectedSpecialEffect = State.Paralized; + State sAttack3SpecialEffect = specialAttack3.SpecialEffect; + int sAttack3Cooldown = specialAttack3.Cooldown; + State attack3ExcpectedSpecialEffect = State.Paralized; int attack2ExcpectedCooldown = 0; - Assert.That(sAttack2SpecialEffect.Equals(attack2ExcpectedSpecialEffect)); - Assert.That(sAttack2Cooldown.Equals(attack2ExcpectedCooldown)); + Assert.That(sAttack3SpecialEffect.Equals(attack3ExcpectedSpecialEffect)); + Assert.That(sAttack3Cooldown.Equals(attack2ExcpectedCooldown)); } diff --git a/test/LibraryTests/LibraryTests.xml b/test/LibraryTests/LibraryTests.xml index c6652b7..270c6c1 100644 --- a/test/LibraryTests/LibraryTests.xml +++ b/test/LibraryTests/LibraryTests.xml @@ -84,6 +84,11 @@ Test de los métodos RestoreBaseLife, TakeDamage y GetLife + + + Test del método Instance + + Test de la clase @@ -134,6 +139,11 @@ Test de los métodos RestoreBaseLife, TakeDamage y GetLife + + + Test del método Instance + + Test de la clase @@ -184,6 +194,11 @@ Test de los métodos RestoreBaseLife, TakeDamage y GetLife + + + Test del método Instance + + Test de la clase @@ -234,6 +249,11 @@ Test de los métodos RestoreBaseLife, TakeDamage y GetLife + + + Test del método Instance + + Test de la clase @@ -284,6 +304,11 @@ Test de los métodos RestoreBaseLife, TakeDamage y GetLife + + + Test del método Instance + + Tests de la clase @@ -566,6 +591,11 @@ Test de los métodos RestoreBaseLife, TakeDamage y GetLife + + + Test del método Instance + + Test de la clase @@ -616,6 +646,11 @@ Test de los métodos RestoreBaseLife, TakeDamage y GetLife + + + Test del método Instance + + Test de la clase @@ -666,6 +701,11 @@ Test de los métodos RestoreBaseLife, TakeDamage y GetLife + + + Test del método Instance + + Test de la clase @@ -716,6 +756,11 @@ Test de los métodos RestoreBaseLife, TakeDamage y GetLife + + + Test del método Instance + + Test de la clase @@ -766,6 +811,11 @@ Test de los métodos RestoreBaseLife, TakeDamage y GetLife + + + Test del método Instance + + Test de la clase @@ -950,5 +1000,10 @@ Test de los métodos RestoreBaseLife, TakeDamage y GetLife + + + Test del método Instance + +