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