From 013ac7742311556022304e8b30ca170d48b3a016 Mon Sep 17 00:00:00 2001 From: "B. Watson" Date: Thu, 7 May 2015 16:32:32 -0400 Subject: initial commit --- hack/hack.steal.c | 210 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 210 insertions(+) create mode 100644 hack/hack.steal.c (limited to 'hack/hack.steal.c') diff --git a/hack/hack.steal.c b/hack/hack.steal.c new file mode 100644 index 0000000..84111bb --- /dev/null +++ b/hack/hack.steal.c @@ -0,0 +1,210 @@ +/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ +/* hack.steal.c - version 1.0.3 */ +/* $FreeBSD: src/games/hack/hack.steal.c,v 1.4 1999/11/16 10:26:38 marcel Exp $ */ +/* $DragonFly: src/games/hack/hack.steal.c,v 1.4 2006/08/21 19:45:32 pavalos Exp $ */ + +#include "hack.h" + +static void stealarm(void); + +/* actually returns something that fits in an int */ +long +somegold(void) +{ + return ((u.ugold < 100) ? u.ugold : + (u.ugold > 10000) ? rnd(10000) : rnd((int)u.ugold)); +} + +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; + } +} + +/* steal armor after he finishes taking it off */ +unsigned stealoid; /* object to be stolen */ +unsigned stealmid; /* monster doing the stealing */ + +static void +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 (dist(mtmp->mx, mtmp->my) < 3) { + freeinv(otmp); + pline("%s steals %s!", Monnam(mtmp), doname(otmp)); + mpickobj(mtmp, otmp); + mtmp->mflee = 1; + rloc(mtmp); + } + break; + } + break; + } + stealoid = 0; +} + +/* returns 1 when something was stolen */ +/* (or at least, when N should flee now) */ +/* avoid stealing the object stealoid */ +bool +steal(struct monst *mtmp) +{ + struct obj *otmp; + int tmp; + int named = 0; + + if (!invent) { + if (Blind) + pline("Somebody tries to rob you, but finds nothing to steal."); + else + pline("%s tries to rob you, but she finds nothing to steal!", + Monnam(mtmp)); + return (1); /* let her flee */ + } + tmp = 0; + for (otmp = invent; otmp; otmp = otmp->nobj) + if (otmp != uarm2) + tmp += ((otmp->owornmask & (W_ARMOR | W_RING)) ? 5 : 1); + tmp = rn2(tmp); + for (otmp = invent; otmp; otmp = otmp->nobj) + if (otmp != uarm2) + if ((tmp -= ((otmp->owornmask & (W_ARMOR | W_RING)) ? 5 : 1)) + < 0) + break; + if (!otmp) { + impossible("Steal fails!"); + return (0); + } + if (otmp->o_id == stealoid) + return (0); + if ((otmp->owornmask & (W_ARMOR | W_RING))) { + switch (otmp->olet) { + case RING_SYM: + ringoff(otmp); + break; + case ARMOR_SYM: + if (multi < 0 || otmp == uarms) { + setworn(NULL, otmp->owornmask & W_ARMOR); + break; + } + { + int curssv = otmp->cursed; + otmp->cursed = 0; + stop_occupation(); + pline("%s seduces you and %s off your %s.", + Amonnam(mtmp, Blind ? "gentle" : "beautiful"), + otmp->cursed ? "helps you to take" + : "you start taking", + (otmp == uarmg) ? "gloves" : + (otmp == uarmh) ? "helmet" : "armor"); + named++; + armoroff(otmp); + otmp->cursed = curssv; + if (multi < 0) { + stealoid = otmp->o_id; + stealmid = mtmp->m_id; + afternmv = stealarm; + return (0); + } + break; + } + default: + impossible("Tried to steal a strange worn thing."); + } + } else if (otmp == uwep) + setuwep(NULL); + if (otmp->olet == CHAIN_SYM) + impossible("How come you are carrying that chain?"); + if (Punished && otmp == uball) { + Punished = 0; + freeobj(uchain); + free(uchain); + uchain = NULL; + uball->spe = 0; + uball = NULL; /* superfluous */ + } + freeinv(otmp); + pline("%s stole %s.", named ? "She" : Monnam(mtmp), doname(otmp)); + mpickobj(mtmp, otmp); + return ((multi < 0) ? 0 : 1); +} + +void +mpickobj(struct monst *mtmp, struct obj *otmp) +{ + otmp->nobj = mtmp->minvent; + mtmp->minvent = otmp; +} + +bool +stealamulet(struct monst *mtmp) +{ + struct obj *otmp; + + for (otmp = invent; otmp; otmp = otmp->nobj) { + if (otmp->olet == AMULET_SYM) { + /* might be an imitation one */ + if (otmp == uwep) + setuwep(NULL); + freeinv(otmp); + mpickobj(mtmp, otmp); + pline("%s stole %s!", Monnam(mtmp), doname(otmp)); + return (1); + } + } + return (0); +} + +/* release the objects the killed animal has stolen */ +void +relobj(struct monst *mtmp, int show) +{ + struct obj *otmp, *otmp2; + + for (otmp = mtmp->minvent; otmp; otmp = otmp2) { + otmp->ox = mtmp->mx; + otmp->oy = mtmp->my; + otmp2 = otmp->nobj; + otmp->nobj = fobj; + fobj = otmp; + stackobj(fobj); + if (show & cansee(mtmp->mx, mtmp->my)) + atl(otmp->ox, otmp->oy, otmp->olet); + } + mtmp->minvent = NULL; + if (mtmp->mgold || mtmp->data->mlet == 'L') { + long tmp; + + tmp = (mtmp->mgold > 10000) ? 10000 : mtmp->mgold; + mkgold((long)(tmp + d(dlevel, 30)), mtmp->mx, mtmp->my); + if (show & cansee(mtmp->mx, mtmp->my)) + atl(mtmp->mx, mtmp->my, '$'); + } +} -- cgit v1.2.3