/* * Steal gold coins only. Leprechauns don't care for lesser coins. */ void stealgold(struct monst *mtmp) { struct obj *fgold = gold_at(level, u.ux, u.uy); struct obj *ygold; long tmp; /* skip lesser coins on the floor */ while (fgold && fgold->otyp != GOLD_PIECE) fgold = fgold->nexthere; /* Do you have real gold? */ ygold = findgold(invent); if (fgold && ( !ygold || fgold->quan > ygold->quan || !rn2(5))) { obj_extract_self(fgold); add_to_minv(mtmp, fgold); newsym(u.ux, u.uy); pline("%s quickly snatches some gold from between your %s!", Monnam(mtmp), makeplural(body_part(FOOT))); if (!ygold || !rn2(5)) { if (!tele_restrict(mtmp)) rloc(level, mtmp, FALSE); monflee(mtmp, 0, FALSE, FALSE); } } else if (ygold) { const int gold_price = objects[GOLD_PIECE].oc_cost; tmp = (somegold(money_cnt(invent)) + gold_price - 1) / gold_price; tmp = min(tmp, ygold->quan); if (tmp < ygold->quan) ygold = splitobj(ygold, tmp); freeinv(ygold); add_to_minv(mtmp, ygold); pline("Your purse feels lighter."); if (!tele_restrict(mtmp)) rloc(level, mtmp, FALSE); monflee(mtmp, 0, FALSE, FALSE); iflags.botl = 1; } }
void stealgold(struct monst *mtmp) { struct gold *gold = g_at(u.ux, u.uy); long tmp; if(gold && ( !u.ugold || gold->amount > u.ugold || !rn2(5))) { mtmp->mgold += gold->amount; freegold(gold); if(Invisible) newsym(u.ux, u.uy); pline("%s quickly snatches some gold from between your feet!", Monnam(mtmp)); if(!u.ugold || !rn2(5)) { rloc(mtmp); mtmp->mflee = 1; } } else if(u.ugold) { u.ugold -= (tmp = somegold()); pline("Your purse feels lighter."); mtmp->mgold += tmp; rloc(mtmp); mtmp->mflee = 1; flags.botl = 1; } }
void stealgold (struct monst *mtmp) { struct obj *gold = g_at(u.ux, u.uy); long tmp; if (gold && ( !u.ugold || gold->quan > u.ugold || !rn2(5))) { mtmp->mgold += gold->quan; delobj(gold); newsym(u.ux, u.uy); message_monster(MSG_M_QUICKLY_SNATCHES_GOLD_FROM_BEETWEEN_YOUR_LEGS, mtmp); if(!u.ugold || !rn2(5)) { if (!tele_restrict(mtmp)) (void) rloc(mtmp, false); /* do not set mtmp->mavenge here; gold on the floor is fair game */ monflee(mtmp, 0, false, false); } } else if(u.ugold) { u.ugold -= (tmp = somegold()); Your("purse feels lighter."); mtmp->mgold += tmp; if (!tele_restrict(mtmp)) (void) rloc(mtmp, false); mtmp->mavenge = 1; monflee(mtmp, 0, false, false); } }
/* save bones and possessions of a deceased adventurer */ void savebones() { int fd; struct obj *otmp; struct trap *ttmp; struct monst *mtmp; if(dlevel <= 0 || dlevel > MAXLEVEL) return; if(!rn2(1 + dlevel/2)) return; /* not so many ghosts on low levels */ bones[6] = '0' + (dlevel/10); bones[7] = '0' + (dlevel%10); if((fd = open(bones, O_RDONLY)) >= 0){ (void) close(fd); return; } /* drop everything; the corpse's possessions are usually cursed */ otmp = invent; while(otmp){ otmp->ox = u.ux; otmp->oy = u.uy; otmp->age = 0; /* very long ago */ otmp->owornmask = 0; if(rn2(5)) otmp->cursed = 1; if(!otmp->nobj){ otmp->nobj = fobj; fobj = invent; invent = 0; /* superfluous */ break; } otmp = otmp->nobj; } if(!(mtmp = makemon(PM_GHOST, u.ux, u.uy))) return; mtmp->mx = u.ux; mtmp->my = u.uy; mtmp->msleep = 1; (void) strlcpy((char *) mtmp->mextra, plname, mtmp->mxlth); mkgold(somegold() + d(dlevel,30), u.ux, u.uy); for(mtmp = fmon; mtmp; mtmp = mtmp->nmon){ mtmp->m_id = 0; if(mtmp->mtame) { mtmp->mtame = 0; mtmp->mpeaceful = 0; } mtmp->mlstmv = 0; if(mtmp->mdispl) unpmon(mtmp); } for(ttmp = ftrap; ttmp; ttmp = ttmp->ntrap) ttmp->tseen = 0; for(otmp = fobj; otmp; otmp = otmp->nobj) { otmp->o_id = 0; /* otmp->o_cnt_id = 0; - superfluous */ otmp->onamelth = 0; otmp->known = 0; otmp->invlet = 0; if(otmp->olet == AMULET_SYM && !otmp->spe) { otmp->spe = -1; /* no longer the actual amulet */ otmp->cursed = 1; /* flag as gotten from a ghost */ } } if((fd = open(bones, O_CREAT | O_TRUNC | O_WRONLY, FMASK)) < 0) return; savelev(fd,dlevel); (void) close(fd); }