From Wikihack
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.
[edit] 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.
5. #include "hack.h"
6. #include "artifact.h"
7.
[edit] 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.
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.
[edit] 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.
[edit] 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*/