diff --git a/doc/fixes34.4 b/doc/fixes34.4 index 8d8347117..c81ea3951 100644 --- a/doc/fixes34.4 +++ b/doc/fixes34.4 @@ -297,6 +297,9 @@ can't throw if poly'd into form which lacks hands 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 diff --git a/include/extern.h b/include/extern.h index 1fac63df4..9a5703eba 100644 --- a/include/extern.h +++ b/include/extern.h @@ -2578,6 +2578,7 @@ E int FDECL(dowrite, (struct obj *)); /* ### 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)); diff --git a/src/engrave.c b/src/engrave.c index c8b919027..a02320ca1 100644 --- a/src/engrave.c +++ b/src/engrave.c @@ -1,4 +1,4 @@ -/* 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. */ @@ -618,7 +618,7 @@ doengrave() return 1; } zapwand = TRUE; - if (Levitation) ptext = FALSE; + if (!can_reach_floor(TRUE)) ptext = FALSE; switch (otmp->otyp) { /* DUST wands */ @@ -771,11 +771,12 @@ doengrave() /* 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: @@ -855,8 +856,8 @@ doengrave() /* 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) { @@ -884,11 +885,12 @@ doengrave() "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); } diff --git a/src/zap.c b/src/zap.c index c025c2891..fc9bd2472 100644 --- a/src/zap.c +++ b/src/zap.c @@ -19,7 +19,6 @@ extern boolean notonhead; /* for long worms */ /* 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 *)); @@ -117,7 +116,7 @@ const char * const flash_types[] = { /* also used in buzzmu(mcastu.c) */ */ /* wand discovery gets special handling when hero is blinded */ -STATIC_OVL void +void learnwand(obj) struct obj *obj; {