1
0
mirror of https://github.com/zenorogue/hyperrogue.git synced 2025-06-15 21:04: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 { struct enemy : public entity {
xy respawn; xy respawn;
int num_kills; 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(); } enemy() { num_kills = 0; postfix(); }
void regenerate() override { where = respawn; vel = xy(0, 0); existing = true; hp = max_hp(); } 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; void attacked(int s) override;
string get_name() override { return "giant boar"; } string get_name() override { return "giant boar"; }
string get_help() override { return "Beware their tusks."; } string get_help() override { return "Beware their tusks."; }
int base_xp() { return 60; }
int max_hp() { return 60; }
}; };
struct snake : public enemy { struct snake : public enemy {
@ -344,6 +351,8 @@ struct snake : public enemy {
string get_name() override { return "snake"; } string get_name() override { return "snake"; }
string get_help() override { return "A nasty dungeon snake."; } string get_help() override { return "A nasty dungeon snake."; }
void regenerate() override { enemy::regenerate(); dir = respawn_dir; } void regenerate() override { enemy::regenerate(); dir = respawn_dir; }
int base_xp() { return 10; }
int max_hp() { return 30; }
}; };
struct kestrel : public enemy { struct kestrel : public enemy {
@ -356,6 +365,8 @@ struct kestrel : public enemy {
string get_name() override { return "kestrel"; } string get_name() override { return "kestrel"; }
string get_help() override { return "A standard dungeon kestrel."; } string get_help() override { return "A standard dungeon kestrel."; }
void regenerate() override { enemy::regenerate(); vel = respawn_vel; } void regenerate() override { enemy::regenerate(); vel = respawn_vel; }
int base_xp() { return 30; }
int max_hp() { return 30; }
}; };
struct bat : public enemy { struct bat : public enemy {
@ -367,6 +378,8 @@ struct bat : public enemy {
void attacked(int s) override; void attacked(int s) override;
string get_name() override { return "bat"; } string get_name() override { return "bat"; }
string get_help() override { return "A cave bat."; } string get_help() override { return "A cave bat."; }
int base_xp() { return 10; }
int max_hp() { return 10; }
}; };
struct hint : public entity { struct hint : public entity {

View File

@ -131,26 +131,26 @@ void load_room(fhstream& f, cell *c) {
else if(cap == "BOAR") { else if(cap == "BOAR") {
auto b = std::make_unique<boar>(); auto b = std::make_unique<boar>();
sscanf(param.c_str(), "%lf%lf", &b->where.x, &b->where.y); 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)); r.entities.emplace_back(std::move(b));
} }
else if(cap == "BAT") { else if(cap == "BAT") {
auto b = std::make_unique<bat>(); auto b = std::make_unique<bat>();
sscanf(param.c_str(), "%lf%lf", &b->where.x, &b->where.y); 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)); r.entities.emplace_back(std::move(b));
} }
else if(cap == "KESTREL") { else if(cap == "KESTREL") {
auto b = std::make_unique<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); 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->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)); r.entities.emplace_back(std::move(b));
} }
else if(cap == "SNAKE") { else if(cap == "SNAKE") {
auto b = std::make_unique<snake>(); auto b = std::make_unique<snake>();
sscanf(param.c_str(), "%lf%lf%d", &b->where.x, &b->where.y, &b->dir); 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)); r.entities.emplace_back(std::move(b));
} }
else if(cap == "FERRIS") { else if(cap == "FERRIS") {