1
0
mirror of https://github.com/zenorogue/hyperrogue.git synced 2025-06-10 18:34:08 +00:00

ru:: base XP and HP set for existing monsters, XP is awarded

This commit is contained in:
Zeno Rogue 2025-05-05 18:06:03 +02:00
parent 38c64002dd
commit 1e23eed4e3
2 changed files with 18 additions and 5 deletions

View File

@ -318,9 +318,14 @@ struct npc : public entity {
struct enemy : public entity {
xy respawn;
int num_kills;
void on_kill() override { entity::on_kill(); num_kills++; }
void on_kill() override {
entity::on_kill();
num_kills++;
m.experience += (base_xp() * 25 + 24) / (4 + num_kills) / (4 + num_kills);
}
enemy() { num_kills = 0; postfix(); }
void regenerate() override { where = respawn; vel = xy(0, 0); existing = true; hp = max_hp(); }
virtual int base_xp() { return 0; }
};
@ -332,6 +337,8 @@ struct boar : public enemy {
void attacked(int s) override;
string get_name() override { return "giant boar"; }
string get_help() override { return "Beware their tusks."; }
int base_xp() { return 60; }
int max_hp() { return 60; }
};
struct snake : public enemy {
@ -344,6 +351,8 @@ struct snake : public enemy {
string get_name() override { return "snake"; }
string get_help() override { return "A nasty dungeon snake."; }
void regenerate() override { enemy::regenerate(); dir = respawn_dir; }
int base_xp() { return 10; }
int max_hp() { return 30; }
};
struct kestrel : public enemy {
@ -356,6 +365,8 @@ struct kestrel : public enemy {
string get_name() override { return "kestrel"; }
string get_help() override { return "A standard dungeon kestrel."; }
void regenerate() override { enemy::regenerate(); vel = respawn_vel; }
int base_xp() { return 30; }
int max_hp() { return 30; }
};
struct bat : public enemy {
@ -367,6 +378,8 @@ struct bat : public enemy {
void attacked(int s) override;
string get_name() override { return "bat"; }
string get_help() override { return "A cave bat."; }
int base_xp() { return 10; }
int max_hp() { return 10; }
};
struct hint : public entity {

View File

@ -131,26 +131,26 @@ void load_room(fhstream& f, cell *c) {
else if(cap == "BOAR") {
auto b = std::make_unique<boar>();
sscanf(param.c_str(), "%lf%lf", &b->where.x, &b->where.y);
b->respawn = b->where;
b->respawn = b->where; b->postfix();
r.entities.emplace_back(std::move(b));
}
else if(cap == "BAT") {
auto b = std::make_unique<bat>();
sscanf(param.c_str(), "%lf%lf", &b->where.x, &b->where.y);
b->respawn = b->where;
b->respawn = b->where; b->postfix();
r.entities.emplace_back(std::move(b));
}
else if(cap == "KESTREL") {
auto b = std::make_unique<kestrel>();
sscanf(param.c_str(), "%lf%lf%lf%lf", &b->where.x, &b->where.y, &b->vel.x, &b->vel.y);
b->vel *= xy(block_x, block_y) / game_fps;
b->respawn = b->where; b->respawn_vel = b->vel;
b->respawn = b->where; b->respawn_vel = b->vel; b->postfix();
r.entities.emplace_back(std::move(b));
}
else if(cap == "SNAKE") {
auto b = std::make_unique<snake>();
sscanf(param.c_str(), "%lf%lf%d", &b->where.x, &b->where.y, &b->dir);
b->respawn = b->where; b->respawn_dir = b->dir;
b->respawn = b->where; b->respawn_dir = b->dir; b->postfix();
r.entities.emplace_back(std::move(b));
}
else if(cap == "FERRIS") {