61 lines
1.6 KiB
C++
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;
|
|
} |