- 0 Talk
-
Source:SLASH'EM 0.0.7E7F2/fountain.c
Below is the full text to fountain.c from the source code of SLASH'EM 0.0.7E7F2. To link to a particular line, write [[SLASH'EM 0.0.7E7F2/fountain.c#line123]], for example.
The latest source code for vanilla NetHack is at Source code.
| The NetHack General Public License applies to screenshots, source code and other content from NetHack. |
1. /* SCCS Id: @(#)fountain.c 3.4 2003/03/23 */ 2. /* Copyright Scott R. Turner, srt@ucla, 10/27/86 */ 3. /* NetHack may be freely redistributed. See license for details. */ 4. 5. /* Code for drinking from fountains. */ 6. 7. #include "hack.h" 8. 9. STATIC_DCL void NDECL(dowatersnakes); 10. STATIC_DCL void NDECL(dowaterdemon); 11. STATIC_DCL void NDECL(dowaternymph); 12. STATIC_PTR void FDECL(gush, (int,int,genericptr_t)); 13. STATIC_DCL void NDECL(dofindgem); 14. 15. void 16. floating_above(what) 17. const char *what; 18. { 19. You("are floating high above the %s.", what); 20. } 21. 22. STATIC_OVL void 23. dowatersnakes() /* Fountain of snakes! */ 24. { 25. register int num = rn1(5,2); 26. struct monst *mtmp; 27. 28. if (!(mvitals[PM_WATER_MOCCASIN].mvflags & G_GONE)) { 29. if (!Blind) 30. pline("An endless stream of %s pours forth!", 31. Hallucination ? makeplural(rndmonnam()) : "snakes"); 32. else 33. You_hear("%s hissing!", something); 34. while(num-- > 0) 35. if((mtmp = makemon(&mons[PM_WATER_MOCCASIN], 36. u.ux, u.uy, NO_MM_FLAGS)) && t_at(mtmp->mx, mtmp->my)) 37. (void) mintrap(mtmp); 38. } else 39. pline_The("fountain bubbles furiously for a moment, then calms."); 40. } 41. 42. STATIC_OVL 43. void 44. dowaterdemon() /* Water demon */ 45. { 46. register struct monst *mtmp; 47. 48. if(!(mvitals[PM_WATER_DEMON].mvflags & G_GONE)) { 49. if((mtmp = makemon(&mons[PM_WATER_DEMON],u.ux,u.uy, NO_MM_FLAGS))) { 50. if (!Blind) 51. You("unleash %s!", a_monnam(mtmp)); 52. else 53. You_feel("the presence of evil."); 54. /* ------------===========STEPHEN WHITE'S NEW CODE============------------ */ 55. /* Give those on low levels a (slightly) better chance of survival */ 56. /* 35% at level 1, 30% at level 2, 25% at level 3, etc... */ 57. if (rnd(100) > (60 + 5*level_difficulty())) { 58. pline("Grateful for %s release, %s grants you a wish!", 59. mhis(mtmp), mhe(mtmp)); 60. makewish(); 61. mongone(mtmp); 62. } else if (t_at(mtmp->mx, mtmp->my)) 63. (void) mintrap(mtmp); 64. } 65. } else 66. pline_The("fountain bubbles furiously for a moment, then calms."); 67. } 68. 69. STATIC_OVL void 70. dowaternymph() /* Water Nymph */ 71. { 72. register struct monst *mtmp; 73. 74. if(!(mvitals[PM_WATER_NYMPH].mvflags & G_GONE) && 75. (mtmp = makemon(&mons[PM_WATER_NYMPH],u.ux,u.uy, NO_MM_FLAGS))) { 76. if (!Blind) 77. You("attract %s!", a_monnam(mtmp)); 78. else 79. You_hear("a seductive voice."); 80. mtmp->msleeping = 0; 81. if (t_at(mtmp->mx, mtmp->my)) 82. (void) mintrap(mtmp); 83. } else 84. if (!Blind) 85. pline("A large bubble rises to the surface and pops."); 86. else 87. You_hear("a loud pop."); 88. } 89. 90. void 91. dogushforth(drinking) /* Gushing forth along LOS from (u.ux, u.uy) */ 92. int drinking; 93. { 94. int madepool = 0; 95. 96. do_clear_area(u.ux, u.uy, 7, gush, (genericptr_t)&madepool); 97. if (!madepool) { 98. if (drinking) 99. Your("thirst is quenched."); 100. else 101. pline("Water sprays all over you."); 102. } 103. } 104. 105. STATIC_PTR void 106. gush(x, y, poolcnt) 107. int x, y; 108. genericptr_t poolcnt; 109. { 110. register struct monst *mtmp; 111. register struct trap *ttmp; 112. 113. if (((x+y)%2) || (x == u.ux && y == u.uy) || 114. (rn2(1 + distmin(u.ux, u.uy, x, y))) || 115. (levl[x][y].typ != ROOM) || 116. (sobj_at(BOULDER, x, y)) || nexttodoor(x, y)) 117. return; 118. 119. if ((ttmp = t_at(x, y)) != 0 && !delfloortrap(ttmp)) 120. return; 121. 122. if (!((*(int *)poolcnt)++)) 123. pline("Water gushes forth from the overflowing fountain!"); 124. 125. /* Put a pool at x, y */ 126. levl[x][y].typ = POOL; 127. /* No kelp! */ 128. del_engr_at(x, y); 129. water_damage(level.objects[x][y], FALSE, TRUE); 130. 131. if ((mtmp = m_at(x, y)) != 0) 132. (void) minliquid(mtmp); 133. else 134. newsym(x,y); 135. } 136. 137. STATIC_OVL void 138. dofindgem() /* Find a gem in the sparkling waters. */ 139. { 140. if (!Blind) You("spot a gem in the sparkling waters!"); 141. else You_feel("a gem here!"); 142. (void) mksobj_at(rnd_class(DILITHIUM_CRYSTAL, LUCKSTONE-1), 143. u.ux, u.uy, FALSE, FALSE); 144. SET_FOUNTAIN_LOOTED(u.ux,u.uy); 145. newsym(u.ux, u.uy); 146. exercise(A_WIS, TRUE); /* a discovery! */ 147. } 148. 149. void 150. dryup(x, y, isyou) 151. xchar x, y; 152. boolean isyou; 153. { 154. if (IS_FOUNTAIN(levl[x][y].typ) && 155. (!rn2(3) || FOUNTAIN_IS_WARNED(x,y))) { 156. if(isyou && in_town(x, y) && !FOUNTAIN_IS_WARNED(x,y)) { 157. struct monst *mtmp; 158. SET_FOUNTAIN_WARNED(x,y); 159. /* Warn about future fountain use. */ 160. for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) { 161. if (DEADMONSTER(mtmp)) continue; 162. if ((mtmp->data == &mons[PM_WATCHMAN] || 163. mtmp->data == &mons[PM_WATCH_CAPTAIN]) && 164. couldsee(mtmp->mx, mtmp->my) && 165. mtmp->mpeaceful) { 166. pline("%s yells:", Amonnam(mtmp)); 167. verbalize("Hey, stop using that fountain!"); 168. break; 169. } 170. } 171. /* You can see or hear this effect */ 172. if(!mtmp) pline_The("flow reduces to a trickle."); 173. return; 174. } 175. #ifdef WIZARD 176. if (isyou && wizard) { 177. if (yn("Dry up fountain?") == 'n') 178. return; 179. } 180. #endif 181. /* replace the fountain with ordinary floor */ 182. levl[x][y].typ = ROOM; 183. levl[x][y].looted = 0; 184. levl[x][y].blessedftn = 0; 185. if (cansee(x,y)) pline_The("fountain dries up!"); 186. /* The location is seen if the hero/monster is invisible */ 187. /* or felt if the hero is blind. */ 188. newsym(x, y); 189. level.flags.nfountains--; 190. if(isyou && in_town(x, y)) 191. (void) angry_guards(FALSE); 192. } 193. } 194. 195. void 196. drinkfountain() 197. { 198. /* What happens when you drink from a fountain? */ 199. register boolean mgkftn = (levl[u.ux][u.uy].blessedftn == 1); 200. register int fate = rnd(30); 201. 202. if (Levitation) { 203. floating_above("fountain"); 204. return; 205. } 206. 207. if (mgkftn && u.uluck >= 0 && fate >= 10) { 208. int i, ii, littleluck = (u.uluck < 4); 209. 210. pline("Wow! This makes you feel great!"); 211. /* blessed restore ability */ 212. for (ii = 0; ii < A_MAX; ii++) 213. if (ABASE(ii) < AMAX(ii)) { 214. ABASE(ii) = AMAX(ii); 215. flags.botl = 1; 216. } 217. /* gain ability, blessed if "natural" luck is high */ 218. i = rn2(A_MAX); /* start at a random attribute */ 219. for (ii = 0; ii < A_MAX; ii++) { 220. if (adjattrib(i, 1, littleluck ? -1 : 0) && littleluck) 221. break; 222. if (++i >= A_MAX) i = 0; 223. } 224. display_nhwindow(WIN_MESSAGE, FALSE); 225. pline("A wisp of vapor escapes the fountain..."); 226. exercise(A_WIS, TRUE); 227. levl[u.ux][u.uy].blessedftn = 0; 228. return; 229. } 230. 231. if (fate < 10) { 232. pline_The("cool draught refreshes you."); 233. u.uhunger += rnd(10); /* don't choke on water */ 234. newuhs(FALSE); 235. if(mgkftn) return; 236. } else { 237. switch (fate) { 238. 239. case 19: /* Self-knowledge */ 240. 241. You_feel("self-knowledgeable..."); 242. display_nhwindow(WIN_MESSAGE, FALSE); 243. enlightenment(0); 244. exercise(A_WIS, TRUE); 245. pline_The("feeling subsides."); 246. break; 247. 248. case 20: /* Foul water */ 249. 250. pline_The("water is foul! You gag and vomit."); 251. morehungry(rn1(20, 11)); 252. vomit(); 253. break; 254. 255. case 21: /* Poisonous */ 256. 257. pline_The("water is contaminated!"); 258. if (Poison_resistance) { 259. pline( 260. "Perhaps it is runoff from the nearby %s farm.", 261. fruitname(FALSE)); 262. losehp(rnd(4),"unrefrigerated sip of juice", 263. KILLED_BY_AN); 264. break; 265. } 266. losestr(rn1(4,3)); 267. losehp(rnd(10),"contaminated water", KILLED_BY); 268. exercise(A_CON, FALSE); 269. break; 270. 271. case 22: /* Fountain of snakes! */ 272. 273. dowatersnakes(); 274. break; 275. 276. case 23: /* Water demon */ 277. dowaterdemon(); 278. break; 279. 280. case 24: /* Curse an item */ { 281. register struct obj *obj; 282. 283. pline("This water's no good!"); 284. morehungry(rn1(20, 11)); 285. exercise(A_CON, FALSE); 286. for(obj = invent; obj ; obj = obj->nobj) 287. if (!rn2(5)) curse(obj); 288. break; 289. } 290. 291. case 25: /* See invisible */ 292. 293. if (Blind) { 294. if (Invisible) { 295. You("feel transparent."); 296. } else { 297. You("feel very self-conscious."); 298. pline("Then it passes."); 299. } 300. } else { 301. You("see an image of someone stalking you."); 302. pline("But it disappears."); 303. } 304. HSee_invisible |= FROMOUTSIDE; 305. newsym(u.ux,u.uy); 306. exercise(A_WIS, TRUE); 307. break; 308. 309. case 26: /* See Monsters */ 310. 311. (void) monster_detect((struct obj *)0, 0); 312. exercise(A_WIS, TRUE); 313. break; 314. 315. case 27: /* Find a gem in the sparkling waters. */ 316. 317. if (!FOUNTAIN_IS_LOOTED(u.ux,u.uy)) { 318. dofindgem(); 319. break; 320. } 321. 322. case 28: /* Water Nymph */ 323. 324. dowaternymph(); 325. break; 326. 327. case 29: /* Scare */ { 328. register struct monst *mtmp; 329. 330. pline("This water gives you bad breath!"); 331. for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) 332. if(!DEADMONSTER(mtmp)) 333. monflee(mtmp, 0, FALSE, FALSE); 334. } 335. break; 336. 337. case 30: /* Gushing forth in this room */ 338. 339. dogushforth(TRUE); 340. break; 341. 342. default: 343. 344. pline("This tepid water is tasteless."); 345. break; 346. } 347. } 348. dryup(u.ux, u.uy, TRUE); 349. } 350. 351. void 352. dipfountain(obj) 353. register struct obj *obj; 354. { 355. if (Levitation) { 356. floating_above("fountain"); 357. return; 358. } 359. 360. /* Don't grant Excalibur when there's more than one object. */ 361. /* (quantity could be > 1 if merged daggers got polymorphed) */ 362. 363. if (obj->otyp == LONG_SWORD && obj->quan == 1L 364. && u.ulevel > 4 && !rn2(8) && !obj->oartifact 365. && !exist_artifact(LONG_SWORD, artiname(ART_EXCALIBUR))) { 366. 367. if (u.ualign.type != A_LAWFUL) { 368. /* Ha! Trying to cheat her. */ 369. pline("A freezing mist rises from the water and envelopes the sword."); 370. pline_The("fountain disappears!"); 371. curse(obj); 372. if (obj->spe > -6 && !rn2(3)) obj->spe--; 373. obj->oerodeproof = FALSE; 374. exercise(A_WIS, FALSE); 375. } else { 376. /* The lady of the lake acts! - Eric Backus */ 377. /* Be *REAL* nice */ 378. pline("From the murky depths, a hand reaches up to bless the sword."); 379. pline("As the hand retreats, the fountain disappears!"); 380. obj = oname(obj, artiname(ART_EXCALIBUR)); 381. discover_artifact(ART_EXCALIBUR); 382. bless(obj); 383. obj->oeroded = obj->oeroded2 = 0; 384. obj->oerodeproof = TRUE; 385. exercise(A_WIS, TRUE); 386. } 387. update_inventory(); 388. levl[u.ux][u.uy].typ = ROOM; 389. levl[u.ux][u.uy].looted = 0; 390. newsym(u.ux, u.uy); 391. level.flags.nfountains--; 392. if(in_town(u.ux, u.uy)) 393. (void) angry_guards(FALSE); 394. return; 395. } else if (get_wet(obj, FALSE) && !rn2(2)) 396. return; 397. 398. /* Acid and water don't mix */ 399. if (obj->otyp == POT_ACID) { 400. useup(obj); 401. return; 402. } 403. 404. switch (rnd(30)) { 405. case 10: /* Curse the item */ 406. curse(obj); 407. break; 408. case 11: 409. case 12: 410. case 13: 411. case 14: /* Uncurse the item */ 412. if(obj->cursed) { 413. if (!Blind) 414. pline_The("water glows for a moment."); 415. uncurse(obj); 416. } else { 417. pline("A feeling of loss comes over you."); 418. } 419. break; 420. case 15: 421. case 16: /* Water Demon */ 422. dowaterdemon(); 423. break; 424. case 17: 425. case 18: /* Water Nymph */ 426. dowaternymph(); 427. break; 428. case 19: 429. case 20: /* an Endless Stream of Snakes */ 430. dowatersnakes(); 431. break; 432. case 21: 433. case 22: 434. case 23: /* Find a gem */ 435. if (!FOUNTAIN_IS_LOOTED(u.ux,u.uy)) { 436. dofindgem(); 437. break; 438. } 439. case 24: 440. case 25: /* Water gushes forth */ 441. dogushforth(FALSE); 442. break; 443. case 26: /* Strange feeling */ 444. pline("A strange tingling runs up your %s.", 445. body_part(ARM)); 446. break; 447. case 27: /* Strange feeling */ 448. You_feel("a sudden chill."); 449. break; 450. case 28: /* Strange feeling */ 451. pline("An urge to take a bath overwhelms you."); 452. #ifndef GOLDOBJ 453. if (u.ugold > 10) { 454. u.ugold -= somegold() / 10; 455. You("lost some of your gold in the fountain!"); 456. CLEAR_FOUNTAIN_LOOTED(u.ux,u.uy); 457. exercise(A_WIS, FALSE); 458. } 459. #else 460. { 461. long money = money_cnt(invent); 462. struct obj *otmp; 463. if (money > 10) { 464. /* Amount to loose. Might get rounded up as fountains don't pay change... */ 465. money = somegold(money) / 10; 466. for (otmp = invent; otmp && money > 0; otmp = otmp->nobj) if (otmp->oclass == COIN_CLASS) { 467. int denomination = objects[otmp->otyp].oc_cost; 468. long coin_loss = (money + denomination - 1) / denomination; 469. coin_loss = min(coin_loss, otmp->quan); 470. otmp->quan -= coin_loss; 471. money -= coin_loss * denomination; 472. if (!otmp->quan) delobj(otmp); 473. } 474. You("lost some of your money in the fountain!"); 475. CLEAR_FOUNTAIN_LOOTED(u.ux,u.uy); 476. exercise(A_WIS, FALSE); 477. } 478. } 479. #endif 480. break; 481. case 29: /* You see coins */ 482. 483. /* We make fountains have more coins the closer you are to the 484. * surface. After all, there will have been more people going 485. * by. Just like a shopping mall! Chris Woodbury */ 486. 487. if (FOUNTAIN_IS_LOOTED(u.ux,u.uy)) break; 488. SET_FOUNTAIN_LOOTED(u.ux,u.uy); 489. (void) mkgold((long) 490. (rnd((dunlevs_in_dungeon(&u.uz)-dunlev(&u.uz)+1)*2)+5), 491. u.ux, u.uy); 492. if (!Blind) 493. pline("Far below you, you see coins glistening in the water."); 494. exercise(A_WIS, TRUE); 495. newsym(u.ux,u.uy); 496. break; 497. } 498. update_inventory(); 499. dryup(u.ux, u.uy, TRUE); 500. } 501. 502. #ifdef SINKS 503. void 504. diptoilet(obj) 505. register struct obj *obj; 506. { 507. if (Levitation) { 508. floating_above("toilet"); 509. return; 510. } 511. (void) get_wet(obj, FALSE); 512. /* KMH -- acid and water don't mix */ 513. if (obj->otyp == POT_ACID) { 514. useup(obj); 515. return; 516. } 517. if(is_poisonable(obj)) { 518. if (flags.verbose) You("cover it in filth."); 519. obj->opoisoned = TRUE; 520. } 521. if (obj->oclass == FOOD_CLASS) { 522. if (flags.verbose) pline("My! It certainly looks tastier now..."); 523. obj->orotten = TRUE; 524. } 525. if (flags.verbose) pline("Yuck!"); 526. } 527. 528. 529. void 530. breaksink(x,y) 531. int x, y; 532. { 533. if(cansee(x,y) || (x == u.ux && y == u.uy)) 534. pline_The("pipes break! Water spurts out!"); 535. level.flags.nsinks--; 536. levl[x][y].doormask = 0; 537. levl[x][y].typ = FOUNTAIN; 538. level.flags.nfountains++; 539. newsym(x,y); 540. } 541. 542. void 543. breaktoilet(x,y) 544. int x, y; 545. { 546. register int num = rn1(5,2); 547. struct monst *mtmp; 548. pline("The toilet suddenly shatters!"); 549. level.flags.nsinks--; 550. levl[x][y].typ = FOUNTAIN; 551. level.flags.nfountains++; 552. newsym(x,y); 553. if (!rn2(3)) { 554. if (!(mvitals[PM_BABY_CROCODILE].mvflags & G_GONE)) { 555. if (!Blind) { 556. if (!Hallucination) pline("Oh no! Crocodiles come out from the pipes!"); 557. else pline("Oh no! Tons of poopies!"); 558. } else 559. You("hear something scuttling around you!"); 560. while(num-- > 0) 561. if((mtmp = makemon(&mons[PM_BABY_CROCODILE],u.ux,u.uy, NO_MM_FLAGS)) && 562. t_at(mtmp->mx, mtmp->my)) 563. (void) mintrap(mtmp); 564. } else 565. pline("The sewers seem strangely quiet."); 566. } 567. } 568. 569. void 570. drinksink() 571. { 572. struct obj *otmp; 573. struct monst *mtmp; 574. 575. if (Levitation) { 576. floating_above("sink"); 577. return; 578. } 579. switch(rn2(20)) { 580. case 0: You("take a sip of very cold water."); 581. break; 582. case 1: You("take a sip of very warm water."); 583. break; 584. case 2: You("take a sip of scalding hot water."); 585. if (Fire_resistance) 586. pline("It seems quite tasty."); 587. else losehp(rnd(6), "sipping boiling water", KILLED_BY); 588. break; 589. case 3: if (mvitals[PM_SEWER_RAT].mvflags & G_GONE) 590. pline_The("sink seems quite dirty."); 591. else { 592. mtmp = makemon(&mons[PM_SEWER_RAT], 593. u.ux, u.uy, NO_MM_FLAGS); 594. if (mtmp) pline("Eek! There's %s in the sink!", 595. (Blind || !canspotmon(mtmp)) ? 596. "something squirmy" : 597. a_monnam(mtmp)); 598. } 599. break; 600. case 4: do { 601. otmp = mkobj(POTION_CLASS,FALSE); 602. if (otmp->otyp == POT_WATER) { 603. obfree(otmp, (struct obj *)0); 604. otmp = (struct obj *) 0; 605. } 606. } while(!otmp); 607. otmp->cursed = otmp->blessed = 0; 608. pline("Some %s liquid flows from the faucet.", 609. Blind ? "odd" : 610. hcolor(OBJ_DESCR(objects[otmp->otyp]))); 611. otmp->dknown = !(Blind || Hallucination); 612. otmp->fromsink = 1; /* kludge for docall() */ 613. /* dopotion() deallocs dummy potions */ 614. (void) dopotion(otmp); 615. break; 616. case 5: if (!(levl[u.ux][u.uy].looted & S_LRING)) { 617. You("find a ring in the sink!"); 618. (void) mkobj_at(RING_CLASS, u.ux, u.uy, TRUE); 619. levl[u.ux][u.uy].looted |= S_LRING; 620. exercise(A_WIS, TRUE); 621. newsym(u.ux,u.uy); 622. } else pline("Some dirty water backs up in the drain."); 623. break; 624. case 6: breaksink(u.ux,u.uy); 625. break; 626. case 7: pline_The("water moves as though of its own will!"); 627. if ((mvitals[PM_WATER_ELEMENTAL].mvflags & G_GONE) 628. || !makemon(&mons[PM_WATER_ELEMENTAL], 629. u.ux, u.uy, NO_MM_FLAGS)) 630. pline("But it quiets down."); 631. break; 632. case 8: pline("Yuk, this water tastes awful."); 633. more_experienced(1,0); 634. newexplevel(); 635. break; 636. case 9: pline("Gaggg... this tastes like sewage! You vomit."); 637. morehungry(rn1(30-ACURR(A_CON), 11)); 638. vomit(); 639. break; 640. case 10: 641. /* KMH, balance patch -- new intrinsic */ 642. pline("This water contains toxic wastes!"); 643. if (!Unchanging) { 644. if (!Unchanging) { 645. You("undergo a freakish metamorphosis!"); 646. polyself(FALSE); 647. } 648. } 649. break; 650. /* more odd messages --JJB */ 651. case 11: You_hear("clanking from the pipes..."); 652. break; 653. case 12: You_hear("snatches of song from among the sewers..."); 654. break; 655. case 19: if (Hallucination) { 656. pline("From the murky drain, a hand reaches up... --oops--"); 657. break; 658. } 659. default: You("take a sip of %s water.", 660. rn2(3) ? (rn2(2) ? "cold" : "warm") : "hot"); 661. } 662. } 663. 664. void 665. drinktoilet() 666. { 667. if (Levitation) { 668. floating_above("toilet"); 669. return; 670. } 671. if ((youmonst.data->mlet == S_DOG) && (rn2(5))){ 672. pline("The toilet water is quite refreshing!"); 673. u.uhunger += 10; 674. return; 675. } 676. switch(rn2(9)) { 677. /* 678. static NEARDATA struct obj *otmp; 679. */ 680. case 0: if (mvitals[PM_SEWER_RAT].mvflags & G_GONE) 681. pline("The toilet seems quite dirty."); 682. else { 683. static NEARDATA struct monst *mtmp; 684. 685. mtmp = makemon(&mons[PM_SEWER_RAT], u.ux, u.uy, 686. NO_MM_FLAGS); 687. pline("Eek! There's %s in the toilet!", 688. Blind ? "something squirmy" : 689. a_monnam(mtmp)); 690. } 691. break; 692. case 1: breaktoilet(u.ux,u.uy); 693. break; 694. case 2: pline("Something begins to crawl out of the toilet!"); 695. if (mvitals[PM_BROWN_PUDDING].mvflags & G_GONE 696. || !makemon(&mons[PM_BROWN_PUDDING], u.ux, u.uy, 697. NO_MM_FLAGS)) 698. pline("But it slithers back out of sight."); 699. break; 700. case 3: 701. case 4: if (mvitals[PM_BABY_CROCODILE].mvflags & G_GONE) 702. pline("The toilet smells fishy."); 703. else { 704. static NEARDATA struct monst *mtmp; 705. 706. mtmp = makemon(&mons[PM_BABY_CROCODILE], u.ux, 707. u.uy, NO_MM_FLAGS); 708. pline("Egad! There's %s in the toilet!", 709. Blind ? "something squirmy" : 710. a_monnam(mtmp)); 711. } 712. break; 713. default: pline("Gaggg... this tastes like sewage! You vomit."); 714. morehungry(rn1(30-ACURR(A_CON), 11)); 715. vomit(); 716. } 717. } 718. #endif /* SINKS */ 719. 720. 721. void 722. whetstone_fountain_effects(obj) 723. register struct obj *obj; 724. { 725. if (Levitation) { 726. floating_above("fountain"); 727. return; 728. } 729. 730. switch (rnd(30)) { 731. case 10: /* Curse the item */ 732. curse(obj); 733. break; 734. case 11: 735. case 12: 736. case 13: 737. case 14: /* Uncurse the item */ 738. if(obj->cursed) { 739. if (!Blind) 740. pline_The("water glows for a moment."); 741. uncurse(obj); 742. } else { 743. pline("A feeling of loss comes over you."); 744. } 745. break; 746. case 15: 747. case 16: /* Water Demon */ 748. dowaterdemon(); 749. break; 750. case 17: 751. case 18: /* Water Nymph */ 752. dowaternymph(); 753. break; 754. case 19: 755. case 20: /* an Endless Stream of Snakes */ 756. dowatersnakes(); 757. break; 758. case 21: 759. case 22: 760. case 23: /* Find a gem */ 761. if (!FOUNTAIN_IS_LOOTED(u.ux,u.uy)) { 762. dofindgem(); 763. break; 764. } 765. case 24: 766. case 25: /* Water gushes forth */ 767. dogushforth(FALSE); 768. break; 769. case 26: /* Strange feeling */ 770. pline("A strange tingling runs up your %s.", 771. body_part(ARM)); 772. break; 773. case 27: /* Strange feeling */ 774. You_feel("a sudden chill."); 775. break; 776. case 28: /* Strange feeling */ 777. pline("An urge to take a bath overwhelms you."); 778. #ifndef GOLDOBJ 779. if (u.ugold > 10) { 780. u.ugold -= somegold() / 10; 781. You("lost some of your gold in the fountain!"); 782. CLEAR_FOUNTAIN_LOOTED(u.ux,u.uy); 783. exercise(A_WIS, FALSE); 784. } 785. #else 786. { 787. long money = money_cnt(invent); 788. struct obj *otmp; 789. if (money > 10) { 790. /* Amount to loose. Might get rounded up as fountains don't pay change... */ 791. money = somegold(money) / 10; 792. for (otmp = invent; otmp && money > 0; otmp = otmp->nobj) if (otmp->oclass == COIN_CLASS) { 793. int denomination = objects[otmp->otyp].oc_cost; 794. long coin_loss = (money + denomination - 1) / denomination; 795. coin_loss = min(coin_loss, otmp->quan); 796. otmp->quan -= coin_loss; 797. money -= coin_loss * denomination; 798. if (!otmp->quan) delobj(otmp); 799. } 800. You("lost some of your money in the fountain!"); 801. levl[u.ux][u.uy].looted &= ~F_LOOTED; 802. exercise(A_WIS, FALSE); 803. } 804. } 805. #endif 806. break; 807. case 29: /* You see coins */ 808. 809. /* We make fountains have more coins the closer you are to the 810. * surface. After all, there will have been more people going 811. * by. Just like a shopping mall! Chris Woodbury */ 812. 813. if (levl[u.ux][u.uy].looted) break; 814. levl[u.ux][u.uy].looted |= F_LOOTED; 815. (void) mkgold((long) 816. (rnd((dunlevs_in_dungeon(&u.uz)-dunlev(&u.uz)+1)*2)+5), 817. u.ux, u.uy); 818. if (!Blind) 819. pline("Far below you, you see coins glistening in the water."); 820. exercise(A_WIS, TRUE); 821. newsym(u.ux,u.uy); 822. break; 823. } 824. update_inventory(); 825. dryup(u.ux, u.uy, TRUE); 826. } 827. 828. #ifdef SINKS 829. 830. void 831. whetstone_toilet_effects(obj) 832. register struct obj *obj; 833. { 834. if (Levitation) { 835. floating_above("toilet"); 836. return; 837. } 838. if(is_poisonable(obj)) { 839. if (flags.verbose) You("cover it in filth."); 840. obj->opoisoned = TRUE; 841. } 842. if (flags.verbose) pline("Yuck!"); 843. } 844. 845. void 846. whetstone_sink_effects(obj) 847. register struct obj *obj; 848. { 849. struct monst *mtmp; 850. 851. if (Levitation) { 852. floating_above("sink"); 853. return; 854. } 855. switch(rn2(20)) { 856. case 0: if (mvitals[PM_SEWER_RAT].mvflags & G_GONE) 857. pline_The("sink seems quite dirty."); 858. else { 859. mtmp = makemon(&mons[PM_SEWER_RAT], 860. u.ux, u.uy, NO_MM_FLAGS); 861. pline("Eek! There's %s in the sink!", 862. Blind ? "something squirmy" : 863. a_monnam(mtmp)); 864. } 865. break; 866. case 1: if (!(levl[u.ux][u.uy].looted & S_LRING)) { 867. You("find a ring in the sink!"); 868. (void) mkobj_at(RING_CLASS, u.ux, u.uy, TRUE); 869. levl[u.ux][u.uy].looted |= S_LRING; 870. exercise(A_WIS, TRUE); 871. newsym(u.ux,u.uy); 872. } else pline("Some dirty water backs up in the drain."); 873. break; 874. case 2: breaksink(u.ux,u.uy); 875. break; 876. case 3: pline_The("water moves as though of its own will!"); 877. if ((mvitals[PM_WATER_ELEMENTAL].mvflags & G_GONE) 878. || !makemon(&mons[PM_WATER_ELEMENTAL], 879. u.ux, u.uy, NO_MM_FLAGS)) 880. pline("But it quiets down."); 881. break; 882. case 4: 883. pline("This water contains toxic wastes!"); 884. obj = poly_obj(obj, STRANGE_OBJECT); 885. u.uconduct.polypiles++; 886. break; 887. case 5: You_hear("clanking from the pipes..."); 888. break; 889. case 6: You_hear("snatches of song from among the sewers..."); 890. break; 891. case 19: if (Hallucination) { 892. pline("From the murky drain, a hand reaches up... --oops--"); 893. break; 894. } 895. default: 896. break; 897. } 898. } 899. 900. #endif /* SINKS */ 901. 902. /*fountain.c*/