]> granicus.if.org Git - nethack/commitdiff
fix #H1749 - kick that misses didn't reveal concealed mimic
authornethack.rankin <nethack.rankin>
Thu, 13 Nov 2008 23:24:00 +0000 (23:24 +0000)
committernethack.rankin <nethack.rankin>
Thu, 13 Nov 2008 23:24:00 +0000 (23:24 +0000)
     From a bug report, getting "your
clumsy kick does no damage" when attempting to kick the location of a
concealed mimic or hidden monster didn't bring the target out of hiding.

doc/fixes35.0
src/dokick.c

index 37c50bd2d8d45c5af7476c85f11b6c5b1e30e580..a6a70e885b2a55486f0ef64bcdbb162e688b990f 100644 (file)
@@ -294,6 +294,7 @@ if polymorph causes a monster to drop items, they won't be used up via
 monsters who ate green slime corpses weren't turned into green slime
 "hand slip" while naming an object would never pick 'z' as a substitute letter
 hero would "gladly take off <armor>" for nymph or succubus even while asleep
+concealed mimic wasn't revealed if kicking attmpt yielded a clumsy miss
 
 
 Platform- and/or Interface-Specific Fixes
index 41f0eb186991f9fb02216680790cebac59a84984..06d46df8a020d781d516415d745dea819b7dba50 100644 (file)
@@ -125,8 +125,27 @@ register xchar x, y;
        bhitpos.x = x;
        bhitpos.y = y;
        if (attack_checks(mon, (struct obj *)0)) return;
+       /* anger target even if wild miss will occur */
        setmangry(mon);
 
+       if (Levitation && !rn2(3) && verysmall(mon->data) &&
+          !is_flyer(mon->data)) {
+               pline("Floating in the air, you miss wildly!");
+               exercise(A_DEX, FALSE);
+               (void) passive(mon, FALSE, 1, AT_KICK, FALSE);
+               return;
+       }
+
+       /* reveal hidden target even if kick ends up missing (note: being
+          hidden doesn't affect chance to hit so neither does this reveal) */
+       if (mon->mundetected ||
+               (mon->m_ap_type && mon->m_ap_type != M_AP_MONSTER)) {
+           /* [revealing the monster should probably give a message...] */
+           if (mon->m_ap_type) seemimic(mon);
+           mon->mundetected = 0;
+           if (!canspotmon(mon)) map_invisible(x, y);
+       }
+
        /* Kick attacks by kicking monsters are normal attacks, not special.
         * This is almost always worthless, since you can either take one turn
         * and do all your kicks, or else take one turn and attack the monster
@@ -168,14 +187,6 @@ register xchar x, y;
            return;
        }
 
-       if(Levitation && !rn2(3) && verysmall(mon->data) &&
-          !is_flyer(mon->data)) {
-               pline("Floating in the air, you miss wildly!");
-               exercise(A_DEX, FALSE);
-               (void) passive(mon, FALSE, 1, AT_KICK, FALSE);
-               return;
-       }
-
        i = -inv_weight();
        j = weight_cap();
 
@@ -782,9 +793,18 @@ dokick()
        }
        maploc = &levl[x][y];
 
-       /* The next five tests should stay in    */
-       /* their present order: monsters, pools, */
-       /* objects, non-doors, doors.            */
+       /*
+        * The next five tests should stay in their present order:
+        * monsters, pools, objects, non-doors, doors.
+        *
+        * [FIXME:  Monsters who are hidden underneath objects or
+        * in pools should lead to hero kicking the concealment
+        * rather than the monster, probably exposing the hidden
+        * monster in the process.  And monsters who are hidden on
+        * ceiling shouldn't be kickable (unless hero is flying?);
+        * kicking toward them should just target whatever is on
+        * the floor at that spot.]
+        */
 
        if(MON_AT(x, y)) {
                struct permonst *mdat;