diff --git a/ex01/Makefile b/ex01/Makefile new file mode 100644 index 0000000..e998f72 --- /dev/null +++ b/ex01/Makefile @@ -0,0 +1,25 @@ +CXX = c++ +CPPFLAGS = -std=c++98 -Wall -Wextra -Werror -g +SRCDIR = src +OBJDIR = obj +NAME = ex01 + +SRCS = $(wildcard $(SRCDIR)/*.cpp) +OBJS = $(patsubst $(SRCDIR)/%.cpp,$(OBJDIR)/%.o,$(SRCS)) + +all: $(NAME) + +$(OBJDIR)/%.o: $(SRCDIR)/%.cpp + mkdir -p obj + $(CXX) $(CPPFLAGS) -c $< -o $@ + +$(NAME): $(OBJS) + $(CXX) $(CPPFLAGS) $^ -o $@ + +clean: + rm -rf $(OBJDIR)/*.o + +fclean: clean + rm -fr $(NAME) + +re: fclean all diff --git a/ex01/src/ClapTrap.cpp b/ex01/src/ClapTrap.cpp new file mode 100644 index 0000000..f30fc2d --- /dev/null +++ b/ex01/src/ClapTrap.cpp @@ -0,0 +1,96 @@ +#include "ClapTrap.hpp" +#include + +ClapTrap::ClapTrap(): + _name(""), + _life(10), + _energy(10), + _damage(0) +{ + std::cout << "ClapTrap()" << std::endl; +} + +ClapTrap::ClapTrap(const std::string& name): + _name(name), + _life(10), + _energy(10), + _damage(0) +{ + std::cout << "ClapTrap(" << name << ")" << std::endl; +} + +ClapTrap::ClapTrap(const ClapTrap& src) +{ + std::cout << "ClapTrap(ClapTrap)" << std::endl; + *this = src; +} + +ClapTrap::~ClapTrap() +{ + std::cout << "~ClapTrap()" << std::endl; +} + +ClapTrap& ClapTrap::operator=(const ClapTrap& src) +{ + this->_name = src._name; + this->_life = src._life; + this->_energy = src._energy; + this->_damage = src._damage; + + return *this; +} + + +void ClapTrap::beRepaired(unsigned int amount) +{ + if (this->_life == 0 || this->_energy == 0) + { + std::cerr << "error: ClapTrap " << this->_name << " dead" << std::endl; + return; + } + this->_life += amount; + this->_energy--; + std::cerr << "ClapTrap " << this->_name << " beRepaired causing life is now " << this->_life << std::endl; +} + +void ClapTrap::takeDamage(unsigned int amount) +{ + if (this->_life == 0 || this->_energy == 0) + { + std::cerr << "error: ClapTrap " << this->_name << " dead" << std::endl; + return; + } + this->_life -= amount; + std::cout << "ClapTrap " << this->_name << " be attacked causing " << amount << " points of damage!" << std::endl; +} + +void ClapTrap::attack(const std::string &target) +{ + if (this->_life == 0 || this->_energy == 0) + { + std::cerr << "error: ClapTrap " << this->_name << " dead" << std::endl; + return; + } + this->_energy--; + std::cerr << "ClapTrap " << this->_name << " attacks " << target << ", causing " << this->_damage << " points of damage" << std::endl; +} + +const std::string& ClapTrap::getName() const +{ + return this->_name; +} + +int ClapTrap::getLife() const +{ + return this->_life; +} + +int ClapTrap::getEnergy() const +{ + return this->_energy; +} + +int ClapTrap::getDamage() const +{ + return this->_damage; +} diff --git a/ex01/src/ClapTrap.hpp b/ex01/src/ClapTrap.hpp new file mode 100644 index 0000000..407df17 --- /dev/null +++ b/ex01/src/ClapTrap.hpp @@ -0,0 +1,29 @@ +#pragma once + +#include + +class ClapTrap +{ + protected: + std::string _name; + int _life; + int _energy; + int _damage; + + public: + ClapTrap(); + ClapTrap(const ClapTrap& src); + ClapTrap(const std::string& name); + virtual ~ClapTrap(); + + ClapTrap &operator=(const ClapTrap& src); + + virtual void attack(const std::string& target); + void takeDamage(unsigned int amount); + void beRepaired(unsigned int amount); + + const std::string& getName() const; + int getLife() const; + int getEnergy() const; + int getDamage() const; +}; diff --git a/ex01/src/ScavTrap.cpp b/ex01/src/ScavTrap.cpp new file mode 100644 index 0000000..15ba1c0 --- /dev/null +++ b/ex01/src/ScavTrap.cpp @@ -0,0 +1,60 @@ +#include "ScavTrap.hpp" +#include "ClapTrap.hpp" + +#include +#include + +ScavTrap::ScavTrap() +{ + this->_name = ""; + this->_life = 100; + this->_energy = 50; + this->_damage = 20; + std::cout << "ScavTrap()" << std::endl; +} + +ScavTrap::ScavTrap(const std::string& name) +{ + this->_name = name; + this->_life = 100; + this->_energy = 50; + this->_damage = 20; + std::cout << "ScavTrap(" << name << ")" << std::endl; +} + +ScavTrap::ScavTrap(const ScavTrap& src): ClapTrap(src) +{ + *this = src; + std::cout << "ScavTrap(ScavTrap)" << std::endl; +} + +ScavTrap::~ScavTrap() +{ + std::cout << "~ScavTrap()" << std::endl; +} + +ScavTrap& ScavTrap::operator=(const ScavTrap &src) +{ + this->_life = src._life; + this->_name = src._name; + this->_energy = src._energy; + this->_damage = src._damage; + + return *this; +} + +void ScavTrap::guardGate() +{ + std::cout << "ScavTrap " << this->_name << " turn in Gate keeper mode" << std::endl; +} + +void ScavTrap::attack(const std::string& target) +{ + if (this->_life == 0 || this->_energy == 0) + { + std::cerr << "error: ScavTrap " << this->_name << " dead" << std::endl; + return; + } + this->_energy--; + std::cerr << "ScavTrap " << this->_name << " attacks " << target << ", causing " << this->_damage << " points of damage" << std::endl; +} diff --git a/ex01/src/ScavTrap.hpp b/ex01/src/ScavTrap.hpp new file mode 100644 index 0000000..f1cc842 --- /dev/null +++ b/ex01/src/ScavTrap.hpp @@ -0,0 +1,20 @@ +#pragma once + +#include "ClapTrap.hpp" +#include + +class ScavTrap: public ClapTrap +{ + public: + ScavTrap(); + ScavTrap(const std::string& name); + ScavTrap(const ScavTrap& src); + + ~ScavTrap(); + + ScavTrap& operator=(const ScavTrap& src); + + void guardGate(); + void attack(const std::string& target); + +}; diff --git a/ex01/src/main.cpp b/ex01/src/main.cpp new file mode 100644 index 0000000..02eb2fd --- /dev/null +++ b/ex01/src/main.cpp @@ -0,0 +1,21 @@ +#include "ScavTrap.hpp" + +int main() +{ + ClapTrap dead; + ScavTrap active ("Warrior"); + ScavTrap copy (active); + active = copy; + dead.attack(active.getName()); + active.attack(dead.getName()); + dead.takeDamage(active.getDamage()); + active.attack(dead.getName()); + dead.takeDamage(active.getDamage()); + active.attack(dead.getName()); + dead.takeDamage(active.getDamage()); + active.attack(dead.getName()); + dead.takeDamage(active.getDamage()); + active.attack(dead.getName()); + active.takeDamage(3); + dead.beRepaired(42); +}