can't eat an artifact you're unable to touch
attempting to kick beyond map edge performed an out of array bounds memory
access; symptom seen was "show_glyph: bad pos" warning when blind
+attempting to engrave with an empty wand should use a turn even when hero is
+ levitating--trying and failing to wrest a charge takes time
+don't access freed memory after engraving "wrests one last charnge" from wand
Platform- and/or Interface-Specific Fixes
/* ### zap.c ### */
+E void FDECL(learnwand, (struct obj *));
E int FDECL(bhitm, (struct monst *,struct obj *));
E void FDECL(probe_monster, (struct monst *));
E boolean FDECL(get_obj_location, (struct obj *,xchar *,xchar *,int));
-/* SCCS Id: @(#)engrave.c 3.5 2006/12/06 */
+/* SCCS Id: @(#)engrave.c 3.5 2007/01/26 */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */
return 1;
}
zapwand = TRUE;
- if (Levitation) ptext = FALSE;
+ if (!can_reach_floor(TRUE)) ptext = FALSE;
switch (otmp->otyp) {
/* DUST wands */
/* type = MARK wands */
/* type = ENGR_BLOOD wands */
}
- } else /* end if zappable */
- if (!can_reach_floor(TRUE)) {
- cant_reach_floor(u.ux, u.uy, FALSE, TRUE);
- return(0);
- }
+ } else { /* end if zappable */
+ /* failing to wrest one last charge takes time */
+ ptext = FALSE; /* use "early exit" below, return 1 */
+ /* cancelled wand turns to dust unless hero can't write */
+ if (otmp->spe < 0 && can_reach_floor(TRUE)) zapwand = TRUE;
+ }
break;
case WEAPON_CLASS:
/* Identify stylus */
if (doknown) {
- makeknown(otmp->otyp);
- more_experienced(0,10);
+ learnwand(otmp);
+ if (objects[otmp->otyp].oc_name_known) more_experienced(0, 10);
}
if (teleengr) {
"are not going to get anywhere trying to write in the %s with your dust.",
is_ice(u.ux,u.uy) ? "frost" : "dust");
useup(otmp);
+ otmp = 0; /* wand is now gone */
ptext = FALSE;
}
if (!ptext) { /* Early exit for some implements. */
- if (otmp->oclass == WAND_CLASS && !can_reach_floor(TRUE))
+ if (otmp && otmp->oclass == WAND_CLASS && !can_reach_floor(TRUE))
cant_reach_floor(u.ux, u.uy, FALSE, TRUE);
return(1);
}
/* kludge to use mondied instead of killed */
extern boolean m_using;
-STATIC_DCL void FDECL(learnwand, (struct obj *));
STATIC_DCL void FDECL(polyuse, (struct obj *,int,int));
STATIC_DCL void FDECL(create_polymon, (struct obj *,int));
STATIC_DCL boolean FDECL(zap_updown, (struct obj *));
*/
/* wand discovery gets special handling when hero is blinded */
-STATIC_OVL void
+void
learnwand(obj)
struct obj *obj;
{