OSDN Git Service

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