Source:NetHack 2.3e/steal.c

Below is the full text to steal.c from the source code of NetHack 2.3e. To link to a particular line, write [[NetHack 2.3e/steal.c#line123 ]], for example.

Warning! This is the source code from an old release. For the latest release, see Source code

1.   /*	SCCS Id: @(#)steal.c	2.3	88/01/21 2.   /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ 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. 			if(flags.female) 105. 			    pline("%s charms you.  You gladly %s your %s.",  106.  				  Monnam(mtmp),  107.  				  curssv ? "hand over"  108.  				         : "let her take",  109.  #ifdef SHIRT  110.  				  (otmp == uarmu) ? "shirt" :  111.  #endif  112.  				  (otmp == uarmg) ? "gloves" :  113.  				  (otmp == uarmh) ? "helmet" : "armor"); 114. 			else 115. 				pline("%s seduces you and %s off your %s.",  116.  				Amonnam(mtmp, Blind ? "gentle" : "beautiful"), 117.  				curssv	? "helps you to take"  118.  					: "you start taking",  119.  #ifdef SHIRT  120.  				(otmp == uarmu) ? "shirt" :  121.  #endif  122.  				(otmp == uarmg) ? "gloves" :  123.  				(otmp == uarmh) ? "helmet" : "armor"); 124. 			named++; 125. 			(void) armoroff(otmp); 126. 			otmp->cursed = curssv; 127. 			if(multi < 0){ 128. 				extern char *nomovemsg; 129. 				extern int (*afternmv); 130. 				/*  131.  				multi = 0; 132. 				nomovemsg = 0; 133. 				afternmv = 0; 134. 				*/  135.  				stealoid = otmp->o_id; 136. 				stealmid = mtmp->m_id; 137. 				afternmv = stealarm; 138. 				return(0); 139. 			}  140.  			break; 141. 		}  142.  		default: 143. 			impossible("Tried to steal a strange worn thing."); 144. 		}  145.  	}  146.  	else if(otmp == uwep) setuwep((struct obj *) 0); 147.  148.  	if(Punished && otmp == uball){ 149. 		Punished = 0; 150. 		freeobj(uchain); 151. 		free((char *) uchain); 152. 		uchain = (struct obj *) 0; 153. 		uball->spe = 0; 154. 		uball = (struct obj *) 0;	/* superfluous */ 155. 	}  156.  	freeinv(otmp); 157. 	pline("%s stole %s.", named ? "She" : Monnam(mtmp), doname(otmp)); 158. 	mpickobj(mtmp,otmp); 159. 	return((multi < 0) ? 0 : 1); 160. }  161.   162.  mpickobj(mtmp,otmp) 163. register struct monst *mtmp; 164. register struct obj *otmp; 165. {  166.  	otmp->nobj = mtmp->minvent; 167. 	mtmp->minvent = otmp; 168. }  169.   170.  stealamulet(mtmp) 171. register struct monst *mtmp; 172. {  173.  	register struct obj *otmp; 174.  175.  	for(otmp = invent; otmp; otmp = otmp->nobj) { 176. 	    if(otmp->olet == AMULET_SYM) { 177. 		/* might be an imitation one */ 178. 		if(otmp == uwep) setuwep((struct obj *) 0); 179. 		freeinv(otmp); 180. 		mpickobj(mtmp,otmp); 181. 		pline("%s stole %s!", Monnam(mtmp), doname(otmp)); 182. 		return(1); 183. 	    }  184.  	}  185.  	return(0); 186. }  187.   188.  /* release the objects the killed animal has stolen */ 189. relobj(mtmp,show) 190. register struct monst *mtmp; 191. register show; 192. {  193.  	register struct obj *otmp, *otmp2; 194.  195.  	for(otmp = mtmp->minvent; otmp; otmp = otmp2){ 196. 		otmp->ox = mtmp->mx; 197. 		otmp->oy = mtmp->my; 198. 		otmp2 = otmp->nobj; 199. 		otmp->nobj = fobj; 200. 		fobj = otmp; 201. 		stackobj(fobj); 202. 		if(show & cansee(mtmp->mx,mtmp->my)) 203. 			atl(otmp->ox,otmp->oy,Hallucination?rndobjsym : otmp->olet); 204. 	}  205.  	mtmp->minvent = (struct obj *) 0; 206. 	if(mtmp->mgold || mtmp->data->mlet == 'L') { 207. 		register long tmp; 208.  209.  		tmp = (mtmp->mgold > 10000) ? 10000 : mtmp->mgold; 210. 		mkgold((long)(tmp + d(dlevel,30)), mtmp->mx, mtmp->my); 211. 		if(show & cansee(mtmp->mx,mtmp->my)) 212. 			atl(mtmp->mx,mtmp->my, Hallucination ? rndobjsym : GOLD_SYM); 213. 	}  214.  }