From: cohrs Date: Tue, 18 Jan 2005 16:17:27 +0000 (+0000) Subject: polymorphing into a flyer while in a pit X-Git-Tag: MOVE2GIT~1347 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c90746c670fe455c9a41168ba0f4bc7929136ba5;p=nethack polymorphing into a flyer while in a pit reported that if you polymorph into a flying monster while in a pit, you must take u.utrap turns to first climb out before you can fly. Of course, once you're out, you can swoop down into the pit to pick things up w/o delay. Rather that have you automatically fly out (e.g. like quaffing a potion of levitation), I thought it was better to take a turn to fly out, so that's what I've implemented. The code to deal with exiting a pit is moved to a new climb_pit function and the "up" command now lets you climb from a pit too (something I've found non-intuitive in the past). Finally, I noticed that non-moving monsters could still go up/down even though they couldn't move around. Added non-moving checks in doup/dodown. --- diff --git a/doc/fixes35.0 b/doc/fixes35.0 index c2a04b4a7..9e9d5026b 100644 --- a/doc/fixes35.0 +++ b/doc/fixes35.0 @@ -75,6 +75,8 @@ charge for reviving a shop owned corpse or reanimating a shop owned statue filled trap doors on castle can be re-dug message order when swapping places with a pet (e.g. into a trap), also use different term instead of "displace" +flyers can get out of pits more easily than non-flyers +allow use of the < command to try to exit a pit Platform- and/or Interface-Specific Fixes diff --git a/include/extern.h b/include/extern.h index 52062d745..dac2fa9bf 100644 --- a/include/extern.h +++ b/include/extern.h @@ -2090,6 +2090,7 @@ E void FDECL(mselftouch, (struct monst *,const char *,BOOLEAN_P)); E void NDECL(float_up); E void FDECL(fill_pit, (int,int)); E int FDECL(float_down, (long, long)); +E void NDECL(climb_pit); E int FDECL(fire_damage, (struct obj *,BOOLEAN_P,BOOLEAN_P,XCHAR_P,XCHAR_P)); E void FDECL(water_damage, (struct obj *,BOOLEAN_P,BOOLEAN_P)); E boolean NDECL(drown); diff --git a/src/do.c b/src/do.c index a59af1dbf..b3c4693ae 100644 --- a/src/do.c +++ b/src/do.c @@ -741,6 +741,14 @@ dodown() (u.ux == sstairs.sx && u.uy == sstairs.sy && !sstairs.up)), ladder_down = (u.ux == xdnladder && u.uy == ydnladder); + if(!youmonst.data->mmove) { + You("are rooted %s.", + Levitation || Is_airlevel(&u.uz) || Is_waterlevel(&u.uz) ? + "in place" : "to the ground"); + nomul(0); + return 1; + } + #ifdef STEED if (u.usteed && !u.usteed->mcanmove) { pline("%s won't move!", Monnam(u.usteed)); @@ -839,6 +847,20 @@ dodown() int doup() { + if(!youmonst.data->mmove) { + You("are rooted %s.", + Levitation || Is_airlevel(&u.uz) || Is_waterlevel(&u.uz) ? + "in place" : "to the ground"); + nomul(0); + return 1; + } + + /* "up" to get out of a pit... */ + if (u.utrap && u.utraptype == TT_PIT) { + climb_pit(); + return 1; + } + if( (u.ux != xupstair || u.uy != yupstair) && (!xupladder || u.ux != xupladder || u.uy != yupladder) && (!sstairs.sx || u.ux != sstairs.sx || u.uy != sstairs.sy diff --git a/src/hack.c b/src/hack.c index e0732b756..b53f23f58 100644 --- a/src/hack.c +++ b/src/hack.c @@ -1171,38 +1171,7 @@ domove() } if(u.utrap) { if(u.utraptype == TT_PIT) { - if (Passes_walls) { - /* marked as trapped so they can pick things up */ - You("ascend from the pit."); - u.utrap = 0; - fill_pit(u.ux, u.uy); - vision_full_recalc = 1; /* vision limits change */ - } else if (!rn2(2) && sobj_at(BOULDER, u.ux, u.uy)) { - Your("%s gets stuck in a crevice.", body_part(LEG)); - display_nhwindow(WIN_MESSAGE, FALSE); - clear_nhwindow(WIN_MESSAGE); - You("free your %s.", body_part(LEG)); - } else if (!(--u.utrap)) { - You("%s to the edge of the pit.", - (In_sokoban(&u.uz) && Levitation) ? - "struggle against the air currents and float" : -#ifdef STEED - u.usteed ? "ride" : -#endif - "crawl"); - fill_pit(u.ux, u.uy); - vision_full_recalc = 1; /* vision limits change */ - } else if (flags.verbose) { -#ifdef STEED - if (u.usteed) - Norep("%s is still in a pit.", - upstart(y_monnam(u.usteed))); - else -#endif - Norep( (Hallucination && !rn2(5)) ? - "You've fallen, and you can't get up." : - "You are still in a pit." ); - } + climb_pit(); } else if (u.utraptype == TT_LAVA) { if(flags.verbose) { predicament = "stuck in the lava"; diff --git a/src/trap.c b/src/trap.c index 37bdb76ae..eba7888e2 100644 --- a/src/trap.c +++ b/src/trap.c @@ -2503,6 +2503,52 @@ long hmask, emask; /* might cancel timeout */ return 1; } +/* shared code for climbing out of a pit */ +void +climb_pit() +{ + if (!u.utrap || u.utraptype != TT_PIT) return; + + if (Passes_walls) { + /* marked as trapped so they can pick things up */ + You("ascend from the pit."); + u.utrap = 0; + fill_pit(u.ux, u.uy); + vision_full_recalc = 1; /* vision limits change */ + } else if (!rn2(2) && sobj_at(BOULDER, u.ux, u.uy)) { + Your("%s gets stuck in a crevice.", body_part(LEG)); + display_nhwindow(WIN_MESSAGE, FALSE); + clear_nhwindow(WIN_MESSAGE); + You("free your %s.", body_part(LEG)); + } else if (Flying && !In_sokoban(&u.uz)) { + /* eg fell in pit, poly'd to a flying monster */ + You("fly from the pit."); + u.utrap = 0; + fill_pit(u.ux, u.uy); + vision_full_recalc = 1; /* vision limits change */ + } else if (!(--u.utrap)) { + You("%s to the edge of the pit.", + (In_sokoban(&u.uz) && Levitation) ? + "struggle against the air currents and float" : +#ifdef STEED + u.usteed ? "ride" : +#endif + "crawl"); + fill_pit(u.ux, u.uy); + vision_full_recalc = 1; /* vision limits change */ + } else if (flags.verbose) { +#ifdef STEED + if (u.usteed) + Norep("%s is still in a pit.", + upstart(y_monnam(u.usteed))); + else +#endif + Norep( (Hallucination && !rn2(5)) ? + "You've fallen, and you can't get up." : + "You are still in a pit." ); + } +} + STATIC_OVL void dofiretrap(box) struct obj *box; /* null for floor trap */