]> granicus.if.org Git - nethack/commitdiff
observing monster become invisible
authorPatR <rankin@nethack.org>
Sat, 9 Jul 2016 22:03:03 +0000 (15:03 -0700)
committerPatR <rankin@nethack.org>
Sat, 9 Jul 2016 22:03:03 +0000 (15:03 -0700)
Requested by one of the beta testers 13 months ago... when a visible
monster becomes invisible and vanishes, mark its map location with
the remembered, unseen monster glyph.  (When the player zaps a
monster with a wand of make invisible, that only happens if the wand
type is known.  I'm not sure that's right but didn't alter it....)

The request suggested also doing it for a monster who disappears by
teleporting away, but I haven't attempted to implement that.

doc/fixes36.1
src/mcastu.c
src/muse.c
src/potion.c
src/teleport.c
src/zap.c

index 2402e7cf6a1441d9b09e378bdb5862438686568f..49e65e7e5105dc5f9c78a69992cc86c5b2412fd5 100644 (file)
@@ -314,6 +314,8 @@ for #tip inside shop, credit was incorrectly given for spilled gold if that
        gold's stale location coordinates didn't happen to be inside the shop
 when confused scroll of light summoned lights, player would be asked what to
        call the scroll even if scroll of light was already identified
+if a visible monster becomes invisible, mark its spot with the 'remembered,
+       unseen monster' glyph ('I' character or '?' tile)
 
 
 Fixes to Post-3.6.0 Problems that Were Exposed Via git Repository
index addcc1575f03241a21e3c632a49f49e948f085f3..e2fdfad6633f54d788804c37e58e9063a1610bdc 100644 (file)
@@ -443,6 +443,8 @@ int spellnum;
                 pline("%s suddenly %s!", Monnam(mtmp),
                       !See_invisible ? "disappears" : "becomes transparent");
             mon_set_minvis(mtmp);
+            if (cansee(mtmp->mx, mtmp->my) && !canspotmon(mtmp))
+                map_invisible(mtmp->mx, mtmp->my);
             dmg = 0;
         } else
             impossible("no reason for monster to cast disappear spell?");
index 0b8c3ded1c05aa2207b5762ffe35b7b61d89ff41..7b51290032c9ef4468122cb79bcc43939ecc8444 100644 (file)
@@ -1207,8 +1207,8 @@ register struct monst *mtmp;
 register struct obj *otmp;
 {
     int tmp;
-
     boolean reveal_invis = FALSE;
+
     if (mtmp != &youmonst) {
         mtmp->msleeping = 0;
         if (mtmp->m_ap_type)
@@ -1819,12 +1819,15 @@ struct monst *mtmp;
         Strcpy(nambuf, mon_nam(mtmp));
         mon_set_minvis(mtmp);
         if (vismon && mtmp->minvis) { /* was seen, now invisible */
-            if (canspotmon(mtmp))
+            if (canspotmon(mtmp)) {
                 pline("%s body takes on a %s transparency.",
                       upstart(s_suffix(nambuf)),
                       Hallucination ? "normal" : "strange");
-            else
+            } else {
                 pline("Suddenly you cannot see %s.", nambuf);
+                if (vis)
+                    map_invisible(mtmp->mx, mtmp->my);
+            }
             if (oseen)
                 makeknown(otmp->otyp);
         }
index 2e7ceb15f99a8c3e0edd49bbc46b73522f060c2c..aebbc75ee4c9155e7b4da0eab1a6f18a3be324f3 100644 (file)
@@ -1379,10 +1379,15 @@ boolean your_fault;
             if (!resist(mon, POTION_CLASS, 0, NOTELL))
                 mon->mconf = TRUE;
             break;
-        case POT_INVISIBILITY:
+        case POT_INVISIBILITY: {
+            boolean sawit = canspotmon(mon);
+
             angermon = FALSE;
             mon_set_minvis(mon);
+            if (sawit && !canspotmon(mon) && cansee(mon->mx, mon->my))
+                map_invisible(mon->mx, mon->my);
             break;
+        }
         case POT_SLEEPING:
             /* wakeup() doesn't rouse victims of temporary sleep */
             if (sleep_monst(mon, rnd(12), POTION_CLASS)) {
index 289d6a35113eaba273f81881d058e5c7967e0c2d..f45abfb5ed54db3b2f86fc9fd74597115dc0691a 100644 (file)
@@ -956,11 +956,9 @@ struct monst *mtmp;
  *
  * Pulls a monster from its current position and places a monster at
  * a new x and y.  If oldx is 0, then the monster was not in the
- * levels.monsters
- * array.  However, if oldx is 0, oldy may still have a value because mtmp is
- * a
- * migrating_mon.  Worm tails are always placed randomly around the head of
- * the worm.
+ * levels.monsters array.  However, if oldx is 0, oldy may still have
+ * a value because mtmp is a migrating_mon.  Worm tails are always
+ * placed randomly around the head of the worm.
  */
 void
 rloc_to(mtmp, x, y)
@@ -974,15 +972,15 @@ register int x, y;
         return;
 
     if (oldx) { /* "pick up" monster */
-        if (mtmp->wormno)
+        if (mtmp->wormno) {
             remove_worm(mtmp);
-        else {
+        else {
             remove_monster(oldx, oldy);
             newsym(oldx, oldy); /* update old location */
         }
     }
 
-    memset(mtmp->mtrack, 0, sizeof(mtmp->mtrack));
+    memset(mtmp->mtrack, 0, sizeof mtmp->mtrack);
     place_monster(mtmp, x, y); /* put monster down */
     update_monster_region(mtmp);
 
index dfd1ee72b3de4a942a8c2dfebab3fe377340d6cd..ea246aabbfc88bd31790a1925a88dc5ef5fe89ce 100644 (file)
--- a/src/zap.c
+++ b/src/zap.c
@@ -280,6 +280,7 @@ struct obj *otmp;
         mon_set_minvis(mtmp);
         if (!oldinvis && knowninvisible(mtmp)) {
             pline("%s turns transparent!", nambuf);
+            reveal_invis = TRUE;
             learn_it = TRUE;
         }
         break;