diff --git a/rogueviz/ru/classes.cpp b/rogueviz/ru/classes.cpp index 887ec61e..452867a6 100644 --- a/rogueviz/ru/classes.cpp +++ b/rogueviz/ru/classes.cpp @@ -577,6 +577,19 @@ struct located_entity : public entity { xy default_where() override { return respawn; } }; +struct rollingsaw: public located_entity { + string glyph() override { return "*"; } + color_t color() override { return walls[wWall].color; } + xy siz() override { return {8, 8}; } + string get_name() override { return "rolling saw"; } + void act() override; + int dir, respawn_dir; + xy default_vel() override { + auto dat = get_dat(); return {dat.d * dat.modv * dir, 0}; + } + virtual void hs(stater& s) override { s.act("dir", dir, respawn_dir); located_entity::hs(s); } + }; + struct timed_orb : public located_entity { int duration; xy siz() override { return {18, 18}; } diff --git a/rogueviz/ru/entity.cpp b/rogueviz/ru/entity.cpp index 8cd1aa09..90a0be05 100644 --- a/rogueviz/ru/entity.cpp +++ b/rogueviz/ru/entity.cpp @@ -1075,4 +1075,20 @@ void guard_event::act() { } } +void rollingsaw::act() { + stay_on_screen(); + kino(); + if(on_floor) { + auto dat = get_dat(); + if(abs(vel.x) < 1e-6) { + dir = -dir; + } + vel.x = zero_vel.x + dat.d * dat.modv * dir; + } + if(intersect(get_pixel_bbox(), m.get_pixel_bbox()) && gframeid > invinc_end) { + if(m.reduce_hp(60)) addMessage("The " + hal()->get_name() + " shreds you!"); + } + } + + } diff --git a/rogueviz/ru/load-world.cpp b/rogueviz/ru/load-world.cpp index 9b994e50..a8ea607f 100644 --- a/rogueviz/ru/load-world.cpp +++ b/rogueviz/ru/load-world.cpp @@ -377,6 +377,12 @@ void load_room(fhstream& f, cell *c) { b->base = std::move(r.entities.back()); r.entities.back() = std::move(b); } + else if(cap == "ROLLINGSAW") { + auto b = std::make_unique(); nam(*b); + b->respawn = get_xy(); + b->respawn_dir = get_int(); + r.entities.emplace_back(std::move(b)); + } else if(cap == "HINT") { auto b = std::make_unique(); b->respawn = get_xy(); b->size = get_xy();