hideunder(mtmp)
struct monst *mtmp;
{
- boolean undetected = FALSE;
- xchar x = (mtmp == &youmonst) ? u.ux : mtmp->mx;
- xchar y = (mtmp == &youmonst) ? u.uy : mtmp->my;
-
- if (mtmp->data->mlet == S_EEL) {
+ 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 == 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];
undetected = TRUE;
}
- if (mtmp == &youmonst) u.uundetected = undetected;
+ if (is_u) u.uundetected = undetected;
else mtmp->mundetected = undetected;
return undetected;
}
-/* 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. */
{
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);