Source:SLASH'EM 0.0.7E7F2/fountain.c

From NetHackWiki
Jump to navigation Jump to search

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.

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: @(#)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*/