OSDN Git Service

update year to 2019
[jnethack/source.git] / src / apply.c
1 /* NetHack 3.6  apply.c $NHDT-Date: 1519598527 2018/02/25 22:42:07 $  $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.243 $ */
2 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
3 /*-Copyright (c) Robert Patrick Rankin, 2012. */
4 /* NetHack may be freely redistributed.  See license for details. */
5
6 /* JNetHack Copyright */
7 /* (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000  */
8 /* For 3.4-, Copyright (c) SHIRAKATA Kentaro, 2002-2019            */
9 /* JNetHack may be freely redistributed.  See license for details. */
10
11 #include "hack.h"
12
13 extern boolean notonhead; /* for long worms */
14
15 STATIC_DCL int FDECL(use_camera, (struct obj *));
16 STATIC_DCL int FDECL(use_towel, (struct obj *));
17 STATIC_DCL boolean FDECL(its_dead, (int, int, int *));
18 STATIC_DCL int FDECL(use_stethoscope, (struct obj *));
19 STATIC_DCL void FDECL(use_whistle, (struct obj *));
20 STATIC_DCL void FDECL(use_magic_whistle, (struct obj *));
21 STATIC_DCL int FDECL(use_leash, (struct obj *));
22 STATIC_DCL int FDECL(use_mirror, (struct obj *));
23 STATIC_DCL void FDECL(use_bell, (struct obj **));
24 STATIC_DCL void FDECL(use_candelabrum, (struct obj *));
25 STATIC_DCL void FDECL(use_candle, (struct obj **));
26 STATIC_DCL void FDECL(use_lamp, (struct obj *));
27 STATIC_DCL void FDECL(light_cocktail, (struct obj **));
28 STATIC_PTR void FDECL(display_jump_positions, (int));
29 STATIC_DCL void FDECL(use_tinning_kit, (struct obj *));
30 STATIC_DCL void FDECL(use_figurine, (struct obj **));
31 STATIC_DCL void FDECL(use_grease, (struct obj *));
32 STATIC_DCL void FDECL(use_trap, (struct obj *));
33 STATIC_DCL void FDECL(use_stone, (struct obj *));
34 STATIC_PTR int NDECL(set_trap); /* occupation callback */
35 STATIC_DCL int FDECL(use_whip, (struct obj *));
36 STATIC_PTR void FDECL(display_polearm_positions, (int));
37 STATIC_DCL int FDECL(use_pole, (struct obj *));
38 STATIC_DCL int FDECL(use_cream_pie, (struct obj *));
39 STATIC_DCL int FDECL(use_grapple, (struct obj *));
40 STATIC_DCL int FDECL(do_break_wand, (struct obj *));
41 STATIC_DCL boolean FDECL(figurine_location_checks, (struct obj *,
42                                                     coord *, BOOLEAN_P));
43 STATIC_DCL void FDECL(add_class, (char *, CHAR_P));
44 STATIC_DCL void FDECL(setapplyclasses, (char *));
45 STATIC_PTR boolean FDECL(check_jump, (genericptr_t, int, int));
46 STATIC_DCL boolean FDECL(is_valid_jump_pos, (int, int, int, BOOLEAN_P));
47 STATIC_DCL boolean FDECL(get_valid_jump_position, (int, int));
48 STATIC_DCL boolean FDECL(get_valid_polearm_position, (int, int));
49 STATIC_DCL boolean FDECL(find_poleable_mon, (coord *, int, int));
50
51 #ifdef AMIGA
52 void FDECL(amii_speaker, (struct obj *, char *, int));
53 #endif
54
55 static const char no_elbow_room[] =
56 /*JP
57     "don't have enough elbow-room to maneuver.";
58 */
59     "\82»\82ê\82ð\82·\82é\82¾\82¯\82Ì\82ä\82Æ\82è\82ª\82È\82¢\81D";
60
61 STATIC_OVL int
62 use_camera(obj)
63 struct obj *obj;
64 {
65     struct monst *mtmp;
66
67     if (Underwater) {
68 /*JP
69         pline("Using your camera underwater would void the warranty.");
70 */
71         pline("\90\85\96Ê\89º\82Å\82Ì\83J\83\81\83\89\82Ì\8eg\97p\82Í\95Û\8fØ\82Ì\91Î\8fÛ\8aO\82Å\82·\81D");
72         return 0;
73     }
74     if (!getdir((char *) 0))
75         return 0;
76
77     if (obj->spe <= 0) {
78         pline1(nothing_happens);
79         return 1;
80     }
81     consume_obj_charge(obj, TRUE);
82
83     if (obj->cursed && !rn2(2)) {
84         (void) zapyourself(obj, TRUE);
85     } else if (u.uswallow) {
86 #if 0 /*JP*/
87         You("take a picture of %s %s.", s_suffix(mon_nam(u.ustuck)),
88             mbodypart(u.ustuck, STOMACH));
89 #else
90         You("%s\82Ì%s\82Ì\8eÊ\90^\82ð\8eB\82Á\82½\81D", mon_nam(u.ustuck),
91             mbodypart(u.ustuck, STOMACH));
92 #endif
93     } else if (u.dz) {
94 /*JP
95         You("take a picture of the %s.",
96 */
97         You("%s\82Ì\8eÊ\90^\82ð\8eB\82Á\82½\81D",
98             (u.dz > 0) ? surface(u.ux, u.uy) : ceiling(u.ux, u.uy));
99     } else if (!u.dx && !u.dy) {
100         (void) zapyourself(obj, TRUE);
101     } else if ((mtmp = bhit(u.dx, u.dy, COLNO, FLASHED_LIGHT,
102                             (int FDECL((*), (MONST_P, OBJ_P))) 0,
103                             (int FDECL((*), (OBJ_P, OBJ_P))) 0, &obj)) != 0) {
104         obj->ox = u.ux, obj->oy = u.uy;
105         (void) flash_hits_mon(mtmp, obj);
106     }
107     return 1;
108 }
109
110 STATIC_OVL int
111 use_towel(obj)
112 struct obj *obj;
113 {
114     boolean drying_feedback = (obj == uwep);
115
116     if (!freehand()) {
117 /*JP
118         You("have no free %s!", body_part(HAND));
119 */
120         You("%s\82Ì\8e©\97R\82ª\8cø\82©\82È\82¢\81I", body_part(HAND));
121         return 0;
122     } else if (obj == ublindf) {
123 /*JP
124         You("cannot use it while you're wearing it!");
125 */
126         You("\82»\82ê\82ð\90g\82É\82Â\82¯\82Ä\82¢\82é\82Ì\82Å\8eg\97p\82Å\82«\82È\82¢\81I");
127         return 0;
128     } else if (obj->cursed) {
129         long old;
130
131         switch (rn2(3)) {
132         case 2:
133             old = Glib;
134             incr_itimeout(&Glib, rn1(10, 3));
135 #if 0 /*JP*/
136             Your("%s %s!", makeplural(body_part(HAND)),
137                  (old ? "are filthier than ever" : "get slimy"));
138 #else
139             Your("%s\82Í%s\81I", makeplural(body_part(HAND)),
140                  (old ? "\82Ü\82·\82Ü\82·\89\98\82È\82­\82È\82Á\82½" : "\82Ê\82é\82Ê\82é\82É\82È\82Á\82½"));
141 #endif
142             if (is_wet_towel(obj))
143                 dry_a_towel(obj, -1, drying_feedback);
144             return 1;
145         case 1:
146             if (!ublindf) {
147                 old = u.ucreamed;
148                 u.ucreamed += rn1(10, 3);
149 #if 0 /*JP*/
150                 pline("Yecch! Your %s %s gunk on it!", body_part(FACE),
151                       (old ? "has more" : "now has"));
152 #else
153                 pline("\83Q\83F\81[\81I\82 \82È\82½\82Ì%s\82Í%s\82×\82Æ\82×\82Æ\82É\82È\82Á\82½\81I", body_part(FACE),
154                       (old ? "\82à\82Á\82Æ" : ""));
155 #endif
156                 make_blinded(Blinded + (long) u.ucreamed - old, TRUE);
157             } else {
158                 const char *what;
159
160 #if 0 /*JP*/
161                 what = (ublindf->otyp == LENSES)
162                            ? "lenses"
163                            : (obj->otyp == ublindf->otyp) ? "other towel"
164                                                           : "blindfold";
165 #else
166                 what = (ublindf->otyp == LENSES)
167                            ? "\83\8c\83\93\83Y"
168                            : (obj->otyp == ublindf->otyp) ? "\83^\83I\83\8b"
169                                                           : "\96Ú\89B\82µ";
170 #endif
171                 if (ublindf->cursed) {
172 #if 0 /*JP*/
173                     You("push your %s %s.", what,
174                         rn2(2) ? "cock-eyed" : "crooked");
175 #else
176                     pline("%s\82ª%s\81D", what,
177                         rn2(2) ? "\82¸\82ê\82½" : "\82ä\82ª\82ñ\82¾");
178 #endif
179                 } else {
180                     struct obj *saved_ublindf = ublindf;
181 /*JP
182                     You("push your %s off.", what);
183 */
184                     pline("%s\82ª\82¸\82è\97\8e\82¿\82½\81D", what);
185                     Blindf_off(ublindf);
186                     dropx(saved_ublindf);
187                 }
188             }
189             if (is_wet_towel(obj))
190                 dry_a_towel(obj, -1, drying_feedback);
191             return 1;
192         case 0:
193             break;
194         }
195     }
196
197     if (Glib) {
198         Glib = 0;
199 /*JP
200         You("wipe off your %s.", makeplural(body_part(HAND)));
201 */
202         You("%s\82ð\90@\82¢\82½\81D", makeplural(body_part(HAND)));
203         if (is_wet_towel(obj))
204             dry_a_towel(obj, -1, drying_feedback);
205         return 1;
206     } else if (u.ucreamed) {
207         Blinded -= u.ucreamed;
208         u.ucreamed = 0;
209         if (!Blinded) {
210 /*JP
211             pline("You've got the glop off.");
212 */
213             You("\82³\82Á\82Ï\82è\82µ\82½\81D");
214             if (!gulp_blnd_check()) {
215                 Blinded = 1;
216                 make_blinded(0L, TRUE);
217             }
218         } else {
219 /*JP
220             Your("%s feels clean now.", body_part(FACE));
221 */
222             pline("%s\82Ì\89\98\82ê\82ð\90@\82«\82Æ\82Á\82½\81D", body_part(FACE));
223         }
224         if (is_wet_towel(obj))
225             dry_a_towel(obj, -1, drying_feedback);
226         return 1;
227     }
228
229 #if 0 /*JP*/
230     Your("%s and %s are already clean.", body_part(FACE),
231          makeplural(body_part(HAND)));
232 #else
233     Your("%s\82â%s\82Í\89\98\82ê\82Ä\82¢\82È\82¢\81D", body_part(FACE),
234          makeplural(body_part(HAND)));
235 #endif
236
237     return 0;
238 }
239
240 /* maybe give a stethoscope message based on floor objects */
241 STATIC_OVL boolean
242 its_dead(rx, ry, resp)
243 int rx, ry, *resp;
244 {
245     char buf[BUFSZ];
246 #if 0 /*JP*/
247     boolean more_corpses;
248     struct permonst *mptr;
249 #endif
250     struct obj *corpse = sobj_at(CORPSE, rx, ry),
251                *statue = sobj_at(STATUE, rx, ry);
252
253     if (!can_reach_floor(TRUE)) { /* levitation or unskilled riding */
254         corpse = 0;               /* can't reach corpse on floor */
255         /* you can't reach tiny statues (even though you can fight
256            tiny monsters while levitating--consistency, what's that?) */
257         while (statue && mons[statue->corpsenm].msize == MZ_TINY)
258             statue = nxtobj(statue, STATUE, TRUE);
259     }
260     /* when both corpse and statue are present, pick the uppermost one */
261     if (corpse && statue) {
262         if (nxtobj(statue, CORPSE, TRUE) == corpse)
263             corpse = 0; /* corpse follows statue; ignore it */
264         else
265             statue = 0; /* corpse precedes statue; ignore statue */
266     }
267 #if 0 /*JP*/
268     more_corpses = (corpse && nxtobj(corpse, CORPSE, TRUE));
269 #endif
270
271     /* additional stethoscope messages from jyoung@apanix.apana.org.au */
272     if (!corpse && !statue) {
273         ; /* nothing to do */
274
275     } else if (Hallucination) {
276         if (!corpse) {
277             /* it's a statue */
278 /*JP
279             Strcpy(buf, "You're both stoned");
280 */
281             Strcpy(buf, "\90Î\82¾");
282 #if 0 /*JP*//*\91ã\96¼\8e\8c\8f\88\97\9d\82Í\95s\97v*/
283         } else if (corpse->quan == 1L && !more_corpses) {
284             int gndr = 2; /* neuter: "it" */
285             struct monst *mtmp = get_mtraits(corpse, FALSE);
286
287             /* (most corpses don't retain the monster's sex, so
288                we're usually forced to use generic pronoun here) */
289             if (mtmp) {
290                 mptr = &mons[mtmp->mnum];
291                 /* can't use mhe() here; it calls pronoun_gender() which
292                    expects monster to be on the map (visibility check) */
293                 if ((humanoid(mptr) || (mptr->geno & G_UNIQ)
294                      || type_is_pname(mptr)) && !is_neuter(mptr))
295                     gndr = (int) mtmp->female;
296             } else {
297                 mptr = &mons[corpse->corpsenm];
298                 if (is_female(mptr))
299                     gndr = 1;
300                 else if (is_male(mptr))
301                     gndr = 0;
302             }
303             Sprintf(buf, "%s's dead", genders[gndr].he); /* "he"/"she"/"it" */
304             buf[0] = highc(buf[0]);
305 #endif
306         } else { /* plural */
307 /*JP
308             Strcpy(buf, "They're dead");
309 */
310             Strcpy(buf, "\8e\80\82ñ\82Å\82é\82º");
311         }
312         /* variations on "He's dead, Jim." (Star Trek's Dr McCoy) */
313 /*JP
314         You_hear("a voice say, \"%s, Jim.\"", buf);
315 */
316         You_hear("\81u\82»\82¢\82Â\82Í%s\81C\83W\83\80\81v\82Æ\82¢\82¤\90º\82ª\95·\82±\82¦\82½\81D", buf);
317         *resp = 1;
318         return TRUE;
319
320     } else if (corpse) {
321 #if 0 /*JP*/
322         boolean here = (rx == u.ux && ry == u.uy),
323                 one = (corpse->quan == 1L && !more_corpses), reviver = FALSE;
324 #else
325         boolean here = (rx == u.ux && ry == u.uy), reviver = FALSE;
326 #endif
327         int visglyph, corpseglyph;
328
329         visglyph = glyph_at(rx, ry);
330         corpseglyph = obj_to_glyph(corpse);
331
332         if (Blind && (visglyph != corpseglyph))
333             map_object(corpse, TRUE);
334
335         if (Role_if(PM_HEALER)) {
336             /* ok to reset `corpse' here; we're done with it */
337             do {
338                 if (obj_has_timer(corpse, REVIVE_MON))
339                     reviver = TRUE;
340                 else
341                     corpse = nxtobj(corpse, CORPSE, TRUE);
342             } while (corpse && !reviver);
343         }
344 #if 0 /*JP*/
345         You("determine that %s unfortunate being%s %s%s dead.",
346             one ? (here ? "this" : "that") : (here ? "these" : "those"),
347             one ? "" : "s", one ? "is" : "are", reviver ? " mostly" : "");
348 #else
349         You("%s\95s\8dK\82È\90\82«\95¨\82Í%s\8e\80\82ñ\82Å\82¢\82é\82Æ\8c\8b\98_\82µ\82½\81D",
350             here ? "\82±\82Ì" : "\82»\82Ì",
351             reviver ? "\82Ù\82Ú" : "");
352 #endif
353         return TRUE;
354
355     } else { /* statue */
356         const char *what, *how;
357
358 #if 0 /*JP*/
359         mptr = &mons[statue->corpsenm];
360         if (Blind) { /* ignore statue->dknown; it'll always be set */
361             Sprintf(buf, "%s %s",
362                     (rx == u.ux && ry == u.uy) ? "This" : "That",
363                     humanoid(mptr) ? "person" : "creature");
364             what = buf;
365         } else {
366             what = mptr->mname;
367             if (!type_is_pname(mptr))
368                 what = The(what);
369         }
370 #else /*JP:\93ú\96{\8cê\82Å\82Í\83V\83\93\83v\83\8b\82É*/
371         if (Blind) { /* ignore statue->dknown; it'll always be set */
372             what = (rx == u.ux && ry == u.uy) ? "\82±\82ê" : "\82 \82ê";
373         } else {
374             what = mons[statue->corpsenm].mname;
375         }
376 #endif
377 /*JP
378         how = "fine";
379 */
380         how = "\82æ\82¢";
381         if (Role_if(PM_HEALER)) {
382             struct trap *ttmp = t_at(rx, ry);
383
384             if (ttmp && ttmp->ttyp == STATUE_TRAP)
385 /*JP
386                 how = "extraordinary";
387 */
388                 how = "\95À\8aO\82ê\82½";
389             else if (Has_contents(statue))
390 /*JP
391                 how = "remarkable";
392 */
393                 how = "\92\8d\96Ú\82·\82×\82«";
394         }
395
396 /*JP
397         pline("%s is in %s health for a statue.", what, how);
398 */
399         pline("\92¤\91\9c\82Æ\82µ\82Ä\82Ì%s\82Í%s\8dì\95i\82¾\81D", what, how);
400         return TRUE;
401     }
402     return FALSE; /* no corpse or statue */
403 }
404
405 /*JP
406 static const char hollow_str[] = "a hollow sound.  This must be a secret %s!";
407 */
408 static const char hollow_str[] = "\82¤\82Â\82ë\82È\89¹\82ð\95·\82¢\82½\81D\94é\96§\82Ì%s\82É\88á\82¢\82È\82¢\81I";
409
410 /* Strictly speaking it makes no sense for usage of a stethoscope to
411    not take any time; however, unless it did, the stethoscope would be
412    almost useless.  As a compromise, one use per turn is free, another
413    uses up the turn; this makes curse status have a tangible effect. */
414 STATIC_OVL int
415 use_stethoscope(obj)
416 register struct obj *obj;
417 {
418     struct monst *mtmp;
419     struct rm *lev;
420     int rx, ry, res;
421     boolean interference = (u.uswallow && is_whirly(u.ustuck->data)
422                             && !rn2(Role_if(PM_HEALER) ? 10 : 3));
423
424     if (nohands(youmonst.data)) {
425 #if 0 /*JP*/
426         You("have no hands!"); /* not `body_part(HAND)' */
427 #else
428         pline("\82 \82È\82½\82É\82Í\8eè\82ª\82È\82¢\81I");
429 #endif
430         return 0;
431     } else if (Deaf) {
432 /*JP
433         You_cant("hear anything!");
434 */
435         You("\89½\82à\95·\82±\82¦\82È\82¢\81I");
436         return 0;
437     } else if (!freehand()) {
438 /*JP
439         You("have no free %s.", body_part(HAND));
440 */
441         You("%s\82Ì\8e©\97R\82ª\8cø\82©\82È\82¢\81D", body_part(HAND));
442         return 0;
443     }
444     if (!getdir((char *) 0))
445         return 0;
446
447     res = (moves == context.stethoscope_move)
448           && (youmonst.movement == context.stethoscope_movement);
449     context.stethoscope_move = moves;
450     context.stethoscope_movement = youmonst.movement;
451
452     bhitpos.x = u.ux, bhitpos.y = u.uy; /* tentative, reset below */
453     notonhead = u.uswallow;
454     if (u.usteed && u.dz > 0) {
455         if (interference) {
456 /*JP
457             pline("%s interferes.", Monnam(u.ustuck));
458 */
459             pline("%s\82ª\82\82á\82Ü\82ð\82µ\82½\81D", Monnam(u.ustuck));
460             mstatusline(u.ustuck);
461         } else
462             mstatusline(u.usteed);
463         return res;
464     } else if (u.uswallow && (u.dx || u.dy || u.dz)) {
465         mstatusline(u.ustuck);
466         return res;
467     } else if (u.uswallow && interference) {
468 /*JP
469         pline("%s interferes.", Monnam(u.ustuck));
470 */
471         pline("%s\82ª\82\82á\82Ü\82ð\82µ\82½\81D", Monnam(u.ustuck));
472         mstatusline(u.ustuck);
473         return res;
474     } else if (u.dz) {
475         if (Underwater)
476 /*JP
477             You_hear("faint splashing.");
478 */
479             You_hear("\82©\82·\82©\82É\83o\83V\83\83\83o\83V\83\83\82Æ\82¢\82¤\89¹\82ð\95·\82¢\82½\81D");
480         else if (u.dz < 0 || !can_reach_floor(TRUE))
481             cant_reach_floor(u.ux, u.uy, (u.dz < 0), TRUE);
482         else if (its_dead(u.ux, u.uy, &res))
483             ; /* message already given */
484         else if (Is_stronghold(&u.uz))
485 /*JP
486             You_hear("the crackling of hellfire.");
487 */
488           You_hear("\92n\8d\96\82Ì\89\8a\82ª\83p\83`\83p\83`\94R\82¦\82Ä\82¢\82é\89¹\82ð\95·\82¢\82½\81D");
489         else
490 /*JP
491             pline_The("%s seems healthy enough.", surface(u.ux, u.uy));
492 */
493             pline("%s\82Í\8f[\95ª\8c\92\8dN\82Ì\82æ\82¤\82¾\81D", surface(u.ux,u.uy));
494         return res;
495     } else if (obj->cursed && !rn2(2)) {
496 /*JP
497         You_hear("your heart beat.");
498 */
499         You_hear("\8e©\95ª\82Ì\90S\91\9f\82Ì\8cÛ\93®\82ð\95·\82¢\82½\81D");
500         return res;
501     }
502     if (Stunned || (Confusion && !rn2(5)))
503         confdir();
504     if (!u.dx && !u.dy) {
505         ustatusline();
506         return res;
507     }
508     rx = u.ux + u.dx;
509     ry = u.uy + u.dy;
510     if (!isok(rx, ry)) {
511 /*JP
512         You_hear("a faint typing noise.");
513 */
514         You_hear("\82©\82·\82©\82É\82¾\82ê\82©\82ª\83^\83C\83s\83\93\83O\82µ\82Ä\82¢\82é\89¹\82ð\95·\82¢\82½\81D");
515         return 0;
516     }
517     if ((mtmp = m_at(rx, ry)) != 0) {
518         const char *mnm = x_monnam(mtmp, ARTICLE_A, (const char *) 0,
519                                    SUPPRESS_IT | SUPPRESS_INVISIBLE, FALSE);
520
521         /* bhitpos needed by mstatusline() iff mtmp is a long worm */
522         bhitpos.x = rx, bhitpos.y = ry;
523         notonhead = (mtmp->mx != rx || mtmp->my != ry);
524
525         if (mtmp->mundetected) {
526             if (!canspotmon(mtmp))
527 /*JP
528                 There("is %s hidden there.", mnm);
529 */
530                 pline("\82±\82±\82É%s\82ª\89B\82ê\82Ä\82¢\82é\81D", mnm);
531             mtmp->mundetected = 0;
532             newsym(mtmp->mx, mtmp->my);
533         } else if (mtmp->mappearance) {
534             const char *what = "thing";
535
536             switch (mtmp->m_ap_type) {
537             case M_AP_OBJECT:
538                 what = simple_typename(mtmp->mappearance);
539                 break;
540             case M_AP_MONSTER: /* ignore Hallucination here */
541                 what = mons[mtmp->mappearance].mname;
542                 break;
543             case M_AP_FURNITURE:
544                 what = defsyms[mtmp->mappearance].explanation;
545                 break;
546             }
547             seemimic(mtmp);
548 /*JP
549             pline("That %s is really %s.", what, mnm);
550 */
551             pline("\82±\82Ì%s\82Í\8eÀ\8dÛ\82É\82Í%s\81D", what, mnm);
552         } else if (flags.verbose && !canspotmon(mtmp)) {
553 /*JP
554             There("is %s there.", mnm);
555 */
556             pline("\82±\82±\82É\82Í%s\82ª\82¢\82é\81D", mnm);
557         }
558
559         mstatusline(mtmp);
560         if (!canspotmon(mtmp))
561             map_invisible(rx, ry);
562         return res;
563     }
564     if (unmap_invisible(rx,ry))
565 /*JP
566         pline_The("invisible monster must have moved.");
567 */
568         pline_The("\8c©\82¦\82È\82¢\89ö\95¨\82Í\88Ú\93®\82µ\82Ä\82µ\82Ü\82Á\82½\82æ\82¤\82¾\81D");
569
570     lev = &levl[rx][ry];
571     switch (lev->typ) {
572     case SDOOR:
573 /*JP
574         You_hear(hollow_str, "door");
575 */
576         You_hear(hollow_str, "\94à");
577         cvt_sdoor_to_door(lev); /* ->typ = DOOR */
578         feel_newsym(rx, ry);
579         return res;
580     case SCORR:
581 /*JP
582         You_hear(hollow_str, "passage");
583 */
584         You_hear(hollow_str, "\92Ê\98H");
585         lev->typ = CORR;
586         unblock_point(rx, ry);
587         feel_newsym(rx, ry);
588         return res;
589     }
590
591     if (!its_dead(rx, ry, &res))
592 #if 0 /*JP*/
593         You("hear nothing special."); /* not You_hear()  */
594 #else
595         pline("\93Á\82É\89½\82à\95·\82±\82¦\82È\82¢\81D");
596 #endif
597     return res;
598 }
599
600 /*JP
601 static const char whistle_str[] = "produce a %s whistling sound.";
602 */
603 static const char whistle_str[] = "\93J\82ð\90\81\82¢\82Ä%s\89¹\82ð\82½\82Ä\82½\81D";
604
605 STATIC_OVL void
606 use_whistle(obj)
607 struct obj *obj;
608 {
609     if (!can_blow(&youmonst)) {
610 /*JP
611         You("are incapable of using the whistle.");
612 */
613         You("\93J\82ð\8eg\82¤\94\\97Í\82ª\82È\82¢\81D");
614     } else if (Underwater) {
615 /*JP
616         You("blow bubbles through %s.", yname(obj));
617 */
618         You("%s\82ð\92Ê\82µ\82Ä\96A\82ð\8fo\82µ\82½\81D", xname(obj));
619     } else {
620         if (Deaf)
621 #if 0 /*JP*/
622             You_feel("rushing air tickle your %s.",
623                         body_part(NOSE));
624 #else
625             You_feel("\8bó\8bC\82Ì\97¬\82ê\82ª%s\82ð\82­\82·\82®\82Á\82½\81D",
626                         body_part(NOSE));
627 #endif
628         else
629 /*JP
630         You(whistle_str, obj->cursed ? "shrill" : "high");
631 */
632         You(whistle_str, obj->cursed ? "\95s\8bC\96¡\82È" : "\82©\82ñ\8d\82\82¢");
633         wake_nearby();
634         if (obj->cursed)
635             vault_summon_gd();
636     }
637 }
638
639 STATIC_OVL void
640 use_magic_whistle(obj)
641 struct obj *obj;
642 {
643     register struct monst *mtmp, *nextmon;
644
645     if (!can_blow(&youmonst)) {
646 /*JP
647         You("are incapable of using the whistle.");
648 */
649         You("\93J\82ð\8eg\82¤\94\\97Í\82ª\82È\82¢\81D");
650     } else if (obj->cursed && !rn2(2)) {
651 #if 0 /*JP*/
652         You("produce a %shigh-pitched humming noise.",
653             Underwater ? "very " : "");
654 #else
655         You("%s\8d\82\82¢\92²\8eq\82Ì\82¤\82È\82é\82æ\82¤\82È\89¹\82ð\82½\82Ä\82½\81D",
656             Underwater ? "\82Æ\82Ä\82à" : "");
657 #endif
658         wake_nearby();
659     } else {
660         int pet_cnt = 0, omx, omy;
661
662         /* it's magic!  it works underwater too (at a higher pitch) */
663 #if 0 /*JP*/
664         You(whistle_str,
665             Hallucination ? "normal" : Underwater ? "strange, high-pitched"
666                                                   : "strange");
667 #else
668         You(whistle_str,
669             Hallucination ? "\93J\82Ì\82æ\82¤\82È" : Underwater ? "\95s\8ev\8bc\82È\8d\82\82¢\92²\8eq\82Ì"
670                                                   : "\95s\8ev\8bc\82È");
671 #endif
672         for (mtmp = fmon; mtmp; mtmp = nextmon) {
673             nextmon = mtmp->nmon; /* trap might kill mon */
674             if (DEADMONSTER(mtmp))
675                 continue;
676             /* steed is already at your location, so not affected;
677                this avoids trap issues if you're on a trap location */
678             if (mtmp == u.usteed)
679                 continue;
680             if (mtmp->mtame) {
681                 if (mtmp->mtrapped) {
682                     /* no longer in previous trap (affects mintrap) */
683                     mtmp->mtrapped = 0;
684                     fill_pit(mtmp->mx, mtmp->my);
685                 }
686                 /* mimic must be revealed before we know whether it
687                    actually moves because line-of-sight may change */
688                 if (mtmp->m_ap_type)
689                     seemimic(mtmp);
690                 omx = mtmp->mx, omy = mtmp->my;
691                 mnexto(mtmp);
692                 if (mtmp->mx != omx || mtmp->my != omy) {
693                     mtmp->mundetected = 0; /* reveal non-mimic hider */
694                     if (canspotmon(mtmp))
695                         ++pet_cnt;
696                     if (mintrap(mtmp) == 2)
697                         change_luck(-1);
698                 }
699             }
700         }
701         if (pet_cnt > 0)
702             makeknown(obj->otyp);
703     }
704 }
705
706 boolean
707 um_dist(x, y, n)
708 xchar x, y, n;
709 {
710     return (boolean) (abs(u.ux - x) > n || abs(u.uy - y) > n);
711 }
712
713 int
714 number_leashed()
715 {
716     int i = 0;
717     struct obj *obj;
718
719     for (obj = invent; obj; obj = obj->nobj)
720         if (obj->otyp == LEASH && obj->leashmon != 0)
721             i++;
722     return i;
723 }
724
725 /* otmp is about to be destroyed or stolen */
726 void
727 o_unleash(otmp)
728 register struct obj *otmp;
729 {
730     register struct monst *mtmp;
731
732     for (mtmp = fmon; mtmp; mtmp = mtmp->nmon)
733         if (mtmp->m_id == (unsigned) otmp->leashmon)
734             mtmp->mleashed = 0;
735     otmp->leashmon = 0;
736 }
737
738 /* mtmp is about to die, or become untame */
739 void
740 m_unleash(mtmp, feedback)
741 register struct monst *mtmp;
742 boolean feedback;
743 {
744     register struct obj *otmp;
745
746     if (feedback) {
747         if (canseemon(mtmp))
748 /*JP
749             pline("%s pulls free of %s leash!", Monnam(mtmp), mhis(mtmp));
750 */
751             pline("%s\82Í\95R\82ð\88ø\82Á\82Ï\82Á\82Ä\93¦\82ê\82½\81I", Monnam(mtmp));
752         else
753 /*JP
754             Your("leash falls slack.");
755 */
756             Your("\95R\82ª\82½\82é\82ñ\82Å\97\8e\82¿\82½\81D");
757     }
758     for (otmp = invent; otmp; otmp = otmp->nobj)
759         if (otmp->otyp == LEASH && otmp->leashmon == (int) mtmp->m_id)
760             otmp->leashmon = 0;
761     mtmp->mleashed = 0;
762 }
763
764 /* player is about to die (for bones) */
765 void
766 unleash_all()
767 {
768     register struct obj *otmp;
769     register struct monst *mtmp;
770
771     for (otmp = invent; otmp; otmp = otmp->nobj)
772         if (otmp->otyp == LEASH)
773             otmp->leashmon = 0;
774     for (mtmp = fmon; mtmp; mtmp = mtmp->nmon)
775         mtmp->mleashed = 0;
776 }
777
778 #define MAXLEASHED 2
779
780 /* TODO:
781  *  This ought to exclude various other things, such as lights and gas
782  *  spore, is_whirly() critters, ethereal creatures, possibly others.
783  */
784 static boolean
785 leashable(mtmp)
786 struct monst *mtmp;
787 {
788     return (boolean) (mtmp->mnum != PM_LONG_WORM);
789 }
790
791 /* ARGSUSED */
792 STATIC_OVL int
793 use_leash(obj)
794 struct obj *obj;
795 {
796     coord cc;
797     struct monst *mtmp;
798     int spotmon;
799
800     if (u.uswallow) {
801         /* if the leash isn't in use, assume we're trying to leash
802            the engulfer; if it is use, distinguish between removing
803            it from the engulfer versus from some other creature
804            (note: the two in-use cases can't actually occur; all
805            leashes are released when the hero gets engulfed) */
806 #if 0 /*JP*/
807         You_cant((!obj->leashmon
808                   ? "leash %s from inside."
809                   : (obj->leashmon == (int) u.ustuck->m_id)
810                     ? "unleash %s from inside."
811                     : "unleash anything from inside %s."),
812                  noit_mon_nam(u.ustuck));
813 #else
814         You_cant((!obj->leashmon
815                   ? "\93à\91¤\82©\82ç%s\82É\8c\8b\82Ñ\82Â\82¯\82é\82±\82Æ\82Í\82Å\82«\82È\82¢\81D"
816                   : (obj->leashmon == (int) u.ustuck->m_id)
817                     ? "\93à\91¤\82©\82ç%s\82ð\8aO\82·\82±\82Æ\82Í\82Å\82«\82È\82¢\81D"
818                     : "%s\82Ì\93à\91¤\82©\82ç\8aO\82·\82±\82Æ\82Í\82Å\82«\82È\82¢\81D"),
819                  noit_mon_nam(u.ustuck));
820 #endif
821         return 0;
822     }
823     if (!obj->leashmon && number_leashed() >= MAXLEASHED) {
824 /*JP
825         You("cannot leash any more pets.");
826 */
827         You("\82±\82ê\88È\8fã\83y\83b\83g\82É\95R\82ð\82©\82¯\82ç\82ê\82È\82¢\81D");
828         return 0;
829     }
830
831     if (!get_adjacent_loc((char *) 0, (char *) 0, u.ux, u.uy, &cc))
832         return 0;
833
834     if (cc.x == u.ux && cc.y == u.uy) {
835         if (u.usteed && u.dz > 0) {
836             mtmp = u.usteed;
837             spotmon = 1;
838             goto got_target;
839         }
840 /*JP
841         pline("Leash yourself?  Very funny...");
842 */
843         pline("\8e©\95ª\82ð\94\9b\82é\81H\95Ï\82È\82Ì\81D\81D\81D");
844         return 0;
845     }
846
847     /*
848      * From here on out, return value is 1 == a move is used.
849      */
850
851     if (!(mtmp = m_at(cc.x, cc.y))) {
852 /*JP
853         There("is no creature there.");
854 */
855         pline("\82»\82±\82É\82Í\90\82«\95¨\82Í\82¢\82È\82¢\81D");
856         (void) unmap_invisible(cc.x, cc.y);
857         return 1;
858     }
859
860     spotmon = canspotmon(mtmp);
861  got_target:
862
863     if (!spotmon && !glyph_is_invisible(levl[cc.x][cc.y].glyph)) {
864         /* for the unleash case, we don't verify whether this unseen
865            monster is the creature attached to the current leash */
866 /*JP
867         You("fail to %sleash something.", obj->leashmon ? "un" : "");
868 */
869         You("%s\82Ì\82É\8e¸\94s\82µ\82½\81D", obj->leashmon ? "\8aO\82·" : "\8c\8b\82Ñ\82Â\82¯\82é");
870         /* trying again will work provided the monster is tame
871            (and also that it doesn't change location by retry time) */
872         map_invisible(cc.x, cc.y);
873     } else if (!mtmp->mtame) {
874 #if 0 /*JP*/
875         pline("%s %s leashed!", Monnam(mtmp),
876               (!obj->leashmon) ? "cannot be" : "is not");
877 #else
878         pline("%s\82Í\95R\82Å%s\81I", Monnam(mtmp),
879               (!obj->leashmon) ? "\8c\8b\82×\82È\82¢" : "\8c\8b\82Î\82ê\82Ä\82¢\82È\82¢");
880 #endif
881     } else if (!obj->leashmon) {
882         /* applying a leash which isn't currently in use */
883         if (mtmp->mleashed) {
884 #if 0 /*JP*/
885             pline("This %s is already leashed.",
886                   spotmon ? l_monnam(mtmp) : "creature");
887 #else
888             pline("%s\82Í\82·\82Å\82É\8c\8b\82Ñ\82Â\82¯\82ç\82ê\82Ä\82¢\82é\81D",
889                   spotmon ? l_monnam(mtmp) : "\89ö\95¨");
890 #endif
891         } else if (!leashable(mtmp)) {
892 #if 0 /*JP*/
893             pline("The leash won't fit onto %s%s.", spotmon ? "your " : "",
894                   l_monnam(mtmp));
895 #else
896             pline("\95R\82Í%s\82É\8d\87\82í\82È\82¢\81D",
897                   l_monnam(mtmp));
898 #endif
899         } else {
900 #if 0 /*JP*/
901             You("slip the leash around %s%s.", spotmon ? "your " : "",
902                 l_monnam(mtmp));
903 #else
904             You("%s\82ð\95R\82Å\8c\8b\82Ñ\82Â\82¯\82½\81D",
905                 l_monnam(mtmp));
906 #endif
907             mtmp->mleashed = 1;
908             obj->leashmon = (int) mtmp->m_id;
909             mtmp->msleeping = 0;
910         }
911     } else {
912         /* applying a leash which is currently in use */
913         if (obj->leashmon != (int) mtmp->m_id) {
914 /*JP
915         pline("This leash is not attached to that creature.");
916 */
917         pline("\82±\82Ì\95R\82Í\82»\82ê\82É\82Í\8c\8b\82Î\82ê\82Ä\82¢\82È\82¢\81D");
918         } else if (obj->cursed) {
919 /*JP
920             pline_The("leash would not come off!");
921 */
922             pline("\95R\82ª\82Í\82¸\82ê\82È\82¢\81I");
923             obj->bknown = 1;
924         } else {
925             mtmp->mleashed = 0;
926             obj->leashmon = 0;
927 #if 0 /*JP*/
928             You("remove the leash from %s%s.",
929                 spotmon ? "your " : "", l_monnam(mtmp));
930 #else
931             You("%s\82©\82ç\95R\82ð\82Í\82¸\82µ\82½\81D",
932                 l_monnam(mtmp));
933 #endif
934         }
935     }
936     return 1;
937 }
938
939 /* assuming mtmp->mleashed has been checked */
940 struct obj *
941 get_mleash(mtmp)
942 struct monst *mtmp;
943 {
944     struct obj *otmp;
945
946     otmp = invent;
947     while (otmp) {
948         if (otmp->otyp == LEASH && otmp->leashmon == (int) mtmp->m_id)
949             return otmp;
950         otmp = otmp->nobj;
951     }
952     return (struct obj *) 0;
953 }
954
955 boolean
956 next_to_u()
957 {
958     register struct monst *mtmp;
959     register struct obj *otmp;
960
961     for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
962         if (DEADMONSTER(mtmp))
963             continue;
964         if (mtmp->mleashed) {
965             if (distu(mtmp->mx, mtmp->my) > 2)
966                 mnexto(mtmp);
967             if (distu(mtmp->mx, mtmp->my) > 2) {
968                 for (otmp = invent; otmp; otmp = otmp->nobj)
969                     if (otmp->otyp == LEASH
970                         && otmp->leashmon == (int) mtmp->m_id) {
971                         if (otmp->cursed)
972                             return FALSE;
973 #if 0 /*JP*/
974                         You_feel("%s leash go slack.",
975                                  (number_leashed() > 1) ? "a" : "the");
976 #else
977                         You("\95R\82ª\82½\82é\82ñ\82¾\82æ\82¤\82È\8bC\82ª\82µ\82½\81D");
978 #endif
979                         mtmp->mleashed = 0;
980                         otmp->leashmon = 0;
981                     }
982             }
983         }
984     }
985     /* no pack mules for the Amulet */
986     if (u.usteed && mon_has_amulet(u.usteed))
987         return FALSE;
988     return TRUE;
989 }
990
991 void
992 check_leash(x, y)
993 register xchar x, y;
994 {
995     register struct obj *otmp;
996     register struct monst *mtmp;
997
998     for (otmp = invent; otmp; otmp = otmp->nobj) {
999         if (otmp->otyp != LEASH || otmp->leashmon == 0)
1000             continue;
1001         for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
1002             if (DEADMONSTER(mtmp))
1003                 continue;
1004             if ((int) mtmp->m_id == otmp->leashmon)
1005                 break;
1006         }
1007         if (!mtmp) {
1008             impossible("leash in use isn't attached to anything?");
1009             otmp->leashmon = 0;
1010             continue;
1011         }
1012         if (dist2(u.ux, u.uy, mtmp->mx, mtmp->my)
1013             > dist2(x, y, mtmp->mx, mtmp->my)) {
1014             if (!um_dist(mtmp->mx, mtmp->my, 3)) {
1015                 ; /* still close enough */
1016             } else if (otmp->cursed && !breathless(mtmp->data)) {
1017                 if (um_dist(mtmp->mx, mtmp->my, 5)
1018                     || (mtmp->mhp -= rnd(2)) <= 0) {
1019                     long save_pacifism = u.uconduct.killer;
1020
1021 /*JP
1022                     Your("leash chokes %s to death!", mon_nam(mtmp));
1023 */
1024                     pline("%s\82Í\8di\82ß\8eE\82³\82ê\82½\81I",mon_nam(mtmp));
1025                     /* hero might not have intended to kill pet, but
1026                        that's the result of his actions; gain experience,
1027                        lose pacifism, take alignment and luck hit, make
1028                        corpse less likely to remain tame after revival */
1029                     xkilled(mtmp, XKILL_NOMSG);
1030                     /* life-saving doesn't ordinarily reset this */
1031                     if (mtmp->mhp > 0)
1032                         u.uconduct.killer = save_pacifism;
1033                 } else {
1034 /*JP
1035                     pline("%s is choked by the leash!", Monnam(mtmp));
1036 */
1037                     pline("%s\82Í\95R\82Å\8eñ\82ð\8di\82ß\82ç\82ê\82½\81I", Monnam(mtmp));
1038                     /* tameness eventually drops to 1 here (never 0) */
1039                     if (mtmp->mtame && rn2(mtmp->mtame))
1040                         mtmp->mtame--;
1041                 }
1042             } else {
1043                 if (um_dist(mtmp->mx, mtmp->my, 5)) {
1044 /*JP
1045                     pline("%s leash snaps loose!", s_suffix(Monnam(mtmp)));
1046 */
1047                     pline("%s\82Ì\95R\82Í\83p\83`\83\93\82Æ\8aO\82ê\82½\81I", Monnam(mtmp));
1048                     m_unleash(mtmp, FALSE);
1049                 } else {
1050 /*JP
1051                     You("pull on the leash.");
1052 */
1053                     You("\95R\82ð\88ø\82Á\82Ï\82Á\82½\81D");
1054                     if (mtmp->data->msound != MS_SILENT)
1055                         switch (rn2(3)) {
1056                         case 0:
1057                             growl(mtmp);
1058                             break;
1059                         case 1:
1060                             yelp(mtmp);
1061                             break;
1062                         default:
1063                             whimper(mtmp);
1064                             break;
1065                         }
1066                 }
1067             }
1068         }
1069     }
1070 }
1071
1072 const char *
1073 beautiful()
1074 {
1075     return ((ACURR(A_CHA) > 14)
1076                ? ((poly_gender() == 1)
1077 #if 0 /*JP*/
1078                      ? "beautiful"
1079                      : "handsome")
1080                : "ugly");
1081 #else
1082 /*JP \8cê\8a²\82Å\8eg\82¤ */
1083                      ? "\94ü\82µ"
1084                      : "\82è\82è\82µ")
1085                : "\8fX");
1086 #endif
1087 }
1088
1089 /*JP
1090 static const char look_str[] = "look %s.";
1091 */
1092 static const char look_str[] = "%s\8c©\82¦\82é\81D";
1093
1094 STATIC_OVL int
1095 use_mirror(obj)
1096 struct obj *obj;
1097 {
1098     const char *mirror, *uvisage;
1099     struct monst *mtmp;
1100     unsigned how_seen;
1101     char mlet;
1102     boolean vis, invis_mirror, useeit, monable;
1103
1104     if (!getdir((char *) 0))
1105         return 0;
1106     invis_mirror = Invis;
1107     useeit = !Blind && (!invis_mirror || See_invisible);
1108     uvisage = beautiful();
1109     mirror = simpleonames(obj); /* "mirror" or "looking glass" */
1110     if (obj->cursed && !rn2(2)) {
1111         if (!Blind)
1112 /*JP
1113             pline_The("%s fogs up and doesn't reflect!", mirror);
1114 */
1115             pline("%s\82Í\93Ü\82è\81C\89f\82ç\82È\82­\82È\82Á\82½\81I", mirror);
1116         return 1;
1117     }
1118     if (!u.dx && !u.dy && !u.dz) {
1119         if (!useeit) {
1120 /*JP
1121             You_cant("see your %s %s.", uvisage, body_part(FACE));
1122 */
1123             You_cant("\8e©\95ª\82Ì%s\82¢%s\82ð\8c©\82é\82±\82Æ\82ª\82Å\82«\82È\82¢\81D", uvisage, body_part(FACE));
1124         } else {
1125             if (u.umonnum == PM_FLOATING_EYE) {
1126                 if (Free_action) {
1127 /*JP
1128                     You("stiffen momentarily under your gaze.");
1129 */
1130                     pline("\88ê\8fu\82 \82È\82½\82Ì\82É\82ç\82Ý\82Å\8dd\92¼\82µ\82½\81D");
1131                 } else {
1132                     if (Hallucination)
1133 /*JP
1134                         pline("Yow!  The %s stares back!", mirror);
1135 */
1136                         pline("\82¨\82ì\81I%s\82ª\82 \82È\82½\82ð\82É\82ç\82Ý\95Ô\82µ\82½\81I", mirror);
1137                     else
1138 /*JP
1139                         pline("Yikes!  You've frozen yourself!");
1140 */
1141                         pline("\82¨\82ì\81I\82 \82È\82½\82Í\93®\82¯\82È\82­\82È\82Á\82½\81I");
1142                     if (!Hallucination || !rn2(4)) {
1143                         nomul(-rnd(MAXULEV + 6 - u.ulevel));
1144 /*JP
1145                         multi_reason = "gazing into a mirror";
1146 */
1147                         multi_reason = "\8b¾\82É\94½\8eË\82µ\82½\8e\8b\90ü\82Å\8dd\92¼\82µ\82Ä\82¢\82é\8aÔ\82É";
1148                     }
1149                     nomovemsg = 0; /* default, "you can move again" */
1150                 }
1151             } else if (youmonst.data->mlet == S_VAMPIRE)
1152 /*JP
1153                 You("don't have a reflection.");
1154 */
1155                 You("\8b¾\82É\89f\82ç\82È\82©\82Á\82½\81D");
1156             else if (u.umonnum == PM_UMBER_HULK) {
1157 /*JP
1158                 pline("Huh?  That doesn't look like you!");
1159 */
1160                 pline("\82Ù\82¦\81H\8eÊ\82Á\82Ä\82é\82Ì\82Í\82 \82È\82½\82\82á\82È\82¢\82Ý\82½\82¢\82¾\81I");
1161                 make_confused(HConfusion + d(3, 4), FALSE);
1162             } else if (Hallucination)
1163                 You(look_str, hcolor((char *) 0));
1164             else if (Sick)
1165 /*JP
1166                 You(look_str, "peaked");
1167 */
1168                 You(look_str, "\8aç\90F\82ª\88«\82­");
1169             else if (u.uhs >= WEAK)
1170 /*JP
1171                 You(look_str, "undernourished");
1172 */
1173                 You(look_str, "\89h\97{\8e¸\92²\82Ì\82æ\82¤\82É");
1174             else
1175 /*JP
1176                 You("look as %s as ever.", uvisage);
1177 */
1178                 You("\82 \82¢\82©\82í\82ç\82¸%s\82­\8c©\82¦\82é\81D", uvisage);
1179         }
1180         return 1;
1181     }
1182     if (u.uswallow) {
1183         if (useeit)
1184 #if 0 /*JP*/
1185             You("reflect %s %s.", s_suffix(mon_nam(u.ustuck)),
1186                 mbodypart(u.ustuck, STOMACH));
1187 #else
1188             You("%s\82Ì%s\82ð\89f\82µ\82½\81D", mon_nam(u.ustuck),
1189                 mbodypart(u.ustuck, STOMACH));
1190 #endif
1191         return 1;
1192     }
1193     if (Underwater) {
1194         if (useeit)
1195 #if 0 /*JP*/
1196             You(Hallucination ? "give the fish a chance to fix their makeup."
1197                               : "reflect the murky water.");
1198 #else
1199             You(Hallucination ? "\8b\9b\82É\89»\8fÏ\92¼\82µ\82Ì\8b@\89ï\82ð\97^\82¦\82½\81D"
1200                               : "\82 \82È\82½\82Í\97\84\82ñ\82¾\90\85\82ð\89f\82µ\82½\81D");
1201 #endif
1202         return 1;
1203     }
1204     if (u.dz) {
1205         if (useeit)
1206 /*JP
1207             You("reflect the %s.",
1208 */
1209             You("%s\82ð\89f\82µ\82½\81D",
1210                 (u.dz > 0) ? surface(u.ux, u.uy) : ceiling(u.ux, u.uy));
1211         return 1;
1212     }
1213     mtmp = bhit(u.dx, u.dy, COLNO, INVIS_BEAM,
1214                 (int FDECL((*), (MONST_P, OBJ_P))) 0,
1215                 (int FDECL((*), (OBJ_P, OBJ_P))) 0, &obj);
1216     if (!mtmp || !haseyes(mtmp->data) || notonhead)
1217         return 1;
1218
1219     /* couldsee(mtmp->mx, mtmp->my) is implied by the fact that bhit()
1220        targetted it, so we can ignore possibility of X-ray vision */
1221     vis = canseemon(mtmp);
1222 /* ways to directly see monster (excludes X-ray vision, telepathy,
1223    extended detection, type-specific warning) */
1224 #define SEENMON (MONSEEN_NORMAL | MONSEEN_SEEINVIS | MONSEEN_INFRAVIS)
1225     how_seen = vis ? howmonseen(mtmp) : 0;
1226     /* whether monster is able to use its vision-based capabilities */
1227     monable = !mtmp->mcan && (!mtmp->minvis || perceives(mtmp->data));
1228     mlet = mtmp->data->mlet;
1229     if (mtmp->msleeping) {
1230         if (vis)
1231 /*JP
1232             pline("%s is too tired to look at your %s.", Monnam(mtmp),
1233 */
1234             pline("%s\82Í\82Æ\82Ä\82à\94æ\82ê\82Ä\82¢\82Ä%s\82ð\8c©\82é\82Ç\82±\82ë\82\82á\82È\82¢\81D", Monnam(mtmp),
1235                   mirror);
1236     } else if (!mtmp->mcansee) {
1237         if (vis)
1238 /*JP
1239             pline("%s can't see anything right now.", Monnam(mtmp));
1240 */
1241             pline("%s\82Í\8d¡\82Ì\82Æ\82±\82ë\89½\82à\8c©\82é\82±\82Æ\82ª\82Å\82«\82È\82¢\81D", Monnam(mtmp));
1242     } else if (invis_mirror && !perceives(mtmp->data)) {
1243         if (vis)
1244 /*JP
1245             pline("%s fails to notice your %s.", Monnam(mtmp), mirror);
1246 */
1247             pline("%s\82Í\82 \82È\82½\82Ì%s\82É\8bC\95t\82©\82È\82©\82Á\82½\81D", Monnam(mtmp), mirror);
1248         /* infravision doesn't produce an image in the mirror */
1249     } else if ((how_seen & SEENMON) == MONSEEN_INFRAVIS) {
1250         if (vis) /* (redundant) */
1251 #if 0 /*JP*/
1252             pline("%s is too far away to see %sself in the dark.",
1253                   Monnam(mtmp), mhim(mtmp));
1254 #else
1255             pline("%s\82Í\88Ã\88Å\82Å\8e©\95ª\8e©\90g\82ð\8c©\82é\82É\82Í\89\93\82·\82¬\82é\81D", Monnam(mtmp));
1256 #endif
1257         /* some monsters do special things */
1258     } else if (mlet == S_VAMPIRE || mlet == S_GHOST || is_vampshifter(mtmp)) {
1259         if (vis)
1260 /*JP
1261             pline("%s doesn't have a reflection.", Monnam(mtmp));
1262 */
1263             pline("%s\82Í%s\82É\89f\82ç\82È\82¢\81D", Monnam(mtmp), mirror);
1264     } else if (monable && mtmp->data == &mons[PM_MEDUSA]) {
1265 /*JP
1266         if (mon_reflects(mtmp, "The gaze is reflected away by %s %s!"))
1267 */
1268         if (mon_reflects(mtmp, "\82É\82ç\82Ý\82Í%s\82Ì%s\82Å\94½\8eË\82µ\82½\81I"))
1269             return 1;
1270         if (vis)
1271 /*JP
1272             pline("%s is turned to stone!", Monnam(mtmp));
1273 */
1274             pline("%s\82Í\90Î\82É\82È\82Á\82½\81I", Monnam(mtmp));
1275         stoned = TRUE;
1276         killed(mtmp);
1277     } else if (monable && mtmp->data == &mons[PM_FLOATING_EYE]) {
1278         int tmp = d((int) mtmp->m_lev, (int) mtmp->data->mattk[0].damd);
1279         if (!rn2(4))
1280             tmp = 120;
1281         if (vis)
1282 /*JP
1283             pline("%s is frozen by its reflection.", Monnam(mtmp));
1284 */
1285             pline("%s\82Í\8e©\95ª\82Ì\8ep\82ð\8c©\82Ä\93®\82¯\82È\82­\82È\82Á\82½\81D", Monnam(mtmp));
1286         else
1287 /*JP
1288             You_hear("%s stop moving.", something);
1289 */
1290             You_hear("\89½\82©\82ª\93®\82«\82ð\82Æ\82ß\82½\89¹\82ð\95·\82¢\82½\81D");
1291         paralyze_monst(mtmp, (int) mtmp->mfrozen + tmp);
1292     } else if (monable && mtmp->data == &mons[PM_UMBER_HULK]) {
1293         if (vis)
1294 /*JP
1295             pline("%s confuses itself!", Monnam(mtmp));
1296 */
1297             pline("%s\82Í\8d¬\97\90\82µ\82½\81I", Monnam(mtmp));
1298         mtmp->mconf = 1;
1299     } else if (monable && (mlet == S_NYMPH || mtmp->data == &mons[PM_SUCCUBUS]
1300                            || mtmp->data == &mons[PM_INCUBUS])) {
1301         if (vis) {
1302             char buf[BUFSZ]; /* "She" or "He" */
1303
1304 #if 0 /*JP*/
1305             pline("%s admires %sself in your %s.", Monnam(mtmp), mhim(mtmp),
1306                   mirror);
1307 #else
1308             pline("%s\82Í\8e©\95ª\82Ì\8ep\82É\82¤\82Á\82Æ\82è\82µ\82½\81D", Monnam(mtmp));
1309 #endif
1310 /*JP
1311             pline("%s takes it!", upstart(strcpy(buf, mhe(mtmp))));
1312 */
1313             pline("%s\82Í\82»\82ê\82ð\92D\82Á\82½\81I", upstart(strcpy(buf, mhe(mtmp))));
1314         } else
1315 /*JP
1316             pline("It steals your %s!", mirror);
1317 */
1318             pline("\89½\8eÒ\82©\82ª\82 \82È\82½\82Ì%s\82ð\93\90\82ñ\82¾\81I", mirror);
1319         setnotworn(obj); /* in case mirror was wielded */
1320         freeinv(obj);
1321         (void) mpickobj(mtmp, obj);
1322         if (!tele_restrict(mtmp))
1323             (void) rloc(mtmp, TRUE);
1324     } else if (!is_unicorn(mtmp->data) && !humanoid(mtmp->data)
1325                && (!mtmp->minvis || perceives(mtmp->data)) && rn2(5)) {
1326         if (vis)
1327 /*JP
1328             pline("%s is frightened by its reflection.", Monnam(mtmp));
1329 */
1330             pline("%s\82Í\8e©\95ª\82Ì\8ep\82ð\8c©\82Ä\95|\82ª\82Á\82½\81D", Monnam(mtmp));
1331         monflee(mtmp, d(2, 4), FALSE, FALSE);
1332     } else if (!Blind) {
1333         if (mtmp->minvis && !See_invisible)
1334             ;
1335         else if ((mtmp->minvis && !perceives(mtmp->data))
1336                  /* redundant: can't get here if these are true */
1337                  || !haseyes(mtmp->data) || notonhead || !mtmp->mcansee)
1338 #if 0 /*JP*/
1339             pline("%s doesn't seem to notice %s reflection.", Monnam(mtmp),
1340                   mhis(mtmp));
1341 #else
1342             pline("%s\82Í\8e©\95ª\82Ì\8ep\82É\8bC\82ª\82Â\82¢\82Ä\82È\82¢\82æ\82¤\82¾\81D", Monnam(mtmp));
1343 #endif
1344         else
1345 /*JP
1346             pline("%s ignores %s reflection.", Monnam(mtmp), mhis(mtmp));
1347 */
1348             pline("%s\82Í\8e©\95ª\82Ì\8ep\82ð\96³\8e\8b\82µ\82½\81D", Monnam(mtmp));
1349     }
1350     return 1;
1351 }
1352
1353 STATIC_OVL void
1354 use_bell(optr)
1355 struct obj **optr;
1356 {
1357     register struct obj *obj = *optr;
1358     struct monst *mtmp;
1359     boolean wakem = FALSE, learno = FALSE,
1360             ordinary = (obj->otyp != BELL_OF_OPENING || !obj->spe),
1361             invoking =
1362                 (obj->otyp == BELL_OF_OPENING && invocation_pos(u.ux, u.uy)
1363                  && !On_stairs(u.ux, u.uy));
1364
1365 /*JP
1366     You("ring %s.", the(xname(obj)));
1367 */
1368     You("%s\82ð\96Â\82ç\82µ\82½\81D", the(xname(obj)));
1369
1370     if (Underwater || (u.uswallow && ordinary)) {
1371 #ifdef AMIGA
1372         amii_speaker(obj, "AhDhGqEqDhEhAqDqFhGw", AMII_MUFFLED_VOLUME);
1373 #endif
1374 /*JP
1375         pline("But the sound is muffled.");
1376 */
1377         pline("\82µ\82©\82µ\89¹\82Í\82©\82«\8fÁ\82³\82ê\82½\81D");
1378
1379     } else if (invoking && ordinary) {
1380         /* needs to be recharged... */
1381 /*JP
1382         pline("But it makes no sound.");
1383 */
1384         pline("\82µ\82©\82µ\81C\89¹\82Í\96Â\82ç\82È\82©\82Á\82½\81D");
1385         learno = TRUE; /* help player figure out why */
1386
1387     } else if (ordinary) {
1388 #ifdef AMIGA
1389         amii_speaker(obj, "ahdhgqeqdhehaqdqfhgw", AMII_MUFFLED_VOLUME);
1390 #endif
1391         if (obj->cursed && !rn2(4)
1392             /* note: once any of them are gone, we stop all of them */
1393             && !(mvitals[PM_WOOD_NYMPH].mvflags & G_GONE)
1394             && !(mvitals[PM_WATER_NYMPH].mvflags & G_GONE)
1395             && !(mvitals[PM_MOUNTAIN_NYMPH].mvflags & G_GONE)
1396             && (mtmp = makemon(mkclass(S_NYMPH, 0), u.ux, u.uy, NO_MINVENT))
1397                    != 0) {
1398 /*JP
1399             You("summon %s!", a_monnam(mtmp));
1400 */
1401             You("%s\82ð\8f¢\8a«\82µ\82½\81I", a_monnam(mtmp));
1402             if (!obj_resists(obj, 93, 100)) {
1403 /*JP
1404                 pline("%s shattered!", Tobjnam(obj, "have"));
1405 */
1406                 pline("%s\82Í\95²\81X\82É\82È\82Á\82½\81I", xname(obj));
1407                 useup(obj);
1408                 *optr = 0;
1409             } else
1410                 switch (rn2(3)) {
1411                 default:
1412                     break;
1413                 case 1:
1414                     mon_adjust_speed(mtmp, 2, (struct obj *) 0);
1415                     break;
1416                 case 2: /* no explanation; it just happens... */
1417                     nomovemsg = "";
1418                     multi_reason = NULL;
1419                     nomul(-rnd(2));
1420                     break;
1421                 }
1422         }
1423         wakem = TRUE;
1424
1425     } else {
1426         /* charged Bell of Opening */
1427         consume_obj_charge(obj, TRUE);
1428
1429         if (u.uswallow) {
1430             if (!obj->cursed)
1431                 (void) openit();
1432             else
1433                 pline1(nothing_happens);
1434
1435         } else if (obj->cursed) {
1436             coord mm;
1437
1438             mm.x = u.ux;
1439             mm.y = u.uy;
1440             mkundead(&mm, FALSE, NO_MINVENT);
1441             wakem = TRUE;
1442
1443         } else if (invoking) {
1444 /*JP
1445             pline("%s an unsettling shrill sound...", Tobjnam(obj, "issue"));
1446 */
1447             pline("%s\82Í\95s\8bC\96¡\82È\89s\82¢\89¹\82ð\8fo\82µ\82½\81D\81D\81D", xname(obj));
1448 #ifdef AMIGA
1449             amii_speaker(obj, "aefeaefeaefeaefeaefe", AMII_LOUDER_VOLUME);
1450 #endif
1451             obj->age = moves;
1452             learno = TRUE;
1453             wakem = TRUE;
1454
1455         } else if (obj->blessed) {
1456             int res = 0;
1457
1458 #ifdef AMIGA
1459             amii_speaker(obj, "ahahahDhEhCw", AMII_SOFT_VOLUME);
1460 #endif
1461             if (uchain) {
1462                 unpunish();
1463                 res = 1;
1464             } else if (u.utrap && u.utraptype == TT_BURIEDBALL) {
1465                 buried_ball_to_freedom();
1466                 res = 1;
1467             }
1468             res += openit();
1469             switch (res) {
1470             case 0:
1471                 pline1(nothing_happens);
1472                 break;
1473             case 1:
1474 /*JP
1475                 pline("%s opens...", Something);
1476 */
1477                 pline("\89½\82©\82ª\8aJ\82¢\82½\81D\81D\81D");
1478                 learno = TRUE;
1479                 break;
1480             default:
1481 /*JP
1482                 pline("Things open around you...");
1483 */
1484                 pline("\82Ü\82í\82è\82Ì\95¨\82ª\8aJ\82¢\82½\81D\81D\81D");
1485                 learno = TRUE;
1486                 break;
1487             }
1488
1489         } else { /* uncursed */
1490 #ifdef AMIGA
1491             amii_speaker(obj, "AeFeaeFeAefegw", AMII_OKAY_VOLUME);
1492 #endif
1493             if (findit() != 0)
1494                 learno = TRUE;
1495             else
1496                 pline1(nothing_happens);
1497         }
1498
1499     } /* charged BofO */
1500
1501     if (learno) {
1502         makeknown(BELL_OF_OPENING);
1503         obj->known = 1;
1504     }
1505     if (wakem)
1506         wake_nearby();
1507 }
1508
1509 STATIC_OVL void
1510 use_candelabrum(obj)
1511 register struct obj *obj;
1512 {
1513 #if 0 /*JP*//* not used */
1514     const char *s = (obj->spe != 1) ? "candles" : "candle";
1515 #endif
1516
1517     if (obj->lamplit) {
1518 /*JP
1519         You("snuff the %s.", s);
1520 */
1521         You("\82ë\82¤\82»\82­\82ð\90\81\82«\8fÁ\82µ\82½\81D");
1522         end_burn(obj, TRUE);
1523         return;
1524     }
1525     if (obj->spe <= 0) {
1526 /*JP
1527         pline("This %s has no %s.", xname(obj), s);
1528 */
1529         pline("\82±\82Ì%s\82É\82Í\82ë\82¤\82»\82­\82ª\82È\82¢\81D", xname(obj));
1530         return;
1531     }
1532     if (Underwater) {
1533 /*JP
1534         You("cannot make fire under water.");
1535 */
1536         You("\90\85\92\86\82Å\89Î\82ð\82¨\82±\82¹\82È\82¢\81D");
1537         return;
1538     }
1539     if (u.uswallow || obj->cursed) {
1540         if (!Blind)
1541 #if 0 /*JP*/
1542             pline_The("%s %s for a moment, then %s.", s, vtense(s, "flicker"),
1543                       vtense(s, "die"));
1544 #else
1545             pline("\82ë\82¤\82»\82­\82Ì\89\8a\82Í\82µ\82Î\82ç\82­\93_\96Å\82µ\81C\8fÁ\82¦\82½\81D");
1546 #endif
1547         return;
1548     }
1549     if (obj->spe < 7) {
1550 #if 0 /*JP*/
1551         There("%s only %d %s in %s.", vtense(s, "are"), obj->spe, s,
1552               the(xname(obj)));
1553 #else
1554         pline("%s\82É\82Í\82½\82Á\82½%d\96{\82Ì\82ë\82¤\82»\82­\82µ\82©\82È\82¢\81D",
1555               xname(obj), obj->spe);
1556 #endif
1557         if (!Blind)
1558 #if 0 /*JP*/
1559             pline("%s lit.  %s dimly.", obj->spe == 1 ? "It is" : "They are",
1560                   Tobjnam(obj, "shine"));
1561 #else
1562             pline("%s\82É\89Î\82ð\82Â\82¯\82½\81D%s\82Í\82Ù\82Ì\82©\82É\8bP\82¢\82½\81D",
1563                   xname(obj), xname(obj));
1564 #endif
1565     } else {
1566 #if 0 /*JP*/
1567         pline("%s's %s burn%s", The(xname(obj)), s,
1568               (Blind ? "." : " brightly!"));
1569 #else
1570         pline("%s\82Ì\82ë\82¤\82»\82­\82Í%s\94R\82¦\82 \82ª\82Á\82½\81I", The(xname(obj)),
1571               (Blind ? "" : "\96¾\82é\82­"));
1572 #endif
1573     }
1574     if (!invocation_pos(u.ux, u.uy) || On_stairs(u.ux, u.uy)) {
1575 /*JP
1576         pline_The("%s %s being rapidly consumed!", s, vtense(s, "are"));
1577 */
1578         pline("\82ë\82¤\82»\82­\82Í\82·\82²\82¢\91¬\82³\82Å\94R\82¦\8en\82ß\82½\81I");
1579         /* this used to be obj->age /= 2, rounding down; an age of
1580            1 would yield 0, confusing begin_burn() and producing an
1581            unlightable, unrefillable candelabrum; round up instead */
1582         obj->age = (obj->age + 1L) / 2L;
1583     } else {
1584         if (obj->spe == 7) {
1585             if (Blind)
1586 /*JP
1587                 pline("%s a strange warmth!", Tobjnam(obj, "radiate"));
1588 */
1589                 pline("\8aï\96­\82È\92g\82©\82³\82ð%s\82É\8a´\82\82½\81I", xname(obj));
1590             else
1591 /*JP
1592                 pline("%s with a strange light!", Tobjnam(obj, "glow"));
1593 */
1594                 pline("%s\82Í\8aï\96­\82È\8cõ\82ð\94­\82µ\82Ä\82¢\82é\81I", xname(obj));
1595         }
1596         obj->known = 1;
1597     }
1598     begin_burn(obj, FALSE);
1599 }
1600
1601 STATIC_OVL void
1602 use_candle(optr)
1603 struct obj **optr;
1604 {
1605     register struct obj *obj = *optr;
1606     register struct obj *otmp;
1607 /*JP
1608     const char *s = (obj->quan != 1) ? "candles" : "candle";
1609 */
1610     const char *s = "\82ë\82¤\82»\82­";
1611     char qbuf[QBUFSZ], qsfx[QBUFSZ], *q;
1612
1613     if (u.uswallow) {
1614         You(no_elbow_room);
1615         return;
1616     }
1617
1618     otmp = carrying(CANDELABRUM_OF_INVOCATION);
1619     if (!otmp || otmp->spe == 7) {
1620         use_lamp(obj);
1621         return;
1622     }
1623
1624     /*JP:\8dÅ\8fI\93I\82É\82Í\81u\82ë\82¤\82»\82­\82ð\90C\91ä\82É\8eæ\82è\82Â\82¯\82Ü\82·\82©\81H\81v*/
1625     /* first, minimal candelabrum suffix for formatting candles */
1626 /*JP
1627     Sprintf(qsfx, " to\033%s?", thesimpleoname(otmp));
1628 */
1629     Sprintf(qsfx, "\82ð\033%s\82É\8eæ\82è\82Â\82¯\82Ü\82·\82©\81H", thesimpleoname(otmp));
1630     /* next, format the candles as a prefix for the candelabrum */
1631 /*JP
1632     (void) safe_qbuf(qbuf, "Attach ", qsfx, obj, yname, thesimpleoname, s);
1633 */
1634     (void) safe_qbuf(qbuf, "", qsfx, obj, xname, thesimpleoname, s);
1635     /*JP:\81u(\82ë\82¤\82»\82­)\82ð\033\90C\91ä\82É\8eæ\82è\82Â\82¯\82Ü\82·\82©\81H\81v*/
1636     /* strip temporary candelabrum suffix */
1637 #if 0 /*JP*/
1638     if ((q = strstri(qbuf, " to\033")) != 0)
1639         Strcpy(q, " to ");
1640 #else
1641     if ((q = strchr(qbuf, '\033')) != 0)
1642         *q = '\0';
1643     /*JP:\81u(\82ë\82¤\82»\82­)\82ð\81v*/
1644 #endif
1645     /* last, format final "attach candles to candelabrum?" query */
1646 /*JP
1647     if (yn(safe_qbuf(qbuf, qbuf, "?", otmp, yname, thesimpleoname, "it"))
1648 */
1649     if (yn(safe_qbuf(qbuf, qbuf, "\82É\8eæ\82è\82Â\82¯\82Ü\82·\82©\81H", otmp, xname, thesimpleoname, "\82»\82ê"))
1650         == 'n') {
1651         use_lamp(obj);
1652         return;
1653     } else {
1654         if ((long) otmp->spe + obj->quan > 7L) {
1655             obj = splitobj(obj, 7L - (long) otmp->spe);
1656 #if 0 /*JP:\93ú\96{\8cê\82Å\82Í\95s\97v*/
1657             /* avoid a grammatical error if obj->quan gets
1658                reduced to 1 candle from more than one */
1659             s = (obj->quan != 1) ? "candles" : "candle";
1660 #endif
1661         } else
1662             *optr = 0;
1663 #if 0 /*JP*/
1664         You("attach %ld%s %s to %s.", obj->quan, !otmp->spe ? "" : " more", s,
1665             the(xname(otmp)));
1666 #else
1667         You("%ld\96{\82Ì\82ë\82¤\82»\82­\82ð%s%s\82Ö\8eæ\82è\82Â\82¯\82½\81D",
1668             obj->quan, !otmp->spe ? "" : "\82³\82ç\82É",
1669             xname(otmp));
1670 #endif
1671         if (!otmp->spe || otmp->age > obj->age)
1672             otmp->age = obj->age;
1673         otmp->spe += (int) obj->quan;
1674         if (otmp->lamplit && !obj->lamplit)
1675 /*JP
1676             pline_The("new %s magically %s!", s, vtense(s, "ignite"));
1677 */
1678             pline("\90V\82µ\82¢\82ë\82¤\82»\82­\82Í\95s\8ev\8bc\82È\89\8a\82ð\82 \82°\82½\81I");
1679         else if (!otmp->lamplit && obj->lamplit)
1680 /*JP
1681             pline("%s out.", (obj->quan > 1L) ? "They go" : "It goes");
1682 */
1683             pline("\89\8a\82Í\8fÁ\82¦\82½\81D");
1684         if (obj->unpaid)
1685 #if 0 /*JP*/
1686             verbalize("You %s %s, you bought %s!",
1687                       otmp->lamplit ? "burn" : "use",
1688                       (obj->quan > 1L) ? "them" : "it",
1689                       (obj->quan > 1L) ? "them" : "it");
1690 #else
1691             verbalize("\89Î\82ð\82Â\82¯\82½\82È\82ç\81C\94\83\82Á\82Ä\82à\82ç\82¨\82¤\81I");
1692 #endif
1693         if (obj->quan < 7L && otmp->spe == 7)
1694 #if 0 /*JP*/
1695             pline("%s now has seven%s candles attached.", The(xname(otmp)),
1696                   otmp->lamplit ? " lit" : "");
1697 #else
1698             pline("%s\82É\82Í\82·\82Å\82É7\96{\82Ì%s\82ë\82¤\82»\82­\82ª\8eæ\82è\82Â\82¯\82ç\82ê\82Ä\82¢\82é\81D",
1699                   The(xname(otmp)), otmp->lamplit ? "\89Î\82Ì\82Â\82¢\82½" : "");
1700 #endif
1701         /* candelabrum's light range might increase */
1702         if (otmp->lamplit)
1703             obj_merge_light_sources(otmp, otmp);
1704         /* candles are no longer a separate light source */
1705         if (obj->lamplit)
1706             end_burn(obj, TRUE);
1707         /* candles are now gone */
1708         useupall(obj);
1709         /* candelabrum's weight is changing */
1710         otmp->owt = weight(otmp);
1711         update_inventory();
1712     }
1713 }
1714
1715 /* call in drop, throw, and put in box, etc. */
1716 boolean
1717 snuff_candle(otmp)
1718 struct obj *otmp;
1719 {
1720     boolean candle = Is_candle(otmp);
1721
1722     if ((candle || otmp->otyp == CANDELABRUM_OF_INVOCATION)
1723         && otmp->lamplit) {
1724         char buf[BUFSZ];
1725         xchar x, y;
1726 #if 0 /*JP*//* not used */
1727         boolean many = candle ? (otmp->quan > 1L) : (otmp->spe > 1);
1728 #endif
1729
1730         (void) get_obj_location(otmp, &x, &y, 0);
1731         if (otmp->where == OBJ_MINVENT ? cansee(x, y) : !Blind)
1732 #if 0 /*JP*/
1733             pline("%s%scandle%s flame%s extinguished.", Shk_Your(buf, otmp),
1734                   (candle ? "" : "candelabrum's "), (many ? "s'" : "'s"),
1735                   (many ? "s are" : " is"));
1736 #else
1737             pline("%s%s\82ë\82¤\82»\82­\82Ì\89\8a\82Í\8fÁ\82¦\82½\81D", Shk_Your(buf, otmp),
1738                   candle ? "" : "\90C\91ä\82Ì");
1739 #endif
1740         end_burn(otmp, TRUE);
1741         return TRUE;
1742     }
1743     return FALSE;
1744 }
1745
1746 /* called when lit lamp is hit by water or put into a container or
1747    you've been swallowed by a monster; obj might be in transit while
1748    being thrown or dropped so don't assume that its location is valid */
1749 boolean
1750 snuff_lit(obj)
1751 struct obj *obj;
1752 {
1753     xchar x, y;
1754
1755     if (obj->lamplit) {
1756         if (obj->otyp == OIL_LAMP || obj->otyp == MAGIC_LAMP
1757             || obj->otyp == BRASS_LANTERN || obj->otyp == POT_OIL) {
1758             (void) get_obj_location(obj, &x, &y, 0);
1759             if (obj->where == OBJ_MINVENT ? cansee(x, y) : !Blind)
1760 /*JP
1761                 pline("%s %s out!", Yname2(obj), otense(obj, "go"));
1762 */
1763                 pline("%s\82Í\8fÁ\82¦\82½\81I", Yname2(obj));
1764             end_burn(obj, TRUE);
1765             return TRUE;
1766         }
1767         if (snuff_candle(obj))
1768             return TRUE;
1769     }
1770     return FALSE;
1771 }
1772
1773 /* Called when potentially lightable object is affected by fire_damage().
1774    Return TRUE if object was lit and FALSE otherwise --ALI */
1775 boolean
1776 catch_lit(obj)
1777 struct obj *obj;
1778 {
1779     xchar x, y;
1780
1781     if (!obj->lamplit && (obj->otyp == MAGIC_LAMP || ignitable(obj))) {
1782         if ((obj->otyp == MAGIC_LAMP
1783              || obj->otyp == CANDELABRUM_OF_INVOCATION) && obj->spe == 0)
1784             return FALSE;
1785         else if (obj->otyp != MAGIC_LAMP && obj->age == 0)
1786             return FALSE;
1787         if (!get_obj_location(obj, &x, &y, 0))
1788             return FALSE;
1789         if (obj->otyp == CANDELABRUM_OF_INVOCATION && obj->cursed)
1790             return FALSE;
1791         if ((obj->otyp == OIL_LAMP || obj->otyp == MAGIC_LAMP
1792              || obj->otyp == BRASS_LANTERN) && obj->cursed && !rn2(2))
1793             return FALSE;
1794         if (obj->where == OBJ_MINVENT ? cansee(x, y) : !Blind)
1795 /*JP
1796             pline("%s %s light!", Yname2(obj), otense(obj, "catch"));
1797 */
1798             pline("%s\82Ì\96¾\82©\82è\82ª\82Â\82¢\82½\81I", Yname2(obj));
1799         if (obj->otyp == POT_OIL)
1800             makeknown(obj->otyp);
1801         if (carried(obj) && obj->unpaid && costly_spot(u.ux, u.uy)) {
1802             /* if it catches while you have it, then it's your tough luck */
1803             check_unpaid(obj);
1804 #if 0 /*JP:T*/
1805             verbalize("That's in addition to the cost of %s %s, of course.",
1806                       yname(obj), obj->quan == 1L ? "itself" : "themselves");
1807 #else
1808             verbalize("\82±\82ê\82Í\82à\82¿\82ë\82ñ%s\82Ì\92l\92i\82Æ\82Í\95Ê\82¾\82æ\81D", xname(obj));
1809 #endif
1810             bill_dummy_object(obj);
1811         }
1812         begin_burn(obj, FALSE);
1813         return TRUE;
1814     }
1815     return FALSE;
1816 }
1817
1818 STATIC_OVL void
1819 use_lamp(obj)
1820 struct obj *obj;
1821 {
1822     char buf[BUFSZ];
1823
1824     if (obj->lamplit) {
1825         if (obj->otyp == OIL_LAMP || obj->otyp == MAGIC_LAMP
1826             || obj->otyp == BRASS_LANTERN)
1827 /*JP
1828             pline("%slamp is now off.", Shk_Your(buf, obj));
1829 */
1830             pline("%s\83\89\83\93\83v\82Ì\93\94\82Í\8fÁ\82¦\82½\81D", Shk_Your(buf, obj));
1831         else
1832 /*JP
1833             You("snuff out %s.", yname(obj));
1834 */
1835             You("%s\82ð\90\81\82«\8fÁ\82µ\82½\81D", xname(obj));
1836         end_burn(obj, TRUE);
1837         return;
1838     }
1839     if (Underwater) {
1840 #if 0 /*JP*/
1841         pline(!Is_candle(obj) ? "This is not a diving lamp"
1842                               : "Sorry, fire and water don't mix.");
1843 #else
1844         pline(!Is_candle(obj) ? "\82±\82ê\82Í\90ö\90\85\97p\82Ì\83\89\83\93\83v\82\82á\82È\82¢\81D"
1845                               : "\8ec\94O\82È\82ª\82ç\81C\89Î\82Æ\90\85\82Í\82Ü\82´\82ç\82È\82¢\81D");
1846 #endif
1847         return;
1848     }
1849     /* magic lamps with an spe == 0 (wished for) cannot be lit */
1850     if ((!Is_candle(obj) && obj->age == 0)
1851         || (obj->otyp == MAGIC_LAMP && obj->spe == 0)) {
1852         if (obj->otyp == BRASS_LANTERN)
1853 /*JP
1854             Your("lamp has run out of power.");
1855 */
1856             Your("\83\89\83\93\83v\82Ì\93d\97Í\82ð\8eg\82¢\90Ø\82Á\82Ä\82µ\82Ü\82Á\82½\81D");
1857         else
1858 /*JP
1859             pline("This %s has no oil.", xname(obj));
1860 */
1861             pline("\82±\82Ì%s\82É\82Í\82à\82¤\83I\83C\83\8b\82ª\82È\82¢\81D", xname(obj));
1862         return;
1863     }
1864     if (obj->cursed && !rn2(2)) {
1865         if (!Blind)
1866 #if 0 /*JP*/
1867             pline("%s for a moment, then %s.", Tobjnam(obj, "flicker"),
1868                   otense(obj, "die"));
1869 #else
1870             pline("%s\82Í\82µ\82Î\82ç\82­\82Ì\8aÔ\93_\96Å\82µ\81C\8fÁ\82¦\82½\81D",
1871                   xname(obj));
1872 #endif
1873     } else {
1874         if (obj->otyp == OIL_LAMP || obj->otyp == MAGIC_LAMP
1875             || obj->otyp == BRASS_LANTERN) {
1876             check_unpaid(obj);
1877 /*JP
1878             pline("%slamp is now on.", Shk_Your(buf, obj));
1879 */
1880             pline("%s\83\89\83\93\83v\82É\93\94\82ª\93\94\82Á\82½\81D", Shk_Your(buf, obj));
1881         } else { /* candle(s) */
1882 #if 0 /*JP*/
1883             pline("%s flame%s %s%s", s_suffix(Yname2(obj)), plur(obj->quan),
1884                   otense(obj, "burn"), Blind ? "." : " brightly!");
1885 #else
1886             pline("%s\82Í%s\94R\82¦\82 \82ª\82Á\82½\81I",
1887                   xname(obj), Blind ? "" : "\96¾\82é\82­");
1888 #endif
1889             if (obj->unpaid && costly_spot(u.ux, u.uy)
1890                 && obj->age == 20L * (long) objects[obj->otyp].oc_cost) {
1891 #if 0 /*JP*/
1892                 const char *ithem = (obj->quan > 1L) ? "them" : "it";
1893
1894                 verbalize("You burn %s, you bought %s!", ithem, ithem);
1895 #else
1896                 verbalize("\93\94\82ð\82Â\82¯\82½\82È\82ç\81C\94\83\82Á\82Ä\82à\82ç\82¨\82¤\81I");
1897 #endif
1898                 bill_dummy_object(obj);
1899             }
1900         }
1901         begin_burn(obj, FALSE);
1902     }
1903 }
1904
1905 STATIC_OVL void
1906 light_cocktail(optr)
1907 struct obj **optr;
1908 {
1909     struct obj *obj = *optr; /* obj is a potion of oil */
1910     char buf[BUFSZ];
1911     boolean split1off;
1912
1913     if (u.uswallow) {
1914         You(no_elbow_room);
1915         return;
1916     }
1917
1918     if (obj->lamplit) {
1919 /*JP
1920         You("snuff the lit potion.");
1921 */
1922         You("\96û\95r\82Ì\89Î\82ð\90\81\82«\8fÁ\82µ\82½\81D");
1923         end_burn(obj, TRUE);
1924         /*
1925          * Free & add to re-merge potion.  This will average the
1926          * age of the potions.  Not exactly the best solution,
1927          * but its easy.
1928          */
1929         freeinv(obj);
1930         *optr = addinv(obj);
1931         return;
1932     } else if (Underwater) {
1933 /*JP
1934         There("is not enough oxygen to sustain a fire.");
1935 */
1936         pline("\89Î\82ð\82Â\82¯\82é\82Ì\82É\8f\\95ª\82È\8e_\91f\82ª\82È\82¢\81D");
1937         return;
1938     }
1939
1940     split1off = (obj->quan > 1L);
1941     if (split1off)
1942         obj = splitobj(obj, 1L);
1943
1944 #if 0 /*JP*/
1945     You("light %spotion.%s", shk_your(buf, obj),
1946         Blind ? "" : "  It gives off a dim light.");
1947 #else
1948     You("%s\96û\95r\82É\89Î\82ð\82Â\82¯\82½\81D%s", shk_your(buf, obj),
1949         Blind ? "" : "\96û\95r\82Í\88Ã\82¢\8cõ\82ð\82Í\82È\82Á\82½\81D");
1950 #endif
1951
1952     if (obj->unpaid && costly_spot(u.ux, u.uy)) {
1953         /* Normally, we shouldn't both partially and fully charge
1954          * for an item, but (Yendorian Fuel) Taxes are inevitable...
1955          */
1956         check_unpaid(obj);
1957 /*JP
1958         verbalize("That's in addition to the cost of the potion, of course.");
1959 */
1960         verbalize("\82±\82ê\82Í\82à\82¿\82ë\82ñ\96û\95r\82Ì\92l\92i\82Æ\82Í\95Ê\82¾\82æ\81D");
1961         bill_dummy_object(obj);
1962     }
1963     makeknown(obj->otyp);
1964
1965     begin_burn(obj, FALSE); /* after shop billing */
1966     if (split1off) {
1967         obj_extract_self(obj); /* free from inv */
1968         obj->nomerge = 1;
1969 /*JP
1970         obj = hold_another_object(obj, "You drop %s!", doname(obj),
1971 */
1972         obj = hold_another_object(obj, "\82 \82È\82½\82Í%s\82ð\97\8e\82µ\82½\81I", doname(obj),
1973                                   (const char *) 0);
1974         if (obj)
1975             obj->nomerge = 0;
1976     }
1977     *optr = obj;
1978 }
1979
1980 static NEARDATA const char cuddly[] = { TOOL_CLASS, GEM_CLASS, 0 };
1981
1982 int
1983 dorub()
1984 {
1985     struct obj *obj = getobj(cuddly, "rub");
1986
1987     if (obj && obj->oclass == GEM_CLASS) {
1988         if (is_graystone(obj)) {
1989             use_stone(obj);
1990             return 1;
1991         } else {
1992 /*JP
1993             pline("Sorry, I don't know how to use that.");
1994 */
1995             pline("\8ec\94O\81D\8eg\82¢\95û\82ª\82í\82©\82ç\82È\82¢\81D");
1996             return 0;
1997         }
1998     }
1999
2000     if (!obj || !wield_tool(obj, "rub"))
2001         return 0;
2002
2003     /* now uwep is obj */
2004     if (uwep->otyp == MAGIC_LAMP) {
2005         if (uwep->spe > 0 && !rn2(3)) {
2006             check_unpaid_usage(uwep, TRUE); /* unusual item use */
2007             /* bones preparation:  perform the lamp transformation
2008                before releasing the djinni in case the latter turns out
2009                to be fatal (a hostile djinni has no chance to attack yet,
2010                but an indebted one who grants a wish might bestow an
2011                artifact which blasts the hero with lethal results) */
2012             uwep->otyp = OIL_LAMP;
2013             uwep->spe = 0; /* for safety */
2014             uwep->age = rn1(500, 1000);
2015             if (uwep->lamplit)
2016                 begin_burn(uwep, TRUE);
2017             djinni_from_bottle(uwep);
2018             makeknown(MAGIC_LAMP);
2019             update_inventory();
2020         } else if (rn2(2)) {
2021 /*JP
2022             You("%s smoke.", !Blind ? "see a puff of" : "smell");
2023 */
2024             pline("\82¯\82Þ\82è%s\81D", !Blind ? "\82ª\95\91\82¢\82 \82ª\82Á\82½" : "\82Ì\93õ\82¢\82ª\82µ\82½");
2025         } else
2026             pline1(nothing_happens);
2027     } else if (obj->otyp == BRASS_LANTERN) {
2028         /* message from Adventure */
2029 /*JP
2030         pline("Rubbing the electric lamp is not particularly rewarding.");
2031 */
2032         pline("\93d\8bC\83\89\83\93\83v\82ð\82±\82·\82Á\82Ä\82à\88Ó\96¡\82Í\82È\82¢\82Æ\8ev\82¤\82ª\81D\81D\81D");
2033 /*JP
2034         pline("Anyway, nothing exciting happens.");
2035 */
2036         pline("\82â\82Á\82Ï\82è\81C\89½\82à\8bN\82«\82È\82©\82Á\82½\81D");
2037     } else
2038         pline1(nothing_happens);
2039     return 1;
2040 }
2041
2042 int
2043 dojump()
2044 {
2045     /* Physical jump */
2046     return jump(0);
2047 }
2048
2049 enum jump_trajectory {
2050     jAny  = 0, /* any direction => magical jump */
2051     jHorz = 1,
2052     jVert = 2,
2053     jDiag = 3  /* jHorz|jVert */
2054 };
2055
2056 /* callback routine for walk_path() */
2057 STATIC_PTR boolean
2058 check_jump(arg, x, y)
2059 genericptr arg;
2060 int x, y;
2061 {
2062     int traj = *(int *) arg;
2063     struct rm *lev = &levl[x][y];
2064
2065     if (Passes_walls)
2066         return TRUE;
2067     if (IS_STWALL(lev->typ))
2068         return FALSE;
2069     if (IS_DOOR(lev->typ)) {
2070         if (closed_door(x, y))
2071             return FALSE;
2072         if ((lev->doormask & D_ISOPEN) != 0 && traj != jAny
2073             /* reject diagonal jump into or out-of or through open door */
2074             && (traj == jDiag
2075                 /* reject horizontal jump through horizontal open door
2076                    and non-horizontal (ie, vertical) jump through
2077                    non-horizontal (vertical) open door */
2078                 || ((traj & jHorz) != 0) == (lev->horizontal != 0)))
2079             return FALSE;
2080         /* empty doorways aren't restricted */
2081     }
2082     /* let giants jump over boulders (what about Flying?
2083        and is there really enough head room for giants to jump
2084        at all, let alone over something tall?) */
2085     if (sobj_at(BOULDER, x, y) && !throws_rocks(youmonst.data))
2086         return FALSE;
2087     return TRUE;
2088 }
2089
2090 STATIC_OVL boolean
2091 is_valid_jump_pos(x, y, magic, showmsg)
2092 int x, y, magic;
2093 boolean showmsg;
2094 {
2095     if (!magic && !(HJumping & ~INTRINSIC) && !EJumping && distu(x, y) != 5) {
2096         /* The Knight jumping restriction still applies when riding a
2097          * horse.  After all, what shape is the knight piece in chess?
2098          */
2099         if (showmsg)
2100 /*JP
2101             pline("Illegal move!");
2102 */
2103             pline("\82»\82Ì\88Ú\93®\82Í\8cj\94n\92µ\82Ñ\82\82á\82È\82¢\81I");
2104         return FALSE;
2105     } else if (distu(x, y) > (magic ? 6 + magic * 3 : 9)) {
2106         if (showmsg)
2107 /*JP
2108             pline("Too far!");
2109 */
2110             pline("\89\93\82·\82¬\82é\81I");
2111         return FALSE;
2112     } else if (!isok(x, y)) {
2113         if (showmsg)
2114 /*JP
2115             You("cannot jump there!");
2116 */
2117             You("\82»\82±\82É\82Í\94ò\82×\82È\82¢\81I");
2118         return FALSE;
2119     } else if (!cansee(x, y)) {
2120         if (showmsg)
2121 /*JP
2122             You("cannot see where to land!");
2123 */
2124             You("\92\85\92n\93_\82ª\8c©\82¦\82È\82¢\81I");
2125         return FALSE;
2126     } else {
2127         coord uc, tc;
2128         struct rm *lev = &levl[u.ux][u.uy];
2129         /* we want to categorize trajectory for use in determining
2130            passage through doorways: horizonal, vertical, or diagonal;
2131            since knight's jump and other irregular directions are
2132            possible, we flatten those out to simplify door checks */
2133         int diag, traj,
2134             dx = x - u.ux, dy = y - u.uy,
2135             ax = abs(dx), ay = abs(dy);
2136
2137         /* diag: any non-orthogonal destination classifed as diagonal */
2138         diag = (magic || Passes_walls || (!dx && !dy)) ? jAny
2139                : !dy ? jHorz : !dx ? jVert : jDiag;
2140         /* traj: flatten out the trajectory => some diagonals re-classified */
2141         if (ax >= 2 * ay)
2142             ay = 0;
2143         else if (ay >= 2 * ax)
2144             ax = 0;
2145         traj = (magic || Passes_walls || (!ax && !ay)) ? jAny
2146                : !ay ? jHorz : !ax ? jVert : jDiag;
2147         /* walk_path doesn't process the starting spot;
2148            this is iffy:  if you're starting on a closed door spot,
2149            you _can_ jump diagonally from doorway (without needing
2150            Passes_walls); that's intentional but is it correct? */
2151         if (diag == jDiag && IS_DOOR(lev->typ)
2152             && (lev->doormask & D_ISOPEN) != 0
2153             && (traj == jDiag
2154                 || ((traj & jHorz) != 0) == (lev->horizontal != 0))) {
2155             if (showmsg)
2156 /*JP
2157                 You_cant("jump diagonally out of a doorway.");
2158 */
2159                 You_cant("\8fo\93ü\82è\8cû\82©\82ç\8eÎ\82ß\82É\94ò\82Ñ\8fo\82·\82±\82Æ\82Í\82Å\82«\82È\82¢\81D");
2160             return FALSE;
2161         }
2162         uc.x = u.ux, uc.y = u.uy;
2163         tc.x = x, tc.y = y; /* target */
2164         if (!walk_path(&uc, &tc, check_jump, (genericptr_t) &traj)) {
2165             if (showmsg)
2166 /*JP
2167                 There("is an obstacle preventing that jump.");
2168 */
2169                 pline("\94ò\82Ô\82Ì\82ð\8e×\96\82\82·\82é\89½\82©\82ª\82 \82é\81D");
2170             return FALSE;
2171         }
2172     }
2173     return TRUE;
2174 }
2175
2176 static int jumping_is_magic;
2177
2178 STATIC_OVL boolean
2179 get_valid_jump_position(x,y)
2180 int x,y;
2181 {
2182     return (isok(x, y)
2183             && (ACCESSIBLE(levl[x][y].typ) || Passes_walls)
2184             && is_valid_jump_pos(x, y, jumping_is_magic, FALSE));
2185 }
2186
2187 void
2188 display_jump_positions(state)
2189 int state;
2190 {
2191     if (state == 0) {
2192         tmp_at(DISP_BEAM, cmap_to_glyph(S_goodpos));
2193     } else if (state == 1) {
2194         int x, y, dx, dy;
2195
2196         for (dx = -4; dx <= 4; dx++)
2197             for (dy = -4; dy <= 4; dy++) {
2198                 x = dx + (int) u.ux;
2199                 y = dy + (int) u.uy;
2200                 if (get_valid_jump_position(x, y))
2201                     tmp_at(x, y);
2202             }
2203     } else {
2204         tmp_at(DISP_END, 0);
2205     }
2206 }
2207
2208 int
2209 jump(magic)
2210 int magic; /* 0=Physical, otherwise skill level */
2211 {
2212     coord cc;
2213
2214     /* attempt "jumping" spell if hero has no innate jumping ability */
2215     if (!magic && !Jumping) {
2216         int sp_no;
2217
2218         for (sp_no = 0; sp_no < MAXSPELL; ++sp_no)
2219             if (spl_book[sp_no].sp_id == NO_SPELL)
2220                 break;
2221             else if (spl_book[sp_no].sp_id == SPE_JUMPING)
2222                 return spelleffects(sp_no, FALSE);
2223     }
2224
2225     if (!magic && (nolimbs(youmonst.data) || slithy(youmonst.data))) {
2226         /* normally (nolimbs || slithy) implies !Jumping,
2227            but that isn't necessarily the case for knights */
2228 /*JP
2229         You_cant("jump; you have no legs!");
2230 */
2231         pline("\91«\82ª\96³\82­\82Ä\82Í\92µ\82×\82È\82¢\81I");
2232         return 0;
2233     } else if (!magic && !Jumping) {
2234 /*JP
2235         You_cant("jump very far.");
2236 */
2237         You_cant("\82»\82ñ\82È\89\93\82­\82Ü\82Å\92µ\82×\82È\82¢\81D");
2238         return 0;
2239     /* if steed is immobile, can't do physical jump but can do spell one */
2240     } else if (!magic && u.usteed && stucksteed(FALSE)) {
2241         /* stucksteed gave "<steed> won't move" message */
2242         return 0;
2243     } else if (u.uswallow) {
2244         if (magic) {
2245 /*JP
2246             You("bounce around a little.");
2247 */
2248             pline("\94½\93®\82ð\82Â\82¯\82½\81D");
2249             return 1;
2250         }
2251 /*JP
2252         pline("You've got to be kidding!");
2253 */
2254         pline("\8fç\92k\82Í\82æ\82µ\82±\82³\82ñ\81I");
2255         return 0;
2256     } else if (u.uinwater) {
2257         if (magic) {
2258 /*JP
2259             You("swish around a little.");
2260 */
2261             pline("\83X\83C\83X\83C\82Æ\89j\82¢\82¾\81D");
2262             return 1;
2263         }
2264 /*JP
2265         pline("This calls for swimming, not jumping!");
2266 */
2267         pline("\82»\82ê\82Í\81w\89j\82®\81x\82Å\82 \82Á\82Ä\81C\81w\92µ\82Ô\81x\82\82á\82È\82¢\81I");
2268         return 0;
2269     } else if (u.ustuck) {
2270         if (u.ustuck->mtame && !Conflict && !u.ustuck->mconf) {
2271 /*JP
2272             You("pull free from %s.", mon_nam(u.ustuck));
2273 */
2274             You("%s\82©\82ç\97£\82ê\82½\81D", mon_nam(u.ustuck));
2275             u.ustuck = 0;
2276             return 1;
2277         }
2278         if (magic) {
2279 /*JP
2280             You("writhe a little in the grasp of %s!", mon_nam(u.ustuck));
2281 */
2282             You("%s\82©\82ç\93¦\82ê\82æ\82¤\82Æ\83W\83^\83o\83^\82µ\82½\81I", mon_nam(u.ustuck));
2283             return 1;
2284         }
2285 /*JP
2286         You("cannot escape from %s!", mon_nam(u.ustuck));
2287 */
2288         You("%s\82©\82ç\93¦\82ê\82ç\82ê\82È\82¢\81I", mon_nam(u.ustuck));
2289         return 0;
2290     } else if (Levitation || Is_airlevel(&u.uz) || Is_waterlevel(&u.uz)) {
2291         if (magic) {
2292 /*JP
2293             You("flail around a little.");
2294 */
2295             You("\83o\83^\83o\83^\92µ\82ñ\82¾\81D");
2296             return 1;
2297         }
2298 /*JP
2299         You("don't have enough traction to jump.");
2300 */
2301         You("\92µ\82Ô\82½\82ß\82Ì\94½\93®\82ª\82Â\82¯\82ç\82ê\82È\82¢\81D");
2302         return 0;
2303     } else if (!magic && near_capacity() > UNENCUMBERED) {
2304 /*JP
2305         You("are carrying too much to jump!");
2306 */
2307         You("\82½\82­\82³\82ñ\95¨\82ð\8e\9d\82¿\82·\82¬\82Ä\92µ\82×\82È\82¢\81I");
2308         return 0;
2309     } else if (!magic && (u.uhunger <= 100 || ACURR(A_STR) < 6)) {
2310 /*JP
2311         You("lack the strength to jump!");
2312 */
2313         You("\92µ\82Ô\82¾\82¯\82Ì\97Í\82ª\82È\82¢\81I");
2314         return 0;
2315     } else if (!magic && Wounded_legs) {
2316         long wl = (Wounded_legs & BOTH_SIDES);
2317         const char *bp = body_part(LEG);
2318
2319         if (wl == BOTH_SIDES)
2320             bp = makeplural(bp);
2321         if (u.usteed)
2322 /*JP
2323             pline("%s is in no shape for jumping.", Monnam(u.usteed));
2324 */
2325             pline("%s\82Í\92µ\82×\82é\8fó\91Ô\82Å\82Í\82È\82¢\81D", Monnam(u.usteed));
2326         else
2327 #if 0 /*JP*/
2328             Your("%s%s %s in no shape for jumping.",
2329                  (wl == LEFT_SIDE) ? "left " : (wl == RIGHT_SIDE) ? "right "
2330                                                                   : "",
2331                  bp, (wl == BOTH_SIDES) ? "are" : "is");
2332 #else
2333           Your("%s%s\82Í\92µ\82×\82é\8fó\91Ô\82Å\82Í\82È\82¢\81D",
2334                  (wl == LEFT_SIDE) ? "\8d¶" :
2335                  (wl == RIGHT_SIDE) ? "\89E" : "", bp);
2336 #endif
2337         return 0;
2338     } else if (u.usteed && u.utrap) {
2339 /*JP
2340         pline("%s is stuck in a trap.", Monnam(u.usteed));
2341 */
2342         pline("%s\82Íã©\82É\82Ð\82Á\82©\82©\82Á\82Ä\82¢\82é\81D", Monnam(u.usteed));
2343         return 0;
2344     }
2345
2346 /*JP
2347     pline("Where do you want to jump?");
2348 */
2349     pline("\82Ç\82±\82É\92µ\82Ñ\82Ü\82·\82©\81H");
2350     cc.x = u.ux;
2351     cc.y = u.uy;
2352     jumping_is_magic = magic;
2353     getpos_sethilite(display_jump_positions, get_valid_jump_position);
2354 /*JP
2355     if (getpos(&cc, TRUE, "the desired position") < 0)
2356 */
2357     if (getpos(&cc, TRUE, "\92µ\82Ñ\82½\82¢\8fê\8f\8a") < 0)
2358         return 0; /* user pressed ESC */
2359     if (!is_valid_jump_pos(cc.x, cc.y, magic, TRUE)) {
2360         return 0;
2361     } else {
2362         coord uc;
2363         int range, temp;
2364
2365         if (u.utrap)
2366             switch (u.utraptype) {
2367             case TT_BEARTRAP: {
2368                 long side = rn2(3) ? LEFT_SIDE : RIGHT_SIDE;
2369
2370 /*JP
2371                 You("rip yourself free of the bear trap!  Ouch!");
2372 */
2373                 You("\8e©\95ª\82ð\8cF\82Ìã©\82©\82ç\82Ð\82«\82Í\82ª\82µ\82½\81C\82¢\82Ä\82Á\81I");
2374 /*JP
2375                 losehp(Maybe_Half_Phys(rnd(10)), "jumping out of a bear trap",
2376 */
2377                 losehp(Maybe_Half_Phys(rnd(10)), "\8cF\82Ìã©\82©\82ç\94ò\82Ñ\8fo\82æ\82¤\82Æ\82µ\82Ä",
2378                        KILLED_BY);
2379                 set_wounded_legs(side, rn1(1000, 500));
2380                 break;
2381             }
2382             case TT_PIT:
2383 /*JP
2384                 You("leap from the pit!");
2385 */
2386                 You("\97\8e\82µ\8c\8a\82©\82ç\94ò\82Ñ\8fo\82½\81I");
2387                 break;
2388             case TT_WEB:
2389 /*JP
2390                 You("tear the web apart as you pull yourself free!");
2391 */
2392                 You("\82­\82à\82Ì\91\83\82ð\88ø\82«\97ô\82«\81C\8e©\97R\82É\82È\82Á\82½\81I");
2393                 deltrap(t_at(u.ux, u.uy));
2394                 break;
2395             case TT_LAVA:
2396 /*JP
2397                 You("pull yourself above the %s!", hliquid("lava"));
2398 */
2399                 You("%s\82©\82ç\94ò\82Ñ\8fo\82½\81I", hliquid("\97n\8aâ"));
2400                 u.utrap = 0;
2401                 return 1;
2402             case TT_BURIEDBALL:
2403             case TT_INFLOOR:
2404 #if 0 /*JP*/
2405                 You("strain your %s, but you're still %s.",
2406                     makeplural(body_part(LEG)),
2407                     (u.utraptype == TT_INFLOOR)
2408                         ? "stuck in the floor"
2409                         : "attached to the buried ball");
2410 #else
2411                 You("%s\82ð\88ø\82Á\82Ï\82Á\82½\82ª\81C\82 \82È\82½\82Í\82Ü\82¾%s\81D",
2412                     makeplural(body_part(LEG)),
2413                     (u.utraptype == TT_INFLOOR)
2414                         ? "\8f°\82É\82¤\82Ü\82Á\82Ä\82¢\82é"
2415                         : "\82¤\82Ü\82Á\82½\8b\85\82Æ\82Â\82È\82ª\82Á\82Ä\82¢\82é");
2416 #endif
2417                 set_wounded_legs(LEFT_SIDE, rn1(10, 11));
2418                 set_wounded_legs(RIGHT_SIDE, rn1(10, 11));
2419                 return 1;
2420             }
2421
2422         /*
2423          * Check the path from uc to cc, calling hurtle_step at each
2424          * location.  The final position actually reached will be
2425          * in cc.
2426          */
2427         uc.x = u.ux;
2428         uc.y = u.uy;
2429         /* calculate max(abs(dx), abs(dy)) as the range */
2430         range = cc.x - uc.x;
2431         if (range < 0)
2432             range = -range;
2433         temp = cc.y - uc.y;
2434         if (temp < 0)
2435             temp = -temp;
2436         if (range < temp)
2437             range = temp;
2438         (void) walk_path(&uc, &cc, hurtle_jump, (genericptr_t) &range);
2439         /* hurtle_jump -> hurtle_step results in <u.ux,u.uy> == <cc.x,cc.y>
2440          * and usually moves the ball if punished, but does not handle all
2441          * the effects of landing on the final position.
2442          */
2443         teleds(cc.x, cc.y, FALSE);
2444         sokoban_guilt();
2445         nomul(-1);
2446 /*JP
2447         multi_reason = "jumping around";
2448 */
2449         multi_reason = "\92µ\82Ë\89ñ\82Á\82Ä\82¢\82é\8e\9e\82É";
2450         nomovemsg = "";
2451         morehungry(rnd(25));
2452         return 1;
2453     }
2454 }
2455
2456 boolean
2457 tinnable(corpse)
2458 struct obj *corpse;
2459 {
2460     if (corpse->oeaten)
2461         return 0;
2462     if (!mons[corpse->corpsenm].cnutrit)
2463         return 0;
2464     return 1;
2465 }
2466
2467 STATIC_OVL void
2468 use_tinning_kit(obj)
2469 struct obj *obj;
2470 {
2471     struct obj *corpse, *can;
2472
2473     /* This takes only 1 move.  If this is to be changed to take many
2474      * moves, we've got to deal with decaying corpses...
2475      */
2476     if (obj->spe <= 0) {
2477 /*JP
2478         You("seem to be out of tins.");
2479 */
2480         pline("\8aÊ\8bl\82ð\8dì\82é\82½\82ß\82Ì\8aÊ\82ª\90Ø\82ê\82½\82æ\82¤\82¾\81D");
2481         return;
2482     }
2483     if (!(corpse = floorfood("tin", 2)))
2484         return;
2485     if (corpse->oeaten) {
2486 /*JP
2487         You("cannot tin %s which is partly eaten.", something);
2488 */
2489         You("\90H\82×\82©\82¯\82Ì\82à\82Ì\82ð\8aÊ\8bl\82É\82·\82é\82±\82Æ\82Í\82Å\82«\82È\82¢\81D");
2490         return;
2491     }
2492     if (touch_petrifies(&mons[corpse->corpsenm]) && !Stone_resistance
2493         && !uarmg) {
2494         char kbuf[BUFSZ];
2495
2496         if (poly_when_stoned(youmonst.data))
2497 #if 0 /*JP*/
2498             You("tin %s without wearing gloves.",
2499                 an(mons[corpse->corpsenm].mname));
2500 #else
2501             You("\8f¬\8eè\82È\82µ\82Å%s\82ð\8aÊ\8bl\82É\82µ\82æ\82¤\82Æ\82µ\82½\81D",
2502                 mons[corpse->corpsenm].mname);
2503 #endif
2504         else {
2505 #if 0 /*JP*/
2506             pline("Tinning %s without wearing gloves is a fatal mistake...",
2507                   an(mons[corpse->corpsenm].mname));
2508 #else
2509             pline("%s\82ð\8f¬\8eè\82È\82µ\82Å\8aÊ\8bl\82É\82·\82é\82Ì\82Í\92v\96½\93I\82È\8aÔ\88á\82¢\82¾\81D\81D\81D",
2510                   mons[corpse->corpsenm].mname);
2511 #endif
2512 #if 0 /*JP*/
2513             Sprintf(kbuf, "trying to tin %s without gloves",
2514                     an(mons[corpse->corpsenm].mname));
2515 #else
2516             Sprintf(kbuf, "\8f¬\8eè\82ð\82Â\82¯\82¸\82É%s\82ð\8aÊ\8bl\82É\82µ\82æ\82¤\82Æ\82µ\82Ä",
2517                     mons[corpse->corpsenm].mname);
2518 #endif
2519         }
2520         instapetrify(kbuf);
2521     }
2522     if (is_rider(&mons[corpse->corpsenm])) {
2523         if (revive_corpse(corpse))
2524 /*JP
2525             verbalize("Yes...  But War does not preserve its enemies...");
2526 */
2527             verbalize("\82»\82¤\82¾\81D\81D\81D\82µ\82©\82µ\81u\90í\91\88\81v\82Í\93G\82É\88À\82ç\82¬\82ð\97^\82¦\82Ê\81D\81D\81D");
2528         else
2529 /*JP
2530             pline_The("corpse evades your grasp.");
2531 */
2532             pline("\8e\80\91Ì\82Í\82 \82È\82½\82Ì\8eè\82ð\93¦\82ê\82½\81D");
2533         return;
2534     }
2535     if (mons[corpse->corpsenm].cnutrit == 0) {
2536 /*JP
2537         pline("That's too insubstantial to tin.");
2538 */
2539         pline("\8eÀ\91Ì\82ª\82È\82¢\82Ì\82Å\8aÊ\8bl\82É\82Å\82«\82È\82¢\81D");
2540         return;
2541     }
2542     consume_obj_charge(obj, TRUE);
2543
2544     if ((can = mksobj(TIN, FALSE, FALSE)) != 0) {
2545 /*JP
2546         static const char you_buy_it[] = "You tin it, you bought it!";
2547 */
2548         static const char you_buy_it[] = "\8aÊ\8bl\82É\82µ\82½\82Ì\82È\82ç\94\83\82Á\82Ä\82à\82ç\82¤\82æ\81I";
2549
2550         can->corpsenm = corpse->corpsenm;
2551         can->cursed = obj->cursed;
2552         can->blessed = obj->blessed;
2553         can->owt = weight(can);
2554         can->known = 1;
2555         /* Mark tinned tins. No spinach allowed... */
2556         set_tin_variety(can, HOMEMADE_TIN);
2557         if (carried(corpse)) {
2558             if (corpse->unpaid)
2559                 verbalize(you_buy_it);
2560             useup(corpse);
2561         } else {
2562             if (costly_spot(corpse->ox, corpse->oy) && !corpse->no_charge)
2563                 verbalize(you_buy_it);
2564             useupf(corpse, 1L);
2565         }
2566 #if 0 /*JP*/
2567         (void) hold_another_object(can, "You make, but cannot pick up, %s.",
2568                                    doname(can), (const char *) 0);
2569 #else
2570         (void) hold_another_object(can, "\8aÊ\8bl\82É\82Å\82«\82½\82ª\81C%s\82ð\8e\9d\82Â\82±\82Æ\82ª\82Å\82«\82È\82¢\81D",
2571                                    doname(can), (const char *) 0);
2572 #endif
2573     } else
2574         impossible("Tinning failed.");
2575 }
2576
2577 void
2578 use_unicorn_horn(obj)
2579 struct obj *obj;
2580 {
2581 #define PROP_COUNT 7           /* number of properties we're dealing with */
2582 #define ATTR_COUNT (A_MAX * 3) /* number of attribute points we might fix */
2583     int idx, val, val_limit, trouble_count, unfixable_trbl, did_prop,
2584         did_attr;
2585     int trouble_list[PROP_COUNT + ATTR_COUNT];
2586
2587     if (obj && obj->cursed) {
2588         long lcount = (long) rn1(90, 10);
2589
2590         switch (rn2(13) / 2) { /* case 6 is half as likely as the others */
2591         case 0:
2592             make_sick((Sick & TIMEOUT) ? (Sick & TIMEOUT) / 3L + 1L
2593                                        : (long) rn1(ACURR(A_CON), 20),
2594                       xname(obj), TRUE, SICK_NONVOMITABLE);
2595             break;
2596         case 1:
2597             make_blinded((Blinded & TIMEOUT) + lcount, TRUE);
2598             break;
2599         case 2:
2600             if (!Confusion)
2601 #if 0 /*JP*/
2602                 You("suddenly feel %s.",
2603                     Hallucination ? "trippy" : "confused");
2604 #else
2605                 You("\93Ë\91R%s\81D",
2606                     Hallucination ? "\82Ö\82ë\82Ö\82ë\82É\82È\82Á\82½" : "\8d¬\97\90\82µ\82½");
2607 #endif
2608             make_confused((HConfusion & TIMEOUT) + lcount, TRUE);
2609             break;
2610         case 3:
2611             make_stunned((HStun & TIMEOUT) + lcount, TRUE);
2612             break;
2613         case 4:
2614             (void) adjattrib(rn2(A_MAX), -1, FALSE);
2615             break;
2616         case 5:
2617             (void) make_hallucinated((HHallucination & TIMEOUT) + lcount,
2618                                      TRUE, 0L);
2619             break;
2620         case 6:
2621             if (Deaf) /* make_deaf() won't give feedback when already deaf */
2622 /*JP
2623                 pline("Nothing seems to happen.");
2624 */
2625                 pline("\89½\82à\8bN\82«\82È\82©\82Á\82½\82æ\82¤\82¾\81D");
2626             make_deaf((HDeaf & TIMEOUT) + lcount, TRUE);
2627             context.botl = TRUE;
2628             break;
2629         }
2630         return;
2631     }
2632
2633 /*
2634  * Entries in the trouble list use a very simple encoding scheme.
2635  */
2636 #define prop2trbl(X) ((X) + A_MAX)
2637 #define attr2trbl(Y) (Y)
2638 #define prop_trouble(X) trouble_list[trouble_count++] = prop2trbl(X)
2639 #define attr_trouble(Y) trouble_list[trouble_count++] = attr2trbl(Y)
2640 #define TimedTrouble(P) (((P) && !((P) & ~TIMEOUT)) ? ((P) & TIMEOUT) : 0L)
2641
2642     trouble_count = unfixable_trbl = did_prop = did_attr = 0;
2643
2644     /* collect property troubles */
2645     if (TimedTrouble(Sick))
2646         prop_trouble(SICK);
2647     if (TimedTrouble(Blinded) > (long) u.ucreamed
2648         && !(u.uswallow
2649              && attacktype_fordmg(u.ustuck->data, AT_ENGL, AD_BLND)))
2650         prop_trouble(BLINDED);
2651     if (TimedTrouble(HHallucination))
2652         prop_trouble(HALLUC);
2653     if (TimedTrouble(Vomiting))
2654         prop_trouble(VOMITING);
2655     if (TimedTrouble(HConfusion))
2656         prop_trouble(CONFUSION);
2657     if (TimedTrouble(HStun))
2658         prop_trouble(STUNNED);
2659     if (TimedTrouble(HDeaf))
2660         prop_trouble(DEAF);
2661
2662     unfixable_trbl = unfixable_trouble_count(TRUE);
2663
2664     /* collect attribute troubles */
2665     for (idx = 0; idx < A_MAX; idx++) {
2666         if (ABASE(idx) >= AMAX(idx))
2667             continue;
2668         val_limit = AMAX(idx);
2669         /* this used to adjust 'val_limit' for A_STR when u.uhs was
2670            WEAK or worse, but that's handled via ATEMP(A_STR) now */
2671         if (Fixed_abil) {
2672             /* potion/spell of restore ability override sustain ability
2673                intrinsic but unicorn horn usage doesn't */
2674             unfixable_trbl += val_limit - ABASE(idx);
2675             continue;
2676         }
2677         /* don't recover more than 3 points worth of any attribute */
2678         if (val_limit > ABASE(idx) + 3)
2679             val_limit = ABASE(idx) + 3;
2680
2681         for (val = ABASE(idx); val < val_limit; val++)
2682             attr_trouble(idx);
2683         /* keep track of unfixed trouble, for message adjustment below */
2684         unfixable_trbl += (AMAX(idx) - val_limit);
2685     }
2686
2687     if (trouble_count == 0) {
2688         pline1(nothing_happens);
2689         return;
2690     } else if (trouble_count > 1) { /* shuffle */
2691         int i, j, k;
2692
2693         for (i = trouble_count - 1; i > 0; i--)
2694             if ((j = rn2(i + 1)) != i) {
2695                 k = trouble_list[j];
2696                 trouble_list[j] = trouble_list[i];
2697                 trouble_list[i] = k;
2698             }
2699     }
2700
2701     /*
2702      *  Chances for number of troubles to be fixed
2703      *               0      1      2      3      4      5      6      7
2704      *   blessed:  22.7%  22.7%  19.5%  15.4%  10.7%   5.7%   2.6%   0.8%
2705      *  uncursed:  35.4%  35.4%  22.9%   6.3%    0      0      0      0
2706      */
2707     val_limit = rn2(d(2, (obj && obj->blessed) ? 4 : 2));
2708     if (val_limit > trouble_count)
2709         val_limit = trouble_count;
2710
2711     /* fix [some of] the troubles */
2712     for (val = 0; val < val_limit; val++) {
2713         idx = trouble_list[val];
2714
2715         switch (idx) {
2716         case prop2trbl(SICK):
2717             make_sick(0L, (char *) 0, TRUE, SICK_ALL);
2718             did_prop++;
2719             break;
2720         case prop2trbl(BLINDED):
2721             make_blinded((long) u.ucreamed, TRUE);
2722             did_prop++;
2723             break;
2724         case prop2trbl(HALLUC):
2725             (void) make_hallucinated(0L, TRUE, 0L);
2726             did_prop++;
2727             break;
2728         case prop2trbl(VOMITING):
2729             make_vomiting(0L, TRUE);
2730             did_prop++;
2731             break;
2732         case prop2trbl(CONFUSION):
2733             make_confused(0L, TRUE);
2734             did_prop++;
2735             break;
2736         case prop2trbl(STUNNED):
2737             make_stunned(0L, TRUE);
2738             did_prop++;
2739             break;
2740         case prop2trbl(DEAF):
2741             make_deaf(0L, TRUE);
2742             did_prop++;
2743             break;
2744         default:
2745             if (idx >= 0 && idx < A_MAX) {
2746                 ABASE(idx) += 1;
2747                 did_attr++;
2748             } else
2749                 panic("use_unicorn_horn: bad trouble? (%d)", idx);
2750             break;
2751         }
2752     }
2753
2754     if (did_attr)
2755 #if 0 /*JP*/
2756         pline("This makes you feel %s!",
2757               (did_prop + did_attr) == (trouble_count + unfixable_trbl)
2758                   ? "great"
2759                   : "better");
2760 #else
2761         pline("\8bC\95ª\82ª%s\82æ\82­\82È\82Á\82½\81I",
2762               (did_prop + did_attr) == (trouble_count + unfixable_trbl)
2763                   ? "\82Æ\82Ä\82à"
2764                   : "\82æ\82è");
2765 #endif
2766     else if (!did_prop)
2767 /*JP
2768         pline("Nothing seems to happen.");
2769 */
2770         pline("\89½\82à\8bN\82«\82È\82©\82Á\82½\82æ\82¤\82¾\81D");
2771
2772     context.botl = (did_attr || did_prop);
2773 #undef PROP_COUNT
2774 #undef ATTR_COUNT
2775 #undef prop2trbl
2776 #undef attr2trbl
2777 #undef prop_trouble
2778 #undef attr_trouble
2779 #undef TimedTrouble
2780 }
2781
2782 /*
2783  * Timer callback routine: turn figurine into monster
2784  */
2785 void
2786 fig_transform(arg, timeout)
2787 anything *arg;
2788 long timeout;
2789 {
2790     struct obj *figurine = arg->a_obj;
2791     struct monst *mtmp;
2792     coord cc;
2793     boolean cansee_spot, silent, okay_spot;
2794     boolean redraw = FALSE;
2795     boolean suppress_see = FALSE;
2796     char monnambuf[BUFSZ], carriedby[BUFSZ];
2797
2798     if (!figurine) {
2799         debugpline0("null figurine in fig_transform()");
2800         return;
2801     }
2802     silent = (timeout != monstermoves); /* happened while away */
2803     okay_spot = get_obj_location(figurine, &cc.x, &cc.y, 0);
2804     if (figurine->where == OBJ_INVENT || figurine->where == OBJ_MINVENT)
2805         okay_spot = enexto(&cc, cc.x, cc.y, &mons[figurine->corpsenm]);
2806     if (!okay_spot || !figurine_location_checks(figurine, &cc, TRUE)) {
2807         /* reset the timer to try again later */
2808         (void) start_timer((long) rnd(5000), TIMER_OBJECT, FIG_TRANSFORM,
2809                            obj_to_any(figurine));
2810         return;
2811     }
2812
2813     cansee_spot = cansee(cc.x, cc.y);
2814     mtmp = make_familiar(figurine, cc.x, cc.y, TRUE);
2815     if (mtmp) {
2816         char and_vanish[BUFSZ];
2817         struct obj *mshelter = level.objects[mtmp->mx][mtmp->my];
2818
2819         /* [m_monnam() yields accurate mon type, overriding hallucination] */
2820         Sprintf(monnambuf, "%s", an(m_monnam(mtmp)));
2821         /*JP:TODO:and_vanish\82Í\96¢\8f\88\97\9d*/
2822         and_vanish[0] = '\0';
2823         if ((mtmp->minvis && !See_invisible)
2824             || (mtmp->data->mlet == S_MIMIC
2825                 && mtmp->m_ap_type != M_AP_NOTHING))
2826             suppress_see = TRUE;
2827
2828         if (mtmp->mundetected) {
2829             if (hides_under(mtmp->data) && mshelter) {
2830                 Sprintf(and_vanish, " and %s under %s",
2831                         locomotion(mtmp->data, "crawl"), doname(mshelter));
2832             } else if (mtmp->data->mlet == S_MIMIC
2833                        || mtmp->data->mlet == S_EEL) {
2834                 suppress_see = TRUE;
2835             } else
2836                 Strcpy(and_vanish, " and vanish");
2837         }
2838
2839         switch (figurine->where) {
2840         case OBJ_INVENT:
2841             if (Blind || suppress_see)
2842 #if 0 /*JP*/
2843                 You_feel("%s %s from your pack!", something,
2844                          locomotion(mtmp->data, "drop"));
2845 #else
2846                 You_feel("%s\82ª\82 \82È\82½\82Ì\8a\93\82©\82ç%s\82æ\82¤\82¾\81I", something,
2847                          jpast(locomotion(mtmp->data, "\97\8e\82¿\82é")));
2848 #endif
2849             else
2850 #if 0 /*JP*/
2851                 You_see("%s %s out of your pack%s!", monnambuf,
2852                         locomotion(mtmp->data, "drop"), and_vanish);
2853 #else
2854                 You("%s\82ª\82 \82È\82½\82Ì\8a\93\82©\82ç%s\82Ì\82ð\8c©\82½\81I", monnambuf,
2855                         jpast(locomotion(mtmp->data,"\97\8e\82¿\82é")));
2856 #endif
2857             break;
2858
2859         case OBJ_FLOOR:
2860             if (cansee_spot && !silent) {
2861                 if (suppress_see)
2862 /*JP
2863                     pline("%s suddenly vanishes!", an(xname(figurine)));
2864 */
2865                     pline("%s\82Í\93Ë\91R\8fÁ\82¦\82½\81I", xname(figurine));
2866                 else
2867 #if 0 /*JP*/
2868                     You_see("a figurine transform into %s%s!", monnambuf,
2869                             and_vanish);
2870 #else
2871                     You("\90l\8c`\82ª\93Ë\91R%s\82É\82È\82Á\82½\82Ì\82ð\8c©\82½\81I",
2872                             monnambuf);
2873 #endif
2874                 redraw = TRUE; /* update figurine's map location */
2875             }
2876             break;
2877
2878         case OBJ_MINVENT:
2879             if (cansee_spot && !silent && !suppress_see) {
2880                 struct monst *mon;
2881
2882                 mon = figurine->ocarry;
2883                 /* figurine carrying monster might be invisible */
2884                 if (canseemon(figurine->ocarry)
2885                     && (!mon->wormno || cansee(mon->mx, mon->my)))
2886 /*JP
2887                     Sprintf(carriedby, "%s pack", s_suffix(a_monnam(mon)));
2888 */
2889                     Sprintf(carriedby, "%s\82Ì\8a\93", a_monnam(mon));
2890                 else if (is_pool(mon->mx, mon->my))
2891 /*JP
2892                     Strcpy(carriedby, "empty water");
2893 */
2894                     Strcpy(carriedby, "\89½\82à\82È\82¢\90\85\92\86");
2895                 else
2896 /*JP
2897                     Strcpy(carriedby, "thin air");
2898 */
2899                     Strcpy(carriedby, "\89½\82à\82È\82¢\8bó\92\86");
2900 #if 0 /*JP*/
2901                 You_see("%s %s out of %s%s!", monnambuf,
2902                         locomotion(mtmp->data, "drop"), carriedby,
2903                         and_vanish);
2904 #else
2905                 You("%s\82ª%s\82©\82ç%s\82Ì\82ð\8c©\82½\81I", monnambuf,
2906                         carriedby, locomotion(mtmp->data, "\97\8e\82¿\82é"));
2907 #endif
2908             }
2909             break;
2910 #if 0
2911         case OBJ_MIGRATING:
2912             break;
2913 #endif
2914
2915         default:
2916             impossible("figurine came to life where? (%d)",
2917                        (int) figurine->where);
2918             break;
2919         }
2920     }
2921     /* free figurine now */
2922     if (carried(figurine)) {
2923         useup(figurine);
2924     } else {
2925         obj_extract_self(figurine);
2926         obfree(figurine, (struct obj *) 0);
2927     }
2928     if (redraw)
2929         newsym(cc.x, cc.y);
2930 }
2931
2932 STATIC_OVL boolean
2933 figurine_location_checks(obj, cc, quietly)
2934 struct obj *obj;
2935 coord *cc;
2936 boolean quietly;
2937 {
2938     xchar x, y;
2939
2940     if (carried(obj) && u.uswallow) {
2941         if (!quietly)
2942 /*JP
2943             You("don't have enough room in here.");
2944 */
2945             pline("\82±\82±\82É\82Í\8f\\95ª\82È\8fê\8f\8a\82ª\82È\82¢\81D");
2946         return FALSE;
2947     }
2948     x = cc ? cc->x : u.ux;
2949     y = cc ? cc->y : u.uy;
2950     if (!isok(x, y)) {
2951         if (!quietly)
2952 /*JP
2953             You("cannot put the figurine there.");
2954 */
2955             You("\82±\82±\82É\82Í\90l\8c`\82ð\92u\82¯\82È\82¢\81D");
2956         return FALSE;
2957     }
2958     if (IS_ROCK(levl[x][y].typ)
2959         && !(passes_walls(&mons[obj->corpsenm]) && may_passwall(x, y))) {
2960         if (!quietly)
2961 #if 0 /*JP*/
2962             You("cannot place a figurine in %s!",
2963                 IS_TREE(levl[x][y].typ) ? "a tree" : "solid rock");
2964 #else
2965             You("%s\82Ì\92\86\82É\82Í\90l\8c`\82ð\92u\82¯\82È\82¢\81I",
2966                 IS_TREE(levl[x][y].typ) ? "\96Ø" : "\8cÅ\82¢\90Î");
2967 #endif
2968         return FALSE;
2969     }
2970     if (sobj_at(BOULDER, x, y) && !passes_walls(&mons[obj->corpsenm])
2971         && !throws_rocks(&mons[obj->corpsenm])) {
2972         if (!quietly)
2973 /*JP
2974             You("cannot fit the figurine on the boulder.");
2975 */
2976             You("\8aâ\82É\90l\8c`\82ð\89\9f\82µ\8d\9e\82Þ\82±\82Æ\82Í\82Å\82«\82È\82¢\81D");
2977         return FALSE;
2978     }
2979     return TRUE;
2980 }
2981
2982 STATIC_OVL void
2983 use_figurine(optr)
2984 struct obj **optr;
2985 {
2986     register struct obj *obj = *optr;
2987     xchar x, y;
2988     coord cc;
2989
2990     if (u.uswallow) {
2991         /* can't activate a figurine while swallowed */
2992         if (!figurine_location_checks(obj, (coord *) 0, FALSE))
2993             return;
2994     }
2995     if (!getdir((char *) 0)) {
2996         context.move = multi = 0;
2997         return;
2998     }
2999     x = u.ux + u.dx;
3000     y = u.uy + u.dy;
3001     cc.x = x;
3002     cc.y = y;
3003     /* Passing FALSE arg here will result in messages displayed */
3004     if (!figurine_location_checks(obj, &cc, FALSE))
3005         return;
3006 #if 0 /*JP*/
3007     You("%s and it transforms.",
3008         (u.dx || u.dy) ? "set the figurine beside you"
3009                        : (Is_airlevel(&u.uz) || Is_waterlevel(&u.uz)
3010                           || is_pool(cc.x, cc.y))
3011                              ? "release the figurine"
3012                              : (u.dz < 0 ? "toss the figurine into the air"
3013                                          : "set the figurine on the ground"));
3014 #else
3015     You("%s\81D\82·\82é\82Æ\82»\82ê\82Í\95Ï\8c`\82µ\82½\81D",
3016         (u.dx || u.dy) ? "\82»\82Î\82É\90l\8c`\82ð\92u\82¢\82½"
3017                        : (Is_airlevel(&u.uz) || Is_waterlevel(&u.uz)
3018                           || is_pool(cc.x, cc.y))
3019                              ? "\90l\8c`\82ð\95ú\82Á\82½"
3020                              : (u.dz < 0 ?  "\90l\8c`\82ð\8bó\92\86\82É\93\8a\82°\82½"
3021                              : "\90l\8c`\82ð\92n\96Ê\82É\92u\82¢\82½"));
3022 #endif
3023     (void) make_familiar(obj, cc.x, cc.y, FALSE);
3024     (void) stop_timer(FIG_TRANSFORM, obj_to_any(obj));
3025     useup(obj);
3026     *optr = 0;
3027 }
3028
3029 static NEARDATA const char lubricables[] = { ALL_CLASSES, ALLOW_NONE, 0 };
3030
3031 STATIC_OVL void
3032 use_grease(obj)
3033 struct obj *obj;
3034 {
3035     struct obj *otmp;
3036
3037     if (Glib) {
3038 #if 0 /*JP*/
3039         pline("%s from your %s.", Tobjnam(obj, "slip"),
3040               makeplural(body_part(FINGER)));
3041 #else
3042         pline("%s\82Í\82 \82È\82½\82Ì%s\82©\82ç\8a\8a\82è\97\8e\82¿\82½\81D", xname(obj),
3043               body_part(FINGER));
3044 #endif
3045         dropx(obj);
3046         return;
3047     }
3048
3049     if (obj->spe > 0) {
3050         if ((obj->cursed || Fumbling) && !rn2(2)) {
3051             consume_obj_charge(obj, TRUE);
3052
3053 #if 0 /*JP*/
3054             pline("%s from your %s.", Tobjnam(obj, "slip"),
3055                   makeplural(body_part(FINGER)));
3056 #else
3057             pline("%s\82Í\82 \82È\82½\82Ì%s\82©\82ç\8a\8a\82è\97\8e\82¿\82½\81D", xname(obj),
3058                   body_part(FINGER));
3059 #endif
3060             dropx(obj);
3061             return;
3062         }
3063         otmp = getobj(lubricables, "grease");
3064         if (!otmp)
3065             return;
3066 /*JP
3067         if (inaccessible_equipment(otmp, "grease", FALSE))
3068 */
3069         if (inaccessible_equipment(otmp, "\82É\8e\89\82ð\93h\82é", FALSE))
3070             return;
3071         consume_obj_charge(obj, TRUE);
3072
3073         if (otmp != &zeroobj) {
3074 /*JP
3075             You("cover %s with a thick layer of grease.", yname(otmp));
3076 */
3077             You("%s\82É\8e\89\82ð\92O\94O\82É\93h\82Á\82½\81D", xname(otmp));
3078             otmp->greased = 1;
3079             if (obj->cursed && !nohands(youmonst.data)) {
3080                 incr_itimeout(&Glib, rnd(15));
3081 /*JP
3082                 pline("Some of the grease gets all over your %s.",
3083 */
3084                 pline("\8e\89\82ª\8f­\82µ%s\82É\82Â\82¢\82½\81D",
3085                       makeplural(body_part(HAND)));
3086             }
3087         } else {
3088             incr_itimeout(&Glib, rnd(15));
3089 /*JP
3090             You("coat your %s with grease.", makeplural(body_part(FINGER)));
3091 */
3092             You("%s\82É\8e\89\82ð\93h\82Á\82½\81D", makeplural(body_part(FINGER)));
3093         }
3094     } else {
3095         if (obj->known)
3096 /*JP
3097             pline("%s empty.", Tobjnam(obj, "are"));
3098 */
3099             pline("%s\82Í\8bó\82Á\82Û\82¾\81D", xname(obj));
3100         else
3101 /*JP
3102             pline("%s to be empty.", Tobjnam(obj, "seem"));
3103 */
3104             pline("%s\82Í\8bó\82Á\82Û\82Ì\82æ\82¤\82¾\81D", xname(obj));
3105     }
3106     update_inventory();
3107 }
3108
3109 /* touchstones - by Ken Arnold */
3110 STATIC_OVL void
3111 use_stone(tstone)
3112 struct obj *tstone;
3113 {
3114     struct obj *obj;
3115     boolean do_scratch;
3116     const char *streak_color, *choices;
3117     char stonebuf[QBUFSZ];
3118 /*JP
3119     static const char scritch[] = "\"scritch, scritch\"";
3120 */
3121     static const char scritch[] = "\81u\83S\83V\81C\83S\83V\81v";
3122     static const char allowall[3] = { COIN_CLASS, ALL_CLASSES, 0 };
3123     static const char coins_gems[3] = { COIN_CLASS, GEM_CLASS, 0 };
3124
3125     /* in case it was acquired while blinded */
3126     if (!Blind)
3127         tstone->dknown = 1;
3128     /* when the touchstone is fully known, don't bother listing extra
3129        junk as likely candidates for rubbing */
3130     choices = (tstone->otyp == TOUCHSTONE && tstone->dknown
3131                && objects[TOUCHSTONE].oc_name_known)
3132                   ? coins_gems
3133                   : allowall;
3134 /*JP
3135     Sprintf(stonebuf, "rub on the stone%s", plur(tstone->quan));
3136 */
3137     Sprintf(stonebuf, "rub on the stone");
3138     if ((obj = getobj(choices, stonebuf)) == 0)
3139         return;
3140
3141     if (obj == tstone && obj->quan == 1L) {
3142 /*JP
3143         You_cant("rub %s on itself.", the(xname(obj)));
3144 */
3145         You("%s\82ð\82»\82ê\8e©\91Ì\82Å\82±\82·\82é\82±\82Æ\82Í\82Å\82«\82È\82¢\81D", the(xname(obj)));
3146         return;
3147     }
3148
3149     if (tstone->otyp == TOUCHSTONE && tstone->cursed
3150         && obj->oclass == GEM_CLASS && !is_graystone(obj)
3151         && !obj_resists(obj, 80, 100)) {
3152         if (Blind)
3153 /*JP
3154             pline("You feel something shatter.");
3155 */
3156             You("\89½\82©\82ª\95²\81X\82É\82È\82é\82Ì\82ð\8a´\82\82½\81D");
3157         else if (Hallucination)
3158 /*JP
3159             pline("Oh, wow, look at the pretty shards.");
3160 */
3161             pline("\83\8f\81[\83H\81I\82È\82ñ\82Ä\82«\82ê\82¢\82È\94j\95Ð\82È\82ñ\82¾\81D");
3162         else
3163 #if 0 /*JP*/
3164             pline("A sharp crack shatters %s%s.",
3165                   (obj->quan > 1L) ? "one of " : "", the(xname(obj)));
3166 #else
3167             pline("\8b­\82­\82±\82·\82è\82·\82¬\82Ä%s%s\82Í\95²\81X\82É\82È\82Á\82Ä\82µ\82Ü\82Á\82½\81D",
3168                   the(xname(obj)), (obj->quan > 1) ? "\82Ì\82Ð\82Æ\82Â" : "");
3169 #endif
3170         useup(obj);
3171         return;
3172     }
3173
3174     if (Blind) {
3175         pline(scritch);
3176         return;
3177     } else if (Hallucination) {
3178 #if 0 /*JP*/
3179         pline("Oh wow, man: Fractals!");
3180 #else
3181         pline("\83\8f\81[\83H\81I\83t\83\89\83N\83^\83\8b\96Í\97l\82¾\81I");
3182 #endif
3183         return;
3184     }
3185
3186     do_scratch = FALSE;
3187     streak_color = 0;
3188
3189     switch (obj->oclass) {
3190     case GEM_CLASS: /* these have class-specific handling below */
3191     case RING_CLASS:
3192         if (tstone->otyp != TOUCHSTONE) {
3193             do_scratch = TRUE;
3194         } else if (obj->oclass == GEM_CLASS
3195                    && (tstone->blessed
3196                        || (!tstone->cursed && (Role_if(PM_ARCHEOLOGIST)
3197                                                || Race_if(PM_GNOME))))) {
3198             makeknown(TOUCHSTONE);
3199             makeknown(obj->otyp);
3200             prinv((char *) 0, obj, 0L);
3201             return;
3202         } else {
3203             /* either a ring or the touchstone was not effective */
3204             if (objects[obj->otyp].oc_material == GLASS) {
3205                 do_scratch = TRUE;
3206                 break;
3207             }
3208         }
3209         streak_color = c_obj_colors[objects[obj->otyp].oc_color];
3210         break; /* gem or ring */
3211
3212     default:
3213         switch (objects[obj->otyp].oc_material) {
3214         case CLOTH:
3215 #if 0 /*JP*/
3216             pline("%s a little more polished now.", Tobjnam(tstone, "look"));
3217 #else
3218             pline("%s\82Í\82³\82ç\82É\82Â\82â\82ª\8fo\82½\82æ\82¤\82É\8c©\82¦\82é\81D", xname(tstone));
3219 #endif
3220             return;
3221         case LIQUID:
3222             if (!obj->known) /* note: not "whetstone" */
3223 #if 0 /*JP*/
3224                 You("must think this is a wetstone, do you?");
3225 #else
3226                 You("\82±\82ê\82Í\93u\90Î\82¾\82Æ\8ev\82Á\82½\81H");
3227 #endif
3228             else
3229 #if 0 /*JP*/
3230                 pline("%s a little wetter now.", Tobjnam(tstone, "are"));
3231 #else
3232                 pline("%s\82Í\8f­\82µ\82Ê\82ê\82½\81D", xname(tstone));
3233 #endif
3234             return;
3235         case WAX:
3236 #if 0 /*JP*/
3237             streak_color = "waxy";
3238 #else
3239             streak_color = "\8e\89\82Á\82Û\82¢";
3240 #endif
3241             break; /* okay even if not touchstone */
3242         case WOOD:
3243 #if 0 /*JP*/
3244             streak_color = "wooden";
3245 #else
3246             streak_color = "\82¨\82ª\82­\82¸\82Ì\82æ\82¤\82È";
3247 #endif
3248             break; /* okay even if not touchstone */
3249         case GOLD:
3250             do_scratch = TRUE; /* scratching and streaks */
3251 #if 0 /*JP*/
3252             streak_color = "golden";
3253 #else
3254             streak_color = "\8bà\90F\82Ì";
3255 #endif
3256             break;
3257         case SILVER:
3258             do_scratch = TRUE; /* scratching and streaks */
3259 #if 0 /*JP*/
3260             streak_color = "silvery";
3261 #else
3262             streak_color = "\8bâ\90F\82Ì";
3263 #endif
3264             break;
3265         default:
3266             /* Objects passing the is_flimsy() test will not
3267                scratch a stone.  They will leave streaks on
3268                non-touchstones and touchstones alike. */
3269             if (is_flimsy(obj))
3270                 streak_color = c_obj_colors[objects[obj->otyp].oc_color];
3271             else
3272                 do_scratch = (tstone->otyp != TOUCHSTONE);
3273             break;
3274         }
3275         break; /* default oclass */
3276     }
3277
3278 #if 0 /*JP*//* not used */
3279     Sprintf(stonebuf, "stone%s", plur(tstone->quan));
3280 #endif
3281     if (do_scratch)
3282 #if 0 /*JP*/
3283         You("make %s%sscratch marks on the %s.",
3284             streak_color ? streak_color : (const char *) "",
3285             streak_color ? " " : "", stonebuf);
3286 #else
3287         You("%s\82±\82·\82è\90Õ\82ð\90Î\82É\82Â\82¯\82½\81D",
3288             streak_color ? streak_color : (const char *)"");
3289 #endif
3290     else if (streak_color)
3291 /*JP
3292         You_see("%s streaks on the %s.", streak_color, stonebuf);
3293 */
3294         pline("\90Î\82É%s\8bØ\82ª\82Â\82¢\82½\81D", streak_color);
3295     else
3296         pline(scritch);
3297     return;
3298 }
3299
3300 static struct trapinfo {
3301     struct obj *tobj;
3302     xchar tx, ty;
3303     int time_needed;
3304     boolean force_bungle;
3305 } trapinfo;
3306
3307 void
3308 reset_trapset()
3309 {
3310     trapinfo.tobj = 0;
3311     trapinfo.force_bungle = 0;
3312 }
3313
3314 /* Place a landmine/bear trap.  Helge Hafting */
3315 STATIC_OVL void
3316 use_trap(otmp)
3317 struct obj *otmp;
3318 {
3319     int ttyp, tmp;
3320     const char *what = (char *) 0;
3321     char buf[BUFSZ];
3322     int levtyp = levl[u.ux][u.uy].typ;
3323 #if 0 /*JP*/
3324     const char *occutext = "setting the trap";
3325 #else
3326     const char *occutext = "ã©\82ð\8ed\8a|\82¯\82Ä\82¢\82é";
3327 #endif
3328
3329     if (nohands(youmonst.data))
3330 /*JP
3331         what = "without hands";
3332 */
3333         what = "\8eè\82ª\82È\82¢\82Ì\82Å";
3334     else if (Stunned)
3335 /*JP
3336         what = "while stunned";
3337 */
3338         what = "\82­\82ç\82­\82ç\82µ\82Ä\82¢\82é\82Ì\82Å";
3339     else if (u.uswallow)
3340         what =
3341 /*JP
3342             is_animal(u.ustuck->data) ? "while swallowed" : "while engulfed";
3343 */
3344             is_animal(u.ustuck->data) ? "\88ù\82Ý\8d\9e\82Ü\82ê\82Ä\82¢\82é\8aÔ\82Í" : "\8aª\82«\8d\9e\82Ü\82ê\82Ä\82¢\82é\8aÔ\82Í";
3345     else if (Underwater)
3346 /*JP
3347         what = "underwater";
3348 */
3349         what = "\90\85\96Ê\89º\82Å\82Í";
3350     else if (Levitation)
3351 /*JP
3352         what = "while levitating";
3353 */
3354         what = "\95\82\82¢\82Ä\82¢\82é\8aÔ\82Í";
3355     else if (is_pool(u.ux, u.uy))
3356 /*JP
3357         what = "in water";
3358 */
3359         what = "\90\85\92\86\82Å\82Í";
3360     else if (is_lava(u.ux, u.uy))
3361 /*JP
3362         what = "in lava";
3363 */
3364         what = "\97n\8aâ\82Ì\92\86\82Å\82Í";
3365     else if (On_stairs(u.ux, u.uy))
3366 #if 0 /*JP*/
3367         what = (u.ux == xdnladder || u.ux == xupladder) ? "on the ladder"
3368                                                         : "on the stairs";
3369 #else
3370         what = (u.ux == xdnladder || u.ux == xupladder) ? "\82Í\82µ\82²\82Ì\8fã\82Å\82Í"
3371                                                         : "\8aK\92i\82Ì\8fã\82Å\82Í";
3372 #endif
3373     else if (IS_FURNITURE(levtyp) || IS_ROCK(levtyp)
3374              || closed_door(u.ux, u.uy) || t_at(u.ux, u.uy))
3375 /*JP
3376         what = "here";
3377 */
3378         what = "\82±\82±\82Å\82Í";
3379     else if (Is_airlevel(&u.uz) || Is_waterlevel(&u.uz))
3380 #if 0 /*JP*/
3381         what = (levtyp == AIR)
3382                    ? "in midair"
3383                    : (levtyp == CLOUD)
3384                          ? "in a cloud"
3385                          : "in this place"; /* Air/Water Plane catch-all */
3386 #else
3387         what = (levtyp == AIR)
3388                    ? "\8bó\92\86\82Å\82Í"
3389                    : (levtyp == CLOUD)
3390                          ? "\89_\82Ì\92\86\82Å\82Í"
3391                          : "\82±\82±\82Å\82Í"; /* Air/Water Plane catch-all */
3392 #endif
3393     if (what) {
3394 /*JP
3395         You_cant("set a trap %s!", what);
3396 */
3397         pline("%sã©\82ð\8ed\8a|\82¯\82ç\82ê\82È\82¢\81I",what);
3398         reset_trapset();
3399         return;
3400     }
3401     ttyp = (otmp->otyp == LAND_MINE) ? LANDMINE : BEAR_TRAP;
3402     if (otmp == trapinfo.tobj && u.ux == trapinfo.tx && u.uy == trapinfo.ty) {
3403 /*JP
3404         You("resume setting %s%s.", shk_your(buf, otmp),
3405 */
3406         You("%s\82ð\8ed\8a|\82¯\82é\82Ì\82ð\8dÄ\8aJ\82µ\82½\81D",
3407             defsyms[trap_to_defsym(what_trap(ttyp))].explanation);
3408         set_occupation(set_trap, occutext, 0);
3409         return;
3410     }
3411     trapinfo.tobj = otmp;
3412     trapinfo.tx = u.ux, trapinfo.ty = u.uy;
3413     tmp = ACURR(A_DEX);
3414     trapinfo.time_needed =
3415         (tmp > 17) ? 2 : (tmp > 12) ? 3 : (tmp > 7) ? 4 : 5;
3416     if (Blind)
3417         trapinfo.time_needed *= 2;
3418     tmp = ACURR(A_STR);
3419     if (ttyp == BEAR_TRAP && tmp < 18)
3420         trapinfo.time_needed += (tmp > 12) ? 1 : (tmp > 7) ? 2 : 4;
3421     /*[fumbling and/or confusion and/or cursed object check(s)
3422        should be incorporated here instead of in set_trap]*/
3423     if (u.usteed && P_SKILL(P_RIDING) < P_BASIC) {
3424         boolean chance;
3425
3426         if (Fumbling || otmp->cursed)
3427             chance = (rnl(10) > 3);
3428         else
3429             chance = (rnl(10) > 5);
3430 /*JP
3431         You("aren't very skilled at reaching from %s.", mon_nam(u.usteed));
3432 */
3433         pline("%s\82Ì\8fã\82©\82ç\82Å\82Í\82¤\82Ü\82­\8ed\8a|\82¯\82ç\82ê\82È\82¢\82©\82à\82µ\82ê\82È\82¢\81D", mon_nam(u.usteed));
3434 /*JP
3435         Sprintf(buf, "Continue your attempt to set %s?",
3436 */
3437         Sprintf(buf, "%s\82Ì\8ed\8a|\82¯\82ð\91±\82¯\82é\81H",
3438                 the(defsyms[trap_to_defsym(what_trap(ttyp))].explanation));
3439         if (yn(buf) == 'y') {
3440             if (chance) {
3441                 switch (ttyp) {
3442                 case LANDMINE: /* set it off */
3443                     trapinfo.time_needed = 0;
3444                     trapinfo.force_bungle = TRUE;
3445                     break;
3446                 case BEAR_TRAP: /* drop it without arming it */
3447                     reset_trapset();
3448 /*JP
3449                     You("drop %s!",
3450 */
3451                     You("%s\82ð\97\8e\82Æ\82µ\82½\81I",
3452                         the(defsyms[trap_to_defsym(what_trap(ttyp))]
3453                                 .explanation));
3454                     dropx(otmp);
3455                     return;
3456                 }
3457             }
3458         } else {
3459             reset_trapset();
3460             return;
3461         }
3462     }
3463 /*JP
3464     You("begin setting %s%s.", shk_your(buf, otmp),
3465 */
3466     You("%s%s\82ð\8ed\8a|\82¯\82Í\82\82ß\82½\81D", shk_your(buf, otmp),
3467         defsyms[trap_to_defsym(what_trap(ttyp))].explanation);
3468     set_occupation(set_trap, occutext, 0);
3469     return;
3470 }
3471
3472 STATIC_PTR
3473 int
3474 set_trap()
3475 {
3476     struct obj *otmp = trapinfo.tobj;
3477     struct trap *ttmp;
3478     int ttyp;
3479
3480     if (!otmp || !carried(otmp) || u.ux != trapinfo.tx
3481         || u.uy != trapinfo.ty) {
3482         /* ?? */
3483         reset_trapset();
3484         return 0;
3485     }
3486
3487     if (--trapinfo.time_needed > 0)
3488         return 1; /* still busy */
3489
3490     ttyp = (otmp->otyp == LAND_MINE) ? LANDMINE : BEAR_TRAP;
3491     ttmp = maketrap(u.ux, u.uy, ttyp);
3492     if (ttmp) {
3493         ttmp->madeby_u = 1;
3494         feeltrap(ttmp);
3495         if (*in_rooms(u.ux, u.uy, SHOPBASE)) {
3496             add_damage(u.ux, u.uy, 0L); /* schedule removal */
3497         }
3498         if (!trapinfo.force_bungle)
3499 /*JP
3500             You("finish arming %s.",
3501 */
3502             You("%s\82ð\8ed\8a|\82¯\8fI\82¦\82½\81D",
3503                 the(defsyms[trap_to_defsym(what_trap(ttyp))].explanation));
3504         if (((otmp->cursed || Fumbling) && (rnl(10) > 5))
3505             || trapinfo.force_bungle)
3506             dotrap(ttmp,
3507                    (unsigned) (trapinfo.force_bungle ? FORCEBUNGLE : 0));
3508     } else {
3509         /* this shouldn't happen */
3510 /*JP
3511         Your("trap setting attempt fails.");
3512 */
3513         You("ã©\82ð\8ed\8a|\82¯\82é\82Ì\82É\8e¸\94s\82µ\82½\81D");
3514     }
3515     useup(otmp);
3516     reset_trapset();
3517     return 0;
3518 }
3519
3520 STATIC_OVL int
3521 use_whip(obj)
3522 struct obj *obj;
3523 {
3524     char buf[BUFSZ];
3525     struct monst *mtmp;
3526     struct obj *otmp;
3527     int rx, ry, proficient, res = 0;
3528 /*JP
3529     const char *msg_slipsfree = "The bullwhip slips free.";
3530 */
3531     const char *msg_slipsfree = "\95Ú\82Í\82Ù\82Ç\82¯\82½\81D";
3532 /*JP
3533     const char *msg_snap = "Snap!";
3534 */
3535     const char *msg_snap = "\83s\83V\83b\81I";
3536
3537     if (obj != uwep) {
3538         if (!wield_tool(obj, "lash"))
3539             return 0;
3540         else
3541             res = 1;
3542     }
3543     if (!getdir((char *) 0))
3544         return res;
3545
3546     if (u.uswallow) {
3547         mtmp = u.ustuck;
3548         rx = mtmp->mx;
3549         ry = mtmp->my;
3550     } else {
3551         if (Stunned || (Confusion && !rn2(5)))
3552             confdir();
3553         rx = u.ux + u.dx;
3554         ry = u.uy + u.dy;
3555         if (!isok(rx, ry)) {
3556 /*JP
3557             You("miss.");
3558 */
3559             You("\82Í\82¸\82µ\82½\81D");
3560             return res;
3561         }
3562         mtmp = m_at(rx, ry);
3563     }
3564
3565     /* fake some proficiency checks */
3566     proficient = 0;
3567     if (Role_if(PM_ARCHEOLOGIST))
3568         ++proficient;
3569     if (ACURR(A_DEX) < 6)
3570         proficient--;
3571     else if (ACURR(A_DEX) >= 14)
3572         proficient += (ACURR(A_DEX) - 14);
3573     if (Fumbling)
3574         --proficient;
3575     if (proficient > 3)
3576         proficient = 3;
3577     if (proficient < 0)
3578         proficient = 0;
3579
3580     if (u.uswallow && attack(u.ustuck)) {
3581 /*JP
3582         There("is not enough room to flick your bullwhip.");
3583 */
3584         pline("\95Ú\82ð\91Å\82Â\82Ù\82Ç\8dL\82­\82È\82¢\81D");
3585
3586     } else if (Underwater) {
3587 /*JP
3588         There("is too much resistance to flick your bullwhip.");
3589 */
3590         pline("\90\85\82Ì\92ï\8dR\82ª\82 \82è\82·\82¬\82Ä\95Ú\82ð\91Å\82Â\82±\82Æ\82ª\82Å\82«\82È\82¢\81D");
3591
3592     } else if (u.dz < 0) {
3593 /*JP
3594         You("flick a bug off of the %s.", ceiling(u.ux, u.uy));
3595 */
3596         You("%s\82Ì\92\8e\82ð\91Å\82¿\97\8e\82µ\82½\81D",ceiling(u.ux,u.uy));
3597
3598     } else if ((!u.dx && !u.dy) || (u.dz > 0)) {
3599         int dam;
3600
3601         /* Sometimes you hit your steed by mistake */
3602         if (u.usteed && !rn2(proficient + 2)) {
3603 /*JP
3604             You("whip %s!", mon_nam(u.usteed));
3605 */
3606             You("%s\82ð\95Ú\91Å\82Á\82½\81I", mon_nam(u.usteed));
3607             kick_steed();
3608             return 1;
3609         }
3610         if (Levitation || u.usteed) {
3611             /* Have a shot at snaring something on the floor */
3612             otmp = level.objects[u.ux][u.uy];
3613             if (otmp && otmp->otyp == CORPSE && otmp->corpsenm == PM_HORSE) {
3614 /*JP
3615                 pline("Why beat a dead horse?");
3616 */
3617                 pline("\82Ç\82¤\82µ\82Ä\8e\80\82ñ\82¾\94n\82ð\95Ú\91Å\82Â\82æ\82¤\82È\82±\82Æ\82ð\82·\82é\82Ì\81H");
3618                 return 1;
3619             }
3620             if (otmp && proficient) {
3621 #if 0 /*JP*/
3622                 You("wrap your bullwhip around %s on the %s.",
3623                     an(singular(otmp, xname)), surface(u.ux, u.uy));
3624 #else
3625                 You("\95Ú\82ð%s\82Ì\8fã\82Ì%s\82É\82©\82ç\82Ü\82¹\82½\81D",
3626                     surface(u.ux, u.uy), an(singular(otmp, xname)));
3627 #endif
3628                 if (rnl(6) || pickup_object(otmp, 1L, TRUE) < 1)
3629                     pline1(msg_slipsfree);
3630                 return 1;
3631             }
3632         }
3633         dam = rnd(2) + dbon() + obj->spe;
3634         if (dam <= 0)
3635             dam = 1;
3636 /*JP
3637         You("hit your %s with your bullwhip.", body_part(FOOT));
3638 */
3639         You("\8e©\95ª\82Ì%s\82ð\8e©\95ª\82Å\91Å\82¿\82Â\82¯\82½\81D", body_part(FOOT));
3640 #if 0 /*JP*/
3641         Sprintf(buf, "killed %sself with %s bullwhip", uhim(), uhis());
3642         losehp(Maybe_Half_Phys(dam), buf, NO_KILLER_PREFIX);
3643 #else
3644         Strcpy(buf, "\8e©\95ª\8e©\90g\82ð\95Ú\91Å\82Á\82Ä");
3645         losehp(dam, buf, KILLED_BY);
3646 #endif
3647         context.botl = 1;
3648         return 1;
3649
3650     } else if ((Fumbling || Glib) && !rn2(5)) {
3651 /*JP
3652         pline_The("bullwhip slips out of your %s.", body_part(HAND));
3653 */
3654         pline("\95Ú\82ª%s\82©\82ç\82·\82×\82è\97\8e\82¿\82½\81D", body_part(HAND));
3655         dropx(obj);
3656
3657     } else if (u.utrap && u.utraptype == TT_PIT) {
3658         /*
3659          * Assumptions:
3660          *
3661          * if you're in a pit
3662          *    - you are attempting to get out of the pit
3663          * or, if you are applying it towards a small monster
3664          *    - then it is assumed that you are trying to hit it
3665          * else if the monster is wielding a weapon
3666          *    - you are attempting to disarm a monster
3667          * else
3668          *    - you are attempting to hit the monster.
3669          *
3670          * if you're confused (and thus off the mark)
3671          *    - you only end up hitting.
3672          *
3673          */
3674         const char *wrapped_what = (char *) 0;
3675
3676         if (mtmp) {
3677             if (bigmonst(mtmp->data)) {
3678                 wrapped_what = strcpy(buf, mon_nam(mtmp));
3679             } else if (proficient) {
3680                 if (attack(mtmp))
3681                     return 1;
3682                 else
3683                     pline1(msg_snap);
3684             }
3685         }
3686         if (!wrapped_what) {
3687             if (IS_FURNITURE(levl[rx][ry].typ))
3688                 wrapped_what = something;
3689             else if (sobj_at(BOULDER, rx, ry))
3690 /*JP
3691                 wrapped_what = "a boulder";
3692 */
3693                 wrapped_what = "\8aâ";
3694         }
3695         if (wrapped_what) {
3696             coord cc;
3697
3698             cc.x = rx;
3699             cc.y = ry;
3700 /*JP
3701             You("wrap your bullwhip around %s.", wrapped_what);
3702 */
3703             You("\95Ú\82ð%s\82É\82©\82ç\82Ü\82¹\82½\81D", wrapped_what);
3704             if (proficient && rn2(proficient + 2)) {
3705                 if (!mtmp || enexto(&cc, rx, ry, youmonst.data)) {
3706 /*JP
3707                     You("yank yourself out of the pit!");
3708 */
3709                     You("\82®\82¢\82Æ\88ø\82Á\82Ï\82Á\82Ä\8c\8a\82©\82ç\94²\82¯\8fo\82µ\82½\81I");
3710                     teleds(cc.x, cc.y, TRUE);
3711                     u.utrap = 0;
3712                     vision_full_recalc = 1;
3713                 }
3714             } else {
3715                 pline1(msg_slipsfree);
3716             }
3717             if (mtmp)
3718                 wakeup(mtmp, TRUE);
3719         } else
3720             pline1(msg_snap);
3721
3722     } else if (mtmp) {
3723         if (!canspotmon(mtmp) && !glyph_is_invisible(levl[rx][ry].glyph)) {
3724 /*JP
3725             pline("A monster is there that you couldn't see.");
3726 */
3727             pline("\8c©\82¦\82È\82¢\89ö\95¨\82ª\82¢\82é\81D");
3728             map_invisible(rx, ry);
3729         }
3730         otmp = MON_WEP(mtmp); /* can be null */
3731         if (otmp) {
3732             char onambuf[BUFSZ];
3733             const char *mon_hand;
3734             boolean gotit = proficient && (!Fumbling || !rn2(10));
3735
3736             Strcpy(onambuf, cxname(otmp));
3737             if (gotit) {
3738                 mon_hand = mbodypart(mtmp, HAND);
3739                 if (bimanual(otmp))
3740                     mon_hand = makeplural(mon_hand);
3741             } else
3742                 mon_hand = 0; /* lint suppression */
3743
3744 /*JP
3745             You("wrap your bullwhip around %s.", yname(otmp));
3746 */
3747             You("\95Ú\82ð%s\82É\82©\82ç\82Ü\82¹\82½\81D", xname(otmp));
3748             if (gotit && mwelded(otmp)) {
3749 #if 0 /*JP*/
3750                 pline("%s welded to %s %s%c",
3751                       (otmp->quan == 1L) ? "It is" : "They are", mhis(mtmp),
3752                       mon_hand, !otmp->bknown ? '!' : '.');
3753 #else
3754                 pline("%s\82Í%s\82Ì%s\82É\82­\82Á\82Â\82¢\82Ä\82µ\82Ü\82Á\82Ä\82¢\82é%s",
3755                       onambuf,
3756                       mon_nam(mtmp), mon_hand,
3757                       !otmp->bknown ? "\81I" : "\81D");
3758 #endif
3759                 otmp->bknown = 1;
3760                 gotit = FALSE; /* can't pull it free */
3761             }
3762             if (gotit) {
3763                 obj_extract_self(otmp);
3764                 possibly_unwield(mtmp, FALSE);
3765                 setmnotwielded(mtmp, otmp);
3766
3767                 switch (rn2(proficient + 1)) {
3768                 case 2:
3769                     /* to floor near you */
3770 /*JP
3771                     You("yank %s to the %s!", yname(otmp),
3772 */
3773                     You("%s\82ð%s\82É\88ø\82«\97\8e\82µ\82½\81I", xname(otmp),
3774                         surface(u.ux, u.uy));
3775                     place_object(otmp, u.ux, u.uy);
3776                     stackobj(otmp);
3777                     break;
3778                 case 3:
3779 #if 0
3780                     /* right to you */
3781                     if (!rn2(25)) {
3782                         /* proficient with whip, but maybe not
3783                            so proficient at catching weapons */
3784                         int hitu, hitvalu;
3785
3786                         hitvalu = 8 + otmp->spe;
3787                         hitu = thitu(hitvalu, dmgval(otmp, &youmonst),
3788                                      &otmp, (char *)0);
3789                         if (hitu) {
3790 /*JP
3791                             pline_The("%s hits you as you try to snatch it!",
3792 */
3793                             pline_The("%s\82ð\92D\82¨\82¤\82Æ\82µ\82½\82ç\82 \82È\82½\82É\93\96\82½\82Á\82½\81I",
3794                                       the(onambuf));
3795                         }
3796                         place_object(otmp, u.ux, u.uy);
3797                         stackobj(otmp);
3798                         break;
3799                     }
3800 #endif /* 0 */
3801                     /* right into your inventory */
3802 /*JP
3803                     You("snatch %s!", yname(otmp));
3804 */
3805                     You("%s\82ð\92D\82Á\82½\81I", xname(otmp));
3806                     if (otmp->otyp == CORPSE
3807                         && touch_petrifies(&mons[otmp->corpsenm]) && !uarmg
3808                         && !Stone_resistance
3809                         && !(poly_when_stoned(youmonst.data)
3810                              && polymon(PM_STONE_GOLEM))) {
3811                         char kbuf[BUFSZ];
3812
3813 #if 0 /*JP*/
3814                         Sprintf(kbuf, "%s corpse",
3815                                 an(mons[otmp->corpsenm].mname));
3816                         pline("Snatching %s is a fatal mistake.", kbuf);
3817 #else
3818                         pline("%s\82Ì\8e\80\91Ì\82ð\92D\82Á\82½\82Ì\82Í\92v\96½\93I\82È\8aÔ\88á\82¢\82¾\81D",
3819                                 mons[otmp->corpsenm].mname);
3820                         Sprintf(kbuf, "%s\82Ì\8e\80\91Ì\82É\90G\82ê\82Ä",
3821                                 mons[otmp->corpsenm].mname);
3822 #endif
3823                         instapetrify(kbuf);
3824                     }
3825 #if 0 /*JP:T*/
3826                     (void) hold_another_object(otmp, "You drop %s!",
3827                                                doname(otmp), (const char *) 0);
3828 #else
3829                     (void) hold_another_object(otmp, "%s\82ð\97\8e\82µ\82½\81I",
3830                                                doname(otmp), (const char *) 0);
3831 #endif
3832                     break;
3833                 default:
3834                     /* to floor beneath mon */
3835 #if 0 /*JP*/
3836                     You("yank %s from %s %s!", the(onambuf),
3837                         s_suffix(mon_nam(mtmp)), mon_hand);
3838 #else
3839                     You("%s\82ð%s\82Ì%s\82©\82ç\82Ð\82Á\82Ï\82Á\82½\81I", the(xname(otmp)),
3840                         mon_nam(mtmp), mon_hand);
3841 #endif
3842                     obj_no_longer_held(otmp);
3843                     place_object(otmp, mtmp->mx, mtmp->my);
3844                     stackobj(otmp);
3845                     break;
3846                 }
3847             } else {
3848                 pline1(msg_slipsfree);
3849             }
3850             wakeup(mtmp, TRUE);
3851         } else {
3852             if (mtmp->m_ap_type && !Protection_from_shape_changers
3853                 && !sensemon(mtmp))
3854                 stumble_onto_mimic(mtmp);
3855             else
3856 /*JP
3857                 You("flick your bullwhip towards %s.", mon_nam(mtmp));
3858 */
3859                 You("%s\82É\8cü\82Á\82Ä\95Ú\82ð\91Å\82Á\82½\81D", mon_nam(mtmp));
3860             if (proficient) {
3861                 if (attack(mtmp))
3862                     return 1;
3863                 else
3864                     pline1(msg_snap);
3865             }
3866         }
3867
3868     } else if (Is_airlevel(&u.uz) || Is_waterlevel(&u.uz)) {
3869         /* it must be air -- water checked above */
3870 /*JP
3871         You("snap your whip through thin air.");
3872 */
3873         You("\89½\82à\82È\82¢\82Æ\82±\82ë\82Å\95Ú\82ð\91Å\82Á\82½\81D");
3874
3875     } else {
3876         pline1(msg_snap);
3877     }
3878     return 1;
3879 }
3880
3881 static const char
3882 /*JP
3883     not_enough_room[] = "There's not enough room here to use that.",
3884 */
3885     not_enough_room[] = "\82»\82ê\82ð\8eg\82¤\82¾\82¯\82Ì\8dL\82³\82ª\82È\82¢\81D",
3886 /*JP
3887     where_to_hit[] = "Where do you want to hit?",
3888 */
3889     where_to_hit[] = "\82Ç\82ê\82ð\91_\82¤\81H",
3890 /*JP
3891     cant_see_spot[] = "won't hit anything if you can't see that spot.",
3892 */
3893     cant_see_spot[] = "\8fê\8f\8a\82ª\8c©\82¦\82È\82¯\82ê\82Î\91_\82¦\82È\82¢\81D",
3894 /*JP
3895     cant_reach[] = "can't reach that spot from here.";
3896 */
3897     cant_reach[] = "\82±\82±\82©\82ç\82»\82±\82Ö\82Í\93Í\82©\82È\82¢\81D";
3898
3899 /* find pos of monster in range, if only one monster */
3900 boolean
3901 find_poleable_mon(pos, min_range, max_range)
3902 coord *pos;
3903 int min_range, max_range;
3904 {
3905     struct monst *mtmp;
3906     struct monst *selmon = (struct monst *) 0;
3907
3908     for (mtmp = fmon; mtmp; mtmp = mtmp->nmon)
3909         if (mtmp && !DEADMONSTER(mtmp) && !mtmp->mtame
3910             && cansee(mtmp->mx, mtmp->my)
3911             && distu(mtmp->mx, mtmp->my) <= max_range
3912             && distu(mtmp->mx, mtmp->my) >= min_range) {
3913             if (selmon)
3914                 return FALSE;
3915             selmon = mtmp;
3916         }
3917     if (!selmon)
3918         return FALSE;
3919     pos->x = selmon->mx;
3920     pos->y = selmon->my;
3921     return TRUE;
3922 }
3923
3924 static int polearm_range_min = -1;
3925 static int polearm_range_max = -1;
3926
3927 STATIC_OVL boolean
3928 get_valid_polearm_position(x,y)
3929 int x,y;
3930 {
3931     return (isok(x, y) && ACCESSIBLE(levl[x][y].typ)
3932             && distu(x, y) >= polearm_range_min
3933             && distu(x, y) <= polearm_range_max);
3934 }
3935
3936 void
3937 display_polearm_positions(state)
3938 int state;
3939 {
3940     if (state == 0) {
3941         tmp_at(DISP_BEAM, cmap_to_glyph(S_goodpos));
3942     } else if (state == 1) {
3943         int x, y, dx, dy;
3944
3945         for (dx = -4; dx <= 4; dx++)
3946             for (dy = -4; dy <= 4; dy++) {
3947                 x = dx + (int) u.ux;
3948                 y = dy + (int) u.uy;
3949                 if (get_valid_polearm_position(x, y)) {
3950                     tmp_at(x, y);
3951                 }
3952             }
3953     } else {
3954         tmp_at(DISP_END, 0);
3955     }
3956 }
3957
3958 /* Distance attacks by pole-weapons */
3959 STATIC_OVL int
3960 use_pole(obj)
3961 struct obj *obj;
3962 {
3963     int res = 0, typ, max_range, min_range, glyph;
3964     coord cc;
3965     struct monst *mtmp;
3966     struct monst *hitm = context.polearm.hitmon;
3967
3968     /* Are you allowed to use the pole? */
3969     if (u.uswallow) {
3970         pline(not_enough_room);
3971         return 0;
3972     }
3973     if (obj != uwep) {
3974         if (!wield_tool(obj, "swing"))
3975             return 0;
3976         else
3977             res = 1;
3978     }
3979     /* assert(obj == uwep); */
3980
3981     /*
3982      * Calculate allowable range (pole's reach is always 2 steps):
3983      *  unskilled and basic: orthogonal direction, 4..4;
3984      *  skilled: as basic, plus knight's jump position, 4..5;
3985      *  expert: as skilled, plus diagonal, 4..8.
3986      *      ...9...
3987      *      .85458.
3988      *      .52125.
3989      *      9410149
3990      *      .52125.
3991      *      .85458.
3992      *      ...9...
3993      *  (Note: no roles in nethack can become expert or better
3994      *  for polearm skill; Yeoman in slash'em can become expert.)
3995      */
3996     min_range = 4;
3997     typ = uwep_skill_type();
3998     if (typ == P_NONE || P_SKILL(typ) <= P_BASIC)
3999         max_range = 4;
4000     else if (P_SKILL(typ) == P_SKILLED)
4001         max_range = 5;
4002     else
4003         max_range = 8; /* (P_SKILL(typ) >= P_EXPERT) */
4004
4005     polearm_range_min = min_range;
4006     polearm_range_max = max_range;
4007
4008     /* Prompt for a location */
4009     pline(where_to_hit);
4010     cc.x = u.ux;
4011     cc.y = u.uy;
4012     if (!find_poleable_mon(&cc, min_range, max_range) && hitm
4013         && !DEADMONSTER(hitm) && cansee(hitm->mx, hitm->my)
4014         && distu(hitm->mx, hitm->my) <= max_range
4015         && distu(hitm->mx, hitm->my) >= min_range) {
4016         cc.x = hitm->mx;
4017         cc.y = hitm->my;
4018     }
4019     getpos_sethilite(display_polearm_positions, get_valid_polearm_position);
4020 /*JP
4021     if (getpos(&cc, TRUE, "the spot to hit") < 0)
4022 */
4023     if (getpos(&cc, TRUE, "\91_\82¤\8fê\8f\8a") < 0)
4024         return res; /* ESC; uses turn iff polearm became wielded */
4025
4026     glyph = glyph_at(cc.x, cc.y);
4027     if (distu(cc.x, cc.y) > max_range) {
4028 /*JP
4029         pline("Too far!");
4030 */
4031         pline("\89\93\82·\82¬\82é\81I");
4032         return res;
4033     } else if (distu(cc.x, cc.y) < min_range) {
4034 /*JP
4035         pline("Too close!");
4036 */
4037         pline("\8bß\82·\82¬\82é\81I");
4038         return res;
4039     } else if (!cansee(cc.x, cc.y) && !glyph_is_monster(glyph)
4040                && !glyph_is_invisible(glyph) && !glyph_is_statue(glyph)) {
4041         You(cant_see_spot);
4042         return res;
4043     } else if (!couldsee(cc.x, cc.y)) { /* Eyes of the Overworld */
4044         You(cant_reach);
4045         return res;
4046     }
4047
4048     context.polearm.hitmon = NULL;
4049     /* Attack the monster there */
4050     bhitpos = cc;
4051     if ((mtmp = m_at(bhitpos.x, bhitpos.y)) != (struct monst *) 0) {
4052         if (attack_checks(mtmp, uwep))
4053             return res;
4054         if (overexertion())
4055             return 1; /* burn nutrition; maybe pass out */
4056         context.polearm.hitmon = mtmp;
4057         check_caitiff(mtmp);
4058         notonhead = (bhitpos.x != mtmp->mx || bhitpos.y != mtmp->my);
4059         (void) thitmonst(mtmp, uwep);
4060     } else if (glyph_is_statue(glyph) /* might be hallucinatory */
4061                && sobj_at(STATUE, bhitpos.x, bhitpos.y)) {
4062         struct trap *t = t_at(bhitpos.x, bhitpos.y);
4063
4064         if (t && t->ttyp == STATUE_TRAP
4065             && activate_statue_trap(t, t->tx, t->ty, FALSE)) {
4066             ; /* feedback has been give by animate_statue() */
4067         } else {
4068             /* Since statues look like monsters now, we say something
4069                different from "you miss" or "there's nobody there".
4070                Note:  we only do this when a statue is displayed here,
4071                because the player is probably attempting to attack it;
4072                other statues obscured by anything are just ignored. */
4073 /*JP
4074             pline("Thump!  Your blow bounces harmlessly off the statue.");
4075 */
4076             pline("\83S\83c\83\93\81I\92¤\91\9c\82Í\8f\9d\82Â\82©\82È\82©\82Á\82½\81D");
4077             wake_nearto(bhitpos.x, bhitpos.y, 25);
4078         }
4079     } else {
4080         /* no monster here and no statue seen or remembered here */
4081         (void) unmap_invisible(bhitpos.x, bhitpos.y);
4082 /*JP
4083         You("miss; there is no one there to hit.");
4084 */
4085         You("\8aO\82ê\82½\81D\82»\82±\82É\82Í\89½\82à\82È\82¢\81D");
4086     }
4087     u_wipe_engr(2); /* same as for melee or throwing */
4088     return 1;
4089 }
4090
4091 STATIC_OVL int
4092 use_cream_pie(obj)
4093 struct obj *obj;
4094 {
4095     boolean wasblind = Blind;
4096     boolean wascreamed = u.ucreamed;
4097     boolean several = FALSE;
4098
4099     if (obj->quan > 1L) {
4100         several = TRUE;
4101         obj = splitobj(obj, 1L);
4102     }
4103     if (Hallucination)
4104 /*JP
4105         You("give yourself a facial.");
4106 */
4107         You("\83N\83\8a\81[\83\80\83p\83b\83N\82ð\82µ\82½\81D");
4108     else
4109 #if 0 /*JP*/
4110         pline("You immerse your %s in %s%s.", body_part(FACE),
4111               several ? "one of " : "",
4112               several ? makeplural(the(xname(obj))) : the(xname(obj)));
4113 #else
4114         pline("%s%s\82É%s\82ð\92¾\82ß\82½\81D",
4115               xname(obj),
4116               several ? "\82Ì\82Ð\82Æ\82Â" : "", body_part(FACE));
4117 #endif
4118     if (can_blnd((struct monst *) 0, &youmonst, AT_WEAP, obj)) {
4119         int blindinc = rnd(25);
4120         u.ucreamed += blindinc;
4121         make_blinded(Blinded + (long) blindinc, FALSE);
4122         if (!Blind || (Blind && wasblind))
4123 #if 0 /*JP*/
4124             pline("There's %ssticky goop all over your %s.",
4125                   wascreamed ? "more " : "", body_part(FACE));
4126 #else
4127             pline("\82â\82Á\82©\82¢\82È\82Ë\82Î\82Ë\82Î\82ª%s\91S\91Ì\82É%s\82Â\82¢\82½\81D",
4128                   body_part(FACE), wascreamed ? "\82³\82ç\82É" : "");
4129 #endif
4130         else /* Blind  && !wasblind */
4131 /*JP
4132             You_cant("see through all the sticky goop on your %s.",
4133 */
4134             pline("\82â\82Á\82©\82¢\82È\82Ë\82Î\82Ë\82Î\82ª%s\91S\91Ì\82É\82Â\82¢\82Ä\89½\82à\8c©\82¦\82È\82­\82È\82Á\82½\81D",
4135                      body_part(FACE));
4136     }
4137
4138     setnotworn(obj);
4139     /* useup() is appropriate, but we want costly_alteration()'s message */
4140     costly_alteration(obj, COST_SPLAT);
4141     obj_extract_self(obj);
4142     delobj(obj);
4143     return 0;
4144 }
4145
4146 STATIC_OVL int
4147 use_grapple(obj)
4148 struct obj *obj;
4149 {
4150     int res = 0, typ, max_range = 4, tohit;
4151     boolean save_confirm;
4152     coord cc;
4153     struct monst *mtmp;
4154     struct obj *otmp;
4155
4156     /* Are you allowed to use the hook? */
4157     if (u.uswallow) {
4158         pline(not_enough_room);
4159         return 0;
4160     }
4161     if (obj != uwep) {
4162         if (!wield_tool(obj, "cast"))
4163             return 0;
4164         else
4165             res = 1;
4166     }
4167     /* assert(obj == uwep); */
4168
4169     /* Prompt for a location */
4170     pline(where_to_hit);
4171     cc.x = u.ux;
4172     cc.y = u.uy;
4173 /*JP
4174     if (getpos(&cc, TRUE, "the spot to hit") < 0)
4175 */
4176     if (getpos(&cc, TRUE, "\91_\82¤\8fê\8f\8a") < 0)
4177         return res; /* ESC; uses turn iff grapnel became wielded */
4178
4179     /* Calculate range; unlike use_pole(), there's no minimum for range */
4180     typ = uwep_skill_type();
4181     if (typ == P_NONE || P_SKILL(typ) <= P_BASIC)
4182         max_range = 4;
4183     else if (P_SKILL(typ) == P_SKILLED)
4184         max_range = 5;
4185     else
4186         max_range = 8;
4187     if (distu(cc.x, cc.y) > max_range) {
4188 /*JP
4189         pline("Too far!");
4190 */
4191         pline("\89\93\82·\82¬\82é\81I");
4192         return res;
4193     } else if (!cansee(cc.x, cc.y)) {
4194         You(cant_see_spot);
4195         return res;
4196     } else if (!couldsee(cc.x, cc.y)) { /* Eyes of the Overworld */
4197         You(cant_reach);
4198         return res;
4199     }
4200
4201     /* What do you want to hit? */
4202     tohit = rn2(5);
4203     if (typ != P_NONE && P_SKILL(typ) >= P_SKILLED) {
4204         winid tmpwin = create_nhwindow(NHW_MENU);
4205         anything any;
4206         char buf[BUFSZ];
4207         menu_item *selected;
4208
4209         any = zeroany; /* set all bits to zero */
4210         any.a_int = 1; /* use index+1 (cant use 0) as identifier */
4211         start_menu(tmpwin);
4212         any.a_int++;
4213 /*JP
4214         Sprintf(buf, "an object on the %s", surface(cc.x, cc.y));
4215 */
4216         Sprintf(buf, "%s\82É\82 \82é\95¨\91Ì", surface(cc.x, cc.y));
4217         add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf,
4218                  MENU_UNSELECTED);
4219         any.a_int++;
4220 #if 0 /*JP*/
4221         add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, "a monster",
4222                  MENU_UNSELECTED);
4223 #else
4224         add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, "\89ö\95¨",
4225                  MENU_UNSELECTED);
4226 #endif
4227         any.a_int++;
4228 /*JP
4229         Sprintf(buf, "the %s", surface(cc.x, cc.y));
4230 */
4231         Sprintf(buf, "%s", surface(cc.x, cc.y));
4232         add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf,
4233                  MENU_UNSELECTED);
4234 /*JP
4235         end_menu(tmpwin, "Aim for what?");
4236 */
4237         end_menu(tmpwin, "\89½\82ð\91_\82¤\81H");
4238         tohit = rn2(4);
4239         if (select_menu(tmpwin, PICK_ONE, &selected) > 0
4240             && rn2(P_SKILL(typ) > P_SKILLED ? 20 : 2))
4241             tohit = selected[0].item.a_int - 1;
4242         free((genericptr_t) selected);
4243         destroy_nhwindow(tmpwin);
4244     }
4245
4246     /* possibly scuff engraving at your feet;
4247        any engraving at the target location is unaffected */
4248     if (tohit == 2 || !rn2(2))
4249         u_wipe_engr(rnd(2));
4250
4251     /* What did you hit? */
4252     switch (tohit) {
4253     case 0: /* Trap */
4254         /* FIXME -- untrap needs to deal with non-adjacent traps */
4255         break;
4256     case 1: /* Object */
4257         if ((otmp = level.objects[cc.x][cc.y]) != 0) {
4258 /*JP
4259             You("snag an object from the %s!", surface(cc.x, cc.y));
4260 */
4261             You("%s\82Ì\82à\82Ì\82ð\88ø\82Á\8a|\82¯\82½\81I", surface(cc.x, cc.y));
4262             (void) pickup_object(otmp, 1L, FALSE);
4263             /* If pickup fails, leave it alone */
4264             newsym(cc.x, cc.y);
4265             return 1;
4266         }
4267         break;
4268     case 2: /* Monster */
4269         bhitpos = cc;
4270         if ((mtmp = m_at(cc.x, cc.y)) == (struct monst *) 0)
4271             break;
4272         notonhead = (bhitpos.x != mtmp->mx || bhitpos.y != mtmp->my);
4273         save_confirm = flags.confirm;
4274         if (verysmall(mtmp->data) && !rn2(4)
4275             && enexto(&cc, u.ux, u.uy, (struct permonst *) 0)) {
4276             flags.confirm = FALSE;
4277             (void) attack_checks(mtmp, uwep);
4278             flags.confirm = save_confirm;
4279             check_caitiff(mtmp); /* despite fact there's no damage */
4280 /*JP
4281             You("pull in %s!", mon_nam(mtmp));
4282 */
4283             You("%s\82ð\88ø\82Á\92£\82Á\82½\81I", mon_nam(mtmp));
4284             mtmp->mundetected = 0;
4285             rloc_to(mtmp, cc.x, cc.y);
4286             return 1;
4287         } else if ((!bigmonst(mtmp->data) && !strongmonst(mtmp->data))
4288                    || rn2(4)) {
4289             flags.confirm = FALSE;
4290             (void) attack_checks(mtmp, uwep);
4291             flags.confirm = save_confirm;
4292             check_caitiff(mtmp);
4293             (void) thitmonst(mtmp, uwep);
4294             return 1;
4295         }
4296     /* FALL THROUGH */
4297     case 3: /* Surface */
4298         if (IS_AIR(levl[cc.x][cc.y].typ) || is_pool(cc.x, cc.y))
4299 /*JP
4300             pline_The("hook slices through the %s.", surface(cc.x, cc.y));
4301 */
4302             pline("\83t\83b\83N\82Í%s\82ð\82³\82Á\82Æ\90Ø\82Á\82½\81D", surface(cc.x, cc.y));
4303         else {
4304 /*JP
4305             You("are yanked toward the %s!", surface(cc.x, cc.y));
4306 */
4307             You("%s\82Ö\88ø\82Á\82Ï\82ç\82ê\82½\81I", surface(cc.x, cc.y));
4308             hurtle(sgn(cc.x - u.ux), sgn(cc.y - u.uy), 1, FALSE);
4309             spoteffects(TRUE);
4310         }
4311         return 1;
4312     default: /* Yourself (oops!) */
4313         if (P_SKILL(typ) <= P_BASIC) {
4314 /*JP
4315             You("hook yourself!");
4316 */
4317             You("\8e©\95ª\8e©\90g\82ð\88ø\82Á\8a|\82¯\82½\81I");
4318 /*JP
4319             losehp(Maybe_Half_Phys(rn1(10, 10)), "a grappling hook",
4320 */
4321             losehp(Maybe_Half_Phys(rn1(10, 10)), "\8e©\95ª\8e©\90g\82ð\88ø\82Á\8a|\82¯\82Ä",
4322                    KILLED_BY);
4323             return 1;
4324         }
4325         break;
4326     }
4327     pline1(nothing_happens);
4328     return 1;
4329 }
4330
4331 #define BY_OBJECT ((struct monst *) 0)
4332
4333 /* return 1 if the wand is broken, hence some time elapsed */
4334 STATIC_OVL int
4335 do_break_wand(obj)
4336 struct obj *obj;
4337 {
4338 /*JP
4339     static const char nothing_else_happens[] = "But nothing else happens...";
4340 */
4341     static const char nothing_else_happens[] = "\82µ\82©\82µ\81C\89½\82à\8bN\82«\82È\82©\82Á\82½\81D\81D\81D";
4342     register int i, x, y;
4343     register struct monst *mon;
4344     int dmg, damage;
4345     boolean affects_objects;
4346     boolean shop_damage = FALSE;
4347     boolean fillmsg = FALSE;
4348     int expltype = EXPL_MAGICAL;
4349     char confirm[QBUFSZ], buf[BUFSZ];
4350 /*JP
4351     boolean is_fragile = (!strcmp(OBJ_DESCR(objects[obj->otyp]), "balsa"));
4352 */
4353     boolean is_fragile = (!strcmp(OBJ_DESCR(objects[obj->otyp]), "\83o\83\8b\83T\82Ì\8fñ"));
4354
4355 #if 0 /*JP*/
4356     if (!paranoid_query(ParanoidBreakwand,
4357                        safe_qbuf(confirm,
4358                                  "Are you really sure you want to break ",
4359                                  "?", obj, yname, ysimple_name, "the wand")))
4360 #else
4361     if (!paranoid_query(ParanoidBreakwand,
4362                        safe_qbuf(confirm,
4363                                  "\96{\93\96\82É", "\82ð\89ó\82·\82Ì\81H",
4364                                  obj, xname, ysimple_name, "\8fñ")))
4365 #endif
4366         return 0;
4367
4368     if (nohands(youmonst.data)) {
4369 /*JP
4370         You_cant("break %s without hands!", yname(obj));
4371 */
4372         You("\8eè\82ª\96³\82¢\82Ì\82Å%s\82ð\89ó\82¹\82È\82¢\81I", xname(obj));
4373         return 0;
4374     } else if (ACURR(A_STR) < (is_fragile ? 5 : 10)) {
4375 /*JP
4376         You("don't have the strength to break %s!", yname(obj));
4377 */
4378         You("%s\82ð\89ó\82·\82¾\82¯\82Ì\97Í\82ª\82È\82¢\81I", xname(obj));
4379         return 0;
4380     }
4381 #if 0 /*JP:T*/
4382     pline("Raising %s high above your %s, you %s it in two!", yname(obj),
4383           body_part(HEAD), is_fragile ? "snap" : "break");
4384 #else
4385     pline("%s\82ð%s\82Ì\8fã\82É\8d\82\82­\8cf\82°\81C\93ñ\82Â\82É\82Ö\82µ\90Ü\82Á\82½\81I", yname(obj),
4386           body_part(HEAD));
4387 #endif
4388
4389     /* [ALI] Do this first so that wand is removed from bill. Otherwise,
4390      * the freeinv() below also hides it from setpaid() which causes problems.
4391      */
4392     if (obj->unpaid) {
4393         check_unpaid(obj); /* Extra charge for use */
4394         costly_alteration(obj, COST_DSTROY);
4395     }
4396
4397     current_wand = obj; /* destroy_item might reset this */
4398     freeinv(obj);       /* hide it from destroy_item instead... */
4399     setnotworn(obj);    /* so we need to do this ourselves */
4400
4401     if (!zappable(obj)) {
4402         pline(nothing_else_happens);
4403         goto discard_broken_wand;
4404     }
4405     /* successful call to zappable() consumes a charge; put it back */
4406     obj->spe++;
4407     /* might have "wrested" a final charge, taking it from 0 to -1;
4408        if so, we just brought it back up to 0, which wouldn't do much
4409        below so give it 1..3 charges now, usually making it stronger
4410        than an ordinary last charge (the wand is already gone from
4411        inventory, so perm_invent can't accidentally reveal this) */
4412     if (!obj->spe)
4413         obj->spe = rnd(3);
4414
4415     obj->ox = u.ux;
4416     obj->oy = u.uy;
4417     dmg = obj->spe * 4;
4418     affects_objects = FALSE;
4419
4420     switch (obj->otyp) {
4421     case WAN_WISHING:
4422     case WAN_NOTHING:
4423     case WAN_LOCKING:
4424     case WAN_PROBING:
4425     case WAN_ENLIGHTENMENT:
4426     case WAN_OPENING:
4427     case WAN_SECRET_DOOR_DETECTION:
4428         pline(nothing_else_happens);
4429         goto discard_broken_wand;
4430     case WAN_DEATH:
4431     case WAN_LIGHTNING:
4432         dmg *= 4;
4433         goto wanexpl;
4434     case WAN_FIRE:
4435         expltype = EXPL_FIERY;
4436         /*FALLTHRU*/
4437     case WAN_COLD:
4438         if (expltype == EXPL_MAGICAL)
4439             expltype = EXPL_FROSTY;
4440         dmg *= 2;
4441         /*FALLTHRU*/
4442     case WAN_MAGIC_MISSILE:
4443     wanexpl:
4444         explode(u.ux, u.uy, -(obj->otyp), dmg, WAND_CLASS, expltype);
4445         makeknown(obj->otyp); /* explode describes the effect */
4446         goto discard_broken_wand;
4447     case WAN_STRIKING:
4448         /* we want this before the explosion instead of at the very end */
4449 /*JP
4450         pline("A wall of force smashes down around you!");
4451 */
4452         pline("\82 \82È\82½\82Í\96\82\97Í\82Ì\95Ç\82É\82Â\82Â\82Ü\82ê\82½\81I");
4453         dmg = d(1 + obj->spe, 6); /* normally 2d12 */
4454         /*FALLTHRU*/
4455     case WAN_CANCELLATION:
4456     case WAN_POLYMORPH:
4457     case WAN_TELEPORTATION:
4458     case WAN_UNDEAD_TURNING:
4459         affects_objects = TRUE;
4460         break;
4461     default:
4462         break;
4463     }
4464
4465     /* magical explosion and its visual effect occur before specific effects
4466      */
4467     /* [TODO?  This really ought to prevent the explosion from being
4468        fatal so that we never leave a bones file where none of the
4469        surrounding targets (or underlying objects) got affected yet.] */
4470     explode(obj->ox, obj->oy, -(obj->otyp), rnd(dmg), WAND_CLASS,
4471             EXPL_MAGICAL);
4472
4473     /* prepare for potential feedback from polymorph... */
4474     zapsetup();
4475
4476     /* this makes it hit us last, so that we can see the action first */
4477     for (i = 0; i <= 8; i++) {
4478         bhitpos.x = x = obj->ox + xdir[i];
4479         bhitpos.y = y = obj->oy + ydir[i];
4480         if (!isok(x, y))
4481             continue;
4482
4483         if (obj->otyp == WAN_DIGGING) {
4484             schar typ;
4485
4486             if (dig_check(BY_OBJECT, FALSE, x, y)) {
4487                 if (IS_WALL(levl[x][y].typ) || IS_DOOR(levl[x][y].typ)) {
4488                     /* normally, pits and holes don't anger guards, but they
4489                      * do if it's a wall or door that's being dug */
4490                     watch_dig((struct monst *) 0, x, y, TRUE);
4491                     if (*in_rooms(x, y, SHOPBASE))
4492                         shop_damage = TRUE;
4493                 }
4494                 /*
4495                  * Let liquid flow into the newly created pits.
4496                  * Adjust corresponding code in music.c for
4497                  * drum of earthquake if you alter this sequence.
4498                  */
4499                 typ = fillholetyp(x, y, FALSE);
4500                 if (typ != ROOM) {
4501                     levl[x][y].typ = typ;
4502                     liquid_flow(x, y, typ, t_at(x, y),
4503                                 fillmsg
4504                                   ? (char *) 0
4505 /*JP
4506                                   : "Some holes are quickly filled with %s!");
4507 */
4508                                   : "\8c\8a\82Í\82·\82®\82É%s\82Å\96\84\82Ü\82Á\82½\81I");
4509                     fillmsg = TRUE;
4510                 } else
4511                     digactualhole(x, y, BY_OBJECT, (rn2(obj->spe) < 3
4512                                                     || (!Can_dig_down(&u.uz)
4513                                                         && !levl[x][y].candig))
4514                                                       ? PIT
4515                                                       : HOLE);
4516             }
4517             continue;
4518         } else if (obj->otyp == WAN_CREATE_MONSTER) {
4519             /* u.ux,u.uy creates it near you--x,y might create it in rock */
4520             (void) makemon((struct permonst *) 0, u.ux, u.uy, NO_MM_FLAGS);
4521             continue;
4522         } else if (x != u.ux || y != u.uy) {
4523             /*
4524              * Wand breakage is targetting a square adjacent to the hero,
4525              * which might contain a monster or a pile of objects or both.
4526              * Handle objects last; avoids having undead turning raise an
4527              * undead's corpse and then attack resulting undead monster.
4528              * obj->bypass in bhitm() prevents the polymorphing of items
4529              * dropped due to monster's polymorph and prevents undead
4530              * turning that kills an undead from raising resulting corpse.
4531              */
4532             if ((mon = m_at(x, y)) != 0) {
4533                 (void) bhitm(mon, obj);
4534                 /* if (context.botl) bot(); */
4535             }
4536             if (affects_objects && level.objects[x][y]) {
4537                 (void) bhitpile(obj, bhito, x, y, 0);
4538                 if (context.botl)
4539                     bot(); /* potion effects */
4540             }
4541         } else {
4542             /*
4543              * Wand breakage is targetting the hero.  Using xdir[]+ydir[]
4544              * deltas for location selection causes this case to happen
4545              * after all the surrounding squares have been handled.
4546              * Process objects first, in case damage is fatal and leaves
4547              * bones, or teleportation sends one or more of the objects to
4548              * same destination as hero (lookhere/autopickup); also avoids
4549              * the polymorphing of gear dropped due to hero's transformation.
4550              * (Unlike with monsters being hit by zaps, we can't rely on use
4551              * of obj->bypass in the zap code to accomplish that last case
4552              * since it's also used by retouch_equipment() for polyself.)
4553              */
4554             if (affects_objects && level.objects[x][y]) {
4555                 (void) bhitpile(obj, bhito, x, y, 0);
4556                 if (context.botl)
4557                     bot(); /* potion effects */
4558             }
4559             damage = zapyourself(obj, FALSE);
4560             if (damage) {
4561 #if 0 /*JP:T*/
4562                 Sprintf(buf, "killed %sself by breaking a wand", uhim());
4563                 losehp(Maybe_Half_Phys(damage), buf, NO_KILLER_PREFIX);
4564 #else
4565                 Strcpy(buf, "\8e©\95ª\8e©\90g\82Å\8fñ\82ð\89ó\82µ\82Ä\83_\83\81\81[\83W\82ð\8eó\82¯");
4566                 losehp(Maybe_Half_Phys(damage), buf, KILLED_BY);
4567 #endif
4568             }
4569             if (context.botl)
4570                 bot(); /* blindness */
4571         }
4572     }
4573
4574     /* potentially give post zap/break feedback */
4575     zapwrapup();
4576
4577     /* Note: if player fell thru, this call is a no-op.
4578        Damage is handled in digactualhole in that case */
4579     if (shop_damage)
4580 /*JP
4581         pay_for_damage("dig into", FALSE);
4582 */
4583         pay_for_damage("\8c\8a\82ð\82 \82¯\82é", FALSE);
4584
4585     if (obj->otyp == WAN_LIGHT)
4586         litroom(TRUE, obj); /* only needs to be done once */
4587
4588 discard_broken_wand:
4589     obj = current_wand; /* [see dozap() and destroy_item()] */
4590     current_wand = 0;
4591     if (obj)
4592         delobj(obj);
4593     nomul(0);
4594     return 1;
4595 }
4596
4597 STATIC_OVL void
4598 add_class(cl, class)
4599 char *cl;
4600 char class;
4601 {
4602     char tmp[2];
4603
4604     tmp[0] = class;
4605     tmp[1] = '\0';
4606     Strcat(cl, tmp);
4607 }
4608
4609 static const char tools[] = { TOOL_CLASS, WEAPON_CLASS, WAND_CLASS, 0 };
4610
4611 /* augment tools[] if various items are carried */
4612 STATIC_OVL void
4613 setapplyclasses(class_list)
4614 char class_list[];
4615 {
4616     register struct obj *otmp;
4617     int otyp;
4618     boolean knowoil, knowtouchstone, addpotions, addstones, addfood;
4619
4620     knowoil = objects[POT_OIL].oc_name_known;
4621     knowtouchstone = objects[TOUCHSTONE].oc_name_known;
4622     addpotions = addstones = addfood = FALSE;
4623     for (otmp = invent; otmp; otmp = otmp->nobj) {
4624         otyp = otmp->otyp;
4625         if (otyp == POT_OIL
4626             || (otmp->oclass == POTION_CLASS
4627                 && (!otmp->dknown
4628                     || (!knowoil && !objects[otyp].oc_name_known))))
4629             addpotions = TRUE;
4630         if (otyp == TOUCHSTONE
4631             || (is_graystone(otmp)
4632                 && (!otmp->dknown
4633                     || (!knowtouchstone && !objects[otyp].oc_name_known))))
4634             addstones = TRUE;
4635         if (otyp == CREAM_PIE || otyp == EUCALYPTUS_LEAF)
4636             addfood = TRUE;
4637     }
4638
4639     class_list[0] = '\0';
4640     if (addpotions || addstones)
4641         add_class(class_list, ALL_CLASSES);
4642     Strcat(class_list, tools);
4643     if (addpotions)
4644         add_class(class_list, POTION_CLASS);
4645     if (addstones)
4646         add_class(class_list, GEM_CLASS);
4647     if (addfood)
4648         add_class(class_list, FOOD_CLASS);
4649 }
4650
4651 /* the 'a' command */
4652 int
4653 doapply()
4654 {
4655     struct obj *obj;
4656     register int res = 1;
4657     char class_list[MAXOCLASSES + 2];
4658
4659     if (check_capacity((char *) 0))
4660         return 0;
4661
4662     setapplyclasses(class_list); /* tools[] */
4663     obj = getobj(class_list, "use or apply");
4664     if (!obj)
4665         return 0;
4666
4667     if (!retouch_object(&obj, FALSE))
4668         return 1; /* evading your grasp costs a turn; just be
4669                      grateful that you don't drop it as well */
4670
4671     if (obj->oclass == WAND_CLASS)
4672         return do_break_wand(obj);
4673
4674     switch (obj->otyp) {
4675     case BLINDFOLD:
4676     case LENSES:
4677         if (obj == ublindf) {
4678             if (!cursed(obj))
4679                 Blindf_off(obj);
4680         } else if (!ublindf) {
4681             Blindf_on(obj);
4682         } else {
4683 #if 0 /*JP*/
4684             You("are already %s.", ublindf->otyp == TOWEL
4685                                        ? "covered by a towel"
4686                                        : ublindf->otyp == BLINDFOLD
4687                                              ? "wearing a blindfold"
4688                                              : "wearing lenses");
4689 #else
4690             You("\82à\82¤%s\82Ä\82¢\82é\81D", ublindf->otyp == TOWEL
4691                                       ? "\83^\83I\83\8b\82ð\8aª\82¢"
4692                                       : ublindf->otyp == BLINDFOLD
4693                                             ? "\96Ú\89B\82µ\82ð\82Â\82¯"
4694                                             : "\83\8c\83\93\83Y\82ð\82Â\82¯");
4695 #endif
4696         }
4697         break;
4698     case CREAM_PIE:
4699         res = use_cream_pie(obj);
4700         break;
4701     case BULLWHIP:
4702         res = use_whip(obj);
4703         break;
4704     case GRAPPLING_HOOK:
4705         res = use_grapple(obj);
4706         break;
4707     case LARGE_BOX:
4708     case CHEST:
4709     case ICE_BOX:
4710     case SACK:
4711     case BAG_OF_HOLDING:
4712     case OILSKIN_SACK:
4713         res = use_container(&obj, 1, FALSE);
4714         break;
4715     case BAG_OF_TRICKS:
4716         (void) bagotricks(obj, FALSE, (int *) 0);
4717         break;
4718     case CAN_OF_GREASE:
4719         use_grease(obj);
4720         break;
4721     case LOCK_PICK:
4722     case CREDIT_CARD:
4723     case SKELETON_KEY:
4724         res = (pick_lock(obj) != 0);
4725         break;
4726     case PICK_AXE:
4727     case DWARVISH_MATTOCK:
4728         res = use_pick_axe(obj);
4729         break;
4730     case TINNING_KIT:
4731         use_tinning_kit(obj);
4732         break;
4733     case LEASH:
4734         res = use_leash(obj);
4735         break;
4736     case SADDLE:
4737         res = use_saddle(obj);
4738         break;
4739     case MAGIC_WHISTLE:
4740         use_magic_whistle(obj);
4741         break;
4742     case TIN_WHISTLE:
4743         use_whistle(obj);
4744         break;
4745     case EUCALYPTUS_LEAF:
4746         /* MRKR: Every Australian knows that a gum leaf makes an excellent
4747          * whistle, especially if your pet is a tame kangaroo named Skippy.
4748          */
4749         if (obj->blessed) {
4750             use_magic_whistle(obj);
4751             /* sometimes the blessing will be worn off */
4752             if (!rn2(49)) {
4753                 if (!Blind) {
4754 /*JP
4755                     pline("%s %s.", Yobjnam2(obj, "glow"), hcolor("brown"));
4756 */
4757                     pline("%s\82Í%s\8bP\82¢\82½\81D", xname(obj), jconj_adj(hcolor("\92\83\90F\82Ì")));
4758                     obj->bknown = 1;
4759                 }
4760                 unbless(obj);
4761             }
4762         } else {
4763             use_whistle(obj);
4764         }
4765         break;
4766     case STETHOSCOPE:
4767         res = use_stethoscope(obj);
4768         break;
4769     case MIRROR:
4770         res = use_mirror(obj);
4771         break;
4772     case BELL:
4773     case BELL_OF_OPENING:
4774         use_bell(&obj);
4775         break;
4776     case CANDELABRUM_OF_INVOCATION:
4777         use_candelabrum(obj);
4778         break;
4779     case WAX_CANDLE:
4780     case TALLOW_CANDLE:
4781         use_candle(&obj);
4782         break;
4783     case OIL_LAMP:
4784     case MAGIC_LAMP:
4785     case BRASS_LANTERN:
4786         use_lamp(obj);
4787         break;
4788     case POT_OIL:
4789         light_cocktail(&obj);
4790         break;
4791     case EXPENSIVE_CAMERA:
4792         res = use_camera(obj);
4793         break;
4794     case TOWEL:
4795         res = use_towel(obj);
4796         break;
4797     case CRYSTAL_BALL:
4798         use_crystal_ball(&obj);
4799         break;
4800     case MAGIC_MARKER:
4801         res = dowrite(obj);
4802         break;
4803     case TIN_OPENER:
4804         res = use_tin_opener(obj);
4805         break;
4806     case FIGURINE:
4807         use_figurine(&obj);
4808         break;
4809     case UNICORN_HORN:
4810         use_unicorn_horn(obj);
4811         break;
4812     case WOODEN_FLUTE:
4813     case MAGIC_FLUTE:
4814     case TOOLED_HORN:
4815     case FROST_HORN:
4816     case FIRE_HORN:
4817     case WOODEN_HARP:
4818     case MAGIC_HARP:
4819     case BUGLE:
4820     case LEATHER_DRUM:
4821     case DRUM_OF_EARTHQUAKE:
4822         res = do_play_instrument(obj);
4823         break;
4824     case HORN_OF_PLENTY: /* not a musical instrument */
4825         (void) hornoplenty(obj, FALSE);
4826         break;
4827     case LAND_MINE:
4828     case BEARTRAP:
4829         use_trap(obj);
4830         break;
4831     case FLINT:
4832     case LUCKSTONE:
4833     case LOADSTONE:
4834     case TOUCHSTONE:
4835         use_stone(obj);
4836         break;
4837     default:
4838         /* Pole-weapons can strike at a distance */
4839         if (is_pole(obj)) {
4840             res = use_pole(obj);
4841             break;
4842         } else if (is_pick(obj) || is_axe(obj)) {
4843             res = use_pick_axe(obj);
4844             break;
4845         }
4846 /*JP
4847         pline("Sorry, I don't know how to use that.");
4848 */
4849         pline("\82»\82ê\82ð\82Ç\82¤\82â\82Á\82Ä\8eg\82¤\82ñ\82¾\82¢\81H");
4850         nomul(0);
4851         return 0;
4852     }
4853     if (res && obj && obj->oartifact)
4854         arti_speak(obj);
4855     nomul(0);
4856     return res;
4857 }
4858
4859 /* Keep track of unfixable troubles for purposes of messages saying you feel
4860  * great.
4861  */
4862 int
4863 unfixable_trouble_count(is_horn)
4864 boolean is_horn;
4865 {
4866     int unfixable_trbl = 0;
4867
4868     if (Stoned)
4869         unfixable_trbl++;
4870     if (Strangled)
4871         unfixable_trbl++;
4872     if (Wounded_legs && !u.usteed)
4873         unfixable_trbl++;
4874     if (Slimed)
4875         unfixable_trbl++;
4876     /* lycanthropy is undesirable, but it doesn't actually make you feel bad */
4877
4878     if (!is_horn || (Confusion & ~TIMEOUT))
4879         unfixable_trbl++;
4880     if (!is_horn || (Sick & ~TIMEOUT))
4881         unfixable_trbl++;
4882     if (!is_horn || (HHallucination & ~TIMEOUT))
4883         unfixable_trbl++;
4884     if (!is_horn || (Vomiting & ~TIMEOUT))
4885         unfixable_trbl++;
4886     if (!is_horn || (HStun & ~TIMEOUT))
4887         unfixable_trbl++;
4888     if (!is_horn || (HDeaf & ~TIMEOUT))
4889         unfixable_trbl++;
4890
4891     return unfixable_trbl;
4892 }
4893
4894 /*apply.c*/