-WARNS6 cleanup (7422 warnings)
[dragonfly.git] / games / hack / hack.steal.c
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.4 2006/08/21 19:45:32 pavalos Exp $ */
5
6 #include "hack.h"
7
8 static void     stealarm(void);
9
10 long            /* actually returns something that fits in an int */
11 somegold(void)
12 {
13         return( (u.ugold < 100) ? u.ugold :
14                 (u.ugold > 10000) ? rnd(10000) : rnd((int) u.ugold) );
15 }
16
17 void
18 stealgold(struct monst *mtmp)
19 {
20 struct gold *gold = g_at(u.ux, u.uy);
21 long tmp;
22         if(gold && ( !u.ugold || gold->amount > u.ugold || !rn2(5))) {
23                 mtmp->mgold += gold->amount;
24                 freegold(gold);
25                 if(Invisible) newsym(u.ux, u.uy);
26                 pline("%s quickly snatches some gold from between your feet!",
27                         Monnam(mtmp));
28                 if(!u.ugold || !rn2(5)) {
29                         rloc(mtmp);
30                         mtmp->mflee = 1;
31                 }
32         } else if(u.ugold) {
33                 u.ugold -= (tmp = somegold());
34                 pline("Your purse feels lighter.");
35                 mtmp->mgold += tmp;
36                 rloc(mtmp);
37                 mtmp->mflee = 1;
38                 flags.botl = 1;
39         }
40 }
41
42 /* steal armor after he finishes taking it off */
43 unsigned stealoid;              /* object to be stolen */
44 unsigned stealmid;              /* monster doing the stealing */
45
46 static void
47 stealarm(void)
48 {
49         struct monst *mtmp;
50         struct obj *otmp;
51
52         for(otmp = invent; otmp; otmp = otmp->nobj)
53           if(otmp->o_id == stealoid) {
54             for(mtmp = fmon; mtmp; mtmp = mtmp->nmon)
55               if(mtmp->m_id == stealmid) {
56                 if(dist(mtmp->mx,mtmp->my) < 3) {
57                   freeinv(otmp);
58                   pline("%s steals %s!", Monnam(mtmp), doname(otmp));
59                   mpickobj(mtmp,otmp);
60                   mtmp->mflee = 1;
61                   rloc(mtmp);
62                 }
63                 break;
64               }
65             break;
66           }
67         stealoid = 0;
68 }
69
70 /* returns 1 when something was stolen */
71 /* (or at least, when N should flee now) */
72 /* avoid stealing the object stealoid */
73 bool
74 steal(struct monst *mtmp)
75 {
76         struct obj *otmp;
77         int tmp;
78         int named = 0;
79
80         if(!invent){
81             if(Blind)
82               pline("Somebody tries to rob you, but finds nothing to steal.");
83             else
84               pline("%s tries to rob you, but she finds nothing to steal!",
85                 Monnam(mtmp));
86             return(1);  /* let her flee */
87         }
88         tmp = 0;
89         for(otmp = invent; otmp; otmp = otmp->nobj) if(otmp != uarm2)
90                 tmp += ((otmp->owornmask & (W_ARMOR | W_RING)) ? 5 : 1);
91         tmp = rn2(tmp);
92         for(otmp = invent; otmp; otmp = otmp->nobj) if(otmp != uarm2)
93                 if((tmp -= ((otmp->owornmask & (W_ARMOR | W_RING)) ? 5 : 1))
94                         < 0) break;
95         if(!otmp) {
96                 impossible("Steal fails!");
97                 return(0);
98         }
99         if(otmp->o_id == stealoid)
100                 return(0);
101         if((otmp->owornmask & (W_ARMOR | W_RING))){
102                 switch(otmp->olet) {
103                 case RING_SYM:
104                         ringoff(otmp);
105                         break;
106                 case ARMOR_SYM:
107                         if(multi < 0 || otmp == uarms){
108                           setworn((struct obj *) 0, otmp->owornmask & W_ARMOR);
109                           break;
110                         }
111                 { int curssv = otmp->cursed;
112                         otmp->cursed = 0;
113                         stop_occupation();
114                         pline("%s seduces you and %s off your %s.",
115                                 Amonnam(mtmp, Blind ? "gentle" : "beautiful"),
116                                 otmp->cursed ? "helps you to take"
117                                             : "you start taking",
118                                 (otmp == uarmg) ? "gloves" :
119                                 (otmp == uarmh) ? "helmet" : "armor");
120                         named++;
121                         armoroff(otmp);
122                         otmp->cursed = curssv;
123                         if(multi < 0){
124                                 stealoid = otmp->o_id;
125                                 stealmid = mtmp->m_id;
126                                 afternmv = stealarm;
127                                 return(0);
128                         }
129                         break;
130                 }
131                 default:
132                         impossible("Tried to steal a strange worn thing.");
133                 }
134         }
135         else if(otmp == uwep)
136                 setuwep((struct obj *) 0);
137         if(otmp->olet == CHAIN_SYM) {
138                 impossible("How come you are carrying that chain?");
139         }
140         if(Punished && otmp == uball){
141                 Punished = 0;
142                 freeobj(uchain);
143                 free((char *) uchain);
144                 uchain = (struct obj *) 0;
145                 uball->spe = 0;
146                 uball = (struct obj *) 0;       /* superfluous */
147         }
148         freeinv(otmp);
149         pline("%s stole %s.", named ? "She" : Monnam(mtmp), doname(otmp));
150         mpickobj(mtmp,otmp);
151         return((multi < 0) ? 0 : 1);
152 }
153
154 void
155 mpickobj(struct monst *mtmp, struct obj *otmp)
156 {
157         otmp->nobj = mtmp->minvent;
158         mtmp->minvent = otmp;
159 }
160
161 bool
162 stealamulet(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 void
181 relobj(struct monst *mtmp, 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 }