From: PatR Date: Mon, 2 Mar 2020 23:58:42 +0000 (-0800) Subject: Mister Fantastic's sea monster form X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4b78763d7060547f00cd8029a411f4eb9133901d;p=nethack Mister Fantastic's sea monster form 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. --- diff --git a/doc/fixes37.0 b/doc/fixes37.0 index 1c65f3f3d..b7b63c1fd 100644 --- a/doc/fixes37.0 +++ b/doc/fixes37.0 @@ -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 diff --git a/src/mhitu.c b/src/mhitu.c index 282831c5f..df2c1892c 100644 --- a/src/mhitu.c +++ b/src/mhitu.c @@ -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;