/* to floor near you */
You("yank %s %s to the %s!", s_suffix(mon_nam(mtmp)),
onambuf, surface(u.ux, u.uy));
- obj_no_longer_held(otmp);
place_object(otmp, u.ux, u.uy);
stackobj(otmp);
break;
while ((otmp = invent) != 0) {
obj_extract_self(otmp);
+ obj_no_longer_held(otmp);
otmp->owornmask = 0;
/* lamps don't go out when dropped */
- if ((cont || artifact_light(otmp)) && obj_is_burning(otmp)) /* smother in statue */
- end_burn(otmp, otmp->otyp != MAGIC_LAMP && !artifact_light(otmp));
+ if ((cont || artifact_light(otmp)) && obj_is_burning(otmp))
+ end_burn(otmp, TRUE); /* smother in statue */
if(otmp->otyp == SLIME_MOLD) goodfruit(otmp->spe);
if (!u.uswallow && flooreffects(obj,u.ux,u.uy,"drop")) return;
/* uswallow check done by GAN 01/29/87 */
- obj_no_longer_held(obj);
if(u.uswallow) {
boolean could_petrify;
if (obj != uball) { /* mon doesn't pick up ball */
}
}
+/* things that must change when not held; recurse into containers.
+ Called for both player and monsters */
void
-obj_no_longer_held(obj) /* things that must change when not held; recurse into containers */
+obj_no_longer_held(obj)
struct obj *obj;
{
if (!obj) {
- return;
+ return;
} else if ((Is_container(obj) || obj->otyp == STATUE) && obj->cobj) {
- struct obj *contents;
- for(contents=obj->cobj; contents; contents=contents->nobj)
- obj_no_longer_held(contents);
+ struct obj *contents;
+ for(contents=obj->cobj; contents; contents=contents->nobj)
+ obj_no_longer_held(contents);
}
switch(obj->otyp) {
- case CRYSKNIFE:
- /* KMH -- Fixed crysknives have only 10% chance of reverting */
- if (!obj->oerodeproof || !rn2(10)) {
- obj->otyp = WORM_TOOTH;
- obj->oerodeproof = 0;
- }
- break;
+ case CRYSKNIFE:
+ /* KMH -- Fixed crysknives have only 10% chance of reverting */
+ /* only changes when not held by player or monster */
+ if (!obj->oerodeproof || !rn2(10)) {
+ obj->otyp = WORM_TOOTH;
+ obj->oerodeproof = 0;
+ }
+ break;
}
}
if (otmp->where != OBJ_FREE)
panic("place_object: obj not free");
+ obj_no_longer_held(otmp);
if (otmp->otyp == BOULDER) block_point(x,y); /* vision */
/* obj goes under boulders */
if (obj->where != OBJ_FREE)
panic("add_to_container: obj not free");
+ if (container->where != OBJ_INVENT && container->where != OBJ_MINVENT)
+ obj_no_longer_held(obj);
/* merge if possible */
for (otmp = container->cobj; otmp; otmp = otmp->nobj)
/* some objects may end up outside the statue */
while ((obj = mdef->minvent) != 0) {
obj_extract_self(obj);
+ obj_no_longer_held(obj);
if (obj->owornmask & W_WEP)
setmnotwielded(mdef,obj);
obj->owornmask = 0L;
case 1: /* onto floor beneath mon */
pline("%s yanks %s from your %s!", Monnam(mtmp),
the_weapon, hand);
- obj_no_longer_held(obj);
place_object(obj, mtmp->mx, mtmp->my);
break;
case 2: /* onto floor beneath you */
u.uconduct.wishes++;
if (otmp != &zeroobj) {
+ /* place_object looses these */
+ boolean crysknife = (otmp->otyp == CRYSKNIFE);
+ int oerode = otmp->oerodeproof;
+
/* in case touching this object turns out to be fatal */
place_object(otmp, u.ux, u.uy);
dropy(otmp); /* now put it back again :-) */
} else {
obj_extract_self(otmp);
+ if (crysknife) {
+ otmp->otyp = CRYSKNIFE;
+ otmp->oerodeproof = oerode;
+ }
/* The(aobjnam()) is safe since otmp is unidentified -dlc */
(void) hold_another_object(otmp, u.uswallow ?
"Oops! %s out of your reach!" :