From 64c3512ee287dd3942f69f3c63b547cef646a757 Mon Sep 17 00:00:00 2001 From: Tejas Vasishta G R Date: Thu, 27 Feb 2025 00:56:11 +0530 Subject: [PATCH 1/4] Created IStatusEffect --- Pokemon/Header/Pokemon/IStatusEffect.hpp | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 Pokemon/Header/Pokemon/IStatusEffect.hpp diff --git a/Pokemon/Header/Pokemon/IStatusEffect.hpp b/Pokemon/Header/Pokemon/IStatusEffect.hpp new file mode 100644 index 00000000..7e239935 --- /dev/null +++ b/Pokemon/Header/Pokemon/IStatusEffect.hpp @@ -0,0 +1,23 @@ +#pragma once +#include"Pokemon.hpp" + +namespace N_Pokemon +{ + class IStatusEffect { + public: + // Apply the effect (e.g., poison, burn) + virtual void applyEffect(Pokemon* target) = 0; + + // Get the name of the effect + virtual std::string getEffectName() = 0; + + // Apply the changes due to effect after the end of each turn + // Returns true if the Pokémon can move, else false + virtual bool turnEndEffect(Pokemon* target) = 0; + + // Remove the effect + virtual void clearEffect(Pokemon* target) = 0; + + virtual ~IStatusEffect() = default; + }; +} From 1dee059c8ec39adcafbf75a41b72157700fd140d Mon Sep 17 00:00:00 2001 From: Tejas Vasishta G R Date: Thu, 27 Feb 2025 10:33:37 +0530 Subject: [PATCH 2/4] Implemented Interface --- Pokemon/Header/Pokemon/IStatusEffect.hpp | 23 -------- .../Pokemon/StatusEffects/IStatusEffect.hpp | 26 +++++++++ .../Pokemon/StatusEffects/ParalyzedEffect.hpp | 19 +++++++ Pokemon/Pokemon.vcxproj | 1 + Pokemon/Pokemon.vcxproj.filters | 3 ++ .../Pokemon/StatusEffects/ParalyzedEffect.cpp | 53 +++++++++++++++++++ 6 files changed, 102 insertions(+), 23 deletions(-) delete mode 100644 Pokemon/Header/Pokemon/IStatusEffect.hpp create mode 100644 Pokemon/Header/Pokemon/StatusEffects/IStatusEffect.hpp create mode 100644 Pokemon/Header/Pokemon/StatusEffects/ParalyzedEffect.hpp create mode 100644 Pokemon/Src/Pokemon/StatusEffects/ParalyzedEffect.cpp diff --git a/Pokemon/Header/Pokemon/IStatusEffect.hpp b/Pokemon/Header/Pokemon/IStatusEffect.hpp deleted file mode 100644 index 7e239935..00000000 --- a/Pokemon/Header/Pokemon/IStatusEffect.hpp +++ /dev/null @@ -1,23 +0,0 @@ -#pragma once -#include"Pokemon.hpp" - -namespace N_Pokemon -{ - class IStatusEffect { - public: - // Apply the effect (e.g., poison, burn) - virtual void applyEffect(Pokemon* target) = 0; - - // Get the name of the effect - virtual std::string getEffectName() = 0; - - // Apply the changes due to effect after the end of each turn - // Returns true if the Pokémon can move, else false - virtual bool turnEndEffect(Pokemon* target) = 0; - - // Remove the effect - virtual void clearEffect(Pokemon* target) = 0; - - virtual ~IStatusEffect() = default; - }; -} diff --git a/Pokemon/Header/Pokemon/StatusEffects/IStatusEffect.hpp b/Pokemon/Header/Pokemon/StatusEffects/IStatusEffect.hpp new file mode 100644 index 00000000..221940b4 --- /dev/null +++ b/Pokemon/Header/Pokemon/StatusEffects/IStatusEffect.hpp @@ -0,0 +1,26 @@ +#pragma once +#include"../Pokemon.hpp" + +namespace N_Pokemon +{ + namespace N_StatusEffects + { + class IStatusEffect { + public: + // Apply the effect (e.g., poison, burn) + virtual void applyEffect(Pokemon* target) = 0; + + // Get the name of the effect + virtual std::string getEffectName() = 0; + + // Apply the changes due to effect after the end of each turn + // Returns true if the Pokémon can move, else false + virtual bool turnEndEffect(Pokemon* target) = 0; + + // Remove the effect + virtual void clearEffect(Pokemon* target) = 0; + + virtual ~IStatusEffect() = default; + }; + } +} diff --git a/Pokemon/Header/Pokemon/StatusEffects/ParalyzedEffect.hpp b/Pokemon/Header/Pokemon/StatusEffects/ParalyzedEffect.hpp new file mode 100644 index 00000000..c47395cc --- /dev/null +++ b/Pokemon/Header/Pokemon/StatusEffects/ParalyzedEffect.hpp @@ -0,0 +1,19 @@ +#pragma once +#include "IStatusEffect.hpp" + +namespace N_Pokemon +{ + namespace N_StatusEffects + { + class ParalyzedEffect : public IStatusEffect + { + private: + int turnsLeft; // Track the remaining turns for the effect + public: + void applyEffect(Pokemon* target) override; + std::string getEffectName() override; + bool turnEndEffect(Pokemon* target) override; + void clearEffect(Pokemon* target) override; + }; + } +} diff --git a/Pokemon/Pokemon.vcxproj b/Pokemon/Pokemon.vcxproj index 2025189d..fb06f3ea 100644 --- a/Pokemon/Pokemon.vcxproj +++ b/Pokemon/Pokemon.vcxproj @@ -181,6 +181,7 @@ + diff --git a/Pokemon/Pokemon.vcxproj.filters b/Pokemon/Pokemon.vcxproj.filters index c78e9074..a46e3065 100644 --- a/Pokemon/Pokemon.vcxproj.filters +++ b/Pokemon/Pokemon.vcxproj.filters @@ -113,5 +113,8 @@ Header Files + + Header Files + \ No newline at end of file diff --git a/Pokemon/Src/Pokemon/StatusEffects/ParalyzedEffect.cpp b/Pokemon/Src/Pokemon/StatusEffects/ParalyzedEffect.cpp new file mode 100644 index 00000000..4665d081 --- /dev/null +++ b/Pokemon/Src/Pokemon/StatusEffects/ParalyzedEffect.cpp @@ -0,0 +1,53 @@ +#include "../../../Header/Pokemon/StatusEffects/ParalyzedEffect.hpp" +//#include "../../../Header/Pokemon/StatusEffects/StatusEffectType.hpp" +#include + +namespace N_Pokemon +{ + namespace N_StatusEffects + { + void ParalyzedEffect::applyEffect(Pokemon* target) + { + std::cout << target->getName() << " is paralyzed! It may not be able to move!\n"; + + // Effect lasts between 1 and 3 turns randomly + turnsLeft = rand() % 3 + 1; + } + + std::string ParalyzedEffect::getEffectName() + { + return "Paralyzed"; + } + + // Determines whether the Pokémon can act at the end of the turn + // Returns false if the paralysis prevents the Pokémon from moving + bool ParalyzedEffect::turnEndEffect(Pokemon* target) + { + if (turnsLeft <= 0) { + clearEffect(target); + return true; // Can move as the effect is cleared + } + turnsLeft--; + + // Generates a number between 0 and 3 + int paralysis_chance = rand() % 4; + + // 25% chance that the Pokémon cannot move due to paralysis + if (paralysis_chance == 0) + { + std::cout << target->getName() << " is paralyzed! It can't move!\n"; + return false; // Pokémon cannot act this turn + } + + // Otherwise, it can act normally + std::cout << target->getName() << " shakes off the paralysis momentarily and can move!\n"; + return true; // Pokémon can act this turn + } + + void ParalyzedEffect::clearEffect(Pokemon* target) + { + std::cout << target->getName() << " is no longer paralyzed!\n"; + target->clearEffect(); + } + } +} \ No newline at end of file From a18fe6482f26fcbbd9f21a60c7d7a157c575234a Mon Sep 17 00:00:00 2001 From: Tejas Vasishta G R Date: Fri, 28 Feb 2025 01:16:27 +0530 Subject: [PATCH 3/4] Implemented paralyze effect Implemented paralyze effect to pikachu's thundershock attack --- Pokemon/Header/Pokemon/Pokemon.hpp | 45 +++++++++++-------- .../StatusEffects/StatusEffectType.hpp | 15 +++++++ Pokemon/Src/Battle/BattleManager.cpp | 19 +++----- Pokemon/Src/Pokemon/Pokemon.cpp | 44 +++++++++++++++++- Pokemon/Src/Pokemon/Pokemons/Pikachu.cpp | 7 +++ .../Pokemon/StatusEffects/ParalyzedEffect.cpp | 2 +- 6 files changed, 98 insertions(+), 34 deletions(-) create mode 100644 Pokemon/Header/Pokemon/StatusEffects/StatusEffectType.hpp diff --git a/Pokemon/Header/Pokemon/Pokemon.hpp b/Pokemon/Header/Pokemon/Pokemon.hpp index d0b2c572..07edbd73 100644 --- a/Pokemon/Header/Pokemon/Pokemon.hpp +++ b/Pokemon/Header/Pokemon/Pokemon.hpp @@ -7,51 +7,58 @@ #include"../Pokemon/Move.hpp" #include"../Pokemon/PokemonType.hpp" #include"../Pokemon/PokemonChoice.hpp" +#include"StatusEffects/IStatusEffect.hpp" +#include"StatusEffects/StatusEffectType.hpp" +#include"StatusEffects/ParalyzedEffect.hpp" + using namespace std; struct Move; namespace N_Pokemon { + using namespace N_StatusEffects; class Pokemon { public: - - // Default constructor - Pokemon(); + //basic attributes + string name; + PokemonType type; + int health; + int maxHealth; + vector moves; + int attackBonus = 0; - // Parameterized constructor + //constructors + Pokemon(); Pokemon(std::string p_name, PokemonType p_type, int p_health, vector p_moves); - - // Copy constructor Pokemon(const Pokemon* other); + //destructor ~Pokemon(); + //battle methods virtual void attack(Move selectedMove, Pokemon* target) = 0; - void heal(); - void takeDamage(int damage); - bool isFainted() const; - //getters and setters + //getter and setter methods string getName(); - void setName(string _name); void selectAndUseMove(Pokemon* target); - void reduceAttackPower(int reducedDamage); + //status effect members + IStatusEffect* appliedEffect; + + bool canAttack(); + void applyEffect(StatusEffectType effectToApply); + void clearEffect(); + bool canApplyEffect(); + protected: - string name; - PokemonType type; - int health; - int maxHealth; - vector moves; - int attackBonus = 0; - + //Pokemon move methods void printAvailableMoves(); int selectMove(); void useMove(Move selectedMove, Pokemon* target); diff --git a/Pokemon/Header/Pokemon/StatusEffects/StatusEffectType.hpp b/Pokemon/Header/Pokemon/StatusEffects/StatusEffectType.hpp new file mode 100644 index 00000000..9235ccbc --- /dev/null +++ b/Pokemon/Header/Pokemon/StatusEffects/StatusEffectType.hpp @@ -0,0 +1,15 @@ +#pragma once + +namespace N_Pokemon +{ + namespace N_StatusEffects + { + enum class StatusEffectType + { + PARALYZED, + SLEEPING, + BURNED, + POISONED + }; + } +} diff --git a/Pokemon/Src/Battle/BattleManager.cpp b/Pokemon/Src/Battle/BattleManager.cpp index 870243e9..6eae9a28 100644 --- a/Pokemon/Src/Battle/BattleManager.cpp +++ b/Pokemon/Src/Battle/BattleManager.cpp @@ -18,26 +18,19 @@ namespace N_Battle } //className* ptrname; declaration //ptrname->name; - void BattleManager::battle() { - while (battleState.battleOngoing) { - if (battleState.playerTurn) { - // Player's turn to attack + void BattleManager::battle() + { + while (battleState.battleOngoing) + { + if (battleState.playerTurn && battleState.playerPokemon->canAttack()) battleState.playerPokemon->selectAndUseMove(battleState.wildPokemon); - } - else { - // Wild Pokémon's turn to attack + else if (battleState.wildPokemon->canAttack()) battleState.wildPokemon->selectAndUseMove(battleState.playerPokemon); - } - // Update the battle state after the turn updateBattleState(); - - // Switch turns battleState.playerTurn = !battleState.playerTurn; - Utility::waitForEnter(); } - handleBattleOutcome(); } diff --git a/Pokemon/Src/Pokemon/Pokemon.cpp b/Pokemon/Src/Pokemon/Pokemon.cpp index 51c5e912..6c02d636 100644 --- a/Pokemon/Src/Pokemon/Pokemon.cpp +++ b/Pokemon/Src/Pokemon/Pokemon.cpp @@ -7,8 +7,11 @@ using namespace std; using namespace N_Utility; + namespace N_Pokemon { + using namespace N_StatusEffects; + Pokemon::Pokemon() { name = "Unknown"; type = PokemonType::NORMAL; @@ -79,8 +82,43 @@ namespace N_Pokemon cout << target->name << " has " << target->health << " HP left.\n"; } + bool Pokemon::canAttack() + { + if (appliedEffect == nullptr) + return true; + else + return appliedEffect->turnEndEffect(this); + } - Pokemon::~Pokemon() { } + bool Pokemon::canApplyEffect() + { + return appliedEffect == nullptr; + } + + void Pokemon::applyEffect(StatusEffectType effectToApply) + { + switch (effectToApply) + { + case StatusEffectType::PARALYZED: + appliedEffect = new ParalyzedEffect(); + appliedEffect->applyEffect(this); + break; + default: + appliedEffect = nullptr; + } + } + + void Pokemon::clearEffect() { appliedEffect = nullptr; } + + void Pokemon::printAvailableMoves() + { + cout << name << "'s available moves:\n"; + + // List out all moves for the player to choose from + for (size_t i = 0; i < moves.size(); ++i) { + cout << i + 1 << ": " << moves[i].name << " (Power: " << moves[i].power << ")\n"; + } + } void Pokemon::attack(Move selectedMove, Pokemon* target) { target->takeDamage((selectedMove.power + attackBonus)); @@ -117,5 +155,9 @@ namespace N_Pokemon { attackBonus -= reducedDamage; } + + + + Pokemon::~Pokemon() { } } \ No newline at end of file diff --git a/Pokemon/Src/Pokemon/Pokemons/Pikachu.cpp b/Pokemon/Src/Pokemon/Pokemons/Pikachu.cpp index 809ca549..160a2810 100644 --- a/Pokemon/Src/Pokemon/Pokemons/Pikachu.cpp +++ b/Pokemon/Src/Pokemon/Pokemons/Pikachu.cpp @@ -25,7 +25,14 @@ namespace N_Pokemon { } else Pokemon::attack(selectedMove, target); + if (selectedMove.name == "THUNDER SHOCK") + { + + if (target->canApplyEffect()) + target->applyEffect(StatusEffectType::PARALYZED); + + } } } } \ No newline at end of file diff --git a/Pokemon/Src/Pokemon/StatusEffects/ParalyzedEffect.cpp b/Pokemon/Src/Pokemon/StatusEffects/ParalyzedEffect.cpp index 4665d081..d487d36c 100644 --- a/Pokemon/Src/Pokemon/StatusEffects/ParalyzedEffect.cpp +++ b/Pokemon/Src/Pokemon/StatusEffects/ParalyzedEffect.cpp @@ -1,5 +1,5 @@ #include "../../../Header/Pokemon/StatusEffects/ParalyzedEffect.hpp" -//#include "../../../Header/Pokemon/StatusEffects/StatusEffectType.hpp" +#include "../../../Header/Pokemon/StatusEffects/StatusEffectType.hpp" #include namespace N_Pokemon From 17eb1470999c7af3298eba98090fe759df845b64 Mon Sep 17 00:00:00 2001 From: Tejas Vasishta G R Date: Fri, 28 Feb 2025 03:13:58 +0530 Subject: [PATCH 4/4] final --- Pokemon/Pokemon.vcxproj | 5 ++++- Pokemon/Pokemon.vcxproj.filters | 11 ++++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/Pokemon/Pokemon.vcxproj b/Pokemon/Pokemon.vcxproj index fb06f3ea..9418fcab 100644 --- a/Pokemon/Pokemon.vcxproj +++ b/Pokemon/Pokemon.vcxproj @@ -166,6 +166,7 @@ + @@ -179,9 +180,10 @@ + - + @@ -193,6 +195,7 @@ + diff --git a/Pokemon/Pokemon.vcxproj.filters b/Pokemon/Pokemon.vcxproj.filters index a46e3065..a122e933 100644 --- a/Pokemon/Pokemon.vcxproj.filters +++ b/Pokemon/Pokemon.vcxproj.filters @@ -57,6 +57,9 @@ Source Files + + Source Files + @@ -113,7 +116,13 @@ Header Files - + + Header Files + + + Header Files + + Header Files