/* release the objects the creature is carrying */ void relobj(struct monst *mtmp, int show, boolean is_pet) { /* If true, pet should keep wielded/worn items */ struct obj *otmp; int omx = mtmp->mx, omy = mtmp->my; struct obj *keepobj = 0; struct pet_weapons p; initialize_pet_weapons(mtmp, &p); while ((otmp = mtmp->minvent) != 0) { obj_extract_self(otmp); if (is_pet && pet_wants_object(&p, otmp)) { otmp->nobj = keepobj; keepobj = otmp; continue; } if (otmp->owornmask & W_MASK(os_wep)) setmnotwielded(mtmp, otmp); mdrop_obj(mtmp, otmp, is_pet && flags.verbose); } /* put kept objects back */ while ((otmp = keepobj) != NULL) { keepobj = otmp->nobj; add_to_minv(mtmp, otmp); } if (show & cansee(omx, omy) && mtmp->dlevel == level) newsym(omx, omy); }
/* release the objects the creature is carrying */ void relobj(struct monst *mtmp, int show, boolean is_pet) { /* If true, pet should keep wielded/worn items */ struct obj *otmp; int omx = mtmp->mx, omy = mtmp->my; struct obj *keepobj = 0; struct obj *wep = MON_WEP(mtmp), *hwep = attacktype(mtmp->data, AT_WEAP) ? select_hwep(mtmp) : (struct obj *)0, *proj = attacktype(mtmp->data, AT_WEAP) ? select_rwep(mtmp) : (struct obj *)0, *rwep; boolean item1 = FALSE, item2 = FALSE; rwep = attacktype(mtmp->data, AT_WEAP) ? propellor : &zeroobj; if (!is_pet || mindless(mtmp->data) || is_animal(mtmp->data)) item1 = item2 = TRUE; if (!tunnels(mtmp->data) || !needspick(mtmp->data)) item1 = TRUE; while ((otmp = mtmp->minvent) != 0) { obj_extract_self(otmp); /* special case: pick-axe and unicorn horn are non-worn */ /* items that we also want pets to keep 1 of */ /* (It is a coincidence that these can also be wielded.) */ if (otmp->owornmask || otmp == wep || otmp == hwep || otmp == rwep || otmp == proj || would_prefer_hwep(mtmp, otmp) || /* cursed item in hand? */ would_prefer_rwep(mtmp, otmp) || could_use_item(mtmp, otmp) || ((!rwep || rwep == &zeroobj) && (is_ammo(otmp) || is_launcher(otmp))) || (rwep && rwep != &zeroobj && ammo_and_launcher(otmp, rwep)) || ((!item1 && otmp->otyp == PICK_AXE) || (!item2 && otmp->otyp == UNICORN_HORN && !otmp->cursed))) { if (is_pet) { /* dont drop worn/wielded item */ if (otmp->otyp == PICK_AXE) item1 = TRUE; if (otmp->otyp == UNICORN_HORN && !otmp->cursed) item2 = TRUE; otmp->nobj = keepobj; keepobj = otmp; continue; } } if (otmp == wep) setmnotwielded(mtmp, otmp); mdrop_obj(mtmp, otmp, is_pet && flags.verbose); } /* put kept objects back */ while ((otmp = keepobj) != NULL) { keepobj = otmp->nobj; add_to_minv(mtmp, otmp); } if (show & cansee(omx, omy)) newsym(omx, omy); }
/* some monsters bypass the normal rules for moving between levels or even leaving the game entirely; when that happens, prevent them from taking the Amulet or invocation tools with them */ void mdrop_special_objs (struct monst *mon) { struct obj *obj, *otmp; for (obj = mon->minvent; obj; obj = otmp) { otmp = obj->nobj; /* the Amulet, invocation tools, and Rider corpses resist even when artifacts and ordinary objects are given 0% resistance chance */ if (obj_resists(obj, 0, 0)) { obj_extract_self(obj); mdrop_obj(mon, obj, false); } } }
/* release the objects the creature is carrying */ // bool is_pet /* If true, pet should keep wielded/worn items */ void relobj ( struct monst *mtmp, int show, bool is_pet) { struct obj *otmp; int omx = mtmp->mx, omy = mtmp->my; struct obj *keepobj = 0; struct obj *wep = MON_WEP(mtmp); bool item1 = false, item2 = false; if (!is_pet || mindless(mtmp->data) || is_animal(mtmp->data)) item1 = item2 = true; if (!tunnels(mtmp->data) || !needspick(mtmp->data)) item1 = true; while ((otmp = mtmp->minvent) != 0) { obj_extract_self(otmp); /* special case: pick-axe and unicorn horn are non-worn */ /* items that we also want pets to keep 1 of */ /* (It is a coincidence that these can also be wielded.) */ if (otmp->owornmask || otmp == wep || ((!item1 && otmp->otyp == PICK_AXE) || (!item2 && otmp->otyp == UNICORN_HORN && !otmp->cursed))) { if (is_pet) { /* dont drop worn/wielded item */ if (otmp->otyp == PICK_AXE) item1 = true; if (otmp->otyp == UNICORN_HORN && !otmp->cursed) item2 = true; otmp->nobj = keepobj; keepobj = otmp; continue; } } mdrop_obj(mtmp, otmp, is_pet && flags.verbose); } /* put kept objects back */ while ((otmp = keepobj) != (struct obj *)0) { keepobj = otmp->nobj; (void) add_to_minv(mtmp, otmp); } if (mtmp->mgold) { long g = mtmp->mgold; (void) mkgold(g, omx, omy); if (is_pet && cansee(omx, omy) && flags.verbose) { message_monster_int(MSG_M_DROPS_X_GOLD_PIECES, mtmp, g); } mtmp->mgold = 0L; } if (show & cansee(omx, omy)) newsym(omx, omy); }
/* release the objects the creature is carrying */ void relobj(struct monst *mtmp, int show, boolean is_pet) /* If true, pet should keep wielded/worn items */ { struct obj *otmp; int omx = mtmp->mx, omy = mtmp->my; struct obj *keepobj = 0; struct obj *wep = MON_WEP(mtmp); boolean item1 = FALSE, item2 = FALSE; if (!is_pet || mindless(mtmp->data) || is_animal(mtmp->data)) item1 = item2 = TRUE; if (!tunnels(mtmp->data) || !needspick(mtmp->data)) item1 = TRUE; while ((otmp = mtmp->minvent) != 0) { obj_extract_self(otmp); /* special case: pick-axe and unicorn horn are non-worn */ /* items that we also want pets to keep 1 of */ /* (It is a coincidence that these can also be wielded.) */ if (otmp->owornmask || otmp == wep || ((!item1 && otmp->otyp == PICK_AXE) || (!item2 && otmp->otyp == UNICORN_HORN && !otmp->cursed))) { if (is_pet) { /* dont drop worn/wielded item */ if (otmp->otyp == PICK_AXE) item1 = TRUE; if (otmp->otyp == UNICORN_HORN && !otmp->cursed) item2 = TRUE; otmp->nobj = keepobj; keepobj = otmp; continue; } } mdrop_obj(mtmp, otmp, is_pet && flags.verbose); } /* put kept objects back */ while ((otmp = keepobj) != NULL) { keepobj = otmp->nobj; add_to_minv(mtmp, otmp); } if (show & cansee(omx, omy)) newsym(omx, omy); }