open/close while blind (trunk only)
From a bug report, attempting to open or close a door while blind didn't always update the map display after telling the player that a remembered-closed door was already open or a remembered-open door was already closed. And in the cases where it did update the map to reflect a change in door state, it didn't use up a turn. Now always update the display and use up a turn when 'o' or 'c' reveals any new information.
This commit is contained in:
@@ -269,6 +269,8 @@ Nth adjustment of feedback when observing a pet eating
|
|||||||
monsters who want the Amulet won't attack temple priests to try to get it
|
monsters who want the Amulet won't attack temple priests to try to get it
|
||||||
it was possible to generate an object of 0 gold pieces by dropping 2**32 gold
|
it was possible to generate an object of 0 gold pieces by dropping 2**32 gold
|
||||||
wizard mode's sanity_check option missed nested containers and migrating mons
|
wizard mode's sanity_check option missed nested containers and migrating mons
|
||||||
|
always update map display and use up turn if open or close command attempted
|
||||||
|
while blind reveals change in door state or discloses non-door spot
|
||||||
|
|
||||||
|
|
||||||
Platform- and/or Interface-Specific Fixes
|
Platform- and/or Interface-Specific Fixes
|
||||||
|
|||||||
+45
-23
@@ -1,4 +1,4 @@
|
|||||||
/* SCCS Id: @(#)lock.c 3.5 2007/08/02 */
|
/* SCCS Id: @(#)lock.c 3.5 2007/11/14 */
|
||||||
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
|
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
|
||||||
/* NetHack may be freely redistributed. See license for details. */
|
/* NetHack may be freely redistributed. See license for details. */
|
||||||
|
|
||||||
@@ -523,6 +523,7 @@ doopen() /* try to open a door */
|
|||||||
register struct rm *door;
|
register struct rm *door;
|
||||||
struct monst *mtmp;
|
struct monst *mtmp;
|
||||||
boolean portcullis;
|
boolean portcullis;
|
||||||
|
int res = 0;
|
||||||
|
|
||||||
if (nohands(youmonst.data)) {
|
if (nohands(youmonst.data)) {
|
||||||
You_cant("open anything -- you have no hands!");
|
You_cant("open anything -- you have no hands!");
|
||||||
@@ -550,6 +551,19 @@ doopen() /* try to open a door */
|
|||||||
|
|
||||||
door = &levl[cc.x][cc.y];
|
door = &levl[cc.x][cc.y];
|
||||||
portcullis = (is_drawbridge_wall(cc.x, cc.y) >= 0);
|
portcullis = (is_drawbridge_wall(cc.x, cc.y) >= 0);
|
||||||
|
if (Blind) {
|
||||||
|
int oldglyph = door->glyph;
|
||||||
|
#ifdef DUNGEON_OVERVIEW
|
||||||
|
schar oldstyp = door->styp;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
feel_location(cc.x, cc.y);
|
||||||
|
if (door->glyph != oldglyph
|
||||||
|
#ifdef DUNGEON_OVERVIEW
|
||||||
|
|| door->styp != oldstyp
|
||||||
|
#endif
|
||||||
|
) res = 1; /* learned something */
|
||||||
|
}
|
||||||
|
|
||||||
if (portcullis || !IS_DOOR(door->typ)) {
|
if (portcullis || !IS_DOOR(door->typ)) {
|
||||||
/* closed portcullis or spot that opened bridge would span */
|
/* closed portcullis or spot that opened bridge would span */
|
||||||
@@ -559,7 +573,7 @@ doopen() /* try to open a door */
|
|||||||
pline_The("drawbridge is already open.");
|
pline_The("drawbridge is already open.");
|
||||||
else
|
else
|
||||||
You("%s no door there.", Blind ? "feel" : "see");
|
You("%s no door there.", Blind ? "feel" : "see");
|
||||||
return(0);
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(door->doormask & D_CLOSED)) {
|
if (!(door->doormask & D_CLOSED)) {
|
||||||
@@ -572,13 +586,12 @@ doopen() /* try to open a door */
|
|||||||
default: mesg = " is locked"; break;
|
default: mesg = " is locked"; break;
|
||||||
}
|
}
|
||||||
pline("This door%s.", mesg);
|
pline("This door%s.", mesg);
|
||||||
if (Blind) feel_location(cc.x,cc.y);
|
return res;
|
||||||
return(0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(verysmall(youmonst.data)) {
|
if(verysmall(youmonst.data)) {
|
||||||
pline("You're too small to pull the door open.");
|
pline("You're too small to pull the door open.");
|
||||||
return(0);
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* door is known to be CLOSED */
|
/* door is known to be CLOSED */
|
||||||
@@ -633,6 +646,7 @@ doclose() /* try to close a door */
|
|||||||
register struct rm *door;
|
register struct rm *door;
|
||||||
struct monst *mtmp;
|
struct monst *mtmp;
|
||||||
boolean portcullis;
|
boolean portcullis;
|
||||||
|
int res = 0;
|
||||||
|
|
||||||
if (nohands(youmonst.data)) {
|
if (nohands(youmonst.data)) {
|
||||||
You_cant("close anything -- you have no hands!");
|
You_cant("close anything -- you have no hands!");
|
||||||
@@ -665,6 +679,19 @@ doclose() /* try to close a door */
|
|||||||
|
|
||||||
door = &levl[x][y];
|
door = &levl[x][y];
|
||||||
portcullis = (is_drawbridge_wall(x, y) >= 0);
|
portcullis = (is_drawbridge_wall(x, y) >= 0);
|
||||||
|
if (Blind) {
|
||||||
|
int oldglyph = door->glyph;
|
||||||
|
#ifdef DUNGEON_OVERVIEW
|
||||||
|
schar oldstyp = door->styp;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
feel_location(x, y);
|
||||||
|
if (door->glyph != oldglyph
|
||||||
|
#ifdef DUNGEON_OVERVIEW
|
||||||
|
|| door->styp != oldstyp
|
||||||
|
#endif
|
||||||
|
) res = 1; /* learned something */
|
||||||
|
}
|
||||||
|
|
||||||
if (portcullis || !IS_DOOR(door->typ)) {
|
if (portcullis || !IS_DOOR(door->typ)) {
|
||||||
/* is_db_wall: closed porcullis */
|
/* is_db_wall: closed porcullis */
|
||||||
@@ -674,24 +701,20 @@ doclose() /* try to close a door */
|
|||||||
There("is no obvious way to close the drawbridge.");
|
There("is no obvious way to close the drawbridge.");
|
||||||
else
|
else
|
||||||
You("%s no door there.", Blind ? "feel" : "see");
|
You("%s no door there.", Blind ? "feel" : "see");
|
||||||
return(0);
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(door->doormask == D_NODOOR) {
|
if (door->doormask == D_NODOOR) {
|
||||||
pline("This doorway has no door.");
|
pline("This doorway has no door.");
|
||||||
return(0);
|
return res;
|
||||||
}
|
} else if (obstructed(x, y, FALSE)) {
|
||||||
|
return res;
|
||||||
if(obstructed(x, y, FALSE)) return(0);
|
} else if (door->doormask == D_BROKEN) {
|
||||||
|
|
||||||
if(door->doormask == D_BROKEN) {
|
|
||||||
pline("This door is broken.");
|
pline("This door is broken.");
|
||||||
return(0);
|
return res;
|
||||||
}
|
} else if (door->doormask & (D_CLOSED | D_LOCKED)) {
|
||||||
|
|
||||||
if(door->doormask & (D_CLOSED | D_LOCKED)) {
|
|
||||||
pline("This door is already closed.");
|
pline("This door is already closed.");
|
||||||
return(0);
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(door->doormask == D_ISOPEN) {
|
if(door->doormask == D_ISOPEN) {
|
||||||
@@ -701,7 +724,7 @@ doclose() /* try to close a door */
|
|||||||
#endif
|
#endif
|
||||||
) {
|
) {
|
||||||
pline("You're too small to push the door closed.");
|
pline("You're too small to push the door closed.");
|
||||||
return(0);
|
return res;
|
||||||
}
|
}
|
||||||
if (
|
if (
|
||||||
#ifdef STEED
|
#ifdef STEED
|
||||||
@@ -715,10 +738,9 @@ doclose() /* try to close a door */
|
|||||||
else
|
else
|
||||||
newsym(x,y);
|
newsym(x,y);
|
||||||
block_point(x,y); /* vision: no longer see there */
|
block_point(x,y); /* vision: no longer see there */
|
||||||
}
|
} else {
|
||||||
else {
|
exercise(A_STR, TRUE);
|
||||||
exercise(A_STR, TRUE);
|
pline_The("door resists!");
|
||||||
pline_The("door resists!");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user