static int stealarm(void) { struct monst *mtmp; struct obj *otmp; for (otmp = invent; otmp; otmp = otmp->nobj) { if (otmp->o_id == stealoid) { for (mtmp = level->monlist; mtmp; mtmp = mtmp->nmon) { if (mtmp->m_id == stealmid) { if (DEADMONSTER(mtmp)) warning("stealarm(): dead monster stealing"); if (!dmgtype(mtmp->data, AD_SITM)) /* polymorphed */ goto botm; if (otmp->unpaid) subfrombill(otmp, shop_keeper(level, *u.ushops)); freeinv(otmp); pline("%s steals %s!", Monnam(mtmp), doname(otmp)); mpickobj(mtmp,otmp); /* may free otmp */ /* Implies seduction, "you gladly hand over ..." so we don't set mavenge bit here. */ monflee(mtmp, 0, FALSE, FALSE); if (!tele_restrict(mtmp)) rloc(level, mtmp, FALSE); break; } } break; } } botm: stealoid = 0; return 0; }
static int stealarm (void) { struct monst *mtmp; struct obj *otmp; for(otmp = invent; otmp; otmp = otmp->nobj) { if(otmp->o_id == stealoid) { for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) { if(mtmp->m_id == stealmid) { if(DEADMONSTER(mtmp)) impossible("stealarm(): dead monster stealing"); if(!dmgtype(mtmp->data, AD_SITM)) /* polymorphed */ goto botm; if(otmp->unpaid) subfrombill(otmp, shop_keeper(*u.ushops)); freeinv(otmp); message_monster_object(MSG_M_STEALS_O, mtmp, otmp); mpickobj(mtmp,otmp); /* may free otmp */ /* Implies seduction, "you gladly hand over ..." so we don't set mavenge bit here. */ monflee(mtmp, 0, false, false); if (!tele_restrict(mtmp)) (void) rloc(mtmp, false); break; } } break; } } botm: stealoid = 0; return 0; }
void dropy(struct obj *obj) { if(obj->otyp == CRYSKNIFE) obj->otyp = WORM_TOOTH; obj->ox = u.ux; obj->oy = u.uy; obj->nobj = fobj; fobj = obj; if(Invisible) newsym(u.ux,u.uy); subfrombill(obj); stackobj(obj); }
/* He is digging in the shop. */ void shopdig(int fall) { if(!fall) { if(u.utraptype == TT_PIT) pline("\"Be careful, sir, or you might fall through the floor.\""); else pline("\"Please, do not damage the floor here.\""); } else if(dist(shopkeeper->mx, shopkeeper->my) < 3) { struct obj *obj, *obj2; pline("%s grabs your backpack!", shkname(shopkeeper)); for(obj = invent; obj; obj = obj2) { obj2 = obj->nobj; if(obj->owornmask) continue; freeinv(obj); obj->nobj = shopkeeper->minvent; shopkeeper->minvent = obj; if(obj->unpaid) subfrombill(obj); } } }
/* He is digging in the shop. */ void shopdig(Boolean fall) { if (!fall) { if (you.utraptype == TT_PIT) message("\"Be careful, sir, or you might fall through the floor.\""); else message("\"Please, do not damage the floor here.\""); } else if (dist(shopkeeper->mx, shopkeeper->my) < 3) { obj_t *obj, *obj2; StrPrintF(ScratchBuffer, "%s grabs your backpack!", shkname(shopkeeper)); message(ScratchBuffer); for (obj = invent ; obj ; obj = obj2) { obj2 = obj->nobj; if (obj->owornmask) continue; unlink_inv(obj); //freeinv(obj); obj->nobj = shopkeeper->minvent; shopkeeper->minvent = obj; if (obj->bitflags & O_IS_UNPAID) subfrombill(obj); } } }
/* * Create a dummy duplicate to put on shop bill. The duplicate exists * only in the billobjs chain. This function is used when a shop object * is being altered, and a copy of the original is needed for billing * purposes. For example, when eating, where an interruption will yield * an object which is different from what it started out as; the "I x" * command needs to display the original object. * * The caller is responsible for checking otmp->unpaid and * costly_spot(u.ux, u.uy). This function will make otmp no charge. * * Note that check_unpaid_usage() should be used instead for partial * usage of an object. */ void bill_dummy_object(struct obj *otmp) { struct obj *dummy; if (otmp->unpaid) subfrombill(otmp, shop_keeper(level, *u.ushops)); dummy = newobj(otmp->oxlth + otmp->onamelth); *dummy = *otmp; dummy->where = OBJ_FREE; dummy->o_id = flags.ident++; if (!dummy->o_id) dummy->o_id = flags.ident++; /* ident overflowed */ dummy->timed = 0; if (otmp->oxlth) memcpy(dummy->oextra, otmp->oextra, otmp->oxlth); if (otmp->onamelth) strncpy(ONAME(dummy), ONAME(otmp), (int)otmp->onamelth); if (Is_candle(dummy)) dummy->lamplit = 0; addtobill(dummy, FALSE, TRUE, TRUE); otmp->no_charge = 1; otmp->unpaid = 0; return; }