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