OSDN Git Service

add translation
[jnethack/source.git] / src / uhitm.c
1 /* NetHack 3.6  uhitm.c $NHDT-Date: 1555720104 2019/04/20 00:28:24 $  $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.207 $ */
2 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
3 /*-Copyright (c) Robert Patrick Rankin, 2012. */
4 /* NetHack may be freely redistributed.  See license for details. */
5
6 /* JNetHack Copyright */
7 /* (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000  */
8 /* For 3.4-, Copyright (c) SHIRAKATA Kentaro, 2002-2019            */
9 /* JNetHack may be freely redistributed.  See license for details. */
10
11 #include "hack.h"
12
13 STATIC_DCL boolean FDECL(known_hitum, (struct monst *, struct obj *, int *,
14                                        int, int, struct attack *, int));
15 STATIC_DCL boolean FDECL(theft_petrifies, (struct obj *));
16 STATIC_DCL void FDECL(steal_it, (struct monst *, struct attack *));
17 STATIC_DCL boolean FDECL(hitum_cleave, (struct monst *, struct attack *));
18 STATIC_DCL boolean FDECL(hitum, (struct monst *, struct attack *));
19 STATIC_DCL boolean FDECL(hmon_hitmon, (struct monst *, struct obj *, int,
20                                        int));
21 STATIC_DCL int FDECL(joust, (struct monst *, struct obj *));
22 STATIC_DCL void NDECL(demonpet);
23 STATIC_DCL boolean FDECL(m_slips_free, (struct monst *, struct attack *));
24 STATIC_DCL int FDECL(explum, (struct monst *, struct attack *));
25 STATIC_DCL void FDECL(start_engulf, (struct monst *));
26 STATIC_DCL void NDECL(end_engulf);
27 STATIC_DCL int FDECL(gulpum, (struct monst *, struct attack *));
28 STATIC_DCL boolean FDECL(hmonas, (struct monst *));
29 STATIC_DCL void FDECL(nohandglow, (struct monst *));
30 STATIC_DCL boolean FDECL(shade_aware, (struct obj *));
31
32 extern boolean notonhead; /* for long worms */
33
34 /* Used to flag attacks caused by Stormbringer's maliciousness. */
35 static boolean override_confirmation = FALSE;
36
37 #define PROJECTILE(obj) ((obj) && is_ammo(obj))
38
39 void
40 erode_armor(mdef, hurt)
41 struct monst *mdef;
42 int hurt;
43 {
44     struct obj *target;
45
46     /* What the following code does: it keeps looping until it
47      * finds a target for the rust monster.
48      * Head, feet, etc... not covered by metal, or covered by
49      * rusty metal, are not targets.  However, your body always
50      * is, no matter what covers it.
51      */
52     while (1) {
53         switch (rn2(5)) {
54         case 0:
55             target = which_armor(mdef, W_ARMH);
56             if (!target
57                 || erode_obj(target, xname(target), hurt, EF_GREASE)
58                        == ER_NOTHING)
59                 continue;
60             break;
61         case 1:
62             target = which_armor(mdef, W_ARMC);
63             if (target) {
64                 (void) erode_obj(target, xname(target), hurt,
65                                  EF_GREASE | EF_VERBOSE);
66                 break;
67             }
68             if ((target = which_armor(mdef, W_ARM)) != (struct obj *) 0) {
69                 (void) erode_obj(target, xname(target), hurt,
70                                  EF_GREASE | EF_VERBOSE);
71             } else if ((target = which_armor(mdef, W_ARMU))
72                        != (struct obj *) 0) {
73                 (void) erode_obj(target, xname(target), hurt,
74                                  EF_GREASE | EF_VERBOSE);
75             }
76             break;
77         case 2:
78             target = which_armor(mdef, W_ARMS);
79             if (!target
80                 || erode_obj(target, xname(target), hurt, EF_GREASE)
81                        == ER_NOTHING)
82                 continue;
83             break;
84         case 3:
85             target = which_armor(mdef, W_ARMG);
86             if (!target
87                 || erode_obj(target, xname(target), hurt, EF_GREASE)
88                        == ER_NOTHING)
89                 continue;
90             break;
91         case 4:
92             target = which_armor(mdef, W_ARMF);
93             if (!target
94                 || erode_obj(target, xname(target), hurt, EF_GREASE)
95                        == ER_NOTHING)
96                 continue;
97             break;
98         }
99         break; /* Out of while loop */
100     }
101 }
102
103 /* FALSE means it's OK to attack */
104 boolean
105 attack_checks(mtmp, wep)
106 register struct monst *mtmp;
107 struct obj *wep; /* uwep for attack(), null for kick_monster() */
108 {
109     int glyph;
110
111     /* if you're close enough to attack, alert any waiting monster */
112     mtmp->mstrategy &= ~STRAT_WAITMASK;
113
114     if (u.uswallow && mtmp == u.ustuck)
115         return FALSE;
116
117     if (context.forcefight) {
118         /* Do this in the caller, after we checked that the monster
119          * didn't die from the blow.  Reason: putting the 'I' there
120          * causes the hero to forget the square's contents since
121          * both 'I' and remembered contents are stored in .glyph.
122          * If the monster dies immediately from the blow, the 'I' will
123          * not stay there, so the player will have suddenly forgotten
124          * the square's contents for no apparent reason.
125         if (!canspotmon(mtmp)
126             && !glyph_is_invisible(levl[bhitpos.x][bhitpos.y].glyph))
127             map_invisible(bhitpos.x, bhitpos.y);
128          */
129         return FALSE;
130     }
131
132     /* cache the shown glyph;
133        cases which might change it (by placing or removing
134        'rembered, unseen monster' glyph or revealing a mimic)
135        always return without further reference to this */
136     glyph = glyph_at(bhitpos.x, bhitpos.y);
137
138     /* Put up an invisible monster marker, but with exceptions for
139      * monsters that hide and monsters you've been warned about.
140      * The former already prints a warning message and
141      * prevents you from hitting the monster just via the hidden monster
142      * code below; if we also did that here, similar behavior would be
143      * happening two turns in a row.  The latter shows a glyph on
144      * the screen, so you know something is there.
145      */
146     if (!canspotmon(mtmp)
147         && !glyph_is_warning(glyph) && !glyph_is_invisible(glyph)
148         && !(!Blind && mtmp->mundetected && hides_under(mtmp->data))) {
149 /*JP
150         pline("Wait!  There's %s there you can't see!", something);
151 */
152         pline("\82¿\82å\82Á\82Æ\91Ò\82Á\82½\81I\8ep\82Ì\8c©\82¦\82È\82¢%s\82ª\82¢\82é\81I", something);
153         map_invisible(bhitpos.x, bhitpos.y);
154         /* if it was an invisible mimic, treat it as if we stumbled
155          * onto a visible mimic
156          */
157         if (M_AP_TYPE(mtmp) && !Protection_from_shape_changers
158             /* applied pole-arm attack is too far to get stuck */
159             && distu(mtmp->mx, mtmp->my) <= 2) {
160             if (!u.ustuck && !mtmp->mflee && dmgtype(mtmp->data, AD_STCK))
161                 u.ustuck = mtmp;
162         }
163         /* #H7329 - if hero is on engraved "Elbereth", this will end up
164          * assessing an alignment penalty and removing the engraving
165          * even though no attack actually occurs.  Since it also angers
166          * peacefuls, we're operating as if an attack attempt did occur
167          * and the Elbereth behavior is consistent.
168          */
169         wakeup(mtmp, TRUE); /* always necessary; also un-mimics mimics */
170         return TRUE;
171     }
172
173     if (M_AP_TYPE(mtmp) && !Protection_from_shape_changers && !sensemon(mtmp)
174         && !glyph_is_warning(glyph)) {
175         /* If a hidden mimic was in a square where a player remembers
176          * some (probably different) unseen monster, the player is in
177          * luck--he attacks it even though it's hidden.
178          */
179         if (glyph_is_invisible(glyph)) {
180             seemimic(mtmp);
181             return FALSE;
182         }
183         stumble_onto_mimic(mtmp);
184         return TRUE;
185     }
186
187     if (mtmp->mundetected && !canseemon(mtmp)
188         && !glyph_is_warning(glyph)
189         && (hides_under(mtmp->data) || mtmp->data->mlet == S_EEL)) {
190         mtmp->mundetected = mtmp->msleeping = 0;
191         newsym(mtmp->mx, mtmp->my);
192         if (glyph_is_invisible(glyph)) {
193             seemimic(mtmp);
194             return FALSE;
195         }
196         if (!((Blind ? Blind_telepat : Unblind_telepat) || Detect_monsters)) {
197             struct obj *obj;
198
199             if (!Blind && Hallucination)
200 #if 0 /*JP*/
201                 pline("A %s %s appeared!",
202                       mtmp->mtame ? "tame" : "wild", l_monnam(mtmp));
203 #else
204                 pline("%s%s\82ª\8c»\82ê\82½\81I",
205                       mtmp->mtame ? "\8eè\82È\82Ã\82¯\82ç\82ê\82½" : "\96ì\90\82Ì", l_monnam(mtmp));
206 #endif
207             else if (Blind || (is_pool(mtmp->mx, mtmp->my) && !Underwater))
208 /*JP
209                 pline("Wait!  There's a hidden monster there!");
210 */
211                 pline("\91Ò\82Ä\81I\89ö\95¨\82ª\89B\82ê\82Ä\82¢\82é\81I");
212             else if ((obj = level.objects[mtmp->mx][mtmp->my]) != 0)
213 #if 0 /*JP*/
214                 pline("Wait!  There's %s hiding under %s!",
215                       an(l_monnam(mtmp)), doname(obj));
216 #else
217                 pline("\91Ò\82Ä\81I%s\82Ì\89º\82É%s\82ª\89B\82ê\82Ä\82¢\82é\81I",
218                       doname(obj), l_monnam(mtmp));
219 #endif
220             return TRUE;
221         }
222     }
223
224     /*
225      * make sure to wake up a monster from the above cases if the
226      * hero can sense that the monster is there.
227      */
228     if ((mtmp->mundetected || M_AP_TYPE(mtmp)) && sensemon(mtmp)) {
229         mtmp->mundetected = 0;
230         wakeup(mtmp, TRUE);
231     }
232
233     if (flags.confirm && mtmp->mpeaceful
234         && !Confusion && !Hallucination && !Stunned) {
235         /* Intelligent chaotic weapons (Stormbringer) want blood */
236         if (wep && wep->oartifact == ART_STORMBRINGER) {
237             override_confirmation = TRUE;
238             return FALSE;
239         }
240         if (canspotmon(mtmp)) {
241             char qbuf[QBUFSZ];
242
243 /*JP
244             Sprintf(qbuf, "Really attack %s?", mon_nam(mtmp));
245 */
246             Sprintf(qbuf, "\96{\93\96\82É%s\82ð\8dU\8c\82\82·\82é\82Ì\81H", mon_nam(mtmp));
247             if (!paranoid_query(ParanoidHit, qbuf)) {
248                 context.move = 0;
249                 return TRUE;
250             }
251         }
252     }
253
254     return FALSE;
255 }
256
257 /*
258  * It is unchivalrous for a knight to attack the defenseless or from behind.
259  */
260 void
261 check_caitiff(mtmp)
262 struct monst *mtmp;
263 {
264     if (u.ualign.record <= -10)
265         return;
266
267     if (Role_if(PM_KNIGHT) && u.ualign.type == A_LAWFUL
268         && (!mtmp->mcanmove || mtmp->msleeping
269             || (mtmp->mflee && !mtmp->mavenge))) {
270 /*JP
271         You("caitiff!");
272 */
273         pline("\82±\82ê\82Í\94Ú\8b¯\82È\8ds\82¢\82¾\81I");
274         adjalign(-1);
275     } else if (Role_if(PM_SAMURAI) && mtmp->mpeaceful) {
276         /* attacking peaceful creatures is bad for the samurai's giri */
277 /*JP
278         You("dishonorably attack the innocent!");
279 */
280         pline("\96³\8eÀ\82Ì\8eÒ\82ð\8dU\8c\82\82·\82é\82Ì\82Í\95s\96¼\97_\82¾\81I");
281         adjalign(-1);
282     }
283 }
284
285 int
286 find_roll_to_hit(mtmp, aatyp, weapon, attk_count, role_roll_penalty)
287 register struct monst *mtmp;
288 uchar aatyp;        /* usually AT_WEAP or AT_KICK */
289 struct obj *weapon; /* uwep or uswapwep or NULL */
290 int *attk_count, *role_roll_penalty;
291 {
292     int tmp, tmp2;
293
294     *role_roll_penalty = 0; /* default is `none' */
295
296     tmp = 1 + Luck + abon() + find_mac(mtmp) + u.uhitinc
297           + maybe_polyd(youmonst.data->mlevel, u.ulevel);
298
299     /* some actions should occur only once during multiple attacks */
300     if (!(*attk_count)++) {
301         /* knight's chivalry or samurai's giri */
302         check_caitiff(mtmp);
303     }
304
305     /* adjust vs. (and possibly modify) monster state */
306     if (mtmp->mstun)
307         tmp += 2;
308     if (mtmp->mflee)
309         tmp += 2;
310
311     if (mtmp->msleeping) {
312         mtmp->msleeping = 0;
313         tmp += 2;
314     }
315     if (!mtmp->mcanmove) {
316         tmp += 4;
317         if (!rn2(10)) {
318             mtmp->mcanmove = 1;
319             mtmp->mfrozen = 0;
320         }
321     }
322
323     /* role/race adjustments */
324     if (Role_if(PM_MONK) && !Upolyd) {
325         if (uarm)
326             tmp -= (*role_roll_penalty = urole.spelarmr);
327         else if (!uwep && !uarms)
328             tmp += (u.ulevel / 3) + 2;
329     }
330     if (is_orc(mtmp->data)
331         && maybe_polyd(is_elf(youmonst.data), Race_if(PM_ELF)))
332         tmp++;
333
334     /* encumbrance: with a lot of luggage, your agility diminishes */
335     if ((tmp2 = near_capacity()) != 0)
336         tmp -= (tmp2 * 2) - 1;
337     if (u.utrap)
338         tmp -= 3;
339
340     /*
341      * hitval applies if making a weapon attack while wielding a weapon;
342      * weapon_hit_bonus applies if doing a weapon attack even bare-handed
343      * or if kicking as martial artist
344      */
345     if (aatyp == AT_WEAP || aatyp == AT_CLAW) {
346         if (weapon)
347             tmp += hitval(weapon, mtmp);
348         tmp += weapon_hit_bonus(weapon);
349     } else if (aatyp == AT_KICK && martial_bonus()) {
350         tmp += weapon_hit_bonus((struct obj *) 0);
351     }
352
353     return tmp;
354 }
355
356 /* try to attack; return False if monster evaded;
357    u.dx and u.dy must be set */
358 boolean
359 attack(mtmp)
360 register struct monst *mtmp;
361 {
362     register struct permonst *mdat = mtmp->data;
363
364     /* This section of code provides protection against accidentally
365      * hitting peaceful (like '@') and tame (like 'd') monsters.
366      * Protection is provided as long as player is not: blind, confused,
367      * hallucinating or stunned.
368      * changes by wwp 5/16/85
369      * More changes 12/90, -dkh-. if its tame and safepet, (and protected
370      * 07/92) then we assume that you're not trying to attack. Instead,
371      * you'll usually just swap places if this is a movement command
372      */
373     /* Intelligent chaotic weapons (Stormbringer) want blood */
374     if (is_safepet(mtmp) && !context.forcefight) {
375         if (!uwep || uwep->oartifact != ART_STORMBRINGER) {
376             /* There are some additional considerations: this won't work
377              * if in a shop or Punished or you miss a random roll or
378              * if you can walk thru walls and your pet cannot (KAA) or
379              * if your pet is a long worm with a tail.
380              * There's also a chance of displacing a "frozen" monster:
381              * sleeping monsters might magically walk in their sleep.
382              */
383             boolean foo = (Punished || !rn2(7)
384                            || (is_longworm(mtmp->data) && mtmp->wormno)),
385                     inshop = FALSE;
386             char *p;
387
388             /* only check for in-shop if don't already have reason to stop */
389             if (!foo) {
390                 for (p = in_rooms(mtmp->mx, mtmp->my, SHOPBASE); *p; p++)
391                     if (tended_shop(&rooms[*p - ROOMOFFSET])) {
392                         inshop = TRUE;
393                         break;
394                     }
395             }
396             if (inshop || foo || (IS_ROCK(levl[u.ux][u.uy].typ)
397                                   && !passes_walls(mtmp->data))) {
398                 char buf[BUFSZ];
399
400                 monflee(mtmp, rnd(6), FALSE, FALSE);
401                 Strcpy(buf, y_monnam(mtmp));
402                 buf[0] = highc(buf[0]);
403 /*JP
404                 You("stop.  %s is in the way!", buf);
405 */
406                 You("\8e~\82Ü\82Á\82½\81D%s\82ª\93¹\82É\82¢\82é\81I", buf);
407                 context.travel = context.travel1 = context.mv = context.run
408                     = 0;
409                 return TRUE;
410             } else if ((mtmp->mfrozen || (!mtmp->mcanmove)
411                         || (mtmp->data->mmove == 0)) && rn2(6)) {
412 /*JP
413                 pline("%s doesn't seem to move!", Monnam(mtmp));
414 */
415                 pline("%s\82Í\93®\82¯\82È\82¢\82æ\82¤\82¾\81I", Monnam(mtmp));
416                 context.travel = context.travel1 = context.mv = context.run
417                     = 0;
418                 return TRUE;
419             } else
420                 return FALSE;
421         }
422     }
423
424     /* possibly set in attack_checks;
425        examined in known_hitum, called via hitum or hmonas below */
426     override_confirmation = FALSE;
427     /* attack_checks() used to use <u.ux+u.dx,u.uy+u.dy> directly, now
428        it uses bhitpos instead; it might map an invisible monster there */
429     bhitpos.x = u.ux + u.dx;
430     bhitpos.y = u.uy + u.dy;
431     notonhead = (bhitpos.x != mtmp->mx || bhitpos.y != mtmp->my);
432     if (attack_checks(mtmp, uwep))
433         return TRUE;
434
435     if (Upolyd && noattacks(youmonst.data)) {
436         /* certain "pacifist" monsters don't attack */
437 /*JP
438         You("have no way to attack monsters physically.");
439 */
440         You("\95¨\97\9d\93I\82É\89ö\95¨\82ð\8dU\8c\82\82·\82é\82·\82×\82ª\82È\82¢\81D");
441         mtmp->mstrategy &= ~STRAT_WAITMASK;
442         goto atk_done;
443     }
444
445 /*JP
446     if (check_capacity("You cannot fight while so heavily loaded.")
447 */
448     if (check_capacity("\82 \82È\82½\82Í\95¨\82ð\82½\82­\82³\82ñ\8e\9d\82¿\82·\82¬\82Ä\90í\82¦\82È\82¢\81D")
449         /* consume extra nutrition during combat; maybe pass out */
450         || overexertion())
451         goto atk_done;
452
453     if (u.twoweap && !can_twoweapon())
454         untwoweapon();
455
456     if (unweapon) {
457         unweapon = FALSE;
458         if (flags.verbose) {
459             if (uwep)
460 /*JP
461                 You("begin bashing monsters with %s.", yname(uwep));
462 */
463                 You("%s\82Å\89ö\95¨\82ð\82È\82®\82è\82Â\82¯\82½\81D", yname(uwep));
464             else if (!cantwield(youmonst.data))
465 #if 0 /*JP*/
466                 You("begin %s monsters with your %s %s.",
467                     ing_suffix(Role_if(PM_MONK) ? "strike" : "bash"),
468                     uarmg ? "gloved" : "bare", /* Del Lamb */
469                     makeplural(body_part(HAND)));
470 #else
471                 You("%s%s\82Å\89ö\95¨\82ð%s\82Â\82¯\82½\81D",
472                     uarmg ? "\83O\83\8d\81[\83u\82ð\95t\82¯\82½" : "\91f",
473                     body_part(HAND),
474                     Role_if(PM_MONK) ? "\91Å\82¿" : "\82È\82®\82è");
475 #endif
476         }
477     }
478     exercise(A_STR, TRUE); /* you're exercising muscles */
479     /* andrew@orca: prevent unlimited pick-axe attacks */
480     u_wipe_engr(3);
481
482     /* Is the "it died" check actually correct? */
483     if (mdat->mlet == S_LEPRECHAUN && !mtmp->mfrozen && !mtmp->msleeping
484         && !mtmp->mconf && mtmp->mcansee && !rn2(7)
485         && (m_move(mtmp, 0) == 2 /* it died */
486             || mtmp->mx != u.ux + u.dx
487             || mtmp->my != u.uy + u.dy)) { /* it moved */
488 /*JP
489         You("miss wildly and stumble forwards.");
490 */
491         You("\91å\82«\82­\8aO\82µ\82Ä\91O\82É\82Â\82Ü\82Ã\82¢\82½\81D");
492         return FALSE;
493     }
494
495     if (Upolyd)
496         (void) hmonas(mtmp);
497     else
498         (void) hitum(mtmp, youmonst.data->mattk);
499     mtmp->mstrategy &= ~STRAT_WAITMASK;
500
501  atk_done:
502     /* see comment in attack_checks() */
503     /* we only need to check for this if we did an attack_checks()
504      * and it returned 0 (it's okay to attack), and the monster didn't
505      * evade.
506      */
507     if (context.forcefight && !DEADMONSTER(mtmp) && !canspotmon(mtmp)
508         && !glyph_is_invisible(levl[u.ux + u.dx][u.uy + u.dy].glyph)
509         && !(u.uswallow && mtmp == u.ustuck))
510         map_invisible(u.ux + u.dx, u.uy + u.dy);
511
512     return TRUE;
513 }
514
515 /* really hit target monster; returns TRUE if it still lives */
516 STATIC_OVL boolean
517 known_hitum(mon, weapon, mhit, rollneeded, armorpenalty, uattk, dieroll)
518 register struct monst *mon;
519 struct obj *weapon;
520 int *mhit;
521 int rollneeded, armorpenalty; /* for monks */
522 struct attack *uattk;
523 int dieroll;
524 {
525     boolean malive = TRUE,
526             /* hmon() might destroy weapon; remember aspect for cutworm */
527             slice_or_chop = (weapon && (is_blade(weapon) || is_axe(weapon)));
528
529     if (override_confirmation) {
530         /* this may need to be generalized if weapons other than
531            Stormbringer acquire similar anti-social behavior... */
532         if (flags.verbose)
533 /*JP
534             Your("bloodthirsty blade attacks!");
535 */
536             Your("\95\90\8aí\82Í\8c\8c\82É\8bQ\82¦\82Ä\82¢\82é\81I");
537     }
538
539     if (!*mhit) {
540         missum(mon, uattk, (rollneeded + armorpenalty > dieroll));
541     } else {
542         int oldhp = mon->mhp;
543         long oldweaphit = u.uconduct.weaphit;
544
545         /* KMH, conduct */
546         if (weapon && (weapon->oclass == WEAPON_CLASS || is_weptool(weapon)))
547             u.uconduct.weaphit++;
548
549         /* we hit the monster; be careful: it might die or
550            be knocked into a different location */
551         notonhead = (mon->mx != bhitpos.x || mon->my != bhitpos.y);
552         malive = hmon(mon, weapon, HMON_MELEE, dieroll);
553         if (malive) {
554             /* monster still alive */
555             if (!rn2(25) && mon->mhp < mon->mhpmax / 2
556                 && !(u.uswallow && mon == u.ustuck)) {
557                 /* maybe should regurgitate if swallowed? */
558                 monflee(mon, !rn2(3) ? rnd(100) : 0, FALSE, TRUE);
559
560                 if (u.ustuck == mon && !u.uswallow && !sticks(youmonst.data))
561                     u.ustuck = 0;
562             }
563             /* Vorpal Blade hit converted to miss */
564             /* could be headless monster or worm tail */
565             if (mon->mhp == oldhp) {
566                 *mhit = 0;
567                 /* a miss does not break conduct */
568                 u.uconduct.weaphit = oldweaphit;
569             }
570             if (mon->wormno && *mhit)
571                 cutworm(mon, bhitpos.x, bhitpos.y, slice_or_chop);
572         }
573     }
574     return malive;
575 }
576
577 /* hit the monster next to you and the monsters to the left and right of it;
578    return False if the primary target is killed, True otherwise */
579 STATIC_OVL boolean
580 hitum_cleave(target, uattk)
581 struct monst *target; /* non-Null; forcefight at nothing doesn't cleave... */
582 struct attack *uattk; /* ... but we don't enforce that here; Null works ok */
583 {
584     /* swings will be delivered in alternate directions; with consecutive
585        attacks it will simulate normal swing and backswing; when swings
586        are non-consecutive, hero will sometimes start a series of attacks
587        with a backswing--that doesn't impact actual play, just spoils the
588        simulation attempt a bit */
589     static boolean clockwise = FALSE;
590     unsigned i;
591     coord save_bhitpos;
592     int count, umort, x = u.ux, y = u.uy;
593
594     /* find the direction toward primary target */
595     for (i = 0; i < 8; ++i)
596         if (xdir[i] == u.dx && ydir[i] == u.dy)
597             break;
598     if (i == 8) {
599         impossible("hitum_cleave: unknown target direction [%d,%d,%d]?",
600                    u.dx, u.dy, u.dz);
601         return TRUE; /* target hasn't been killed */
602     }
603     /* adjust direction by two so that loop's increment (for clockwise)
604        or decrement (for counter-clockwise) will point at the spot next
605        to primary target */
606     i = (i + (clockwise ? 6 : 2)) % 8;
607     umort = u.umortality; /* used to detect life-saving */
608     save_bhitpos = bhitpos;
609
610     /*
611      * Three attacks:  adjacent to primary, primary, adjacent on other
612      * side.  Primary target must be present or we wouldn't have gotten
613      * here (forcefight at thin air won't 'cleave').  However, the
614      * first attack might kill it (gas spore explosion, weak long worm
615      * occupying both spots) so we don't assume that it's still present
616      * on the second attack.
617      */
618     for (count = 3; count > 0; --count) {
619         struct monst *mtmp;
620         int tx, ty, tmp, dieroll, mhit, attknum, armorpenalty;
621
622         /* ++i, wrap 8 to i=0 /or/ --i, wrap -1 to i=7 */
623         i = (i + (clockwise ? 1 : 7)) % 8;
624
625         tx = x + xdir[i], ty = y + ydir[i]; /* current target location */
626         if (!isok(tx, ty))
627             continue;
628         mtmp = m_at(tx, ty);
629         if (!mtmp) {
630             if (glyph_is_invisible(levl[tx][ty].glyph))
631                 (void) unmap_invisible(tx, ty);
632             continue;
633         }
634
635         tmp = find_roll_to_hit(mtmp, uattk->aatyp, uwep,
636                                &attknum, &armorpenalty);
637         dieroll = rnd(20);
638         mhit = (tmp > dieroll);
639         bhitpos.x = tx, bhitpos.y = ty; /* normally set up by attack() */
640         (void) known_hitum(mtmp, uwep, &mhit, tmp, armorpenalty,
641                            uattk, dieroll);
642         (void) passive(mtmp, uwep, mhit, !DEADMONSTER(mtmp), AT_WEAP, !uwep);
643
644         /* stop attacking if weapon is gone or hero got killed and
645            life-saved after passive counter-attack */
646         if (!uwep || u.umortality > umort)
647             break;
648     }
649     /* set up for next time */
650     clockwise = !clockwise; /* alternate */
651     bhitpos = save_bhitpos; /* in case somebody relies on bhitpos
652                              * designating the primary target */
653
654     /* return False if primary target died, True otherwise; note: if 'target'
655        was nonNull upon entry then it's still nonNull even if *target died */
656     return (target && DEADMONSTER(target)) ? FALSE : TRUE;
657 }
658
659 /* hit target monster; returns TRUE if it still lives */
660 STATIC_OVL boolean
661 hitum(mon, uattk)
662 struct monst *mon;
663 struct attack *uattk;
664 {
665     boolean malive, wep_was_destroyed = FALSE;
666     struct obj *wepbefore = uwep;
667     int armorpenalty, attknum = 0, x = u.ux + u.dx, y = u.uy + u.dy,
668                       tmp = find_roll_to_hit(mon, uattk->aatyp, uwep,
669                                              &attknum, &armorpenalty);
670     int dieroll = rnd(20);
671     int mhit = (tmp > dieroll || u.uswallow);
672
673     /* Cleaver attacks three spots, 'mon' and one on either side of 'mon';
674        it can't be part of dual-wielding but we guard against that anyway;
675        cleave return value reflects status of primary target ('mon') */
676     if (uwep && uwep->oartifact == ART_CLEAVER && !u.twoweap
677         && !u.uswallow && !u.ustuck && !NODIAG(u.umonnum))
678         return hitum_cleave(mon, uattk);
679
680     if (tmp > dieroll)
681         exercise(A_DEX, TRUE);
682     /* bhitpos is set up by caller */
683     malive = known_hitum(mon, uwep, &mhit, tmp, armorpenalty, uattk, dieroll);
684     if (wepbefore && !uwep)
685         wep_was_destroyed = TRUE;
686     (void) passive(mon, uwep, mhit, malive, AT_WEAP, wep_was_destroyed);
687
688     /* second attack for two-weapon combat; won't occur if Stormbringer
689        overrode confirmation (assumes Stormbringer is primary weapon)
690        or if the monster was killed or knocked to different location */
691     if (u.twoweap && !override_confirmation && malive && m_at(x, y) == mon) {
692         tmp = find_roll_to_hit(mon, uattk->aatyp, uswapwep, &attknum,
693                                &armorpenalty);
694         dieroll = rnd(20);
695         mhit = (tmp > dieroll || u.uswallow);
696         malive = known_hitum(mon, uswapwep, &mhit, tmp, armorpenalty, uattk,
697                              dieroll);
698         /* second passive counter-attack only occurs if second attack hits */
699         if (mhit)
700             (void) passive(mon, uswapwep, mhit, malive, AT_WEAP, !uswapwep);
701     }
702     return malive;
703 }
704
705 /* general "damage monster" routine; return True if mon still alive */
706 boolean
707 hmon(mon, obj, thrown, dieroll)
708 struct monst *mon;
709 struct obj *obj;
710 int thrown; /* HMON_xxx (0 => hand-to-hand, other => ranged) */
711 int dieroll;
712 {
713     boolean result, anger_guards;
714
715     anger_guards = (mon->mpeaceful
716                     && (mon->ispriest || mon->isshk || is_watch(mon->data)));
717     result = hmon_hitmon(mon, obj, thrown, dieroll);
718     if (mon->ispriest && !rn2(2))
719         ghod_hitsu(mon);
720     if (anger_guards)
721         (void) angry_guards(!!Deaf);
722     return result;
723 }
724
725 /* guts of hmon() */
726 STATIC_OVL boolean
727 hmon_hitmon(mon, obj, thrown, dieroll)
728 struct monst *mon;
729 struct obj *obj;
730 int thrown; /* HMON_xxx (0 => hand-to-hand, other => ranged) */
731 int dieroll;
732 {
733     int tmp;
734     struct permonst *mdat = mon->data;
735     int barehand_silver_rings = 0;
736     /* The basic reason we need all these booleans is that we don't want
737      * a "hit" message when a monster dies, so we have to know how much
738      * damage it did _before_ outputting a hit message, but any messages
739      * associated with the damage don't come out until _after_ outputting
740      * a hit message.
741      */
742     boolean hittxt = FALSE, destroyed = FALSE, already_killed = FALSE;
743     boolean get_dmg_bonus = TRUE;
744     boolean ispoisoned = FALSE, needpoismsg = FALSE, poiskilled = FALSE,
745             unpoisonmsg = FALSE;
746     boolean silvermsg = FALSE, silverobj = FALSE;
747     boolean lightobj = FALSE;
748     boolean valid_weapon_attack = FALSE;
749     boolean unarmed = !uwep && !uarm && !uarms;
750     boolean hand_to_hand = (thrown == HMON_MELEE
751                             /* not grapnels; applied implies uwep */
752                             || (thrown == HMON_APPLIED && is_pole(uwep)));
753     int jousting = 0;
754     long silverhit = 0L;
755     int wtype;
756     struct obj *monwep;
757 #if 0 /*JP*/
758     char unconventional[BUFSZ]; /* substituted for word "attack" in msg */
759 #endif
760     char saved_oname[BUFSZ];
761
762 #if 0 /*JP*/
763     unconventional[0] = '\0';
764 #endif
765     saved_oname[0] = '\0';
766
767     wakeup(mon, TRUE);
768     if (!obj) { /* attack with bare hands */
769         if (mdat == &mons[PM_SHADE])
770             tmp = 0;
771         else if (martial_bonus())
772             tmp = rnd(4); /* bonus for martial arts */
773         else
774             tmp = rnd(2);
775         valid_weapon_attack = (tmp > 1);
776         /* Blessed gloves give bonuses when fighting 'bare-handed'.  So do
777            silver rings.  Note:  rings are worn under gloves, so you don't
778            get both bonuses, and two silver rings don't give double bonus. */
779         tmp += special_dmgval(&youmonst, mon, (W_ARMG | W_RINGL | W_RINGR),
780                               &silverhit);
781         barehand_silver_rings += (((silverhit & W_RINGL) ? 1 : 0)
782                                   + ((silverhit & W_RINGR) ? 1 : 0));
783         if (barehand_silver_rings > 0)
784             silvermsg = TRUE;
785     } else {
786         if (!(artifact_light(obj) && obj->lamplit))
787             Strcpy(saved_oname, cxname(obj));
788         else
789             Strcpy(saved_oname, bare_artifactname(obj));
790         if (obj->oclass == WEAPON_CLASS || is_weptool(obj)
791             || obj->oclass == GEM_CLASS) {
792             /* is it not a melee weapon? */
793             if (/* if you strike with a bow... */
794                 is_launcher(obj)
795                 /* or strike with a missile in your hand... */
796                 || (!thrown && (is_missile(obj) || is_ammo(obj)))
797                 /* or use a pole at short range and not mounted... */
798                 || (!thrown && !u.usteed && is_pole(obj))
799                 /* or throw a missile without the proper bow... */
800                 || (is_ammo(obj) && (thrown != HMON_THROWN
801                                      || !ammo_and_launcher(obj, uwep)))) {
802                 /* then do only 1-2 points of damage */
803                 if (mdat == &mons[PM_SHADE] && !shade_glare(obj))
804                     tmp = 0;
805                 else
806                     tmp = rnd(2);
807                 if (objects[obj->otyp].oc_material == SILVER
808                     && mon_hates_silver(mon)) {
809                     silvermsg = TRUE;
810                     silverobj = TRUE;
811                     /* if it will already inflict dmg, make it worse */
812                     tmp += rnd((tmp) ? 20 : 10);
813                 }
814                 if (!thrown && obj == uwep && obj->otyp == BOOMERANG
815                     && rnl(4) == 4 - 1) {
816                     boolean more_than_1 = (obj->quan > 1L);
817
818 #if 0 /*JP*/
819                     pline("As you hit %s, %s%s breaks into splinters.",
820                           mon_nam(mon), more_than_1 ? "one of " : "",
821                           yname(obj));
822 #else
823                     pline("%s\82ð\8dU\8c\82\82·\82é\82Æ\81C%s%s\82Í\82±\82Á\82Ï\82Ý\82\82ñ\82É\82È\82Á\82½\81D",
824                           mon_nam(mon), yname(obj),
825                           more_than_1 ? "\82Ì\82Ð\82Æ\82Â" : "");
826 #endif
827                     if (!more_than_1)
828                         uwepgone(); /* set unweapon */
829                     useup(obj);
830                     if (!more_than_1)
831                         obj = (struct obj *) 0;
832                     hittxt = TRUE;
833                     if (mdat != &mons[PM_SHADE])
834                         tmp++;
835                 }
836             } else {
837                 tmp = dmgval(obj, mon);
838                 /* a minimal hit doesn't exercise proficiency */
839                 valid_weapon_attack = (tmp > 1);
840                 if (!valid_weapon_attack || mon == u.ustuck || u.twoweap
841                     /* Cleaver can hit up to three targets at once so don't
842                        let it also hit from behind or shatter foes' weapons */
843                     || (hand_to_hand && obj->oartifact == ART_CLEAVER)) {
844                     ; /* no special bonuses */
845                 } else if (mon->mflee && Role_if(PM_ROGUE) && !Upolyd
846                            /* multi-shot throwing is too powerful here */
847                            && hand_to_hand) {
848 /*JP
849                     You("strike %s from behind!", mon_nam(mon));
850 */
851                     You("%s\82ð\94w\8cã\82©\82ç\8dU\8c\82\82µ\82½\81I", mon_nam(mon));
852                     tmp += rnd(u.ulevel);
853                     hittxt = TRUE;
854                 } else if (dieroll == 2 && obj == uwep
855                            && obj->oclass == WEAPON_CLASS
856                            && (bimanual(obj)
857                                || (Role_if(PM_SAMURAI) && obj->otyp == KATANA
858                                    && !uarms))
859                            && ((wtype = uwep_skill_type()) != P_NONE
860                                && P_SKILL(wtype) >= P_SKILLED)
861                            && ((monwep = MON_WEP(mon)) != 0
862                                && !is_flimsy(monwep)
863                                && !obj_resists(monwep,
864                                        50 + 15 * (greatest_erosion(obj)
865                                                   - greatest_erosion(monwep)),
866                                                100))) {
867                     /*
868                      * 2.5% chance of shattering defender's weapon when
869                      * using a two-handed weapon; less if uwep is rusted.
870                      * [dieroll == 2 is most successful non-beheading or
871                      * -bisecting hit, in case of special artifact damage;
872                      * the percentage chance is (1/20)*(50/100).]
873                      * If attacker's weapon is rustier than defender's,
874                      * the obj_resists chance is increased so the shatter
875                      * chance is decreased; if less rusty, then vice versa.
876                      */
877                     setmnotwielded(mon, monwep);
878                     mon->weapon_check = NEED_WEAPON;
879 #if 0 /*JP*/
880                     pline("%s from the force of your blow!",
881                           Yobjnam2(monwep, "shatter"));
882 #else
883                     pline("%s\82Ì%s\82Í\82 \82È\82½\82Ì\88ê\8c\82\82Å\95²\81X\82É\82È\82Á\82½\81I",
884                           Monnam(mon), xname(monwep));
885 #endif
886                     m_useupall(mon, monwep);
887                     /* If someone just shattered MY weapon, I'd flee! */
888                     if (rn2(4)) {
889                         monflee(mon, d(2, 3), TRUE, TRUE);
890                     }
891                     hittxt = TRUE;
892                 }
893
894                 if (obj->oartifact
895                     && artifact_hit(&youmonst, mon, obj, &tmp, dieroll)) {
896                     if (DEADMONSTER(mon)) /* artifact killed monster */
897                         return FALSE;
898                     if (tmp == 0)
899                         return TRUE;
900                     hittxt = TRUE;
901                 }
902                 if (objects[obj->otyp].oc_material == SILVER
903                     && mon_hates_silver(mon)) {
904                     silvermsg = TRUE;
905                     silverobj = TRUE;
906                 }
907                 if (artifact_light(obj) && obj->lamplit
908                     && mon_hates_light(mon))
909                     lightobj = TRUE;
910                 if (u.usteed && !thrown && tmp > 0
911                     && weapon_type(obj) == P_LANCE && mon != u.ustuck) {
912                     jousting = joust(mon, obj);
913                     /* exercise skill even for minimal damage hits */
914                     if (jousting)
915                         valid_weapon_attack = TRUE;
916                 }
917                 if (thrown == HMON_THROWN
918                     && (is_ammo(obj) || is_missile(obj))) {
919                     if (ammo_and_launcher(obj, uwep)) {
920                         /* Elves and Samurai do extra damage using
921                          * their bows&arrows; they're highly trained.
922                          */
923                         if (Role_if(PM_SAMURAI) && obj->otyp == YA
924                             && uwep->otyp == YUMI)
925                             tmp++;
926                         else if (Race_if(PM_ELF) && obj->otyp == ELVEN_ARROW
927                                  && uwep->otyp == ELVEN_BOW)
928                             tmp++;
929                     }
930                     if (obj->opoisoned && is_poisonable(obj))
931                         ispoisoned = TRUE;
932                 }
933             }
934         } else if (obj->oclass == POTION_CLASS) {
935             if (obj->quan > 1L)
936                 obj = splitobj(obj, 1L);
937             else
938                 setuwep((struct obj *) 0);
939             freeinv(obj);
940             potionhit(mon, obj,
941                       hand_to_hand ? POTHIT_HERO_BASH : POTHIT_HERO_THROW);
942             if (DEADMONSTER(mon))
943                 return FALSE; /* killed */
944             hittxt = TRUE;
945             /* in case potion effect causes transformation */
946             mdat = mon->data;
947             tmp = (mdat == &mons[PM_SHADE]) ? 0 : 1;
948         } else {
949             if (mdat == &mons[PM_SHADE] && !shade_aware(obj)) {
950                 tmp = 0;
951 #if 0 /*JP*/
952                 Strcpy(unconventional, cxname(obj));
953 #endif
954             } else {
955                 switch (obj->otyp) {
956                 case BOULDER:         /* 1d20 */
957                 case HEAVY_IRON_BALL: /* 1d25 */
958                 case IRON_CHAIN:      /* 1d4+1 */
959                     tmp = dmgval(obj, mon);
960                     break;
961                 case MIRROR:
962                     if (breaktest(obj)) {
963 /*JP
964                         You("break %s.  That's bad luck!", ysimple_name(obj));
965 */
966                         You("%s\8b¾\82ð\89ó\82µ\82Ä\82µ\82Ü\82Á\82½\81D\82±\82è\82á\82Ü\82¢\82Á\82½\81I", ysimple_name(obj));
967                         change_luck(-2);
968                         useup(obj);
969                         obj = (struct obj *) 0;
970                         unarmed = FALSE; /* avoid obj==0 confusion */
971                         get_dmg_bonus = FALSE;
972                         hittxt = TRUE;
973                     }
974                     tmp = 1;
975                     break;
976                 case EXPENSIVE_CAMERA:
977 /*JP
978                     You("succeed in destroying %s.  Congratulations!",
979 */
980                     You("%s\83J\83\81\83\89\82ð\89ó\82·\82±\82Æ\82ª\82Å\82«\82½\81D\82¨\82ß\82Å\82Æ\82¤\81I",
981                         ysimple_name(obj));
982                     release_camera_demon(obj, u.ux, u.uy);
983                     useup(obj);
984                     return TRUE;
985                 case CORPSE: /* fixed by polder@cs.vu.nl */
986                     if (touch_petrifies(&mons[obj->corpsenm])) {
987                         tmp = 1;
988                         hittxt = TRUE;
989 #if 0 /*JP*/
990                         You("hit %s with %s.", mon_nam(mon),
991                             corpse_xname(obj, (const char *) 0,
992                                          obj->dknown ? CXN_PFX_THE
993                                                      : CXN_ARTICLE));
994 #else
995                         You("%s\82ð%s\82Å\8dU\8c\82\82µ\82½\81D", mon_nam(mon),
996                             corpse_xname(obj, (const char *) 0,
997                                          obj->dknown ? CXN_PFX_THE
998                                                      : CXN_ARTICLE));
999 #endif
1000                         obj->dknown = 1;
1001                         if (!munstone(mon, TRUE))
1002                             minstapetrify(mon, TRUE);
1003                         if (resists_ston(mon))
1004                             break;
1005                         /* note: hp may be <= 0 even if munstoned==TRUE */
1006                         return (boolean) !DEADMONSTER(mon);
1007 #if 0
1008                     } else if (touch_petrifies(mdat)) {
1009                         ; /* maybe turn the corpse into a statue? */
1010 #endif
1011                     }
1012                     tmp = (obj->corpsenm >= LOW_PM ? mons[obj->corpsenm].msize
1013                                                    : 0) + 1;
1014                     break;
1015
1016 #define useup_eggs(o)                    \
1017     do {                                 \
1018         if (thrown)                      \
1019             obfree(o, (struct obj *) 0); \
1020         else                             \
1021             useupall(o);                 \
1022         o = (struct obj *) 0;            \
1023     } while (0) /* now gone */
1024                 case EGG: {
1025                     long cnt = obj->quan;
1026
1027                     tmp = 1; /* nominal physical damage */
1028                     get_dmg_bonus = FALSE;
1029                     hittxt = TRUE; /* message always given */
1030                     /* egg is always either used up or transformed, so next
1031                        hand-to-hand attack should yield a "bashing" mesg */
1032                     if (obj == uwep)
1033                         unweapon = TRUE;
1034                     if (obj->spe && obj->corpsenm >= LOW_PM) {
1035                         if (obj->quan < 5L)
1036                             change_luck((schar) - (obj->quan));
1037                         else
1038                             change_luck(-5);
1039                     }
1040
1041                     if (touch_petrifies(&mons[obj->corpsenm])) {
1042                         /*learn_egg_type(obj->corpsenm);*/
1043 #if 0 /*JP*/
1044                         pline("Splat!  You hit %s with %s %s egg%s!",
1045                               mon_nam(mon),
1046                               obj->known ? "the" : cnt > 1L ? "some" : "a",
1047                               obj->known ? mons[obj->corpsenm].mname
1048                                          : "petrifying",
1049                               plur(cnt));
1050 #else
1051                         pline("\83r\83`\83\83\83b\81I\82 \82È\82½\82Í%s\82É%s%s\82Ì\97\91\82ð\93\8a\82°\82Â\82¯\82½\81I",
1052                               mon_nam(mon),
1053                               cnt > 1L ? "\82¢\82­\82Â\82©\82Ì" : "",
1054                               obj->known ? mons[obj->corpsenm].mname
1055                                          : "\90Î\89»");
1056 #endif
1057                         obj->known = 1; /* (not much point...) */
1058                         useup_eggs(obj);
1059                         if (!munstone(mon, TRUE))
1060                             minstapetrify(mon, TRUE);
1061                         if (resists_ston(mon))
1062                             break;
1063                         return (boolean) (!DEADMONSTER(mon));
1064                     } else { /* ordinary egg(s) */
1065 #if 0 /*JP*/
1066                         const char *eggp = (obj->corpsenm != NON_PM
1067                                             && obj->known)
1068                                            ? the(mons[obj->corpsenm].mname)
1069                                            : (cnt > 1L) ? "some" : "an";
1070
1071                         You("hit %s with %s egg%s.", mon_nam(mon), eggp,
1072                             plur(cnt));
1073 #else
1074                         const char *eggp = (obj->corpsenm != NON_PM
1075                                             && obj->known)
1076                                            ? mons[obj->corpsenm].mname
1077                                            : "";
1078                         You("%s\82É%s%s\97\91\82ð\93\8a\82°\82Â\82¯\82½\81D",
1079                                 mon_nam(mon), eggp, *eggp ? "\82Ì" : "");
1080 #endif
1081                         if (touch_petrifies(mdat) && !stale_egg(obj)) {
1082 #if 0 /*JP*/
1083                             pline_The("egg%s %s alive any more...", plur(cnt),
1084                                       (cnt == 1L) ? "isn't" : "aren't");
1085 #else
1086                             pline("\82à\82¤\97\91\82ª\9bz\89»\82·\82é\82±\82Æ\82Í\82È\82¢\82¾\82ë\82¤\81D\81D\81D");
1087 #endif
1088                             if (obj->timed)
1089                                 obj_stop_timers(obj);
1090                             obj->otyp = ROCK;
1091                             obj->oclass = GEM_CLASS;
1092                             obj->oartifact = 0;
1093                             obj->spe = 0;
1094                             obj->known = obj->dknown = obj->bknown = 0;
1095                             obj->owt = weight(obj);
1096                             if (thrown)
1097                                 place_object(obj, mon->mx, mon->my);
1098                         } else {
1099 /*JP
1100                             pline("Splat!");
1101 */
1102                             pline("\83r\83`\83\83\83b\81I");
1103                             useup_eggs(obj);
1104                             exercise(A_WIS, FALSE);
1105                         }
1106                     }
1107                     break;
1108 #undef useup_eggs
1109                 }
1110                 case CLOVE_OF_GARLIC: /* no effect against demons */
1111                     if (is_undead(mdat) || is_vampshifter(mon)) {
1112                         monflee(mon, d(2, 4), FALSE, TRUE);
1113                     }
1114                     tmp = 1;
1115                     break;
1116                 case CREAM_PIE:
1117                 case BLINDING_VENOM:
1118                     mon->msleeping = 0;
1119                     if (can_blnd(&youmonst, mon,
1120                                  (uchar) ((obj->otyp == BLINDING_VENOM)
1121                                              ? AT_SPIT
1122                                              : AT_WEAP),
1123                                  obj)) {
1124                         if (Blind) {
1125 #if 0 /*JP*/
1126                             pline(obj->otyp == CREAM_PIE ? "Splat!"
1127                                                          : "Splash!");
1128 #else
1129                             pline(obj->otyp == CREAM_PIE ? "\83r\83V\83\83\83b\81I"
1130                                                          : "\83s\83`\83\83\83b\81I");
1131 #endif
1132                         } else if (obj->otyp == BLINDING_VENOM) {
1133 #if 0 /*JP*/
1134                             pline_The("venom blinds %s%s!", mon_nam(mon),
1135                                       mon->mcansee ? "" : " further");
1136 #else
1137                             pline("\93Å\89t\82Å%s\82Í%s\96Ú\82ª\8c©\82¦\82È\82­\82È\82Á\82½\81I", mon_nam(mon),
1138                                   mon->mcansee ? "" : "\82³\82ç\82É");
1139 #endif
1140                         } else {
1141                             char *whom = mon_nam(mon);
1142                             char *what = The(xname(obj));
1143
1144                             if (!thrown && obj->quan > 1L)
1145                                 what = An(singular(obj, xname));
1146                             /* note: s_suffix returns a modifiable buffer */
1147                             if (haseyes(mdat)
1148                                 && mdat != &mons[PM_FLOATING_EYE])
1149 #if 0 /*JP*/
1150                                 whom = strcat(strcat(s_suffix(whom), " "),
1151                                               mbodypart(mon, FACE));
1152 #else
1153                                 whom = strcat(s_suffix(whom),
1154                                               mbodypart(mon, FACE));
1155 #endif
1156 #if 0 /*JP*/
1157                             pline("%s %s over %s!", what,
1158                                   vtense(what, "splash"), whom);
1159 #else
1160                             pline("%s\82Í%s\82É\82Ô\82¿\82Ü\82¯\82ç\82ê\82½\81I",
1161                                   what, whom);
1162 #endif
1163                         }
1164                         setmangry(mon, TRUE);
1165                         mon->mcansee = 0;
1166                         tmp = rn1(25, 21);
1167                         if (((int) mon->mblinded + tmp) > 127)
1168                             mon->mblinded = 127;
1169                         else
1170                             mon->mblinded += tmp;
1171                     } else {
1172 /*JP
1173                         pline(obj->otyp == CREAM_PIE ? "Splat!" : "Splash!");
1174 */
1175                         pline(obj->otyp==CREAM_PIE ? "\83r\83V\83\83\83b\81I" : "\83s\83`\83\83\83b\81I");
1176                         setmangry(mon, TRUE);
1177                     }
1178                     if (thrown)
1179                         obfree(obj, (struct obj *) 0);
1180                     else
1181                         useup(obj);
1182                     hittxt = TRUE;
1183                     get_dmg_bonus = FALSE;
1184                     tmp = 0;
1185                     break;
1186                 case ACID_VENOM: /* thrown (or spit) */
1187                     if (resists_acid(mon)) {
1188 /*JP
1189                         Your("venom hits %s harmlessly.", mon_nam(mon));
1190 */
1191                         pline("\93Å\89t\82Í%s\82É\82Í\8cø\89Ê\82ª\82È\82©\82Á\82½\81D", mon_nam(mon));
1192                         tmp = 0;
1193                     } else {
1194 /*JP
1195                         Your("venom burns %s!", mon_nam(mon));
1196 */
1197                         Your("\93Å\89t\82Í%s\82ð\8fÄ\82¢\82½\81I", mon_nam(mon));
1198                         tmp = dmgval(obj, mon);
1199                     }
1200                     if (thrown)
1201                         obfree(obj, (struct obj *) 0);
1202                     else
1203                         useup(obj);
1204                     hittxt = TRUE;
1205                     get_dmg_bonus = FALSE;
1206                     break;
1207                 default:
1208                     /* non-weapons can damage because of their weight */
1209                     /* (but not too much) */
1210                     tmp = obj->owt / 100;
1211                     if (is_wet_towel(obj)) {
1212                         /* wielded wet towel should probably use whip skill
1213                            (but not by setting objects[TOWEL].oc_skill==P_WHIP
1214                            because that would turn towel into a weptool) */
1215                         tmp += obj->spe;
1216                         if (rn2(obj->spe + 1)) /* usually lose some wetness */
1217                             dry_a_towel(obj, -1, TRUE);
1218                     }
1219                     if (tmp < 1)
1220                         tmp = 1;
1221                     else
1222                         tmp = rnd(tmp);
1223                     if (tmp > 6)
1224                         tmp = 6;
1225                     /*
1226                      * Things like silver wands can arrive here so
1227                      * so we need another silver check.
1228                      */
1229                     if (objects[obj->otyp].oc_material == SILVER
1230                         && mon_hates_silver(mon)) {
1231                         tmp += rnd(20);
1232                         silvermsg = TRUE;
1233                         silverobj = TRUE;
1234                     }
1235                 }
1236             }
1237         }
1238     }
1239
1240     /****** NOTE: perhaps obj is undefined!! (if !thrown && BOOMERANG)
1241      *      *OR* if attacking bare-handed!! */
1242
1243     if (get_dmg_bonus && tmp > 0) {
1244         tmp += u.udaminc;
1245         /* If you throw using a propellor, you don't get a strength
1246          * bonus but you do get an increase-damage bonus.
1247          */
1248         if (thrown != HMON_THROWN || !obj || !uwep
1249             || !ammo_and_launcher(obj, uwep))
1250             tmp += dbon();
1251     }
1252
1253     if (valid_weapon_attack) {
1254         struct obj *wep;
1255
1256         /* to be valid a projectile must have had the correct projector */
1257         wep = PROJECTILE(obj) ? uwep : obj;
1258         tmp += weapon_dam_bonus(wep);
1259         /* [this assumes that `!thrown' implies wielded...] */
1260         wtype = thrown ? weapon_type(wep) : uwep_skill_type();
1261         use_skill(wtype, 1);
1262     }
1263
1264     if (ispoisoned) {
1265         int nopoison = (10 - (obj->owt / 10));
1266
1267         if (nopoison < 2)
1268             nopoison = 2;
1269         if (Role_if(PM_SAMURAI)) {
1270 /*JP
1271             You("dishonorably use a poisoned weapon!");
1272 */
1273             You("\95s\96¼\97_\82É\82à\93Å\82Ì\95\90\8aí\82ð\8eg\97p\82µ\82½\81I");
1274             adjalign(-sgn(u.ualign.type));
1275         } else if (u.ualign.type == A_LAWFUL && u.ualign.record > -10) {
1276 /*JP
1277             You_feel("like an evil coward for using a poisoned weapon.");
1278 */
1279             You("\93Å\82Ì\95\90\8aí\82ð\8eg\97p\82·\82é\82Ì\82Í\94Ú\8b¯\82¾\82Æ\8a´\82\82½\81D");
1280             adjalign(-1);
1281         }
1282         if (obj && !rn2(nopoison)) {
1283             /* remove poison now in case obj ends up in a bones file */
1284             obj->opoisoned = FALSE;
1285             /* defer "obj is no longer poisoned" until after hit message */
1286             unpoisonmsg = TRUE;
1287         }
1288         if (resists_poison(mon))
1289             needpoismsg = TRUE;
1290         else if (rn2(10))
1291             tmp += rnd(6);
1292         else
1293             poiskilled = TRUE;
1294     }
1295     if (tmp < 1) {
1296         /* make sure that negative damage adjustment can't result
1297            in inadvertently boosting the victim's hit points */
1298         tmp = 0;
1299         if (mdat == &mons[PM_SHADE]) {
1300             if (!hittxt) {
1301 #if 0 /*JP*/
1302                 const char *what = *unconventional ? unconventional : "attack";
1303
1304                 Your("%s %s harmlessly through %s.", what,
1305                      vtense(what, "pass"), mon_nam(mon));
1306 #else
1307                 Your("\8dU\8c\82\82Í%s\82ð\92Ê\82è\82Ê\82¯\82½\81D", mon_nam(mon));
1308 #endif
1309                 hittxt = TRUE;
1310             }
1311         } else {
1312             if (get_dmg_bonus)
1313                 tmp = 1;
1314         }
1315     }
1316
1317     if (jousting) {
1318         tmp += d(2, (obj == uwep) ? 10 : 2); /* [was in dmgval()] */
1319 /*JP
1320         You("joust %s%s", mon_nam(mon), canseemon(mon) ? exclam(tmp) : ".");
1321 */
1322         You("%s\82É\93Ë\8c\82\82µ\82½%s", mon_nam(mon), canseemon(mon) ? exclam(tmp) : "\81D");
1323         if (jousting < 0) {
1324 /*JP
1325             pline("%s shatters on impact!", Yname2(obj));
1326 */
1327             Your("%s\82Í\8fÕ\8c\82\82Å\89ó\82ê\82½\81I", xname(obj));
1328             /* (must be either primary or secondary weapon to get here) */
1329             u.twoweap = FALSE; /* untwoweapon() is too verbose here */
1330             if (obj == uwep)
1331                 uwepgone(); /* set unweapon */
1332             /* minor side-effect: broken lance won't split puddings */
1333             useup(obj);
1334             obj = 0;
1335         }
1336         /* avoid migrating a dead monster */
1337         if (mon->mhp > tmp) {
1338             mhurtle(mon, u.dx, u.dy, 1);
1339             mdat = mon->data; /* in case of a polymorph trap */
1340             if (DEADMONSTER(mon))
1341                 already_killed = TRUE;
1342         }
1343         hittxt = TRUE;
1344     } else if (unarmed && tmp > 1 && !thrown && !obj && !Upolyd) {
1345         /* VERY small chance of stunning opponent if unarmed. */
1346         if (rnd(100) < P_SKILL(P_BARE_HANDED_COMBAT) && !bigmonst(mdat)
1347             && !thick_skinned(mdat)) {
1348             if (canspotmon(mon))
1349 #if 0 /*JP*/
1350                 pline("%s %s from your powerful strike!", Monnam(mon),
1351                       makeplural(stagger(mon->data, "stagger")));
1352 #else
1353                 pline("%s\82Í\82 \82È\82½\82Ì\89ï\90S\82Ì\88ê\8c\82\82Å%s\81I", Monnam(mon),
1354                       jpast(stagger(mon->data, "\82æ\82ë\82ß\82­")));
1355 #endif
1356             /* avoid migrating a dead monster */
1357             if (mon->mhp > tmp) {
1358                 mhurtle(mon, u.dx, u.dy, 1);
1359                 mdat = mon->data; /* in case of a polymorph trap */
1360                 if (DEADMONSTER(mon))
1361                     already_killed = TRUE;
1362             }
1363             hittxt = TRUE;
1364         }
1365     }
1366
1367     if (!already_killed)
1368         mon->mhp -= tmp;
1369     /* adjustments might have made tmp become less than what
1370        a level draining artifact has already done to max HP */
1371     if (mon->mhp > mon->mhpmax)
1372         mon->mhp = mon->mhpmax;
1373     if (DEADMONSTER(mon))
1374         destroyed = TRUE;
1375     if (mon->mtame && tmp > 0) {
1376         /* do this even if the pet is being killed (affects revival) */
1377         abuse_dog(mon); /* reduces tameness */
1378         /* flee if still alive and still tame; if already suffering from
1379            untimed fleeing, no effect, otherwise increases timed fleeing */
1380         if (mon->mtame && !destroyed)
1381             monflee(mon, 10 * rnd(tmp), FALSE, FALSE);
1382     }
1383     if ((mdat == &mons[PM_BLACK_PUDDING] || mdat == &mons[PM_BROWN_PUDDING])
1384         /* pudding is alive and healthy enough to split */
1385         && mon->mhp > 1 && !mon->mcan
1386         /* iron weapon using melee or polearm hit [3.6.1: metal weapon too;
1387            also allow either or both weapons to cause split when twoweap] */
1388         && obj && (obj == uwep || (u.twoweap && obj == uswapwep))
1389         && ((objects[obj->otyp].oc_material == IRON
1390              /* allow scalpel and tsurugi to split puddings */
1391              || objects[obj->otyp].oc_material == METAL)
1392             /* but not bashing with darts, arrows or ya */
1393             && !(is_ammo(obj) || is_missile(obj)))
1394         && hand_to_hand) {
1395         struct monst *mclone;
1396         if ((mclone = clone_mon(mon, 0, 0)) != 0) {
1397             char withwhat[BUFSZ];
1398
1399             withwhat[0] = '\0';
1400 #if 0 /*JP*/
1401             if (u.twoweap && flags.verbose)
1402                 Sprintf(withwhat, " with %s", yname(obj));
1403             pline("%s divides as you hit it%s!", Monnam(mon), withwhat);
1404 #else
1405             if (u.twoweap && flags.verbose)
1406                 Sprintf(withwhat, "%s\82Å\82Ì", yname(obj));
1407             pline("\82 \82È\82½\82Ì%s\8dU\8c\82\82Å%s\82Í\95ª\97ô\82µ\82½\81I", withwhat, Monnam(mon));
1408 #endif
1409             hittxt = TRUE;
1410             mintrap(mclone);
1411         }
1412     }
1413
1414     if (!hittxt /*( thrown => obj exists )*/
1415         && (!destroyed
1416             || (thrown && m_shot.n > 1 && m_shot.o == obj->otyp))) {
1417         if (thrown)
1418             hit(mshot_xname(obj), mon, exclam(tmp));
1419         else if (!flags.verbose)
1420 /*JP
1421             You("hit it.");
1422 */
1423             pline("\8dU\8c\82\82Í\96½\92\86\82µ\82½\81D");
1424         else
1425 #if 0 /*JP*//*\89£\82è\95û\82ð\95ª\82¯\82é\82Ü\82Å\82Í\82â\82ç\82È\82¢*/
1426             You("%s %s%s",
1427                 (obj && (is_shield(obj) || obj->otyp == HEAVY_IRON_BALL))
1428                   ? "bash" : Role_if(PM_BARBARIAN) ? "smite" : "hit",
1429                 mon_nam(mon), canseemon(mon) ? exclam(tmp) : ".");
1430 #else
1431             Your("%s\82Ö\82Ì\8dU\8c\82\82Í\96½\92\86\82µ\82½%s",
1432                  mon_nam(mon), canseemon(mon) ? exclam(tmp) : "\81D");
1433 #endif
1434     }
1435
1436     if (silvermsg) {
1437         const char *fmt;
1438         char *whom = mon_nam(mon);
1439         char silverobjbuf[BUFSZ];
1440
1441         if (canspotmon(mon)) {
1442             if (barehand_silver_rings == 1)
1443 /*JP
1444                 fmt = "Your silver ring sears %s!";
1445 */
1446                 fmt = "%s\82Í\8bâ\82Ì\8ew\97Ö\82Å\8fÄ\82©\82ê\82½\81I";
1447             else if (barehand_silver_rings == 2)
1448 /*JP
1449                 fmt = "Your silver rings sear %s!";
1450 */
1451                 fmt = "%s\82Í\8bâ\82Ì\8ew\97Ö\82Å\8fÄ\82©\82ê\82½\81I";
1452             else if (silverobj && saved_oname[0]) {
1453                 /* guard constructed format string against '%' in
1454                    saved_oname[] from xname(via cxname()) */
1455 #if 0 /*JP*/
1456                 Sprintf(silverobjbuf, "Your %s%s %s",
1457                         strstri(saved_oname, "silver") ? "" : "silver ",
1458                         saved_oname, vtense(saved_oname, "sear"));
1459 #else
1460                 Sprintf(silverobjbuf, "%%s\82Í%s%s\82Å\8fÄ\82©\82ê\82½\81I",
1461                         strstri(saved_oname, "\8bâ") ?
1462                         "" : "\8bâ\82Ì",
1463                         saved_oname);
1464 #endif
1465                 (void) strNsubst(silverobjbuf, "%", "%%", 0);
1466                 Strcat(silverobjbuf, " %s!");
1467                 fmt = silverobjbuf;
1468             } else
1469 /*JP
1470                 fmt = "The silver sears %s!";
1471 */
1472                 fmt = "%s\82Í\8bâ\82Å\8fÄ\82©\82ê\82½\81I";
1473         } else {
1474             *whom = highc(*whom); /* "it" -> "It" */
1475 /*JP
1476             fmt = "%s is seared!";
1477 */
1478             fmt = "%s\82Í\8fÄ\82©\82ê\82½\81I";
1479         }
1480         /* note: s_suffix returns a modifiable buffer */
1481         if (!noncorporeal(mdat) && !amorphous(mdat))
1482 /*JP
1483             whom = strcat(s_suffix(whom), " flesh");
1484 */
1485             whom = strcat(s_suffix(whom), "\93÷");
1486         pline(fmt, whom);
1487     }
1488     if (lightobj) {
1489         const char *fmt;
1490         char *whom = mon_nam(mon);
1491         char emitlightobjbuf[BUFSZ];
1492
1493         if (canspotmon(mon)) {
1494             if (saved_oname[0]) {
1495 #if 0 /*JP*/
1496                 Sprintf(emitlightobjbuf,
1497                         "%s radiance penetrates deep into",
1498                         s_suffix(saved_oname));
1499                 Strcat(emitlightobjbuf, " %s!");
1500 #else
1501                 Sprintf(emitlightobjbuf,
1502                         "%s\8cõ\82ª%%s\82É\90[\82­\8aÑ\92Ê\82µ\82½\81I",
1503                         s_suffix(saved_oname));
1504 #endif
1505                 fmt = emitlightobjbuf;
1506             } else
1507 /*JP
1508                 fmt = "The light sears %s!";
1509 */
1510                 fmt = "\8cõ\82Í%s\82ð\8fÄ\82¢\82½\81I";
1511         } else {
1512 #if 0 /*JP*/
1513             *whom = highc(*whom); /* "it" -> "It" */
1514 #endif
1515 /*JP
1516             fmt = "%s is seared!";
1517 */
1518             fmt = "%s\82Í\8fÄ\82©\82ê\82½\81I";
1519         }
1520         /* note: s_suffix returns a modifiable buffer */
1521         if (!noncorporeal(mdat) && !amorphous(mdat))
1522 /*JP
1523             whom = strcat(s_suffix(whom), " flesh");
1524 */
1525             whom = strcat(s_suffix(whom), "\93÷");
1526         pline(fmt, whom);
1527     }
1528     /* if a "no longer poisoned" message is coming, it will be last;
1529        obj->opoisoned was cleared above and any message referring to
1530        "poisoned <obj>" has now been given; we want just "<obj>" for
1531        last message, so reformat while obj is still accessible */
1532     if (unpoisonmsg)
1533         Strcpy(saved_oname, cxname(obj));
1534
1535     /* [note: thrown obj might go away during killed()/xkilled() call
1536        (via 'thrownobj'; if swallowed, it gets added to engulfer's
1537        minvent and might merge with a stack that's already there)] */
1538
1539     if (needpoismsg)
1540 /*JP
1541         pline_The("poison doesn't seem to affect %s.", mon_nam(mon));
1542 */
1543         pline("\93Å\82Í%s\82É\8cø\82©\82È\82©\82Á\82½\82æ\82¤\82¾\81D", mon_nam(mon));
1544     if (poiskilled) {
1545 /*JP
1546         pline_The("poison was deadly...");
1547 */
1548         pline("\93Å\82Í\92v\8e\80\97Ê\82¾\82Á\82½\81D\81D\81D");
1549         if (!already_killed)
1550             xkilled(mon, XKILL_NOMSG);
1551         destroyed = TRUE; /* return FALSE; */
1552     } else if (destroyed) {
1553         if (!already_killed)
1554             killed(mon); /* takes care of most messages */
1555     } else if (u.umconf && hand_to_hand) {
1556         nohandglow(mon);
1557         if (!mon->mconf && !resist(mon, SPBOOK_CLASS, 0, NOTELL)) {
1558             mon->mconf = 1;
1559             if (!mon->mstun && mon->mcanmove && !mon->msleeping
1560                 && canseemon(mon))
1561 /*JP
1562                 pline("%s appears confused.", Monnam(mon));
1563 */
1564                 pline("%s\82Í\8d¬\97\90\82µ\82Ä\82¢\82é\82æ\82¤\82¾\81D", Monnam(mon));
1565         }
1566     }
1567     if (unpoisonmsg)
1568 #if 0 /*JP*/
1569         Your("%s %s no longer poisoned.", saved_oname,
1570              vtense(saved_oname, "are"));
1571 #else
1572         Your("%s\82Í\82à\82¤\93Å\82ª\93h\82ç\82ê\82Ä\82¢\82È\82¢\81D", xname(obj));
1573 #endif
1574
1575     return destroyed ? FALSE : TRUE;
1576 }
1577
1578 STATIC_OVL boolean
1579 shade_aware(obj)
1580 struct obj *obj;
1581 {
1582     if (!obj)
1583         return FALSE;
1584     /*
1585      * The things in this list either
1586      * 1) affect shades.
1587      *  OR
1588      * 2) are dealt with properly by other routines
1589      *    when it comes to shades.
1590      */
1591     if (obj->otyp == BOULDER
1592         || obj->otyp == HEAVY_IRON_BALL
1593         || obj->otyp == IRON_CHAIN      /* dmgval handles those first three */
1594         || obj->otyp == MIRROR          /* silver in the reflective surface */
1595         || obj->otyp == CLOVE_OF_GARLIC /* causes shades to flee */
1596         || objects[obj->otyp].oc_material == SILVER)
1597         return TRUE;
1598     return FALSE;
1599 }
1600
1601 /* check whether slippery clothing protects from hug or wrap attack */
1602 /* [currently assumes that you are the attacker] */
1603 STATIC_OVL boolean
1604 m_slips_free(mdef, mattk)
1605 struct monst *mdef;
1606 struct attack *mattk;
1607 {
1608     struct obj *obj;
1609
1610     if (mattk->adtyp == AD_DRIN) {
1611         /* intelligence drain attacks the head */
1612         obj = which_armor(mdef, W_ARMH);
1613     } else {
1614         /* grabbing attacks the body */
1615         obj = which_armor(mdef, W_ARMC); /* cloak */
1616         if (!obj)
1617             obj = which_armor(mdef, W_ARM); /* suit */
1618         if (!obj)
1619             obj = which_armor(mdef, W_ARMU); /* shirt */
1620     }
1621
1622     /* if monster's cloak/armor is greased, your grab slips off; this
1623        protection might fail (33% chance) when the armor is cursed */
1624     if (obj && (obj->greased || obj->otyp == OILSKIN_CLOAK)
1625         && (!obj->cursed || rn2(3))) {
1626 #if 0 /*JP*/
1627         You("%s %s %s %s!",
1628             mattk->adtyp == AD_WRAP ? "slip off of"
1629                                     : "grab, but cannot hold onto",
1630             s_suffix(mon_nam(mdef)), obj->greased ? "greased" : "slippery",
1631             /* avoid "slippery slippery cloak"
1632                for undiscovered oilskin cloak */
1633             (obj->greased || objects[obj->otyp].oc_name_known)
1634                 ? xname(obj)
1635                 : cloak_simple_name(obj));
1636 #else
1637         You("%s\82Ì%s%s%s\81I",
1638             mon_nam(mdef), obj->greased ? "\96û\82Ì\93h\82ç\82ê\82½" : "\8a\8a\82è\82â\82·\82¢",
1639             (obj->greased || objects[obj->otyp].oc_name_known)
1640                 ? xname(obj)
1641                 : cloak_simple_name(obj),
1642             mattk->adtyp == AD_WRAP ? "\82Å\8a\8a\82Á\82½"
1643                                     : "\82ð\82Â\82©\82Ü\82æ\82¤\82Æ\82µ\82½\82ª\81C\82Å\82«\82È\82©\82Á\82½");
1644 #endif
1645
1646         if (obj->greased && !rn2(2)) {
1647 /*JP
1648             pline_The("grease wears off.");
1649 */
1650             pline("\96û\82Í\97\8e\82¿\82Ä\82µ\82Ü\82Á\82½\81D");
1651             obj->greased = 0;
1652         }
1653         return TRUE;
1654     }
1655     return FALSE;
1656 }
1657
1658 /* used when hitting a monster with a lance while mounted;
1659    1: joust hit; 0: ordinary hit; -1: joust but break lance */
1660 STATIC_OVL int
1661 joust(mon, obj)
1662 struct monst *mon; /* target */
1663 struct obj *obj;   /* weapon */
1664 {
1665     int skill_rating, joust_dieroll;
1666
1667     if (Fumbling || Stunned)
1668         return 0;
1669     /* sanity check; lance must be wielded in order to joust */
1670     if (obj != uwep && (obj != uswapwep || !u.twoweap))
1671         return 0;
1672
1673     /* if using two weapons, use worse of lance and two-weapon skills */
1674     skill_rating = P_SKILL(weapon_type(obj)); /* lance skill */
1675     if (u.twoweap && P_SKILL(P_TWO_WEAPON_COMBAT) < skill_rating)
1676         skill_rating = P_SKILL(P_TWO_WEAPON_COMBAT);
1677     if (skill_rating == P_ISRESTRICTED)
1678         skill_rating = P_UNSKILLED; /* 0=>1 */
1679
1680     /* odds to joust are expert:80%, skilled:60%, basic:40%, unskilled:20% */
1681     if ((joust_dieroll = rn2(5)) < skill_rating) {
1682         if (joust_dieroll == 0 && rnl(50) == (50 - 1) && !unsolid(mon->data)
1683             && !obj_resists(obj, 0, 100))
1684             return -1; /* hit that breaks lance */
1685         return 1;      /* successful joust */
1686     }
1687     return 0; /* no joust bonus; revert to ordinary attack */
1688 }
1689
1690 /*
1691  * Send in a demon pet for the hero.  Exercise wisdom.
1692  *
1693  * This function used to be inline to damageum(), but the Metrowerks compiler
1694  * (DR4 and DR4.5) screws up with an internal error 5 "Expression Too
1695  * Complex."
1696  * Pulling it out makes it work.
1697  */
1698 STATIC_OVL void
1699 demonpet()
1700 {
1701     int i;
1702     struct permonst *pm;
1703     struct monst *dtmp;
1704
1705 /*JP
1706     pline("Some hell-p has arrived!");
1707 */
1708     pline("\92n\8d\96\82Ì\92\87\8aÔ\82ª\8c»\82í\82ê\82½\81I");
1709     i = !rn2(6) ? ndemon(u.ualign.type) : NON_PM;
1710     pm = i != NON_PM ? &mons[i] : youmonst.data;
1711     if ((dtmp = makemon(pm, u.ux, u.uy, NO_MM_FLAGS)) != 0)
1712         (void) tamedog(dtmp, (struct obj *) 0);
1713     exercise(A_WIS, TRUE);
1714 }
1715
1716 STATIC_OVL boolean
1717 theft_petrifies(otmp)
1718 struct obj *otmp;
1719 {
1720     if (uarmg || otmp->otyp != CORPSE
1721         || !touch_petrifies(&mons[otmp->corpsenm]) || Stone_resistance)
1722         return FALSE;
1723
1724 #if 0   /* no poly_when_stoned() critter has theft capability */
1725     if (poly_when_stoned(youmonst.data) && polymon(PM_STONE_GOLEM)) {
1726         display_nhwindow(WIN_MESSAGE, FALSE);   /* --More-- */
1727         return TRUE;
1728     }
1729 #endif
1730
1731     /* stealing this corpse is fatal... */
1732 /*JP
1733     instapetrify(corpse_xname(otmp, "stolen", CXN_ARTICLE));
1734 */
1735     instapetrify(corpse_xname(otmp, "\93\90\82Ü\82ê\82½", CXN_ARTICLE));
1736     /* apparently wasn't fatal after all... */
1737     return TRUE;
1738 }
1739
1740 /*
1741  * Player uses theft attack against monster.
1742  *
1743  * If the target is wearing body armor, take all of its possessions;
1744  * otherwise, take one object.  [Is this really the behavior we want?]
1745  */
1746 STATIC_OVL void
1747 steal_it(mdef, mattk)
1748 struct monst *mdef;
1749 struct attack *mattk;
1750 {
1751     struct obj *otmp, *stealoid, **minvent_ptr;
1752     long unwornmask;
1753
1754     if (!mdef->minvent)
1755         return; /* nothing to take */
1756
1757     /* look for worn body armor */
1758     stealoid = (struct obj *) 0;
1759     if (could_seduce(&youmonst, mdef, mattk)) {
1760         /* find armor, and move it to end of inventory in the process */
1761         minvent_ptr = &mdef->minvent;
1762         while ((otmp = *minvent_ptr) != 0)
1763             if (otmp->owornmask & W_ARM) {
1764                 if (stealoid)
1765                     panic("steal_it: multiple worn suits");
1766                 *minvent_ptr = otmp->nobj; /* take armor out of minvent */
1767                 stealoid = otmp;
1768                 stealoid->nobj = (struct obj *) 0;
1769             } else {
1770                 minvent_ptr = &otmp->nobj;
1771             }
1772         *minvent_ptr = stealoid; /* put armor back into minvent */
1773     }
1774
1775     if (stealoid) { /* we will be taking everything */
1776         if (gender(mdef) == (int) u.mfemale && youmonst.data->mlet == S_NYMPH)
1777 /*JP
1778             You("charm %s.  She gladly hands over her possessions.",
1779 */
1780             You("%s\82ð\82¤\82Á\82Æ\82è\82³\82¹\82½\81D\94Þ\8f\97\82Í\82æ\82ë\82±\82ñ\82Å\8e\9d\82¿\95¨\82ð\82³\82µ\82¾\82µ\82½\81D",
1781                 mon_nam(mdef));
1782         else
1783 #if 0 /*JP*/
1784             You("seduce %s and %s starts to take off %s clothes.",
1785                 mon_nam(mdef), mhe(mdef), mhis(mdef));
1786 #else
1787             You("%s\82ð\97U\98f\82µ\82½\81D%s\82Í\95\9e\82ð\92E\82¬\82Í\82\82ß\82½\81D",
1788                 mon_nam(mdef), mhe(mdef));
1789 #endif
1790     }
1791
1792     while ((otmp = mdef->minvent) != 0) {
1793         if (!Upolyd)
1794             break; /* no longer have ability to steal */
1795         /* take the object away from the monster */
1796         obj_extract_self(otmp);
1797         if ((unwornmask = otmp->owornmask) != 0L) {
1798             mdef->misc_worn_check &= ~unwornmask;
1799             if (otmp->owornmask & W_WEP)
1800                 setmnotwielded(mdef, otmp);
1801             otmp->owornmask = 0L;
1802             update_mon_intrinsics(mdef, otmp, FALSE, FALSE);
1803             /* give monster a chance to wear other equipment on its next
1804                move instead of waiting until it picks something up */
1805             mdef->misc_worn_check |= I_SPECIAL;
1806
1807             if (otmp == stealoid) /* special message for final item */
1808 #if 0 /*JP*/
1809                 pline("%s finishes taking off %s suit.", Monnam(mdef),
1810                       mhis(mdef));
1811 #else
1812                 pline("%s\82Í\92E\82¬\8fI\82¦\82½\81D", Monnam(mdef));
1813 #endif
1814         }
1815         /* give the object to the character */
1816 #if 0 /*JP*/
1817         otmp = hold_another_object(otmp, "You snatched but dropped %s.",
1818                                    doname(otmp), "You steal: ");
1819 #else
1820         otmp = hold_another_object(otmp, "\82 \82È\82½\82Í%s\82ð\93\90\82ñ\82¾\82ª\97\8e\82Æ\82µ\82½\81D",
1821                                    doname(otmp), "\82ð\93\90\82ñ\82¾\81D");
1822 #endif
1823         /* might have dropped otmp, and it might have broken or left level */
1824         if (!otmp || otmp->where != OBJ_INVENT)
1825             continue;
1826         if (theft_petrifies(otmp))
1827             break; /* stop thieving even though hero survived */
1828         /* more take-away handling, after theft message */
1829         if (unwornmask & W_WEP) { /* stole wielded weapon */
1830             possibly_unwield(mdef, FALSE);
1831         } else if (unwornmask & W_ARMG) { /* stole worn gloves */
1832             mselftouch(mdef, (const char *) 0, TRUE);
1833             if (DEADMONSTER(mdef)) /* it's now a statue */
1834                 return;         /* can't continue stealing */
1835         }
1836
1837         if (!stealoid)
1838             break; /* only taking one item */
1839     }
1840 }
1841
1842 int
1843 damageum(mdef, mattk, specialdmg)
1844 register struct monst *mdef;
1845 register struct attack *mattk;
1846 int specialdmg; /* blessed and/or silver bonus against various things */
1847 {
1848     register struct permonst *pd = mdef->data;
1849     int armpro, tmp = d((int) mattk->damn, (int) mattk->damd);
1850     boolean negated;
1851     struct obj *mongold;
1852
1853     armpro = magic_negation(mdef);
1854     /* since hero can't be cancelled, only defender's armor applies */
1855     negated = !(rn2(10) >= 3 * armpro);
1856
1857     if (is_demon(youmonst.data) && !rn2(13) && !uwep
1858         && u.umonnum != PM_SUCCUBUS && u.umonnum != PM_INCUBUS
1859         && u.umonnum != PM_BALROG) {
1860         demonpet();
1861         return 0;
1862     }
1863     switch (mattk->adtyp) {
1864     case AD_STUN:
1865         if (!Blind)
1866 #if 0 /*JP*/
1867             pline("%s %s for a moment.", Monnam(mdef),
1868                   makeplural(stagger(pd, "stagger")));
1869 #else
1870             pline("%s\82Í\88ê\8fu%s\81D", Monnam(mdef),
1871                   jpast(stagger(pd, "\82æ\82ë\82ß\82­")));
1872 #endif
1873         mdef->mstun = 1;
1874         goto physical;
1875     case AD_LEGS:
1876 #if 0
1877         if (u.ucancelled) {
1878             tmp = 0;
1879             break;
1880         }
1881 #endif
1882         goto physical;
1883     case AD_WERE: /* no special effect on monsters */
1884     case AD_HEAL: /* likewise */
1885     case AD_PHYS:
1886  physical:
1887         if (pd == &mons[PM_SHADE]) {
1888             tmp = 0;
1889             if (!specialdmg)
1890                 impossible("bad shade attack function flow?");
1891         }
1892         tmp += specialdmg;
1893
1894         if (mattk->aatyp == AT_WEAP) {
1895             /* hmonas() uses known_hitum() to deal physical damage,
1896                then also damageum() for non-AD_PHYS; don't inflict
1897                extra physical damage for unusual damage types */
1898             tmp = 0;
1899         } else if (mattk->aatyp == AT_KICK
1900                    || mattk->aatyp == AT_CLAW
1901                    || mattk->aatyp == AT_TUCH
1902                    || mattk->aatyp == AT_HUGS) {
1903             if (thick_skinned(pd))
1904                 tmp = (mattk->aatyp == AT_KICK) ? 0 : (tmp + 1) / 2;
1905             /* add ring(s) of increase damage */
1906             if (u.udaminc > 0) {
1907                 /* applies even if damage was 0 */
1908                 tmp += u.udaminc;
1909             } else if (tmp > 0) {
1910                 /* ring(s) might be negative; avoid converting
1911                    0 to non-0 or positive to non-positive */
1912                 tmp += u.udaminc;
1913                 if (tmp < 1)
1914                     tmp = 1;
1915             }
1916         }
1917         break;
1918     case AD_FIRE:
1919         if (negated) {
1920             tmp = 0;
1921             break;
1922         }
1923         if (!Blind)
1924 /*JP
1925             pline("%s is %s!", Monnam(mdef), on_fire(pd, mattk));
1926 */
1927             pline("%s\82Í%s\81I", Monnam(mdef), on_fire(mdef->data, mattk));
1928         if (completelyburns(pd)) { /* paper golem or straw golem */
1929             if (!Blind)
1930 /*JP
1931                 pline("%s burns completely!", Monnam(mdef));
1932 */
1933                 pline("%s\82Í\8a®\91S\82É\94R\82¦\90s\82«\82½\81I", Monnam(mdef));
1934             else
1935 #if 0 /*JP*/
1936                 You("smell burning%s.",
1937                     (pd == &mons[PM_PAPER_GOLEM]) ? " paper"
1938                       : (pd == &mons[PM_STRAW_GOLEM]) ? " straw" : "");
1939 #else
1940                 You("%s\82ª\94R\82¦\82é\82É\82¨\82¢\82ª\82µ\82½\81D",
1941                     (pd == &mons[PM_PAPER_GOLEM]) ? "\8e\86"
1942                       : (pd == &mons[PM_STRAW_GOLEM]) ? "\82í\82ç" : "\89½\82©");
1943 #endif
1944             xkilled(mdef, XKILL_NOMSG | XKILL_NOCORPSE);
1945             tmp = 0;
1946             break;
1947             /* Don't return yet; keep hp<1 and tmp=0 for pet msg */
1948         }
1949         tmp += destroy_mitem(mdef, SCROLL_CLASS, AD_FIRE);
1950         tmp += destroy_mitem(mdef, SPBOOK_CLASS, AD_FIRE);
1951         if (resists_fire(mdef)) {
1952             if (!Blind)
1953 /*JP
1954                 pline_The("fire doesn't heat %s!", mon_nam(mdef));
1955 */
1956                 pline("\89\8a\82Í%s\82É\89e\8b¿\82ª\82È\82¢\81I", mon_nam(mdef));
1957             golemeffects(mdef, AD_FIRE, tmp);
1958             shieldeff(mdef->mx, mdef->my);
1959             tmp = 0;
1960         }
1961         /* only potions damage resistant players in destroy_item */
1962         tmp += destroy_mitem(mdef, POTION_CLASS, AD_FIRE);
1963         break;
1964     case AD_COLD:
1965         if (negated) {
1966             tmp = 0;
1967             break;
1968         }
1969         if (!Blind)
1970 /*JP
1971             pline("%s is covered in frost!", Monnam(mdef));
1972 */
1973             pline("%s\82Í\95X\82Å\95¢\82í\82ê\82½\81I", Monnam(mdef));
1974         if (resists_cold(mdef)) {
1975             shieldeff(mdef->mx, mdef->my);
1976             if (!Blind)
1977 /*JP
1978                 pline_The("frost doesn't chill %s!", mon_nam(mdef));
1979 */
1980                 pline("\95X\82Í%s\82ð\93\80\82ç\82·\82±\82Æ\82ª\82Å\82«\82È\82¢\81I", mon_nam(mdef));
1981             golemeffects(mdef, AD_COLD, tmp);
1982             tmp = 0;
1983         }
1984         tmp += destroy_mitem(mdef, POTION_CLASS, AD_COLD);
1985         break;
1986     case AD_ELEC:
1987         if (negated) {
1988             tmp = 0;
1989             break;
1990         }
1991         if (!Blind)
1992 /*JP
1993             pline("%s is zapped!", Monnam(mdef));
1994 */
1995             pline("%s\82Í\93d\8c\82\82ð\82­\82ç\82Á\82½\81I", Monnam(mdef));
1996         tmp += destroy_mitem(mdef, WAND_CLASS, AD_ELEC);
1997         if (resists_elec(mdef)) {
1998             if (!Blind)
1999 /*JP
2000                 pline_The("zap doesn't shock %s!", mon_nam(mdef));
2001 */
2002                 pline("\93d\8c\82\82Í%s\82É\89e\8b¿\82ð\97^\82¦\82È\82¢\81I", mon_nam(mdef));
2003             golemeffects(mdef, AD_ELEC, tmp);
2004             shieldeff(mdef->mx, mdef->my);
2005             tmp = 0;
2006         }
2007         /* only rings damage resistant players in destroy_item */
2008         tmp += destroy_mitem(mdef, RING_CLASS, AD_ELEC);
2009         break;
2010     case AD_ACID:
2011         if (resists_acid(mdef))
2012             tmp = 0;
2013         break;
2014     case AD_STON:
2015         if (!munstone(mdef, TRUE))
2016             minstapetrify(mdef, TRUE);
2017         tmp = 0;
2018         break;
2019     case AD_SSEX:
2020     case AD_SEDU:
2021     case AD_SITM:
2022         steal_it(mdef, mattk);
2023         tmp = 0;
2024         break;
2025     case AD_SGLD:
2026         /* This you as a leprechaun, so steal
2027            real gold only, no lesser coins */
2028         mongold = findgold(mdef->minvent);
2029         if (mongold) {
2030             obj_extract_self(mongold);
2031             if (merge_choice(invent, mongold) || inv_cnt(FALSE) < 52) {
2032                 addinv(mongold);
2033 /*JP
2034                     Your("purse feels heavier.");
2035 */
2036                     You("\8dà\95z\82ª\8fd\82­\82È\82Á\82½\82æ\82¤\82È\8bC\82ª\82µ\82½\81D");
2037             } else {
2038 /*JP
2039                     You("grab %s's gold, but find no room in your knapsack.",
2040 */
2041                     You("%s\82Ì\82¨\8bà\82ð\82Â\82©\82ñ\82¾\82ª\81C\8e\9d\82¿\95¨\91Ü\82É\93ü\82ç\82È\82©\82Á\82½\81D",
2042                     mon_nam(mdef));
2043                 dropy(mongold);
2044             }
2045         }
2046         exercise(A_DEX, TRUE);
2047         tmp = 0;
2048         break;
2049     case AD_TLPT:
2050         if (tmp <= 0)
2051             tmp = 1;
2052         if (!negated) {
2053             char nambuf[BUFSZ];
2054             boolean u_saw_mon = (canseemon(mdef)
2055                                  || (u.uswallow && u.ustuck == mdef));
2056
2057             /* record the name before losing sight of monster */
2058             Strcpy(nambuf, Monnam(mdef));
2059             if (u_teleport_mon(mdef, FALSE) && u_saw_mon
2060                 && !(canseemon(mdef) || (u.uswallow && u.ustuck == mdef)))
2061 /*JP
2062                 pline("%s suddenly disappears!", nambuf);
2063 */
2064                 pline("%s\82Í\93Ë\91R\8fÁ\82¦\82½\81I", nambuf);
2065             if (tmp >= mdef->mhp) { /* see hitmu(mhitu.c) */
2066                 if (mdef->mhp == 1)
2067                     ++mdef->mhp;
2068                 tmp = mdef->mhp - 1;
2069             }
2070         }
2071         break;
2072     case AD_BLND:
2073         if (can_blnd(&youmonst, mdef, mattk->aatyp, (struct obj *) 0)) {
2074             if (!Blind && mdef->mcansee)
2075 /*JP
2076                 pline("%s is blinded.", Monnam(mdef));
2077 */
2078                 pline("%s\82Í\96Ú\82ª\8c©\82¦\82È\82­\82È\82Á\82½\81D", Monnam(mdef));
2079             mdef->mcansee = 0;
2080             tmp += mdef->mblinded;
2081             if (tmp > 127)
2082                 tmp = 127;
2083             mdef->mblinded = tmp;
2084         }
2085         tmp = 0;
2086         break;
2087     case AD_CURS:
2088         if (night() && !rn2(10) && !mdef->mcan) {
2089             if (pd == &mons[PM_CLAY_GOLEM]) {
2090                 if (!Blind)
2091 #if 0 /*JP*/
2092                     pline("Some writing vanishes from %s head!",
2093                           s_suffix(mon_nam(mdef)));
2094 #else
2095                     pline("%s\82Ì\93ª\82É\8f\91\82¢\82Ä\82 \82é\95\8e\9a\82Ì\82¢\82­\82Â\82©\82ª\8fÁ\82¦\82½\81I",
2096                           mon_nam(mdef));
2097 #endif
2098                 xkilled(mdef, XKILL_NOMSG);
2099                 /* Don't return yet; keep hp<1 and tmp=0 for pet msg */
2100             } else {
2101                 mdef->mcan = 1;
2102 /*JP
2103                 You("chuckle.");
2104 */
2105                 You("\82­\82·\82­\82·\8fÎ\82Á\82½\81D");
2106             }
2107         }
2108         tmp = 0;
2109         break;
2110     case AD_DRLI:
2111         if (!negated && !rn2(3) && !resists_drli(mdef)) {
2112             int xtmp = d(2, 6);
2113
2114 /*JP
2115             pline("%s suddenly seems weaker!", Monnam(mdef));
2116 */
2117             pline("%s\82Í\93Ë\91R\8eã\82­\82È\82Á\82½\82æ\82¤\82É\8c©\82¦\82½\81I", Monnam(mdef));
2118             mdef->mhpmax -= xtmp;
2119             mdef->mhp -= xtmp;
2120             /* !m_lev: level 0 monster is killed regardless of hit points
2121                rather than drop to level -1 */
2122             if (DEADMONSTER(mdef) || !mdef->m_lev) {
2123 /*JP
2124                 pline("%s dies!", Monnam(mdef));
2125 */
2126                 pline("%s\82Í\8e\80\82ñ\82¾\81I", Monnam(mdef));
2127                 xkilled(mdef, XKILL_NOMSG);
2128             } else
2129                 mdef->m_lev--;
2130             tmp = 0;
2131         }
2132         break;
2133     case AD_RUST:
2134         if (pd == &mons[PM_IRON_GOLEM]) {
2135 /*JP
2136             pline("%s falls to pieces!", Monnam(mdef));
2137 */
2138             pline("%s\82Í\83o\83\89\83o\83\89\82É\82È\82Á\82½\81I", Monnam(mdef));
2139             xkilled(mdef, XKILL_NOMSG);
2140         }
2141         erode_armor(mdef, ERODE_RUST);
2142         tmp = 0;
2143         break;
2144     case AD_CORR:
2145         erode_armor(mdef, ERODE_CORRODE);
2146         tmp = 0;
2147         break;
2148     case AD_DCAY:
2149         if (pd == &mons[PM_WOOD_GOLEM] || pd == &mons[PM_LEATHER_GOLEM]) {
2150 /*JP
2151             pline("%s falls to pieces!", Monnam(mdef));
2152 */
2153             pline("%s\82Í\83o\83\89\83o\83\89\82É\82È\82Á\82½\81I", Monnam(mdef));
2154             xkilled(mdef, XKILL_NOMSG);
2155         }
2156         erode_armor(mdef, ERODE_ROT);
2157         tmp = 0;
2158         break;
2159     case AD_DREN:
2160         if (!negated && !rn2(4))
2161             xdrainenergym(mdef, TRUE);
2162         tmp = 0;
2163         break;
2164     case AD_DRST:
2165     case AD_DRDX:
2166     case AD_DRCO:
2167         if (!negated && !rn2(8)) {
2168 /*JP
2169             Your("%s was poisoned!", mpoisons_subj(&youmonst, mattk));
2170 */
2171             Your("%s\82Í\93Å\82³\82ê\82Ä\82¢\82é\81I", mpoisons_subj(&youmonst, mattk));
2172             if (resists_poison(mdef)) {
2173 /*JP
2174                 pline_The("poison doesn't seem to affect %s.", mon_nam(mdef));
2175 */
2176                 pline("\93Å\82Í%s\82É\89e\8b¿\82ð\97^\82¦\82È\82¢\81D", mon_nam(mdef));
2177             } else {
2178                 if (!rn2(10)) {
2179 /*JP
2180                     Your("poison was deadly...");
2181 */
2182                     Your("\97^\82¦\82½\93Å\82Í\92v\8e\80\97Ê\82¾\82Á\82½\81D\81D\81D");
2183                     tmp = mdef->mhp;
2184                 } else
2185                     tmp += rn1(10, 6);
2186             }
2187         }
2188         break;
2189     case AD_DRIN: {
2190         struct obj *helmet;
2191
2192         if (notonhead || !has_head(pd)) {
2193 /*JP
2194             pline("%s doesn't seem harmed.", Monnam(mdef));
2195 */
2196             pline("%s\82Í\8f\9d\82Â\82¢\82½\82æ\82¤\82É\82Í\8c©\82¦\82È\82¢\81D", Monnam(mdef));
2197             tmp = 0;
2198             if (!Unchanging && pd == &mons[PM_GREEN_SLIME]) {
2199                 if (!Slimed) {
2200 /*JP
2201                     You("suck in some slime and don't feel very well.");
2202 */
2203                     You("\83X\83\89\83C\83\80\82ð\8bz\82¢\8eæ\82Á\82Ä\81C\8bï\8d\87\82ª\88«\82­\82È\82Á\82½\81D");
2204                     make_slimed(10L, (char *) 0);
2205                 }
2206             }
2207             break;
2208         }
2209         if (m_slips_free(mdef, mattk))
2210             break;
2211
2212         if ((helmet = which_armor(mdef, W_ARMH)) != 0 && rn2(8)) {
2213 #if 0 /*JP*/
2214             pline("%s %s blocks your attack to %s head.",
2215                   s_suffix(Monnam(mdef)), helm_simple_name(helmet),
2216                   mhis(mdef));
2217 #else
2218             pline("%s\82Ì%s\82ª\93ª\82Ö\82Ì\8dU\8c\82\82ð\96h\82¢\82¾\81D",
2219                   Monnam(mdef), helm_simple_name(helmet));
2220 #endif
2221             break;
2222         }
2223
2224         (void) eat_brains(&youmonst, mdef, TRUE, &tmp);
2225         break;
2226     }
2227     case AD_STCK:
2228         if (!negated && !sticks(pd))
2229             u.ustuck = mdef; /* it's now stuck to you */
2230         break;
2231     case AD_WRAP:
2232         if (!sticks(pd)) {
2233             if (!u.ustuck && !rn2(10)) {
2234                 if (m_slips_free(mdef, mattk)) {
2235                     tmp = 0;
2236                 } else {
2237 /*JP
2238                     You("swing yourself around %s!", mon_nam(mdef));
2239 */
2240                     You("%s\82É\90g\91Ì\82ð\97\8d\82Ý\82Â\82©\82¹\82½\81I", mon_nam(mdef));
2241                     u.ustuck = mdef;
2242                 }
2243             } else if (u.ustuck == mdef) {
2244                 /* Monsters don't wear amulets of magical breathing */
2245                 if (is_pool(u.ux, u.uy) && !is_swimmer(pd)
2246                     && !amphibious(pd)) {
2247 /*JP
2248                     You("drown %s...", mon_nam(mdef));
2249 */
2250                     You("%s\82ð\93M\82ê\82³\82¹\82½\81D\81D\81D", mon_nam(mdef));
2251                     tmp = mdef->mhp;
2252                 } else if (mattk->aatyp == AT_HUGS)
2253 /*JP
2254                     pline("%s is being crushed.", Monnam(mdef));
2255 */
2256                     pline("%s\82Í\89\9f\82µ\82Â\82Ô\82³\82ê\82Ä\82¢\82é\81D", Monnam(mdef));
2257             } else {
2258                 tmp = 0;
2259                 if (flags.verbose)
2260 #if 0 /*JP*/
2261                     You("brush against %s %s.", s_suffix(mon_nam(mdef)),
2262                         mbodypart(mdef, LEG));
2263 #else
2264                     You("%s\82Ì%s\82É\90G\82ê\82½\81D", mon_nam(mdef),
2265                         mbodypart(mdef, LEG));
2266 #endif
2267             }
2268         } else
2269             tmp = 0;
2270         break;
2271     case AD_PLYS:
2272         if (!negated && mdef->mcanmove && !rn2(3) && tmp < mdef->mhp) {
2273             if (!Blind)
2274 /*JP
2275                 pline("%s is frozen by you!", Monnam(mdef));
2276 */
2277                 pline("%s\82Í\82 \82È\82½\82Ì\82É\82ç\82Ý\82Å\93®\82¯\82È\82­\82È\82Á\82½\81I", Monnam(mdef));
2278             paralyze_monst(mdef, rnd(10));
2279         }
2280         break;
2281     case AD_SLEE:
2282         if (!negated && !mdef->msleeping && sleep_monst(mdef, rnd(10), -1)) {
2283             if (!Blind)
2284 /*JP
2285                 pline("%s is put to sleep by you!", Monnam(mdef));
2286 */
2287                 pline("%s\82Í\93Ë\91R\96°\82è\82É\82¨\82¿\82½\81I", Monnam(mdef));
2288             slept_monst(mdef);
2289         }
2290         break;
2291     case AD_SLIM:
2292         if (negated)
2293             break; /* physical damage only */
2294         if (!rn2(4) && !slimeproof(pd)) {
2295             if (!munslime(mdef, TRUE) && !DEADMONSTER(mdef)) {
2296                 /* this assumes newcham() won't fail; since hero has
2297                    a slime attack, green slimes haven't been geno'd */
2298 /*JP
2299                 You("turn %s into slime.", mon_nam(mdef));
2300 */
2301                 pline("%s\82Í\83X\83\89\83C\83\80\82É\82È\82Á\82½\81D", mon_nam(mdef));
2302                 if (newcham(mdef, &mons[PM_GREEN_SLIME], FALSE, FALSE))
2303                     pd = mdef->data;
2304             }
2305             /* munslime attempt could have been fatal */
2306             if (DEADMONSTER(mdef))
2307                 return 2; /* skip death message */
2308             tmp = 0;
2309         }
2310         break;
2311     case AD_ENCH: /* KMH -- remove enchantment (disenchanter) */
2312         /* there's no msomearmor() function, so just do damage */
2313         /* if (negated) break; */
2314         break;
2315     case AD_SLOW:
2316         if (!negated && mdef->mspeed != MSLOW) {
2317             unsigned int oldspeed = mdef->mspeed;
2318
2319             mon_adjust_speed(mdef, -1, (struct obj *) 0);
2320             if (mdef->mspeed != oldspeed && canseemon(mdef))
2321 /*JP
2322                 pline("%s slows down.", Monnam(mdef));
2323 */
2324                 pline("%s\82Í\82Ì\82ë\82­\82È\82Á\82½\81D", Monnam(mdef));
2325         }
2326         break;
2327     case AD_CONF:
2328         if (!mdef->mconf) {
2329             if (canseemon(mdef))
2330 /*JP
2331                 pline("%s looks confused.", Monnam(mdef));
2332 */
2333                 pline("%s\82Í\8d¬\97\90\82µ\82½\82æ\82¤\82¾\81D", Monnam(mdef));
2334             mdef->mconf = 1;
2335         }
2336         break;
2337     default:
2338         tmp = 0;
2339         break;
2340     }
2341
2342     mdef->mstrategy &= ~STRAT_WAITFORU; /* in case player is very fast */
2343     mdef->mhp -= tmp;
2344     if (DEADMONSTER(mdef)) {
2345         if (mdef->mtame && !cansee(mdef->mx, mdef->my)) {
2346 /*JP
2347             You_feel("embarrassed for a moment.");
2348 */
2349             You("\82µ\82Î\82ç\82­\8d¢\98f\82µ\82½\81D");
2350             if (tmp)
2351                 xkilled(mdef, XKILL_NOMSG); /* !tmp but hp<1: already killed */
2352         } else if (!flags.verbose) {
2353 /*JP
2354             You("destroy it!");
2355 */
2356             You("\93|\82µ\82½\81I");
2357             if (tmp)
2358                 xkilled(mdef, XKILL_NOMSG);
2359         } else if (tmp)
2360             killed(mdef);
2361         return 2;
2362     }
2363     return 1;
2364 }
2365
2366 STATIC_OVL int
2367 explum(mdef, mattk)
2368 register struct monst *mdef;
2369 register struct attack *mattk;
2370 {
2371     boolean resistance; /* only for cold/fire/elec */
2372     register int tmp = d((int) mattk->damn, (int) mattk->damd);
2373
2374 /*JP
2375     You("explode!");
2376 */
2377     You("\94\9a\94­\82µ\82½\81I");
2378     switch (mattk->adtyp) {
2379     case AD_BLND:
2380         if (!resists_blnd(mdef)) {
2381 /*JP
2382             pline("%s is blinded by your flash of light!", Monnam(mdef));
2383 */
2384             pline("%s\82Í\82Ü\82Î\82ä\82¢\8cõ\82Å\96Ú\82ª\82­\82ç\82ñ\82¾\81I", Monnam(mdef));
2385             mdef->mblinded = min((int) mdef->mblinded + tmp, 127);
2386             mdef->mcansee = 0;
2387         }
2388         break;
2389     case AD_HALU:
2390         if (haseyes(mdef->data) && mdef->mcansee) {
2391 /*JP
2392             pline("%s is affected by your flash of light!", Monnam(mdef));
2393 */
2394             pline("%s\82Í\82Ü\82Î\82ä\82¢\8cõ\82Å\89e\8b¿\82ð\8eó\82¯\82½\81I", Monnam(mdef));
2395             mdef->mconf = 1;
2396         }
2397         break;
2398     case AD_COLD:
2399         resistance = resists_cold(mdef);
2400         goto common;
2401     case AD_FIRE:
2402         resistance = resists_fire(mdef);
2403         goto common;
2404     case AD_ELEC:
2405         resistance = resists_elec(mdef);
2406  common:
2407         if (!resistance) {
2408 /*JP
2409             pline("%s gets blasted!", Monnam(mdef));
2410 */
2411             pline("%s\82Í\94\9a\94­\82ð\97\81\82Ñ\82½\81I", Monnam(mdef));
2412             mdef->mhp -= tmp;
2413             if (DEADMONSTER(mdef)) {
2414                 killed(mdef);
2415                 return 2;
2416             }
2417         } else {
2418             shieldeff(mdef->mx, mdef->my);
2419             if (is_golem(mdef->data))
2420                 golemeffects(mdef, (int) mattk->adtyp, tmp);
2421             else
2422 /*JP
2423                 pline_The("blast doesn't seem to affect %s.", mon_nam(mdef));
2424 */
2425                 pline("\94\9a\94­\82Í%s\82É\89e\8b¿\82ð\97^\82¦\82È\82©\82Á\82½\82æ\82¤\82¾\81D", mon_nam(mdef));
2426         }
2427         break;
2428     default:
2429         break;
2430     }
2431     return 1;
2432 }
2433
2434 STATIC_OVL void
2435 start_engulf(mdef)
2436 struct monst *mdef;
2437 {
2438     if (!Invisible) {
2439         map_location(u.ux, u.uy, TRUE);
2440         tmp_at(DISP_ALWAYS, mon_to_glyph(&youmonst, rn2_on_display_rng));
2441         tmp_at(mdef->mx, mdef->my);
2442     }
2443 /*JP
2444     You("engulf %s!", mon_nam(mdef));
2445 */
2446     You("%s\82ð\88ù\82Ý\8d\9e\82ñ\82¾\81I", mon_nam(mdef));
2447     delay_output();
2448     delay_output();
2449 }
2450
2451 STATIC_OVL void
2452 end_engulf()
2453 {
2454     if (!Invisible) {
2455         tmp_at(DISP_END, 0);
2456         newsym(u.ux, u.uy);
2457     }
2458 }
2459
2460 STATIC_OVL int
2461 gulpum(mdef, mattk)
2462 register struct monst *mdef;
2463 register struct attack *mattk;
2464 {
2465 #ifdef LINT /* static char msgbuf[BUFSZ]; */
2466     char msgbuf[BUFSZ];
2467 #else
2468     static char msgbuf[BUFSZ]; /* for nomovemsg */
2469 #endif
2470     register int tmp;
2471     register int dam = d((int) mattk->damn, (int) mattk->damd);
2472     boolean fatal_gulp;
2473     struct obj *otmp;
2474     struct permonst *pd = mdef->data;
2475
2476     /* Not totally the same as for real monsters.  Specifically, these
2477      * don't take multiple moves.  (It's just too hard, for too little
2478      * result, to program monsters which attack from inside you, which
2479      * would be necessary if done accurately.)  Instead, we arbitrarily
2480      * kill the monster immediately for AD_DGST and we regurgitate them
2481      * after exactly 1 round of attack otherwise.  -KAA
2482      */
2483
2484     if (!engulf_target(&youmonst, mdef))
2485         return 0;
2486
2487     if (u.uhunger < 1500 && !u.uswallow) {
2488         for (otmp = mdef->minvent; otmp; otmp = otmp->nobj)
2489             (void) snuff_lit(otmp);
2490
2491         /* force vampire in bat, cloud, or wolf form to revert back to
2492            vampire form now instead of dealing with that when it dies */
2493         if (is_vampshifter(mdef)
2494             && newcham(mdef, &mons[mdef->cham], FALSE, FALSE)) {
2495 /*JP
2496             You("engulf it, then expel it.");
2497 */
2498             You("\88ù\82Ý\8d\9e\82ñ\82Å\81C\93f\82«\8fo\82µ\82½\81D");
2499             if (canspotmon(mdef))
2500 /*JP
2501                 pline("It turns into %s.", a_monnam(mdef));
2502 */
2503                 pline("\82»\82ê\82Í%s\82É\82È\82Á\82½\81D", a_monnam(mdef));
2504             else
2505                 map_invisible(mdef->mx, mdef->my);
2506             return 1;
2507         }
2508
2509         /* engulfing a cockatrice or digesting a Rider or Medusa */
2510         fatal_gulp = (touch_petrifies(pd) && !Stone_resistance)
2511                      || (mattk->adtyp == AD_DGST
2512                          && (is_rider(pd) || (pd == &mons[PM_MEDUSA]
2513                                               && !Stone_resistance)));
2514
2515         if ((mattk->adtyp == AD_DGST && !Slow_digestion) || fatal_gulp)
2516             eating_conducts(pd);
2517
2518         if (fatal_gulp && !is_rider(pd)) { /* petrification */
2519             char kbuf[BUFSZ];
2520             const char *mname = pd->mname;
2521
2522             if (!type_is_pname(pd))
2523                 mname = an(mname);
2524 /*JP
2525             You("englut %s.", mon_nam(mdef));
2526 */
2527             You("%s\82ð\88ù\82Ý\8d\9e\82ñ\82¾\81D", mon_nam(mdef));
2528 /*JP
2529             Sprintf(kbuf, "swallowing %s whole", mname);
2530 */
2531             Sprintf(kbuf, "%s\82ð\88ù\82Ý\8d\9e\82ñ\82Å", mname);
2532             instapetrify(kbuf);
2533         } else {
2534             start_engulf(mdef);
2535             switch (mattk->adtyp) {
2536             case AD_DGST:
2537                 /* eating a Rider or its corpse is fatal */
2538                 if (is_rider(pd)) {
2539 /*JP
2540                     pline("Unfortunately, digesting any of it is fatal.");
2541 */
2542                     pline("\8ec\94O\82È\82ª\82ç\81C\82»\82ê\82ð\90H\82×\82é\82Ì\82Í\92v\96½\93I\82È\8aÔ\88á\82¢\82¾\81D");
2543                     end_engulf();
2544 #if 0 /*JP*/
2545                     Sprintf(killer.name, "unwisely tried to eat %s",
2546                             pd->mname);
2547                     killer.format = NO_KILLER_PREFIX;
2548 #else
2549                     Sprintf(killer.name, "\8bð\82©\82É\82à%s\82ð\90H\82×\82æ\82¤\82Æ\82µ\82Ä",
2550                             pd->mname);
2551                     killer.format = KILLED_BY;
2552 #endif
2553                     done(DIED);
2554                     return 0; /* lifesaved */
2555                 }
2556
2557                 if (Slow_digestion) {
2558                     dam = 0;
2559                     break;
2560                 }
2561
2562                 /* Use up amulet of life saving */
2563                 if ((otmp = mlifesaver(mdef)) != 0)
2564                     m_useup(mdef, otmp);
2565
2566                 newuhs(FALSE);
2567                 /* start_engulf() issues "you engulf <mdef>" above; this
2568                    used to specify XKILL_NOMSG but we need "you kill <mdef>"
2569                    in case we're also going to get "welcome to level N+1";
2570                    "you totally digest <mdef>" will be coming soon (after
2571                    several turns) but the level-gain message seems out of
2572                    order if the kill message is left implicit */
2573                 xkilled(mdef, XKILL_GIVEMSG | XKILL_NOCORPSE);
2574                 if (!DEADMONSTER(mdef)) { /* monster lifesaved */
2575 /*JP
2576                     You("hurriedly regurgitate the sizzling in your %s.",
2577 */
2578                     You("%s\82Ì\92\86\82Å\83V\83\85\81[\83V\83\85\81[\82Æ\82¢\82¤\89¹\82ð\97§\82Ä\82Ä\82¢\82é\82à\82Ì\82ð\91å\8b}\82¬\82Å\93f\82«\96ß\82µ\82½\81D",
2579                         body_part(STOMACH));
2580                 } else {
2581                     tmp = 1 + (pd->cwt >> 8);
2582                     if (corpse_chance(mdef, &youmonst, TRUE)
2583                         && !(mvitals[monsndx(pd)].mvflags & G_NOCORPSE)) {
2584                         /* nutrition only if there can be a corpse */
2585                         u.uhunger += (pd->cnutrit + 1) / 2;
2586                     } else
2587                         tmp = 0;
2588 /*JP
2589                     Sprintf(msgbuf, "You totally digest %s.", mon_nam(mdef));
2590 */
2591                     Sprintf(msgbuf, "\82 \82È\82½\82Í%s\82ð\8a®\91S\82É\8fÁ\89»\82µ\82½\81D", mon_nam(mdef));
2592                     if (tmp != 0) {
2593                         /* setting afternmv = end_engulf is tempting,
2594                          * but will cause problems if the player is
2595                          * attacked (which uses his real location) or
2596                          * if his See_invisible wears off
2597                          */
2598 /*JP
2599                         You("digest %s.", mon_nam(mdef));
2600 */
2601                         You("%s\82ð\8fÁ\89»\82µ\82Ä\82¢\82é\81D", mon_nam(mdef));
2602                         if (Slow_digestion)
2603                             tmp *= 2;
2604                         nomul(-tmp);
2605 /*JP
2606                         multi_reason = "digesting something";
2607 */
2608                         multi_reason = "\8fÁ\89»\92\86\82É";
2609                         nomovemsg = msgbuf;
2610                     } else
2611                         pline1(msgbuf);
2612                     if (pd == &mons[PM_GREEN_SLIME]) {
2613 /*JP
2614                         Sprintf(msgbuf, "%s isn't sitting well with you.",
2615 */
2616                         Sprintf(msgbuf, "%s\82Í\82 \82È\82½\82Æ\82¤\82Ü\82­\90Ü\82è\8d\87\82¢\82ð\82Â\82¯\82ç\82ê\82È\82¢\82æ\82¤\82¾\81D",
2617                                 The(pd->mname));
2618                         if (!Unchanging) {
2619                             make_slimed(5L, (char *) 0);
2620                         }
2621                     } else
2622                         exercise(A_CON, TRUE);
2623                 }
2624                 end_engulf();
2625                 return 2;
2626             case AD_PHYS:
2627                 if (youmonst.data == &mons[PM_FOG_CLOUD]) {
2628 /*JP
2629                     pline("%s is laden with your moisture.", Monnam(mdef));
2630 */
2631                     pline("%s\82Í\82 \82È\82½\82Ì\8e¼\8bC\82É\8bê\82µ\82ß\82ç\82ê\82Ä\82¢\82é\81D", Monnam(mdef));
2632                     if (amphibious(pd) && !flaming(pd)) {
2633                         dam = 0;
2634 /*JP
2635                         pline("%s seems unharmed.", Monnam(mdef));
2636 */
2637                         pline("%s\82Í\8f\9d\82Â\82¢\82Ä\82¢\82È\82¢\82æ\82¤\82¾\81D", Monnam(mdef));
2638                     }
2639                 } else
2640 /*JP
2641                     pline("%s is pummeled with your debris!", Monnam(mdef));
2642 */
2643                     pline("%s\82Í\8a¢âI\82Å\92É\82ß\82Â\82¯\82ç\82ê\82½\81I", Monnam(mdef));
2644                 break;
2645             case AD_ACID:
2646 /*JP
2647                 pline("%s is covered with your goo!", Monnam(mdef));
2648 */
2649                 pline("%s\82Í\82Ë\82Î\82Â\82­\82à\82Ì\82Å\95¢\82í\82ê\82½\81I", Monnam(mdef));
2650                 if (resists_acid(mdef)) {
2651 /*JP
2652                     pline("It seems harmless to %s.", mon_nam(mdef));
2653 */
2654                     pline("\82µ\82©\82µ\81C%s\82Í\82È\82ñ\82Æ\82à\82È\82¢\81D", mon_nam(mdef));
2655                     dam = 0;
2656                 }
2657                 break;
2658             case AD_BLND:
2659                 if (can_blnd(&youmonst, mdef, mattk->aatyp,
2660                              (struct obj *) 0)) {
2661                     if (mdef->mcansee)
2662 /*JP
2663                         pline("%s can't see in there!", Monnam(mdef));
2664 */
2665                         pline("%s\82Í\96Ú\82ª\8c©\82¦\82È\82­\82È\82Á\82½\81I", mon_nam(mdef));
2666                     mdef->mcansee = 0;
2667                     dam += mdef->mblinded;
2668                     if (dam > 127)
2669                         dam = 127;
2670                     mdef->mblinded = dam;
2671                 }
2672                 dam = 0;
2673                 break;
2674             case AD_ELEC:
2675                 if (rn2(2)) {
2676 /*JP
2677                     pline_The("air around %s crackles with electricity.",
2678 */
2679                     pline("%s\82Ì\89ñ\82è\82Ì\8bó\8bC\82Í\93d\8bC\82Å\83s\83\8a\83s\83\8a\82µ\82Ä\82¢\82é\81D",
2680                               mon_nam(mdef));
2681                     if (resists_elec(mdef)) {
2682 /*JP
2683                         pline("%s seems unhurt.", Monnam(mdef));
2684 */
2685                         pline("\82µ\82©\82µ\81C%s\82Í\95½\8bC\82È\82æ\82¤\82¾\81D", Monnam(mdef));
2686                         dam = 0;
2687                     }
2688                     golemeffects(mdef, (int) mattk->adtyp, dam);
2689                 } else
2690                     dam = 0;
2691                 break;
2692             case AD_COLD:
2693                 if (rn2(2)) {
2694                     if (resists_cold(mdef)) {
2695 /*JP
2696                         pline("%s seems mildly chilly.", Monnam(mdef));
2697 */
2698                         pline("%s\82Í\97â\82¦\82½\82æ\82¤\82¾\81D", Monnam(mdef));
2699                         dam = 0;
2700                     } else
2701 /*JP
2702                         pline("%s is freezing to death!", Monnam(mdef));
2703 */
2704                         pline("%s\82Í\93\80\8e\80\82µ\82»\82¤\82¾\81I", Monnam(mdef));
2705                     golemeffects(mdef, (int) mattk->adtyp, dam);
2706                 } else
2707                     dam = 0;
2708                 break;
2709             case AD_FIRE:
2710                 if (rn2(2)) {
2711                     if (resists_fire(mdef)) {
2712 /*JP
2713                         pline("%s seems mildly hot.", Monnam(mdef));
2714 */
2715                         pline("%s\82Í\92g\82©\82­\82È\82Á\82½\82æ\82¤\82¾\81D", Monnam(mdef));
2716                         dam = 0;
2717                     } else
2718 /*JP
2719                         pline("%s is burning to a crisp!", Monnam(mdef));
2720 */
2721                         pline("%s\82Í\94R\82¦\82Ä\83J\83\89\83J\83\89\82É\82È\82Á\82½\81I", Monnam(mdef));
2722                     golemeffects(mdef, (int) mattk->adtyp, dam);
2723                 } else
2724                     dam = 0;
2725                 break;
2726             case AD_DREN:
2727                 if (!rn2(4))
2728                     xdrainenergym(mdef, TRUE);
2729                 dam = 0;
2730                 break;
2731             }
2732             end_engulf();
2733             mdef->mhp -= dam;
2734             if (DEADMONSTER(mdef)) {
2735                 killed(mdef);
2736                 if (DEADMONSTER(mdef)) /* not lifesaved */
2737                     return 2;
2738             }
2739 #if 0 /*JP*/
2740             You("%s %s!", is_animal(youmonst.data) ? "regurgitate" : "expel",
2741                 mon_nam(mdef));
2742 #else
2743             You("%s\82ð%s\82µ\82½\81I", mon_nam(mdef),
2744                 is_animal(youmonst.data) ? "\93f\82«\96ß" : "\94r\8fo");
2745 #endif
2746             if (Slow_digestion || is_animal(youmonst.data)) {
2747 #if 0 /*JP*/
2748                 pline("Obviously, you didn't like %s taste.",
2749                       s_suffix(mon_nam(mdef)));
2750 #else
2751                 pline("\82Ç\82¤\82à%s\82Ì\96¡\82Í\8dD\82«\82É\82È\82ê\82È\82¢\81D",
2752                       mon_nam(mdef));
2753 #endif
2754             }
2755         }
2756     }
2757     return 0;
2758 }
2759
2760 void
2761 missum(mdef, mattk, wouldhavehit)
2762 register struct monst *mdef;
2763 register struct attack *mattk;
2764 boolean wouldhavehit;
2765 {
2766     if (wouldhavehit) /* monk is missing due to penalty for wearing suit */
2767 /*JP
2768         Your("armor is rather cumbersome...");
2769 */
2770         Your("\96h\8bï\82Í\8f­\82µ\8e×\96\82\82¾\81D\81D\81D");
2771
2772     if (could_seduce(&youmonst, mdef, mattk))
2773 /*JP
2774         You("pretend to be friendly to %s.", mon_nam(mdef));
2775 */
2776         You("%s\82É\97F\8dD\93I\82È\82Ó\82è\82ð\82µ\82½\81D", mon_nam(mdef));
2777     else if (canspotmon(mdef) && flags.verbose)
2778 /*JP
2779         You("miss %s.", mon_nam(mdef));
2780 */
2781         Your("%s\82Ö\82Ì\8dU\8c\82\82Í\8aO\82ê\82½\81D", mon_nam(mdef));
2782     else
2783 /*JP
2784         You("miss it.");
2785 */
2786         Your("\89½\8eÒ\82©\82Ö\82Ì\8dU\8c\82\82Í\8aO\82ê\82½\81D");
2787     if (!mdef->msleeping && mdef->mcanmove)
2788         wakeup(mdef, TRUE);
2789 }
2790
2791 /* attack monster as a monster; returns True if mon survives */
2792 STATIC_OVL boolean
2793 hmonas(mon)
2794 register struct monst *mon;
2795 {
2796     struct attack *mattk, alt_attk;
2797     struct obj *weapon, **originalweapon;
2798     boolean altwep = FALSE, weapon_used = FALSE, odd_claw = TRUE;
2799     int i, tmp, armorpenalty, sum[NATTK], nsum = 0, dhit = 0, attknum = 0;
2800     int dieroll, multi_claw = 0;
2801
2802     /* with just one touch/claw/weapon attack, both rings matter;
2803        with more than one, alternate right and left when checking
2804        whether silver ring causes successful hit */
2805     for (i = 0; i < NATTK; i++) {
2806         sum[i] = 0;
2807         mattk = getmattk(&youmonst, mon, i, sum, &alt_attk);
2808         if (mattk->aatyp == AT_WEAP
2809             || mattk->aatyp == AT_CLAW || mattk->aatyp == AT_TUCH)
2810             ++multi_claw;
2811     }
2812     multi_claw = (multi_claw > 1); /* switch from count to yes/no */
2813
2814     for (i = 0; i < NATTK; i++) {
2815         /* sum[i] = 0; -- now done above */
2816         mattk = getmattk(&youmonst, mon, i, sum, &alt_attk);
2817         weapon = 0;
2818         switch (mattk->aatyp) {
2819         case AT_WEAP:
2820             /* if (!uwep) goto weaponless; */
2821  use_weapon:
2822             odd_claw = !odd_claw; /* see case AT_CLAW,AT_TUCH below */
2823             /* if we've already hit with a two-handed weapon, we don't
2824                get to make another weapon attack (note:  monsters who
2825                use weapons do not have this restriction, but they also
2826                never have the opportunity to use two weapons) */
2827             if (weapon_used && sum[i - 1] && uwep && bimanual(uwep))
2828                 continue;
2829             /* Certain monsters don't use weapons when encountered as enemies,
2830              * but players who polymorph into them have hands or claws and
2831              * thus should be able to use weapons.  This shouldn't prohibit
2832              * the use of most special abilities, either.
2833              * If monster has multiple claw attacks, only one can use weapon.
2834              */
2835             weapon_used = TRUE;
2836             /* Potential problem: if the monster gets multiple weapon attacks,
2837              * we currently allow the player to get each of these as a weapon
2838              * attack.  Is this really desirable?
2839              */
2840             /* approximate two-weapon mode; known_hitum() -> hmon() -> &c
2841                might destroy the weapon argument, but it might also already
2842                be Null, and we want to track that for passive() */
2843             originalweapon = (altwep && uswapwep) ? &uswapwep : &uwep;
2844             if (uswapwep /* set up 'altwep' flag for next iteration */
2845                 /* only consider seconary when wielding one-handed primary */
2846                 && uwep && (uwep->oclass == WEAPON_CLASS || is_weptool(uwep))
2847                 && !bimanual(uwep)
2848                 /* only switch if not wearing shield and not at artifact;
2849                    shield limitation is iffy since still get extra swings
2850                    if polyform has them, but it matches twoweap behavior;
2851                    twoweap also only allows primary to be an artifact, so
2852                    if alternate weapon is one, don't use it */
2853                 && !uarms && !uswapwep->oartifact
2854                 /* only switch to uswapwep if it's a weapon */
2855                 && (uswapwep->oclass == WEAPON_CLASS || is_weptool(uswapwep))
2856                 /* only switch if uswapwep is not bow, arrows, or darts */
2857                 && !(is_launcher(uswapwep) || is_ammo(uswapwep)
2858                      || is_missile(uswapwep)) /* dart, shuriken, boomerang */
2859                 /* and not two-handed and not incapable of being wielded */
2860                 && !bimanual(uswapwep)
2861                 && !(objects[uswapwep->otyp].oc_material == SILVER
2862                      && Hate_silver))
2863                 altwep = !altwep; /* toggle for next attack */
2864             weapon = *originalweapon;
2865             if (!weapon) /* no need to go beyond no-gloves to rings; not ...*/
2866                 originalweapon = &uarmg; /*... subject to erosion damage */
2867
2868             tmp = find_roll_to_hit(mon, AT_WEAP, weapon, &attknum,
2869                                    &armorpenalty);
2870             dieroll = rnd(20);
2871             dhit = (tmp > dieroll || u.uswallow);
2872             /* caller must set bhitpos */
2873             if (!known_hitum(mon, weapon, &dhit, tmp,
2874                              armorpenalty, mattk, dieroll)) {
2875                 /* enemy dead, before any special abilities used */
2876                 sum[i] = 2;
2877                 break;
2878             } else
2879                 sum[i] = dhit;
2880             /* originalweapon points to an equipment slot which might
2881                now be empty if the weapon was destroyed during the hit;
2882                passive(,weapon,...) won't call passive_obj() in that case */
2883             weapon = *originalweapon; /* might receive passive erosion */
2884             /* might be a worm that gets cut in half; if so, early return */
2885             if (m_at(u.ux + u.dx, u.uy + u.dy) != mon) {
2886                 i = NATTK; /* skip additional attacks */
2887                 /* proceed with uswapwep->cursed check, then exit loop */
2888                 goto passivedone;
2889             }
2890             /* Do not print "You hit" message; known_hitum already did it. */
2891             if (dhit && mattk->adtyp != AD_SPEL && mattk->adtyp != AD_PHYS)
2892                 sum[i] = damageum(mon, mattk, 0);
2893             break;
2894         case AT_CLAW:
2895             if (uwep && !cantwield(youmonst.data) && !weapon_used)
2896                 goto use_weapon;
2897             /*FALLTHRU*/
2898         case AT_TUCH:
2899             if (uwep && youmonst.data->mlet == S_LICH && !weapon_used)
2900                 goto use_weapon;
2901             /*FALLTHRU*/
2902         case AT_KICK:
2903         case AT_BITE:
2904         case AT_STNG:
2905         case AT_BUTT:
2906         case AT_TENT:
2907         /*weaponless:*/
2908             tmp = find_roll_to_hit(mon, mattk->aatyp, (struct obj *) 0,
2909                                    &attknum, &armorpenalty);
2910             dieroll = rnd(20);
2911             dhit = (tmp > dieroll || u.uswallow);
2912             if (dhit) {
2913                 int compat, specialdmg;
2914                 long silverhit = 0L;
2915 #if 0 /*JP*//* \82·\82×\82Ä\81u\8dU\8c\82\82µ\82½\81v\82É\82·\82é */
2916                 const char *verb = 0; /* verb or body part */
2917 #endif
2918
2919                 if (!u.uswallow
2920                     && (compat = could_seduce(&youmonst, mon, mattk)) != 0) {
2921 #if 0 /*JP*/
2922                     You("%s %s %s.",
2923                         (mon->mcansee && haseyes(mon->data)) ? "smile at"
2924                                                              : "talk to",
2925                         mon_nam(mon),
2926                         (compat == 2) ? "engagingly" : "seductively");
2927 #else
2928                     You("%s\82Ö%s%s\81D",
2929                         mon_nam(mon),
2930                         compat == 2 ? "\96£\97Í\93I\82É" : "\97U\98f\93I\82É",
2931                         mon->mcansee && haseyes(mon->data) ? "\94÷\8fÎ\82Ý\82©\82¯\82½"
2932                                                            : "\98b\82µ\82©\82¯\82½");
2933 #endif
2934                     /* doesn't anger it; no wakeup() */
2935                     sum[i] = damageum(mon, mattk, 0);
2936                     break;
2937                 }
2938                 wakeup(mon, TRUE);
2939
2940                 specialdmg = 0; /* blessed and/or silver bonus */
2941                 switch (mattk->aatyp) {
2942                 case AT_CLAW:
2943                 case AT_TUCH:
2944                     /* verb=="claws" may be overridden below */
2945 #if 0 /*JP*/
2946                     verb = (mattk->aatyp == AT_TUCH) ? "touch" : "claws";
2947 #endif
2948                     /* decide if silver-hater will be hit by silver ring(s);
2949                        for 'multi_claw' where attacks alternate right/left,
2950                        assume 'even' claw or touch attacks use right hand
2951                        or paw, 'odd' ones use left for ring interaction;
2952                        even vs odd is based on actual attacks rather
2953                        than on index into mon->dat->mattk[] so that {bite,
2954                        claw,claw} instead of {claw,claw,bite} doesn't
2955                        make poly'd hero mysteriously become left-handed */
2956                     odd_claw = !odd_claw;
2957                     specialdmg = special_dmgval(&youmonst, mon,
2958                                                 W_ARMG
2959                                                 | ((odd_claw || !multi_claw)
2960                                                    ? W_RINGL : 0L)
2961                                                 | ((!odd_claw || !multi_claw)
2962                                                    ? W_RINGR : 0L),
2963                                                 &silverhit);
2964                     break;
2965                 case AT_TENT:
2966                     /* assumes mind flayer's tentacles-on-head rather
2967                        than sea monster's tentacle-as-arm */
2968 #if 0 /*JP*/
2969                     verb = "tentacles";
2970 #endif
2971                     break;
2972                 case AT_KICK:
2973 #if 0 /*JP*/
2974                     verb = "kick";
2975 #endif
2976                     specialdmg = special_dmgval(&youmonst, mon, W_ARMF,
2977                                                 &silverhit);
2978                     break;
2979                 case AT_BUTT:
2980 #if 0 /*JP*/
2981                     verb = "head butt"; /* mbodypart(mon,HEAD)=="head" */
2982                     /* hypothetical; if any form with a head-butt attack
2983                        could wear a helmet, it would hit shades when
2984                        wearing a blessed (or silver) one */
2985 #endif
2986                     specialdmg = special_dmgval(&youmonst, mon, W_ARMH,
2987                                                 &silverhit);
2988                     break;
2989                 case AT_BITE:
2990 #if 0 /*JP*/
2991                     verb = "bite";
2992 #endif
2993                     break;
2994                 case AT_STNG:
2995 #if 0 /*JP*/
2996                     verb = "sting";
2997 #endif
2998                     break;
2999                 default:
3000 #if 0 /*JP*/
3001                     verb = "hit";
3002 #endif
3003                     break;
3004                 }
3005                 if (mon->data == &mons[PM_SHADE] && !specialdmg) {
3006 #if 0 /*JP*/
3007                     if (!strcmp(verb, "hit")
3008                         || (mattk->aatyp == AT_CLAW && humanoid(mon->data)))
3009                         verb = "attack";
3010 #endif
3011 #if 0 /*JP*/
3012                     Your("%s %s harmlessly through %s.",
3013                          verb, vtense(verb, "pass"), mon_nam(mon));
3014 #else
3015                     Your("\8dU\8c\82\82Í%s\82ð\92Ê\82è\82Ê\82¯\82½\81D",
3016                          mon_nam(mon));
3017 #endif
3018                 } else {
3019                     if (mattk->aatyp == AT_TENT) {
3020 /*JP
3021                     Your("tentacles suck %s.", mon_nam(mon));
3022 */
3023                     Your("\90G\8eè\82ª%s\82Ì\91Ì\89t\82ð\8bz\82¢\82Æ\82Á\82½\81D", mon_nam(mon));
3024                     } else {
3025 #if 0 /*JP*/
3026                         if (mattk->aatyp == AT_CLAW)
3027                             verb = "hit"; /* not "claws" */
3028 #endif
3029 #if 0 /*JP*/
3030                         You("%s %s.", verb, mon_nam(mon));
3031 #else
3032                         You("%s\82ð\8dU\8c\82\82µ\82½\81D", mon_nam(mon));
3033 #endif
3034                         if (silverhit && flags.verbose)
3035                             silver_sears(&youmonst, mon, silverhit);
3036                     }
3037                     sum[i] = damageum(mon, mattk, specialdmg);
3038                 }
3039             } else { /* !dhit */
3040                 missum(mon, mattk, (tmp + armorpenalty > dieroll));
3041             }
3042             break;
3043
3044         case AT_HUGS: {
3045             int specialdmg;
3046             long silverhit = 0L;
3047             boolean byhand = hug_throttles(&mons[u.umonnum]), /* rope golem */
3048                     unconcerned = (byhand && !can_be_strangled(mon));
3049
3050             if (sticks(mon->data) || u.uswallow || notonhead
3051                 || (byhand && (uwep || !has_head(mon->data)))) {
3052                 /* can't hold a holder due to subsequent ambiguity over
3053                    who is holding whom; can't hug engulfer from inside;
3054                    can't hug a worm tail (would immobilize entire worm!);
3055                    byhand: can't choke something that lacks a head;
3056                    not allowed to make a choking hug if wielding a weapon
3057                    (but might have grabbed w/o weapon, then wielded one,
3058                    and may even be attacking a different monster now) */
3059                 if (byhand && uwep && u.ustuck
3060                     && !(sticks(u.ustuck->data) || u.uswallow))
3061                     uunstick();
3062                 continue; /* not 'break'; bypass passive counter-attack */
3063             }
3064             /* automatic if prev two attacks succeed, or if
3065                already grabbed in a previous attack */
3066             dhit = 1;
3067             wakeup(mon, TRUE);
3068             /* choking hug/throttling grab uses hands (gloves or rings);
3069                normal hug uses outermost of cloak/suit/shirt */
3070             specialdmg = special_dmgval(&youmonst, mon,
3071                                         byhand ? (W_ARMG | W_RINGL | W_RINGR)
3072                                                : (W_ARMC | W_ARM | W_ARMU),
3073                                         &silverhit);
3074             if (unconcerned) {
3075                 /* strangling something which can't be strangled */
3076                 if (mattk != &alt_attk) {
3077                     alt_attk = *mattk;
3078                     mattk = &alt_attk;
3079                 }
3080                 /* change damage to 1d1; not strangling but still
3081                    doing [minimal] physical damage to victim's body */
3082                 mattk->damn = mattk->damd = 1;
3083                 /* don't give 'unconcerned' feedback if there is extra damage
3084                    or if it is nearly destroyed or if creature doesn't have
3085                    the mental ability to be concerned in the first place */
3086                 if (specialdmg || mindless(mon->data)
3087                     || mon->mhp <= 1 + max(u.udaminc, 1))
3088                     unconcerned = FALSE;
3089             }
3090             if (mon->data == &mons[PM_SHADE]) {
3091 #if 0 /*JP*/
3092                 const char *verb = byhand ? "grasp" : "hug";
3093 #endif
3094
3095                 /* hugging a shade; successful if blessed outermost armor
3096                    for normal hug, or blessed gloves or silver ring(s) for
3097                    choking hug; deals damage but never grabs hold */
3098                 if (specialdmg) {
3099 #if 0 /*JP*/
3100                     You("%s %s%s", verb, mon_nam(mon), exclam(specialdmg));
3101 #else
3102                     You("%s\82ð\82Â\82©\82ñ\82¾%s", mon_nam(mon), exclam(specialdmg));
3103 #endif
3104                     if (silverhit && flags.verbose)
3105                         silver_sears(&youmonst, mon, silverhit);
3106                     sum[i] = damageum(mon, mattk, specialdmg);
3107                 } else {
3108 #if 0 /*JP:T*/
3109                     Your("%s passes harmlessly through %s.",
3110                          verb, mon_nam(mon));
3111 #else
3112                     You("%s\82ð\82Â\82©\82Ü\82¦\82æ\82¤\82Æ\82µ\82½\82ª\92Ê\82è\82Ê\82¯\82½\81D",
3113                         mon_nam(mon));
3114 #endif
3115                 }
3116                 break;
3117             }
3118             /* hug attack against ordinary foe */
3119             if (mon == u.ustuck) {
3120 #if 0 /*JP*/
3121                 pline("%s is being %s%s.", Monnam(mon),
3122                       byhand ? "throttled" : "crushed",
3123                       /* extra feedback for non-breather being choked */
3124                       unconcerned ? " but doesn't seem concerned" : "");
3125 #else
3126                 pline("%s\82Í%s%s\81D", Monnam(mon),
3127                       byhand ? "\8eñ\82ð\8di\82ß\82ç\82ê\82Ä\82¢\82é" : "\89\9f\82µ\82Â\82Ô\82³\82ê\82Ä\82¢\82é",
3128                       /* extra feedback for non-breather being choked */
3129                       unconcerned ? "\82ª\81C\8bC\82É\82µ\82Ä\82¢\82È\82¢\82æ\82¤\82¾" : "");
3130 #endif
3131                 if (silverhit && flags.verbose)
3132                     silver_sears(&youmonst, mon, silverhit);
3133                 sum[i] = damageum(mon, mattk, specialdmg);
3134             } else if (i >= 2 && sum[i - 1] && sum[i - 2]) {
3135                 /* in case we're hugging a new target while already
3136                    holding something else; yields feedback
3137                    "<u.ustuck> is no longer in your clutches" */
3138                 if (u.ustuck && u.ustuck != mon)
3139                     uunstick();
3140 /*JP
3141                     You("grab %s!", mon_nam(mon));
3142 */
3143                     You("%s\82ð\82Â\82©\82Ü\82¦\82½\81I", mon_nam(mon));
3144                 u.ustuck = mon;
3145                 if (silverhit && flags.verbose)
3146                     silver_sears(&youmonst, mon, silverhit);
3147                 sum[i] = damageum(mon, mattk, specialdmg);
3148             }
3149             break; /* AT_HUGS */
3150         }
3151
3152         case AT_EXPL: /* automatic hit if next to */
3153             dhit = -1;
3154             wakeup(mon, TRUE);
3155             sum[i] = explum(mon, mattk);
3156             break;
3157
3158         case AT_ENGL:
3159             tmp = find_roll_to_hit(mon, mattk->aatyp, (struct obj *) 0,
3160                                    &attknum, &armorpenalty);
3161             if ((dhit = (tmp > rnd(20 + i)))) {
3162                 wakeup(mon, TRUE);
3163                 if (mon->data == &mons[PM_SHADE])
3164 /*JP
3165                     Your("attempt to surround %s is harmless.", mon_nam(mon));
3166 */
3167                     You("%s\82ð\88ù\82Ý\82±\82à\82¤\82Æ\82µ\82½\82ª\8e¸\94s\82µ\82½\81D", mon_nam(mon));
3168                 else {
3169                     sum[i] = gulpum(mon, mattk);
3170                     if (sum[i] == 2 && (mon->data->mlet == S_ZOMBIE
3171                                         || mon->data->mlet == S_MUMMY)
3172                         && rn2(5) && !Sick_resistance) {
3173 /*JP
3174                         You_feel("%ssick.", (Sick) ? "very " : "");
3175 */
3176                         You_feel("%s\8bC\95ª\82ª\88«\82¢\81D", (Sick) ? "\82Æ\82Ä\82à" : "");
3177                         mdamageu(mon, rnd(8));
3178                     }
3179                 }
3180             } else {
3181                 missum(mon, mattk, FALSE);
3182             }
3183             break;
3184
3185         case AT_MAGC:
3186             /* No check for uwep; if wielding nothing we want to
3187              * do the normal 1-2 points bare hand damage...
3188              */
3189             if ((youmonst.data->mlet == S_KOBOLD
3190                  || youmonst.data->mlet == S_ORC
3191                  || youmonst.data->mlet == S_GNOME) && !weapon_used)
3192                 goto use_weapon;
3193             /*FALLTHRU*/
3194
3195         case AT_NONE:
3196         case AT_BOOM:
3197             continue;
3198         /* Not break--avoid passive attacks from enemy */
3199
3200         case AT_BREA:
3201         case AT_SPIT:
3202         case AT_GAZE: /* all done using #monster command */
3203             dhit = 0;
3204             break;
3205
3206         default: /* Strange... */
3207             impossible("strange attack of yours (%d)", mattk->aatyp);
3208         }
3209         if (dhit == -1) {
3210             u.mh = -1; /* dead in the current form */
3211             rehumanize();
3212         }
3213         if (sum[i] == 2) {
3214             /* defender dead */
3215             (void) passive(mon, weapon, 1, 0, mattk->aatyp, FALSE);
3216             nsum = 0; /* return value below used to be 'nsum > 0' */
3217         } else {
3218             (void) passive(mon, weapon, sum[i], 1, mattk->aatyp, FALSE);
3219             nsum |= sum[i];
3220         }
3221
3222         /* don't use sum[i] beyond this point;
3223            'i' will be out of bounds if we get here via 'goto' */
3224  passivedone:
3225         /* when using dual weapons, cursed secondary weapon doesn't weld,
3226            it gets dropped; do the same when multiple AT_WEAP attacks
3227            simulate twoweap */
3228         if (uswapwep && weapon == uswapwep && weapon->cursed) {
3229             drop_uswapwep();
3230             break; /* don't proceed with additional attacks */
3231         }
3232         /* stop attacking if defender has died;
3233            needed to defer this until after uswapwep->cursed check */
3234         if (DEADMONSTER(mon))
3235             break;
3236         if (!Upolyd)
3237             break; /* No extra attacks if no longer a monster */
3238         if (multi < 0)
3239             break; /* If paralyzed while attacking, i.e. floating eye */
3240     }
3241     /* return value isn't used, but make it match hitum()'s */
3242     return !DEADMONSTER(mon);
3243 }
3244
3245 /*      Special (passive) attacks on you by monsters done here.
3246  */
3247 int
3248 passive(mon, weapon, mhit, malive, aatyp, wep_was_destroyed)
3249 struct monst *mon;
3250 struct obj *weapon; /* uwep or uswapwep or uarmg or uarmf or Null */
3251 boolean mhit;
3252 int malive;
3253 uchar aatyp;
3254 boolean wep_was_destroyed;
3255 {
3256     register struct permonst *ptr = mon->data;
3257     register int i, tmp;
3258
3259     for (i = 0;; i++) {
3260         if (i >= NATTK)
3261             return (malive | mhit); /* no passive attacks */
3262         if (ptr->mattk[i].aatyp == AT_NONE)
3263             break; /* try this one */
3264     }
3265     /* Note: tmp not always used */
3266     if (ptr->mattk[i].damn)
3267         tmp = d((int) ptr->mattk[i].damn, (int) ptr->mattk[i].damd);
3268     else if (ptr->mattk[i].damd)
3269         tmp = d((int) mon->m_lev + 1, (int) ptr->mattk[i].damd);
3270     else
3271         tmp = 0;
3272
3273     /*  These affect you even if they just died.
3274      */
3275     switch (ptr->mattk[i].adtyp) {
3276     case AD_FIRE:
3277         if (mhit && !mon->mcan && weapon) {
3278             if (aatyp == AT_KICK) {
3279                 if (uarmf && !rn2(6))
3280                     (void) erode_obj(uarmf, xname(uarmf), ERODE_BURN,
3281                                      EF_GREASE | EF_VERBOSE);
3282             } else if (aatyp == AT_WEAP || aatyp == AT_CLAW
3283                        || aatyp == AT_MAGC || aatyp == AT_TUCH)
3284                 passive_obj(mon, weapon, &(ptr->mattk[i]));
3285         }
3286         break;
3287     case AD_ACID:
3288         if (mhit && rn2(2)) {
3289             if (Blind || !flags.verbose)
3290 /*JP
3291                 You("are splashed!");
3292 */
3293                 You("\89½\82©\82ð\97\81\82Ñ\82¹\82ç\82ê\82½\81I");
3294             else
3295 #if 0 /*JP:T*/
3296                 You("are splashed by %s %s!", s_suffix(mon_nam(mon)),
3297                     hliquid("acid"));
3298 #else
3299                 You("%s\82Ì%s\82ð\97\81\82Ñ\82¹\82ç\82ê\82½\81I", mon_nam(mon),
3300                     hliquid("\8e_"));
3301 #endif
3302
3303             if (!Acid_resistance)
3304                 mdamageu(mon, tmp);
3305             if (!rn2(30))
3306                 erode_armor(&youmonst, ERODE_CORRODE);
3307         }
3308         if (mhit && weapon) {
3309             if (aatyp == AT_KICK) {
3310                 if (uarmf && !rn2(6))
3311                     (void) erode_obj(uarmf, xname(uarmf), ERODE_CORRODE,
3312                                      EF_GREASE | EF_VERBOSE);
3313             } else if (aatyp == AT_WEAP || aatyp == AT_CLAW
3314                        || aatyp == AT_MAGC || aatyp == AT_TUCH)
3315                 passive_obj(mon, weapon, &(ptr->mattk[i]));
3316         }
3317         exercise(A_STR, FALSE);
3318         break;
3319     case AD_STON:
3320         if (mhit) { /* successful attack */
3321             long protector = attk_protection((int) aatyp);
3322
3323             /* hero using monsters' AT_MAGC attack is hitting hand to
3324                hand rather than casting a spell */
3325             if (aatyp == AT_MAGC)
3326                 protector = W_ARMG;
3327
3328             if (protector == 0L /* no protection */
3329                 || (protector == W_ARMG && !uarmg
3330                     && !uwep && !wep_was_destroyed)
3331                 || (protector == W_ARMF && !uarmf)
3332                 || (protector == W_ARMH && !uarmh)
3333                 || (protector == (W_ARMC | W_ARMG) && (!uarmc || !uarmg))) {
3334                 if (!Stone_resistance
3335                     && !(poly_when_stoned(youmonst.data)
3336                          && polymon(PM_STONE_GOLEM))) {
3337                     done_in_by(mon, STONING); /* "You turn to stone..." */
3338                     return 2;
3339                 }
3340             }
3341         }
3342         break;
3343     case AD_RUST:
3344         if (mhit && !mon->mcan && weapon) {
3345             if (aatyp == AT_KICK) {
3346                 if (uarmf)
3347                     (void) erode_obj(uarmf, xname(uarmf), ERODE_RUST,
3348                                      EF_GREASE | EF_VERBOSE);
3349             } else if (aatyp == AT_WEAP || aatyp == AT_CLAW
3350                        || aatyp == AT_MAGC || aatyp == AT_TUCH)
3351                 passive_obj(mon, weapon, &(ptr->mattk[i]));
3352         }
3353         break;
3354     case AD_CORR:
3355         if (mhit && !mon->mcan && weapon) {
3356             if (aatyp == AT_KICK) {
3357                 if (uarmf)
3358                     (void) erode_obj(uarmf, xname(uarmf), ERODE_CORRODE,
3359                                      EF_GREASE | EF_VERBOSE);
3360             } else if (aatyp == AT_WEAP || aatyp == AT_CLAW
3361                        || aatyp == AT_MAGC || aatyp == AT_TUCH)
3362                 passive_obj(mon, weapon, &(ptr->mattk[i]));
3363         }
3364         break;
3365     case AD_MAGM:
3366         /* wrath of gods for attacking Oracle */
3367         if (Antimagic) {
3368             shieldeff(u.ux, u.uy);
3369 /*JP
3370             pline("A hail of magic missiles narrowly misses you!");
3371 */
3372             pline("\96\82\96@\82Ì\96î\82Ì\89J\82ª\82©\82·\82ß\82Ä\82¢\82Á\82½\81I");
3373         } else {
3374 /*JP
3375             You("are hit by magic missiles appearing from thin air!");
3376 */
3377             pline("\93Ë\94@\8bó\92\86\82É\8c»\82í\82ê\82½\96\82\96@\82Ì\96î\82ª\96½\92\86\82µ\82½\81I");
3378             mdamageu(mon, tmp);
3379         }
3380         break;
3381     case AD_ENCH: /* KMH -- remove enchantment (disenchanter) */
3382         if (mhit) {
3383             if (aatyp == AT_KICK) {
3384                 if (!weapon)
3385                     break;
3386             } else if (aatyp == AT_BITE || aatyp == AT_BUTT
3387                        || (aatyp >= AT_STNG && aatyp < AT_WEAP)) {
3388                 break; /* no object involved */
3389             }
3390             passive_obj(mon, weapon, &(ptr->mattk[i]));
3391         }
3392         break;
3393     default:
3394         break;
3395     }
3396
3397     /*  These only affect you if they still live.
3398      */
3399     if (malive && !mon->mcan && rn2(3)) {
3400         switch (ptr->mattk[i].adtyp) {
3401         case AD_PLYS:
3402             if (ptr == &mons[PM_FLOATING_EYE]) {
3403                 if (!canseemon(mon)) {
3404                     break;
3405                 }
3406                 if (mon->mcansee) {
3407 #if 0 /*JP*/
3408                     if (ureflects("%s gaze is reflected by your %s.",
3409                                   s_suffix(Monnam(mon)))) {
3410 #else
3411                     if (ureflects("%s\82Ì\82É\82ç\82Ý\82Í%s\82É\82æ\82Á\82Ä\94½\8eË\82³\82ê\82½\81D",
3412                                   Monnam(mon))) {
3413 #endif
3414                         ;
3415                     } else if (Free_action) {
3416 #if 0 /*JP*/
3417                         You("momentarily stiffen under %s gaze!",
3418                             s_suffix(mon_nam(mon)));
3419 #else
3420                         You("%s\82Ì\82É\82ç\82Ý\82Å\88ê\8fu\8dd\92¼\82µ\82½\81I",
3421                             mon_nam(mon));
3422 #endif
3423                     } else if (Hallucination && rn2(4)) {
3424 #if 0 /*JP*/
3425                         pline("%s looks %s%s.", Monnam(mon),
3426                               !rn2(2) ? "" : "rather ",
3427                               !rn2(2) ? "numb" : "stupified");
3428 #else
3429                         pline("%s\82Í%s\82Î\82©\82É\82È\82Á\82½\82æ\82¤\82¾\81D", Monnam(mon),
3430                               !rn2(2) ? "" : "\8f­\82µ");
3431 #endif
3432                     } else {
3433 /*JP
3434                         You("are frozen by %s gaze!", s_suffix(mon_nam(mon)));
3435 */
3436                         You("%s\82Ì\82É\82ç\82Ý\82Å\93®\82¯\82È\82­\82È\82Á\82½\81I", mon_nam(mon));
3437                         nomul((ACURR(A_WIS) > 12 || rn2(4)) ? -tmp : -127);
3438 /*JP
3439                         multi_reason = "frozen by a monster's gaze";
3440 */
3441                         multi_reason = "\89ö\95¨\82Ì\82É\82ç\82Ý\82Å\8dd\92¼\82µ\82Ä\82¢\82é\8e\9e\82É";
3442                         nomovemsg = 0;
3443                     }
3444                 } else {
3445 #if 0 /*JP*/
3446                     pline("%s cannot defend itself.",
3447                           Adjmonnam(mon, "blind"));
3448 #else
3449                     pline("%s\82Í\96h\8cä\82Å\82«\82È\82¢\81D",
3450                           Adjmonnam(mon,"\96Ú\82Ì\8c©\82¦\82È\82¢"));
3451 #endif
3452                     if (!rn2(500))
3453                         change_luck(-1);
3454                 }
3455             } else if (Free_action) {
3456 /*JP
3457                 You("momentarily stiffen.");
3458 */
3459                 You("\88ê\8fu\8dd\92¼\82µ\82½\81D");
3460             } else { /* gelatinous cube */
3461 /*JP
3462                 You("are frozen by %s!", mon_nam(mon));
3463 */
3464                 You("%s\82É\82æ\82Á\82Ä\93®\82¯\82È\82­\82È\82Á\82½\81I", mon_nam(mon));
3465                 nomovemsg = You_can_move_again;
3466                 nomul(-tmp);
3467 /*JP
3468                 multi_reason = "frozen by a monster";
3469 */
3470                 multi_reason = "\89ö\95¨\82É\82æ\82Á\82Ä\8dd\92¼\82µ\82Ä\82¢\82é\8e\9e\82É";
3471                 exercise(A_DEX, FALSE);
3472             }
3473             break;
3474         case AD_COLD: /* brown mold or blue jelly */
3475             if (monnear(mon, u.ux, u.uy)) {
3476                 if (Cold_resistance) {
3477                     shieldeff(u.ux, u.uy);
3478 /*JP
3479                     You_feel("a mild chill.");
3480 */
3481                     You("\8a¦\82³\82ð\8a´\82\82½\81D");
3482                     ugolemeffects(AD_COLD, tmp);
3483                     break;
3484                 }
3485 /*JP
3486                 You("are suddenly very cold!");
3487 */
3488                 You("\93Ë\91R\81C\96Ò\97ó\82É\8a¦\82­\82È\82Á\82½\81I");
3489                 mdamageu(mon, tmp);
3490                 /* monster gets stronger with your heat! */
3491                 mon->mhp += tmp / 2;
3492                 if (mon->mhpmax < mon->mhp)
3493                     mon->mhpmax = mon->mhp;
3494                 /* at a certain point, the monster will reproduce! */
3495                 if (mon->mhpmax > ((int) (mon->m_lev + 1) * 8))
3496                     (void) split_mon(mon, &youmonst);
3497             }
3498             break;
3499         case AD_STUN: /* specifically yellow mold */
3500             if (!Stunned)
3501                 make_stunned((long) tmp, TRUE);
3502             break;
3503         case AD_FIRE:
3504             if (monnear(mon, u.ux, u.uy)) {
3505                 if (Fire_resistance) {
3506                     shieldeff(u.ux, u.uy);
3507 /*JP
3508                     You_feel("mildly warm.");
3509 */
3510                     You("\92g\82©\82³\82ð\8a´\82\82½\81D");
3511                     ugolemeffects(AD_FIRE, tmp);
3512                     break;
3513                 }
3514 /*JP
3515                 You("are suddenly very hot!");
3516 */
3517                 You("\93Ë\91R\81C\96Ò\97ó\82É\94M\82­\82È\82Á\82½\81I");
3518                 mdamageu(mon, tmp); /* fire damage */
3519             }
3520             break;
3521         case AD_ELEC:
3522             if (Shock_resistance) {
3523                 shieldeff(u.ux, u.uy);
3524 /*JP
3525                 You_feel("a mild tingle.");
3526 */
3527                 You("\83s\83\8a\83s\83\8a\82Æá\83\82ê\82ð\8a´\82\82½\81D");
3528                 ugolemeffects(AD_ELEC, tmp);
3529                 break;
3530             }
3531 /*JP
3532             You("are jolted with electricity!");
3533 */
3534             You("\93d\8bC\83V\83\87\83b\83N\82ð\82¤\82¯\82½\81I");
3535             mdamageu(mon, tmp);
3536             break;
3537         default:
3538             break;
3539         }
3540     }
3541     return (malive | mhit);
3542 }
3543
3544 /*
3545  * Special (passive) attacks on an attacking object by monsters done here.
3546  * Assumes the attack was successful.
3547  */
3548 void
3549 passive_obj(mon, obj, mattk)
3550 struct monst *mon;
3551 struct obj *obj;          /* null means pick uwep, uswapwep or uarmg */
3552 struct attack *mattk;     /* null means we find one internally */
3553 {
3554     struct permonst *ptr = mon->data;
3555     int i;
3556
3557     /* [this first bit is obsolete; we're not called with Null anymore] */
3558     /* if caller hasn't specified an object, use uwep, uswapwep or uarmg */
3559     if (!obj) {
3560         obj = (u.twoweap && uswapwep && !rn2(2)) ? uswapwep : uwep;
3561         if (!obj && mattk->adtyp == AD_ENCH)
3562             obj = uarmg; /* no weapon? then must be gloves */
3563         if (!obj)
3564             return; /* no object to affect */
3565     }
3566
3567     /* if caller hasn't specified an attack, find one */
3568     if (!mattk) {
3569         for (i = 0;; i++) {
3570             if (i >= NATTK)
3571                 return; /* no passive attacks */
3572             if (ptr->mattk[i].aatyp == AT_NONE)
3573                 break; /* try this one */
3574         }
3575         mattk = &(ptr->mattk[i]);
3576     }
3577
3578     switch (mattk->adtyp) {
3579     case AD_FIRE:
3580         if (!rn2(6) && !mon->mcan
3581             /* steam vortex: fire resist applies, fire damage doesn't */
3582             && mon->data != &mons[PM_STEAM_VORTEX]) {
3583             (void) erode_obj(obj, NULL, ERODE_BURN, EF_NONE);
3584         }
3585         break;
3586     case AD_ACID:
3587         if (!rn2(6)) {
3588             (void) erode_obj(obj, NULL, ERODE_CORRODE, EF_GREASE);
3589         }
3590         break;
3591     case AD_RUST:
3592         if (!mon->mcan) {
3593             (void) erode_obj(obj, (char *) 0, ERODE_RUST, EF_GREASE);
3594         }
3595         break;
3596     case AD_CORR:
3597         if (!mon->mcan) {
3598             (void) erode_obj(obj, (char *) 0, ERODE_CORRODE, EF_GREASE);
3599         }
3600         break;
3601     case AD_ENCH:
3602         if (!mon->mcan) {
3603             if (drain_item(obj, TRUE) && carried(obj)
3604                 && (obj->known || obj->oclass == ARMOR_CLASS)) {
3605 /*JP
3606                 pline("%s less effective.", Yobjnam2(obj, "seem"));
3607 */
3608                 Your("%s\82©\82ç\96\82\97Í\82ª\8fÁ\82¦\82½\82æ\82¤\82¾\81D", xname(obj));
3609             }
3610             break;
3611         }
3612     default:
3613         break;
3614     }
3615
3616     if (carried(obj))
3617         update_inventory();
3618 }
3619
3620 /* Note: caller must ascertain mtmp is mimicking... */
3621 void
3622 stumble_onto_mimic(mtmp)
3623 struct monst *mtmp;
3624 {
3625 /*JP
3626     const char *fmt = "Wait!  That's %s!", *generic = "a monster", *what = 0;
3627 */
3628     const char *fmt = "\82¿\82å\82Á\82Æ\82Ü\82Á\82½\81I%s\82¾\81I", *generic = "\89ö\95¨", *what = 0;
3629
3630     if (!u.ustuck && !mtmp->mflee && dmgtype(mtmp->data, AD_STCK))
3631         u.ustuck = mtmp;
3632
3633     if (Blind) {
3634         if (!Blind_telepat)
3635             what = generic; /* with default fmt */
3636         else if (M_AP_TYPE(mtmp) == M_AP_MONSTER)
3637             what = a_monnam(mtmp); /* differs from what was sensed */
3638     } else {
3639         int glyph = levl[u.ux + u.dx][u.uy + u.dy].glyph;
3640
3641         if (glyph_is_cmap(glyph) && (glyph_to_cmap(glyph) == S_hcdoor
3642                                      || glyph_to_cmap(glyph) == S_vcdoor))
3643 /*JP
3644             fmt = "The door actually was %s!";
3645 */
3646             fmt = "\94à\82Í\8eÀ\8dÛ\82É\82Í%s\82¾\82Á\82½\81I";
3647         else if (glyph_is_object(glyph) && glyph_to_obj(glyph) == GOLD_PIECE)
3648 /*JP
3649             fmt = "That gold was %s!";
3650 */
3651             fmt = "\8bà\89Ý\82Í%s\82¾\82Á\82½\81I";
3652
3653         /* cloned Wiz starts out mimicking some other monster and
3654            might make himself invisible before being revealed */
3655         if (mtmp->minvis && !See_invisible)
3656             what = generic;
3657         else
3658             what = a_monnam(mtmp);
3659     }
3660     if (what)
3661         pline(fmt, what);
3662
3663     wakeup(mtmp, FALSE); /* clears mimicking */
3664     /* if hero is blind, wakeup() won't display the monster even though
3665        it's no longer concealed */
3666     if (!canspotmon(mtmp)
3667         && !glyph_is_invisible(levl[mtmp->mx][mtmp->my].glyph))
3668         map_invisible(mtmp->mx, mtmp->my);
3669 }
3670
3671 STATIC_OVL void
3672 nohandglow(mon)
3673 struct monst *mon;
3674 {
3675     char *hands = makeplural(body_part(HAND));
3676
3677     if (!u.umconf || mon->mconf)
3678         return;
3679     if (u.umconf == 1) {
3680         if (Blind)
3681 /*JP
3682             Your("%s stop tingling.", hands);
3683 */
3684             Your("%s\82Ìá\83\82ê\82ª\82Æ\82ê\82½\81D", hands);
3685         else
3686 /*JP
3687             Your("%s stop glowing %s.", hands, hcolor(NH_RED));
3688 */
3689             Your("%s\82Ì%s\8bP\82«\82Í\82È\82­\82È\82Á\82½\81D", hands, hcolor(NH_RED));
3690     } else {
3691         if (Blind)
3692 /*JP
3693             pline_The("tingling in your %s lessens.", hands);
3694 */
3695             pline("%s\82Ìá\83\82ê\82ª\82Æ\82ê\82Ä\82«\82½\81D",hands);
3696         else
3697 /*JP
3698             Your("%s no longer glow so brightly %s.", hands, hcolor(NH_RED));
3699 */
3700             Your("%s\82Ì%s\8bP\82«\82ª\82È\82­\82È\82Á\82Ä\82«\82½\81D",hands, hcolor(NH_RED));
3701     }
3702     u.umconf--;
3703 }
3704
3705 int
3706 flash_hits_mon(mtmp, otmp)
3707 struct monst *mtmp;
3708 struct obj *otmp; /* source of flash */
3709 {
3710     int tmp, amt, res = 0, useeit = canseemon(mtmp);
3711
3712     if (mtmp->msleeping) {
3713         mtmp->msleeping = 0;
3714         if (useeit) {
3715 /*JP
3716             pline_The("flash awakens %s.", mon_nam(mtmp));
3717 */
3718             pline("\91M\8cõ\82Å%s\82ª\96Ú\82ð\8ao\82Ü\82µ\82½\81D", mon_nam(mtmp));
3719             res = 1;
3720         }
3721     } else if (mtmp->data->mlet != S_LIGHT) {
3722         if (!resists_blnd(mtmp)) {
3723             tmp = dist2(otmp->ox, otmp->oy, mtmp->mx, mtmp->my);
3724             if (useeit) {
3725 /*JP
3726                 pline("%s is blinded by the flash!", Monnam(mtmp));
3727 */
3728                 pline("%s\82Í\91M\8cõ\82Å\96Ú\82ª\8c©\82¦\82È\82­\82È\82Á\82½\81I", Monnam(mtmp));
3729                 res = 1;
3730             }
3731             if (mtmp->data == &mons[PM_GREMLIN]) {
3732                 /* Rule #1: Keep them out of the light. */
3733                 amt = otmp->otyp == WAN_LIGHT ? d(1 + otmp->spe, 4)
3734                                               : rn2(min(mtmp->mhp, 4));
3735                 light_hits_gremlin(mtmp, amt);
3736             }
3737             if (!DEADMONSTER(mtmp)) {
3738                 if (!context.mon_moving)
3739                     setmangry(mtmp, TRUE);
3740                 if (tmp < 9 && !mtmp->isshk && rn2(4))
3741                     monflee(mtmp, rn2(4) ? rnd(100) : 0, FALSE, TRUE);
3742                 mtmp->mcansee = 0;
3743                 mtmp->mblinded = (tmp < 3) ? 0 : rnd(1 + 50 / tmp);
3744             }
3745         }
3746     }
3747     return res;
3748 }
3749
3750 void
3751 light_hits_gremlin(mon, dmg)
3752 struct monst *mon;
3753 int dmg;
3754 {
3755 #if 0 /*JP*/
3756     pline("%s %s!", Monnam(mon),
3757           (dmg > mon->mhp / 2) ? "wails in agony" : "cries out in pain");
3758 #else
3759     pline("%s\82Í%s\81I", Monnam(mon),
3760           (dmg > mon->mhp / 2) ? "\8bê\92É\82Ì\90º\82ð\82 \82°\82½" : "\8c\83\92É\82Å\8b©\82ñ\82¾");
3761 #endif
3762     mon->mhp -= dmg;
3763     wake_nearto(mon->mx, mon->my, 30);
3764     if (DEADMONSTER(mon)) {
3765         if (context.mon_moving)
3766             monkilled(mon, (char *) 0, AD_BLND);
3767         else
3768             killed(mon);
3769     } else if (cansee(mon->mx, mon->my) && !canspotmon(mon)) {
3770         map_invisible(mon->mx, mon->my);
3771     }
3772 }
3773
3774 /*uhitm.c*/