From a37975b6252440ded5a9e3a856423c1b805eb218 Mon Sep 17 00:00:00 2001 From: PatR Date: Tue, 14 Jul 2020 04:55:53 -0700 Subject: [PATCH] fix pull request #367 - mind flayer psychic blast hitting a hidden monster didn't reveal that monster. It stayed hidden despite the feedback describing it as if it could be seen. The pull request's two line fix handled a monster's blast hitting another monster but left two related issues as-is: monster's blast hitting hidden poly'd hero left hero unrevealed and poly'd hero's blast left hidden monster unrevealed. Same code, different bug: poly'd hero's blast affected mindless monsters. This unhides an affected target before the message about it being hit rather than after. That would look better if preceded by a message describing the object (mimic or hides-under) or furniture (mimic) or empty spot (ceiling hider) as being or concealing a monster but I didn't put in sufficient effort to accomplish that. Fixes #367 Fixes #362 --- doc/fixes37.0 | 6 +++++- src/mon.c | 9 ++++++--- src/monmove.c | 28 +++++++++++++++++++++------- src/polyself.c | 17 ++++++++++++++--- 4 files changed, 46 insertions(+), 14 deletions(-) diff --git a/doc/fixes37.0 b/doc/fixes37.0 index 3c8e65b3d..e991745d2 100644 --- a/doc/fixes37.0 +++ b/doc/fixes37.0 @@ -1,4 +1,4 @@ -$NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.246 $ $NHDT-Date: 1594630713 2020/07/13 08:58:33 $ +$NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.247 $ $NHDT-Date: 1594727746 2020/07/14 11:55:46 $ General Fixes and Modified Features ----------------------------------- @@ -221,6 +221,10 @@ if the Wizard of Yendor fled up the stairs on level 1, the game would behave as if he was still in play, but he wouldn't be on migrating monsters list so couldn't be brought back and wouldn't appear on Plane of Earth (stale non-zero value for context.no_of_wizards) +if a mind flayer's psychic blast targetted a hidden monster, feedback named + the monster but it wasn't brought out of hiding +hero poly'd into a mind flayer who used #monster to emit a psychic blast was + able to harm mindless monsters with it Fixes to 3.7.0-x Problems that Were Exposed Via git Repository diff --git a/src/mon.c b/src/mon.c index beff43231..9ca2633aa 100644 --- a/src/mon.c +++ b/src/mon.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 mon.c $NHDT-Date: 1594630713 2020/07/13 08:58:33 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.339 $ */ +/* NetHack 3.6 mon.c $NHDT-Date: 1594727746 2020/07/14 11:55:46 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.340 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Derek S. Ray, 2015. */ /* NetHack may be freely redistributed. See license for details. */ @@ -3235,8 +3235,11 @@ register struct monst *mtmp; boolean via_attack; { mtmp->msleeping = 0; - if (M_AP_TYPE(mtmp)) { - seemimic(mtmp); + if (M_AP_TYPE(mtmp) != M_AP_NOTHING) { + /* mimics come out of hiding, but disguised Wizard doesn't + have to lose his disguise */ + if (M_AP_TYPE(mtmp) != M_AP_MONSTER) + seemimic(mtmp); } else if (g.context.forcefight && !g.context.mon_moving && mtmp->mundetected) { mtmp->mundetected = 0; diff --git a/src/monmove.c b/src/monmove.c index 7c03b2236..fe70cbd69 100644 --- a/src/monmove.c +++ b/src/monmove.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 monmove.c $NHDT-Date: 1586091452 2020/04/05 12:57:32 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.137 $ */ +/* NetHack 3.6 monmove.c $NHDT-Date: 1594727747 2020/07/14 11:55:47 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.141 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Michael Allison, 2006. */ /* NetHack may be freely redistributed. See license for details. */ @@ -562,13 +562,27 @@ register struct monst *mtmp; && (!Conflict || resist(mtmp, RING_CLASS, 0, 0))) { pline("It feels quite soothing."); } else if (!u.uinvulnerable) { - register boolean m_sen = sensemon(mtmp); + int dmg; + boolean m_sen = sensemon(mtmp); if (m_sen || (Blind_telepat && rn2(2)) || !rn2(10)) { - int dmg; + /* hiding monsters are brought out of hiding when hit by + a psychic blast, so do the same for hiding poly'd hero */ + if (u.uundetected) { + u.uundetected = 0; + newsym(u.ux, u.uy); + } else if (U_AP_TYPE != M_AP_NOTHING + /* hero has no way to hide as monster but + check for that theoretical case anyway */ + && U_AP_TYPE != M_AP_MONSTER) { + g.youmonst.m_ap_type = M_AP_NOTHING; + g.youmonst.mappearance = 0; + newsym(u.ux, u.uy); + } pline("It locks on to your %s!", - m_sen ? "telepathy" : Blind_telepat ? "latent telepathy" - : "mind"); + m_sen ? "telepathy" + : Blind_telepat ? "latent telepathy" + : "mind"); /* note: hero is never mindless */ dmg = rnd(15); if (Half_spell_damage) dmg = (dmg + 1) / 2; @@ -587,13 +601,13 @@ register struct monst *mtmp; continue; if ((telepathic(m2->data) && (rn2(2) || m2->mblinded)) || !rn2(10)) { + /* wake it up first, to bring hidden monster out of hiding */ + wakeup(m2, FALSE); if (cansee(m2->mx, m2->my)) pline("It locks on to %s.", mon_nam(m2)); m2->mhp -= rnd(15); if (DEADMONSTER(m2)) monkilled(m2, "", AD_DRIN); - else - m2->msleeping = 0; } } } diff --git a/src/polyself.c b/src/polyself.c index b06f2287e..b6e22bc7a 100644 --- a/src/polyself.c +++ b/src/polyself.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 polyself.c $NHDT-Date: 1583073991 2020/03/01 14:46:31 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.152 $ */ +/* NetHack 3.6 polyself.c $NHDT-Date: 1594727748 2020/07/14 11:55:48 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.154 $ */ /* Copyright (C) 1987, 1988, 1989 by Ken Arromdee */ /* NetHack may be freely redistributed. See license for details. */ @@ -1581,10 +1581,12 @@ dopoly() return 1; } +/* #monster for hero-as-mind_flayer giving psychic blast */ int domindblast() { struct monst *mtmp, *nmon; + int dmg; if (u.uen < 10) { You("concentrate but lack the energy to maintain doing so."); @@ -1605,12 +1607,21 @@ domindblast() continue; if (mtmp->mpeaceful) continue; + if (mindless(mtmp->data)) + continue; u_sen = telepathic(mtmp->data) && !mtmp->mcansee; if (u_sen || (telepathic(mtmp->data) && rn2(2)) || !rn2(10)) { + dmg = rnd(15); + /* wake it up first, to bring hidden monster out of hiding; + but in case it is currently peaceful, don't make it hostile + unless it will survive the psychic blast, otherwise hero + would avoid the penalty for killing it while peaceful */ + wakeup(mtmp, (dmg > mtmp->mhp) ? TRUE : FALSE); You("lock in on %s %s.", s_suffix(mon_nam(mtmp)), u_sen ? "telepathy" - : telepathic(mtmp->data) ? "latent telepathy" : "mind"); - mtmp->mhp -= rnd(15); + : telepathic(mtmp->data) ? "latent telepathy" + : "mind"); + mtmp->mhp -= dmg; if (DEADMONSTER(mtmp)) killed(mtmp); }