1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64: #include <sys/cdefs.h>
65: #ifndef lint
66: __RCSID("$NetBSD: hack.steal.c,v 1.5 2003/04/02 18:36:40 jsm Exp $");
67: #endif
68:
69: #include <stdlib.h>
70: #include "hack.h"
71: #include "extern.h"
72:
73: long
74:
75: somegold()
76: {
77: return ((u.ugold < 100) ? u.ugold :
78: (u.ugold > 10000) ? rnd(10000) : rnd((int) u.ugold));
79: }
80:
81: void
82: stealgold(mtmp)
83: struct monst *mtmp;
84: {
85: struct gold *gold = g_at(u.ux, u.uy);
86: long tmp;
87: if (gold && (!u.ugold || gold->amount > u.ugold || !rn2(5))) {
88: mtmp->mgold += gold->amount;
89: freegold(gold);
90: if (Invisible)
91: newsym(u.ux, u.uy);
92: pline("%s quickly snatches some gold from between your feet!",
93: Monnam(mtmp));
94: if (!u.ugold || !rn2(5)) {
95: rloc(mtmp);
96: mtmp->mflee = 1;
97: }
98: } else if (u.ugold) {
99: u.ugold -= (tmp = somegold());
100: pline("Your purse feels lighter.");
101: mtmp->mgold += tmp;
102: rloc(mtmp);
103: mtmp->mflee = 1;
104: flags.botl = 1;
105: }
106: }
107:
108:
109: unsigned stealoid;
110: unsigned stealmid;
111: int
112: stealarm()
113: {
114: struct monst *mtmp;
115: struct obj *otmp;
116:
117: for (otmp = invent; otmp; otmp = otmp->nobj)
118: if (otmp->o_id == stealoid) {
119: for (mtmp = fmon; mtmp; mtmp = mtmp->nmon)
120: if (mtmp->m_id == stealmid) {
121: if (dist(mtmp->mx, mtmp->my) < 3) {
122: freeinv(otmp);
123: pline("%s steals %s!", Monnam(mtmp), doname(otmp));
124: mpickobj(mtmp, otmp);
125: mtmp->mflee = 1;
126: rloc(mtmp);
127: }
128: break;
129: }
130: break;
131: }
132: stealoid = 0;
133: return 0;
134: }
135:
136:
137:
138:
139: int
140: steal(mtmp)
141: struct monst *mtmp;
142: {
143: struct obj *otmp;
144: int tmp;
145: int named = 0;
146:
147: if (!invent) {
148: if (Blind)
149: pline("Somebody tries to rob you, but finds nothing to steal.");
150: else
151: pline("%s tries to rob you, but she finds nothing to steal!",
152: Monnam(mtmp));
153: return (1);
154: }
155: tmp = 0;
156: for (otmp = invent; otmp; otmp = otmp->nobj)
157: if (otmp != uarm2)
158: tmp += ((otmp->owornmask & (W_ARMOR | W_RING)) ? 5 : 1);
159: tmp = rn2(tmp);
160: for (otmp = invent; otmp; otmp = otmp->nobj)
161: if (otmp != uarm2)
162: if ((tmp -= ((otmp->owornmask & (W_ARMOR | W_RING)) ? 5 : 1))
163: < 0)
164: break;
165: if (!otmp) {
166: impossible("Steal fails!");
167: return (0);
168: }
169: if (otmp->o_id == stealoid)
170: return (0);
171: if ((otmp->owornmask & (W_ARMOR | W_RING))) {
172: switch (otmp->olet) {
173: case RING_SYM:
174: ringoff(otmp);
175: break;
176: case ARMOR_SYM:
177: if (multi < 0 || otmp == uarms) {
178: setworn((struct obj *) 0, otmp->owornmask & W_ARMOR);
179: break;
180: } {
181: int curssv = otmp->cursed;
182: otmp->cursed = 0;
183: stop_occupation();
184: pline("%s seduces you and %s off your %s.",
185: Amonnam(mtmp, Blind ? "gentle" : "beautiful"),
186: otmp->cursed ? "helps you to take"
187: : "you start taking",
188: (otmp == uarmg) ? "gloves" :
189: (otmp == uarmh) ? "helmet" : "armor");
190: named++;
191: (void) armoroff(otmp);
192: otmp->cursed = curssv;
193: if (multi < 0) {
194:
195:
196:
197:
198:
199: stealoid = otmp->o_id;
200: stealmid = mtmp->m_id;
201: afternmv = stealarm;
202: return (0);
203: }
204: break;
205: }
206: default:
207: impossible("Tried to steal a strange worn thing.");
208: }
209: } else if (otmp == uwep)
210: setuwep((struct obj *) 0);
211: if (otmp->olet == CHAIN_SYM) {
212: impossible("How come you are carrying that chain?");
213: }
214: if (Punished && otmp == uball) {
215: Punished = 0;
216: freeobj(uchain);
217: free((char *) uchain);
218: uchain = (struct obj *) 0;
219: uball->spe = 0;
220: uball = (struct obj *) 0;
221: }
222: freeinv(otmp);
223: pline("%s stole %s.", named ? "She" : Monnam(mtmp), doname(otmp));
224: mpickobj(mtmp, otmp);
225: return ((multi < 0) ? 0 : 1);
226: }
227:
228: void
229: mpickobj(mtmp, otmp)
230: struct monst *mtmp;
231: struct obj *otmp;
232: {
233: otmp->nobj = mtmp->minvent;
234: mtmp->minvent = otmp;
235: }
236:
237: int
238: stealamulet(mtmp)
239: struct monst *mtmp;
240: {
241: struct obj *otmp;
242:
243: for (otmp = invent; otmp; otmp = otmp->nobj) {
244: if (otmp->olet == AMULET_SYM) {
245:
246: if (otmp == uwep)
247: setuwep((struct obj *) 0);
248: freeinv(otmp);
249: mpickobj(mtmp, otmp);
250: pline("%s stole %s!", Monnam(mtmp), doname(otmp));
251: return (1);
252: }
253: }
254: return (0);
255: }
256:
257:
258: void
259: relobj(mtmp, show)
260: struct monst *mtmp;
261: int show;
262: {
263: struct obj *otmp, *otmp2;
264:
265: for (otmp = mtmp->minvent; otmp; otmp = otmp2) {
266: otmp->ox = mtmp->mx;
267: otmp->oy = mtmp->my;
268: otmp2 = otmp->nobj;
269: otmp->nobj = fobj;
270: fobj = otmp;
271: stackobj(fobj);
272: if (show & cansee(mtmp->mx, mtmp->my))
273: atl(otmp->ox, otmp->oy, otmp->olet);
274: }
275: mtmp->minvent = (struct obj *) 0;
276: if (mtmp->mgold || mtmp->data->mlet == 'L') {
277: long tmp;
278:
279: tmp = (mtmp->mgold > 10000) ? 10000 : mtmp->mgold;
280: mkgold((long) (tmp + d(dlevel, 30)), mtmp->mx, mtmp->my);
281: if (show & cansee(mtmp->mx, mtmp->my))
282: atl(mtmp->mx, mtmp->my, '$');
283: }
284: }