]> granicus.if.org Git - nethack/commitdiff
github issue #828 - confuse monster effect when \
authorPatR <rankin@nethack.org>
Thu, 28 Jul 2022 20:42:35 +0000 (13:42 -0700)
committerPatR <rankin@nethack.org>
Thu, 28 Jul 2022 20:42:35 +0000 (13:42 -0700)
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
src/read.c
src/uhitm.c

index ebbaf82ba78780cf55b25c156292d8c3c54be59f..9f56a0e8348c5c65724fd1024d4fa9f74cba0158 100644 (file)
@@ -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
index 3299ce2bd1b596c8009bfcf7021c6ec800199887..50cc1611fdf46d3162d36a438ecf2ae06c73cf5b 100644 (file)
@@ -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;
     }
 }
 
index 9a6036bf6bb0271891a9ee9411f1e68c679a21cc..927e26e19776a8bfe305abaa650e985efd6ed97a 100644 (file)
@@ -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));