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
This commit is contained in:
+5
-1
@@ -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
|
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
|
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
|
list so couldn't be brought back and wouldn't appear on Plane of Earth
|
||||||
(stale non-zero value for context.no_of_wizards)
|
(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
|
Fixes to 3.7.0-x Problems that Were Exposed Via git Repository
|
||||||
|
|||||||
@@ -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) Stichting Mathematisch Centrum, Amsterdam, 1985. */
|
||||||
/*-Copyright (c) Derek S. Ray, 2015. */
|
/*-Copyright (c) Derek S. Ray, 2015. */
|
||||||
/* NetHack may be freely redistributed. See license for details. */
|
/* NetHack may be freely redistributed. See license for details. */
|
||||||
@@ -3235,7 +3235,10 @@ register struct monst *mtmp;
|
|||||||
boolean via_attack;
|
boolean via_attack;
|
||||||
{
|
{
|
||||||
mtmp->msleeping = 0;
|
mtmp->msleeping = 0;
|
||||||
if (M_AP_TYPE(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);
|
seemimic(mtmp);
|
||||||
} else if (g.context.forcefight && !g.context.mon_moving
|
} else if (g.context.forcefight && !g.context.mon_moving
|
||||||
&& mtmp->mundetected) {
|
&& mtmp->mundetected) {
|
||||||
|
|||||||
+21
-7
@@ -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) Stichting Mathematisch Centrum, Amsterdam, 1985. */
|
||||||
/*-Copyright (c) Michael Allison, 2006. */
|
/*-Copyright (c) Michael Allison, 2006. */
|
||||||
/* NetHack may be freely redistributed. See license for details. */
|
/* NetHack may be freely redistributed. See license for details. */
|
||||||
@@ -562,13 +562,27 @@ register struct monst *mtmp;
|
|||||||
&& (!Conflict || resist(mtmp, RING_CLASS, 0, 0))) {
|
&& (!Conflict || resist(mtmp, RING_CLASS, 0, 0))) {
|
||||||
pline("It feels quite soothing.");
|
pline("It feels quite soothing.");
|
||||||
} else if (!u.uinvulnerable) {
|
} 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)) {
|
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!",
|
pline("It locks on to your %s!",
|
||||||
m_sen ? "telepathy" : Blind_telepat ? "latent telepathy"
|
m_sen ? "telepathy"
|
||||||
: "mind");
|
: Blind_telepat ? "latent telepathy"
|
||||||
|
: "mind"); /* note: hero is never mindless */
|
||||||
dmg = rnd(15);
|
dmg = rnd(15);
|
||||||
if (Half_spell_damage)
|
if (Half_spell_damage)
|
||||||
dmg = (dmg + 1) / 2;
|
dmg = (dmg + 1) / 2;
|
||||||
@@ -587,13 +601,13 @@ register struct monst *mtmp;
|
|||||||
continue;
|
continue;
|
||||||
if ((telepathic(m2->data) && (rn2(2) || m2->mblinded))
|
if ((telepathic(m2->data) && (rn2(2) || m2->mblinded))
|
||||||
|| !rn2(10)) {
|
|| !rn2(10)) {
|
||||||
|
/* wake it up first, to bring hidden monster out of hiding */
|
||||||
|
wakeup(m2, FALSE);
|
||||||
if (cansee(m2->mx, m2->my))
|
if (cansee(m2->mx, m2->my))
|
||||||
pline("It locks on to %s.", mon_nam(m2));
|
pline("It locks on to %s.", mon_nam(m2));
|
||||||
m2->mhp -= rnd(15);
|
m2->mhp -= rnd(15);
|
||||||
if (DEADMONSTER(m2))
|
if (DEADMONSTER(m2))
|
||||||
monkilled(m2, "", AD_DRIN);
|
monkilled(m2, "", AD_DRIN);
|
||||||
else
|
|
||||||
m2->msleeping = 0;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+14
-3
@@ -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 */
|
/* Copyright (C) 1987, 1988, 1989 by Ken Arromdee */
|
||||||
/* NetHack may be freely redistributed. See license for details. */
|
/* NetHack may be freely redistributed. See license for details. */
|
||||||
|
|
||||||
@@ -1581,10 +1581,12 @@ dopoly()
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* #monster for hero-as-mind_flayer giving psychic blast */
|
||||||
int
|
int
|
||||||
domindblast()
|
domindblast()
|
||||||
{
|
{
|
||||||
struct monst *mtmp, *nmon;
|
struct monst *mtmp, *nmon;
|
||||||
|
int dmg;
|
||||||
|
|
||||||
if (u.uen < 10) {
|
if (u.uen < 10) {
|
||||||
You("concentrate but lack the energy to maintain doing so.");
|
You("concentrate but lack the energy to maintain doing so.");
|
||||||
@@ -1605,12 +1607,21 @@ domindblast()
|
|||||||
continue;
|
continue;
|
||||||
if (mtmp->mpeaceful)
|
if (mtmp->mpeaceful)
|
||||||
continue;
|
continue;
|
||||||
|
if (mindless(mtmp->data))
|
||||||
|
continue;
|
||||||
u_sen = telepathic(mtmp->data) && !mtmp->mcansee;
|
u_sen = telepathic(mtmp->data) && !mtmp->mcansee;
|
||||||
if (u_sen || (telepathic(mtmp->data) && rn2(2)) || !rn2(10)) {
|
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)),
|
You("lock in on %s %s.", s_suffix(mon_nam(mtmp)),
|
||||||
u_sen ? "telepathy"
|
u_sen ? "telepathy"
|
||||||
: telepathic(mtmp->data) ? "latent telepathy" : "mind");
|
: telepathic(mtmp->data) ? "latent telepathy"
|
||||||
mtmp->mhp -= rnd(15);
|
: "mind");
|
||||||
|
mtmp->mhp -= dmg;
|
||||||
if (DEADMONSTER(mtmp))
|
if (DEADMONSTER(mtmp))
|
||||||
killed(mtmp);
|
killed(mtmp);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user