Wikihack
Advertisement

Below is the full text to src/sit.c from NetHack 3.4.3. To link to a particular line, write [[sit.c#line123]], for example.

Top of file[]

1.    /*	SCCS Id: @(#)sit.c	3.4	2002/09/21	*/
2.    /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
3.    /* NetHack may be freely redistributed.  See license for details. */
4.    
The NetHack General Public License applies to screenshots, source code and other content from NetHack.
5.    #include "hack.h"
6.    #include "artifact.h"
7.    

take_gold[]

8.    void
9.    take_gold()
10.   {
11.   #ifndef GOLDOBJ
12.   	if (u.ugold <= 0)  {
13.   		You_feel("a strange sensation.");
14.   	} else {
15.   		You("notice you have no gold!");
16.   		u.ugold = 0;
17.   		flags.botl = 1;
18.   	}
19.   #else
20.           struct obj *otmp, *nobj;
21.   	int lost_money = 0;
22.   	for (otmp = invent; otmp; otmp = nobj) {
23.   		nobj = otmp->nobj;
24.   		if (otmp->oclass == COIN_CLASS) {
25.   			lost_money = 1;
26.   			delobj(otmp);
27.   		}
28.   	}
29.   	if (!lost_money)  {
30.   		You_feel("a strange sensation.");
31.   	} else {
32.   		You("notice you have no money!");
33.   		flags.botl = 1;
34.   	}
35.   #endif
36.   }
37.   

dosit[]

38.   int
39.   dosit()
40.   {
41.   	static const char sit_message[] = "sit on the %s.";
42.   	register struct trap *trap;
43.   	register int typ = levl[u.ux][u.uy].typ;
44.   
45.   
46.   #ifdef STEED
47.   	if (u.usteed) {
48.   	    You("are already sitting on %s.", mon_nam(u.usteed));
49.   	    return (0);
50.   	}
51.   #endif
52.   
53.   	if(!can_reach_floor())	{
54.   	    if (Levitation)
55.   		You("tumble in place.");
56.   	    else
57.   		You("are sitting on air.");
58.   	    return 0;
59.   	} else if (is_pool(u.ux, u.uy) && !Underwater) {  /* water walking */
60.   	    goto in_water;
61.   	}
62.   
63.   	if(OBJ_AT(u.ux, u.uy)) {
64.   	    register struct obj *obj;
65.   
66.   	    obj = level.objects[u.ux][u.uy];
67.   	    You("sit on %s.", the(xname(obj)));
68.   	    if (!(Is_box(obj) || objects[obj->otyp].oc_material == CLOTH))
69.   		pline("It's not very comfortable...");
70.   
71.   	} else if ((trap = t_at(u.ux, u.uy)) != 0 ||
72.   		   (u.utrap && (u.utraptype >= TT_LAVA))) {
73.   
74.   	    if (u.utrap) {
75.   		exercise(A_WIS, FALSE);	/* you're getting stuck longer */
76.   		if(u.utraptype == TT_BEARTRAP) {
77.   		    You_cant("sit down with your %s in the bear trap.", body_part(FOOT));
78.   		    u.utrap++;
79.   	        } else if(u.utraptype == TT_PIT) {
80.   		    if(trap->ttyp == SPIKED_PIT) {
81.   			You("sit down on a spike.  Ouch!");
82.   			losehp(1, "sitting on an iron spike", KILLED_BY);
83.   			exercise(A_STR, FALSE);
84.   		    } else
85.   			You("sit down in the pit.");
86.   		    u.utrap += rn2(5);
87.   		} else if(u.utraptype == TT_WEB) {
88.   		    You("sit in the spider web and get entangled further!");
89.   		    u.utrap += rn1(10, 5);
90.   		} else if(u.utraptype == TT_LAVA) {
91.   		    /* Must have fire resistance or they'd be dead already */
92.   		    You("sit in the lava!");
93.   		    u.utrap += rnd(4);
94.   		    losehp(d(2,10), "sitting in lava", KILLED_BY);
95.   		} else if(u.utraptype == TT_INFLOOR) {
96.   		    You_cant("maneuver to sit!");
97.   		    u.utrap++;
98.   		}
99.   	    } else {
100.  	        You("sit down.");
101.  		dotrap(trap, 0);
102.  	    }
103.  	} else if(Underwater || Is_waterlevel(&u.uz)) {
104.  	    if (Is_waterlevel(&u.uz))
105.  		There("are no cushions floating nearby.");
106.  	    else
107.  		You("sit down on the muddy bottom.");
108.  	} else if(is_pool(u.ux, u.uy)) {
109.   in_water:
110.  	    You("sit in the water.");
111.  	    if (!rn2(10) && uarm)
112.  		(void) rust_dmg(uarm, "armor", 1, TRUE, &youmonst);
113.  	    if (!rn2(10) && uarmf && uarmf->otyp != WATER_WALKING_BOOTS)
114.  		(void) rust_dmg(uarm, "armor", 1, TRUE, &youmonst);
115.  #ifdef SINKS
116.  	} else if(IS_SINK(typ)) {
117.  
118.  	    You(sit_message, defsyms[S_sink].explanation);
119.  	    Your("%s gets wet.", humanoid(youmonst.data) ? "rump" : "underside");
120.  #endif
121.  	} else if(IS_ALTAR(typ)) {
122.  
123.  	    You(sit_message, defsyms[S_altar].explanation);
124.  	    altar_wrath(u.ux, u.uy);
125.  
126.  	} else if(IS_GRAVE(typ)) {
127.  
128.  	    You(sit_message, defsyms[S_grave].explanation);
129.  
130.  	} else if(typ == STAIRS) {
131.  
132.  	    You(sit_message, "stairs");
133.  
134.  	} else if(typ == LADDER) {
135.  
136.  	    You(sit_message, "ladder");
137.  
138.  	} else if (is_lava(u.ux, u.uy)) {
139.  
140.  	    /* must be WWalking */
141.  	    You(sit_message, "lava");
142.  	    burn_away_slime();
143.  	    if (likes_lava(youmonst.data)) {
144.  		pline_The("lava feels warm.");
145.  		return 1;
146.  	    }
147.  	    pline_The("lava burns you!");
148.  	    losehp(d((Fire_resistance ? 2 : 10), 10),
149.  		   "sitting on lava", KILLED_BY);
150.  
151.  	} else if (is_ice(u.ux, u.uy)) {
152.  
153.  	    You(sit_message, defsyms[S_ice].explanation);
154.  	    if (!Cold_resistance) pline_The("ice feels cold.");
155.  
156.  	} else if (typ == DRAWBRIDGE_DOWN) {
157.  
158.  	    You(sit_message, "drawbridge");
159.  
160.  	} else if(IS_THRONE(typ)) {
161.  
162.  	    You(sit_message, defsyms[S_throne].explanation);
163.  	    if (rnd(6) > 4)  {
164.  		switch (rnd(13))  {
165.  		    case 1:
166.  			(void) adjattrib(rn2(A_MAX), -rn1(4,3), FALSE);
167.  			losehp(rnd(10), "cursed throne", KILLED_BY_AN);
168.  			break;
169.  		    case 2:
170.  			(void) adjattrib(rn2(A_MAX), 1, FALSE);
171.  			break;
172.  		    case 3:
173.  			pline("A%s electric shock shoots through your body!",
174.  			      (Shock_resistance) ? "n" : " massive");
175.  			losehp(Shock_resistance ? rnd(6) : rnd(30),
176.  			       "electric chair", KILLED_BY_AN);
177.  			exercise(A_CON, FALSE);
178.  			break;
179.  		    case 4:
180.  			You_feel("much, much better!");
181.  			if (Upolyd) {
182.  			    if (u.mh >= (u.mhmax - 5))  u.mhmax += 4;
183.  			    u.mh = u.mhmax;
184.  			}
185.  			if(u.uhp >= (u.uhpmax - 5))  u.uhpmax += 4;
186.  			u.uhp = u.uhpmax;
187.  			make_blinded(0L,TRUE);
188.  			make_sick(0L, (char *) 0, FALSE, SICK_ALL);
189.  			heal_legs();
190.  			flags.botl = 1;
191.  			break;
192.  		    case 5:
193.  			take_gold();
194.  			break;
195.  		    case 6:
196.  			if(u.uluck + rn2(5) < 0) {
197.  			    You_feel("your luck is changing.");
198.  			    change_luck(1);
199.  			} else	    makewish();
200.  			break;
201.  		    case 7:
202.  			{
203.  			register int cnt = rnd(10);
204.  
205.  			pline("A voice echoes:");
206.  			verbalize("Thy audience hath been summoned, %s!",
207.  				  flags.female ? "Dame" : "Sire");
208.  			while(cnt--)
209.  			    (void) makemon(courtmon(), u.ux, u.uy, NO_MM_FLAGS);
210.  			break;
211.  			}
212.  		    case 8:
213.  			pline("A voice echoes:");
214.  			verbalize("By thy Imperious order, %s...",
215.  				  flags.female ? "Dame" : "Sire");
216.  			do_genocide(5);	/* REALLY|ONTHRONE, see do_genocide() */
217.  			break;
218.  		    case 9:
219.  			pline("A voice echoes:");
220.  	verbalize("A curse upon thee for sitting upon this most holy throne!");
221.  			if (Luck > 0)  {
222.  			    make_blinded(Blinded + rn1(100,250),TRUE);
223.  			} else	    rndcurse();
224.  			break;
225.  		    case 10:
226.  			if (Luck < 0 || (HSee_invisible & INTRINSIC))  {
227.  				if (level.flags.nommap) {
228.  					pline(
229.  					"A terrible drone fills your head!");
230.  					make_confused(HConfusion + rnd(30),
231.  									FALSE);
232.  				} else {
233.  					pline("An image forms in your mind.");
234.  					do_mapping();
235.  				}
236.  			} else  {
237.  				Your("vision becomes clear.");
238.  				HSee_invisible |= FROMOUTSIDE;
239.  				newsym(u.ux, u.uy);
240.  			}
241.  			break;
242.  		    case 11:
243.  			if (Luck < 0)  {
244.  			    You_feel("threatened.");
245.  			    aggravate();
246.  			} else  {
247.  
248.  			    You_feel("a wrenching sensation.");
249.  			    tele();		/* teleport him */
250.  			}
251.  			break;
252.  		    case 12:
253.  			You("are granted an insight!");
254.  			if (invent) {
255.  			    /* rn2(5) agrees w/seffects() */
256.  			    identify_pack(rn2(5));
257.  			}
258.  			break;
259.  		    case 13:
260.  			Your("mind turns into a pretzel!");
261.  			make_confused(HConfusion + rn1(7,16),FALSE);
262.  			break;
263.  		    default:	impossible("throne effect");
264.  				break;
265.  		}
266.  	    } else {
267.  		if (is_prince(youmonst.data))
268.  		    You_feel("very comfortable here.");
269.  		else
270.  		    You_feel("somehow out of place...");
271.  	    }
272.  
273.  	    if (!rn2(3) && IS_THRONE(levl[u.ux][u.uy].typ)) {
274.  		/* may have teleported */
275.  		levl[u.ux][u.uy].typ = ROOM;
276.  		pline_The("throne vanishes in a puff of logic.");
277.  		newsym(u.ux,u.uy);
278.  	    }
279.  
280.  	} else if (lays_eggs(youmonst.data)) {
281.  		struct obj *uegg;
282.  
283.  		if (!flags.female) {
284.  			pline("Males can't lay eggs!");
285.  			return 0;
286.  		}
287.  
288.  		if (u.uhunger < (int)objects[EGG].oc_nutrition) {
289.  			You("don't have enough energy to lay an egg.");
290.  			return 0;
291.  		}
292.  
293.  		uegg = mksobj(EGG, FALSE, FALSE);
294.  		uegg->spe = 1;
295.  		uegg->quan = 1;
296.  		uegg->owt = weight(uegg);
297.  		uegg->corpsenm = egg_type_from_parent(u.umonnum, FALSE);
298.  		uegg->known = uegg->dknown = 1;
299.  		attach_egg_hatch_timeout(uegg);
300.  		You("lay an egg.");
301.  		dropy(uegg);
302.  		stackobj(uegg);
303.  		morehungry((int)objects[EGG].oc_nutrition);
304.  	} else if (u.uswallow)
305.  		There("are no seats in here!");
306.  	else
307.  		pline("Having fun sitting on the %s?", surface(u.ux,u.uy));
308.  	return(1);
309.  }
310.  

rndcurse[]

311.  void
312.  rndcurse()			/* curse a few inventory items at random! */
313.  {
314.  	int	nobj = 0;
315.  	int	cnt, onum;
316.  	struct	obj	*otmp;
317.  	static const char mal_aura[] = "feel a malignant aura surround %s.";
318.  
319.  	if (uwep && (uwep->oartifact == ART_MAGICBANE) && rn2(20)) {
320.  	    You(mal_aura, "the magic-absorbing blade");
321.  	    return;
322.  	}
323.  
324.  	if(Antimagic) {
325.  	    shieldeff(u.ux, u.uy);
326.  	    You(mal_aura, "you");
327.  	}
328.  
329.  	for (otmp = invent; otmp; otmp = otmp->nobj) {
330.  #ifdef GOLDOBJ
331.  	    /* gold isn't subject to being cursed or blessed */
332.  	    if (otmp->oclass == COIN_CLASS) continue;
333.  #endif
334.  	    nobj++;
335.  	}
336.  	if (nobj) {
337.  	    for (cnt = rnd(6/((!!Antimagic) + (!!Half_spell_damage) + 1));
338.  		 cnt > 0; cnt--)  {
339.  		onum = rnd(nobj);
340.  		for (otmp = invent; otmp; otmp = otmp->nobj) {
341.  #ifdef GOLDOBJ
342.  		    /* as above */
343.  		    if (otmp->oclass == COIN_CLASS) continue;
344.  #endif
345.  		    if (--onum == 0) break;	/* found the target */
346.  		}
347.  		/* the !otmp case should never happen; picking an already
348.  		   cursed item happens--avoid "resists" message in that case */
349.  		if (!otmp || otmp->cursed) continue;	/* next target */
350.  
351.  		if(otmp->oartifact && spec_ability(otmp, SPFX_INTEL) &&
352.  		   rn2(10) < 8) {
353.  		    pline("%s!", Tobjnam(otmp, "resist"));
354.  		    continue;
355.  		}
356.  
357.  		if(otmp->blessed)
358.  			unbless(otmp);
359.  		else
360.  			curse(otmp);
361.  	    }
362.  	    update_inventory();
363.  	}
364.  
365.  #ifdef STEED
366.  	/* treat steed's saddle as extended part of hero's inventory */
367.  	if (u.usteed && !rn2(4) &&
368.  		(otmp = which_armor(u.usteed, W_SADDLE)) != 0 &&
369.  		!otmp->cursed) {	/* skip if already cursed */
370.  	    if (otmp->blessed)
371.  		unbless(otmp);
372.  	    else
373.  		curse(otmp);
374.  	    if (!Blind) {
375.  		pline("%s %s %s.",
376.  		      s_suffix(upstart(y_monnam(u.usteed))),
377.  		      aobjnam(otmp, "glow"),
378.  		      hcolor(otmp->cursed ? NH_BLACK : (const char *)"brown"));
379.  		otmp->bknown = TRUE;
380.  	    }
381.  	}
382.  #endif	/*STEED*/
383.  }
384.  

attrcurse[]

385.  void
386.  attrcurse()			/* remove a random INTRINSIC ability */
387.  {
388.  	switch(rnd(11)) {
389.  	case 1 : if (HFire_resistance & INTRINSIC) {
390.  			HFire_resistance &= ~INTRINSIC;
391.  			You_feel("warmer.");
392.  			break;
393.  		}
394.  	case 2 : if (HTeleportation & INTRINSIC) {
395.  			HTeleportation &= ~INTRINSIC;
396.  			You_feel("less jumpy.");
397.  			break;
398.  		}
399.  	case 3 : if (HPoison_resistance & INTRINSIC) {
400.  			HPoison_resistance &= ~INTRINSIC;
401.  			You_feel("a little sick!");
402.  			break;
403.  		}
404.  	case 4 : if (HTelepat & INTRINSIC) {
405.  			HTelepat &= ~INTRINSIC;
406.  			if (Blind && !Blind_telepat)
407.  			    see_monsters();	/* Can't sense mons anymore! */
408.  			Your("senses fail!");
409.  			break;
410.  		}
411.  	case 5 : if (HCold_resistance & INTRINSIC) {
412.  			HCold_resistance &= ~INTRINSIC;
413.  			You_feel("cooler.");
414.  			break;
415.  		}
416.  	case 6 : if (HInvis & INTRINSIC) {
417.  			HInvis &= ~INTRINSIC;
418.  			You_feel("paranoid.");
419.  			break;
420.  		}
421.  	case 7 : if (HSee_invisible & INTRINSIC) {
422.  			HSee_invisible &= ~INTRINSIC;
423.  			You("%s!", Hallucination ? "tawt you taw a puttie tat"
424.  						: "thought you saw something");
425.  			break;
426.  		}
427.  	case 8 : if (HFast & INTRINSIC) {
428.  			HFast &= ~INTRINSIC;
429.  			You_feel("slower.");
430.  			break;
431.  		}
432.  	case 9 : if (HStealth & INTRINSIC) {
433.  			HStealth &= ~INTRINSIC;
434.  			You_feel("clumsy.");
435.  			break;
436.  		}
437.  	case 10: if (HProtection & INTRINSIC) {
438.  			HProtection &= ~INTRINSIC;
439.  			You_feel("vulnerable.");
440.  			break;
441.  		}
442.  	case 11: if (HAggravate_monster & INTRINSIC) {
443.  			HAggravate_monster &= ~INTRINSIC;
444.  			You_feel("less attractive.");
445.  			break;
446.  		}
447.  	default: break;
448.  	}
449.  }
450.  
451.  /*sit.c*/
Advertisement