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:
@@ -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
|
||||||
|
|||||||
@@ -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
@@ -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
@@ -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
@@ -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;
|
||||||
|
|||||||
@@ -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
@@ -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)) {
|
||||||
|
|||||||
Reference in New Issue
Block a user