]> granicus.if.org Git - nethack/commitdiff
Make mimics mimicing walls or trees also block light
authorPasi Kallinen <paxed@alt.org>
Tue, 5 Jan 2016 23:44:18 +0000 (01:44 +0200)
committerPasi Kallinen <paxed@alt.org>
Tue, 5 Jan 2016 23:44:18 +0000 (01:44 +0200)
doc/fixes36.1
include/monst.h
src/display.c
src/mon.c
src/vision.c

index ec5d44b9e10b338cf412681fb0ad8ff147916e2d..b44ce9f4bac37f0499f15837d5df2c55cb675f3e 100644 (file)
@@ -84,6 +84,7 @@ guard macros available for mextra fields similar to those for oextra fields
 compile-time option for an alternate paniclog format for public server use
 make monsters forget where they stepped when fleeing or teleporting
 requiver pickup_thrown objects if quiver is empty
+make mimics mimicing walls or trees also block light
 
 
 Platform- and/or Interface-Specific Fixes
index 3c88d017276337acbd7a23fa4964d4cb0fb55068..7196026f94035632810fce6fdfb0ae4aaaf13994 100644 (file)
@@ -159,6 +159,16 @@ struct monst {
 #define is_vampshifter(mon)                                      \
     ((mon)->cham == PM_VAMPIRE || (mon)->cham == PM_VAMPIRE_LORD \
      || (mon)->cham == PM_VLAD_THE_IMPALER)
+
+/* mimic appearances that block vision/light */
+#define is_lightblocker_mappear(mon)                    \
+    (is_obj_mappear(mon, BOULDER) ||                    \
+     ((mon)->m_ap_type == M_AP_FURNITURE                \
+      && ((mon)->mappearance == S_hcdoor                \
+          || (mon)->mappearance == S_vcdoor             \
+          || (mon)->mappearance < S_ndoor /* = walls */ \
+          || (mon)->mappearance == S_tree)))
+
 #define is_door_mappear(mon) ((mon)->m_ap_type == M_AP_FURNITURE \
      && ((mon)->mappearance == S_hcdoor || (mon)->mappearance == S_vcdoor))
 #define is_obj_mappear(mon,otyp) ((mon)->m_ap_type == M_AP_OBJECT \
index e75f74d538e718441a097fcecc89055a22235239..333ed4d5b36a0bb48ba93a42a1b083bb4f4836c8 100644 (file)
@@ -1201,8 +1201,7 @@ set_mimic_blocking()
     for (mon = fmon; mon; mon = mon->nmon) {
         if (DEADMONSTER(mon))
             continue;
-        if (mon->minvis && (is_door_mappear(mon)
-                            || is_obj_mappear(mon,BOULDER))) {
+        if (mon->minvis && is_lightblocker_mappear(mon)) {
             if (See_invisible)
                 block_point(mon->mx, mon->my);
             else
index 40cdb0dca91f78f7e6afe4866519ffb0f0f1b967..3c272cbc71c02b5e7e5abbdb53829b2da77f562f 100644 (file)
--- a/src/mon.c
+++ b/src/mon.c
@@ -2616,8 +2616,7 @@ void
 seemimic(mtmp)
 register struct monst *mtmp;
 {
-    boolean is_blocker_appear = (is_door_mappear(mtmp)
-                                 || is_obj_mappear(mtmp, BOULDER));
+    boolean is_blocker_appear = (is_lightblocker_mappear(mtmp));
 
     if (has_mcorpsenm(mtmp))
         freemcorpsenm(mtmp);
index 77475af9697a8ca36be1cc22e7c4b90f3db501c9..2dcc85b8b92faa1544a0542c8ebf0e7598157547 100644 (file)
@@ -175,9 +175,9 @@ register struct rm *lev;
         if (obj->otyp == BOULDER)
             return 1;
 
-    /* Mimics mimicing a door or boulder block light. */
+    /* Mimics mimicing a door or boulder or ... block light. */
     if ((mon = m_at(x, y)) && (!mon->minvis || See_invisible)
-        && (is_door_mappear(mon) || is_obj_mappear(mon,BOULDER)))
+        && is_lightblocker_mappear(mon))
         return 1;
 
     return 0;