From a9fec4e0ae6e20b746b4236327fda1a6b87a4c38 Mon Sep 17 00:00:00 2001 From: PatR Date: Thu, 28 Jul 2022 13:42:35 -0700 Subject: [PATCH] github issue #828 - confuse monster effect when \ hero is invisible without being able to see invisible Issue reported by EndHack: you could see your hands glow red when reading a scroll of confuse monster or casting the spell of confuse monster even if you were unable to see yourself. Switch to the blind feedback (tingling instead of glowing red) if invisible without see invisible. Also, have uncursed scroll or low skilled spell confer 1..2 turns of glowing hands instead of always just 1. (Blessed/highly skilled stays at 2..9 turns.) Fixes #828 --- doc/fixes3-7-0.txt | 2 ++ src/read.c | 39 +++++++++++++++++++++------------------ src/uhitm.c | 10 +++++++--- 3 files changed, 30 insertions(+), 21 deletions(-) diff --git a/doc/fixes3-7-0.txt b/doc/fixes3-7-0.txt index ebbaf82ba..9f56a0e83 100644 --- a/doc/fixes3-7-0.txt +++ b/doc/fixes3-7-0.txt @@ -981,6 +981,8 @@ allow cutting a known spider web with wielded weapon by force-fighting the web holes and trapdoors have a fixed exit level recent changes to losedogs() could result in an infinite loop when migrating monsters try to arrive as hero moves to a different level +when invisible without see invisible you could see your hands glowing red + after reading a scroll of confuse monster and delivering melee hits Fixes to 3.7.0-x Problems that Were Exposed Via git Repository diff --git a/src/read.c b/src/read.c index 3299ce2bd..50cc1611f 100644 --- a/src/read.c +++ b/src/read.c @@ -1273,9 +1273,10 @@ static void seffect_confuse_monster(struct obj **sobjp) { struct obj *sobj = *sobjp; - boolean sblessed = sobj->blessed; - boolean scursed = sobj->cursed; - boolean confused = (Confusion != 0); + boolean sblessed = sobj->blessed, + scursed = sobj->cursed, + confused = (Confusion != 0), + altfeedback = (Blind || Invisible); if (g.youmonst.data->mlet != S_HUMAN || scursed) { if (!HConfusion) @@ -1284,36 +1285,38 @@ seffect_confuse_monster(struct obj **sobjp) } else if (confused) { if (!sblessed) { Your("%s begin to %s%s.", makeplural(body_part(HAND)), - Blind ? "tingle" : "glow ", - Blind ? "" : hcolor(NH_PURPLE)); + altfeedback ? "tingle" : "glow ", + altfeedback ? "" : hcolor(NH_PURPLE)); make_confused(HConfusion + rnd(100), FALSE); } else { pline("A %s%s surrounds your %s.", - Blind ? "" : hcolor(NH_RED), - Blind ? "faint buzz" : " glow", body_part(HEAD)); + altfeedback ? "" : hcolor(NH_RED), + altfeedback ? "faint buzz" : " glow", body_part(HEAD)); make_confused(0L, TRUE); } } else { + int incr = 0; + if (!sblessed) { Your("%s%s %s%s.", makeplural(body_part(HAND)), - Blind ? "" : " begin to glow", - Blind ? (const char *) "tingle" : hcolor(NH_RED), + altfeedback ? "" : " begin to glow", + altfeedback ? (const char *) "tingle" : hcolor(NH_RED), u.umconf ? " even more" : ""); - u.umconf++; + incr = rnd(2); } else { - if (Blind) + if (altfeedback) Your("%s tingle %s sharply.", makeplural(body_part(HAND)), u.umconf ? "even more" : "very"); else - Your("%s glow a%s brilliant %s.", + Your("%s glow %s brilliant %s.", makeplural(body_part(HAND)), - u.umconf ? "n even more" : "", hcolor(NH_RED)); - /* after a while, repeated uses become less effective */ - if (u.umconf >= 40) - u.umconf++; - else - u.umconf += rn1(8, 2); + u.umconf ? "an even more" : "a", hcolor(NH_RED)); + incr = rn1(8, 2); } + /* after a while, repeated uses become less effective */ + if (u.umconf >= 40) + incr = 1; + u.umconf += (unsigned) incr; } } diff --git a/src/uhitm.c b/src/uhitm.c index 9a6036bf6..927e26e19 100644 --- a/src/uhitm.c +++ b/src/uhitm.c @@ -5435,17 +5435,21 @@ RESTORE_WARNING_FORMAT_NONLITERAL static void nohandglow(struct monst *mon) { - char *hands = makeplural(body_part(HAND)); + char *hands; + boolean altfeedback; if (!u.umconf || mon->mconf) return; + + hands = makeplural(body_part(HAND)); + altfeedback = (Blind || Invisible); /* Invisible == Invis && !See_invis */ if (u.umconf == 1) { - if (Blind) + if (altfeedback) Your("%s stop tingling.", hands); else Your("%s stop glowing %s.", hands, hcolor(NH_RED)); } else { - if (Blind) + if (altfeedback) pline_The("tingling in your %s lessens.", hands); else Your("%s no longer glow so brightly %s.", hands, hcolor(NH_RED));