From 299a3b64c6940df663f1ab2608e7cb65740f2720 Mon Sep 17 00:00:00 2001 From: Zeno Rogue Date: Sat, 24 May 2025 17:15:01 +0200 Subject: [PATCH] ru:: mods, used to let fiery weapon work --- rogueviz/ru/classes.cpp | 4 ++++ rogueviz/ru/man.cpp | 3 +++ rogueviz/ru/powers.cpp | 41 ++++++++++++++++++++++++++++++++++++----- rogueviz/ru/randeff.cpp | 5 ++++- 4 files changed, 47 insertions(+), 6 deletions(-) diff --git a/rogueviz/ru/classes.cpp b/rogueviz/ru/classes.cpp index 244d22a5..04d87d6c 100644 --- a/rogueviz/ru/classes.cpp +++ b/rogueviz/ru/classes.cpp @@ -26,6 +26,8 @@ struct randeff { randeff (string name, string desc, string effect, powerfun act) : name(name), desc(desc), effect(effect), act(act) {} }; +enum class mod { burning, freezing }; + struct power { int key; string name; @@ -40,6 +42,7 @@ struct power { int random_flavor; vector randeffs; void init(); + vector> mods; hr::function act, paused_act, dead_act; hr::function get_name; hr::function get_desc; @@ -291,6 +294,7 @@ struct statdata { statarray stats; int jump_control, coyote_time, hallucinating; void reset(); + vector> mods; }; struct man : public entity { diff --git a/rogueviz/ru/man.cpp b/rogueviz/ru/man.cpp index d149fe97..1c4ffef4 100644 --- a/rogueviz/ru/man.cpp +++ b/rogueviz/ru/man.cpp @@ -42,6 +42,7 @@ void statdata::reset() { coyote_time = 0; jump_control = 0; hallucinating = false; + mods.clear(); } void man::act() { @@ -55,6 +56,8 @@ void man::act() { auto h = max_hp(); current = next; next.reset(); + for(auto& po: powers) po.mods.clear(); + for(auto& [po, type, val]: current.mods) po->mods.emplace_back(type, val); if(h != max_hp()) hp = randround(1. * hp * max_hp() / h); auto dat = get_dat(); diff --git a/rogueviz/ru/powers.cpp b/rogueviz/ru/powers.cpp index a24028b8..477d9f89 100644 --- a/rogueviz/ru/powers.cpp +++ b/rogueviz/ru/powers.cpp @@ -26,7 +26,22 @@ string addqof(string base, power *p) { power& power::be_weapon() { flags |= WEAPON; picked_up = [this] (int x) { qty_owned += x; qty_filled = max(qty_filled, x); }; - auto gn = get_name; get_name = [gn, this] { return addqof(gn(), this); }; + auto gn = get_name; get_name = [gn, this] { + string s = addqof(gn(), this); + for(auto& [m, qty]: mods) { + if(m == mod::burning) s = "flaming " + s; + if(m == mod::freezing) s = "freezing " + s; + } + return s; + }; + auto gc = get_color; get_color = [gc, this] { + auto col = gc(); + for(auto& [m, qty]: mods) { + if(m == mod::burning) col = gradient(0xFFFF00FF, 0xFF0000FF, -1, sin(ticks/100), 1); + if(m == mod::freezing) col = 0x8080FFFF; + } + return col; + }; return self; } @@ -305,15 +320,31 @@ void gen_powers() { m.attack_facing = m.facing; m.attack_when = gframeid; auto pb = m.get_pixel_bbox_at(xy{m.where.x + m.attack_facing * m.dsiz().x, m.where.y}); auto bb = pixel_to_block(pb); - for(auto& e: current_room->entities) if(e->existing && intersect(e->get_pixel_bbox(), pb)) e->attacked((m.current.stats[stat::str] + 1) * 3 / 2); + for(auto& e: current_room->entities) + if(e->existing && intersect(e->get_pixel_bbox(), pb)) { + int sav = e->invinc_end; + e->attacked((m.current.stats[stat::str] + 1) * 3 / 2); + for(auto& [m, qty]: d.p->mods) { + if(m == mod::burning) { e->invinc_end = sav; e->attacked(qty); } + if(m == mod::freezing) { e->invinc_end = sav; e->attacked(qty); } + } + } for(int y=bb.miny; yat(x, y); if(b == wDoor) { - current_room->replace_block(x, y, wSmashedDoor); + current_room->replace_block_frev(x, y, wSmashedDoor); addMessage("You smash the door!"); - auto cr = current_room; - add_revert(fountain_revert, [cr, x, y] { cr->replace_block(x, y, wDoor); }); + } + for(auto& [m, qty]: d.p->mods) { + if(m == mod::burning && b == wWoodWall) { + current_room->replace_block_frev(x, y, wAir); + addMessage("You burn the wall!"); + } + if(m == mod::freezing && b == wWater) { + current_room->replace_block_frev(x, y, wFrozen); + addMessage("You freeze the water!"); + } } } }).be_weapon(), diff --git a/rogueviz/ru/randeff.cpp b/rogueviz/ru/randeff.cpp index 267b904d..64a1dbfc 100644 --- a/rogueviz/ru/randeff.cpp +++ b/rogueviz/ru/randeff.cpp @@ -82,7 +82,10 @@ randeff fire_spit("Fiery Spit", "Lets you spit fire.", "You feel fire in your mo current_room->entities.emplace_back(std::move(mi)); } }); -randeff fire_weapon("Fiery Weapon", "Attacks with your [weapon] set things on fire.", "Your hands glow, and your [weapon] burst into flame!", [] (data &d) { }); +randeff fire_weapon("Fiery Weapon", "Attacks with your [weapon] set things on fire.", "Your hands glow, and your [weapon] burst into flame!", [] (data &d) { + if(d.mode == rev::active) + m.next.mods.emplace_back(d.re->which_weapon, mod::burning, 2 * m.current.stats[stat::wis] + 1e-6); + }); // morph powers randeff morph_cat("Cat", "Turns you into a cat.", "You turn into a cat!", [] (data &d) { });