in src/dogmove.c [19:120]
STATIC_DCL boolean FDECL(can_reach_location, (struct monst *, XCHAR_P,
XCHAR_P, XCHAR_P, XCHAR_P));
STATIC_DCL boolean FDECL(could_reach_item, (struct monst *, XCHAR_P, XCHAR_P));
STATIC_DCL void FDECL(quickmimic, (struct monst *));
/* pick a carried item for pet to drop */
struct obj *
droppables(mon)
struct monst *mon;
{
struct obj *obj, *wep, dummy, *pickaxe, *unihorn, *key;
dummy = zeroobj;
dummy.otyp = GOLD_PIECE; /* not STRANGE_OBJECT or tools of interest */
dummy.oartifact = 1; /* so real artifact won't override "don't keep it" */
pickaxe = unihorn = key = (struct obj *) 0;
wep = MON_WEP(mon);
if (is_animal(mon->data) || mindless(mon->data)) {
/* won't hang on to any objects of these types */
pickaxe = unihorn = key = &dummy; /* act as if already have them */
} else {
/* don't hang on to pick-axe if can't use one or don't need one */
if (!tunnels(mon->data) || !needspick(mon->data))
pickaxe = &dummy;
/* don't hang on to key if can't open doors */
if (nohands(mon->data) || verysmall(mon->data))
key = &dummy;
}
if (wep) {
if (is_pick(wep))
pickaxe = wep;
if (wep->otyp == UNICORN_HORN)
unihorn = wep;
/* don't need any wielded check for keys... */
}
for (obj = mon->minvent; obj; obj = obj->nobj) {
switch (obj->otyp) {
case DWARVISH_MATTOCK:
/* reject mattock if couldn't wield it */
if (which_armor(mon, W_ARMS))
break;
/* keep mattock in preference to pick unless pick is already
wielded or is an artifact and mattock isn't */
if (pickaxe && pickaxe->otyp == PICK_AXE && pickaxe != wep
&& (!pickaxe->oartifact || obj->oartifact))
return pickaxe; /* drop the one we earlier decided to keep */
/*FALLTHRU*/
case PICK_AXE:
if (!pickaxe || (obj->oartifact && !pickaxe->oartifact)) {
if (pickaxe)
return pickaxe;
pickaxe = obj; /* keep this digging tool */
continue;
}
break;
case UNICORN_HORN:
/* reject cursed unicorn horns */
if (obj->cursed)
break;
/* keep artifact unihorn in preference to ordinary one */
if (!unihorn || (obj->oartifact && !unihorn->oartifact)) {
if (unihorn)
return unihorn;
unihorn = obj; /* keep this unicorn horn */
continue;
}
break;
case SKELETON_KEY:
/* keep key in preference to lock-pick */
if (key && key->otyp == LOCK_PICK
&& (!key->oartifact || obj->oartifact))
return key; /* drop the one we earlier decided to keep */
/*FALLTHRU*/
case LOCK_PICK:
/* keep lock-pick in preference to credit card */
if (key && key->otyp == CREDIT_CARD
&& (!key->oartifact || obj->oartifact))
return key;
/*FALLTHRU*/
case CREDIT_CARD:
if (!key || (obj->oartifact && !key->oartifact)) {
if (key)
return key;
key = obj; /* keep this unlocking tool */
continue;
}
break;
default:
break;
}
if (!obj->owornmask && obj != wep)
return obj;
}
return (struct obj *) 0; /* don't drop anything */
}