Source:NetHack 2.3e/fountain.c

Below is the full text to fountain.c from the source code of NetHack 2.3e. To link to a particular line, write [[NetHack 2.3e/fountain.c#line123 ]], for example.

Warning! This is the source code from an old release. For the latest release, see Source code

1.   /*	SCCS Id: @(#)fountain.c	2.3	88/01/21 2.   /* fountain.c  v 1.4.4 */ 3.    4.    /*  5.     * Revision 1.4.4  88/02/11  08:31:00  M. Stephenson 6.    * Implemented "coins" fixes by woodbury@bme.unc.edu 7.    * Fixed minor bugs. 8.    *  9.     * Revision 1.4.3  87/11/25  19:16:00  M. Stephenson 10.   * Implemented levitation bug fixes. 11.   *  12.    * Revision 1.4.3  87/11/25  19:16:00  M. Stephenson 13.   * Implemented levitation bug fixes. 14.   *  15.    * Revision 1.4.2  87/10/19  11:48:00  M. Stephenson 16.   * Implementation of KJS bug fixes. 17.   *  18.    * Revision 1.4.1  87/05/20  11:53:00  M. Stephenson 19.   * Implementation of KAA bug fixes. 20.   *  21.    * Revision 1.4    87/05/04  17:39:00  M. Stephenson 22.   * Integration of independent modifications 23.   *  24.    * Revision 1.3    87/03/02            Eric Backus 25.   * Rearranged, and dipfountain added 26.   *  27.    * Revision 1.2    87/03/01  13:59:59  gil 28.   * patches 29.   *  30.    * Revision 1.1    87/02/11  15:14:10  gil 31.   * Initial revision 32.   *  33.    */  34.    35.   /* Code for drinking from fountains. */ 36.   /* Scott R. Turner, srt@ucla, 10/27/86 */ 37.   38.   #include "hack.h"  39. 40.  extern struct monst *mkmon_at; 41.  extern struct obj *mkobj_at; 42.  extern char genocided[]; 43.   44.   #ifdef FOUNTAINS 45.  #define somex ((int)(rand%(croom->hx-croom->lx+1))+croom->lx) 46.  #define somey ((int)(rand%(croom->hy-croom->ly+1))+croom->ly) 47.   48.   dowatersnakes /* Fountain of snakes! */ { 49.   	register int num = rnd(6); 50.  	if (!index(genocided, 'S')) { 51.   52.   		pline("Good Lord!  An endless stream of snakes pours forth!"); 53.  		while(num-- > 0) (void) mkmon_at('S',u.ux,u.uy); 54.  	} else 55.  		pline("The fountain bubbles furiously for a moment, then calms."); 56.  }  57.    58.   dowaterdemon /* Water demon */ { 59.  register struct monst *mtmp; 60.   61.   	if((mtmp = mkmon_at('&',u.ux,u.uy))) { 62.  	    pline("You have unleashed a water demon!"); 63.   64.   	/* Give those on low levels a (slightly) better chance of survival */ 65.  	    if ( rnd(100) > (80 + dlevel)) { 66.  		pline("Grateful for his release, he grants you a wish!"); 67.  		makewish; 68.  		mondied(mtmp); 69.  	    }  70.   	}  71.   }  72.    73.   dowaternymph /* Water Nymph */ { 74.  	register struct monst *mtmp; 75.  	if((mtmp = mkmon_at('N',u.ux,u.uy))) { 76.   77.   		pline("You have attracted a water nymph!"); 78.  		mtmp->msleep = 0; 79.  	} else 80.  		pline("A large bubble rises to the surface and pops."); 81.  }  82.    83.   #include	"mkroom.h"  84. 85.  dogushforth /* Gushing forth in this room */ { 86.  register int num = rnd(10); 87.  register xchar mx,my; 88.  register int tryct = 0; 89.  register int uroom = inroom(u.ux, u.uy); 90.  register struct mkroom *croom = &rooms[uroom]; 91.  register int madepool = 0; 92.   93.   	if(croom->hx < 0 || has_upstairs(croom) ||  94.   	   has_dnstairs(croom))  { 95.  		pline("Your thirst is quenched."); 96.  		return; 97.  	}  98.   	while(num--) { 99.  	    do { 100. 		if(++tryct > 200)  { 101. 		    if(madepool) 102. 			pline("Water gushes forth from the overflowing fountain!"); 103. 		    else 104. 			pline("Your thirst is quenched."); 105. 		    return; 106. 		}  107.  		mx = somex; 108. 		my = somey; 109. 	    } while(nexttodoor(mx,my) || !((mx+my)%2) ||  110.  		    (mx == u.ux && my == u.uy) ||  111.  		    (IS_POOL(levl[mx][my].typ))); 112. 		        113.  	    /* Put a pool at mx, my */ 114. 		      115.  	    levl[mx][my].typ = POOL; 116. 	    atl(mx,my,POOL_SYM); 117. 	    madepool = 1; 118. 	}  119.   120.  	pline("Water gushes forth from the overflowing fountain!"); 121. }  122.   123.  dofindgem /* Find a gem in the sparkling waters. */ { 124.   125.  	if (!Blind) pline("You spot a gem in the sparkling waters!"); 126. 	mkobj_at('*',u.ux,u.uy); 127. }  128.   129.  dryup{ 130. 	if (!rn2(3) && (levl[u.ux][u.uy].typ == FOUNTAIN)) { 131. 		pline("The fountain dries up!"); 132. 		levl[u.ux][u.uy].typ = ROOM; 133. 		if(Invis) newsym(u.ux, u.uy); 134. 	}  135.  }  136.   137.  drinkfountain { 138.  139.  	/* What happens when you drink from a fountain? */ 140.  	register int fate = rnd(30); 141.  142.  	if(Levitation) 	pline("You are floating high above the fountain."); 143. 	else if (fate < 10) { 144. 		pline("The cool draught refreshes you."); 145. 		lesshungry(rnd(10)); 146. 	} else { 147. 	    switch (fate) { 148.  149.  		case 20: /* Foul water */ 150.  151.  			pline("The water is foul!  You gag and vomit."); 152. 			morehungry(rnd(20)+10); 153. 			if(Sick)  { 154. 				Sick = 0; 155. 				pline("What a relief!"); 156. 			}  157.  			break; 158.  159.  		case 21: /* Poisonous */ 160.  161.  			pline("The water is contaminated!"); 162. 			if (Poison_resistance) { 163. 			   pline("Perhaps it is run off from the nearby orange farm."); 164. 			   losehp(rnd(4),"unrefrigerated orange juice"); 165. 			   break; 166. 			}  167.  			losestr(rn1(4,3)); 168. 			losehp(rnd(10),"contaminated water"); 169. 			break; 170. 	  171.  		case 22: /* Fountain of snakes! */ 172.  			dowatersnakes; 173. 			break; 174.  175.  		case 23: /* Water demon */ 176. 			dowaterdemon; 177. 			break; 178.  179.  		case 24: /* Curse an item... */ { 180.  			register struct obj *obj; 181.  182.  			pline("This water's no good!"); 183. 			morehungry(rnd(20)+10); 184. 			for(obj = invent; obj ; obj = obj->nobj) 185. 				if (!rn2(5))	obj->cursed++; 186. 			break; 187. 			}  188.  			  189.  		case 25: /* See invisible */ 190.  191.  			pline("You see an image of someone stalking you."); 192. 			pline("But it disappears."); 193. 			HSee_invisible |= INTRINSIC; 194. 			break; 195.  196.  		case 26: /* See Monsters */ { 197. 			register struct monst *mtmp; 198.  199.  			  if(!fmon) pline("You feel oddly disturbed."); 200. 			  else { 201. 			    cls; 202. 			    for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) 203. 				if(mtmp->mx > 0) 204. 				    at(mtmp->mx,mtmp->my,mtmp->data->mlet); 205. 			    prme; 206. 			    pline("You sense the presence of monsters."); 207. 			    more; 208. 			    docrt; 209. 			  }  210.  			}  211.  			break; 212.  213.  		case 27: /* Find a gem in the sparkling waters. */ 214.  			dofindgem; 215. 			break; 216.  217.  		case 28: /* Water Nymph */ 218. 			dowaternymph; 219. 			break; 220.  221.  		case 29: /* Scare */ { 222. 			register struct monst *mtmp; 223.  224.  			pline("This water gives you bad breath!"); 225. 			for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) 226. 				mtmp->mflee = 1; 227. 			}  228.  			break; 229.  230.  		case 30: /* Gushing forth in this room */ 231. 			dogushforth; 232. 			break; 233. 		default: 234. 			break; 235. 	    }  236.  	}  237.  	dryup; 238. }  239.   240.  dipfountain(obj) 241. register struct obj *obj; 242. {  243.  	register int fate = rnd(30); 244.  245.  	if(Levitation) 	pline("You are floating high above the fountain."); 246. 	else if(fate<10) 247. 		if(!obj->rustfree &&  248.  			/* Only swords affected here */  249.  			(obj->otyp == LONG_SWORD || 250. 			obj->otyp == KATANA || 251. 			obj->otyp == BROAD_SWORD || 252. 			obj->otyp == SHORT_SWORD || 253. 			obj->otyp == TWO_HANDED_SWORD)) { 254. 			if(obj->spe > -6) { 255. 				pline("Your weapon rusts somewhat."); 256. 				obj->spe--; 257. 			} else pline("Your weapon looks quite rusted."); 258. 		} else pline("Well, it looks wet now."); 259. 	else if(fate<14) 260. 		if(obj->otyp == LONG_SWORD  261.  #ifndef RPH  262.  		   && !strcmp(ONAME(obj), "Excalibur")  263.  #endif  264.  		) { 265. 			/* The lady of the lake acts! - Eric Backus */ 266. 			/* Be *REAL* nice to him */ 267. 	pline("A murky hand from the depths reaches up to bless the sword."); 268. 	pline("As the hand retreats, the fountain disappears!"); 269. #ifndef RPH 270. 			if(obj->spe < 5) obj->spe = 5; 271. #else 272. 			/* otherwise +rnd(10) / +5 "Super"sword */ 273. 			oname(obj, "Excalibur"); 274. #endif 275. #ifdef KAA 276. 			obj->dknown = 1;	/* blessed */ 277. #endif 278. 			obj->cursed = 0; 279. 			obj->rustfree = 1; 280. 			levl[u.ux][u.uy].typ = ROOM; 281. 			if(Invis) newsym(u.ux, u.uy); 282. 			return(0); 283. 		} else pline ("Well, it looks wet now."); 284. 	else { 285. 	    switch (fate) { 286. 		case 16: /* Curse the item */ 287. 			pline("Well, it looks wet now."); 288. 			obj->cursed = 1; 289. 			break; 290. 		case 17: 291. 		case 18: 292. 		case 19: 293. 		case 20: /* Uncurse the item */ 294. 			if(obj->cursed) { 295. 			    pline("The water glows for a moment."); 296. 			    obj->cursed = 0; 297. 			} else { 298. 			    pline("A feeling of loss comes over you."); 299. 			}  300.  			break; 301. 		case 21: /* Water Demon */ 302. 			dowaterdemon; 303. 			break; 304. 		case 22: /* Water Nymph */ 305. 			dowaternymph; 306. 			break; 307. 		case 23: /* An Endless Stream Of Snakes */ 308. 			dowatersnakes; 309. 			break; 310. 		case 24: /* Find a gem */ 311. 			dofindgem; 312. 			break; 313. 		case 25: /* Water gushes forth */ 314. 			dogushforth; 315. 			break; 316. 		case 26: /* Strange feeling */ 317. 			pline("A strange tingling runs up your arm."); 318. 			break; 319. 		case 27: /* Strange feeling */ 320. 			pline("You feel a sudden chill."); 321. 			break; 322. 		case 28: /* Strange feeling */ 323. 		pline("An urge to take a bath overwhelms you."); 324. 			if (u.ugold > 10) { 325. 			     	u.ugold -= somegold/10; 326. 			  pline("You lost some of your gold in the fountain!"); 327. 	 		}  328.  			break; 329. 		case 29: /* You see coins */ 330.  331.  		/* We make fountains have more coins the closer you are to the 332. 		 * surface. After all, there will have been more people going 333. 		 * by. Just like a shopping mall! Chris Woodbury */ 334.  335.  			mkgold((long)(rnd((MAXLEVEL-dlevel)*2)+5),u.ux,u.uy); 336. 		pline("Far below you, you see coins glistening in the water."); 337. 			break; 338. 		default: 339. 			break; 340. 	    }  341.  	}  342.  	dryup; 343. 	return(0); 344. }  345.  #endif