xref: /dragonfly/games/hack/hack.steal.c (revision 1de703da)
1 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
2 /* hack.steal.c - version 1.0.3 */
3 /* $FreeBSD: src/games/hack/hack.steal.c,v 1.4 1999/11/16 10:26:38 marcel Exp $ */
4 /* $DragonFly: src/games/hack/hack.steal.c,v 1.2 2003/06/17 04:25:24 dillon Exp $ */
5 
6 #include "hack.h"
7 
8 long		/* actually returns something that fits in an int */
9 somegold(){
10 	return( (u.ugold < 100) ? u.ugold :
11 		(u.ugold > 10000) ? rnd(10000) : rnd((int) u.ugold) );
12 }
13 
14 stealgold(mtmp)  struct monst *mtmp; {
15 struct gold *gold = g_at(u.ux, u.uy);
16 long tmp;
17 	if(gold && ( !u.ugold || gold->amount > u.ugold || !rn2(5))) {
18 		mtmp->mgold += gold->amount;
19 		freegold(gold);
20 		if(Invisible) newsym(u.ux, u.uy);
21 		pline("%s quickly snatches some gold from between your feet!",
22 			Monnam(mtmp));
23 		if(!u.ugold || !rn2(5)) {
24 			rloc(mtmp);
25 			mtmp->mflee = 1;
26 		}
27 	} else if(u.ugold) {
28 		u.ugold -= (tmp = somegold());
29 		pline("Your purse feels lighter.");
30 		mtmp->mgold += tmp;
31 		rloc(mtmp);
32 		mtmp->mflee = 1;
33 		flags.botl = 1;
34 	}
35 }
36 
37 /* steal armor after he finishes taking it off */
38 unsigned stealoid;		/* object to be stolen */
39 unsigned stealmid;		/* monster doing the stealing */
40 stealarm(){
41 	struct monst *mtmp;
42 	struct obj *otmp;
43 
44 	for(otmp = invent; otmp; otmp = otmp->nobj)
45 	  if(otmp->o_id == stealoid) {
46 	    for(mtmp = fmon; mtmp; mtmp = mtmp->nmon)
47 	      if(mtmp->m_id == stealmid) {
48 		if(dist(mtmp->mx,mtmp->my) < 3) {
49 		  freeinv(otmp);
50 		  pline("%s steals %s!", Monnam(mtmp), doname(otmp));
51 		  mpickobj(mtmp,otmp);
52 		  mtmp->mflee = 1;
53 		  rloc(mtmp);
54 		}
55 		break;
56 	      }
57 	    break;
58 	  }
59 	stealoid = 0;
60 }
61 
62 /* returns 1 when something was stolen */
63 /* (or at least, when N should flee now) */
64 /* avoid stealing the object stealoid */
65 steal(mtmp)
66 struct monst *mtmp;
67 {
68 	struct obj *otmp;
69 	int tmp;
70 	int named = 0;
71 
72 	if(!invent){
73 	    if(Blind)
74 	      pline("Somebody tries to rob you, but finds nothing to steal.");
75 	    else
76 	      pline("%s tries to rob you, but she finds nothing to steal!",
77 		Monnam(mtmp));
78 	    return(1);	/* let her flee */
79 	}
80 	tmp = 0;
81 	for(otmp = invent; otmp; otmp = otmp->nobj) if(otmp != uarm2)
82 		tmp += ((otmp->owornmask & (W_ARMOR | W_RING)) ? 5 : 1);
83 	tmp = rn2(tmp);
84 	for(otmp = invent; otmp; otmp = otmp->nobj) if(otmp != uarm2)
85 		if((tmp -= ((otmp->owornmask & (W_ARMOR | W_RING)) ? 5 : 1))
86 			< 0) break;
87 	if(!otmp) {
88 		impossible("Steal fails!");
89 		return(0);
90 	}
91 	if(otmp->o_id == stealoid)
92 		return(0);
93 	if((otmp->owornmask & (W_ARMOR | W_RING))){
94 		switch(otmp->olet) {
95 		case RING_SYM:
96 			ringoff(otmp);
97 			break;
98 		case ARMOR_SYM:
99 			if(multi < 0 || otmp == uarms){
100 			  setworn((struct obj *) 0, otmp->owornmask & W_ARMOR);
101 			  break;
102 			}
103 		{ int curssv = otmp->cursed;
104 			otmp->cursed = 0;
105 			stop_occupation();
106 			pline("%s seduces you and %s off your %s.",
107 				Amonnam(mtmp, Blind ? "gentle" : "beautiful"),
108 				otmp->cursed ? "helps you to take"
109 					    : "you start taking",
110 				(otmp == uarmg) ? "gloves" :
111 				(otmp == uarmh) ? "helmet" : "armor");
112 			named++;
113 			(void) armoroff(otmp);
114 			otmp->cursed = curssv;
115 			if(multi < 0){
116 				extern char *nomovemsg;
117 				extern int (*afternmv)();
118 				/*
119 				multi = 0;
120 				nomovemsg = 0;
121 				afternmv = 0;
122 				*/
123 				stealoid = otmp->o_id;
124 				stealmid = mtmp->m_id;
125 				afternmv = stealarm;
126 				return(0);
127 			}
128 			break;
129 		}
130 		default:
131 			impossible("Tried to steal a strange worn thing.");
132 		}
133 	}
134 	else if(otmp == uwep)
135 		setuwep((struct obj *) 0);
136 	if(otmp->olet == CHAIN_SYM) {
137 		impossible("How come you are carrying that chain?");
138 	}
139 	if(Punished && otmp == uball){
140 		Punished = 0;
141 		freeobj(uchain);
142 		free((char *) uchain);
143 		uchain = (struct obj *) 0;
144 		uball->spe = 0;
145 		uball = (struct obj *) 0;	/* superfluous */
146 	}
147 	freeinv(otmp);
148 	pline("%s stole %s.", named ? "She" : Monnam(mtmp), doname(otmp));
149 	mpickobj(mtmp,otmp);
150 	return((multi < 0) ? 0 : 1);
151 }
152 
153 mpickobj(mtmp,otmp)
154 struct monst *mtmp;
155 struct obj *otmp;
156 {
157 	otmp->nobj = mtmp->minvent;
158 	mtmp->minvent = otmp;
159 }
160 
161 stealamulet(mtmp)
162 struct monst *mtmp;
163 {
164 	struct obj *otmp;
165 
166 	for(otmp = invent; otmp; otmp = otmp->nobj) {
167 	    if(otmp->olet == AMULET_SYM) {
168 		/* might be an imitation one */
169 		if(otmp == uwep) setuwep((struct obj *) 0);
170 		freeinv(otmp);
171 		mpickobj(mtmp,otmp);
172 		pline("%s stole %s!", Monnam(mtmp), doname(otmp));
173 		return(1);
174 	    }
175 	}
176 	return(0);
177 }
178 
179 /* release the objects the killed animal has stolen */
180 relobj(mtmp,show)
181 struct monst *mtmp;
182 int show;
183 {
184 	struct obj *otmp, *otmp2;
185 
186 	for(otmp = mtmp->minvent; otmp; otmp = otmp2){
187 		otmp->ox = mtmp->mx;
188 		otmp->oy = mtmp->my;
189 		otmp2 = otmp->nobj;
190 		otmp->nobj = fobj;
191 		fobj = otmp;
192 		stackobj(fobj);
193 		if(show & cansee(mtmp->mx,mtmp->my))
194 			atl(otmp->ox,otmp->oy,otmp->olet);
195 	}
196 	mtmp->minvent = (struct obj *) 0;
197 	if(mtmp->mgold || mtmp->data->mlet == 'L') {
198 		long tmp;
199 
200 		tmp = (mtmp->mgold > 10000) ? 10000 : mtmp->mgold;
201 		mkgold((long)(tmp + d(dlevel,30)), mtmp->mx, mtmp->my);
202 		if(show & cansee(mtmp->mx,mtmp->my))
203 			atl(mtmp->mx,mtmp->my,'$');
204 	}
205 }
206