/* NetHack 3.5 you.h $Date$ $Revision$ */
-/* SCCS Id: @(#)you.h 3.5 2006/03/01 */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */
extern const struct Align aligns[]; /* table of available alignments */
+/* hangup handling; sometimes u.uinwater is overridden, and we need to
+ be able to reset it in the event of restoring from a hangup save;
+ save/override/restore takes place during normal execution, so this
+ isn't dependent upon current port's signal handling capability */
+struct huphack {
+ Bitfield(hup_uinwater,1);
+ Bitfield(hup_uburied,1);
+};
/*** Information about the player ***/
struct you {
xchar skill_record[P_SKILL_LIMIT]; /* skill advancements */
struct skills weapon_skills[P_NUM_SKILLS];
boolean twoweap; /* KMH -- Using two-weapon combat */
+ struct huphack save; /* hup_{uinwater,uburied} */
}; /* end of `struct you' */
{
register struct obj *obj;
register struct monst *mtmp;
- int uw = u.uinwater;
struct obj *temp;
boolean stale;
outgoldmap:
cls();
- u.uinwater = 0;
+ u.save.hup_uinwater = u.uinwater, u.save.hup_uburied = u.uburied;
+ u.uinwater = u.uburied = 0;
/* Discover gold locations. */
for (obj = fobj; obj; obj = obj->nobj) {
if (sobj->blessed && (temp = o_material(obj, GOLD))) {
break;
}
}
-
newsym(u.ux,u.uy);
+ u.uinwater = u.save.hup_uinwater, u.uburied = u.save.hup_uburied;
You_feel("very greedy, and sense gold!");
exercise(A_WIS, TRUE);
display_nhwindow(WIN_MAP, TRUE);
docrt();
- u.uinwater = uw;
if (Underwater) under_water(2);
if (u.uburied) under_ground(2);
return(0);
boolean confused = (Confusion || (sobj && sobj->cursed)), stale;
char oclass = confused ? POTION_CLASS : FOOD_CLASS;
const char *what = confused ? something : "food";
- int uw = u.uinwater;
stale = clear_stale_map(oclass, 0);
struct obj *temp;
known = TRUE;
cls();
- u.uinwater = 0;
+ u.save.hup_uinwater = u.uinwater, u.save.hup_uburied = u.uburied;
+ u.uinwater = u.uburied = 0;
for (obj = fobj; obj; obj = obj->nobj)
if ((temp = o_in(obj, oclass)) != 0) {
if (temp != obj) {
break; /* skip rest of this monster's inventory */
}
newsym(u.ux,u.uy);
+ u.uinwater = u.save.hup_uinwater, u.uburied = u.save.hup_uburied;
if (sobj) {
if (sobj->blessed) {
- Your("%s %s to tingle and you smell %s.", body_part(NOSE),
- u.uedibility ? "continues" : "starts", what);
+ Your("%s %s to tingle and you smell %s.", body_part(NOSE),
+ u.uedibility ? "continues" : "starts", what);
u.uedibility = 1;
} else
Your("%s tingles and you smell %s.", body_part(NOSE), what);
- }
- else You("sense %s.", what);
+ } else
+ You("sense %s.", what);
display_nhwindow(WIN_MAP, TRUE);
exercise(A_WIS, TRUE);
docrt();
- u.uinwater = uw;
if (Underwater) under_water(2);
if (u.uburied) under_ground(2);
}
int ct = 0, ctu = 0;
register struct obj *obj, *otmp = (struct obj *)0;
register struct monst *mtmp;
- int uw = u.uinwater;
int sym, boulder = 0;
if (class < 0 || class >= MAXOCLASSES) {
cls();
- u.uinwater = 0;
+ u.save.hup_uinwater = u.uinwater, u.save.hup_uburied = u.uburied;
+ u.uinwater = u.uburied = 0;
/*
* Map all buried objects first.
*/
}
newsym(u.ux,u.uy);
+ u.uinwater = u.save.hup_uinwater, u.uburied = u.save.hup_uburied;
You("detect the %s of %s.", ct ? "presence" : "absence", stuff);
display_nhwindow(WIN_MAP, TRUE);
/*
*/
docrt(); /* this will correctly reset vision */
- u.uinwater = uw;
if (Underwater) under_water(2);
if (u.uburied) under_ground(2);
return 0;
register struct trap *ttmp;
struct monst *mon;
int door, glyph, tr;
- int uw = u.uinwater, cursed_src = sobj && sobj->cursed;
+ int cursed_src = sobj && sobj->cursed;
boolean found = FALSE;
coord cc;
outtrapmap:
cls();
- u.uinwater = 0;
+ u.save.hup_uinwater = u.uinwater, u.save.hup_uburied = u.uburied;
+ u.uinwater = u.uburied = 0;
/* show chest traps first, so that subsequent floor trap display
will override if both types are present at the same location */
glyph = glyph_at(u.ux, u.uy);
if (!(glyph_is_trap(glyph) || glyph_is_object(glyph)))
newsym(u.ux, u.uy);
+ u.uinwater = u.save.hup_uinwater, u.uburied = u.save.hup_uburied;
You_feel("%s.", cursed_src ? "very greedy" : "entrapped");
/* wait for user to respond, then reset map display to normal */
display_nhwindow(WIN_MAP, TRUE);
docrt();
- u.uinwater = uw;
if (Underwater) under_water(2);
if (u.uburied) under_ground(2);
return(0);
do_mapping()
{
register int zx, zy;
- int uw = u.uinwater;
- u.uinwater = 0;
+ u.save.hup_uinwater = u.uinwater, u.save.hup_uburied = u.uburied;
+ u.uinwater = u.uburied = 0;
for (zx = 1; zx < COLNO; zx++)
for (zy = 0; zy < ROWNO; zy++)
show_map_spot(zx, zy);
- exercise(A_WIS, TRUE);
- u.uinwater = uw;
+ u.uinwater = u.save.hup_uinwater, u.uburied = u.save.hup_uburied;
if (!level.flags.hero_memory || Underwater) {
flush_screen(1); /* flush temp screen */
display_nhwindow(WIN_MAP, TRUE); /* wait */
docrt();
}
+ exercise(A_WIS, TRUE);
}
void