diff --git a/rogueviz/ru/classes.cpp b/rogueviz/ru/classes.cpp index 0efaa9a8..71214ab6 100644 --- a/rogueviz/ru/classes.cpp +++ b/rogueviz/ru/classes.cpp @@ -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 { diff --git a/rogueviz/ru/save.cpp b/rogueviz/ru/save.cpp index 31865cdf..40716844 100644 --- a/rogueviz/ru/save.cpp +++ b/rogueviz/ru/save.cpp @@ -131,26 +131,26 @@ void load_room(fhstream& f, cell *c) { else if(cap == "BOAR") { auto b = std::make_unique(); 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(); 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(); 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(); 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") {