From a5df8cdd29916963a20668b642b1e5f2f095dc20 Mon Sep 17 00:00:00 2001 From: Zeno Rogue Date: Wed, 1 Apr 2026 20:32:23 +0200 Subject: [PATCH] ru:: map switches --- rogueviz/ru/classes.cpp | 22 ++++++++++++++++++++++ rogueviz/ru/entity.cpp | 14 ++++++++++++++ rogueviz/ru/load-world.cpp | 24 ++++++++++++++++++++++++ 3 files changed, 60 insertions(+) diff --git a/rogueviz/ru/classes.cpp b/rogueviz/ru/classes.cpp index e388eff1..61431837 100644 --- a/rogueviz/ru/classes.cpp +++ b/rogueviz/ru/classes.cpp @@ -171,6 +171,12 @@ struct room { place_block_full(x, y, b); } + void replace_block_death(int x, int y, eWall w) { + auto orig = at(x, y); + replace_block(x, y, w); + add_revert(death_revert, {"BLOCK", id, its(x), its(y), its(orig)}); + } + void replace_block_frev(int x, int y, eWall w) { auto orig = at(x, y); replace_block(x, y, w); @@ -553,6 +559,22 @@ struct timed_orb : public located_entity { string get_help() override { return "These orbs activate mechanisms for a limited time."; } }; +struct switch_event { + bbox box; + eWall wall; + }; + +struct mapswitch : public located_entity { + vector events; + string text, name; + xy siz() override { return {18, 18}; } + string glyph() override { return "!"; } + color_t color() override { return 0xA06000FF; } + void act() override; + string get_name() override { return name; } + string get_help() override { return text; } + }; + struct npc_or_trader : public located_entity { string text, name; int talk_on; diff --git a/rogueviz/ru/entity.cpp b/rogueviz/ru/entity.cpp index 5fba4830..18c46698 100644 --- a/rogueviz/ru/entity.cpp +++ b/rogueviz/ru/entity.cpp @@ -369,6 +369,20 @@ void npc_or_trader::act() { } } +void mapswitch::act() { + if(intersect(get_pixel_bbox(), m.get_pixel_bbox())) { + bool didsomething = false; + for(auto& ev: events) { + for(int y=ev.box.miny; yat(x, y); + if(b != ev.wall) { didsomething = true; current_room->replace_block_death(x, y, ev.wall); } + } + } + if(didsomething) addMessage(text); + } + } + extern int gold_id; string shopitem::glyph() { if(bought) return powers[gold_id].get_glyph(); else return item::glyph(); } diff --git a/rogueviz/ru/load-world.cpp b/rogueviz/ru/load-world.cpp index 9efa5af8..a2085e32 100644 --- a/rogueviz/ru/load-world.cpp +++ b/rogueviz/ru/load-world.cpp @@ -105,6 +105,8 @@ void create_long_rope(room& r, int step, xy w) { } } +mapswitch *lmev; + void load_room(fhstream& f, cell *c) { setdist(c, 7, nullptr); auto& r = *get_room_at(c); @@ -370,6 +372,28 @@ void load_room(fhstream& f, cell *c) { b->text = scanline_noblank(f); visions.emplace_back(std::move(b)); } + else if(cap == "MAPSWITCH") { + auto b = std::make_unique(); + b->respawn = get_xy(); + b->name = scanline_noblank(f); + b->text = scanline_noblank(f); + lmev = &*b; + r.entities.emplace_back(std::move(b)); + } + else if(cap == "SWITCHEVENT") { + if(!lmev) throw hr_exception("SWITCHEVENT without MAPSWITCH"); + auto& ev = lmev->events; + ev.emplace_back(); + ev.back().box.minx = get_int(); + ev.back().box.miny = get_int(); + ev.back().box.maxx = get_int(); + ev.back().box.maxy = get_int(); + ev.back().wall = wDoor; + bool ok = false; + for(int i=0; i