aboutsummaryrefslogtreecommitdiff
path: root/cpp04/ex03
diff options
context:
space:
mode:
authorCharles <sircharlesaze@gmail.com>2020-04-14 18:02:14 +0200
committerCharles <sircharlesaze@gmail.com>2020-04-14 18:02:14 +0200
commitefea8712aaf8169b1184cceb83705ca6b8783173 (patch)
tree3c682f6af9d5877ddfa1740f4bac10f5f5123ddc /cpp04/ex03
parent119f7f96e77a2d86d692e82645dde4c2dc054052 (diff)
downloadpiscine_cpp-efea8712aaf8169b1184cceb83705ca6b8783173.tar.gz
piscine_cpp-efea8712aaf8169b1184cceb83705ca6b8783173.tar.bz2
piscine_cpp-efea8712aaf8169b1184cceb83705ca6b8783173.zip
cpp04, ex03 not finished, require more sophisticated main
Diffstat (limited to 'cpp04/ex03')
-rw-r--r--cpp04/ex03/AMateria.cpp52
-rw-r--r--cpp04/ex03/AMateria.hpp40
-rw-r--r--cpp04/ex03/Character.cpp72
-rw-r--r--cpp04/ex03/Character.hpp40
-rw-r--r--cpp04/ex03/Cure.cpp41
-rw-r--r--cpp04/ex03/Cure.hpp32
-rw-r--r--cpp04/ex03/ICharacter.hpp34
-rw-r--r--cpp04/ex03/IMateriaSource.hpp27
-rw-r--r--cpp04/ex03/Ice.cpp42
-rw-r--r--cpp04/ex03/Ice.hpp32
-rw-r--r--cpp04/ex03/MateriaSource.cpp43
-rw-r--r--cpp04/ex03/MateriaSource.hpp35
-rw-r--r--cpp04/ex03/main.cpp40
13 files changed, 530 insertions, 0 deletions
diff --git a/cpp04/ex03/AMateria.cpp b/cpp04/ex03/AMateria.cpp
new file mode 100644
index 0000000..77e674b
--- /dev/null
+++ b/cpp04/ex03/AMateria.cpp
@@ -0,0 +1,52 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* AMateria.cpp :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2020/04/14 16:26:57 by charles #+# #+# */
+/* Updated: 2020/04/14 16:35:09 by charles ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "AMateria.hpp"
+
+AMateria::AMateria(AMateria const& other)
+{
+ *this = other;
+ m_type = "";
+}
+
+void AMateria::operator=(AMateria const& other)
+{
+ _xp = other._xp;
+}
+
+AMateria::~AMateria()
+{
+}
+
+AMateria::AMateria(std::string const& type)
+ : m_type(type), _xp(0)
+{
+}
+
+std::string const& AMateria::getType() const
+{
+ return m_type;
+}
+
+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
new file mode 100644
index 0000000..65d5cc5
--- /dev/null
+++ b/cpp04/ex03/AMateria.hpp
@@ -0,0 +1,40 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* AMateria.hpp :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2020/04/14 16:24:00 by charles #+# #+# */
+/* Updated: 2020/04/14 17:55:18 by charles ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#ifndef AMATERIA_HPP
+# define AMATERIA_HPP
+
+# include <string>
+# include "ICharacter.hpp"
+
+class AMateria
+{
+public:
+ AMateria(AMateria const& other);
+ void operator=(AMateria const& other);
+ virtual ~AMateria();
+
+ AMateria(std::string const& type);
+ std::string const& getType() const;
+ unsigned int getXP() const;
+
+ virtual AMateria* clone() const = 0;
+ virtual void use(ICharacter& target);
+
+protected:
+ AMateria();
+
+ std::string m_type;
+ unsigned int _xp; // subject force _xp instead of m_xp
+};
+
+#endif
diff --git a/cpp04/ex03/Character.cpp b/cpp04/ex03/Character.cpp
new file mode 100644
index 0000000..34aaa48
--- /dev/null
+++ b/cpp04/ex03/Character.cpp
@@ -0,0 +1,72 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* Character.cpp :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2020/04/14 16:45:54 by charles #+# #+# */
+/* Updated: 2020/04/14 17:59:57 by charles ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "Character.hpp"
+
+Character::Character() : m_name(""), m_inventory_size(0)
+{
+}
+
+Character::Character(Character const& other)
+{
+ *this = other;
+}
+
+void Character::operator=(Character const& other)
+{
+ for (int i = 0; i < m_inventory_size; i++)
+ delete m_inventory[i];
+ m_inventory_size = other.m_inventory_size;
+ for (int i = 0; i < m_inventory_size; i++)
+ m_inventory[i] = other.m_inventory[i]->clone();
+ m_name = other.m_name;
+}
+
+Character::~Character()
+{
+ for (int i = 0; i < m_inventory_size; i++)
+ delete m_inventory[i];
+}
+
+Character::Character(std::string const& name)
+ : m_name(name), m_inventory_size(0)
+{
+}
+
+std::string const& Character::getName() const
+{
+ return m_name;
+}
+
+void Character::equip(AMateria* m)
+{
+ if (m_inventory_size >= INVENTORY_MAX_SIZE)
+ return;
+ m_inventory[m_inventory_size] = m;
+ m_inventory_size++;
+}
+
+void Character::unequip(int idx)
+{
+ if (idx < 0 || idx >= m_inventory_size)
+ return;
+ for (int i = idx; i < m_inventory_size - 1; i++)
+ m_inventory[i] = m_inventory[i + 1];
+ m_inventory_size--;
+}
+
+void Character::use(int idx, ICharacter& target)
+{
+ if (idx < 0 || idx >= m_inventory_size)
+ return;
+ m_inventory[idx]->use(target);
+}
diff --git a/cpp04/ex03/Character.hpp b/cpp04/ex03/Character.hpp
new file mode 100644
index 0000000..c6ffc7b
--- /dev/null
+++ b/cpp04/ex03/Character.hpp
@@ -0,0 +1,40 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* Character.hpp :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2020/04/14 16:44:43 by charles #+# #+# */
+/* Updated: 2020/04/14 17:31:49 by charles ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#ifndef CHARACTER_HPP
+# define CHARACTER_HPP
+
+# include "ICharacter.hpp"
+
+# define INVENTORY_MAX_SIZE 4
+
+class Character : public ICharacter
+{
+public:
+ Character();
+ Character(Character const& other);
+ void operator=(Character const& other);
+ virtual ~Character();
+
+ Character(std::string const& name);
+ virtual std::string const& getName() const;
+ virtual void equip(AMateria* m);
+ virtual void unequip(int idx);
+ virtual void use(int idx, ICharacter& target);
+
+private:
+ AMateria* m_inventory[INVENTORY_MAX_SIZE];
+ int m_inventory_size;
+ std::string m_name;
+};
+
+#endif
diff --git a/cpp04/ex03/Cure.cpp b/cpp04/ex03/Cure.cpp
new file mode 100644
index 0000000..1f3e0d5
--- /dev/null
+++ b/cpp04/ex03/Cure.cpp
@@ -0,0 +1,41 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* Cure.cpp :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2020/04/14 17:38:01 by charles #+# #+# */
+/* Updated: 2020/04/14 17:41:32 by charles ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "Cure.hpp"
+
+Cure::Cure() : AMateria("cure")
+{
+}
+
+Cure::Cure(Cure const& other)
+{
+ *this = other;
+}
+
+void Cure::operator=(Cure const& other)
+{
+ AMateria::operator=(other);
+}
+
+Cure::~Cure()
+{
+}
+
+AMateria* Cure::clone() const
+{
+ return new Cure(*this);
+}
+
+void Cure::use(ICharacter& target)
+{
+ std::cout << "* heals " << target.getName() << "'s wounds *" << std::endl;
+}
diff --git a/cpp04/ex03/Cure.hpp b/cpp04/ex03/Cure.hpp
new file mode 100644
index 0000000..4c7a6dd
--- /dev/null
+++ b/cpp04/ex03/Cure.hpp
@@ -0,0 +1,32 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* Cure.hpp :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2020/04/14 17:37:11 by charles #+# #+# */
+/* Updated: 2020/04/14 17:42:52 by charles ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#ifndef CURE_HPP
+# define CURE_HPP
+
+# include <iostream>
+# include "AMateria.hpp"
+
+class Cure : public AMateria
+{
+public:
+ Cure();
+ Cure(Cure const& other);
+ void operator=(Cure const& other);
+ ~Cure();
+
+ virtual AMateria* clone() const;
+ virtual void use(ICharacter& target);
+private:
+};
+
+#endif
diff --git a/cpp04/ex03/ICharacter.hpp b/cpp04/ex03/ICharacter.hpp
new file mode 100644
index 0000000..ea56d47
--- /dev/null
+++ b/cpp04/ex03/ICharacter.hpp
@@ -0,0 +1,34 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ICharacter.hpp :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2020/04/14 16:40:25 by charles #+# #+# */
+/* Updated: 2020/04/14 17:55:14 by charles ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#ifndef ICHARACTER_HPP
+# define ICHARACTER_HPP
+
+# include <string>
+# include "AMateria.hpp"
+
+class ICharacter
+{
+public:
+ virtual ~ICharacter() {}
+ virtual std::string const& getName() const = 0;
+ 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);
+ void operator=(ICharacter const& other);
+};
+
+#endif
diff --git a/cpp04/ex03/IMateriaSource.hpp b/cpp04/ex03/IMateriaSource.hpp
new file mode 100644
index 0000000..5161604
--- /dev/null
+++ b/cpp04/ex03/IMateriaSource.hpp
@@ -0,0 +1,27 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* IMateriaSource.hpp :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2020/04/14 17:15:52 by charles #+# #+# */
+/* Updated: 2020/04/14 17:21:54 by charles ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#ifndef IMATERIASOURCE_HPP
+# define IMATERIASOURCE_HPP
+
+# include <string>
+# include "AMateria.hpp"
+
+class IMateriaSource
+{
+public:
+ virtual ~IMateriaSource() {}
+ virtual void learnMateria(AMateria* materia) = 0;
+ virtual AMateria* createMateria(std::string const& type) = 0;
+};
+
+#endif
diff --git a/cpp04/ex03/Ice.cpp b/cpp04/ex03/Ice.cpp
new file mode 100644
index 0000000..976cb84
--- /dev/null
+++ b/cpp04/ex03/Ice.cpp
@@ -0,0 +1,42 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* Ice.cpp :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2020/04/14 16:32:27 by charles #+# #+# */
+/* Updated: 2020/04/14 17:36:26 by charles ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "Ice.hpp"
+
+Ice::Ice() : AMateria("ice")
+{
+}
+
+Ice::Ice(Ice const& other)
+{
+ *this = other;
+}
+
+void Ice::operator=(Ice const& other)
+{
+ AMateria::operator=(other);
+}
+
+Ice::~Ice()
+{
+}
+
+AMateria* Ice::clone() const
+{
+ return new Ice(*this);
+}
+
+void Ice::use(ICharacter& target)
+{
+ std::cout << "* shoots an ice bolt at " << target.getName() << " *" << std::endl;
+ AMateria::use(target);
+}
diff --git a/cpp04/ex03/Ice.hpp b/cpp04/ex03/Ice.hpp
new file mode 100644
index 0000000..55011c0
--- /dev/null
+++ b/cpp04/ex03/Ice.hpp
@@ -0,0 +1,32 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* Ice.hpp :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2020/04/14 16:31:34 by charles #+# #+# */
+/* Updated: 2020/04/14 17:38:30 by charles ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#ifndef ICE_HPP
+# define ICE_HPP
+
+# include <iostream>
+# include "AMateria.hpp"
+
+class Ice : public AMateria
+{
+public:
+ Ice();
+ Ice(Ice const& other);
+ void operator=(Ice const& other);
+ ~Ice();
+
+ virtual AMateria* clone() const;
+ virtual void use(ICharacter& target);
+private:
+};
+
+#endif
diff --git a/cpp04/ex03/MateriaSource.cpp b/cpp04/ex03/MateriaSource.cpp
new file mode 100644
index 0000000..bce6e5a
--- /dev/null
+++ b/cpp04/ex03/MateriaSource.cpp
@@ -0,0 +1,43 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* MateriaSource.cpp :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2020/04/14 17:19:10 by charles #+# #+# */
+/* Updated: 2020/04/14 17:51:07 by charles ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "MateriaSource.hpp"
+
+MateriaSource::MateriaSource()
+{
+
+}
+
+MateriaSource::MateriaSource(MateriaSource const& other)
+{
+ *this = other;
+}
+
+void MateriaSource::operator=(MateriaSource const& other)
+{
+
+}
+
+MateriaSource::~MateriaSource()
+{
+
+}
+
+void MateriaSource::learnMateria(AMateria* materia)
+{
+
+}
+
+AMateria* MateriaSource::createMateria(std::string const& type)
+{
+ return nullptr;
+}
diff --git a/cpp04/ex03/MateriaSource.hpp b/cpp04/ex03/MateriaSource.hpp
new file mode 100644
index 0000000..a8b4c0e
--- /dev/null
+++ b/cpp04/ex03/MateriaSource.hpp
@@ -0,0 +1,35 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* MateriaSource.hpp :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2020/04/14 17:17:40 by charles #+# #+# */
+/* Updated: 2020/04/14 17:33:50 by charles ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#ifndef MATERIASOURCE_HPP
+# define MATERIASOURCE_HPP
+
+# include "IMateriaSource.hpp"
+
+# define LEARNED_MAX_SIZE 4
+class MateriaSource : public IMateriaSource
+{
+public:
+ MateriaSource();
+ MateriaSource(MateriaSource const& other);
+ void operator=(MateriaSource const& other);
+ virtual ~MateriaSource();
+
+ virtual void learnMateria(AMateria* materia);
+ virtual AMateria* createMateria(std::string const& type);
+
+private:
+ AMateria* m_learned[LEARNED_MAX_SIZE];
+ int m_learned_size;
+};
+
+#endif
diff --git a/cpp04/ex03/main.cpp b/cpp04/ex03/main.cpp
new file mode 100644
index 0000000..11f471f
--- /dev/null
+++ b/cpp04/ex03/main.cpp
@@ -0,0 +1,40 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* main.cpp :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2020/04/14 17:58:01 by charles #+# #+# */
+/* Updated: 2020/04/14 17:59:02 by charles ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "MateriaSource.hpp"
+#include "Ice.hpp"
+#include "Cure.hpp"
+#include "Character.hpp"
+
+int main()
+{
+ IMateriaSource* src = new MateriaSource();
+ src->learnMateria(new Ice());
+ src->learnMateria(new Cure());
+
+ ICharacter* me = new Character("me");
+
+ AMateria* tmp;
+ tmp = src->createMateria("ice");
+ me->equip(tmp);
+ tmp = src->createMateria("cure");
+ me->equip(tmp);
+
+ ICharacter* bob = new Character("bob");
+
+ me->use(0, *bob);
+ me->use(1, *bob);
+
+ delete bob;
+ delete me;
+ delete src;
+}