OSDN Git Service

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