yet another pass at 'A' bugs
I think this finally quashes the "cursed without otmp" issue. Various ways of destroying wielded weapon used setnotworn() rather than unwield(), so the previous change to have unwield() clear the pending W_WEP bit from takeoff.mask wasn't sufficient to prevent 'A' moving on from another item (blindfold--it's the only thing processed before primary weapon) to weapon which wasn't there any more. Also, if weapon was already set in takeoff.what to be processed on the next move, clearing W_WEP from takeoff.mask wasn't sufficient either. Move the previous unwield() 'fix' to setworn() and setnotworn() and extend it to include cancel_don() if the item being replaced or removed is in progress or scheduled for next. (Most of the time, remove_worn_item() has already done that before setworn() or setnotworn() is called.)
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
/* NetHack 3.6 worn.c $NHDT-Date: 1493510127 2017/04/29 23:55:27 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.48 $ */
|
||||
/* NetHack 3.6 worn.c $NHDT-Date: 1496959481 2017/06/08 22:04:41 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.49 $ */
|
||||
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
|
||||
/* NetHack may be freely redistributed. See license for details. */
|
||||
|
||||
@@ -77,6 +77,9 @@ long mask;
|
||||
if (oobj->oartifact)
|
||||
set_artifact_intrinsic(oobj, 0, mask);
|
||||
}
|
||||
/* in case wearing or removal is in progress or removal
|
||||
is pending (via 'A' command for multiple items) */
|
||||
cancel_doff(oobj, wp->w_mask);
|
||||
}
|
||||
*(wp->w_obj) = obj;
|
||||
if (obj) {
|
||||
@@ -119,6 +122,10 @@ register struct obj *obj;
|
||||
u.twoweap = 0;
|
||||
for (wp = worn; wp->w_mask; wp++)
|
||||
if (obj == *(wp->w_obj)) {
|
||||
/* in case wearing or removal is in progress or removal
|
||||
is pending (via 'A' command for multiple items) */
|
||||
cancel_doff(obj, wp->w_mask);
|
||||
|
||||
*(wp->w_obj) = 0;
|
||||
p = objects[obj->otyp].oc_oprop;
|
||||
u.uprops[p].extrinsic = u.uprops[p].extrinsic & ~wp->w_mask;
|
||||
|
||||
Reference in New Issue
Block a user