From 09ed49cf80d448e4cf081ad6ec04e77e6efe0d84 Mon Sep 17 00:00:00 2001 From: Zeno Rogue Date: Sun, 29 Mar 2026 16:01:37 +0200 Subject: [PATCH] ru:: random potion powers are now restricted to rooms --- rogueviz/ru/classes.cpp | 5 +++++ rogueviz/ru/powers.cpp | 8 +++++++- rogueviz/ru/randeff.cpp | 9 +++++++++ rogueviz/ru/reverts.cpp | 5 +++++ rogueviz/ru/ru.cpp | 1 + rogueviz/ru/save.cpp | 7 +++++++ 6 files changed, 34 insertions(+), 1 deletion(-) diff --git a/rogueviz/ru/classes.cpp b/rogueviz/ru/classes.cpp index f711e925..edd2177e 100644 --- a/rogueviz/ru/classes.cpp +++ b/rogueviz/ru/classes.cpp @@ -12,8 +12,11 @@ struct data { struct power *p; struct randeff *re; rev mode; + flagtype flags; }; +flagtype DO_NOT_DRINK = 1; + using powerfun = hr::function; struct randeff { @@ -24,6 +27,7 @@ struct randeff { power *which_weapon; int qty, a, b, c, d; powerfun act; + powerfun unact; randeff (string name, string desc, string effect, powerfun act); void hs(struct stater& s); }; @@ -44,6 +48,7 @@ struct power { int flags; int random_value; vector randeffs; + set active_in_rooms; void init(); vector mods; hr::function act, paused_act, dead_act; diff --git a/rogueviz/ru/powers.cpp b/rogueviz/ru/powers.cpp index ce041ef8..ea69d387 100644 --- a/rogueviz/ru/powers.cpp +++ b/rogueviz/ru/powers.cpp @@ -236,8 +236,13 @@ power& power::be_potion() { } void random_potion_act(data& d) { - if(d.p->qty_filled == d.p->qty_owned) d.p->flags &=~ ACTIVE; + if(d.p->qty_filled == d.p->qty_owned) d.p->active_in_rooms.clear(); + d.p->flags &=~ ACTIVE; + if(d.p->active_in_rooms.count(current_room)) d.p->flags |= ACTIVE; if(d.keystate == 1 && !(d.p->flags & ACTIVE)) { + d.flags &=~ DO_NOT_DRINK; + for(auto& e: d.p->randeffs) e->unact(d); + if(d.flags & DO_NOT_DRINK) return; if(d.p->qty_filled == 0) { addMessage("You have no more " + d.p->get_name()); return; @@ -250,6 +255,7 @@ void random_potion_act(data& d) { d.re = e; d.mode = rev::start; e->act(d); } + d.p->active_in_rooms.insert(current_room); d.p->flags |= (ACTIVE | PARTIAL | IDENTIFIED); d.p->qty_filled--; } diff --git a/rogueviz/ru/randeff.cpp b/rogueviz/ru/randeff.cpp index 542a1fdb..b5f2bcdc 100644 --- a/rogueviz/ru/randeff.cpp +++ b/rogueviz/ru/randeff.cpp @@ -7,6 +7,7 @@ randeff::randeff (string name, string desc, string effect, powerfun act) id = unspace(name); if(!all_effects) all_effects = new map; (*all_effects)[id] = this; + unact = [] (data&d) {}; } randeff inc_str("Strength", "Increases your Strength by 50%.", "You feel stronger!", [] (data &d) { m.next.stats[stat::str] += m.current.stats[stat::str] / 3; }); @@ -263,6 +264,14 @@ vector all_weapons() { return res; } +void gen_randeffs() { + powerfun unmorph = [] (data& d) { + if(m.morphed) { m.handle_morph(nullptr); if(!m.morphed) d.flags |= DO_NOT_DRINK; } + }; + morph_cat.unact = unmorph; + morph_capy.unact = unmorph; + } + void assign_potion_powers() { vector random_powers = { &inc_str, &inc_dex, &inc_con, &inc_wis, &dec_str, &dec_dex, &dec_con, &dec_wis, &hallux, &confux }; hrandom_shuffle(random_powers); diff --git a/rogueviz/ru/reverts.cpp b/rogueviz/ru/reverts.cpp index 022321be..0a649f9b 100644 --- a/rogueviz/ru/reverts.cpp +++ b/rogueviz/ru/reverts.cpp @@ -12,6 +12,11 @@ room *find_room_by_name(string s) { throw hr_name_error("find_room"); } +room *may_find_room_by_id(string s) { + for(auto& [c,r]: rooms) if(r.id == s) return &r; + return nullptr; + } + entity* find_entity_by_id(string s) { auto e = entity_by_id[s]; if(!e) throw hr_name_error("find_entity"); diff --git a/rogueviz/ru/ru.cpp b/rogueviz/ru/ru.cpp index dc52e2d1..60760ec9 100644 --- a/rogueviz/ru/ru.cpp +++ b/rogueviz/ru/ru.cpp @@ -409,6 +409,7 @@ void enable() { set_sval(); init_scales(); gen_powers(); + gen_randeffs(); shuffle_all(); hyperpoint aleft = deparabolic13(to_hyper(l_margin_at, yctr)); diff --git a/rogueviz/ru/save.cpp b/rogueviz/ru/save.cpp index 0cdce455..7e78390e 100644 --- a/rogueviz/ru/save.cpp +++ b/rogueviz/ru/save.cpp @@ -49,6 +49,7 @@ void save_as(string fname) { // list current powers for(auto& p: powers) { save_via_stater(f, p, "POWER", isize(p.randeffs)); + for(auto& r: p.active_in_rooms) println(f, "ACTIVE-IN ", r->id); for(auto& r: p.randeffs) save_via_stater(f, *r, "EFFECT", true); } @@ -212,6 +213,7 @@ void load_from(string fname) { current_power = nullptr; try { current_power = &find_power_by_id(param); + current_power->active_in_rooms.clear(); load_hs(f, *current_power); current_power->randeffs = {}; } @@ -219,6 +221,11 @@ void load_from(string fname) { println(hlog, "warning: unknown power: ", param); } } + else if(cap == "ACTIVE-IN") { + auto r = may_find_room_by_id(param); + if(!r) println(hlog, "warning: active in a room that does not exist"); + current_power->active_in_rooms.insert(r); + } else if(cap == "EFFECT") { if(!all_effects->count(param)) { println(hlog, "warning: unknown effect: ", param);