diff --git a/rogueviz/ru/classes.cpp b/rogueviz/ru/classes.cpp index b55d0ab0..84791cfe 100644 --- a/rogueviz/ru/classes.cpp +++ b/rogueviz/ru/classes.cpp @@ -316,7 +316,7 @@ struct entity { virtual void draw(); - virtual void attacked(int s) {} + virtual void attacked(int s, power *p) {} virtual void spiked() { reduce_hp(10); @@ -564,7 +564,7 @@ struct enemy : public located_entity { if(!avoided) score(); } virtual void hs(stater& s) override { located_entity::hs(s); s.only_full().act("kills", num_kills, 0); s.act("avoided", avoided, false); } - void attacked(int s) override; + void attacked(int s, power *p) override; virtual int base_xp() { return 0; } bool hit_by_missile(missile *m) override { return true; } enemy* as_enemy() override { return this; } @@ -610,7 +610,7 @@ struct boar : public enemy { string glyph() override { return "B"; } color_t color() override { return 0x804000FF; } void act() override; - void attacked(int s) override; + void attacked(int s, power *p) override; string get_name() override { return "giant boar"; } string get_help() override { return "Beware their tusks."; } int base_xp() { return 60; } @@ -625,7 +625,7 @@ struct frog : public enemy { ld maxrange() { return 50; } color_t color() override { return 0x208020FF; } void act() override; - void attacked(int s) override; + void attacked(int s, power *p) override; string get_name() override { return "frog"; } string get_help() override { return "What a nice frog."; } int base_xp() { return 30; } @@ -668,7 +668,7 @@ struct snake : public enemy { string glyph() override { return "S"; } color_t color() override { return 0x20D020FF; } void act() override; - void attacked(int s) override; + void attacked(int s, power *p) override; string get_name() override { return "snake"; } string get_help() override { return "A nasty dungeon snake."; } int base_xp() override { return 10; } @@ -704,7 +704,7 @@ struct naga_warrior : public snake { int max_hp() override { return 500; } xy siz() override { return {25, 25}; } void act() override; - void attacked(int s) override; + void attacked(int s, power *p) override; void draw() override; virtual int chop() { return 32; } }; @@ -715,7 +715,7 @@ struct kestrel : public enemy { string glyph() override { return "K"; } color_t color() override { return 0xD0A0A0FF; } void act() override; - void attacked(int s) override; + void attacked(int s, power *p) override; string get_name() override { return "kestrel"; } string get_help() override { return "A standard dungeon kestrel."; } int base_xp() { return 30; } @@ -753,7 +753,7 @@ struct bat : public enemy { string glyph() override { return "B"; } color_t color() override { return 0xD0A0A0FF; } void act() override; - void attacked(int s) override; + void attacked(int s, power *p) override; string get_name() override { return "bat"; } string get_help() override { return "A cave bat."; } int base_xp() { return 10; } @@ -770,7 +770,7 @@ struct guineapig : public enemy { string glyph() override { return "G"; } color_t color() override { return 0xD0A0A0FF; } void act() override; - void attacked(int s) override; + void attacked(int s, power *p) override; string get_name() override { return "guinea pig"; } string get_help() override { return "A standard dungeon guinea pig."; } int base_xp() { return 30; } diff --git a/rogueviz/ru/entity.cpp b/rogueviz/ru/entity.cpp index a8c969cb..7719643d 100644 --- a/rogueviz/ru/entity.cpp +++ b/rogueviz/ru/entity.cpp @@ -349,7 +349,7 @@ void missile::act() { if(freezing() && e->as_missile() && e->burning()) { destroyed = true; e->destroyed = true; } hit_list.insert(&*e); e->invinc_end = 0; - e->attacked(power); + e->attacked(power, burning() ? fire_power : freezing() ? ice_power : nullptr); } } @@ -425,15 +425,15 @@ void boar::act() { } } -void enemy::attacked(int dmg) { +void enemy::attacked(int dmg, power *p) { current_target = this; if(reduce_hp(dmg)) { if(!existing) addMessage("You kill the " + hal()->get_name() + "."); else addMessage("You hit the " + hal()->get_name() + "."); } } -void boar::attacked(int dmg) { - enemy::attacked(dmg); +void boar::attacked(int dmg, power *p) { + enemy::attacked(dmg, p); auto dat = get_dat(); int s = where.x < m.where.x ? -1 : 1; if(on_floor) vel.x = dat.d * dat.modv * s * 2, vel.y = -dat.d * dat.modv * 2.5; @@ -486,8 +486,8 @@ void frog::act() { } } -void frog::attacked(int dmg) { - enemy::attacked(dmg); +void frog::attacked(int dmg, power *p) { + enemy::attacked(dmg, p); auto dat = get_dat(); int s = where.x < m.where.x ? -1 : 1; if(on_floor) vel.x = dat.d * dat.modv * s * 2, vel.y = -dat.d * dat.modv * 2.5; @@ -526,8 +526,8 @@ void snake::act() { } } -void snake::attacked(int dmg) { - enemy::attacked(dmg); +void snake::attacked(int dmg, power *p) { + enemy::attacked(dmg, p); dir *= -1; if(where.x < m.where.x) vel.x = -abs(vel.x); if(where.x > m.where.x) vel.x = +abs(vel.x); @@ -571,8 +571,8 @@ void naga_warrior::draw() { } } -void naga_warrior::attacked(int dmg) { - enemy::attacked(dmg); // do not reverse on being attacked! +void naga_warrior::attacked(int dmg, power *p) { + enemy::attacked(dmg, p); // do not reverse on being attacked! } void hint::act() { @@ -884,8 +884,8 @@ void guineapig::act() { falling = true; vel = xy(0, 0); } -void guineapig::attacked(int dmg) { - enemy::attacked(dmg); +void guineapig::attacked(int dmg, power *p) { + enemy::attacked(dmg, p); spindir *= -1; } @@ -904,14 +904,14 @@ void vtrap::act() { } } -void kestrel::attacked(int dmg) { - enemy::attacked(dmg); +void kestrel::attacked(int dmg, power *p) { + enemy::attacked(dmg, p); if(where.x < m.where.x) vel.x = -abs(vel.x); if(where.x > m.where.x) vel.x = +abs(vel.x); } -void bat::attacked(int dmg) { - enemy::attacked(dmg); +void bat::attacked(int dmg, power *p) { + enemy::attacked(dmg, p); if(where.x < m.where.x) vel.x = -abs(vel.x); if(where.x > m.where.x) vel.x = +abs(vel.x); if(where.y < m.where.y) vel.y = -abs(vel.y); diff --git a/rogueviz/ru/globals.cpp b/rogueviz/ru/globals.cpp index a4e8d23b..bbd5ff30 100644 --- a/rogueviz/ru/globals.cpp +++ b/rogueviz/ru/globals.cpp @@ -198,4 +198,7 @@ string unspace(const string& s); string respace(const string& s); extern map entity_by_id; + +extern power *fire_power, *ice_power, *thief_power; + } diff --git a/rogueviz/ru/man.cpp b/rogueviz/ru/man.cpp index 6477d633..236165c8 100644 --- a/rogueviz/ru/man.cpp +++ b/rogueviz/ru/man.cpp @@ -201,7 +201,7 @@ void man::launch_attack(power *p, int fac, boxfun f) { if(e->existing && intersect(e->get_pixel_bbox(), pb)) { int sav = e->invinc_end; int dam = (m.current.stats[stat::str] + 1) * 3 / 2; - e->attacked(dam); + e->attacked(dam, p); for(auto& md: p->mods) md.action(&*e, dam, sav); } for(int y=bb.miny; yexisting = false; addMessage("You have disarmed a "+e->hal()->get_name()+"."); } + e->invinc_end = sav; e->attacked(0, thief_power); }, [] (int x, int y) { int b = current_room->at(x, y); @@ -197,7 +198,7 @@ randeff fire_weapon("Fiery Weapon", "Attacks with your [weapon] set things on fi [] (color_t& col) { col = gradient(0xFFFF00FF, 0xFF0000FF, -1, sin(ticks/100), 1); }, [] (string& s) { s = "burning " + s; }, [] (entity *e, int dam, int sav) { - e->invinc_end = sav; e->attacked(2 * m.current.stats[stat::wis] + 1e-6); + e->invinc_end = sav; e->attacked(2 * m.current.stats[stat::wis] + 1e-6, fire_power); }, [] (int x, int y) { int b = current_room->at(x, y); @@ -217,7 +218,7 @@ randeff ice_weapon("Chill Weapon", "Attacks with your [weapon] freeze things.", [] (color_t& col) { col = 0x8080FFFF; }, [] (string& s) { s = "freezing " + s; }, [] (entity *e, int dam, int sav) { - e->invinc_end = sav; e->attacked(2 * m.current.stats[stat::wis] + 1e-6); + e->invinc_end = sav; e->attacked(2 * m.current.stats[stat::wis] + 1e-6, ice_power); }, [] (int x, int y) { int b = current_room->at(x, y);