abstract
| - Below is the full text to sit.c from the source code of SLASH'EM 0.0.7E7F2. To link to a particular line, write [[SLASH'EM 0.0.7E7F2/sit.c#line123]], for example. The latest source code for vanilla NetHack is at Source code. 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. 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. else 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. } else if(IS_TOILET(typ)) { 121. You(sit_message, defsyms[S_toilet].explanation); 122. if ((!Sick) && (u.uhs > 0)) You("don't have to go..."); 123. else { 124. if (Role_if(PM_BARBARIAN) || Role_if(PM_CAVEMAN)) You("miss..."); 125. else You("grunt."); 126. if (Sick) make_sick(0L, (char *)0, TRUE, SICK_ALL); 127. if (u.uhs == 0) morehungry(rn2(400)+200); 128. } 129. #endif 130. } else if(IS_ALTAR(typ)) { 131. 132. You(sit_message, defsyms[S_altar].explanation); 133. altar_wrath(u.ux, u.uy); 134. 135. } else if(IS_GRAVE(typ)) { 136. 137. You(sit_message, defsyms[S_grave].explanation); 138. 139. } else if(typ == STAIRS) { 140. 141. You(sit_message, "stairs"); 142. 143. } else if(typ == LADDER) { 144. 145. You(sit_message, "ladder"); 146. 147. } else if (is_lava(u.ux, u.uy)) { 148. 149. /* must be WWalking */ 150. You(sit_message, "lava"); 151. burn_away_slime(); 152. if (likes_lava(youmonst.data)) { 153. pline_The("lava feels warm."); 154. return 1; 155. } 156. pline_The("lava burns you!"); 157. if (Slimed) { 158. pline("The slime is burned away!"); 159. Slimed = 0; 160. } 161. losehp(d((Fire_resistance ? 2 : 10), 10), 162. "sitting on lava", KILLED_BY); 163. 164. } else if (is_ice(u.ux, u.uy)) { 165. 166. You(sit_message, defsyms[S_ice].explanation); 167. if (!Cold_resistance) pline_The("ice feels cold."); 168. 169. } else if (typ == DRAWBRIDGE_DOWN) { 170. 171. You(sit_message, "drawbridge"); 172. 173. } else if(IS_THRONE(typ)) { 174. 175. You(sit_message, defsyms[S_throne].explanation); 176. if (rnd(6) > 4) { 177. switch (rnd(13)) { 178. case 1: 179. (void) adjattrib(rn2(A_MAX), -rn1(4,3), FALSE); 180. losehp(rnd(10), "cursed throne", KILLED_BY_AN); 181. break; 182. case 2: 183. (void) adjattrib(rn2(A_MAX), 1, FALSE); 184. break; 185. case 3: 186. pline("A%s electric shock shoots through your body!", 187. (Shock_resistance) ? "n" : " massive"); 188. losehp(Shock_resistance ? rnd(6) : rnd(30), 189. "electric chair", KILLED_BY_AN); 190. exercise(A_CON, FALSE); 191. break; 192. case 4: 193. You_feel("much, much better!"); 194. if (Upolyd) { 195. if (u.mh >= (u.mhmax - 5)) u.mhmax += 4; 196. u.mh = u.mhmax; 197. } 198. if(u.uhp >= (u.uhpmax - 5)) u.uhpmax += 4; 199. u.uhp = u.uhpmax; 200. make_blinded(0L,TRUE); 201. make_sick(0L, (char *) 0, FALSE, SICK_ALL); 202. heal_legs(); 203. flags.botl = 1; 204. break; 205. case 5: 206. take_gold(); 207. break; 208. case 6: 209. /* ------------===========STEPHEN WHITE'S NEW CODE============------------ */ 210. if(u.uluck < 7) { 211. You_feel("your luck is changing."); 212. change_luck(5); 213. } else makewish(); 214. break; 215. case 7: 216. { 217. register int cnt = rnd(10); 218. 219. pline("A voice echoes:"); 220. verbalize("Thy audience hath been summoned, %s!", 221. flags.female ? "Dame" : "Sire"); 222. while(cnt--) 223. (void) makemon(courtmon(), u.ux, u.uy, NO_MM_FLAGS); 224. break; 225. } 226. case 8: 227. pline("A voice echoes:"); 228. verbalize("By thy Imperious order, %s...", 229. flags.female ? "Dame" : "Sire"); 230. do_genocide(5); /* REALLY|ONTHRONE, see do_genocide() */ 231. break; 232. case 9: 233. pline("A voice echoes:"); 234. verbalize("A curse upon thee for sitting upon this most holy throne!"); 235. if (Luck > 0) { 236. make_blinded(Blinded + rn1(100,250),TRUE); 237. } else rndcurse(); 238. break; 239. case 10: 240. if (Luck < 0 || (HSee_invisible & INTRINSIC)) { 241. if (level.flags.nommap) { 242. pline( 243. "A terrible drone fills your head!"); 244. make_confused(HConfusion + rnd(30), 245. FALSE); 246. } else { 247. pline("An image forms in your mind."); 248. do_mapping(); 249. } 250. } else { 251. Your("vision becomes clear."); 252. HSee_invisible |= FROMOUTSIDE; 253. newsym(u.ux, u.uy); 254. } 255. break; 256. case 11: 257. if (Luck < 0) { 258. You_feel("threatened."); 259. aggravate(); 260. } else { 261. 262. You_feel("a wrenching sensation."); 263. tele(); /* teleport him */ 264. } 265. break; 266. case 12: 267. You("are granted an insight!"); 268. if (invent) { 269. /* rn2(5) agrees w/seffects() */ 270. identify_pack(rn2(5)); 271. } 272. break; 273. case 13: 274. Your("mind turns into a pretzel!"); 275. make_confused(HConfusion + rn1(7,16),FALSE); 276. break; 277. default: impossible("throne effect"); 278. break; 279. } 280. } else { 281. if (is_prince(youmonst.data)) 282. You_feel("very comfortable here."); 283. else 284. You_feel("somehow out of place..."); 285. } 286. 287. if (!rn2(3) && IS_THRONE(levl[u.ux][u.uy].typ)) { 288. /* may have teleported */ 289. levl[u.ux][u.uy].typ = ROOM; 290. pline_The("throne vanishes in a puff of logic."); 291. newsym(u.ux,u.uy); 292. } 293. 294. } else if (lays_eggs(youmonst.data)) { 295. struct obj *uegg; 296. 297. if (!flags.female) { 298. pline("Males can't lay eggs!"); 299. return 0; 300. } 301. 302. if (u.uhunger < (int)objects[EGG].oc_nutrition) { 303. You("don't have enough energy to lay an egg."); 304. return 0; 305. } 306. 307. uegg = mksobj(EGG, FALSE, FALSE); 308. uegg->spe = 1; 309. uegg->quan = 1; 310. uegg->owt = weight(uegg); 311. uegg->corpsenm = egg_type_from_parent(u.umonnum, FALSE); 312. uegg->known = uegg->dknown = 1; 313. attach_egg_hatch_timeout(uegg); 314. You("lay an egg."); 315. dropy(uegg); 316. stackobj(uegg); 317. morehungry((int)objects[EGG].oc_nutrition); 318. } else if (u.uswallow) 319. There("are no seats in here!"); 320. else 321. pline("Having fun sitting on the %s?", surface(u.ux,u.uy)); 322. return(1); 323. } 324. 325. void 326. rndcurse() /* curse a few inventory items at random! */ 327. { 328. int nobj = 0; 329. int cnt, onum; 330. struct obj *otmp; 331. static const char mal_aura[] = "feel a malignant aura surround %s."; 332. 333. if (uwep && (uwep->oartifact == ART_MAGICBANE) && rn2(20)) { 334. You(mal_aura, "the magic-absorbing blade"); 335. return; 336. } 337. 338. if(Antimagic) { 339. shieldeff(u.ux, u.uy); 340. You(mal_aura, "you"); 341. } 342. 343. for (otmp = invent; otmp; otmp = otmp->nobj) { 344. #ifdef GOLDOBJ 345. /* gold isn't subject to being cursed or blessed */ 346. if (otmp->oclass == COIN_CLASS) continue; 347. #endif 348. nobj++; 349. } 350. if (nobj) { 351. for (cnt = rnd(6/((!!Antimagic) + (!!Half_spell_damage) + 1)); 352. cnt > 0; cnt--) { 353. onum = rnd(nobj); 354. for (otmp = invent; otmp; otmp = otmp->nobj) { 355. #ifdef GOLDOBJ 356. /* as above */ 357. if (otmp->oclass == COIN_CLASS) continue; 358. #endif 359. if (--onum == 0) break; /* found the target */ 360. } 361. /* the !otmp case should never happen; picking an already 362. cursed item happens--avoid "resists" message in that case */ 363. if (!otmp || otmp->cursed) continue; /* next target */ 364. 365. if(otmp->oartifact && spec_ability(otmp, SPFX_INTEL) && 366. rn2(10) < 8) { 367. pline("%s!", Tobjnam(otmp, "resist")); 368. continue; 369. } 370. 371. if(otmp->blessed) 372. unbless(otmp); 373. else 374. curse(otmp); 375. } 376. update_inventory(); 377. } 378. 379. #ifdef STEED 380. /* treat steed's saddle as extended part of hero's inventory */ 381. if (u.usteed && !rn2(4) && 382. (otmp = which_armor(u.usteed, W_SADDLE)) != 0 && 383. !otmp->cursed) { /* skip if already cursed */ 384. if (otmp->blessed) 385. unbless(otmp); 386. else 387. curse(otmp); 388. if (!Blind) { 389. pline("%s %s %s.", 390. s_suffix(upstart(y_monnam(u.usteed))), 391. aobjnam(otmp, "glow"), 392. hcolor(otmp->cursed ? NH_BLACK : (const char *)"brown")); 393. otmp->bknown = TRUE; 394. } 395. } 396. #endif /*STEED*/ 397. } 398. 399. void 400. attrcurse() /* remove a random INTRINSIC ability */ 401. { 402. switch(rnd(11)) { 403. case 1 : if (HFire_resistance & INTRINSIC) { 404. HFire_resistance &= ~INTRINSIC; 405. You_feel("warmer."); 406. break; 407. } 408. case 2 : if (HTeleportation & INTRINSIC) { 409. HTeleportation &= ~INTRINSIC; 410. You_feel("less jumpy."); 411. break; 412. } 413. case 3 : if (HPoison_resistance & INTRINSIC) { 414. HPoison_resistance &= ~INTRINSIC; 415. You_feel("a little sick!"); 416. break; 417. } 418. case 4 : if (HTelepat & INTRINSIC) { 419. HTelepat &= ~INTRINSIC; 420. if (Blind && !Blind_telepat) 421. see_monsters(); /* Can't sense mons anymore! */ 422. Your("senses fail!"); 423. break; 424. } 425. case 5 : if (HCold_resistance & INTRINSIC) { 426. HCold_resistance &= ~INTRINSIC; 427. You_feel("cooler."); 428. break; 429. } 430. case 6 : if (HInvis & INTRINSIC) { 431. HInvis &= ~INTRINSIC; 432. You_feel("paranoid."); 433. break; 434. } 435. case 7 : if (HSee_invisible & INTRINSIC) { 436. HSee_invisible &= ~INTRINSIC; 437. You("%s!", Hallucination ? "tawt you taw a puttie tat" 438. : "thought you saw something"); 439. break; 440. } 441. case 8 : if (HFast & INTRINSIC) { 442. HFast &= ~INTRINSIC; 443. You_feel("slower."); 444. break; 445. } 446. case 9 : if (HStealth & INTRINSIC) { 447. HStealth &= ~INTRINSIC; 448. You_feel("clumsy."); 449. break; 450. } 451. case 10: if (HProtection & INTRINSIC) { 452. HProtection &= ~INTRINSIC; 453. You_feel("vulnerable."); 454. break; 455. } 456. case 11: if (HAggravate_monster & INTRINSIC) { 457. HAggravate_monster &= ~INTRINSIC; 458. You_feel("less attractive."); 459. break; 460. } 461. default: break; 462. } 463. } 464. 465. /*sit.c*/
|