From 4c30e98f4a4018a25d3a9f3ee790d589be803cb0 Mon Sep 17 00:00:00 2001 From: Charles Cabergs Date: Fri, 13 Nov 2020 14:43:17 +0100 Subject: Added main for cpp04/ex01 and cpp04/ex02, Fixed cpp04/03 MateriaSource --- cpp04/ex01/Character.cpp | 6 +- cpp04/ex01/Character.hpp | 2 +- cpp04/ex01/RadScorpion.hpp | 4 +- cpp04/ex01/SuperMutant.cpp | 4 +- cpp04/ex01/SuperMutant.hpp | 4 +- cpp04/ex01/main.cpp | 178 ++++++++++++++++++++++++++++++++++++++- cpp04/ex02/AssaultTerminator.cpp | 11 ++- cpp04/ex02/AssaultTerminator.hpp | 10 +-- cpp04/ex02/Squad.cpp | 8 +- cpp04/ex02/Squad.hpp | 10 +-- cpp04/ex02/TacticalMarine.cpp | 11 ++- cpp04/ex02/TacticalMarine.hpp | 10 +-- cpp04/ex02/main.cpp | 116 ++++++++++++++++++++++--- cpp04/ex03/AMateria.cpp | 20 ++--- cpp04/ex03/AMateria.hpp | 11 +-- cpp04/ex03/Character.cpp | 24 +++--- cpp04/ex03/Character.hpp | 8 +- cpp04/ex03/Cure.cpp | 3 +- cpp04/ex03/Cure.hpp | 4 +- cpp04/ex03/ICharacter.hpp | 9 +- cpp04/ex03/IMateriaSource.hpp | 2 +- cpp04/ex03/Ice.cpp | 4 +- cpp04/ex03/Ice.hpp | 4 +- cpp04/ex03/MateriaSource.cpp | 28 ++++-- cpp04/ex03/MateriaSource.hpp | 8 +- cpp04/ex03/main.cpp | 2 +- 26 files changed, 400 insertions(+), 101 deletions(-) (limited to 'cpp04') diff --git a/cpp04/ex01/Character.cpp b/cpp04/ex01/Character.cpp index 5f865c7..0952738 100644 --- a/cpp04/ex01/Character.cpp +++ b/cpp04/ex01/Character.cpp @@ -6,7 +6,7 @@ /* By: charles +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/04/14 13:44:35 by charles #+# #+# */ -/* Updated: 2020/11/12 14:28:26 by cacharle ### ########.fr */ +/* Updated: 2020/11/13 11:51:31 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ @@ -41,7 +41,7 @@ void Character::equip(AWeapon *weapon) void Character::attack(Enemy *enemy) { - if (m_weapon == NULL || m_ap < m_weapon->getAPCost()) + if (enemy == NULL || m_weapon == NULL || m_ap < m_weapon->getAPCost()) return; std::cout << m_name << " attacks " << enemy->getType() << " with a " << m_weapon->getName() << std::endl; m_weapon->attack(); @@ -49,6 +49,8 @@ void Character::attack(Enemy *enemy) if (enemy->getHP() <= 0) delete enemy; m_ap -= m_weapon->getAPCost(); + if (m_ap < 0) + m_ap = 0; } std::string const& Character::getName() const { return m_name; } diff --git a/cpp04/ex01/Character.hpp b/cpp04/ex01/Character.hpp index 817fd53..08f1b59 100644 --- a/cpp04/ex01/Character.hpp +++ b/cpp04/ex01/Character.hpp @@ -6,7 +6,7 @@ /* By: charles +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/04/14 13:42:25 by charles #+# #+# */ -/* Updated: 2020/11/12 13:56:59 by cacharle ### ########.fr */ +/* Updated: 2020/11/13 11:14:03 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/cpp04/ex01/RadScorpion.hpp b/cpp04/ex01/RadScorpion.hpp index f07891e..70bac44 100644 --- a/cpp04/ex01/RadScorpion.hpp +++ b/cpp04/ex01/RadScorpion.hpp @@ -6,7 +6,7 @@ /* By: charles +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/04/14 13:35:04 by charles #+# #+# */ -/* Updated: 2020/11/12 14:24:38 by cacharle ### ########.fr */ +/* Updated: 2020/11/13 11:41:55 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ @@ -22,7 +22,7 @@ public: RadScorpion(); RadScorpion(RadScorpion const& other); RadScorpion& operator=(RadScorpion const& other); - ~RadScorpion(); + virtual ~RadScorpion(); private: }; diff --git a/cpp04/ex01/SuperMutant.cpp b/cpp04/ex01/SuperMutant.cpp index c9ce83c..8813217 100644 --- a/cpp04/ex01/SuperMutant.cpp +++ b/cpp04/ex01/SuperMutant.cpp @@ -6,7 +6,7 @@ /* By: charles +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/04/14 13:30:47 by charles #+# #+# */ -/* Updated: 2020/11/12 13:54:19 by cacharle ### ########.fr */ +/* Updated: 2020/11/13 10:35:24 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ @@ -35,5 +35,7 @@ SuperMutant::~SuperMutant() void SuperMutant::takeDamage(int amount) { + if (amount < 0) + amount = 3; Enemy::takeDamage(amount - 3); } diff --git a/cpp04/ex01/SuperMutant.hpp b/cpp04/ex01/SuperMutant.hpp index 64198de..4170a18 100644 --- a/cpp04/ex01/SuperMutant.hpp +++ b/cpp04/ex01/SuperMutant.hpp @@ -6,7 +6,7 @@ /* By: charles +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/04/14 13:29:53 by charles #+# #+# */ -/* Updated: 2020/11/12 13:50:54 by cacharle ### ########.fr */ +/* Updated: 2020/11/13 11:42:08 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ @@ -22,7 +22,7 @@ public: SuperMutant(); SuperMutant(SuperMutant const& other); SuperMutant& operator=(SuperMutant const& other); - ~SuperMutant(); + virtual ~SuperMutant(); virtual void takeDamage(int amount); diff --git a/cpp04/ex01/main.cpp b/cpp04/ex01/main.cpp index ca5b35e..5b907bd 100644 --- a/cpp04/ex01/main.cpp +++ b/cpp04/ex01/main.cpp @@ -6,19 +6,22 @@ /* By: charles +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/04/14 09:05:58 by charles #+# #+# */ -/* Updated: 2020/11/12 14:36:49 by cacharle ### ########.fr */ +/* Updated: 2020/11/13 12:00:52 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ +#include #include "Character.hpp" +#include "Enemy.hpp" #include "RadScorpion.hpp" +#include "SuperMutant.hpp" #include "PlasmaRifle.hpp" #include "PowerFist.hpp" int main() { { - std::cout << "================ SUBJECT MAIN =====================" << std::endl; + std::cout << "================ SUBJECT MAIN =====================" << std::endl; Character* me = new Character("me"); std::cout << *me; Enemy* b = new RadScorpion(); @@ -36,7 +39,6 @@ int main() me->attack(b); std::cout << *me; delete me; - ((RadScorpion*)b)->~RadScorpion(); delete pr; delete pf; } @@ -44,7 +46,177 @@ int main() std::cout << std::endl; { + std::cout << "================ PLASMA RIFLE =====================" << std::endl; + PlasmaRifle pr; + PlasmaRifle pr2(pr); + PlasmaRifle pr3; + pr3 = pr2; + std::cout << "Name: " << pr.getName() << std::endl; + std::cout << "AP Cost: " << pr.getAPCost() << std::endl; + std::cout << "Damage: " << pr.getDamage() << std::endl; + pr.attack(); + pr2.attack(); + pr3.attack(); + std::cout << "################ VIRTUAL" << std::endl; + AWeapon *w = ≺ + std::cout << "Name: " << w->getName() << std::endl; + std::cout << "AP Cost: " << w->getAPCost() << std::endl; + std::cout << "Damage: " << w->getDamage() << std::endl; + w->attack(); + } + + std::cout << std::endl; + + { + std::cout << "================ POWER FIST =====================" << std::endl; + PowerFist pf; + PowerFist pf2(pf); + PowerFist pf3; + pf3 = pf2; + std::cout << "Name: " << pf.getName() << std::endl; + std::cout << "AP Cost: " << pf.getAPCost() << std::endl; + std::cout << "Damage: " << pf.getDamage() << std::endl; + pf.attack(); + pf2.attack(); + pf3.attack(); + std::cout << "################ VIRTUAL" << std::endl; + AWeapon *w = &pf; + std::cout << "Name: " << w->getName() << std::endl; + std::cout << "AP Cost: " << w->getAPCost() << std::endl; + std::cout << "Damage: " << w->getDamage() << std::endl; + w->attack(); + } + + std::cout << std::endl; + + { + std::cout << "================ ENEMY =====================" << std::endl; + Enemy e(2000, "Titan"); + Enemy e2(e); + Enemy e3(0, "should not be printed"); + e3 = e2; + std::cout << "Type: " << e.getType() << ", HP: " << e.getHP() << std::endl; + std::cout << "Type: " << e2.getType() << ", HP: " << e2.getHP() << std::endl; + std::cout << "Type: " << e3.getType() << ", HP: " << e3.getHP() << std::endl; + std::cout << "################ TAKE DAMAGE" << std::endl; + std::cout << "HP: " << e.getHP() << std::endl; + e.takeDamage(10); + std::cout << "HP: " << e.getHP() << std::endl; + e.takeDamage(-1); + std::cout << "HP: " << e.getHP() << std::endl; + e.takeDamage(INT_MIN); + std::cout << "HP: " << e.getHP() << std::endl; + e.takeDamage(0); + std::cout << "HP: " << e.getHP() << std::endl; + e.takeDamage(3000); + std::cout << "HP: " << e.getHP() << std::endl; + } + + std::cout << std::endl; + + { + std::cout << "================ SUPER MUTANT ====================" << std::endl; + SuperMutant m; + SuperMutant m2(m); + SuperMutant m3; + m3 = m2; + std::cout << "Type: " << m.getType() << ", HP: " << m.getHP() << std::endl; + std::cout << "Type: " << m2.getType() << ", HP: " << m2.getHP() << std::endl; + std::cout << "Type: " << m3.getType() << ", HP: " << m3.getHP() << std::endl; + std::cout << "################ TAKE DAMAGE" << std::endl; + std::cout << "HP: " << m.getHP() << std::endl; + m.takeDamage(10); + std::cout << "HP: " << m.getHP() << std::endl; + m.takeDamage(-1); + std::cout << "HP: " << m.getHP() << std::endl; + m.takeDamage(INT_MIN); + std::cout << "HP: " << m.getHP() << std::endl; + m.takeDamage(0); + std::cout << "HP: " << m.getHP() << std::endl; + m.takeDamage(180); + std::cout << "HP: " << m.getHP() << std::endl; + } + + std::cout << std::endl; + + { + std::cout << "================ RAD SCORPION ====================" << std::endl; + RadScorpion s; + RadScorpion s2(s); + RadScorpion s3; + s3 = s2; + std::cout << "Type: " << s.getType() << ", HP: " << s.getHP() << std::endl; + std::cout << "Type: " << s2.getType() << ", HP: " << s2.getHP() << std::endl; + std::cout << "Type: " << s3.getType() << ", HP: " << s3.getHP() << std::endl; + std::cout << "################ TAKE DAMAGE" << std::endl; + std::cout << "HP: " << s.getHP() << std::endl; + s.takeDamage(10); + std::cout << "HP: " << s.getHP() << std::endl; + s.takeDamage(-1); + std::cout << "HP: " << s.getHP() << std::endl; + s.takeDamage(INT_MIN); + std::cout << "HP: " << s.getHP() << std::endl; + s.takeDamage(0); + std::cout << "HP: " << s.getHP() << std::endl; + s.takeDamage(90); + std::cout << "HP: " << s.getHP() << std::endl; + } + + std::cout << std::endl; + + { + std::cout << "================ CHARACTER ====================" << std::endl; + Character c("Jean-Didier"); + Character c2(c); + Character c3("should not be displayed"); + c3 = c2; + std::cout << c; + std::cout << c2; + std::cout << c3; + + std::cout << "################ ATTACK NO WEAPON" << std::endl; + Enemy* r = new RadScorpion(); + c.attack(r); + Enemy* s = new SuperMutant(); + c.attack(s); + + std::cout << "################ EQUIP" << std::endl; + PowerFist pf; + c.equip(&pf); + c.attack(r); + c.attack(s); + std::cout << c; + PlasmaRifle pr; + c.equip(&pr); + c.attack(r); + c.attack(s); + std::cout << c; + c.attack(s); + c.attack(s); + c.attack(s); + c.recoverAP(); + c.recoverAP(); + c.attack(s); + c.attack(s); + c.attack(s); + c.attack(s); + c.attack(s); + + std::cout << "################ RECOVER AP" << std::endl; + std::cout << c; + c.recoverAP(); + std::cout << c; + c.recoverAP(); + std::cout << c; + c.recoverAP(); + std::cout << c; + c.recoverAP(); + std::cout << c; + c.recoverAP(); + std::cout << c; + c.attack(r); + // std::cout << "################ DESTRUCTORS" << std::endl; } return 0; diff --git a/cpp04/ex02/AssaultTerminator.cpp b/cpp04/ex02/AssaultTerminator.cpp index c00a00c..a62c9e4 100644 --- a/cpp04/ex02/AssaultTerminator.cpp +++ b/cpp04/ex02/AssaultTerminator.cpp @@ -6,7 +6,7 @@ /* By: charles +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/04/14 15:47:06 by charles #+# #+# */ -/* Updated: 2020/11/12 15:37:48 by cacharle ### ########.fr */ +/* Updated: 2020/11/13 12:19:15 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ @@ -17,7 +17,11 @@ AssaultTerminator::AssaultTerminator() std::cout << "* teleports from space *" << std::endl; } -AssaultTerminator::AssaultTerminator(AssaultTerminator const& other) { *this = other; } +AssaultTerminator::AssaultTerminator(AssaultTerminator const& other) +{ + std::cout << "* teleports from space *" << std::endl; + *this = other; +} AssaultTerminator& AssaultTerminator::operator=(AssaultTerminator const& other) { @@ -32,8 +36,7 @@ AssaultTerminator::~AssaultTerminator() ISpaceMarine* AssaultTerminator::clone() const { - ISpaceMarine* cloned = new AssaultTerminator(); - *cloned = *this; + ISpaceMarine* cloned = new AssaultTerminator(*this); return cloned; } diff --git a/cpp04/ex02/AssaultTerminator.hpp b/cpp04/ex02/AssaultTerminator.hpp index b2064f1..e1ac9f1 100644 --- a/cpp04/ex02/AssaultTerminator.hpp +++ b/cpp04/ex02/AssaultTerminator.hpp @@ -6,7 +6,7 @@ /* By: charles +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/04/14 15:46:20 by charles #+# #+# */ -/* Updated: 2020/11/12 15:36:54 by cacharle ### ########.fr */ +/* Updated: 2020/11/13 12:18:55 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ @@ -24,10 +24,10 @@ public: AssaultTerminator& operator=(AssaultTerminator const& other); virtual ~AssaultTerminator(); - virtual ISpaceMarine* clone() const; - virtual void battleCry() const; - virtual void rangedAttack() const; - virtual void meleeAttack() const; + virtual ISpaceMarine* clone() const; + virtual void battleCry() const; + virtual void rangedAttack() const; + virtual void meleeAttack() const; private: }; diff --git a/cpp04/ex02/Squad.cpp b/cpp04/ex02/Squad.cpp index d1d988f..1cc59f0 100644 --- a/cpp04/ex02/Squad.cpp +++ b/cpp04/ex02/Squad.cpp @@ -6,7 +6,7 @@ /* By: charles +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/04/14 15:08:35 by charles #+# #+# */ -/* Updated: 2020/11/12 15:38:55 by cacharle ### ########.fr */ +/* Updated: 2020/11/13 12:13:57 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,12 +14,12 @@ Squad::Squad() : m_units(new ISpaceMarine*[0]), m_size(0) {} -Squad::Squad(Squad const& other) { *this = other; } +Squad::Squad(Squad const& other) : m_units(NULL), m_size(0) { *this = other; } Squad& Squad::operator=(Squad const& other) { destroyUnits(); - m_size = other.m_size; + m_size = other.m_size; m_units = new ISpaceMarine*[m_size]; for (int i = 0; i < m_size; i++) m_units[i] = other.m_units[i]->clone(); @@ -57,6 +57,8 @@ int Squad::push(ISpaceMarine* spaceMarine) void Squad::destroyUnits() { + if (m_units == NULL) + return; for (int i = 0; i < m_size; i++) delete m_units[i]; delete [] m_units; diff --git a/cpp04/ex02/Squad.hpp b/cpp04/ex02/Squad.hpp index 9ea5268..48e53cd 100644 --- a/cpp04/ex02/Squad.hpp +++ b/cpp04/ex02/Squad.hpp @@ -6,7 +6,7 @@ /* By: charles +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/04/14 15:07:57 by charles #+# #+# */ -/* Updated: 2020/11/12 15:39:26 by cacharle ### ########.fr */ +/* Updated: 2020/11/13 12:06:51 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ @@ -25,15 +25,15 @@ public: Squad& operator=(Squad const& other); virtual ~Squad(); - virtual int getCount() const; - virtual ISpaceMarine* getUnit(int n) const; - virtual int push(ISpaceMarine* spaceMarine); + virtual int getCount() const; + virtual ISpaceMarine* getUnit(int n) const; + virtual int push(ISpaceMarine* spaceMarine); private: void destroyUnits(); ISpaceMarine** m_units; - int m_size; + int m_size; }; #endif diff --git a/cpp04/ex02/TacticalMarine.cpp b/cpp04/ex02/TacticalMarine.cpp index df771e8..cf30d2a 100644 --- a/cpp04/ex02/TacticalMarine.cpp +++ b/cpp04/ex02/TacticalMarine.cpp @@ -6,7 +6,7 @@ /* By: charles +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/04/14 15:31:43 by charles #+# #+# */ -/* Updated: 2020/11/12 15:37:41 by cacharle ### ########.fr */ +/* Updated: 2020/11/13 12:18:14 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ @@ -17,7 +17,11 @@ TacticalMarine::TacticalMarine() std::cout << "Tactical Marine ready for battle!" << std::endl; } -TacticalMarine::TacticalMarine(TacticalMarine const& other) { *this = other; } +TacticalMarine::TacticalMarine(TacticalMarine const& other) +{ + std::cout << "Tactical Marine ready for battle!" << std::endl; + *this = other; +} TacticalMarine& TacticalMarine::operator=(TacticalMarine const& other) { @@ -32,8 +36,7 @@ TacticalMarine::~TacticalMarine() ISpaceMarine* TacticalMarine::clone() const { - ISpaceMarine* cloned = new TacticalMarine(); - *cloned = *this; + ISpaceMarine* cloned = new TacticalMarine(*this); return cloned; } diff --git a/cpp04/ex02/TacticalMarine.hpp b/cpp04/ex02/TacticalMarine.hpp index 43722d6..965cb30 100644 --- a/cpp04/ex02/TacticalMarine.hpp +++ b/cpp04/ex02/TacticalMarine.hpp @@ -6,7 +6,7 @@ /* By: charles +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/04/14 15:30:48 by charles #+# #+# */ -/* Updated: 2020/11/12 15:38:03 by cacharle ### ########.fr */ +/* Updated: 2020/11/13 12:16:07 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ @@ -24,10 +24,10 @@ public: TacticalMarine& operator=(TacticalMarine const& other); virtual ~TacticalMarine(); - virtual ISpaceMarine* clone() const; - virtual void battleCry() const; - virtual void rangedAttack() const; - virtual void meleeAttack() const; + virtual ISpaceMarine* clone() const; + virtual void battleCry() const; + virtual void rangedAttack() const; + virtual void meleeAttack() const; private: }; diff --git a/cpp04/ex02/main.cpp b/cpp04/ex02/main.cpp index 137ce46..c53dadb 100644 --- a/cpp04/ex02/main.cpp +++ b/cpp04/ex02/main.cpp @@ -6,7 +6,7 @@ /* By: charles +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/04/14 15:50:35 by charles #+# #+# */ -/* Updated: 2020/04/14 15:53:35 by charles ### ########.fr */ +/* Updated: 2020/11/13 12:36:22 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ @@ -18,20 +18,112 @@ int main() { - ISpaceMarine* bob = new TacticalMarine; - ISpaceMarine* jim = new AssaultTerminator; + { + std::cout << "================ SUBJECT MAIN =====================" << std::endl; + ISpaceMarine* bob = new TacticalMarine; + ISpaceMarine* jim = new AssaultTerminator; + + ISquad* vlc = new Squad; + vlc->push(bob); + vlc->push(jim); + for (int i = 0; i < vlc->getCount(); ++i) + { + ISpaceMarine* cur = vlc->getUnit(i); + cur->battleCry(); + cur->rangedAttack(); + cur->meleeAttack(); + } + delete vlc; + } + + std::cout << std::endl; + + { + std::cout << "================ TACTICAL MARINE =====================" << std::endl; + TacticalMarine t; + t.battleCry(); + t.rangedAttack(); + t.meleeAttack(); + TacticalMarine t2(t); + TacticalMarine t3; + t3 = t; + std::cout << "################ INTERFACE" << std::endl; + ISpaceMarine *sm = new TacticalMarine(); + sm->battleCry(); + sm->rangedAttack(); + sm->meleeAttack(); + delete sm; + } + + std::cout << std::endl; - ISquad* vlc = new Squad; - vlc->push(bob); - vlc->push(jim); - for (int i = 0; i < vlc->getCount(); ++i) { - ISpaceMarine* cur = vlc->getUnit(i); - cur->battleCry(); - cur->rangedAttack(); - cur->meleeAttack(); + std::cout << "================ ASSAULT TERMINATOR =====================" << std::endl; + AssaultTerminator a; + a.battleCry(); + a.rangedAttack(); + a.meleeAttack(); + AssaultTerminator a2(a); + AssaultTerminator a3; + a3 = a; + std::cout << "################ INTERFACE" << std::endl; + ISpaceMarine *sm = new AssaultTerminator(); + sm->battleCry(); + sm->rangedAttack(); + sm->meleeAttack(); + delete sm; + } + + std::cout << std::endl; + + { + std::cout << "================ SQUAD =====================" << std::endl; + Squad s; + std::cout << "Count: " << s.getCount() << std::endl; + s.push(new TacticalMarine()); + std::cout << "Count: " << s.getCount() << std::endl; + s.push(new TacticalMarine()); + s.push(new AssaultTerminator()); + s.push(new AssaultTerminator()); + std::cout << "Count: " << s.getCount() << std::endl; + s.getUnit(0)->battleCry(); + s.getUnit(1)->battleCry(); + s.getUnit(2)->battleCry(); + s.getUnit(3)->battleCry(); + s.getUnit(3)->rangedAttack(); + s.getUnit(3)->meleeAttack(); + s.getUnit(0)->rangedAttack(); + s.getUnit(0)->meleeAttack(); + std::cout << s.getUnit(4) << std::endl; + std::cout << s.getUnit(-1) << std::endl; + + std::cout << "################ COPY" << std::endl; + Squad s2(s); + std::cout << "Copy Count: " << s2.getCount() << std::endl; + s2.push(new TacticalMarine()); + std::cout << "Copy Count: " << s2.getCount() << std::endl; + std::cout << "Origin Count: " << s.getCount() << std::endl; + + std::cout << "################ ASSIGN" << std::endl; + Squad s3; + s3 = s; + std::cout << "Copy Count: " << s3.getCount() << std::endl; + s3.push(new TacticalMarine()); + std::cout << "Copy Count: " << s3.getCount() << std::endl; + std::cout << "Origin Count: " << s.getCount() << std::endl; + + std::cout << "################ INTERFACE" << std::endl; + ISquad *si = new Squad(); + si->push(new TacticalMarine()); + std::cout << si->getCount() << std::endl; + si->getUnit(0)->battleCry(); + si->push(new AssaultTerminator()); + std::cout << si->getCount() << std::endl; + si->getUnit(1)->battleCry(); + delete si; + + std::cout << "################ DESTROY" << std::endl; } - delete vlc; return 0; } diff --git a/cpp04/ex03/AMateria.cpp b/cpp04/ex03/AMateria.cpp index 1dc7ca9..b08c4f2 100644 --- a/cpp04/ex03/AMateria.cpp +++ b/cpp04/ex03/AMateria.cpp @@ -6,21 +6,21 @@ /* By: charles +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/04/14 16:26:57 by charles #+# #+# */ -/* Updated: 2020/11/12 15:40:23 by cacharle ### ########.fr */ +/* Updated: 2020/11/13 14:26:28 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ #include "AMateria.hpp" -AMateria::AMateria(AMateria const& other) +AMateria::AMateria(AMateria const& other) : m_type(other.m_type) { *this = other; - m_type = ""; } AMateria& AMateria::operator=(AMateria const& other) { - _xp = other._xp; + _xp = other._xp; + // subject doesn't want type to be copied return *this; } @@ -28,13 +28,13 @@ AMateria::~AMateria() {} AMateria::AMateria(std::string const& type) : m_type(type), _xp(0) {} -std::string const& AMateria::getType() const +std::string const& AMateria::getType() const { return m_type; } +unsigned int AMateria::getXP() const { return _xp; } + +void AMateria::use(ICharacter& target) { - return m_type; + (void)target; + _xp += 10; } -unsigned int AMateria::getXP() const { return _xp; } - -void AMateria::use(ICharacter& target) { _xp += 10; } - AMateria::AMateria() {} diff --git a/cpp04/ex03/AMateria.hpp b/cpp04/ex03/AMateria.hpp index 7fef1c8..41ef132 100644 --- a/cpp04/ex03/AMateria.hpp +++ b/cpp04/ex03/AMateria.hpp @@ -6,7 +6,7 @@ /* By: charles +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/04/14 16:24:00 by charles #+# #+# */ -/* Updated: 2020/11/12 15:41:54 by cacharle ### ########.fr */ +/* Updated: 2020/11/13 14:42:03 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ @@ -26,17 +26,18 @@ public: virtual ~AMateria(); AMateria(std::string const& type); + std::string const& getType() const; - unsigned int getXP() const; + unsigned int getXP() const; virtual AMateria* clone() const = 0; - virtual void use(ICharacter& target); + virtual void use(ICharacter& target); protected: AMateria(); - std::string m_type; - unsigned int _xp; // subject force _xp instead of m_xp + std::string m_type; + unsigned int _xp; // subject force _xp }; #endif diff --git a/cpp04/ex03/Character.cpp b/cpp04/ex03/Character.cpp index ee03e63..d159aaf 100644 --- a/cpp04/ex03/Character.cpp +++ b/cpp04/ex03/Character.cpp @@ -6,20 +6,18 @@ /* By: charles +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/04/14 16:45:54 by charles #+# #+# */ -/* Updated: 2020/11/12 15:43:14 by cacharle ### ########.fr */ +/* Updated: 2020/11/13 14:20:50 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ #include "Character.hpp" -Character::Character() : m_name(""), m_inventory_size(0) {} - -Character::Character(Character const& other) { *this = other; } +Character::Character(Character const& other) + : m_inventory_size(0) { *this = other; } Character& Character::operator=(Character const& other) { - for (int i = 0; i < m_inventory_size; i++) - delete m_inventory[i]; + destroyInventory(); m_inventory_size = other.m_inventory_size; for (int i = 0; i < m_inventory_size; i++) m_inventory[i] = other.m_inventory[i]->clone(); @@ -27,11 +25,7 @@ Character& Character::operator=(Character const& other) return *this; } -Character::~Character() -{ - for (int i = 0; i < m_inventory_size; i++) - delete m_inventory[i]; -} +Character::~Character() { destroyInventory(); } Character::Character(std::string const& name) : m_name(name), m_inventory_size(0) {} @@ -60,3 +54,11 @@ void Character::use(int idx, ICharacter& target) return; m_inventory[idx]->use(target); } + +void Character::destroyInventory() +{ + for (int i = 0; i < m_inventory_size; i++) + delete m_inventory[i]; +} + +Character::Character() {} diff --git a/cpp04/ex03/Character.hpp b/cpp04/ex03/Character.hpp index 6526ba2..5a27d2c 100644 --- a/cpp04/ex03/Character.hpp +++ b/cpp04/ex03/Character.hpp @@ -6,13 +6,14 @@ /* By: charles +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/04/14 16:44:43 by charles #+# #+# */ -/* Updated: 2020/11/12 15:42:43 by cacharle ### ########.fr */ +/* Updated: 2020/11/13 14:17:54 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ #ifndef CHARACTER_HPP # define CHARACTER_HPP +# include # include "ICharacter.hpp" # define INVENTORY_MAX_SIZE 4 @@ -20,7 +21,6 @@ class Character : public ICharacter { public: - Character(); Character(Character const& other); Character& operator=(Character const& other); virtual ~Character(); @@ -35,6 +35,10 @@ private: AMateria* m_inventory[INVENTORY_MAX_SIZE]; int m_inventory_size; std::string m_name; + + void destroyInventory(); + + Character(); }; #endif diff --git a/cpp04/ex03/Cure.cpp b/cpp04/ex03/Cure.cpp index e27ae26..dc464ff 100644 --- a/cpp04/ex03/Cure.cpp +++ b/cpp04/ex03/Cure.cpp @@ -6,7 +6,7 @@ /* By: charles +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/04/14 17:38:01 by charles #+# #+# */ -/* Updated: 2020/11/12 15:43:44 by cacharle ### ########.fr */ +/* Updated: 2020/11/13 14:09:58 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ @@ -29,4 +29,5 @@ AMateria* Cure::clone() const { return new Cure(*this); } void Cure::use(ICharacter& target) { std::cout << "* heals " << target.getName() << "'s wounds *" << std::endl; + AMateria::use(target); } diff --git a/cpp04/ex03/Cure.hpp b/cpp04/ex03/Cure.hpp index ccc86d5..71647ff 100644 --- a/cpp04/ex03/Cure.hpp +++ b/cpp04/ex03/Cure.hpp @@ -6,7 +6,7 @@ /* By: charles +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/04/14 17:37:11 by charles #+# #+# */ -/* Updated: 2020/11/12 15:43:24 by cacharle ### ########.fr */ +/* Updated: 2020/11/13 14:09:18 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ @@ -25,7 +25,7 @@ public: ~Cure(); virtual AMateria* clone() const; - virtual void use(ICharacter& target); + virtual void use(ICharacter& target); private: }; diff --git a/cpp04/ex03/ICharacter.hpp b/cpp04/ex03/ICharacter.hpp index bb84d7e..786be6a 100644 --- a/cpp04/ex03/ICharacter.hpp +++ b/cpp04/ex03/ICharacter.hpp @@ -6,7 +6,7 @@ /* By: charles +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/04/14 16:40:25 by charles #+# #+# */ -/* Updated: 2020/11/12 15:42:12 by cacharle ### ########.fr */ +/* Updated: 2020/11/13 14:27:47 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ @@ -16,7 +16,7 @@ # include # include "AMateria.hpp" -class IMateria; +class AMateria; class ICharacter { @@ -26,11 +26,6 @@ public: virtual void equip(AMateria* m) = 0; virtual void unequip(int idx) = 0; virtual void use(int idx, ICharacter& target) = 0; - -protected: - ICharacter(); - ICharacter(ICharacter const& other); - ICharacter& operator=(ICharacter const& other); }; #endif diff --git a/cpp04/ex03/IMateriaSource.hpp b/cpp04/ex03/IMateriaSource.hpp index 5161604..63b5f01 100644 --- a/cpp04/ex03/IMateriaSource.hpp +++ b/cpp04/ex03/IMateriaSource.hpp @@ -6,7 +6,7 @@ /* By: charles +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/04/14 17:15:52 by charles #+# #+# */ -/* Updated: 2020/04/14 17:21:54 by charles ### ########.fr */ +/* Updated: 2020/11/13 14:23:42 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/cpp04/ex03/Ice.cpp b/cpp04/ex03/Ice.cpp index c663104..9df83b2 100644 --- a/cpp04/ex03/Ice.cpp +++ b/cpp04/ex03/Ice.cpp @@ -6,7 +6,7 @@ /* By: charles +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/04/14 16:32:27 by charles #+# #+# */ -/* Updated: 2020/11/12 15:44:48 by cacharle ### ########.fr */ +/* Updated: 2020/11/13 14:06:33 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,7 +14,7 @@ Ice::Ice() : AMateria("ice") {} -Ice::Ice(Ice const& other) { *this = other; } +Ice::Ice(Ice const& other) : AMateria(other) {} Ice& Ice::operator=(Ice const& other) { diff --git a/cpp04/ex03/Ice.hpp b/cpp04/ex03/Ice.hpp index 8b670f6..41f07de 100644 --- a/cpp04/ex03/Ice.hpp +++ b/cpp04/ex03/Ice.hpp @@ -6,7 +6,7 @@ /* By: charles +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/04/14 16:31:34 by charles #+# #+# */ -/* Updated: 2020/11/12 15:44:31 by cacharle ### ########.fr */ +/* Updated: 2020/11/13 14:09:24 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ @@ -25,7 +25,7 @@ public: ~Ice(); virtual AMateria* clone() const; - virtual void use(ICharacter& target); + virtual void use(ICharacter& target); private: }; diff --git a/cpp04/ex03/MateriaSource.cpp b/cpp04/ex03/MateriaSource.cpp index 087af3e..774506b 100644 --- a/cpp04/ex03/MateriaSource.cpp +++ b/cpp04/ex03/MateriaSource.cpp @@ -6,28 +6,46 @@ /* By: charles +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/04/14 17:19:10 by charles #+# #+# */ -/* Updated: 2020/11/12 15:45:23 by cacharle ### ########.fr */ +/* Updated: 2020/11/13 14:40:54 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ #include "MateriaSource.hpp" -MateriaSource::MateriaSource() {} +MateriaSource::MateriaSource() : m_learned_size(0) {} -MateriaSource::MateriaSource(MateriaSource const& other) { *this = other; } +MateriaSource::MateriaSource(MateriaSource const& other) + : m_learned_size(0) { *this = other; } -void MateriaSource::operator=(MateriaSource const& other) +MateriaSource& MateriaSource::operator=(MateriaSource const& other) { + destroyLearned(); + m_learned_size = other.m_learned_size; + for (int i = 0; i < m_learned_size; i++) + m_learned[i] = other.m_learned[i]->clone(); return *this; } -MateriaSource::~MateriaSource() {} +MateriaSource::~MateriaSource() { destroyLearned(); } void MateriaSource::learnMateria(AMateria* materia) { + if (m_learned_size >= 4) + return; + m_learned[m_learned_size] = materia->clone(); + m_learned_size++; } AMateria* MateriaSource::createMateria(std::string const& type) { + for (int i = 0; i < m_learned_size; i++) + if (m_learned[i]->getType() == type) + return m_learned[i]->clone(); return NULL; } + +void MateriaSource::destroyLearned() +{ + for (int i = 0; i < m_learned_size; i++) + delete m_learned[i]; +} diff --git a/cpp04/ex03/MateriaSource.hpp b/cpp04/ex03/MateriaSource.hpp index eb233eb..51f0a7e 100644 --- a/cpp04/ex03/MateriaSource.hpp +++ b/cpp04/ex03/MateriaSource.hpp @@ -6,7 +6,7 @@ /* By: charles +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/04/14 17:17:40 by charles #+# #+# */ -/* Updated: 2020/11/12 15:45:28 by cacharle ### ########.fr */ +/* Updated: 2020/11/13 14:41:04 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ @@ -25,12 +25,14 @@ public: MateriaSource& operator=(MateriaSource const& other); virtual ~MateriaSource(); - virtual void learnMateria(AMateria* materia); + virtual void learnMateria(AMateria* materia); virtual AMateria* createMateria(std::string const& type); private: AMateria* m_learned[LEARNED_MAX_SIZE]; - int m_learned_size; + int m_learned_size; + + void destroyLearned(); }; #endif diff --git a/cpp04/ex03/main.cpp b/cpp04/ex03/main.cpp index 11f471f..871007d 100644 --- a/cpp04/ex03/main.cpp +++ b/cpp04/ex03/main.cpp @@ -6,7 +6,7 @@ /* By: charles +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/04/14 17:58:01 by charles #+# #+# */ -/* Updated: 2020/04/14 17:59:02 by charles ### ########.fr */ +/* Updated: 2020/11/13 14:41:49 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ -- cgit