OSDN Git Service

upgrade to 3.6.1
[jnethack/source.git] / src / dothrow.c
1 /* NetHack 3.6  dothrow.c       $NHDT-Date: 1522967321 2018/04/05 22:28:41 $  $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.135 $ */
2 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
3 /*-Copyright (c) Robert Patrick Rankin, 2013. */
4 /* NetHack may be freely redistributed.  See license for details. */
5
6 /* Contains code for 't' (throw) */
7
8 /* JNetHack Copyright */
9 /* (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000  */
10 /* For 3.4-, Copyright (c) SHIRAKATA Kentaro, 2002-2016            */
11 /* JNetHack may be freely redistributed.  See license for details. */
12
13 #include "hack.h"
14
15 STATIC_DCL int FDECL(throw_obj, (struct obj *, int));
16 STATIC_DCL boolean FDECL(ok_to_throw, (int *));
17 STATIC_DCL void NDECL(autoquiver);
18 STATIC_DCL int FDECL(gem_accept, (struct monst *, struct obj *));
19 STATIC_DCL void FDECL(tmiss, (struct obj *, struct monst *, BOOLEAN_P));
20 STATIC_DCL int FDECL(throw_gold, (struct obj *));
21 STATIC_DCL void FDECL(check_shop_obj, (struct obj *, XCHAR_P, XCHAR_P,
22                                        BOOLEAN_P));
23 STATIC_DCL void FDECL(breakmsg, (struct obj *, BOOLEAN_P));
24 STATIC_DCL boolean FDECL(toss_up, (struct obj *, BOOLEAN_P));
25 STATIC_DCL void FDECL(sho_obj_return_to_u, (struct obj * obj));
26 STATIC_DCL boolean FDECL(mhurtle_step, (genericptr_t, int, int));
27
28 static NEARDATA const char toss_objs[] = { ALLOW_COUNT, COIN_CLASS,
29                                            ALL_CLASSES, WEAPON_CLASS, 0 };
30 /* different default choices when wielding a sling (gold must be included) */
31 static NEARDATA const char bullets[] = { ALLOW_COUNT, COIN_CLASS, ALL_CLASSES,
32                                          GEM_CLASS, 0 };
33
34 /* thrownobj (decl.c) tracks an object until it lands */
35
36 extern boolean notonhead; /* for long worms */
37
38 /* Throw the selected object, asking for direction */
39 STATIC_OVL int
40 throw_obj(obj, shotlimit)
41 struct obj *obj;
42 int shotlimit;
43 {
44     struct obj *otmp;
45     int multishot;
46     schar skill;
47     long wep_mask;
48     boolean twoweap, weakmultishot;
49
50     /* ask "in what direction?" */
51     if (!getdir((char *) 0)) {
52         /* No direction specified, so cancel the throw;
53          * might need to undo an object split.
54          * We used to use freeinv(obj),addinv(obj) here, but that can
55          * merge obj into another stack--usually quiver--even if it hadn't
56          * been split from there (possibly triggering a panic in addinv),
57          * and freeinv+addinv potentially has other side-effects.
58          */
59         if (obj->o_id == context.objsplit.parent_oid
60             || obj->o_id == context.objsplit.child_oid)
61             (void) unsplitobj(obj);
62         return 0; /* no time passes */
63     }
64
65     /*
66      * Throwing money is usually for getting rid of it when
67      * a leprechaun approaches, or for bribing an oncoming
68      * angry monster.  So throw the whole object.
69      *
70      * If the money is in quiver, throw one coin at a time,
71      * possibly using a sling.
72      */
73     if (obj->oclass == COIN_CLASS && obj != uquiver)
74         return throw_gold(obj);
75
76 /*JP
77     if (!canletgo(obj, "throw"))
78 */
79     if (!canletgo(obj, "\93\8a\82°\82é"))
80         return 0;
81     if (obj->oartifact == ART_MJOLLNIR && obj != uwep) {
82 /*JP
83         pline("%s must be wielded before it can be thrown.", The(xname(obj)));
84 */
85         pline("\93\8a\82°\82é\91O\82É%s\82ð\91\95\94õ\82µ\82È\82­\82Ä\82Í\82È\82ç\82È\82¢\81D", xname(obj));
86         return 0;
87     }
88     if ((obj->oartifact == ART_MJOLLNIR && ACURR(A_STR) < STR19(25))
89         || (obj->otyp == BOULDER && !throws_rocks(youmonst.data))) {
90 /*JP
91         pline("It's too heavy.");
92 */
93         pline("\8fd\82·\82¬\82Ä\93\8a\82°\82ç\82ê\82È\82¢\81D");
94         return 1;
95     }
96     if (!u.dx && !u.dy && !u.dz) {
97 /*JP
98         You("cannot throw an object at yourself.");
99 */
100         pline("\8e©\95ª\82É\8cü\82©\82Á\82Ä\82Í\93\8a\82°\82ç\82ê\82È\82¢\81D");
101         return 0;
102     }
103     u_wipe_engr(2);
104     if (!uarmg && obj->otyp == CORPSE && touch_petrifies(&mons[obj->corpsenm])
105         && !Stone_resistance) {
106 #if 0 /*JP*/
107         You("throw %s with your bare %s.",
108             corpse_xname(obj, (const char *) 0, CXN_PFX_THE),
109             /* throwing with one hand, but pluralize since the
110                expression "with your bare hands" sounds better */
111             makeplural(body_part(HAND)));
112 #else
113         You("\91f%s\82Å%s\82Ì\8e\80\91Ì\82ð\93\8a\82°\82½\81D",
114             body_part(HAND),
115             corpse_xname(obj, (const char *) 0, CXN_PFX_THE));
116 #endif
117 /*JP
118         Sprintf(killer.name, "throwing %s bare-handed", killer_xname(obj));
119 */
120         Sprintf(killer.name, "%s\82Ì\8e\80\91Ì\82ð\91f\8eè\82Å\93\8a\82°\82Ä", killer_xname(obj));
121         instapetrify(killer.name);
122     }
123     if (welded(obj)) {
124         weldmsg(obj);
125         return 1;
126     }
127     if (is_wet_towel(obj))
128         dry_a_towel(obj, -1, FALSE);
129
130     /* Multishot calculations
131      * (potential volley of up to N missiles; default for N is 1)
132      */
133     multishot = 1;
134     skill = objects[obj->otyp].oc_skill;
135     if (obj->quan > 1L /* no point checking if there's only 1 */
136         /* ammo requires corresponding launcher be wielded */
137         && (is_ammo(obj) ? matching_launcher(obj, uwep)
138                          /* otherwise any stackable (non-ammo) weapon */
139                          : obj->oclass == WEAPON_CLASS)
140         && !(Confusion || Stunned)) {
141         /* some roles don't get a volley bonus until becoming expert */
142         weakmultishot = (Role_if(PM_WIZARD) || Role_if(PM_PRIEST)
143                          || (Role_if(PM_HEALER) && skill != P_KNIFE)
144                          || (Role_if(PM_TOURIST) && skill != -P_DART)
145                          /* poor dexterity also inhibits multishot */
146                          || Fumbling || ACURR(A_DEX) <= 6);
147
148         /* Bonus if the player is proficient in this weapon... */
149         switch (P_SKILL(weapon_type(obj))) {
150         case P_EXPERT:
151             multishot++;
152         /*FALLTHRU*/
153         case P_SKILLED:
154             if (!weakmultishot)
155                 multishot++;
156             break;
157         default: /* basic or unskilled: no bonus */
158             break;
159         }
160         /* ...or is using a special weapon for their role... */
161         switch (Role_switch) {
162         case PM_CAVEMAN:
163             /* give bonus for low-tech gear */
164             if (skill == -P_SLING || skill == P_SPEAR)
165                 multishot++;
166             break;
167         case PM_MONK:
168             /* allow higher volley count despite skill limitation */
169             if (skill == -P_SHURIKEN)
170                 multishot++;
171             break;
172         case PM_RANGER:
173             /* arbitrary; encourage use of other missiles beside daggers */
174             if (skill != P_DAGGER)
175                 multishot++;
176             break;
177         case PM_ROGUE:
178             /* possibly should add knives... */
179             if (skill == P_DAGGER)
180                 multishot++;
181             break;
182         case PM_SAMURAI:
183             /* role-specific launcher and its ammo */
184             if (obj->otyp == YA && uwep && uwep->otyp == YUMI)
185                 multishot++;
186             break;
187         default:
188             break; /* No bonus */
189         }
190         /* ...or using their race's special bow; no bonus for spears */
191         if (!weakmultishot)
192             switch (Race_switch) {
193             case PM_ELF:
194                 if (obj->otyp == ELVEN_ARROW && uwep
195                     && uwep->otyp == ELVEN_BOW)
196                     multishot++;
197                 break;
198             case PM_ORC:
199                 if (obj->otyp == ORCISH_ARROW && uwep
200                     && uwep->otyp == ORCISH_BOW)
201                     multishot++;
202                 break;
203             case PM_GNOME:
204                 /* arbitrary; there isn't any gnome-specific gear */
205                 if (skill == -P_CROSSBOW)
206                     multishot++;
207                 break;
208             case PM_HUMAN:
209             case PM_DWARF:
210             default:
211                 break; /* No bonus */
212             }
213
214         /* crossbows are slow to load and probably shouldn't allow multiple
215            shots at all, but that would result in players never using them;
216            instead, high strength is necessary to load and shoot quickly */
217         if (multishot > 1 && skill == -P_CROSSBOW
218             && ammo_and_launcher(obj, uwep)
219             && (int) ACURRSTR < (Race_if(PM_GNOME) ? 16 : 18))
220             multishot = rnd(multishot);
221
222         multishot = rnd(multishot);
223         if ((long) multishot > obj->quan)
224             multishot = (int) obj->quan;
225         if (shotlimit > 0 && multishot > shotlimit)
226             multishot = shotlimit;
227     }
228
229     m_shot.s = ammo_and_launcher(obj, uwep) ? TRUE : FALSE;
230     /* give a message if shooting more than one, or if player
231        attempted to specify a count */
232     if (multishot > 1 || shotlimit > 0) {
233         /* "You shoot N arrows." or "You throw N daggers." */
234 #if 0 /*JP*/
235         You("%s %d %s.", m_shot.s ? "shoot" : "throw",
236             multishot, /* (might be 1 if player gave shotlimit) */
237             (multishot == 1) ? singular(obj, xname) : xname(obj));
238 #else
239         You("%d%s\82Ì%s\82ð%s\81D",
240             multishot,
241             numeral(obj), xname(obj),
242             m_shot.s ? "\8c\82\82Á\82½" : "\93\8a\82°\82½");
243 #endif
244     }
245
246     wep_mask = obj->owornmask;
247     m_shot.o = obj->otyp;
248     m_shot.n = multishot;
249     for (m_shot.i = 1; m_shot.i <= m_shot.n; m_shot.i++) {
250         twoweap = u.twoweap;
251         /* split this object off from its slot if necessary */
252         if (obj->quan > 1L) {
253             otmp = splitobj(obj, 1L);
254         } else {
255             otmp = obj;
256             if (otmp->owornmask)
257                 remove_worn_item(otmp, FALSE);
258         }
259         freeinv(otmp);
260         throwit(otmp, wep_mask, twoweap);
261     }
262     m_shot.n = m_shot.i = 0;
263     m_shot.o = STRANGE_OBJECT;
264     m_shot.s = FALSE;
265
266     return 1;
267 }
268
269 /* common to dothrow() and dofire() */
270 STATIC_OVL boolean
271 ok_to_throw(shotlimit_p)
272 int *shotlimit_p; /* (see dothrow()) */
273 {
274     /* kludge to work around parse()'s pre-decrement of `multi' */
275     *shotlimit_p = (multi || save_cm) ? multi + 1 : 0;
276     multi = 0; /* reset; it's been used up */
277
278     if (notake(youmonst.data)) {
279 /*JP
280         You("are physically incapable of throwing or shooting anything.");
281 */
282         You("\89½\82©\82ð\93\8a\82°\82é\82Ì\82Í\95¨\97\9d\93I\82É\96³\97\9d\82¾\81D");
283         return FALSE;
284     } else if (nohands(youmonst.data)) {
285 #if 0 /*JP*/
286         You_cant("throw or shoot without hands."); /* not body_part(HAND) */
287 #else
288         You("\8eè\82ª\82È\82¢\81D"); /* not body_part(HAND) */
289 #endif
290         return FALSE;
291         /*[what about !freehand(), aside from cursed missile launcher?]*/
292     }
293     if (check_capacity((char *) 0))
294         return FALSE;
295     return TRUE;
296 }
297
298 /* t command - throw */
299 int
300 dothrow()
301 {
302     register struct obj *obj;
303     int shotlimit;
304
305     /*
306      * Since some characters shoot multiple missiles at one time,
307      * allow user to specify a count prefix for 'f' or 't' to limit
308      * number of items thrown (to avoid possibly hitting something
309      * behind target after killing it, or perhaps to conserve ammo).
310      *
311      * Prior to 3.3.0, command ``3t'' meant ``t(shoot) t(shoot) t(shoot)''
312      * and took 3 turns.  Now it means ``t(shoot at most 3 missiles)''.
313      *
314      * [3.6.0:  shot count setup has been moved into ok_to_throw().]
315      */
316     if (!ok_to_throw(&shotlimit))
317         return 0;
318
319     obj = getobj(uslinging() ? bullets : toss_objs, "throw");
320     /* it is also possible to throw food */
321     /* (or jewels, or iron balls... ) */
322
323     return obj ? throw_obj(obj, shotlimit) : 0;
324 }
325
326 /* KMH -- Automatically fill quiver */
327 /* Suggested by Jeffrey Bay <jbay@convex.hp.com> */
328 static void
329 autoquiver()
330 {
331     struct obj *otmp, *oammo = 0, *omissile = 0, *omisc = 0, *altammo = 0;
332
333     if (uquiver)
334         return;
335
336     /* Scan through the inventory */
337     for (otmp = invent; otmp; otmp = otmp->nobj) {
338         if (otmp->owornmask || otmp->oartifact || !otmp->dknown) {
339             ; /* Skip it */
340         } else if (otmp->otyp == ROCK
341                    /* seen rocks or known flint or known glass */
342                    || (otmp->otyp == FLINT
343                        && objects[otmp->otyp].oc_name_known)
344                    || (otmp->oclass == GEM_CLASS
345                        && objects[otmp->otyp].oc_material == GLASS
346                        && objects[otmp->otyp].oc_name_known)) {
347             if (uslinging())
348                 oammo = otmp;
349             else if (ammo_and_launcher(otmp, uswapwep))
350                 altammo = otmp;
351             else if (!omisc)
352                 omisc = otmp;
353         } else if (otmp->oclass == GEM_CLASS) {
354             ; /* skip non-rock gems--they're ammo but
355                  player has to select them explicitly */
356         } else if (is_ammo(otmp)) {
357             if (ammo_and_launcher(otmp, uwep))
358                 /* Ammo matched with launcher (bow+arrow, crossbow+bolt) */
359                 oammo = otmp;
360             else if (ammo_and_launcher(otmp, uswapwep))
361                 altammo = otmp;
362             else
363                 /* Mismatched ammo (no better than an ordinary weapon) */
364                 omisc = otmp;
365         } else if (is_missile(otmp)) {
366             /* Missile (dart, shuriken, etc.) */
367             omissile = otmp;
368         } else if (otmp->oclass == WEAPON_CLASS && throwing_weapon(otmp)) {
369             /* Ordinary weapon */
370             if (objects[otmp->otyp].oc_skill == P_DAGGER && !omissile)
371                 omissile = otmp;
372             else
373                 omisc = otmp;
374         }
375     }
376
377     /* Pick the best choice */
378     if (oammo)
379         setuqwep(oammo);
380     else if (omissile)
381         setuqwep(omissile);
382     else if (altammo)
383         setuqwep(altammo);
384     else if (omisc)
385         setuqwep(omisc);
386
387     return;
388 }
389
390 /* f command -- fire: throw from the quiver */
391 int
392 dofire()
393 {
394     int shotlimit;
395     struct obj *obj;
396
397     /*
398      * Same as dothrow(), except we use quivered missile instead
399      * of asking what to throw/shoot.
400      *
401      * If quiver is empty, we use autoquiver to fill it when the
402      * corresponding option is on.  If the option is off or if
403      * autoquiver doesn't select anything, we ask what to throw.
404      * Then we put the chosen item into the quiver slot unless
405      * it is already in another slot.  [Matters most if it is a
406      * stack but also matters for single item if this throw gets
407      * aborted (ESC at the direction prompt).  Already wielded
408      * item is excluded because wielding might be necessary
409      * (Mjollnir) or make the throw behave differently (aklys),
410      * and alt-wielded item is excluded because switching slots
411      * would end two-weapon combat even if throw gets aborted.]
412      */
413     if (!ok_to_throw(&shotlimit))
414         return 0;
415
416     if ((obj = uquiver) == 0) {
417         if (!flags.autoquiver) {
418 /*JP
419             You("have no ammunition readied.");
420 */
421             You("\94­\8eË\8f\80\94õ\82ª\90®\82Á\82Ä\82¢\82È\82¢\81I");
422         } else {
423             autoquiver();
424             if ((obj = uquiver) == 0)
425 /*JP
426                 You("have nothing appropriate for your quiver.");
427 */
428                 You("\94­\8eË\82·\82é\82à\82Ì\82ª\82È\82¢\81D");
429         }
430         /* if autoquiver is disabled or has failed, prompt for missile;
431            fill quiver with it if it's not wielded */
432         if (!obj) {
433             obj = getobj(uslinging() ? bullets : toss_objs, "throw");
434             /* Q command doesn't allow gold in quiver */
435             if (obj && !obj->owornmask && obj->oclass != COIN_CLASS)
436                 setuqwep(obj); /* demi-autoquiver */
437         }
438         /* give feedback if quiver has now been filled */
439         if (uquiver) {
440             uquiver->owornmask &= ~W_QUIVER; /* less verbose */
441 /*JP
442             prinv("You ready:", uquiver, 0L);
443 */
444             prinv("\8f\80\94õ\81F", uquiver, 0L);
445             uquiver->owornmask |= W_QUIVER;
446         }
447     }
448
449     return obj ? throw_obj(obj, shotlimit) : 0;
450 }
451
452 /* if in midst of multishot shooting/throwing, stop early */
453 void
454 endmultishot(verbose)
455 boolean verbose;
456 {
457     if (m_shot.i < m_shot.n) {
458         if (verbose && !context.mon_moving) {
459 #if 0 /*JP*/
460             You("stop %s after the %d%s %s.",
461                 m_shot.s ? "firing" : "throwing", m_shot.i, ordin(m_shot.i),
462                 m_shot.s ? "shot" : "toss");
463 #else
464             You("%d\94­\96Ú\82ð%s\82Æ\82±\82ë\82Å\8ec\82è\82ð%s\82Ì\82ð\82â\82ß\82½\81D", m_shot.i,
465                 m_shot.s ? "\8c\82\82Á\82½" : "\93\8a\82°\82½",
466                 m_shot.s ? "\8c\82\82Â" : "\93\8a\82°\82é");
467 #endif
468         }
469         m_shot.n = m_shot.i; /* make current shot be the last */
470     }
471 }
472
473 /*
474  * Object hits floor at hero's feet.  Called from drop() and throwit().
475  */
476 void
477 hitfloor(obj)
478 register struct obj *obj;
479 {
480     if (IS_SOFT(levl[u.ux][u.uy].typ) || u.uinwater) {
481         dropy(obj);
482         return;
483     }
484     if (IS_ALTAR(levl[u.ux][u.uy].typ))
485         doaltarobj(obj);
486     else
487 #if 0 /*JP*/
488         pline("%s hit%s the %s.", Doname2(obj), (obj->quan == 1L) ? "s" : "",
489               surface(u.ux, u.uy));
490 #else
491         pline("%s\82Í%s\82É\96½\92\86\82µ\82½\81D", Doname2(obj),
492               surface(u.ux,u.uy));
493 #endif
494
495     if (hero_breaks(obj, u.ux, u.uy, TRUE))
496         return;
497     if (ship_object(obj, u.ux, u.uy, FALSE))
498         return;
499     dropz(obj, TRUE);
500 }
501
502 /*
503  * Walk a path from src_cc to dest_cc, calling a proc for each location
504  * except the starting one.  If the proc returns FALSE, stop walking
505  * and return FALSE.  If stopped early, dest_cc will be the location
506  * before the failed callback.
507  */
508 boolean
509 walk_path(src_cc, dest_cc, check_proc, arg)
510 coord *src_cc;
511 coord *dest_cc;
512 boolean FDECL((*check_proc), (genericptr_t, int, int));
513 genericptr_t arg;
514 {
515     int x, y, dx, dy, x_change, y_change, err, i, prev_x, prev_y;
516     boolean keep_going = TRUE;
517
518     /* Use Bresenham's Line Algorithm to walk from src to dest.
519      *
520      * This should be replaced with a more versatile algorithm
521      * since it handles slanted moves in a suboptimal way.
522      * Going from 'x' to 'y' needs to pass through 'z', and will
523      * fail if there's an obstable there, but it could choose to
524      * pass through 'Z' instead if that way imposes no obstacle.
525      *     ..y          .Zy
526      *     xz.    vs    x..
527      * Perhaps we should check both paths and accept whichever
528      * one isn't blocked.  But then multiple zigs and zags could
529      * potentially produce a meandering path rather than the best
530      * attempt at a straight line.  And (*check_proc)() would
531      * need to work more like 'travel', distinguishing between
532      * testing a possible move and actually attempting that move.
533      */
534     dx = dest_cc->x - src_cc->x;
535     dy = dest_cc->y - src_cc->y;
536     prev_x = x = src_cc->x;
537     prev_y = y = src_cc->y;
538
539     if (dx < 0) {
540         x_change = -1;
541         dx = -dx;
542     } else
543         x_change = 1;
544     if (dy < 0) {
545         y_change = -1;
546         dy = -dy;
547     } else
548         y_change = 1;
549
550     i = err = 0;
551     if (dx < dy) {
552         while (i++ < dy) {
553             prev_x = x;
554             prev_y = y;
555             y += y_change;
556             err += dx << 1;
557             if (err > dy) {
558                 x += x_change;
559                 err -= dy << 1;
560             }
561             /* check for early exit condition */
562             if (!(keep_going = (*check_proc)(arg, x, y)))
563                 break;
564         }
565     } else {
566         while (i++ < dx) {
567             prev_x = x;
568             prev_y = y;
569             x += x_change;
570             err += dy << 1;
571             if (err > dx) {
572                 y += y_change;
573                 err -= dx << 1;
574             }
575             /* check for early exit condition */
576             if (!(keep_going = (*check_proc)(arg, x, y)))
577                 break;
578         }
579     }
580
581     if (keep_going)
582         return TRUE; /* successful */
583
584     dest_cc->x = prev_x;
585     dest_cc->y = prev_y;
586     return FALSE;
587 }
588
589 /* hack for hurtle_step() -- it ought to be changed to take an argument
590    indicating lev/fly-to-dest vs lev/fly-to-dest-minus-one-land-on-dest
591    vs drag-to-dest; original callers use first mode, jumping wants second,
592    grappling hook backfire and thrown chained ball need third */
593 boolean
594 hurtle_jump(arg, x, y)
595 genericptr_t arg;
596 int x, y;
597 {
598     boolean res;
599     long save_EWwalking = EWwalking;
600
601     /* prevent jumping over water from being placed in that water */
602     EWwalking |= I_SPECIAL;
603     res = hurtle_step(arg, x, y);
604     EWwalking = save_EWwalking;
605     return res;
606 }
607
608 /*
609  * Single step for the hero flying through the air from jumping, flying,
610  * etc.  Called from hurtle() and jump() via walk_path().  We expect the
611  * argument to be a pointer to an integer -- the range -- which is
612  * used in the calculation of points off if we hit something.
613  *
614  * Bumping into monsters won't cause damage but will wake them and make
615  * them angry.  Auto-pickup isn't done, since you don't have control over
616  * your movements at the time.
617  *
618  * Possible additions/changes:
619  *      o really attack monster if we hit one
620  *      o set stunned if we hit a wall or door
621  *      o reset nomul when we stop
622  *      o creepy feeling if pass through monster (if ever implemented...)
623  *      o bounce off walls
624  *      o let jumps go over boulders
625  */
626 boolean
627 hurtle_step(arg, x, y)
628 genericptr_t arg;
629 int x, y;
630 {
631     int ox, oy, *range = (int *) arg;
632     struct obj *obj;
633     struct monst *mon;
634     boolean may_pass = TRUE;
635     struct trap *ttmp;
636     int dmg = 0;
637
638     if (!isok(x, y)) {
639 /*JP
640         You_feel("the spirits holding you back.");
641 */
642         You_feel("\82 \82È\82½\82ð\95ß\82Ü\82¦\82Ä\82¢\82½\8d°\82ª\96ß\82Á\82½\8bC\82ª\82µ\82½\81D");
643         return FALSE;
644     } else if (!in_out_region(x, y)) {
645         return FALSE;
646     } else if (*range == 0) {
647         return FALSE; /* previous step wants to stop now */
648     }
649
650     if (!Passes_walls || !(may_pass = may_passwall(x, y))) {
651         boolean odoor_diag = (IS_DOOR(levl[x][y].typ)
652                               && (levl[x][y].doormask & D_ISOPEN)
653                               && (u.ux - x) && (u.uy - y));
654
655         if (IS_ROCK(levl[x][y].typ) || closed_door(x, y) || odoor_diag) {
656             const char *s;
657
658             if (odoor_diag)
659                 You("hit the door edge!");
660 /*JP
661             pline("Ouch!");
662 */
663             pline("\82¢\82Ä\82Á\81I");
664             if (IS_TREE(levl[x][y].typ))
665 /*JP
666                 s = "bumping into a tree";
667 */
668                 s = "\96Ø\82É\82Ô\82¿\82 \82½\82Á\82Ä";
669             else if (IS_ROCK(levl[x][y].typ))
670 /*JP
671                 s = "bumping into a wall";
672 */
673                 s = "\95Ç\82É\82Ô\82¿\82 \82½\82Á\82Ä";
674             else
675 /*JP
676                 s = "bumping into a door";
677 */
678                 s = "\94à\82É\82Ô\82¿\82 \82½\82Á\82Ä";
679             dmg = rnd(2 + *range);
680             losehp(Maybe_Half_Phys(dmg), s, KILLED_BY);
681             wake_nearto(x,y, 10);
682             return FALSE;
683         }
684         if (levl[x][y].typ == IRONBARS) {
685 /*JP
686             You("crash into some iron bars.  Ouch!");
687 */
688             You("\93S\82Ì\96_\82É\82Ô\82¿\82 \82½\82Á\82½\81D\82¢\82Ä\82Á\81I");
689             dmg = rnd(2 + *range);
690 #if 0 /*JP*/
691             losehp(Maybe_Half_Phys(dmg), "crashing into iron bars",
692                    KILLED_BY);
693 #else
694             losehp(Maybe_Half_Phys(dmg), "\93S\82Ì\96_\82É\82Ô\82¿\82 \82½\82Á\82Ä",
695                    KILLED_BY);
696 #endif
697             wake_nearto(x,y, 20);
698             return FALSE;
699         }
700         if ((obj = sobj_at(BOULDER, x, y)) != 0) {
701 /*JP
702             You("bump into a %s.  Ouch!", xname(obj));
703 */
704             You("%s\82É\82Ô\82¿\82 \82½\82Á\82½\81D\82¢\82Ä\82Á\81I", xname(obj));
705             dmg = rnd(2 + *range);
706 /*JP
707             losehp(Maybe_Half_Phys(dmg), "bumping into a boulder", KILLED_BY);
708 */
709             losehp(Maybe_Half_Phys(dmg), "\8aâ\82É\82Ô\82¿\82 \82½\82Á\82Ä", KILLED_BY);
710             wake_nearto(x,y, 10);
711             return FALSE;
712         }
713         if (!may_pass) {
714             /* did we hit a no-dig non-wall position? */
715 /*JP
716             You("smack into something!");
717 */
718             You("\89½\82©\82É\82Ô\82¿\82 \82½\82Á\82½\81I");
719             dmg = rnd(2 + *range);
720 #if 0 /*JP*/
721             losehp(Maybe_Half_Phys(dmg), "touching the edge of the universe",
722                    KILLED_BY);
723 #else
724             losehp(Maybe_Half_Phys(dmg), "\90¢\8aE\82Ì\89Ê\82Ä\82É\90G\82ê\82Ä",
725                    KILLED_BY);
726 #endif
727             wake_nearto(x,y, 10);
728             return FALSE;
729         }
730         if ((u.ux - x) && (u.uy - y) && bad_rock(youmonst.data, u.ux, y)
731             && bad_rock(youmonst.data, x, u.uy)) {
732             boolean too_much = (invent && (inv_weight() + weight_cap() > 600));
733
734             /* Move at a diagonal. */
735             if (bigmonst(youmonst.data) || too_much) {
736 #if 0 /*JP*/
737                 You("%sget forcefully wedged into a crevice.",
738                     too_much ? "and all your belongings " : "");
739 #else
740                 You("%s\82Í\82Þ\82è\82â\82è\82·\82«\8aÔ\82É\89\9f\82µ\8d\9e\82ß\82ç\82ê\82½\81D",
741                     too_much ? "\82Æ\91S\95\94\82Ì\89×\95¨" : "");
742 #endif
743                 dmg = rnd(2 + *range);
744 #if 0 /*JP*/
745                 losehp(Maybe_Half_Phys(dmg), "wedging into a narrow crevice",
746                        KILLED_BY);
747 #else
748                 losehp(Maybe_Half_Phys(dmg), "\8b·\82¢\82·\82«\8aÔ\82É\89\9f\82µ\8d\9e\82ß\82ç\82ê\82Ä",
749                        KILLED_BY);
750 #endif
751                 wake_nearto(x,y, 10);
752                 return FALSE;
753             }
754         }
755     }
756
757     if ((mon = m_at(x, y)) != 0
758 #if 0   /* we can't include these two exceptions unless we know we're
759          * going to end up past the current spot rather than on it;
760          * for that, we need to know that the range is not exhausted
761          * and also that the next spot doesn't contain an obstacle */
762         && !(mon->mundetected && hides_under(mon) && (Flying || Levitation))
763         && !(mon->mundetected && mon->data->mlet == S_EEL
764              && (Flying || Levitation || Wwalking))
765 #endif
766         ) {
767         const char *mnam, *pronoun;
768         int glyph = glyph_at(x, y);
769
770         mon->mundetected = 0; /* wakeup() will handle mimic */
771         mnam = a_monnam(mon); /* after unhiding */
772         pronoun = mhim(mon);
773         if (!strcmp(mnam, "it")) {
774             /* mhim() uses pronoun_gender() which forces neuter if monster
775                can't be seen; we want him/her for humanoid sensed by touch */
776             if (!strcmp(pronoun, "it") && humanoid(mon->data))
777                 pronoun = genders[mon->female].him;
778             mnam = !strcmp(pronoun, "it") ? "something" : "someone";
779         }
780         if (!glyph_is_monster(glyph) && !glyph_is_invisible(glyph))
781             You("find %s by bumping into %s.", mnam, pronoun);
782         else
783 /*JP
784             You("bump into %s.", mnam);
785 */
786             You("%s\82É\82Ô\82¿\82 \82½\82Á\82½\81D", mnam);
787         wakeup(mon, FALSE);
788         if (!canspotmon(mon))
789             map_invisible(mon->mx, mon->my);
790         setmangry(mon, FALSE);
791         wake_nearto(x, y, 10);
792         return FALSE;
793     }
794
795     if ((u.ux - x) && (u.uy - y)
796         && bad_rock(youmonst.data, u.ux, y)
797         && bad_rock(youmonst.data, x, u.uy)) {
798         /* Move at a diagonal. */
799         if (Sokoban) {
800 /*JP
801             You("come to an abrupt halt!");
802 */
803             You("\82Æ\82Â\82º\82ñ\92â\8e~\82µ\82½\81I");
804             return FALSE;
805         }
806     }
807
808     /* Caller has already determined that dragging the ball is allowed */
809     if (Punished && uball->where == OBJ_FLOOR) {
810         int bc_control;
811         xchar ballx, bally, chainx, chainy;
812         boolean cause_delay;
813
814         if (drag_ball(x, y, &bc_control, &ballx, &bally, &chainx,
815                       &chainy, &cause_delay, TRUE))
816             move_bc(0, bc_control, ballx, bally, chainx, chainy);
817     }
818
819     ox = u.ux;
820     oy = u.uy;
821     u_on_newpos(x, y); /* set u.<ux,uy>, u.usteed-><mx,my>; cliparound(); */
822     newsym(ox, oy);    /* update old position */
823     vision_recalc(1);  /* update for new position */
824     flush_screen(1);
825
826     if (is_pool(x, y) && !u.uinwater
827         && ((Is_waterlevel(&u.uz) && levl[x][y].typ == WATER)
828             || !(Levitation || Flying || Wwalking))) {
829         multi = 0; /* can move, so drown() allows crawling out of water */
830         (void) drown();
831         return FALSE;
832     }
833
834     /* FIXME:
835      * Each trap should really trigger on the recoil if
836      * it would trigger during normal movement. However,
837      * not all the possible side-effects of this are
838      * tested [as of 3.4.0] so we trigger those that
839      * we have tested, and offer a message for the
840      * ones that we have not yet tested.
841      */
842     if ((ttmp = t_at(x, y)) != 0) {
843         if (ttmp->ttyp == MAGIC_PORTAL) {
844             dotrap(ttmp, 0);
845             return FALSE;
846         } else if (ttmp->ttyp == VIBRATING_SQUARE) {
847             pline("The ground vibrates as you pass it.");
848             dotrap(ttmp, 0); /* doesn't print messages */
849         } else if (ttmp->ttyp == FIRE_TRAP) {
850             dotrap(ttmp, 0);
851         } else if ((ttmp->ttyp == PIT || ttmp->ttyp == SPIKED_PIT
852                     || ttmp->ttyp == HOLE || ttmp->ttyp == TRAPDOOR)
853                    && Sokoban) {
854             /* Air currents overcome the recoil */
855             dotrap(ttmp, 0);
856             *range = 0;
857             return TRUE;
858         } else {
859             if (ttmp->tseen)
860 #if 0 /*JP*/
861                 You("pass right over %s.",
862                     an(defsyms[trap_to_defsym(ttmp->ttyp)].explanation));
863 #else
864                 You("%s\82Ì\90^\8fã\82ð\92Ê\89ß\82µ\82½\81D",
865                     defsyms[trap_to_defsym(ttmp->ttyp)].explanation);
866 #endif
867         }
868     }
869     if (--*range < 0) /* make sure our range never goes negative */
870         *range = 0;
871     if (*range != 0)
872         delay_output();
873     return TRUE;
874 }
875
876 STATIC_OVL boolean
877 mhurtle_step(arg, x, y)
878 genericptr_t arg;
879 int x, y;
880 {
881     struct monst *mon = (struct monst *) arg;
882
883     /* TODO: Treat walls, doors, iron bars, pools, lava, etc. specially
884      * rather than just stopping before.
885      */
886     if (goodpos(x, y, mon, 0) && m_in_out_region(mon, x, y)) {
887         remove_monster(mon->mx, mon->my);
888         newsym(mon->mx, mon->my);
889         place_monster(mon, x, y);
890         newsym(mon->mx, mon->my);
891         set_apparxy(mon);
892         (void) mintrap(mon);
893         return TRUE;
894     }
895     return FALSE;
896 }
897
898 /*
899  * The player moves through the air for a few squares as a result of
900  * throwing or kicking something.
901  *
902  * dx and dy should be the direction of the hurtle, not of the original
903  * kick or throw and be only.
904  */
905 void
906 hurtle(dx, dy, range, verbose)
907 int dx, dy, range;
908 boolean verbose;
909 {
910     coord uc, cc;
911
912     /* The chain is stretched vertically, so you shouldn't be able to move
913      * very far diagonally.  The premise that you should be able to move one
914      * spot leads to calculations that allow you to only move one spot away
915      * from the ball, if you are levitating over the ball, or one spot
916      * towards the ball, if you are at the end of the chain.  Rather than
917      * bother with all of that, assume that there is no slack in the chain
918      * for diagonal movement, give the player a message and return.
919      */
920     if (Punished && !carried(uball)) {
921 /*JP
922         You_feel("a tug from the iron ball.");
923 */
924         You_feel("\93S\8b\85\82É\82Ð\82Á\82Ï\82ç\82ê\82Ä\82¢\82é\82æ\82¤\82È\8bC\82ª\82µ\82½\81D");
925         nomul(0);
926         return;
927     } else if (u.utrap) {
928 #if 0 /*JP*/
929         You("are anchored by the %s.",
930             u.utraptype == TT_WEB
931                 ? "web"
932                 : u.utraptype == TT_LAVA
933                       ? hliquid("lava")
934                       : u.utraptype == TT_INFLOOR
935                             ? surface(u.ux, u.uy)
936                             : u.utraptype == TT_BURIEDBALL ? "buried ball"
937                                                            : "trap");
938 #else
939         You("%s\82É\90\98\82¦\82Â\82¯\82ç\82ê\82Ä\82¢\82é\81D",
940             u.utraptype == TT_WEB
941                 ? "\82­\82à\82Ì\91\83"
942                 : u.utraptype == TT_LAVA
943                       ? "\97n\8aâ"
944                       : u.utraptype == TT_INFLOOR
945                             ? surface(u.ux,u.uy)
946                             : u.utraptype == TT_BURIEDBALL ? "\96\84\82Ü\82Á\82Ä\82¢\82é\8b\85"
947                                                            : "ã©");
948 #endif
949         nomul(0);
950         return;
951     }
952
953     /* make sure dx and dy are [-1,0,1] */
954     dx = sgn(dx);
955     dy = sgn(dy);
956
957     if (!range || (!dx && !dy) || u.ustuck)
958         return; /* paranoia */
959
960     nomul(-range);
961 /*JP
962     multi_reason = "moving through the air";
963 */
964     multi_reason = "\8bó\92\86\82ð\88Ú\93®\82µ\82Ä\82¢\82é\8e\9e\82É";
965     nomovemsg = ""; /* it just happens */
966     if (verbose)
967 /*JP
968         You("%s in the opposite direction.", range > 1 ? "hurtle" : "float");
969 */
970         You("\8bt\95û\8cü\82É\94ò\82Î\82³\82ê\82½\81D");
971     /* if we're in the midst of shooting multiple projectiles, stop */
972     endmultishot(TRUE);
973     sokoban_guilt();
974     uc.x = u.ux;
975     uc.y = u.uy;
976     /* this setting of cc is only correct if dx and dy are [-1,0,1] only */
977     cc.x = u.ux + (dx * range);
978     cc.y = u.uy + (dy * range);
979     (void) walk_path(&uc, &cc, hurtle_step, (genericptr_t) &range);
980 }
981
982 /* Move a monster through the air for a few squares. */
983 void
984 mhurtle(mon, dx, dy, range)
985 struct monst *mon;
986 int dx, dy, range;
987 {
988     coord mc, cc;
989
990     /* At the very least, debilitate the monster */
991     mon->movement = 0;
992     mon->mstun = 1;
993
994     /* Is the monster stuck or too heavy to push?
995      * (very large monsters have too much inertia, even floaters and flyers)
996      */
997     if (mon->data->msize >= MZ_HUGE || mon == u.ustuck || mon->mtrapped)
998         return;
999
1000     /* Make sure dx and dy are [-1,0,1] */
1001     dx = sgn(dx);
1002     dy = sgn(dy);
1003     if (!range || (!dx && !dy))
1004         return; /* paranoia */
1005     /* don't let grid bugs be hurtled diagonally */
1006     if (dx && dy && NODIAG(monsndx(mon->data)))
1007         return;
1008
1009     /* Send the monster along the path */
1010     mc.x = mon->mx;
1011     mc.y = mon->my;
1012     cc.x = mon->mx + (dx * range);
1013     cc.y = mon->my + (dy * range);
1014     (void) walk_path(&mc, &cc, mhurtle_step, (genericptr_t) mon);
1015     return;
1016 }
1017
1018 STATIC_OVL void
1019 check_shop_obj(obj, x, y, broken)
1020 struct obj *obj;
1021 xchar x, y;
1022 boolean broken;
1023 {
1024     struct monst *shkp = shop_keeper(*u.ushops);
1025
1026     if (!shkp)
1027         return;
1028
1029     if (broken || !costly_spot(x, y)
1030         || *in_rooms(x, y, SHOPBASE) != *u.ushops) {
1031         /* thrown out of a shop or into a different shop */
1032         if (is_unpaid(obj))
1033             (void) stolen_value(obj, u.ux, u.uy, (boolean) shkp->mpeaceful,
1034                                 FALSE);
1035         if (broken)
1036             obj->no_charge = 1;
1037     } else {
1038         if (costly_spot(u.ux, u.uy) && costly_spot(x, y)) {
1039             if (is_unpaid(obj))
1040                 subfrombill(obj, shkp);
1041             else if (x != shkp->mx || y != shkp->my)
1042                 sellobj(obj, x, y);
1043         }
1044     }
1045 }
1046
1047 /*
1048  * Hero tosses an object upwards with appropriate consequences.
1049  *
1050  * Returns FALSE if the object is gone.
1051  */
1052 STATIC_OVL boolean
1053 toss_up(obj, hitsroof)
1054 struct obj *obj;
1055 boolean hitsroof;
1056 {
1057     const char *action;
1058     boolean petrifier = ((obj->otyp == EGG || obj->otyp == CORPSE)
1059                          && touch_petrifies(&mons[obj->corpsenm]));
1060     /* note: obj->quan == 1 */
1061
1062     if (!has_ceiling(&u.uz)) {
1063 #if 0 /*JP*/
1064         action = "flies up into"; /* into "the sky" or "the water above" */
1065 #else
1066         action = "\82Ì\92\86\82ð\94ò\82ñ\82¾"; /* into "the sky" or "the water above" */
1067 #endif
1068     } else if (hitsroof) {
1069         if (breaktest(obj)) {
1070 /*JP
1071             pline("%s hits the %s.", Doname2(obj), ceiling(u.ux, u.uy));
1072 */
1073             pline("%s\82Í%s\82É\96½\92\86\82µ\82½\81D", Doname2(obj), ceiling(u.ux, u.uy));
1074             breakmsg(obj, !Blind);
1075             breakobj(obj, u.ux, u.uy, TRUE, TRUE);
1076             return FALSE;
1077         }
1078 /*JP
1079         action = "hits";
1080 */
1081         action = "\82É\96½\92\86\82µ\82½";
1082     } else {
1083 /*JP
1084         action = "almost hits";
1085 */
1086         action = "\82É\82à\82¤\8f­\82µ\82Å\96½\92\86\82·\82é\82Æ\82±\82ë\82¾\82Á\82½";
1087     }
1088 #if 0 /*JP*/
1089     pline("%s %s the %s, then falls back on top of your %s.", Doname2(obj),
1090           action, ceiling(u.ux, u.uy), body_part(HEAD));
1091 #else
1092     pline("%s\82Í%s%s\81C\82»\82µ\82Ä%s\82Ì\8fã\82É\97\8e\82¿\82Ä\82«\82½\81D", Doname2(obj),
1093           ceiling(u.ux, u.uy), action, body_part(HEAD));
1094 #endif
1095
1096     /* object now hits you */
1097
1098     if (obj->oclass == POTION_CLASS) {
1099         potionhit(&youmonst, obj, POTHIT_HERO_THROW);
1100     } else if (breaktest(obj)) {
1101         int otyp = obj->otyp;
1102         int blindinc;
1103
1104         /* need to check for blindness result prior to destroying obj */
1105         blindinc = ((otyp == CREAM_PIE || otyp == BLINDING_VENOM)
1106                     /* AT_WEAP is ok here even if attack type was AT_SPIT */
1107                     && can_blnd(&youmonst, &youmonst, AT_WEAP, obj))
1108                        ? rnd(25)
1109                        : 0;
1110         breakmsg(obj, !Blind);
1111         breakobj(obj, u.ux, u.uy, TRUE, TRUE);
1112         obj = 0; /* it's now gone */
1113         switch (otyp) {
1114         case EGG:
1115             if (petrifier && !Stone_resistance
1116                 && !(poly_when_stoned(youmonst.data)
1117                      && polymon(PM_STONE_GOLEM))) {
1118                 /* egg ends up "all over your face"; perhaps
1119                    visored helmet should still save you here */
1120                 if (uarmh)
1121 /*JP
1122                     Your("%s fails to protect you.", helm_simple_name(uarmh));
1123 */
1124                     Your("%s\82Í\82 \82È\82½\82ð\8eç\82ê\82È\82©\82Á\82½\81D", helm_simple_name(uarmh));
1125                 goto petrify;
1126             }
1127             /*FALLTHRU*/
1128         case CREAM_PIE:
1129         case BLINDING_VENOM:
1130 /*JP
1131             pline("You've got it all over your %s!", body_part(FACE));
1132 */
1133             pline("\82»\82ê\82Í%s\82ð\82×\82Á\82Æ\82è\82Æ\95¢\82Á\82½\81I", body_part(FACE));
1134             if (blindinc) {
1135                 if (otyp == BLINDING_VENOM && !Blind)
1136 /*JP
1137                     pline("It blinds you!");
1138 */
1139                     pline("\96Ú\82ª\8c©\82¦\82È\82­\82È\82Á\82½\81I");
1140                 u.ucreamed += blindinc;
1141                 make_blinded(Blinded + (long) blindinc, FALSE);
1142                 if (!Blind)
1143                     Your1(vision_clears);
1144             }
1145             break;
1146         default:
1147             break;
1148         }
1149         return FALSE;
1150     } else { /* neither potion nor other breaking object */
1151         boolean less_damage = uarmh && is_metallic(uarmh), artimsg = FALSE;
1152         int dmg = dmgval(obj, &youmonst);
1153
1154         if (obj->oartifact)
1155             /* need a fake die roll here; rn1(18,2) avoids 1 and 20 */
1156             artimsg = artifact_hit((struct monst *) 0, &youmonst, obj, &dmg,
1157                                    rn1(18, 2));
1158
1159         if (!dmg) { /* probably wasn't a weapon; base damage on weight */
1160             dmg = (int) obj->owt / 100;
1161             if (dmg < 1)
1162                 dmg = 1;
1163             else if (dmg > 6)
1164                 dmg = 6;
1165             if (youmonst.data == &mons[PM_SHADE]
1166                 && objects[obj->otyp].oc_material != SILVER)
1167                 dmg = 0;
1168         }
1169         if (dmg > 1 && less_damage)
1170             dmg = 1;
1171         if (dmg > 0)
1172             dmg += u.udaminc;
1173         if (dmg < 0)
1174             dmg = 0; /* beware negative rings of increase damage */
1175         dmg = Maybe_Half_Phys(dmg);
1176
1177         if (uarmh) {
1178             if (less_damage && dmg < (Upolyd ? u.mh : u.uhp)) {
1179                 if (!artimsg)
1180 /*JP
1181                     pline("Fortunately, you are wearing a hard helmet.");
1182 */
1183                     pline("\8dK\89^\82É\82à\81C\82 \82È\82½\82Í\8cÅ\82¢\8a\95\82ð\90g\82É\82Â\82¯\82Ä\82¢\82½\81D");
1184                 /* helmet definitely protects you when it blocks petrification
1185                  */
1186             } else if (!petrifier) {
1187                 if (flags.verbose)
1188 /*JP
1189                     Your("%s does not protect you.", helm_simple_name(uarmh));
1190 */
1191                     Your("%s\82Å\82Í\96h\82¬\82«\82ê\82È\82©\82Á\82½\81D", helm_simple_name(uarmh));
1192             }
1193         } else if (petrifier && !Stone_resistance
1194                    && !(poly_when_stoned(youmonst.data)
1195                         && polymon(PM_STONE_GOLEM))) {
1196         petrify:
1197             killer.format = KILLED_BY;
1198 #if 0 /*JP*/
1199             Strcpy(killer.name, "elementary physics"); /* "what goes up..." */
1200 #else
1201             Strcpy(killer.name, "\8f\89\93\99\95¨\97\9d\82É\82æ\82è"); /* "what goes up..." */
1202 #endif
1203 /*JP
1204             You("turn to stone.");
1205 */
1206             You("\90Î\82É\82È\82Á\82½\81D");
1207             if (obj)
1208                 dropy(obj); /* bypass most of hitfloor() */
1209             thrownobj = 0;  /* now either gone or on floor */
1210             done(STONING);
1211             return obj ? TRUE : FALSE;
1212         }
1213         hitfloor(obj);
1214         thrownobj = 0;
1215 #if 0 /*JP*/
1216         losehp(Maybe_Half_Phys(dmg), "falling object", KILLED_BY_AN);
1217 #else
1218         losehp(Maybe_Half_Phys(dmg), "\97\8e\89º\95¨\82Å", KILLED_BY_AN);
1219 #endif
1220     }
1221     return TRUE;
1222 }
1223
1224 /* return true for weapon meant to be thrown; excludes ammo */
1225 boolean
1226 throwing_weapon(obj)
1227 struct obj *obj;
1228 {
1229     return (boolean) (is_missile(obj) || is_spear(obj)
1230                       /* daggers and knife (excludes scalpel) */
1231                       || (is_blade(obj) && !is_sword(obj)
1232                           && (objects[obj->otyp].oc_dir & PIERCE))
1233                       /* special cases [might want to add AXE] */
1234                       || obj->otyp == WAR_HAMMER || obj->otyp == AKLYS);
1235 }
1236
1237 /* the currently thrown object is returning to you (not for boomerangs) */
1238 STATIC_OVL void
1239 sho_obj_return_to_u(obj)
1240 struct obj *obj;
1241 {
1242     /* might already be our location (bounced off a wall) */
1243     if ((u.dx || u.dy) && (bhitpos.x != u.ux || bhitpos.y != u.uy)) {
1244         int x = bhitpos.x - u.dx, y = bhitpos.y - u.dy;
1245
1246         tmp_at(DISP_FLASH, obj_to_glyph(obj));
1247         while (isok(x,y) && (x != u.ux || y != u.uy)) {
1248             tmp_at(x, y);
1249             delay_output();
1250             x -= u.dx;
1251             y -= u.dy;
1252         }
1253         tmp_at(DISP_END, 0);
1254     }
1255 }
1256
1257 /* throw an object, NB: obj may be consumed in the process */
1258 void
1259 throwit(obj, wep_mask, twoweap)
1260 struct obj *obj;
1261 long wep_mask; /* used to re-equip returning boomerang */
1262 boolean twoweap; /* used to restore twoweapon mode if wielded weapon returns */
1263 {
1264     register struct monst *mon;
1265     register int range, urange;
1266     boolean crossbowing, impaired = (Confusion || Stunned || Blind
1267                                      || Hallucination || Fumbling);
1268
1269     notonhead = FALSE; /* reset potentially stale value */
1270     if ((obj->cursed || obj->greased) && (u.dx || u.dy) && !rn2(7)) {
1271         boolean slipok = TRUE;
1272
1273         if (ammo_and_launcher(obj, uwep))
1274 /*JP
1275             pline("%s!", Tobjnam(obj, "misfire"));
1276 */
1277             pline("%s\82Í\82Í\82¸\82ê\82½\81I", xname(obj));
1278         else {
1279             /* only slip if it's greased or meant to be thrown */
1280             if (obj->greased || throwing_weapon(obj))
1281                 /* BUG: this message is grammatically incorrect if obj has
1282                    a plural name; greased gloves or boots for instance. */
1283 /*JP
1284                 pline("%s as you throw it!", Tobjnam(obj, "slip"));
1285 */
1286                 pline("%s\82ð\93\8a\82°\82æ\82¤\82Æ\82µ\82½\82ª\81C\82¸\82è\97\8e\82¿\82Ä\82µ\82Ü\82Á\82½\81I", xname(obj));
1287             else
1288                 slipok = FALSE;
1289         }
1290         if (slipok) {
1291             u.dx = rn2(3) - 1;
1292             u.dy = rn2(3) - 1;
1293             if (!u.dx && !u.dy)
1294                 u.dz = 1;
1295             impaired = TRUE;
1296         }
1297     }
1298
1299     if ((u.dx || u.dy || (u.dz < 1))
1300         && calc_capacity((int) obj->owt) > SLT_ENCUMBER
1301         && (Upolyd ? (u.mh < 5 && u.mh != u.mhmax)
1302                    : (u.uhp < 10 && u.uhp != u.uhpmax))
1303         && obj->owt > (unsigned) ((Upolyd ? u.mh : u.uhp) * 2)
1304         && !Is_airlevel(&u.uz)) {
1305 /*JP
1306         You("have so little stamina, %s drops from your grasp.",
1307 */
1308         You("\88¬\97Í\82ª\82È\82­\82È\82Á\82Ä\82¢\82½\82Ì\82Å\81C%s\82ð\88¬\82è\82»\82±\82Ë\82Ä\97\8e\82Æ\82µ\82½\81D",
1309             the(xname(obj)));
1310         exercise(A_CON, FALSE);
1311         u.dx = u.dy = 0;
1312         u.dz = 1;
1313     }
1314
1315     thrownobj = obj;
1316     thrownobj->was_thrown = 1;
1317
1318     if (u.uswallow) {
1319         mon = u.ustuck;
1320         bhitpos.x = mon->mx;
1321         bhitpos.y = mon->my;
1322     } else if (u.dz) {
1323         if (u.dz < 0
1324             /* Mjollnir must we wielded to be thrown--caller verifies this;
1325                aklys must we wielded as primary to return when thrown */
1326             && ((Role_if(PM_VALKYRIE) && obj->oartifact == ART_MJOLLNIR)
1327                 || (obj->otyp == AKLYS && (wep_mask & W_WEP) != 0))
1328             && !impaired) {
1329 #if 0 /*JP*/
1330             pline("%s the %s and returns to your hand!", Tobjnam(obj, "hit"),
1331                   ceiling(u.ux, u.uy));
1332 #else
1333             pline("%s\82Í%s\82É\96½\92\86\82µ\82 \82È\82½\82Ì\8eè\82É\96ß\82Á\82Ä\82«\82½\81I", xname(obj),
1334                   ceiling(u.ux,u.uy));
1335 #endif
1336             obj = addinv(obj);
1337             (void) encumber_msg();
1338             if (obj->owornmask & W_QUIVER) /* in case addinv() autoquivered */
1339                 setuqwep((struct obj *) 0);
1340             setuwep(obj);
1341             u.twoweap = twoweap;
1342         } else if (u.dz < 0) {
1343             (void) toss_up(obj, rn2(5) && !Underwater);
1344         } else if (u.dz > 0 && u.usteed && obj->oclass == POTION_CLASS
1345                    && rn2(6)) {
1346             /* alternative to prayer or wand of opening/spell of knock
1347                for dealing with cursed saddle:  throw holy water > */
1348             potionhit(u.usteed, obj, POTHIT_HERO_THROW);
1349         } else {
1350             hitfloor(obj);
1351         }
1352         thrownobj = (struct obj *) 0;
1353         return;
1354
1355     } else if (obj->otyp == BOOMERANG && !Underwater) {
1356         if (Is_airlevel(&u.uz) || Levitation)
1357             hurtle(-u.dx, -u.dy, 1, TRUE);
1358         mon = boomhit(obj, u.dx, u.dy);
1359         if (mon == &youmonst) { /* the thing was caught */
1360             exercise(A_DEX, TRUE);
1361             obj = addinv(obj);
1362             (void) encumber_msg();
1363             if (wep_mask && !(obj->owornmask & wep_mask)) {
1364                 setworn(obj, wep_mask);
1365                 u.twoweap = twoweap;
1366             }
1367             thrownobj = (struct obj *) 0;
1368             return;
1369         }
1370     } else {
1371         /* crossbow range is independent of strength */
1372         crossbowing =
1373             (ammo_and_launcher(obj, uwep) && weapon_type(uwep) == P_CROSSBOW);
1374         urange = (crossbowing ? 18 : (int) ACURRSTR) / 2;
1375         /* balls are easy to throw or at least roll;
1376          * also, this insures the maximum range of a ball is greater
1377          * than 1, so the effects from throwing attached balls are
1378          * actually possible
1379          */
1380         if (obj->otyp == HEAVY_IRON_BALL)
1381             range = urange - (int) (obj->owt / 100);
1382         else
1383             range = urange - (int) (obj->owt / 40);
1384         if (obj == uball) {
1385             if (u.ustuck)
1386                 range = 1;
1387             else if (range >= 5)
1388                 range = 5;
1389         }
1390         if (range < 1)
1391             range = 1;
1392
1393         if (is_ammo(obj)) {
1394             if (ammo_and_launcher(obj, uwep)) {
1395                 if (crossbowing)
1396                     range = BOLT_LIM;
1397                 else
1398                     range++;
1399             } else if (obj->oclass != GEM_CLASS)
1400                 range /= 2;
1401         }
1402
1403         if (Is_airlevel(&u.uz) || Levitation) {
1404             /* action, reaction... */
1405             urange -= range;
1406             if (urange < 1)
1407                 urange = 1;
1408             range -= urange;
1409             if (range < 1)
1410                 range = 1;
1411         }
1412
1413         if (obj->otyp == BOULDER)
1414             range = 20; /* you must be giant */
1415         else if (obj->oartifact == ART_MJOLLNIR)
1416             range = (range + 1) / 2; /* it's heavy */
1417         else if (obj->otyp == AKLYS && (wep_mask & W_WEP) != 0)
1418             /* if an aklys is going to return, range is limited by the
1419                length of the attached cord [implicit aspect of item] */
1420             range = min(range, BOLT_LIM / 2);
1421         else if (obj == uball && u.utrap && u.utraptype == TT_INFLOOR)
1422             range = 1;
1423
1424         if (Underwater)
1425             range = 1;
1426
1427         mon = bhit(u.dx, u.dy, range, THROWN_WEAPON,
1428                    (int FDECL((*), (MONST_P, OBJ_P))) 0,
1429                    (int FDECL((*), (OBJ_P, OBJ_P))) 0, &obj);
1430         thrownobj = obj; /* obj may be null now */
1431
1432         /* have to do this after bhit() so u.ux & u.uy are correct */
1433         if (Is_airlevel(&u.uz) || Levitation)
1434             hurtle(-u.dx, -u.dy, urange, TRUE);
1435
1436         if (!obj)
1437             return;
1438     }
1439
1440     if (mon) {
1441         boolean obj_gone;
1442
1443         if (mon->isshk && obj->where == OBJ_MINVENT && obj->ocarry == mon) {
1444             thrownobj = (struct obj *) 0;
1445             return; /* alert shk caught it */
1446         }
1447         (void) snuff_candle(obj);
1448         notonhead = (bhitpos.x != mon->mx || bhitpos.y != mon->my);
1449         obj_gone = thitmonst(mon, obj);
1450         /* Monster may have been tamed; this frees old mon */
1451         mon = m_at(bhitpos.x, bhitpos.y);
1452
1453         /* [perhaps this should be moved into thitmonst or hmon] */
1454         if (mon && mon->isshk
1455             && (!inside_shop(u.ux, u.uy)
1456                 || !index(in_rooms(mon->mx, mon->my, SHOPBASE), *u.ushops)))
1457             hot_pursuit(mon);
1458
1459         if (obj_gone)
1460             thrownobj = 0;
1461     }
1462
1463     if (!thrownobj) {
1464         ; /* missile has already been handled */
1465     } else if (u.uswallow) {
1466         /* ball is not picked up by monster */
1467         if (obj != uball)
1468             (void) mpickobj(u.ustuck, obj);
1469         thrownobj = (struct obj *) 0;
1470     } else {
1471         /* Mjollnir must we wielded to be thrown--caller verifies this;
1472            aklys must we wielded as primary to return when thrown */
1473         if ((obj->oartifact == ART_MJOLLNIR && Role_if(PM_VALKYRIE))
1474             || (obj->otyp == AKLYS && (wep_mask & W_WEP) != 0)) {
1475             if (rn2(100)) {
1476                 sho_obj_return_to_u(obj); /* display its flight */
1477
1478                 if (!impaired && rn2(100)) {
1479 /*JP
1480                 pline("%s to your hand!", Tobjnam(obj, "return"));
1481 */
1482                 pline("%s\82Í\82 \82È\82½\82Ì\8eè\82É\96ß\82Á\82Ä\82«\82½\81I", xname(obj));
1483                     obj = addinv(obj);
1484                     (void) encumber_msg();
1485                     /* addinv autoquivers an aklys if quiver is empty;
1486                        if obj is quivered, remove it before wielding */
1487                     if (obj->owornmask & W_QUIVER)
1488                         setuqwep((struct obj *) 0);
1489                     setuwep(obj);
1490                     u.twoweap = twoweap;
1491                     if (cansee(bhitpos.x, bhitpos.y))
1492                         newsym(bhitpos.x, bhitpos.y);
1493                 } else {
1494                     int dmg = rn2(2);
1495
1496                     if (!dmg) {
1497 #if 0 /*JP:T*/
1498                         pline(Blind ? "%s lands %s your %s."
1499                                     : "%s back to you, landing %s your %s.",
1500                               Blind ? Something : Tobjnam(obj, "return"),
1501                               Levitation ? "beneath" : "at",
1502                               makeplural(body_part(FOOT)));
1503 #else
1504                         pline("%s\82Í%s\82 \82È\82½\82Ì%s\82Ì%s\82É\97\8e\82¿\82½\81D",
1505                               xname(obj),
1506                               Blind ? "" : "\96ß\82Á\82Ä\82«\82Ä\81C",
1507                               body_part(FOOT),
1508                               Levitation ? "\89º" : "\82»\82Î");
1509 #endif
1510                     } else {
1511                         dmg += rnd(3);
1512 #if 0 /*JP:T*/
1513                         pline(Blind ? "%s your %s!"
1514                                     : "%s back toward you, hitting your %s!",
1515                               Tobjnam(obj, Blind ? "hit" : "fly"),
1516                               body_part(ARM));
1517 #else
1518                         pline("%s\82Í%s\82 \82È\82½\82Ì%s\82É\96½\92\86\82µ\82½\81I",
1519                               xname(obj),
1520                               Blind ? "" : "\96ß\82Á\82Ä\82«\82Ä\81C",
1521                               body_part(ARM));
1522 #endif
1523                         if (obj->oartifact)
1524                             (void) artifact_hit((struct monst *) 0, &youmonst,
1525                                                 obj, &dmg, 0);
1526 #if 0 /*JP*/
1527                         losehp(Maybe_Half_Phys(dmg), killer_xname(obj),
1528                                KILLED_BY);
1529 #else
1530                         {
1531                             char jbuf[BUFSZ];
1532                             Sprintf(jbuf, "%s\82Å", xname(obj));
1533                             losehp(Maybe_Half_Phys(dmg), jbuf, KILLED_BY);
1534                         }
1535 #endif
1536                     }
1537                     if (ship_object(obj, u.ux, u.uy, FALSE)) {
1538                         thrownobj = (struct obj *) 0;
1539                         return;
1540                     }
1541                     dropy(obj);
1542                 }
1543                 thrownobj = (struct obj *) 0;
1544                 return;
1545             } else {
1546                 /* when this location is stepped on, the weapon will be
1547                    auto-picked up due to 'obj->was_thrown' of 1;
1548                    addinv() prevents thrown Mjollnir from being placed
1549                    into the quiver slot, but an aklys will end up there if
1550                    that slot is empty at the time; since hero will need to
1551                    explicitly rewield the weapon to get throw-and-return
1552                    capability back anyway, quivered or not shouldn't matter */
1553                 pline("%s to return!", Tobjnam(obj, "fail"));
1554                 /* continue below with placing 'obj' at target location */
1555             }
1556         }
1557
1558         if (!IS_SOFT(levl[bhitpos.x][bhitpos.y].typ) && breaktest(obj)) {
1559             tmp_at(DISP_FLASH, obj_to_glyph(obj));
1560             tmp_at(bhitpos.x, bhitpos.y);
1561             delay_output();
1562             tmp_at(DISP_END, 0);
1563             breakmsg(obj, cansee(bhitpos.x, bhitpos.y));
1564             breakobj(obj, bhitpos.x, bhitpos.y, TRUE, TRUE);
1565             thrownobj = (struct obj *) 0;
1566             return;
1567         }
1568 /*JP
1569         if (flooreffects(obj, bhitpos.x, bhitpos.y, "fall")) {
1570 */
1571         if (flooreffects(obj,bhitpos.x, bhitpos.y, "\97\8e\82¿\82é")) {
1572             thrownobj = (struct obj *) 0;
1573             return;
1574         }
1575         obj_no_longer_held(obj);
1576         if (mon && mon->isshk && is_pick(obj)) {
1577             if (cansee(bhitpos.x, bhitpos.y))
1578 /*JP
1579                 pline("%s snatches up %s.", Monnam(mon), the(xname(obj)));
1580 */
1581                 pline("%s\82Í%s\82ð\92D\82¢\82Æ\82Á\82½\81D", Monnam(mon), xname(obj));
1582             if (*u.ushops || obj->unpaid)
1583                 check_shop_obj(obj, bhitpos.x, bhitpos.y, FALSE);
1584             (void) mpickobj(mon, obj); /* may merge and free obj */
1585             thrownobj = (struct obj *) 0;
1586             return;
1587         }
1588         (void) snuff_candle(obj);
1589         if (!mon && ship_object(obj, bhitpos.x, bhitpos.y, FALSE)) {
1590             thrownobj = (struct obj *) 0;
1591             return;
1592         }
1593         thrownobj = (struct obj *) 0;
1594         place_object(obj, bhitpos.x, bhitpos.y);
1595         /* container contents might break;
1596            do so before turning ownership of thrownobj over to shk
1597            (container_impact_dmg handles item already owned by shop) */
1598         if (!IS_SOFT(levl[bhitpos.x][bhitpos.y].typ))
1599             /* <x,y> is spot where you initiated throw, not bhitpos */
1600             container_impact_dmg(obj, u.ux, u.uy);
1601         /* charge for items thrown out of shop;
1602            shk takes possession for items thrown into one */
1603         if ((*u.ushops || obj->unpaid) && obj != uball)
1604             check_shop_obj(obj, bhitpos.x, bhitpos.y, FALSE);
1605
1606         stackobj(obj);
1607         if (obj == uball)
1608             drop_ball(bhitpos.x, bhitpos.y);
1609         if (cansee(bhitpos.x, bhitpos.y))
1610             newsym(bhitpos.x, bhitpos.y);
1611         if (obj_sheds_light(obj))
1612             vision_full_recalc = 1;
1613     }
1614 }
1615
1616 /* an object may hit a monster; various factors adjust the chance of hitting
1617  */
1618 int
1619 omon_adj(mon, obj, mon_notices)
1620 struct monst *mon;
1621 struct obj *obj;
1622 boolean mon_notices;
1623 {
1624     int tmp = 0;
1625
1626     /* size of target affects the chance of hitting */
1627     tmp += (mon->data->msize - MZ_MEDIUM); /* -2..+5 */
1628     /* sleeping target is more likely to be hit */
1629     if (mon->msleeping) {
1630         tmp += 2;
1631         if (mon_notices)
1632             mon->msleeping = 0;
1633     }
1634     /* ditto for immobilized target */
1635     if (!mon->mcanmove || !mon->data->mmove) {
1636         tmp += 4;
1637         if (mon_notices && mon->data->mmove && !rn2(10)) {
1638             mon->mcanmove = 1;
1639             mon->mfrozen = 0;
1640         }
1641     }
1642     /* some objects are more likely to hit than others */
1643     switch (obj->otyp) {
1644     case HEAVY_IRON_BALL:
1645         if (obj != uball)
1646             tmp += 2;
1647         break;
1648     case BOULDER:
1649         tmp += 6;
1650         break;
1651     default:
1652         if (obj->oclass == WEAPON_CLASS || is_weptool(obj)
1653             || obj->oclass == GEM_CLASS)
1654             tmp += hitval(obj, mon);
1655         break;
1656     }
1657     return tmp;
1658 }
1659
1660 /* thrown object misses target monster */
1661 STATIC_OVL void
1662 tmiss(obj, mon, maybe_wakeup)
1663 struct obj *obj;
1664 struct monst *mon;
1665 boolean maybe_wakeup;
1666 {
1667     const char *missile = mshot_xname(obj);
1668
1669     /* If the target can't be seen or doesn't look like a valid target,
1670        avoid "the arrow misses it," or worse, "the arrows misses the mimic."
1671        An attentive player will still notice that this is different from
1672        an arrow just landing short of any target (no message in that case),
1673        so will realize that there is a valid target here anyway. */
1674     if (!canseemon(mon) || (mon->m_ap_type && mon->m_ap_type != M_AP_MONSTER))
1675 /*JP
1676         pline("%s %s.", The(missile), otense(obj, "miss"));
1677 */
1678         pline("%s\82Í\82Í\82¸\82ê\82½\81D", missile);
1679     else
1680         miss(missile, mon);
1681     if (maybe_wakeup && !rn2(3))
1682         wakeup(mon, TRUE);
1683     return;
1684 }
1685
1686 #define quest_arti_hits_leader(obj, mon)      \
1687     (obj->oartifact && is_quest_artifact(obj) \
1688      && mon->m_id == quest_status.leader_m_id)
1689
1690 /*
1691  * Object thrown by player arrives at monster's location.
1692  * Return 1 if obj has disappeared or otherwise been taken care of,
1693  * 0 if caller must take care of it.
1694  * Also used for kicked objects and for polearms/grapnel applied at range.
1695  */
1696 int
1697 thitmonst(mon, obj)
1698 register struct monst *mon;
1699 register struct obj *obj; /* thrownobj or kickedobj or uwep */
1700 {
1701     register int tmp;     /* Base chance to hit */
1702     register int disttmp; /* distance modifier */
1703     int otyp = obj->otyp, hmode;
1704     boolean guaranteed_hit = (u.uswallow && mon == u.ustuck);
1705     int dieroll;
1706
1707     hmode = (obj == uwep) ? HMON_APPLIED
1708               : (obj == kickedobj) ? HMON_KICKED
1709                 : HMON_THROWN;
1710
1711     /* Differences from melee weapons:
1712      *
1713      * Dex still gives a bonus, but strength does not.
1714      * Polymorphed players lacking attacks may still throw.
1715      * There's a base -1 to hit.
1716      * No bonuses for fleeing or stunned targets (they don't dodge
1717      *    melee blows as readily, but dodging arrows is hard anyway).
1718      * Not affected by traps, etc.
1719      * Certain items which don't in themselves do damage ignore tmp.
1720      * Distance and monster size affect chance to hit.
1721      */
1722     tmp = -1 + Luck + find_mac(mon) + u.uhitinc
1723           + maybe_polyd(youmonst.data->mlevel, u.ulevel);
1724     if (ACURR(A_DEX) < 4)
1725         tmp -= 3;
1726     else if (ACURR(A_DEX) < 6)
1727         tmp -= 2;
1728     else if (ACURR(A_DEX) < 8)
1729         tmp -= 1;
1730     else if (ACURR(A_DEX) >= 14)
1731         tmp += (ACURR(A_DEX) - 14);
1732
1733     /* Modify to-hit depending on distance; but keep it sane.
1734      * Polearms get a distance penalty even when wielded; it's
1735      * hard to hit at a distance.
1736      */
1737     disttmp = 3 - distmin(u.ux, u.uy, mon->mx, mon->my);
1738     if (disttmp < -4)
1739         disttmp = -4;
1740     tmp += disttmp;
1741
1742     /* gloves are a hindrance to proper use of bows */
1743     if (uarmg && uwep && objects[uwep->otyp].oc_skill == P_BOW) {
1744         switch (uarmg->otyp) {
1745         case GAUNTLETS_OF_POWER: /* metal */
1746             tmp -= 2;
1747             break;
1748         case GAUNTLETS_OF_FUMBLING:
1749             tmp -= 3;
1750             break;
1751         case LEATHER_GLOVES:
1752         case GAUNTLETS_OF_DEXTERITY:
1753             break;
1754         default:
1755             impossible("Unknown type of gloves (%d)", uarmg->otyp);
1756             break;
1757         }
1758     }
1759
1760     tmp += omon_adj(mon, obj, TRUE);
1761     if (is_orc(mon->data)
1762         && maybe_polyd(is_elf(youmonst.data), Race_if(PM_ELF)))
1763         tmp++;
1764     if (guaranteed_hit) {
1765         tmp += 1000; /* Guaranteed hit */
1766     }
1767
1768     if (obj->oclass == GEM_CLASS && is_unicorn(mon->data)) {
1769         if (mon->msleeping || !mon->mcanmove) {
1770             tmiss(obj, mon, FALSE);
1771             return 0;
1772         } else if (mon->mtame) {
1773 /*JP
1774             pline("%s catches and drops %s.", Monnam(mon), the(xname(obj)));
1775 */
1776             pline("%s\82Í%s\82ð\82­\82í\82¦\82Ä\92u\82¢\82½\81D", Monnam(mon), xname(obj));
1777             return 0;
1778         } else {
1779 /*JP
1780             pline("%s catches %s.", Monnam(mon), the(xname(obj)));
1781 */
1782             pline("%s\82Í%s\82ð\82­\82í\82¦\82½\81D", Monnam(mon), xname(obj));
1783             return gem_accept(mon, obj);
1784         }
1785     }
1786
1787     /* don't make game unwinnable if naive player throws artifact
1788        at leader... (kicked artifact is ok too; HMON_APPLIED could
1789        occur if quest artifact polearm or grapnel ever gets added) */
1790     if (hmode != HMON_APPLIED && quest_arti_hits_leader(obj, mon)) {
1791         /* AIS: changes to wakeup() means that it's now less inappropriate here
1792            than it used to be, but the manual version works just as well */
1793         mon->msleeping = 0;
1794         mon->mstrategy &= ~STRAT_WAITMASK;
1795
1796         if (mon->mcanmove) {
1797 /*JP
1798             pline("%s catches %s.", Monnam(mon), the(xname(obj)));
1799 */
1800             pline("%s\82Í%s\82ð\92Í\82ñ\82¾\81D", Monnam(mon), xname(obj));
1801             if (mon->mpeaceful) {
1802                 boolean next2u = monnear(mon, u.ux, u.uy);
1803
1804                 finish_quest(obj); /* acknowledge quest completion */
1805 #if 0 /*JP*/
1806                 pline("%s %s %s back to you.", Monnam(mon),
1807                       (next2u ? "hands" : "tosses"), the(xname(obj)));
1808 #else
1809                 pline("%s\82Í%s\82ð\82 \82È\82½\82É\95Ô\82µ\82½\81D", Monnam(mon),
1810                       xname(obj));
1811 #endif
1812                 if (!next2u)
1813                     sho_obj_return_to_u(obj);
1814                 obj = addinv(obj); /* back into your inventory */
1815                 (void) encumber_msg();
1816             } else {
1817                 /* angry leader caught it and isn't returning it */
1818                 if (*u.ushops || obj->unpaid) /* not very likely... */
1819                     check_shop_obj(obj, mon->mx, mon->my, FALSE);
1820                 (void) mpickobj(mon, obj);
1821             }
1822             return 1; /* caller doesn't need to place it */
1823         }
1824         return 0;
1825     }
1826
1827     dieroll = rnd(20);
1828
1829     if (obj->oclass == WEAPON_CLASS || is_weptool(obj)
1830         || obj->oclass == GEM_CLASS) {
1831         if (hmode == HMON_KICKED) {
1832             /* throwing adjustments and weapon skill bonus don't apply */
1833             tmp -= (is_ammo(obj) ? 5 : 3);
1834         } else if (is_ammo(obj)) {
1835             if (!ammo_and_launcher(obj, uwep)) {
1836                 tmp -= 4;
1837             } else {
1838                 tmp += uwep->spe - greatest_erosion(uwep);
1839                 tmp += weapon_hit_bonus(uwep);
1840                 if (uwep->oartifact)
1841                     tmp += spec_abon(uwep, mon);
1842                 /*
1843                  * Elves and Samurais are highly trained w/bows,
1844                  * especially their own special types of bow.
1845                  * Polymorphing won't make you a bow expert.
1846                  */
1847                 if ((Race_if(PM_ELF) || Role_if(PM_SAMURAI))
1848                     && (!Upolyd || your_race(youmonst.data))
1849                     && objects[uwep->otyp].oc_skill == P_BOW) {
1850                     tmp++;
1851                     if (Race_if(PM_ELF) && uwep->otyp == ELVEN_BOW)
1852                         tmp++;
1853                     else if (Role_if(PM_SAMURAI) && uwep->otyp == YUMI)
1854                         tmp++;
1855                 }
1856             }
1857         } else { /* thrown non-ammo or applied polearm/grapnel */
1858             if (otyp == BOOMERANG) /* arbitrary */
1859                 tmp += 4;
1860             else if (throwing_weapon(obj)) /* meant to be thrown */
1861                 tmp += 2;
1862             else if (obj == thrownobj) /* not meant to be thrown */
1863                 tmp -= 2;
1864             /* we know we're dealing with a weapon or weptool handled
1865                by WEAPON_SKILLS once ammo objects have been excluded */
1866             tmp += weapon_hit_bonus(obj);
1867         }
1868
1869         if (tmp >= dieroll) {
1870             boolean wasthrown = (thrownobj != 0);
1871
1872             /* attack hits mon */
1873             if (hmode == HMON_APPLIED)
1874                 u.uconduct.weaphit++;
1875             if (hmon(mon, obj, hmode, dieroll)) { /* mon still alive */
1876                 cutworm(mon, bhitpos.x, bhitpos.y, obj);
1877             }
1878             exercise(A_DEX, TRUE);
1879             /* if hero was swallowed and projectile killed the engulfer,
1880                'obj' got added to engulfer's inventory and then dropped,
1881                so we can't safely use that pointer anymore; it escapes
1882                the chance to be used up here... */
1883             if (wasthrown && !thrownobj)
1884                 return 1;
1885
1886             /* projectiles other than magic stones
1887                sometimes disappear when thrown */
1888             if (objects[otyp].oc_skill < P_NONE
1889                 && objects[otyp].oc_skill > -P_BOOMERANG
1890                 && !objects[otyp].oc_magic) {
1891                 /* we were breaking 2/3 of everything unconditionally.
1892                  * we still don't want anything to survive unconditionally,
1893                  * but we need ammo to stay around longer on average.
1894                  */
1895                 int broken, chance;
1896
1897                 chance = 3 + greatest_erosion(obj) - obj->spe;
1898                 if (chance > 1)
1899                     broken = rn2(chance);
1900                 else
1901                     broken = !rn2(4);
1902                 if (obj->blessed && !rnl(4))
1903                     broken = 0;
1904
1905                 if (broken) {
1906                     if (*u.ushops || obj->unpaid)
1907                         check_shop_obj(obj, bhitpos.x, bhitpos.y, TRUE);
1908                     obfree(obj, (struct obj *) 0);
1909                     return 1;
1910                 }
1911             }
1912             passive_obj(mon, obj, (struct attack *) 0);
1913         } else {
1914             tmiss(obj, mon, TRUE);
1915             if (hmode == HMON_APPLIED)
1916                 wakeup(mon, TRUE);
1917         }
1918
1919     } else if (otyp == HEAVY_IRON_BALL) {
1920         exercise(A_STR, TRUE);
1921         if (tmp >= dieroll) {
1922             int was_swallowed = guaranteed_hit;
1923
1924             exercise(A_DEX, TRUE);
1925             if (!hmon(mon, obj, hmode, dieroll)) { /* mon killed */
1926                 if (was_swallowed && !u.uswallow && obj == uball)
1927                     return 1; /* already did placebc() */
1928             }
1929         } else {
1930             tmiss(obj, mon, TRUE);
1931         }
1932
1933     } else if (otyp == BOULDER) {
1934         exercise(A_STR, TRUE);
1935         if (tmp >= dieroll) {
1936             exercise(A_DEX, TRUE);
1937             (void) hmon(mon, obj, hmode, dieroll);
1938         } else {
1939             tmiss(obj, mon, TRUE);
1940         }
1941
1942     } else if ((otyp == EGG || otyp == CREAM_PIE || otyp == BLINDING_VENOM
1943                 || otyp == ACID_VENOM)
1944                && (guaranteed_hit || ACURR(A_DEX) > rnd(25))) {
1945         (void) hmon(mon, obj, hmode, dieroll);
1946         return 1; /* hmon used it up */
1947
1948     } else if (obj->oclass == POTION_CLASS
1949                && (guaranteed_hit || ACURR(A_DEX) > rnd(25))) {
1950         potionhit(mon, obj, POTHIT_HERO_THROW);
1951         return 1;
1952
1953     } else if (befriend_with_obj(mon->data, obj)
1954                || (mon->mtame && dogfood(mon, obj) <= ACCFOOD)) {
1955         if (tamedog(mon, obj)) {
1956             return 1; /* obj is gone */
1957         } else {
1958             tmiss(obj, mon, FALSE);
1959             mon->msleeping = 0;
1960             mon->mstrategy &= ~STRAT_WAITMASK;
1961         }
1962     } else if (guaranteed_hit) {
1963         /* this assumes that guaranteed_hit is due to swallowing */
1964         wakeup(mon, TRUE);
1965         if (obj->otyp == CORPSE && touch_petrifies(&mons[obj->corpsenm])) {
1966             if (is_animal(u.ustuck->data)) {
1967                 minstapetrify(u.ustuck, TRUE);
1968                 /* Don't leave a cockatrice corpse available in a statue */
1969                 if (!u.uswallow) {
1970                     delobj(obj);
1971                     return 1;
1972                 }
1973             }
1974         }
1975 #if 0 /*JP*/
1976         pline("%s into %s %s.", Tobjnam(obj, "vanish"),
1977               s_suffix(mon_nam(mon)),
1978               is_animal(u.ustuck->data) ? "entrails" : "currents");
1979 #else
1980         pline("%s\82Í%s\82Ì%s\82Ö\8fÁ\82¦\82½\81D", xname(obj),
1981               mon_nam(mon),
1982               is_animal(u.ustuck->data) ? "\93à\91\9f\82Ì\92\86" : "\97¬\82ê");
1983 #endif
1984     } else {
1985         tmiss(obj, mon, TRUE);
1986     }
1987
1988     return 0;
1989 }
1990
1991 STATIC_OVL int
1992 gem_accept(mon, obj)
1993 register struct monst *mon;
1994 register struct obj *obj;
1995 {
1996     char buf[BUFSZ];
1997     boolean is_buddy = sgn(mon->data->maligntyp) == sgn(u.ualign.type);
1998     boolean is_gem = objects[obj->otyp].oc_material == GEMSTONE;
1999     int ret = 0;
2000 /*JP
2001     static NEARDATA const char nogood[] = " is not interested in your junk.";
2002 */
2003     static NEARDATA const char nogood[] = "\82 \82È\82½\82Ì\83K\83\89\83N\83^\82É\8b»\96¡\82ð\8e¦\82³\82È\82¢\81D";
2004 /*JP
2005     static NEARDATA const char acceptgift[] = " accepts your gift.";
2006 */
2007     static NEARDATA const char acceptgift[] = "\82 \82È\82½\82Ì\91¡\82è\95¨\82ð\8eó\82¯\82Æ\82Á\82½\81D";
2008 /*JP
2009     static NEARDATA const char maybeluck[] = " hesitatingly";
2010 */
2011     static NEARDATA const char maybeluck[] = "\82½\82ß\82ç\82¢\82È\82ª\82ç";
2012 /*JP
2013     static NEARDATA const char noluck[] = " graciously";
2014 */
2015     static NEARDATA const char noluck[] = "\92\9a\8fd\82É";
2016 /*JP
2017     static NEARDATA const char addluck[] = " gratefully";
2018 */
2019     static NEARDATA const char addluck[] = "\8aì\82ñ\82Å";
2020
2021     Strcpy(buf, Monnam(mon));
2022 #if 1 /*JP*/
2023     Strcat(buf, "\82Í");
2024 #endif
2025     mon->mpeaceful = 1;
2026     mon->mavenge = 0;
2027
2028     /* object properly identified */
2029     if (obj->dknown && objects[obj->otyp].oc_name_known) {
2030         if (is_gem) {
2031             if (is_buddy) {
2032                 Strcat(buf, addluck);
2033                 change_luck(5);
2034             } else {
2035                 Strcat(buf, maybeluck);
2036                 change_luck(rn2(7) - 3);
2037             }
2038         } else {
2039             Strcat(buf, nogood);
2040             goto nopick;
2041         }
2042         /* making guesses */
2043     } else if (has_oname(obj) || objects[obj->otyp].oc_uname) {
2044         if (is_gem) {
2045             if (is_buddy) {
2046                 Strcat(buf, addluck);
2047                 change_luck(2);
2048             } else {
2049                 Strcat(buf, maybeluck);
2050                 change_luck(rn2(3) - 1);
2051             }
2052         } else {
2053             Strcat(buf, nogood);
2054             goto nopick;
2055         }
2056         /* value completely unknown to @ */
2057     } else {
2058         if (is_gem) {
2059             if (is_buddy) {
2060                 Strcat(buf, addluck);
2061                 change_luck(1);
2062             } else {
2063                 Strcat(buf, maybeluck);
2064                 change_luck(rn2(3) - 1);
2065             }
2066         } else {
2067             Strcat(buf, noluck);
2068         }
2069     }
2070     Strcat(buf, acceptgift);
2071     if (*u.ushops || obj->unpaid)
2072         check_shop_obj(obj, mon->mx, mon->my, TRUE);
2073     (void) mpickobj(mon, obj); /* may merge and free obj */
2074     ret = 1;
2075
2076 nopick:
2077     if (!Blind)
2078         pline1(buf);
2079     if (!tele_restrict(mon))
2080         (void) rloc(mon, TRUE);
2081     return ret;
2082 }
2083
2084 /*
2085  * Comments about the restructuring of the old breaks() routine.
2086  *
2087  * There are now three distinct phases to object breaking:
2088  *     breaktest() - which makes the check/decision about whether the
2089  *                   object is going to break.
2090  *     breakmsg()  - which outputs a message about the breakage,
2091  *                   appropriate for that particular object. Should
2092  *                   only be called after a positive breaktest().
2093  *                   on the object and, if it going to be called,
2094  *                   it must be called before calling breakobj().
2095  *                   Calling breakmsg() is optional.
2096  *     breakobj()  - which actually does the breakage and the side-effects
2097  *                   of breaking that particular object. This should
2098  *                   only be called after a positive breaktest() on the
2099  *                   object.
2100  *
2101  * Each of the above routines is currently static to this source module.
2102  * There are two routines callable from outside this source module which
2103  * perform the routines above in the correct sequence.
2104  *
2105  *   hero_breaks() - called when an object is to be broken as a result
2106  *                   of something that the hero has done. (throwing it,
2107  *                   kicking it, etc.)
2108  *   breaks()      - called when an object is to be broken for some
2109  *                   reason other than the hero doing something to it.
2110  */
2111
2112 /*
2113  * The hero causes breakage of an object (throwing, dropping it, etc.)
2114  * Return 0 if the object didn't break, 1 if the object broke.
2115  */
2116 int
2117 hero_breaks(obj, x, y, from_invent)
2118 struct obj *obj;
2119 xchar x, y;          /* object location (ox, oy may not be right) */
2120 boolean from_invent; /* thrown or dropped by player; maybe on shop bill */
2121 {
2122     boolean in_view = Blind ? FALSE : (from_invent || cansee(x, y));
2123     if (!breaktest(obj))
2124         return 0;
2125     breakmsg(obj, in_view);
2126     breakobj(obj, x, y, TRUE, from_invent);
2127     return 1;
2128 }
2129
2130 /*
2131  * The object is going to break for a reason other than the hero doing
2132  * something to it.
2133  * Return 0 if the object doesn't break, 1 if the object broke.
2134  */
2135 int
2136 breaks(obj, x, y)
2137 struct obj *obj;
2138 xchar x, y; /* object location (ox, oy may not be right) */
2139 {
2140     boolean in_view = Blind ? FALSE : cansee(x, y);
2141
2142     if (!breaktest(obj))
2143         return 0;
2144     breakmsg(obj, in_view);
2145     breakobj(obj, x, y, FALSE, FALSE);
2146     return 1;
2147 }
2148
2149 void
2150 release_camera_demon(obj, x, y)
2151 struct obj *obj;
2152 xchar x, y;
2153 {
2154     struct monst *mtmp;
2155     if (!rn2(3)
2156         && (mtmp = makemon(&mons[rn2(3) ? PM_HOMUNCULUS : PM_IMP], x, y,
2157                            NO_MM_FLAGS)) != 0) {
2158         if (canspotmon(mtmp))
2159 #if 0 /*JP*/
2160             pline("%s is released!", Hallucination
2161                                          ? An(rndmonnam(NULL))
2162                                          : "The picture-painting demon");
2163 #else
2164             pline("%s\82ª\89ð\95ú\82³\82ê\82½\81I", Hallucination
2165                                          ? rndmonnam(NULL)
2166                                          : "\82¨\8aG\95`\82«\82Ì\88«\96\82");
2167 #endif
2168         mtmp->mpeaceful = !obj->cursed;
2169         set_malign(mtmp);
2170     }
2171 }
2172
2173 /*
2174  * Unconditionally break an object. Assumes all resistance checks
2175  * and break messages have been delivered prior to getting here.
2176  */
2177 void
2178 breakobj(obj, x, y, hero_caused, from_invent)
2179 struct obj *obj;
2180 xchar x, y;          /* object location (ox, oy may not be right) */
2181 boolean hero_caused; /* is this the hero's fault? */
2182 boolean from_invent;
2183 {
2184     boolean fracture = FALSE;
2185
2186     switch (obj->oclass == POTION_CLASS ? POT_WATER : obj->otyp) {
2187     case MIRROR:
2188         if (hero_caused)
2189             change_luck(-2);
2190         break;
2191     case POT_WATER:      /* really, all potions */
2192         obj->in_use = 1; /* in case it's fatal */
2193         if (obj->otyp == POT_OIL && obj->lamplit) {
2194             explode_oil(obj, x, y);
2195         } else if (distu(x, y) <= 2) {
2196             if (!breathless(youmonst.data) || haseyes(youmonst.data)) {
2197                 if (obj->otyp != POT_WATER) {
2198                     if (!breathless(youmonst.data)) {
2199                         /* [what about "familiar odor" when known?] */
2200 /*JP
2201                         You("smell a peculiar odor...");
2202 */
2203                         You("\96ò\82Á\82Û\82¢\93õ\82¢\82ª\82µ\82½\81D\81D\81D");
2204                     } else {
2205 #if 0 /*JP*/
2206                         const char *eyes = body_part(EYE);
2207
2208                         if (eyecount(youmonst.data) != 1)
2209                             eyes = makeplural(eyes);
2210                         Your("%s %s.", eyes, vtense(eyes, "water"));
2211 #else
2212                         You("\97Ü%s\82É\82È\82Á\82½\81D", body_part(EYE));
2213 #endif
2214                     }
2215                 }
2216                 potionbreathe(obj);
2217             }
2218         }
2219         /* monster breathing isn't handled... [yet?] */
2220         break;
2221     case EXPENSIVE_CAMERA:
2222         release_camera_demon(obj, x, y);
2223         break;
2224     case EGG:
2225         /* breaking your own eggs is bad luck */
2226         if (hero_caused && obj->spe && obj->corpsenm >= LOW_PM)
2227             change_luck((schar) -min(obj->quan, 5L));
2228         break;
2229     case BOULDER:
2230     case STATUE:
2231         /* caller will handle object disposition;
2232            we're just doing the shop theft handling */
2233         fracture = TRUE;
2234         break;
2235     default:
2236         break;
2237     }
2238
2239     if (hero_caused) {
2240         if (from_invent || obj->unpaid) {
2241             if (*u.ushops || obj->unpaid)
2242                 check_shop_obj(obj, x, y, TRUE);
2243         } else if (!obj->no_charge && costly_spot(x, y)) {
2244             /* it is assumed that the obj is a floor-object */
2245             char *o_shop = in_rooms(x, y, SHOPBASE);
2246             struct monst *shkp = shop_keeper(*o_shop);
2247
2248             if (shkp) { /* (implies *o_shop != '\0') */
2249                 static NEARDATA long lastmovetime = 0L;
2250                 static NEARDATA boolean peaceful_shk = FALSE;
2251                 /*  We want to base shk actions on her peacefulness
2252                     at start of this turn, so that "simultaneous"
2253                     multiple breakage isn't drastically worse than
2254                     single breakage.  (ought to be done via ESHK)  */
2255                 if (moves != lastmovetime)
2256                     peaceful_shk = shkp->mpeaceful;
2257                 if (stolen_value(obj, x, y, peaceful_shk, FALSE) > 0L
2258                     && (*o_shop != u.ushops[0] || !inside_shop(u.ux, u.uy))
2259                     && moves != lastmovetime)
2260                     make_angry_shk(shkp, x, y);
2261                 lastmovetime = moves;
2262             }
2263         }
2264     }
2265     if (!fracture)
2266         delobj(obj);
2267 }
2268
2269 /*
2270  * Check to see if obj is going to break, but don't actually break it.
2271  * Return 0 if the object isn't going to break, 1 if it is.
2272  */
2273 boolean
2274 breaktest(obj)
2275 struct obj *obj;
2276 {
2277     if (obj_resists(obj, 1, 99))
2278         return 0;
2279     if (objects[obj->otyp].oc_material == GLASS && !obj->oartifact
2280         && obj->oclass != GEM_CLASS)
2281         return 1;
2282     switch (obj->oclass == POTION_CLASS ? POT_WATER : obj->otyp) {
2283     case EXPENSIVE_CAMERA:
2284     case POT_WATER: /* really, all potions */
2285     case EGG:
2286     case CREAM_PIE:
2287     case MELON:
2288     case ACID_VENOM:
2289     case BLINDING_VENOM:
2290         return 1;
2291     default:
2292         return 0;
2293     }
2294 }
2295
2296 STATIC_OVL void
2297 breakmsg(obj, in_view)
2298 struct obj *obj;
2299 boolean in_view;
2300 {
2301     const char *to_pieces;
2302
2303 #if 0 /*JP*/
2304     to_pieces = "";
2305 #else
2306     /* "shatter" \81¨ "\82±\82È\82²\82È\82É\82È\82Á\82½"
2307        "shatter into a thousand pieces" \81¨ "\82­\82¾\82¯\82Ä\82Î\82ç\82Î\82ç\82É\82È\82Á\82½" */
2308     to_pieces = "\82±\82È\82²\82È";
2309 #endif
2310     switch (obj->oclass == POTION_CLASS ? POT_WATER : obj->otyp) {
2311     default: /* glass or crystal wand */
2312         if (obj->oclass != WAND_CLASS)
2313             impossible("breaking odd object?");
2314         /*FALLTHRU*/
2315     case CRYSTAL_PLATE_MAIL:
2316     case LENSES:
2317     case MIRROR:
2318     case CRYSTAL_BALL:
2319     case EXPENSIVE_CAMERA:
2320 /*JP
2321         to_pieces = " into a thousand pieces";
2322 */
2323         to_pieces = "\82­\82¾\82¯\82Ä\82Î\82ç\82Î\82ç";
2324     /*FALLTHRU*/
2325     case POT_WATER: /* really, all potions */
2326         if (!in_view)
2327 /*JP
2328             You_hear("%s shatter!", something);
2329 */
2330             You_hear("%s\82ª\89ó\82ê\82é\89¹\82ð\95·\82¢\82½\81I", something);
2331         else
2332 #if 0 /*JP*/
2333             pline("%s shatter%s%s!", Doname2(obj),
2334                   (obj->quan == 1L) ? "s" : "", to_pieces);
2335 #else
2336             pline("%s\82Í%s\82É\82È\82Á\82½\81I", Doname2(obj), to_pieces);
2337 #endif
2338         break;
2339     case EGG:
2340     case MELON:
2341 /*JP
2342         pline("Splat!");
2343 */
2344         pline("\83r\83`\83\83\81I");
2345         break;
2346     case CREAM_PIE:
2347         if (in_view)
2348 /*JP
2349             pline("What a mess!");
2350 */
2351             pline("\82±\82è\82á\82Ð\82Ç\82¢\81I");
2352         break;
2353     case ACID_VENOM:
2354     case BLINDING_VENOM:
2355 /*JP
2356         pline("Splash!");
2357 */
2358         pline("\83r\83`\83\83\81I");
2359         break;
2360     }
2361 }
2362
2363 STATIC_OVL int
2364 throw_gold(obj)
2365 struct obj *obj;
2366 {
2367     int range, odx, ody;
2368     register struct monst *mon;
2369
2370     if (!u.dx && !u.dy && !u.dz) {
2371 /*JP
2372         You("cannot throw gold at yourself.");
2373 */
2374         pline("\8e©\95ª\82É\8bà\89Ý\82ð\93\8a\82°\82é\82±\82Æ\82Í\82Å\82«\82È\82¢\81D");
2375         return 0;
2376     }
2377     freeinv(obj);
2378     if (u.uswallow) {
2379 #if 0 /*JP*/
2380         pline(is_animal(u.ustuck->data) ? "%s in the %s's entrails."
2381                                         : "%s into %s.",
2382               "The money disappears", mon_nam(u.ustuck));
2383 #else
2384         pline(is_animal(u.ustuck->data) ? "\8bà\89Ý\82Í%s\82Ì\95 \82Ì\92\86\82Ö\8fÁ\82¦\82Ä\82¢\82Á\82½\81D"
2385                                         : "\8bà\89Ý\82Í%s\82Ì\92\86\82Ö\8fÁ\82¦\82Ä\82¢\82Á\82½\81D",
2386               mon_nam(u.ustuck));
2387 #endif
2388         add_to_minv(u.ustuck, obj);
2389         return 1;
2390     }
2391
2392     if (u.dz) {
2393         if (u.dz < 0 && !Is_airlevel(&u.uz) && !Underwater
2394             && !Is_waterlevel(&u.uz)) {
2395 #if 0 /*JP*/
2396             pline_The("gold hits the %s, then falls back on top of your %s.",
2397                       ceiling(u.ux, u.uy), body_part(HEAD));
2398 #else
2399             pline("\8bà\89Ý\82Í%s\82É\96½\92\86\82µ\81C\82 \82È\82½\82Ì%s\82Ì\90^\8fã\82É\97\8e\82¿\82Ä\82«\82½\81D",
2400                   ceiling(u.ux,u.uy), body_part(HEAD));
2401 #endif
2402             /* some self damage? */
2403             if (uarmh)
2404 /*JP
2405                 pline("Fortunately, you are wearing %s!",
2406 */
2407                 pline("\8dK\89^\82È\82±\82Æ\82É\81C\82 \82È\82½\82Í%s\82ð\90g\82É\82Â\82¯\82Ä\82¢\82é\81I",
2408                       an(helm_simple_name(uarmh)));
2409         }
2410         bhitpos.x = u.ux;
2411         bhitpos.y = u.uy;
2412     } else {
2413         /* consistent with range for normal objects */
2414         range = (int) ((ACURRSTR) / 2 - obj->owt / 40);
2415
2416         /* see if the gold has a place to move into */
2417         odx = u.ux + u.dx;
2418         ody = u.uy + u.dy;
2419         if (!ZAP_POS(levl[odx][ody].typ) || closed_door(odx, ody)) {
2420             bhitpos.x = u.ux;
2421             bhitpos.y = u.uy;
2422         } else {
2423             mon = bhit(u.dx, u.dy, range, THROWN_WEAPON,
2424                        (int FDECL((*), (MONST_P, OBJ_P))) 0,
2425                        (int FDECL((*), (OBJ_P, OBJ_P))) 0, &obj);
2426             if (!obj)
2427                 return 1; /* object is gone */
2428             if (mon) {
2429                 if (ghitm(mon, obj)) /* was it caught? */
2430                     return 1;
2431             } else {
2432                 if (ship_object(obj, bhitpos.x, bhitpos.y, FALSE))
2433                     return 1;
2434             }
2435         }
2436     }
2437
2438 /*JP
2439     if (flooreffects(obj, bhitpos.x, bhitpos.y, "fall"))
2440 */
2441     if (flooreffects(obj, bhitpos.x, bhitpos.y, "\97\8e\82¿\82é"))
2442         return 1;
2443     if (u.dz > 0)
2444 /*JP
2445         pline_The("gold hits the %s.", surface(bhitpos.x, bhitpos.y));
2446 */
2447         pline("\8bà\89Ý\82Í%s\82É\96½\92\86\82µ\82½\81D", surface(bhitpos.x, bhitpos.y));
2448     place_object(obj, bhitpos.x, bhitpos.y);
2449     if (*u.ushops)
2450         sellobj(obj, bhitpos.x, bhitpos.y);
2451     stackobj(obj);
2452     newsym(bhitpos.x, bhitpos.y);
2453     return 1;
2454 }
2455
2456 /*dothrow.c*/