xref: /dragonfly/games/hack/hack.steal.c (revision 5de36205)
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.3 2005/05/22 03:37:05 y0netan1 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 int (*afternmv)();
117 				/*
118 				multi = 0;
119 				nomovemsg = 0;
120 				afternmv = 0;
121 				*/
122 				stealoid = otmp->o_id;
123 				stealmid = mtmp->m_id;
124 				afternmv = stealarm;
125 				return(0);
126 			}
127 			break;
128 		}
129 		default:
130 			impossible("Tried to steal a strange worn thing.");
131 		}
132 	}
133 	else if(otmp == uwep)
134 		setuwep((struct obj *) 0);
135 	if(otmp->olet == CHAIN_SYM) {
136 		impossible("How come you are carrying that chain?");
137 	}
138 	if(Punished && otmp == uball){
139 		Punished = 0;
140 		freeobj(uchain);
141 		free((char *) uchain);
142 		uchain = (struct obj *) 0;
143 		uball->spe = 0;
144 		uball = (struct obj *) 0;	/* superfluous */
145 	}
146 	freeinv(otmp);
147 	pline("%s stole %s.", named ? "She" : Monnam(mtmp), doname(otmp));
148 	mpickobj(mtmp,otmp);
149 	return((multi < 0) ? 0 : 1);
150 }
151 
152 mpickobj(mtmp,otmp)
153 struct monst *mtmp;
154 struct obj *otmp;
155 {
156 	otmp->nobj = mtmp->minvent;
157 	mtmp->minvent = otmp;
158 }
159 
160 stealamulet(mtmp)
161 struct monst *mtmp;
162 {
163 	struct obj *otmp;
164 
165 	for(otmp = invent; otmp; otmp = otmp->nobj) {
166 	    if(otmp->olet == AMULET_SYM) {
167 		/* might be an imitation one */
168 		if(otmp == uwep) setuwep((struct obj *) 0);
169 		freeinv(otmp);
170 		mpickobj(mtmp,otmp);
171 		pline("%s stole %s!", Monnam(mtmp), doname(otmp));
172 		return(1);
173 	    }
174 	}
175 	return(0);
176 }
177 
178 /* release the objects the killed animal has stolen */
179 relobj(mtmp,show)
180 struct monst *mtmp;
181 int show;
182 {
183 	struct obj *otmp, *otmp2;
184 
185 	for(otmp = mtmp->minvent; otmp; otmp = otmp2){
186 		otmp->ox = mtmp->mx;
187 		otmp->oy = mtmp->my;
188 		otmp2 = otmp->nobj;
189 		otmp->nobj = fobj;
190 		fobj = otmp;
191 		stackobj(fobj);
192 		if(show & cansee(mtmp->mx,mtmp->my))
193 			atl(otmp->ox,otmp->oy,otmp->olet);
194 	}
195 	mtmp->minvent = (struct obj *) 0;
196 	if(mtmp->mgold || mtmp->data->mlet == 'L') {
197 		long tmp;
198 
199 		tmp = (mtmp->mgold > 10000) ? 10000 : mtmp->mgold;
200 		mkgold((long)(tmp + d(dlevel,30)), mtmp->mx, mtmp->my);
201 		if(show & cansee(mtmp->mx,mtmp->my))
202 			atl(mtmp->mx,mtmp->my,'$');
203 	}
204 }
205