abstract
| - 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
|