#include "Destructible.h" #include "Actor.h" #include "Engine.h" #include "Gui.h" Destructible::Destructible(float maxHp, float defense, std::string corpseName) : maxHp(maxHp), hp(maxHp), defense(defense), corpseName(corpseName) { } float Destructible::takeDamage(Actor* owner, float damage) { damage -= defense; if (damage > 0) { hp -= damage; if (hp <= 0) { die(owner); } } else { damage = 0; } return damage; } float Destructible::heal(float amount) { hp += amount; if (hp > maxHp) { amount -= hp - maxHp; hp = maxHp; } return amount; } void Destructible::die(Actor* owner) { // transform the actor into a corpse! owner->ch = "%"; owner->col = TCOD_ColorRGB(100, 0, 0); owner->name = corpseName; owner->blocks = false; // make sure corpses are drawn before living actors engine->sendToBack(owner); } MonsterDestructible::MonsterDestructible(float maxHp, float defense, std::string corpseName) : Destructible(maxHp, defense, corpseName) { } PlayerDestructible::PlayerDestructible(float maxHp, float defense, std::string corpseName) : Destructible(maxHp, defense, corpseName) { } void MonsterDestructible::die(Actor* owner) { // transform it into a nasty corpse! it doesn't block, can't be // attacked and doesn't move engine->gui->message(TCOD_ColorRGB(150, 150, 150), "%s is dead\n", owner->name.c_str()); Destructible::die(owner); } void PlayerDestructible::die(Actor* owner) { engine->gui->message(TCOD_ColorRGB(150, 0, 0), "You died!\n"); Destructible::die(owner); engine->gameStatus = Engine::DEFEAT; }