From: Michael Meyer Date: Tue, 10 Aug 2021 14:28:07 +0000 (-0400) Subject: fix m-prefix movement into warning symbol (pr573) X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=121290cde6e2550fb98511269b5e8c1cde6362f7;p=nethack fix m-prefix movement into warning symbol (pr573) https://github.com/NetHack/NetHack/pull/573 by entrez Pull request comment states: "Moving into a position containing a warning symbol with m- to 'safely' move would still attack as though the 'm' prefix was not specified. Ensure warning symbols are counted as 'detected' monsters for this purpose, to avoid falling through to do_attack()." Closes #573 --- diff --git a/doc/fixes37.0 b/doc/fixes37.0 index 4e629fcb3..aeba135e1 100644 --- a/doc/fixes37.0 +++ b/doc/fixes37.0 @@ -1298,7 +1298,8 @@ delete extra lines in Guidebook.mn (pr #590 by argrath) supply missing changes on Guidebook.tex (pr #591 by argrath) fix out-of-bounds access of xdir and ydir in farlook (pr #592 by copperwater) variation of imp's period-speak (pr #602 by Vivit-R) - +fix m-prefix movement into warning symbol (pr #573 by entrez) + Code Cleanup and Reorganization ------------------------------- diff --git a/src/hack.c b/src/hack.c index d0b4e5977..b5abee6cb 100644 --- a/src/hack.c +++ b/src/hack.c @@ -1487,7 +1487,7 @@ domove_core(void) register struct rm *tmpr; register xchar x, y; struct trap *trap = NULL; - int wtcap; + int wtcap, glyph; boolean on_ice; xchar chainx = 0, chainy = 0, ballx = 0, bally = 0; /* ball&chain new positions */ @@ -1705,6 +1705,7 @@ domove_core(void) g.bhitpos.x = x; g.bhitpos.y = y; tmpr = &levl[x][y]; + glyph = glyph_at(x, y); /* attack monster */ if (mtmp) { @@ -1729,7 +1730,8 @@ domove_core(void) * different message and makes the player remember the monster. */ if (g.context.nopick && !g.context.travel - && (canspotmon(mtmp) || glyph_is_invisible(levl[x][y].glyph))) { + && (canspotmon(mtmp) || glyph_is_invisible(glyph) + || glyph_is_warning(glyph))) { if (M_AP_TYPE(mtmp) && !Protection_from_shape_changers && !sensemon(mtmp)) stumble_onto_mimic(mtmp); @@ -1782,11 +1784,10 @@ domove_core(void) /* specifying 'F' with no monster wastes a turn */ if (g.context.forcefight /* remembered an 'I' && didn't use a move command */ - || (glyph_is_invisible(levl[x][y].glyph) && !g.context.nopick)) { + || (glyph_is_invisible(glyph) && !g.context.nopick)) { struct obj *boulder = 0; boolean explo = (Upolyd && attacktype(g.youmonst.data, AT_EXPL)), solid = !accessible(x, y); - int glyph = glyph_at(x, y); /* might be monster */ char buf[BUFSZ]; if (!Underwater) {