--- /dev/null
+#include "ClapTrap.h"
+#include <string>
+#include <iostream>
+
+ClapTrap::ClapTrap(std::string name):
+ m_name(name), m_hp(10), m_energy(10), m_attack(0)
+{
+ std::cout << "ClapTrap " << m_name << " has spawned.\n";
+}
+
+ClapTrap::ClapTrap(const ClapTrap &other)
+{
+ std::cout << "ClapTrap " << m_name << " has spawned.\n";
+ *this = other;
+}
+
+ClapTrap::~ClapTrap()
+{
+ std::cout << "ClapTrap " << m_name << " has despawned.\n";
+}
+
+ClapTrap &ClapTrap::operator=(const ClapTrap &other)
+{
+ if (this == &other)
+ return (*this);
+ m_name = other.m_name;
+ m_hp = other.m_hp;
+ m_energy = other.m_energy;
+ m_attack = other.m_attack;
+ return (*this);
+}
+
+void ClapTrap::attack(const std::string &target)
+{
+ if (m_hp == 0)
+ std::cout << "ClapTrap " << m_name
+ << " is dead, hence cannot attack.\n";
+ else if (m_energy == 0)
+ std::cout << "ClapTrap " << m_name
+ << " does not have enough energy to attack.\n";
+ else
+ {
+ std::cout << "ClapTrap " << m_name
+ << " attacks " << target << " and deals " << m_attack << " damage.\n";
+ --m_energy;
+ }
+}
+
+void ClapTrap::takeDamage(unsigned int amount)
+{
+ if (m_hp == 0)
+ std::cout << m_name <<
+ " is already dead and cannot be damaged further.\n";
+ else if (amount >= m_hp)
+ {
+ std::cout << m_name
+ << " takes " << amount << " damage and dies\n";
+ m_hp = 0;
+ }
+ else
+ {
+ std::cout << m_name
+ << " takes " << amount << " damage.\n";
+ m_hp -= amount;
+ }
+}
+
+void ClapTrap::beRepaired(unsigned int amount)
+{
+ if (m_hp == 0)
+ std::cout << m_name
+ << " is dead, hence cannot repair itself.\n";
+ else if (m_energy == 0)
+ std::cout << m_name
+ << " does not have enough energy to repair itself.\n";
+ else
+ {
+ std::cout << m_name
+ << " repairs iself for " << amount << " hit points.\n";
+ m_hp += amount;
+ }
+}
--- /dev/null
+#ifndef CLAPTRAP_H
+# define CLAPTRAP_H
+
+# include <string>
+
+class ClapTrap
+{
+ protected:
+ std::string m_name;
+ unsigned int m_hp;
+ unsigned int m_energy;
+ unsigned int m_attack;
+
+ public:
+ ClapTrap(std::string name = "DEFAULT");
+ ClapTrap(const ClapTrap &other);
+ ~ClapTrap();
+
+ ClapTrap &operator=(const ClapTrap &other);
+
+ void attack(const std::string &target);
+ void takeDamage(unsigned int amount);
+ void beRepaired(unsigned int amount);
+};
+
+#endif // CLAPTRAP_H
--- /dev/null
+CC := c++
+CFLAGS = -std=c++98 -Wall -Wextra -Werror -Wpedantic
+
+ifneq ("$(wildcard .debug)","")
+ CFLAGS += -g
+endif
+
+RM := rm -f
+
+INCDIR := inc
+INCDIR += $(addsuffix /inc, $(SUBPROJECTS));
+ifneq ($(INCLUDE),)
+ INCLUDE := $(addprefix -I, $(INCDIR))
+endif
+
+SRCDIR := .
+
+SOURCES := main.cpp \
+ ClapTrap.cpp \
+ ScavTrap.cpp \
+
+SOURCES := $(addprefix $(SRCDIR)/, $(SOURCES))
+
+OBJECTS := $(SOURCES:.cpp=.o)
+
+NAME := scavtrap
+
+all : $(NAME)
+
+debug : .debug
+ $(MAKE) all
+
+nodebug :
+ $(RM) .debug
+ $(MAKE) re
+
+.% :
+ $(MAKE) shallow_fclean
+ touch $@
+
+$(NAME) : $(OBJECTS)
+ $(CC) $(CFLAGS) -o $@ $^ $(LINKS)
+
+%.o : %.cpp
+ $(CC) $(CFLAGS) -o $@ -c $< $(INCLUDE)
+
+clean :
+ $(RM) $(OBJECTS)
+
+fclean : clean
+ $(RM) $(NAME)
+
+re : fclean
+ $(MAKE) all
--- /dev/null
+#include "ScavTrap.h"
+#include "ClapTrap.h"
+#include <string>
+#include <iostream>
+
+ScavTrap::ScavTrap(std::string name): ClapTrap(name)
+{
+ std::cout << "ScavTrap " << m_name << " has spawned.\n";
+ m_hp = 100;
+ m_energy = 50;
+ m_attack = 20;
+ m_is_guading = 0;
+}
+
+ScavTrap::ScavTrap(const ScavTrap &other)
+{
+ *this = other;
+}
+
+ScavTrap::~ScavTrap()
+{
+ std::cout << "ScavTrap " << m_name << " has despawned.\n";
+}
+
+ScavTrap &ScavTrap::operator=(const ScavTrap &other)
+{
+ if (this == &other)
+ return (*this);
+ ClapTrap::operator=(other);
+ m_is_guading = other.m_is_guading;
+ return (*this);
+}
+
+void ScavTrap::attack(const std::string &target)
+{
+ if (m_hp == 0)
+ std::cout << "ScavTrap " << m_name
+ << " is dead, hence cannot attack.\n";
+ else if (m_energy == 0)
+ std::cout << "ScavTrap " << m_name
+ << " does not have enough energy to attack.\n";
+ else
+ {
+ std::cout << "ScavTrap " << m_name
+ << " attacks " << target << " and deals " << m_attack << " damage.\n";
+ --m_energy;
+ }
+}
--- /dev/null
+#ifndef SCAVTRAP_H
+# define SCAVTRAP_H
+
+# include "ClapTrap.h"
+# include <string>
+
+class ScavTrap : public ClapTrap
+{
+ private:
+ bool m_is_guading;
+
+ public:
+ ScavTrap(std::string name = "DEFAULT");
+ ScavTrap(const ScavTrap &other);
+ ~ScavTrap();
+
+ ScavTrap &operator=(const ScavTrap &other);
+
+ void attack(const std::string &target);
+ void guardGate();
+};
+
+#endif // SCAVTRAP_H
--- /dev/null
+#include "ClapTrap.h"
+#include "ScavTrap.h"
+
+int main()
+{
+ ScavTrap a("Alen");
+ ClapTrap def;
+
+ def.attack("foo");
+ def.takeDamage(9);
+ def.takeDamage(0);
+ def.beRepaired(6);
+ def.takeDamage(5);
+ def.takeDamage(1);
+ def.takeDamage(1);
+ def.takeDamage(1);
+ def.attack("foo");
+ def.beRepaired(10);
+ for (int i(0); i < 10; ++i)
+ a.attack("bar");
+ a.takeDamage(9);
+ a.attack("bar");
+ a.beRepaired(1);
+ a.takeDamage(100);
+ a.takeDamage(1);
+ a.attack("bar");
+ a.beRepaired(1);
+ return (0);
+}