adg5/Destructible.cpp

61 lines
1.6 KiB
C++

#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;
}