Source:NetHack 3.0.0/steal.c

From NetHackWiki
Revision as of 05:33, 4 March 2008 by Kernigh bot (talk | contribs) (NetHack 3.0.0/steal.c moved to Source:NetHack 3.0.0/steal.c: Robot: moved page)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

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

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

The NetHack General Public License applies to screenshots, source code and other content from NetHack.

This content was modified from the original NetHack source code distribution (by splitting up NetHack content between wiki pages, and possibly further editing). See the page history for a list of who changed it, and on what dates.

1.    /*	SCCS Id: @(#)steal.c	3.0	88/07/06
2.    /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
3.    /* NetHack may be freely redistributed.  See license for details. */
4.    
5.    #include "hack.h"
6.    
7.    static char *
8.    equipname(otmp)
9.    
10.   	register struct obj *otmp;
11.   {
12.   
13.   	return (
14.   #ifdef SHIRT
15.   		(otmp == uarmu) ? "shirt" :
16.   #endif
17.   		(otmp == uarmf) ? "boots" :
18.   		(otmp == uarms) ? "shield" :
19.   		(otmp == uarmg) ? "gloves" :
20.   		(otmp == uarmc) ? "cloak" :
21.   		(otmp == uarmh) ? "helmet" : "armor");
22.   }
23.   
24.   long		/* actually returns something that fits in an int */
25.   somegold(){
26.   #ifdef LINT	/* long conv. ok */
27.   	return(0L);
28.   #else
29.   	return (long)( (u.ugold < 100) ? u.ugold :
30.   		(u.ugold > 10000) ? rnd(10000) : rnd((int) u.ugold) );
31.   #endif
32.   }
33.   
34.   void
35.   stealgold(mtmp)
36.   register struct monst *mtmp;
37.   {
38.   	register struct gold *gold = g_at(u.ux, u.uy);
39.   	register long tmp;
40.   	if(gold && ( !u.ugold || gold->amount > u.ugold || !rn2(5))) {
41.   		mtmp->mgold += gold->amount;
42.   		freegold(gold);
43.   		if(Invisible) newsym(u.ux, u.uy);
44.   		pline("%s quickly snatches some gold from between your %s!",
45.   			Monnam(mtmp), makeplural(body_part(FOOT)));
46.   		if(!u.ugold || !rn2(5)) {
47.   			rloc(mtmp);
48.   			mtmp->mflee = 1;
49.   		}
50.   	} else if(u.ugold) {
51.   		u.ugold -= (tmp = somegold());
52.   		Your("purse feels lighter.");
53.   		mtmp->mgold += tmp;
54.   		rloc(mtmp);
55.   		mtmp->mflee = 1;
56.   		flags.botl = 1;
57.   	}
58.   }
59.   
60.   /* steal armor after he finishes taking it off */
61.   unsigned int stealoid;		/* object to be stolen */
62.   unsigned int stealmid;		/* monster doing the stealing */
63.   
64.   static int
65.   stealarm(){
66.   	register struct monst *mtmp;
67.   	register struct obj *otmp;
68.   
69.   	for(otmp = invent; otmp; otmp = otmp->nobj)
70.   	  if(otmp->o_id == stealoid) {
71.   	    for(mtmp = fmon; mtmp; mtmp = mtmp->nmon)
72.   	      if(mtmp->m_id == stealmid) {
73.   		  freeinv(otmp);
74.   		  pline("%s steals %s!", Monnam(mtmp), doname(otmp));
75.   		  mpickobj(mtmp,otmp);
76.   		  mtmp->mflee = 1;
77.   		  rloc(mtmp);
78.   		break;
79.   	      }
80.   	    break;
81.   	  }
82.   	return stealoid = 0;
83.   }
84.   
85.   /* Returns 1 when something was stolen (or at least, when N should flee now)
86.    * Avoid stealing the object stealoid
87.    */
88.   int
89.   steal(mtmp)
90.   struct monst *mtmp;
91.   {
92.   	register struct obj *otmp;
93.   	register int tmp;
94.   	register int named = 0;
95.   
96.   	/* the following is true if successful on first of two attacks. */
97.   	if(dist(mtmp->mx, mtmp->my) > 3) return(0);
98.   
99.   	if(!invent){
100.  	    /* Not even a thousand men in armor can strip a naked man. */
101.  	    if(Blind)
102.  	      pline("Somebody tries to rob you, but finds nothing to steal.");
103.  	    else
104.  	      pline("%s tries to rob you, but she finds nothing to steal!",
105.  		Monnam(mtmp));
106.  	    return(1);	/* let her flee */
107.  	}
108.  
109.  	if(Adornment & LEFT_RING) {
110.  	    otmp = uleft;
111.  	    goto gotobj;
112.  	} else if(Adornment & RIGHT_RING) {
113.  	    otmp = uright;
114.  	    goto gotobj;
115.  	}
116.  
117.  	tmp = 0;
118.  	for(otmp = invent; otmp; otmp = otmp->nobj) if(otmp != uarmc)
119.  	    tmp += ((otmp->owornmask & (W_ARMOR | W_RING | W_AMUL | W_TOOL)) ? 5 : 1);
120.  	tmp = rn2(tmp);
121.  	for(otmp = invent; otmp; otmp = otmp->nobj) if(otmp != uarmc)
122.    	    if((tmp -= ((otmp->owornmask & (W_ARMOR | W_RING | W_AMUL | W_TOOL)) ? 5 : 1))
123.  			< 0) break;
124.  	if(!otmp) {
125.  		impossible("Steal fails!");
126.  		return(0);
127.  	}
128.  	/* can't steal armor while wearing cloak - so steal the cloak. */
129.  	if(otmp == uarm && uarmc) otmp = uarmc;
130.  #ifdef SHIRT
131.  	else if(otmp == uarmu && uarmc) otmp = uarmc;
132.  	else if(otmp == uarmu && uarm) otmp = uarm;
133.  #endif
134.  gotobj:
135.  	if(otmp->o_id == stealoid) return(0);
136.  
137.  #ifdef WALKIES
138.  	if(otmp->otyp == LEASH && otmp->leashmon) o_unleash(otmp);
139.  #endif
140.  
141.  	if((otmp->owornmask & (W_ARMOR | W_RING | W_AMUL | W_TOOL))){
142.  		switch(otmp->olet) {
143.  		case TOOL_SYM:
144.  			Blindf_off(otmp);
145.  			break;
146.  		case AMULET_SYM:
147.  			Amulet_off();
148.  			break;
149.  		case RING_SYM:
150.  			Ring_gone(otmp);
151.  			break;
152.  		case ARMOR_SYM:
153.  			if(multi < 0 || otmp == uarms){
154.  			  setworn((struct obj *) 0, otmp->owornmask & W_ARMOR);
155.  			  break;
156.  			}
157.  		{ int curssv = otmp->cursed;
158.  			otmp->cursed = 0;
159.  			stop_occupation();
160.  			if(flags.female)
161.  			    pline("%s charms you.  You gladly %s your %s.",
162.  				  Monnam(mtmp),
163.  				  curssv ? "let her take" : "hand over",
164.  				  equipname(otmp));
165.  			else
166.  			    pline("%s seduces you and %s off your %s.",
167.  				  Amonnam(mtmp, Blind ? "gentle" : "beautiful"),
168.  				  curssv ? "helps you to take" : "you start taking",
169.  				  equipname(otmp));
170.  			named++;
171.  			/* the following is to set multi for later on */
172.  			(void) nomul(-objects[otmp->otyp].oc_delay);
173.  
174.  			if (otmp == uarm)  (void) Armor_off();
175.  			else if (otmp == uarmc) (void) Cloak_off();
176.  			else if (otmp == uarmf) (void) Boots_off();
177.  			else if (otmp == uarmg) (void) Gloves_off();
178.  			else if (otmp == uarmh) (void) Helmet_off();
179.  			else if (otmp == uarms) (void) Shield_off();
180.  			else setworn((struct obj *)0, otmp->owornmask & W_ARMOR);
181.  			otmp->cursed = curssv;
182.  			if(multi < 0){
183.  				/*
184.  				multi = 0;
185.  				nomovemsg = 0;
186.  				afternmv = 0;
187.  				*/
188.  				stealoid = otmp->o_id;
189.  				stealmid = mtmp->m_id;
190.  				afternmv = stealarm;
191.  				return(0);
192.  			}
193.  			break;
194.  		}
195.  		default:
196.  			impossible("Tried to steal a strange worn thing.");
197.  		}
198.  	}
199.  	else if(otmp == uwep) uwepgone();
200.  
201.  	if(otmp == uball) unpunish();
202.  
203.  	freeinv(otmp);
204.  	pline("%s stole %s.", named ? "She" : Monnam(mtmp), doname(otmp));
205.  	mpickobj(mtmp,otmp);
206.  	return((multi < 0) ? 0 : 1);
207.  }
208.  
209.  void
210.  mpickobj(mtmp,otmp)
211.  register struct monst *mtmp;
212.  register struct obj *otmp;
213.  {
214.  	otmp->nobj = mtmp->minvent;
215.  	mtmp->minvent = otmp;
216.  }
217.  
218.  void
219.  stealamulet(mtmp)
220.  register struct monst *mtmp;
221.  {
222.  	register struct obj *otmp;
223.  
224.  	for(otmp = invent; otmp; otmp = otmp->nobj) {
225.  	    if(otmp->otyp == AMULET_OF_YENDOR) {
226.  		/* might be an imitation one */
227.  		setnotworn(otmp);
228.  		freeinv(otmp);
229.  		mpickobj(mtmp,otmp);
230.  		pline("%s stole %s!", Monnam(mtmp), doname(otmp));
231.  		rloc(mtmp);
232.  	    }
233.  	}
234.  }
235.  
236.  /* release the objects the killed animal has stolen */
237.  void
238.  relobj(mtmp,show)
239.  register struct monst *mtmp;
240.  register int show;
241.  {
242.  	register struct obj *otmp, *otmp2;
243.  
244.  	for(otmp = mtmp->minvent; otmp; otmp = otmp2){
245.  		otmp->ox = mtmp->mx;
246.  		otmp->oy = mtmp->my;
247.  		otmp2 = otmp->nobj;
248.  		otmp->nobj = fobj;
249.  		if (flooreffects(otmp,mtmp->mx,mtmp->my)) continue;
250.  		fobj = otmp;
251.  		levl[otmp->ox][otmp->oy].omask = 1;
252.  		stackobj(fobj);
253.  		if(show & cansee(mtmp->mx,mtmp->my))
254.  			atl(otmp->ox,otmp->oy,Hallucination?rndobjsym() : otmp->olet);
255.  	}
256.  	mtmp->minvent = (struct obj *) 0;
257.  	if(mtmp->mgold || mtmp->data->mlet == S_LEPRECHAUN) {
258.  		register long tmp;
259.  
260.  		tmp = (mtmp->mgold > 10000) ? 10000 : mtmp->mgold;
261.  		mkgold((long)(tmp + d(dlevel,30)), mtmp->mx, mtmp->my);
262.  		if(show & cansee(mtmp->mx,mtmp->my))
263.  			atl(mtmp->mx,mtmp->my, Hallucination ? rndobjsym() : GOLD_SYM);
264.  	}
265.  }