effects of purple worms consuming special monsters is now more consistent
across eating, digesting and dropped corpses while engulfed
avoid "you finish disrobing" when disarming via the 'A' command
+make sure corpses and statues which remember monster attributes don't keep
+ ones that were conferred by no longer worn items (mainly speed boots)
Platform- and/or Interface-Specific Fixes
monstone(mdef)
register struct monst *mdef;
{
- struct obj *otmp, *obj;
+ struct obj *otmp, *obj, *oldminvent;
xchar x = mdef->mx, y = mdef->my;
boolean wasinside = FALSE;
if ((int)mdef->data->msize > MZ_TINY ||
!rn2(2 + ((int) (mdef->data->geno & G_FREQ) > 2))) {
- otmp = mkcorpstat(STATUE, KEEPTRAITS(mdef) ? mdef : 0,
- mdef->data, x, y, FALSE);
- if (mdef->mnamelth) otmp = oname(otmp, NAME(mdef));
+ oldminvent = 0;
/* some objects may end up outside the statue */
while ((obj = mdef->minvent) != 0) {
obj_extract_self(obj);
+ if (obj->owornmask) {
+ /* don't want map updates if invisibility
+ toggles or messages if speed changes */
+ in_mklev = TRUE;
+ update_mon_intrinsics(mdef, obj, FALSE);
+ in_mklev = FALSE;
+ }
obj_no_longer_held(obj);
if (obj->owornmask & W_WEP)
setmnotwielded(mdef,obj);
place_object(obj, x, y);
} else {
if (obj->lamplit) end_burn(obj, TRUE);
- (void) add_to_container(otmp, obj);
+ obj->nobj = oldminvent;
+ oldminvent = obj;
}
}
+ /* defer statue creation until after inventory removal
+ so that saved monster traits won't retain any stale
+ item-conferred attributes */
+ otmp = mkcorpstat(STATUE, KEEPTRAITS(mdef) ? mdef : 0,
+ mdef->data, x, y, FALSE);
+ if (mdef->mnamelth) otmp = oname(otmp, NAME(mdef));
+ while ((obj = oldminvent) != 0) {
+ oldminvent = obj->nobj;
+ (void) add_to_container(otmp, obj);
+ }
#ifndef GOLDOBJ
if (mdef->mgold) {
struct obj *au;
-/* SCCS Id: @(#)steal.c 3.4 2002/03/29 */
+/* SCCS Id: @(#)steal.c 3.4 2002/09/07 */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */
costly_spot(mtmp->mx, mtmp->my))
otmp->no_charge = 1;
#endif
+ if (otmp->owornmask) {
+ /* don't want map updates if invisibility
+ toggles or messages if speed changes */
+ in_mklev = TRUE;
+ update_mon_intrinsics(mtmp, otmp, FALSE);
+ in_mklev = FALSE;
+ }
+ /* obj_no_longer_held(otmp); -- done by place_object */
if (otmp->owornmask & W_WEP)
setmnotwielded(mtmp, otmp);
otmp->owornmask = 0L;