U846 - xorns and pits

Change pit behavior to always mark a non-flying poly'd player as trapped in
a pit, even when Passes_walls is set.  This allows players polymorphed into
xorns to descend into pits and pick things up.  In this case, any attempt
to move out of the pit now takes a turn but always succeeds.  Also fixed
a related bug (w/o ID) that a player could become trapped as if in a pit
when leaving xorn form because u.utrap wasn't checked, and simplified the
code since the extra Passes_walls checks are no longer needed.  Also
updated code in sit.c that duplicated uteetering_at_seen_pit.
This commit is contained in:
cohrs
2004-01-27 19:35:09 +00:00
parent 7ab2bb967a
commit b661f86e67
7 changed files with 23 additions and 22 deletions
+1
View File
@@ -16,6 +16,7 @@ some actions such as eating corpses off the floor didn't check whether hero
usmellmon() instead of "It turns into it" during monster polymorph usmellmon() instead of "It turns into it" during monster polymorph
grammar of messages regarding eating artifacts grammar of messages regarding eating artifacts
avoid a message about an invisible monster looking much better avoid a message about an invisible monster looking much better
player polymorphed as a xorn could not pick up items in pits
Platform- and/or Interface-Specific Fixes Platform- and/or Interface-Specific Fixes
+1 -2
View File
@@ -546,8 +546,7 @@ int ttyp;
if(at_u) { if(at_u) {
if (!wont_fall) { if (!wont_fall) {
if (!Passes_walls) u.utrap = rn1(4,2);
u.utrap = rn1(4,2);
u.utraptype = TT_PIT; u.utraptype = TT_PIT;
vision_full_recalc = 1; /* vision limits change */ vision_full_recalc = 1; /* vision limits change */
} else } else
+8 -2
View File
@@ -663,9 +663,12 @@ dokick()
Your("slow motion kick doesn't hit anything."); Your("slow motion kick doesn't hit anything.");
no_kick = TRUE; no_kick = TRUE;
} else if (u.utrap) { } else if (u.utrap) {
no_kick = TRUE;
switch (u.utraptype) { switch (u.utraptype) {
case TT_PIT: case TT_PIT:
pline("There's not enough room to kick down here."); if (!Passes_walls)
pline("There's not enough room to kick down here.");
else no_kick = FALSE;
break; break;
case TT_WEB: case TT_WEB:
case TT_BEARTRAP: case TT_BEARTRAP:
@@ -674,7 +677,6 @@ dokick()
default: default:
break; break;
} }
no_kick = TRUE;
} }
if (no_kick) { if (no_kick) {
@@ -706,6 +708,10 @@ dokick()
default: Your("feeble kick has no effect."); break; default: Your("feeble kick has no effect."); break;
} }
return(1); return(1);
} else if(u.utrap && u.utraptype == TT_PIT) {
/* must be Passes_walls */
You("kick at the side of the pit.");
return 1;
} }
if (Levitation) { if (Levitation) {
int xx, yy; int xx, yy;
+7 -1
View File
@@ -1169,7 +1169,13 @@ domove()
} }
if(u.utrap) { if(u.utrap) {
if(u.utraptype == TT_PIT) { if(u.utraptype == TT_PIT) {
if (!rn2(2) && sobj_at(BOULDER, u.ux, u.uy)) { 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)); Your("%s gets stuck in a crevice.", body_part(LEG));
display_nhwindow(WIN_MESSAGE, FALSE); display_nhwindow(WIN_MESSAGE, FALSE);
clear_nhwindow(WIN_MESSAGE); clear_nhwindow(WIN_MESSAGE);
+4 -12
View File
@@ -36,7 +36,6 @@ const char *fmt, *arg;
{ {
boolean sticky = sticks(youmonst.data) && u.ustuck && !u.uswallow, boolean sticky = sticks(youmonst.data) && u.ustuck && !u.uswallow,
was_mimicking = (youmonst.m_ap_type == M_AP_OBJECT); was_mimicking = (youmonst.m_ap_type == M_AP_OBJECT);
boolean could_pass_walls = Passes_walls;
boolean was_blind = !!Blind; boolean was_blind = !!Blind;
if (Upolyd) { if (Upolyd) {
@@ -86,10 +85,8 @@ const char *fmt, *arg;
if (u.twoweap && !could_twoweap(youmonst.data)) if (u.twoweap && !could_twoweap(youmonst.data))
untwoweapon(); untwoweapon();
if (u.utraptype == TT_PIT) { if (u.utraptype == TT_PIT && u.utrap) {
if (could_pass_walls) { /* player forms cannot pass walls */ u.utrap = rn1(6,2); /* time to escape resets */
u.utrap = rn1(6,2);
}
} }
if (was_blind && !Blind) { /* reverting from eyeless */ if (was_blind && !Blind) { /* reverting from eyeless */
Blinded = 1L; Blinded = 1L;
@@ -340,7 +337,6 @@ int mntmp;
{ {
boolean sticky = sticks(youmonst.data) && u.ustuck && !u.uswallow, boolean sticky = sticks(youmonst.data) && u.ustuck && !u.uswallow,
was_blind = !!Blind, dochange = FALSE; was_blind = !!Blind, dochange = FALSE;
boolean could_pass_walls = Passes_walls;
int mlvl; int mlvl;
if (mvitals[mntmp].mvflags & G_GENOD) { /* allow G_EXTINCT */ if (mvitals[mntmp].mvflags & G_GENOD) { /* allow G_EXTINCT */
@@ -464,12 +460,8 @@ int mntmp;
drop_weapon(1); drop_weapon(1);
(void) hideunder(&youmonst); (void) hideunder(&youmonst);
if (u.utraptype == TT_PIT) { if (u.utraptype == TT_PIT && u.utrap) {
if (could_pass_walls && !Passes_walls) { u.utrap = rn1(6,2); /* time to escape resets */
u.utrap = rn1(6,2);
} else if (!could_pass_walls && Passes_walls) {
u.utrap = 0;
}
} }
if (was_blind && !Blind) { /* previous form was eyeless */ if (was_blind && !Blind) { /* previous form was eyeless */
Blinded = 1L; Blinded = 1L;
+1 -3
View File
@@ -65,9 +65,7 @@ dosit()
if (OBJ_AT(u.ux, u.uy) && if (OBJ_AT(u.ux, u.uy) &&
/* ensure we're not standing on the precipice */ /* ensure we're not standing on the precipice */
!((!u.utrap || u.utraptype != TT_PIT) && !uteetering_at_seen_pit(trap)) {
(trap && trap->tseen &&
(trap->ttyp==PIT || trap->ttyp==SPIKED_PIT)))) {
register struct obj *obj; register struct obj *obj;
obj = level.objects[u.ux][u.uy]; obj = level.objects[u.ux][u.uy];
+1 -2
View File
@@ -908,8 +908,7 @@ glovecheck: (void) rust_dmg(uarmg, "gauntlets", 1, TRUE, &youmonst);
#endif #endif
You("land %s!", predicament); You("land %s!", predicament);
} }
if (!Passes_walls) u.utrap = rn1(6,2);
u.utrap = rn1(6,2);
u.utraptype = TT_PIT; u.utraptype = TT_PIT;
#ifdef STEED #ifdef STEED
if (!steedintrap(trap, (struct obj *)0)) { if (!steedintrap(trap, (struct obj *)0)) {