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
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);
(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));
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
}
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";
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 */