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