]> granicus.if.org Git - nethack/commitdiff
Mister Fantastic's sea monster form
authorPatR <rankin@nethack.org>
Mon, 2 Mar 2020 23:58:42 +0000 (15:58 -0800)
committerPatR <rankin@nethack.org>
Mon, 2 Mar 2020 23:58:42 +0000 (15:58 -0800)
While polymorphed and underwater, an eel bite killed the hero who
rehumaized and crawled out of the water, then the eel continued with
its second attack and "wrapped itself around you" even though no
longer adjacent.  That's a long reach....

| ...@.
| .;}..
| .}}..

Make any additional attacks silently miss if hero changes location
during the attack sequence of a monster who has pinpointed the hero.

doc/fixes37.0
src/mhitu.c

index 1c65f3f3d5635523839c2569a8328a8be420bd23..b7b63c1fded96aa769e6ad3aafade8539c468739 100644 (file)
@@ -1,4 +1,4 @@
-$NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.115 $ $NHDT-Date: 1583102142 2020/03/01 22:35:42 $
+$NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.116 $ $NHDT-Date: 1583193505 2020/03/02 23:58:25 $
 
 General Fixes and Modified Features
 -----------------------------------
@@ -61,6 +61,8 @@ have ^X provide more information when held or swallowed
 avoid divide by 0 crash if 'bogusmon' (file of bogus monster types) is empty
 display wasn't updating immediately after toggling hilite_pet option
 randomly choosing role could lead to crash via segfault
+if eel bite attack caused hero to move (killed + rehumanized + crawled out
+       of water), its grab attack could succeed even if no longer adjacent
 
 
 Fixes to 3.7.0-x Problems that Were Exposed Via git Repository
index 282831c5f25b9f95b03e5abdb5daf8c8cba75a5c..df2c1892c3fe78a6986179fae8b569be200fc884 100644 (file)
@@ -1,4 +1,4 @@
-/* NetHack 3.6 mhitu.c $NHDT-Date: 1581886862 2020/02/16 21:01:02 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.183 $ */
+/* NetHack 3.6 mhitu.c $NHDT-Date: 1583193505 2020/03/02 23:58:25 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.185 $ */
 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
 /*-Copyright (c) Robert Patrick Rankin, 2012. */
 /* NetHack may be freely redistributed.  See license for details. */
@@ -507,7 +507,8 @@ register struct monst *mtmp;
                         || u.umonnum == PM_TRAPPER)
                         pline(
                              "Wait, %s!  There's a hidden %s named %s there!",
-                              m_monnam(mtmp), g.youmonst.data->mname, g.plname);
+                              m_monnam(mtmp),
+                              g.youmonst.data->mname, g.plname);
                     else
                         pline(
                           "Wait, %s!  There's a %s named %s hiding under %s!",
@@ -549,7 +550,7 @@ register struct monst *mtmp;
             map_invisible(mtmp->mx, mtmp->my);
         if (!youseeit)
             pline("%s %s!", Something, (likes_gold(mtmp->data)
-                                        && g.youmonst.mappearance == GOLD_PIECE)
+                                      && g.youmonst.mappearance == GOLD_PIECE)
                                            ? "tries to pick you up"
                                            : "disturbs you");
         else /* see note about m_monnam() above */
@@ -662,6 +663,9 @@ register struct monst *mtmp;
 
     for (i = 0; i < NATTK; i++) {
         sum[i] = 0;
+        if (i > 0 && foundyou /* previous attack might have moved hero */
+            && (mtmp->mux != u.ux || mtmp->muy != u.uy))
+            continue; /* fill in sum[] with 'miss' but skip other actions */
         mon_currwep = (struct obj *)0;
         mattk = getmattk(mtmp, &g.youmonst, i, sum, &alt_attk);
         if ((u.uswallow && mattk->aatyp != AT_ENGL)
@@ -1005,8 +1009,8 @@ register struct attack *mattk;
                     dmg += rn1(4, 3); /* 3..6 */
                 if (dmg <= 0)
                     dmg = 1;
-                if (!(otmp->oartifact
-                      && artifact_hit(mtmp, &g.youmonst, otmp, &dmg, g.mhitu_dieroll)))
+                if (!(otmp->oartifact && artifact_hit(mtmp, &g.youmonst, otmp,
+                                                      &dmg, g.mhitu_dieroll)))
                     hitmsg(mtmp, mattk);
                 if (!dmg)
                     break;