diff --git a/doc/fixes35.0 b/doc/fixes35.0 index 4d1c28bd4..cbc8589dd 100644 --- a/doc/fixes35.0 +++ b/doc/fixes35.0 @@ -142,6 +142,7 @@ don't give attribute adjustment messages ("you feel wise") unless the current value actually changes meditating monsters stop meditating when affected by something which wakes sleeping mosnters +monsters capable of hiding can't do so when trapped or while holding you Platform- and/or Interface-Specific Fixes diff --git a/src/mon.c b/src/mon.c index 139735783..2931bacbb 100644 --- a/src/mon.c +++ b/src/mon.c @@ -2366,11 +2366,19 @@ boolean hideunder(mtmp) struct monst *mtmp; { - boolean undetected = FALSE; - xchar x = (mtmp == &youmonst) ? u.ux : mtmp->mx; - xchar y = (mtmp == &youmonst) ? u.uy : mtmp->my; + struct trap *t; + boolean undetected = FALSE, + is_u = (mtmp == &youmonst); + xchar x = is_u ? u.ux : mtmp->mx, + y = is_u ? u.uy : mtmp->my; - if (mtmp->data->mlet == S_EEL) { + if (mtmp == u.ustuck) { + ; /* can't hide if holding you or held by you */ + } else if (is_u ? (u.utrap && u.utraptype != TT_PIT) : + (mtmp->mtrapped && (t = t_at(x, y)) != 0 && + !(t->ttyp == PIT || t->ttyp == SPIKED_PIT))) { + ; /* can't hide while stuck in a non-pit trap */ + } else if (mtmp->data->mlet == S_EEL) { undetected = (is_pool(x, y) && !Is_waterlevel(&u.uz)); } else if (hides_under(mtmp->data) && OBJ_AT(x, y)) { struct obj *otmp = level.objects[x][y]; @@ -2382,7 +2390,7 @@ struct monst *mtmp; undetected = TRUE; } - if (mtmp == &youmonst) u.uundetected = undetected; + if (is_u) u.uundetected = undetected; else mtmp->mundetected = undetected; return undetected; } diff --git a/src/polyself.c b/src/polyself.c index 454a09380..6cc410d5a 100644 --- a/src/polyself.c +++ b/src/polyself.c @@ -1,4 +1,4 @@ -/* SCCS Id: @(#)polyself.c 3.5 2005/09/19 */ +/* SCCS Id: @(#)polyself.c 3.5 2006/05/26 */ /* Copyright (C) 1987, 1988, 1989 by Ken Arromdee */ /* NetHack may be freely redistributed. See license for details. */ @@ -1096,6 +1096,20 @@ dohide() { boolean ismimic = youmonst.data->mlet == S_MIMIC; + if ((u.utrap && u.utraptype != TT_PIT) || u.ustuck) { + You_cant("hide while you're %s.", + !u.ustuck ? "trapped" : + !sticks(youmonst.data) ? "being held" : + humanoid(u.ustuck->data) ? "holding someone" : + "holding that creature"); + if (u.uundetected || + (ismimic && youmonst.m_ap_type != M_AP_NOTHING)) { + u.uundetected = 0; + youmonst.m_ap_type = M_AP_NOTHING; + newsym(u.ux, u.uy); + } + return 0; + } if (u.uundetected || (ismimic && youmonst.m_ap_type != M_AP_NOTHING)) { You("are already hiding."); return(0);