1 /* NetHack 3.6 mhitu.c $NHDT-Date: 1513297347 2017/12/15 00:22:27 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.149 $ */
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. */
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. */
14 STATIC_VAR NEARDATA struct obj *mon_currwep = (struct obj *) 0;
16 STATIC_DCL boolean FDECL(u_slip_free, (struct monst *, struct attack *));
17 STATIC_DCL int FDECL(passiveum, (struct permonst *, struct monst *,
19 STATIC_DCL void FDECL(mayberem, (struct obj *, const char *));
20 STATIC_DCL boolean FDECL(diseasemu, (struct permonst *));
21 STATIC_DCL int FDECL(hitmu, (struct monst *, struct attack *));
22 STATIC_DCL int FDECL(gulpmu, (struct monst *, struct attack *));
23 STATIC_DCL int FDECL(explmu, (struct monst *, struct attack *, BOOLEAN_P));
24 STATIC_DCL void FDECL(missmu, (struct monst *, BOOLEAN_P, struct attack *));
25 STATIC_DCL void FDECL(mswings, (struct monst *, struct obj *));
26 STATIC_DCL void FDECL(wildmiss, (struct monst *, struct attack *));
27 STATIC_DCL void FDECL(hitmsg, (struct monst *, struct attack *));
29 /* See comment in mhitm.c. If we use this a lot it probably should be */
30 /* changed to a parameter to mhitu. */
40 char *Monst_name = Monnam(mtmp);
42 /* Note: if opposite gender, "seductively" */
43 /* If same gender, "engagingly" for nymph, normal msg for others */
44 if ((compat = could_seduce(mtmp, &youmonst, mattk)) != 0
45 && !mtmp->mcan && !mtmp->mspec_used) {
47 pline("%s %s you %s.", Monst_name,
48 Blind ? "talks to" : "smiles at",
49 (compat == 2) ? "engagingly" : "seductively");
51 pline("%s
\82Í
\82 \82È
\82½%s%s
\81D", Monst_name,
52 (compat == 2) ? "
\82ð
\88ø
\82«
\82Â
\82¯
\82é
\82æ
\82¤
\82É" : "
\82É
\8dD
\88Ó
\82ð
\82æ
\82¹
\82é
\82æ
\82¤
\82É",
53 Blind ? "
\98b
\82µ
\82©
\82¯
\82½" : "
\94÷
\8fÎ
\82ñ
\82¾");
56 switch (mattk->aatyp) {
61 pfmt = "%s
\82Í
\8a\9a\82Ý
\82Â
\82¢
\82½
\81I";
65 pline("%s kicks%c", Monst_name,
66 thick_skinned(youmonst.data) ? '.' : '!');
68 pline("%s
\82Í
\8fR
\82Æ
\82Î
\82µ
\82½%s",Monnam(mtmp),
69 thick_skinned(youmonst.data) ? "
\81D" : "
\81I");
76 pfmt = "%s
\82Í
\93Ë
\82«
\82³
\82µ
\82½
\81I";
82 pfmt = "%s
\82Í
\93ª
\93Ë
\82«
\82ð
\82
\82ç
\82í
\82µ
\82½
\81I";
86 pfmt = "%s touches you!";
88 pfmt = "%s
\82Í
\82 \82È
\82½
\82É
\90G
\82ê
\82½
\81I";
92 pfmt = "%s tentacles suck you!";
94 pfmt = "%s
\82Ì
\90G
\8eè
\82ª
\82 \82È
\82½
\82Ì
\91Ì
\89t
\82ð
\8bz
\82¢
\82Æ
\82Á
\82½
\81I";
96 Monst_name = s_suffix(Monst_name);
102 pfmt = "%s explodes!";
104 pfmt = "%s
\82Í
\94\9a\94
\82µ
\82½
\81I";
110 pfmt = "%s
\82Ì
\8dU
\8c\82\82Í
\96½
\92\86\82µ
\82½
\81I";
113 pline(pfmt, Monst_name);
117 /* monster missed you */
119 missmu(mtmp, nearmiss, mattk)
122 struct attack *mattk;
124 if (!canspotmon(mtmp))
125 map_invisible(mtmp->mx, mtmp->my);
127 if (could_seduce(mtmp, &youmonst, mattk) && !mtmp->mcan)
129 pline("%s pretends to be friendly.", Monnam(mtmp));
131 pline("%s
\82Í
\97F
\8dD
\93I
\82È
\82Ó
\82è
\82ð
\82µ
\82Ä
\82¢
\82é
\81D",Monnam(mtmp));
134 pline("%s %smisses!", Monnam(mtmp),
135 (nearmiss && flags.verbose) ? "just " : "");
137 pline("%s
\82Ì
\8dU
\8c\82\82Í%s
\82½
\81D", Monnam(mtmp),
138 (nearmiss && flags.verbose) ? "
\8bó
\82ð
\90Ø
\82Á" : "
\82Í
\82¸
\82ê");
144 /* monster swings obj */
150 if (flags.verbose && !Blind && mon_visible(mtmp)) {
152 pline("%s %s %s%s %s.", Monnam(mtmp),
153 (objects[otemp->otyp].oc_dir & PIERCE) ? "thrusts" : "swings",
154 (otemp->quan > 1L) ? "one of " : "", mhis(mtmp), xname(otemp));
156 pline("%s
\82Í%s%s
\81D", Monnam(mtmp),
158 (objects[otemp->otyp].oc_dir & PIERCE) ? "
\82ð
\93Ë
\82¢
\82½" : "
\82ð
\90U
\82è
\82Ü
\82í
\82µ
\82½");
163 /* return how a poison attack was delivered */
165 mpoisons_subj(mtmp, mattk)
167 struct attack *mattk;
169 if (mattk->aatyp == AT_WEAP) {
170 struct obj *mwep = (mtmp == &youmonst) ? uwep : MON_WEP(mtmp);
171 /* "Foo's attack was poisoned." is pretty lame, but at least
172 it's better than "sting" when not a stinging attack... */
174 return (!mwep || !mwep->opoisoned) ? "attack" : "weapon";
176 return (!mwep || !mwep->opoisoned) ? "
\8dU
\8c\82" : "
\95\90\8aí";
179 return (mattk->aatyp == AT_TUCH) ? "contact"
180 : (mattk->aatyp == AT_GAZE) ? "gaze"
181 : (mattk->aatyp == AT_BITE) ? "bite" : "sting";
183 return (mattk->aatyp == AT_TUCH) ? "
\90Ú
\90G"
184 : (mattk->aatyp == AT_GAZE) ? "
\82É
\82ç
\82Ý"
185 : (mattk->aatyp == AT_BITE) ? "
\8a\9a\82Ý
\82Â
\82«" : "
\93Ë
\82«
\82³
\82µ";
190 /* called when your intrinsic speed is taken away */
199 You("
\93®
\82«
\82ª
\92x
\82
\82È
\82Á
\82½
\81D");
200 else /* speed boots */
202 Your("quickness feels less natural.");
204 You("
\91¬
\82³
\82É
\82Â
\82¢
\82Ä
\82¢
\82¯
\82È
\82
\82È
\82Á
\82½
\81D");
205 exercise(A_DEX, FALSE);
208 /* monster attacked your displaced image */
210 wildmiss(mtmp, mattk)
212 struct attack *mattk;
215 const char *Monst_name; /* Monnam(mtmp) */
217 /* no map_invisible() -- no way to tell where _this_ is coming from */
221 if (!cansee(mtmp->mx, mtmp->my))
223 /* maybe it's attacking an image around the corner? */
225 compat = ((mattk->adtyp == AD_SEDU || mattk->adtyp == AD_SSEX)
226 && could_seduce(mtmp, &youmonst, (struct attack *) 0));
227 Monst_name = Monnam(mtmp);
229 if (!mtmp->mcansee || (Invis && !perceives(mtmp->data))) {
231 const char *swings = (mattk->aatyp == AT_BITE) ? "snaps"
232 : (mattk->aatyp == AT_KICK) ? "kicks"
233 : (mattk->aatyp == AT_STNG
234 || mattk->aatyp == AT_BUTT
235 || nolimbs(mtmp->data)) ? "lunges"
238 const char *swings = (mattk->aatyp == AT_BITE) ? "
\8a\9a\82Ý
\82Â
\82"
239 : (mattk->aatyp == AT_KICK) ? "
\8fR
\82Æ
\82Î
\82·"
240 : (mattk->aatyp == AT_STNG
241 || mattk->aatyp == AT_BUTT
242 || nolimbs(mtmp->data)) ? "
\93Ë
\90i
\82·
\82é"
243 : "
\90U
\82è
\89ñ
\82·";
248 pline("%s tries to touch you and misses!", Monst_name);
250 pline("%s
\82Í
\82 \82È
\82½
\82É
\90G
\82ë
\82¤
\82Æ
\82µ
\82½
\82ª
\8e¸
\94s
\82µ
\82½
\81I", Monst_name);
255 pline("%s %s wildly and misses!", Monst_name, swings);
257 pline("%s
\82Í
\8c\83\82µ
\82%s
\82ª
\81C
\82Í
\82¸
\82µ
\82½
\81I", Monst_name, swings);
261 pline("%s attacks a spot beside you.", Monst_name);
263 pline("%s
\82Ì
\8dU
\8c\82\82Í
\82 \82È
\82½
\82Ì
\98e
\95 \82ð
\82©
\82·
\82ß
\82½
\81D", Monst_name);
267 pline("%s strikes at %s!", Monst_name,
268 (levl[mtmp->mux][mtmp->muy].typ == WATER)
272 pline("%s
\82Í%s
\82ð
\91Å
\82¿
\82Â
\82¯
\82½
\81I", Monst_name,
273 (levl[mtmp->mux][mtmp->muy].typ == WATER)
275 : "
\89½
\82à
\82È
\82¢
\82Æ
\82±
\82ë");
280 pline("%s %s wildly!", Monst_name, swings);
282 pline("%s
\82Í
\8c\83\82µ
\82%s
\81I", Monst_name, swings);
286 } else if (Displaced) {
289 pline("%s smiles %s at your %sdisplaced image...", Monst_name,
290 (compat == 2) ? "engagingly" : "seductively",
291 Invis ? "invisible " : "");
293 pline("%s
\82Í%s
\82 \82È
\82½
\82Ì
\8c¶
\89e
\82É
\91Î
\82µ
\82Ä%s
\94÷
\8fÎ
\82ñ
\82¾
\81D
\81D
\81D", Monst_name,
294 Invis ? "
\93§
\96¾
\82È" : "",
295 (compat == 2) ? "
\96£
\97Í
\93I
\82É" : "
\97U
\98f
\93I
\82É");
299 pline("%s strikes at your %sdisplaced image and misses you!",
300 /* Note: if you're both invisible and displaced,
301 * only monsters which see invisible will attack your
302 * displaced image, since the displaced image is also
305 Monst_name, Invis ? "invisible " : "");
307 pline("%s
\82Í
\82 \82È
\82½
\82Ì%s
\8c¶
\89e
\82ð
\8dU
\8c\82\82µ
\81C
\82Í
\82¸
\82µ
\82½
\81I",
308 Monst_name, Invis ? "
\93§
\96¾
\82È" : "");
311 } else if (Underwater) {
312 /* monsters may miss especially on water level where
313 bubbles shake the player here and there */
316 pline("%s reaches towards your distorted image.", Monst_name);
318 pline("%s
\82Í
\82 \82È
\82½
\82Ì
\98c
\82ñ
\82¾
\8c¶
\89e
\82Ì
\95û
\82Ö
\8cü
\82©
\82Á
\82½
\81D", Monst_name);
321 pline("%s is fooled by water reflections and misses!",
323 pline("%s
\82Í
\90\85\82Ì
\94½
\8eË
\82É
\82¾
\82Ü
\82³
\82ê
\81C
\82Í
\82¸
\82µ
\82½
\81I",
327 impossible("%s attacks you without knowing your location?",
332 expels(mtmp, mdat, message)
334 struct permonst *mdat; /* if mtmp is polymorphed, mdat != mtmp->data */
338 if (is_animal(mdat)) {
340 You("get regurgitated!");
342 You("
\93f
\82«
\82¾
\82³
\82ê
\82½
\81I");
345 struct attack *attk = attacktype_fordmg(mdat, AT_ENGL, AD_ANY);
349 impossible("Swallower has no engulfing attack?");
351 if (is_whirly(mdat)) {
352 switch (attk->adtyp) {
355 Strcpy(blast, " in a shower of sparks");
357 Strcpy(blast, "
\82Ì
\89Î
\89Ô
\82Ì
\89J
\82Ì
\92\86\82©
\82ç");
361 Strcpy(blast, " in a blast of frost");
363 Strcpy(blast, "
\82Ì
\97â
\8bC
\82Ì
\95\97\82Ì
\92\86\82©
\82ç");
368 Strcpy(blast, " with a squelch");
370 Strcpy(blast, "
\82©
\82ç
\93f
\82«
\8fo
\82³
\82ê
\82é
\82æ
\82¤
\82É");
373 You("get expelled from %s%s!", mon_nam(mtmp), blast);
375 You("%s%s
\92E
\8fo
\82µ
\82½
\81I", mon_nam(mtmp), blast);
379 unstuck(mtmp); /* ball&chain returned in unstuck() */
383 /* to cover for a case where mtmp is not in a next square */
384 if (um_dist(mtmp->mx, mtmp->my, 1))
386 pline("Brrooaa... You land hard at some distance.");
388 pline("
\83u
\83\8d\83\8d\83\8d\81D
\81D
\89\93\82
\82É
\92\85\97¤
\82·
\82é
\82Ì
\82Í
\93ï
\82µ
\82¢
\81D");
391 /* select a monster's next attack, possibly substituting for its usual one */
393 getmattk(magr, mdef, indx, prev_result, alt_attk_buf)
394 struct monst *magr, *mdef;
395 int indx, prev_result[];
396 struct attack *alt_attk_buf;
398 struct permonst *mptr = magr->data;
399 struct attack *attk = &mptr->mattk[indx];
400 struct obj *weap = (magr == &youmonst) ? uwep : MON_WEP(magr);
402 /* prevent a monster with two consecutive disease or hunger attacks
403 from hitting with both of them on the same turn; if the first has
404 already hit, switch to a stun attack for the second */
405 if (indx > 0 && prev_result[indx - 1] > 0
406 && (attk->adtyp == AD_DISE || attk->adtyp == AD_PEST
407 || attk->adtyp == AD_FAMN)
408 && attk->adtyp == mptr->mattk[indx - 1].adtyp) {
409 *alt_attk_buf = *attk;
411 attk->adtyp = AD_STUN;
413 /* make drain-energy damage be somewhat in proportion to energy */
414 } else if (attk->adtyp == AD_DREN && mdef == &youmonst) {
415 int ulev = max(u.ulevel, 6);
417 *alt_attk_buf = *attk;
419 /* 3.6.0 used 4d6 but since energy drain came out of max energy
420 once current energy was gone, that tended to have a severe
421 effect on low energy characters; it's now 2d6 with ajustments */
422 if (u.uen <= 5 * ulev && attk->damn > 1) {
423 attk->damn -= 1; /* low energy: 2d6 -> 1d6 */
424 if (u.uenmax <= 2 * ulev && attk->damd > 3)
425 attk->damd -= 3; /* very low energy: 1d6 -> 1d3 */
426 } else if (u.uen > 12 * ulev) {
427 attk->damn += 1; /* high energy: 2d6 -> 3d6 */
428 if (u.uenmax > 20 * ulev)
429 attk->damd += 3; /* very high energy: 3d6 -> 3d9 */
430 /* note: 3d9 is slightly higher than previous 4d6 */
433 } else if (attk->aatyp == AT_ENGL && magr->mspec_used) {
434 /* can't re-engulf yet; switch to simpler attack */
435 *alt_attk_buf = *attk;
437 if (attk->adtyp == AD_ACID || attk->adtyp == AD_ELEC
438 || attk->adtyp == AD_COLD || attk->adtyp == AD_FIRE) {
439 attk->aatyp = AT_TUCH;
441 attk->aatyp = AT_CLAW; /* attack message will be "<foo> hits" */
442 attk->adtyp = AD_PHYS;
444 attk->damn = 1; /* relatively weak: 1d6 */
447 /* barrow wight, Nazgul, erinys have weapon attack for non-physical
448 damage; force physical damage if attacker has been cancelled or
449 if weapon is sufficiently interesting; a few unique creatures
450 have two weapon attacks where one does physical damage and other
451 doesn't--avoid forcing physical damage for those */
452 } else if (indx == 0 && magr != &youmonst
453 && attk->aatyp == AT_WEAP && attk->adtyp != AD_PHYS
454 && !(mptr->mattk[1].aatyp == AT_WEAP
455 && mptr->mattk[1].adtyp == AD_PHYS)
457 || (weap && ((weap->otyp == CORPSE
458 && touch_petrifies(&mons[weap->corpsenm]))
459 || weap->oartifact == ART_STORMBRINGER
460 || weap->oartifact == ART_VORPAL_BLADE)))) {
461 *alt_attk_buf = *attk;
463 attk->adtyp = AD_PHYS;
469 * mattacku: monster attacks you
470 * returns 1 if monster dies (e.g. "yellow light"), 0 otherwise
471 * Note: if you're displaced or invisible the monster might attack the
473 * Assumption: it's attacking you or an empty square; if there's another
474 * monster which it attacks by mistake, the caller had better
479 register struct monst *mtmp;
481 struct attack *mattk, alt_attk;
482 int i, j = 0, tmp, sum[NATTK];
483 struct permonst *mdat = mtmp->data;
484 boolean ranged = (distu(mtmp->mx, mtmp->my) > 3);
485 /* Is it near you? Affects your actions */
486 boolean range2 = !monnear(mtmp, mtmp->mux, mtmp->muy);
487 /* Does it think it's near you? Affects its actions */
488 boolean foundyou = (mtmp->mux == u.ux && mtmp->muy == u.uy);
489 /* Is it attacking you or your image? */
490 boolean youseeit = canseemon(mtmp);
491 /* Might be attacking your image around the corner, or
492 * invisible, or you might be blind....
494 boolean skipnonmagc = FALSE;
495 /* Are further physical attack attempts useless? */
499 if (mtmp->mhp <= 0 || (Underwater && !is_swimmer(mtmp->data)))
502 /* If swallowed, can only be affected by u.ustuck */
504 if (mtmp != u.ustuck)
506 u.ustuck->mux = u.ux;
507 u.ustuck->muy = u.uy;
511 return 0; /* stomachs can't hurt you! */
513 } else if (u.usteed) {
514 if (mtmp == u.usteed)
515 /* Your steed won't attack you */
517 /* Orcs like to steal and eat horses and the like */
518 if (!rn2(is_orc(mtmp->data) ? 2 : 4)
519 && distu(mtmp->mx, mtmp->my) <= 2) {
520 /* Attack your steed instead */
521 i = mattackm(mtmp, u.usteed);
522 if ((i & MM_AGR_DIED))
524 /* make sure steed is still alive and within range */
525 if ((i & MM_DEF_DIED) || !u.usteed
526 || distu(mtmp->mx, mtmp->my) > 2)
528 /* Let your steed retaliate */
529 return !!(mattackm(u.usteed, mtmp) & MM_DEF_DIED);
533 if (u.uundetected && !range2 && foundyou && !u.uswallow) {
534 if (!canspotmon(mtmp))
535 map_invisible(mtmp->mx, mtmp->my);
537 if (is_hider(youmonst.data) && u.umonnum != PM_TRAPPER) {
539 coord cc; /* maybe we need a unexto() function? */
543 You("fall from the %s!", ceiling(u.ux, u.uy));
545 You("%s
\82©
\82ç
\97\8e\82¿
\82½
\81I", ceiling(u.ux,u.uy));
546 /* take monster off map now so that its location
547 is eligible for placing hero; we assume that a
548 removed monster remembers its old spot <mx,my> */
549 remove_monster(mtmp->mx, mtmp->my);
550 if (!enexto(&cc, u.ux, u.uy, youmonst.data)
551 /* a fish won't voluntarily swap positions
552 when it's in water and hero is over land */
553 || (mtmp->data->mlet == S_EEL
554 && is_pool(mtmp->mx, mtmp->my)
555 && !is_pool(u.ux, u.uy))) {
556 /* couldn't find any spot for hero; this used to
557 kill off attacker, but now we just give a "miss"
558 message and keep both mtmp and hero at their
559 original positions; hero has become unconcealed
560 so mtmp's next move will be a regular attack */
561 place_monster(mtmp, mtmp->mx, mtmp->my); /* put back */
562 newsym(u.ux, u.uy); /* u.uundetected was toggled */
564 pline("%s draws back as you drop!", Monnam(mtmp));
566 pline("
\82 \82È
\82½
\82ª
\97\8e\82¿
\82é
\82±
\82Æ
\82Å%s
\82Í
\88ø
\82«
\96ß
\82³
\82ê
\82½
\81I", Monnam(mtmp));
570 /* put mtmp at hero's spot and move hero to <cc.x,.y> */
571 newsym(mtmp->mx, mtmp->my); /* finish removal */
572 place_monster(mtmp, u.ux, u.uy);
575 /* tail hasn't grown, so if it now occupies <cc.x,.y>
576 then one of its original spots must be free */
577 if (m_at(cc.x, cc.y))
578 (void) enexto(&cc, u.ux, u.uy, youmonst.data);
580 teleds(cc.x, cc.y, TRUE); /* move hero */
584 if (youmonst.data->mlet != S_PIERCER)
585 return 0; /* lurkers don't attack */
587 obj = which_armor(mtmp, WORN_HELMET);
588 if (obj && is_metallic(obj)) {
590 Your("blow glances off %s %s.", s_suffix(mon_nam(mtmp)),
591 helm_simple_name(obj));
593 Your("
\8dU
\8c\82\82Í%s
\82Ì%s
\82ð
\82©
\82·
\82ß
\82½
\82¾
\82¯
\82¾
\82Á
\82½
\81D", mon_nam(mtmp),
594 helm_simple_name(obj));
597 if (3 + find_mac(mtmp) <= rnd(20)) {
599 pline("%s is hit by a falling piercer (you)!",
601 pline("%s
\82Í
\97\8e\82¿
\82Ä
\82«
\82½
\90j(
\82 \82È
\82½)
\82Å
\8f\9d\82Â
\82¢
\82½
\81I",
603 if ((mtmp->mhp -= d(3, 6)) < 1)
607 pline("%s is almost hit by a falling piercer (you)!",
609 pline("%s
\82Í
\82à
\82¤
\8f
\82µ
\82Å
\97\8e\82¿
\82Ä
\82«
\82½
\90j(
\82 \82È
\82½)
\82Å
\8f\9d\82Â
\82
\82Æ
\82±
\82ë
\82¾
\82Á
\82½
\81I",
617 pline("It tries to move where you are hiding.");
619 pline("
\89½
\8eÒ
\82©
\82ª
\82 \82È
\82½
\82ª
\89B
\82ê
\82Ä
\82¢
\82é
\82Æ
\82±
\82ë
\82ð
\88Ú
\93®
\82µ
\82æ
\82¤
\82Æ
\82µ
\82½
\81D");
621 /* Ugly kludge for eggs. The message is phrased so as
622 * to be directed at the monster, not the player,
623 * which makes "laid by you" wrong. For the
624 * parallelism to work, we can't rephrase it, so we
625 * zap the "laid by you" momentarily instead.
627 struct obj *obj = level.objects[u.ux][u.uy];
629 if (obj || u.umonnum == PM_TRAPPER
630 || (youmonst.data->mlet == S_EEL
631 && is_pool(u.ux, u.uy))) {
632 int save_spe = 0; /* suppress warning */
636 if (obj->otyp == EGG)
639 /* note that m_monnam() overrides hallucination, which is
640 what we want when message is from mtmp's perspective */
641 if (youmonst.data->mlet == S_EEL
642 || u.umonnum == PM_TRAPPER)
645 "Wait, %s! There's a hidden %s named %s there!",
646 m_monnam(mtmp), youmonst.data->mname, plname);
648 "
\91Ò
\82Ä
\81C%s
\81I%s
\82Æ
\82¢
\82¤
\96¼
\82Ì%s
\82ª
\89B
\82ê
\82Ä
\82¢
\82é
\81I",
649 m_monnam(mtmp), plname, youmonst.data->mname);
654 "Wait, %s! There's a %s named %s hiding under %s!",
655 m_monnam(mtmp), youmonst.data->mname, plname,
656 doname(level.objects[u.ux][u.uy]));
658 "
\91Ò
\82Ä
\81C%s
\81I%s
\82Æ
\82¢
\82¤
\96¼
\82Ì%s
\82ª%s
\82Ì
\89º
\82É
\89B
\82ê
\82Ä
\82¢
\82é
\81I",
659 m_monnam(mtmp), plname, youmonst.data->mname,
660 doname(level.objects[u.ux][u.uy]));
665 impossible("hiding under nothing?");
672 /* hero might be a mimic, concealed via #monster */
673 if (youmonst.data->mlet == S_MIMIC && youmonst.m_ap_type && !range2
674 && foundyou && !u.uswallow) {
675 boolean sticky = sticks(youmonst.data);
677 if (!canspotmon(mtmp))
678 map_invisible(mtmp->mx, mtmp->my);
679 if (sticky && !youseeit)
681 pline("It gets stuck on you.");
683 pline("
\89½
\8eÒ
\82©
\82ª
\82 \82È
\82½
\82Ì
\8fã
\82É
\82Ì
\82µ
\82©
\82©
\82Á
\82½
\81D");
684 else /* see note about m_monnam() above */
686 pline("Wait, %s! That's a %s named %s!", m_monnam(mtmp),
687 youmonst.data->mname, plname);
689 pline("
\91Ò
\82Ä
\81C%s
\81I
\82»
\82ê
\82Í%s
\82Æ
\82¢
\82¤
\96¼
\82Ì%s
\82¾
\81I", m_monnam(mtmp),
690 plname, youmonst.data->mname);
694 youmonst.m_ap_type = M_AP_NOTHING;
695 youmonst.mappearance = 0;
700 /* non-mimic hero might be mimicking an object after eating m corpse */
701 if (youmonst.m_ap_type == M_AP_OBJECT && !range2 && foundyou
703 if (!canspotmon(mtmp))
704 map_invisible(mtmp->mx, mtmp->my);
707 pline("%s %s!", Something, (likes_gold(mtmp->data)
708 && youmonst.mappearance == GOLD_PIECE)
709 ? "tries to pick you up"
712 pline("%s
\82Í%s
\81I", Something, (likes_gold(mtmp->data)
713 && youmonst.mappearance == GOLD_PIECE)
714 ? "
\82 \82È
\82½
\82ð
\8fE
\82¨
\82¤
\82Æ
\82µ
\82½"
715 : "
\96³
\8e\8b\82µ
\82½");
717 else /* see note about m_monnam() above */
719 pline("Wait, %s! That %s is really %s named %s!", m_monnam(mtmp),
720 mimic_obj_name(&youmonst), an(mons[u.umonnum].mname),
723 pline("
\91Ò
\82Ä
\81C%s
\81I
\82»
\82Ì%s
\82Í%s
\82Æ
\82¢
\82¤
\96¼
\82Ì%s
\82¾
\81I", m_monnam(mtmp),
724 mimic_obj_name(&youmonst), plname,
725 mons[u.umonnum].mname);
727 if (multi < 0) { /* this should always be the case */
731 Sprintf(buf, "You appear to be %s again.",
732 Upolyd ? (const char *) an(youmonst.data->mname)
733 : (const char *) "yourself");
735 Sprintf(buf, "
\82 \82È
\82½
\82Í
\82Ó
\82½
\82½
\82Ñ%s
\82É
\82È
\82Á
\82½
\81D",
736 Upolyd ? (const char *) youmonst.data->mname
737 : (const char *) "
\8e©
\95ª
\8e©
\90g");
739 unmul(buf); /* immediately stop mimicking */
744 /* Work out the armor class differential */
745 tmp = AC_VALUE(u.uac) + 10; /* tmp ~= 0 - 20 */
749 if ((Invis && !perceives(mdat)) || !mtmp->mcansee)
756 /* make eels visible the moment they hit/miss us */
757 if (mdat->mlet == S_EEL && mtmp->minvis && cansee(mtmp->mx, mtmp->my)) {
759 newsym(mtmp->mx, mtmp->my);
762 /* Special demon handling code */
763 if ((mtmp->cham == NON_PM) && is_demon(mdat) && !range2
764 && mtmp->data != &mons[PM_BALROG] && mtmp->data != &mons[PM_SUCCUBUS]
765 && mtmp->data != &mons[PM_INCUBUS])
766 if (!mtmp->mcan && !rn2(13))
767 (void) msummon(mtmp);
769 /* Special lycanthrope handling code */
770 if ((mtmp->cham == NON_PM) && is_were(mdat) && !range2) {
771 if (is_human(mdat)) {
772 if (!rn2(5 - (night() * 2)) && !mtmp->mcan)
774 } else if (!rn2(30) && !mtmp->mcan)
778 if (!rn2(10) && !mtmp->mcan) {
779 int numseen, numhelp;
781 char buf[BUFSZ], genericwere[BUFSZ];
783 char genericwere[BUFSZ];
787 Strcpy(genericwere, "creature");
789 Strcpy(genericwere, "
\89½
\82©");
790 numhelp = were_summon(mdat, FALSE, &numseen, genericwere);
793 pline("%s summons help!", Monnam(mtmp));
795 pline("%s
\82Í
\8f\95\82¯
\82ð
\8cÄ
\82ñ
\82¾
\81I", Monnam(mtmp));
799 You_feel("hemmed in.");
801 pline("
\89½
\8eÒ
\82©
\82É
\88Í
\82Ü
\82ê
\82½
\82æ
\82¤
\82È
\8bC
\82ª
\82·
\82é
\81D");
804 pline("But none comes.");
806 pline("
\82µ
\82©
\82µ
\89½
\82à
\97\88\82È
\82©
\82Á
\82½
\81D");
808 const char *from_nowhere;
812 pline("%s %s!", Something, makeplural(growl_sound(mtmp)));
814 pline("
\89½
\82©
\82ª%s
\81I", growl_sound(mtmp));
818 from_nowhere = " from nowhere";
820 from_nowhere = "
\82Ç
\82±
\82©
\82ç
\82Æ
\82à
\82È
\82";
824 You_feel("hemmed in.");
826 pline("
\89½
\8eÒ
\82©
\82É
\88Í
\82Ü
\82ê
\82½
\82æ
\82¤
\82È
\8bC
\82ª
\82·
\82é
\81D");
830 Sprintf(buf, "%s appears", an(genericwere));
832 Sprintf(buf, "%s appear",
833 makeplural(genericwere));
834 pline("%s%s!", upstart(buf), from_nowhere);
836 pline("%s
\82ª%s
\8c»
\82ê
\82½
\81I",
837 genericwere, from_nowhere);
840 } /* else no help came; but you didn't know it tried */
845 if (u.uinvulnerable) {
846 /* monsters won't attack you */
847 if (mtmp == u.ustuck)
849 pline("%s loosens its grip slightly.", Monnam(mtmp));
851 pline("%s
\82Í
\92÷
\82ß
\82Â
\82¯
\82ð
\82í
\82¸
\82©
\82É
\8aÉ
\82ß
\82½
\81D", Monnam(mtmp));
853 if (youseeit || sensemon(mtmp))
855 pline("%s starts to attack you, but pulls back.",
857 pline("%s
\82Í
\82 \82È
\82½
\82ð
\8dU
\8c\82\82µ
\82©
\82¯
\82½
\82ª
\81C
\82Ð
\82Á
\82±
\82ß
\82½
\81D",
861 You_feel("%s move nearby.", something);
863 pline("
\89½
\8eÒ
\82©
\82ª
\82 \82È
\82½
\82Ì
\82»
\82Î
\82ð
\92Ê
\82è
\82Ê
\82¯
\82½
\82æ
\82¤
\82È
\8bC
\82ª
\82µ
\82½
\81D");
868 /* Unlike defensive stuff, don't let them use item _and_ attack. */
869 if (find_offensive(mtmp)) {
870 int foo = use_offensive(mtmp);
876 for (i = 0; i < NATTK; i++) {
878 mon_currwep = (struct obj *)0;
879 mattk = getmattk(mtmp, &youmonst, i, sum, &alt_attk);
880 if ((u.uswallow && mattk->aatyp != AT_ENGL)
881 || (skipnonmagc && mattk->aatyp != AT_MAGC))
884 switch (mattk->aatyp) {
885 case AT_CLAW: /* "hand to hand" attacks */
892 if (!range2 && (!MON_WEP(mtmp) || mtmp->mconf || Conflict
893 || !touch_petrifies(youmonst.data))) {
895 if (tmp > (j = rnd(20 + i))) {
896 if (mattk->aatyp != AT_KICK
897 || !thick_skinned(youmonst.data))
898 sum[i] = hitmu(mtmp, mattk);
900 missmu(mtmp, (tmp == j), mattk);
902 wildmiss(mtmp, mattk);
903 /* skip any remaining non-spell attacks */
909 case AT_HUGS: /* automatic if prev two attacks succeed */
910 /* Note: if displaced, prev attacks never succeeded */
911 if ((!range2 && i >= 2 && sum[i - 1] && sum[i - 2])
913 sum[i] = hitmu(mtmp, mattk);
916 case AT_GAZE: /* can affect you either ranged or not */
917 /* Medusa gaze already operated through m_respond in
918 dochug(); don't gaze more than once per round. */
919 if (mdat != &mons[PM_MEDUSA])
920 sum[i] = gazemu(mtmp, mattk);
923 case AT_EXPL: /* automatic hit if next to, and aimed at you */
925 sum[i] = explmu(mtmp, mattk, foundyou);
932 || (!mtmp->mspec_used && tmp > (j = rnd(20 + i)))) {
933 /* force swallowing monster to be displayed
934 even when hero is moving away */
936 sum[i] = gulpmu(mtmp, mattk);
938 missmu(mtmp, (tmp == j), mattk);
940 } else if (is_animal(mtmp->data)) {
942 pline("%s gulps some air!", Monnam(mtmp));
944 pline("%s
\82Í
\91§
\82ð
\8bz
\82¢
\82±
\82ñ
\82¾
\81I", Monnam(mtmp));
948 pline("%s lunges forward and recoils!", Monnam(mtmp));
950 pline("%s
\82Í
\93Ë
\90i
\82µ
\81C
\96ß
\82Á
\82½
\81I", Monnam(mtmp));
953 You_hear("a %s nearby.",
954 is_whirly(mtmp->data) ? "rushing noise"
957 You_hear("
\82·
\82®
\82»
\82Î
\82Å%s
\89¹
\82ð
\95·
\82¢
\82½
\81D",
958 is_whirly(mtmp->data) ? "
\93Ë
\8c\82\82µ
\82Ä
\82
\82é"
959 : "
\83s
\83V
\83\83\83b
\82Æ
\82¢
\82¤");
966 sum[i] = breamu(mtmp, mattk);
967 /* Note: breamu takes care of displacement */
971 sum[i] = spitmu(mtmp, mattk);
972 /* Note: spitmu takes care of displacement */
976 if (!Is_rogue_level(&u.uz))
981 /* Rare but not impossible. Normally the monster
982 * wields when 2 spaces away, but it can be
983 * teleported or whatever....
985 if (mtmp->weapon_check == NEED_WEAPON || !MON_WEP(mtmp)) {
986 mtmp->weapon_check = NEED_HTH_WEAPON;
987 /* mon_wield_item resets weapon_check as appropriate */
988 if (mon_wield_item(mtmp) != 0)
992 mon_currwep = MON_WEP(mtmp);
994 hittmp = hitval(mon_currwep, &youmonst);
996 mswings(mtmp, mon_currwep);
998 if (tmp > (j = dieroll = rnd(20 + i)))
999 sum[i] = hitmu(mtmp, mattk);
1001 missmu(mtmp, (tmp == j), mattk);
1002 /* KMH -- Don't accumulate to-hit bonuses */
1006 wildmiss(mtmp, mattk);
1007 /* skip any remaining non-spell attacks */
1014 sum[i] = buzzmu(mtmp, mattk);
1016 sum[i] = castmu(mtmp, mattk, TRUE, foundyou);
1019 default: /* no attack */
1024 /* give player a chance of waking up before dying -kaa */
1025 if (sum[i] == 1) { /* successful attack */
1026 if (u.usleep && u.usleep < monstermoves && !rn2(10)) {
1029 nomovemsg = "The combat suddenly awakens you.";
1031 nomovemsg = "
\82 \82È
\82½
\82Í
\8bN
\82±
\82³
\82ê
\82½
\81D";
1035 return 1; /* attacker dead */
1037 break; /* attacker teleported, no more attacks */
1038 /* sum[i] == 0: unsuccessful attack */
1045 struct permonst *mdat;
1047 if (Sick_resistance) {
1049 You_feel("a slight illness.");
1051 You("
\82·
\82±
\82µ
\8bC
\95ª
\82ª
\88«
\82
\82È
\82Á
\82½
\82æ
\82¤
\82È
\8bC
\82ª
\82µ
\82½
\81D");
1054 make_sick(Sick ? Sick / 3L + 1L : (long) rn1(ACURR(A_CON), 20),
1055 mdat->mname, TRUE, SICK_NONVOMITABLE);
1060 /* check whether slippery clothing protects from hug or wrap attack */
1062 u_slip_free(mtmp, mattk)
1064 struct attack *mattk;
1066 struct obj *obj = (uarmc ? uarmc : uarm);
1070 if (mattk->adtyp == AD_DRIN)
1073 /* if your cloak/armor is greased, monster slips off; this
1074 protection might fail (33% chance) when the armor is cursed */
1075 if (obj && (obj->greased || obj->otyp == OILSKIN_CLOAK)
1076 && (!obj->cursed || rn2(3))) {
1078 pline("%s %s your %s %s!", Monnam(mtmp),
1079 (mattk->adtyp == AD_WRAP) ? "slips off of"
1080 : "grabs you, but cannot hold onto",
1081 obj->greased ? "greased" : "slippery",
1082 /* avoid "slippery slippery cloak"
1083 for undiscovered oilskin cloak */
1084 (obj->greased || objects[obj->otyp].oc_name_known)
1086 : cloak_simple_name(obj));
1088 pline("%s
\82Í%s%s%s
\81I", Monnam(mtmp),
1089 obj->greased ? "
\96û
\82Ì
\93h
\82ç
\82ê
\82½" : "
\8a\8a\82è
\82â
\82·
\82¢",
1090 (obj->greased || objects[obj->otyp].oc_name_known)
1092 : cloak_simple_name(obj),
1093 (mattk->adtyp == AD_WRAP) ? "
\82Å
\8a\8a\82Á
\82½"
1094 : "
\82ð
\82Â
\82©
\82Ü
\82¦
\82æ
\82¤
\82Æ
\82µ
\82½
\82ª
\81C
\82Å
\82«
\82È
\82©
\82Á
\82½");
1097 if (obj->greased && !rn2(2)) {
1099 pline_The("grease wears off.");
1101 pline("
\8e\89\82Í
\97\8e\82¿
\82Ä
\82µ
\82Ü
\82Á
\82½
\81D");
1110 /* armor that sufficiently covers the body might be able to block magic */
1118 boolean is_you = (mon == &youmonst),
1119 gotprot = is_you ? (EProtection != 0L)
1120 /* high priests have innate protection */
1121 : (mon->data == &mons[PM_HIGH_PRIEST]);
1123 for (o = is_you ? invent : mon->minvent; o; o = o->nobj) {
1124 /* a_can field is only applicable for armor (which must be worn) */
1125 if ((o->owornmask & W_ARMOR) != 0L) {
1126 armpro = objects[o->otyp].a_can;
1130 /* if we've already confirmed Protection, skip additional checks */
1131 if (is_you || gotprot)
1134 /* omit W_SWAPWEP+W_QUIVER; W_ART+W_ARTI handled by protects() */
1135 wearmask = W_ARMOR | W_ACCESSORY;
1136 if (o->oclass == WEAPON_CLASS || is_weptool(o))
1138 if (protects(o, ((o->owornmask & wearmask) != 0L) ? TRUE : FALSE))
1143 /* extrinsic Protection increases mc by 1 */
1146 } else if (mc < 1) {
1147 /* intrinsic Protection is weaker (play balance; obtaining divine
1148 protection is too easy); it confers minimum mc 1 instead of 0 */
1149 if ((is_you && ((HProtection && u.ublessed > 0) || u.uspellprot))
1150 /* aligned priests and angels have innate intrinsic Protection */
1151 || (mon->data == &mons[PM_ALIGNED_PRIEST] || is_minion(mon->data)))
1158 * hitmu: monster hits you
1159 * returns 2 if monster dies (e.g. "yellow light"), 1 otherwise
1160 * 3 if the monster lives but teleported/paralyzed, so it can't keep
1165 register struct monst *mtmp;
1166 register struct attack *mattk;
1168 struct permonst *mdat = mtmp->data;
1169 int uncancelled, ptmp;
1170 int dmg, armpro, permdmg;
1172 struct permonst *olduasmon = youmonst.data;
1175 if (!canspotmon(mtmp))
1176 map_invisible(mtmp->mx, mtmp->my);
1178 /* If the monster is undetected & hits you, you should know where
1179 * the attack came from.
1181 if (mtmp->mundetected && (hides_under(mdat) || mdat->mlet == S_EEL)) {
1182 mtmp->mundetected = 0;
1183 if (!(Blind ? Blind_telepat : Unblind_telepat)) {
1189 if ((obj = level.objects[mtmp->mx][mtmp->my]) != 0) {
1191 if (Blind && !obj->dknown)
1193 else if (is_pool(mtmp->mx, mtmp->my) && !Underwater)
1198 pline("%s was hidden under %s!", Amonnam(mtmp), what);
1200 if (Blind && !obj->dknown)
1201 pline("%s
\82ª
\89½
\82©
\82Ì
\89º
\82É
\89B
\82ê
\82Ä
\82¢
\82é
\81I", Amonnam(mtmp));
1202 else if (is_pool(mtmp->mx, mtmp->my) && !Underwater)
1203 pline("%s
\82ª
\90\85\92\86\82É
\89B
\82ê
\82Ä
\82¢
\82é
\81I", Amonnam(mtmp));
1205 pline("%s
\82ª%s
\82Ì
\89º
\82É
\89B
\82ê
\82Ä
\82¢
\82é
\81I", Amonnam(mtmp), doname(obj));
1208 newsym(mtmp->mx, mtmp->my);
1212 /* First determine the base damage done */
1213 dmg = d((int) mattk->damn, (int) mattk->damd);
1214 if ((is_undead(mdat) || is_vampshifter(mtmp)) && midnight())
1215 dmg += d((int) mattk->damn, (int) mattk->damd); /* extra damage */
1217 /* Next a cancellation factor.
1218 * Use uncancelled when cancellation factor takes into account certain
1219 * armor's special magic protection. Otherwise just use !mtmp->mcan.
1221 armpro = magic_negation(&youmonst);
1222 uncancelled = !mtmp->mcan && (rn2(10) >= 3 * armpro);
1225 /* Now, adjust damages via resistances or specific attacks */
1226 switch (mattk->adtyp) {
1228 if (mattk->aatyp == AT_HUGS && !sticks(youmonst.data)) {
1229 if (!u.ustuck && rn2(2)) {
1230 if (u_slip_free(mtmp, mattk)) {
1235 pline("%s grabs you!", Monnam(mtmp));
1237 pline("%s
\82É
\82Â
\82©
\82Ü
\82¦
\82ç
\82ê
\82Ä
\82¢
\82é
\81I", Monnam(mtmp));
1239 } else if (u.ustuck == mtmp) {
1240 exercise(A_STR, FALSE);
1242 You("are being %s.", (mtmp->data == &mons[PM_ROPE_GOLEM])
1246 You("%s
\82Ä
\82¢
\82é
\81D", (mtmp->data == &mons[PM_ROPE_GOLEM])
1247 ? "
\8eñ
\82ð
\8di
\82ß
\82ç
\82ê"
1248 : "
\89\9f\82µ
\82Â
\82Ô
\82³
\82ê");
1251 } else { /* hand to hand weapon */
1252 struct obj *otmp = mon_currwep;
1254 if (mattk->aatyp == AT_WEAP && otmp) {
1258 if (otmp->otyp == CORPSE
1259 && touch_petrifies(&mons[otmp->corpsenm])) {
1262 pline("%s hits you with the %s corpse.", Monnam(mtmp),
1263 mons[otmp->corpsenm].mname);
1265 pline("%s
\82Í%s
\82Ì
\8e\80\91Ì
\82Å
\8dU
\8c\82\82µ
\82½
\81D", Monnam(mtmp),
1266 mons[otmp->corpsenm].mname);
1271 dmg += dmgval(otmp, &youmonst);
1272 if ((marmg = which_armor(mtmp, W_ARMG)) != 0
1273 && marmg->otyp == GAUNTLETS_OF_POWER)
1274 dmg += rn1(4, 3); /* 3..6 */
1277 if (!(otmp->oartifact
1278 && artifact_hit(mtmp, &youmonst, otmp, &dmg, dieroll)))
1279 hitmsg(mtmp, mattk);
1282 if (objects[otmp->otyp].oc_material == SILVER
1285 pline_The("silver sears your flesh!");
1287 pline("
\82 \82È
\82½
\82Ì
\91Ì
\82Í
\8bâ
\82Å
\8fÄ
\82©
\82ê
\82½
\81I");
1288 exercise(A_CON, FALSE);
1290 /* this redundancy necessary because you have
1291 to take the damage _before_ being cloned;
1292 need to have at least 2 hp left to split */
1299 && (objects[otmp->otyp].oc_material == IRON
1300 /* relevant 'metal' objects are scalpel and tsurugi */
1301 || objects[otmp->otyp].oc_material == METAL)
1302 && (u.umonnum == PM_BLACK_PUDDING
1303 || u.umonnum == PM_BROWN_PUDDING)) {
1305 exercise(A_STR, FALSE);
1306 /* inflict damage now; we know it can't be fatal */
1309 dmg = 0; /* don't inflict more damage below */
1312 You("divide as %s hits you!", mon_nam(mtmp));
1314 pline("%s
\82Ì
\8dU
\8c\82\82É
\82æ
\82Á
\82Ä
\82 \82È
\82½
\82Í
\95ª
\97ô
\82µ
\82½
\81I", mon_nam(mtmp));
1316 rustm(&youmonst, otmp);
1317 } else if (mattk->aatyp != AT_TUCH || dmg != 0
1318 || mtmp != u.ustuck)
1319 hitmsg(mtmp, mattk);
1323 hitmsg(mtmp, mattk);
1324 if (!diseasemu(mdat))
1328 hitmsg(mtmp, mattk);
1331 pline("You're %s!", on_fire(youmonst.data, mattk));
1333 pline("
\82 \82È
\82½
\82Í%s
\81I", on_fire(youmonst.data, mattk));
1334 if (completelyburns(youmonst.data)) { /* paper or straw golem */
1336 You("go up in flames!");
1338 You("
\89\8a\82É
\95ï
\82Ü
\82ê
\82½
\81I");
1339 /* KMH -- this is okay with unchanging */
1342 } else if (Fire_resistance) {
1344 pline_The("fire doesn't feel hot!");
1346 pline("
\89Î
\82Í
\82º
\82ñ
\82º
\82ñ
\94M
\82
\82È
\82¢
\81I");
1349 if ((int) mtmp->m_lev > rn2(20))
1350 destroy_item(SCROLL_CLASS, AD_FIRE);
1351 if ((int) mtmp->m_lev > rn2(20))
1352 destroy_item(POTION_CLASS, AD_FIRE);
1353 if ((int) mtmp->m_lev > rn2(25))
1354 destroy_item(SPBOOK_CLASS, AD_FIRE);
1360 hitmsg(mtmp, mattk);
1363 pline("You're covered in frost!");
1365 You("
\95X
\82Å
\95¢
\82í
\82ê
\82½
\81I");
1366 if (Cold_resistance) {
1368 pline_The("frost doesn't seem cold!");
1370 pline("
\95X
\82Í
\97â
\82³
\82ð
\8a´
\82¶
\82³
\82¹
\82È
\82¢
\81I");
1373 if ((int) mtmp->m_lev > rn2(20))
1374 destroy_item(POTION_CLASS, AD_COLD);
1379 hitmsg(mtmp, mattk);
1384 You("
\93d
\8c\82\82ð
\82
\82ç
\82Á
\82½
\81I");
1385 if (Shock_resistance) {
1387 pline_The("zap doesn't shock you!");
1389 pline("
\93d
\8c\82\82Í
\82µ
\82Ñ
\82ê
\82ð
\8a´
\82¶
\82³
\82¹
\82È
\82¢
\81I");
1392 if ((int) mtmp->m_lev > rn2(20))
1393 destroy_item(WAND_CLASS, AD_ELEC);
1394 if ((int) mtmp->m_lev > rn2(20))
1395 destroy_item(RING_CLASS, AD_ELEC);
1400 hitmsg(mtmp, mattk);
1401 if (uncancelled && multi >= 0 && !rn2(5)) {
1402 if (Sleep_resistance)
1404 fall_asleep(-rnd(10), TRUE);
1407 You("are put to sleep!");
1409 You("
\96°
\82è
\82É
\82¨
\82¿
\82½
\81I");
1412 You("are put to sleep by %s!", mon_nam(mtmp));
1414 You("%s
\82É
\96°
\82ç
\82³
\82ê
\82½
\81I", mon_nam(mtmp));
1418 if (can_blnd(mtmp, &youmonst, mattk->aatyp, (struct obj *) 0)) {
1421 pline("%s blinds you!", Monnam(mtmp));
1423 pline("%s
\82Ì
\8dU
\8c\82\82Å
\96Ú
\82ª
\8c©
\82¦
\82È
\82
\82È
\82Á
\82½
\81I", Monnam(mtmp));
1424 make_blinded(Blinded + (long) dmg, FALSE);
1426 Your1(vision_clears);
1439 hitmsg(mtmp, mattk);
1440 if (uncancelled && !rn2(8)) {
1442 Sprintf(buf, "%s %s", s_suffix(Monnam(mtmp)),
1443 mpoisons_subj(mtmp, mattk));
1445 Sprintf(buf, "%s
\82Ì%s", Monnam(mtmp),
1446 mpoisons_subj(mtmp, mattk));
1448 poisoned(buf, ptmp, mdat->mname, 30, FALSE);
1452 hitmsg(mtmp, mattk);
1453 if (defends(AD_DRIN, uwep) || !has_head(youmonst.data)) {
1455 You("don't seem harmed.");
1457 You("
\8f\9d\82Â
\82¢
\82Ä
\82¢
\82È
\82¢
\82æ
\82¤
\82¾
\81D");
1458 /* Not clear what to do for green slimes */
1461 if (u_slip_free(mtmp, mattk))
1464 if (uarmh && rn2(8)) {
1465 /* not body_part(HEAD) */
1467 Your("%s blocks the attack to your head.",
1469 Your("%s
\82ª
\93ª
\82Ö
\82Ì
\8dU
\8c\82\82ð
\96h
\82¢
\82¾
\81D",
1470 helm_simple_name(uarmh));
1473 /* negative armor class doesn't reduce this damage */
1474 if (Half_physical_damage)
1475 dmg = (dmg + 1) / 2;
1476 mdamageu(mtmp, dmg);
1477 dmg = 0; /* don't inflict a second dose below */
1479 if (!uarmh || uarmh->otyp != DUNCE_CAP) {
1480 /* eat_brains() will miss if target is mindless (won't
1481 happen here; hero is considered to retain his mind
1482 regardless of current shape) or is noncorporeal
1483 (can't happen here; no one can poly into a ghost
1484 or shade) so this check for missing is academic */
1485 if (eat_brains(mtmp, &youmonst, TRUE, (int *) 0) == MM_MISS)
1488 /* adjattrib gives dunce cap message when appropriate */
1489 (void) adjattrib(A_INT, -rnd(2), FALSE);
1490 forget_levels(25); /* lose memory of 25% of levels */
1491 forget_objects(25); /* lose memory of 25% of objects */
1494 hitmsg(mtmp, mattk);
1495 if (uncancelled && multi >= 0 && !rn2(3)) {
1498 You("momentarily stiffen.");
1500 You("
\88ê
\8fu
\8dd
\92¼
\82µ
\82½
\81D");
1506 You("
\93®
\82¯
\82È
\82¢
\81I");
1509 You("are frozen by %s!", mon_nam(mtmp));
1511 pline("%s
\82É
\82æ
\82Á
\82Ä
\93®
\82¯
\82È
\82
\82È
\82Á
\82½
\81I", mon_nam(mtmp));
1512 nomovemsg = You_can_move_again;
1515 multi_reason = "paralyzed by a monster";
1517 multi_reason = "
\89ö
\95¨
\82É
\96\83á
\83\82³
\82¹
\82ç
\82ê
\82½
\8c\84\82É";
1518 exercise(A_DEX, FALSE);
1523 hitmsg(mtmp, mattk);
1524 if (uncancelled && !rn2(3) && !Drain_resistance) {
1526 losexp("life drainage");
1528 losexp("
\90¶
\96½
\97Í
\82ð
\8bz
\8eû
\82³
\82ê
\82Ä");
1532 long side = rn2(2) ? RIGHT_SIDE : LEFT_SIDE;
1534 const char *sidestr = (side == RIGHT_SIDE) ? "right" : "left",
1536 const char *sidestr = (side == RIGHT_SIDE) ? "
\89E" : "
\8d¶",
1537 *Monst_name = Monnam(mtmp), *leg = body_part(LEG);
1539 /* This case is too obvious to ignore, but Nethack is not in
1540 * general very good at considering height--most short monsters
1541 * still _can_ attack you when you're flying or mounted.
1542 * [FIXME: why can't a flying attacker overcome this?]
1544 if (u.usteed || Levitation || Flying) {
1546 pline("%s tries to reach your %s %s!", Monst_name, sidestr, leg);
1548 pline("%s
\82Í
\82 \82È
\82½
\82Ì%s%s
\82É
\8dU
\8c\82\82µ
\82æ
\82¤
\82Æ
\82µ
\82½
\81I", Monst_name, sidestr, leg);
1550 } else if (mtmp->mcan) {
1552 pline("%s nuzzles against your %s %s!", Monnam(mtmp),
1555 pline("%s
\82Í
\82 \82È
\82½
\82Ì%s%s
\82É
\95@
\82ð
\82·
\82è
\82æ
\82¹
\82½
\81I", Monnam(mtmp),
1561 if (rn2(2) && (uarmf->otyp == LOW_BOOTS
1562 || uarmf->otyp == IRON_SHOES)) {
1564 pline("%s pricks the exposed part of your %s %s!",
1565 Monst_name, sidestr, leg);
1567 pline("%s
\82Í
\82 \82È
\82½
\82Ì%s%s
\82ð
\82¿
\82
\82è
\82Æ
\8eh
\82µ
\82½
\81I",
1568 Monst_name, sidestr, leg);
1570 } else if (!rn2(5)) {
1572 pline("%s pricks through your %s boot!", Monst_name,
1575 pline("%s
\82Í
\82 \82È
\82½
\82Ì%s
\82Ì
\8cC
\82²
\82µ
\82É
\82¿
\82
\82è
\82Æ
\8eh
\82µ
\82½
\81I", Monst_name,
1580 pline("%s scratches your %s boot!", Monst_name,
1583 pline("%s
\82Í
\82 \82È
\82½
\82Ì%s
\82Ì
\8cC
\82ð
\82Ð
\82Á
\82©
\82¢
\82½
\81I", Monst_name,
1591 pline("%s pricks your %s %s!", Monst_name, sidestr, leg);
1593 pline("%s
\82Í
\82 \82È
\82½
\82Ì%s%s
\82ð
\82¿
\82
\82è
\82Æ
\8eh
\82µ
\82½
\81I", Monst_name, sidestr, leg);
1595 set_wounded_legs(side, rnd(60 - ACURR(A_DEX)));
1596 exercise(A_STR, FALSE);
1597 exercise(A_DEX, FALSE);
1601 case AD_STON: /* cockatrice */
1602 hitmsg(mtmp, mattk);
1607 You_hear("a cough from %s!", mon_nam(mtmp));
1609 You_hear("%s
\82ª
\83S
\83z
\83b
\83S
\83z
\83b
\82Æ
\82¢
\82¤
\89¹
\82ð
\95·
\82¢
\82½
\81I", mon_nam(mtmp));
1613 You_hear("%s hissing!", s_suffix(mon_nam(mtmp)));
1615 You_hear("%s
\82ª
\83V
\83\85\81[
\83b
\82Æ
\82¢
\82¤
\90º
\82ð
\95·
\82¢
\82½
\81I", mon_nam(mtmp));
1617 || (flags.moonphase == NEW_MOON && !have_lizard())) {
1619 if (!Stoned && !Stone_resistance
1620 && !(poly_when_stoned(youmonst.data)
1621 && polymon(PM_STONE_GOLEM))) {
1622 int kformat = KILLED_BY_AN;
1623 const char *kname = mtmp->data->mname;
1625 if (mtmp->data->geno & G_UNIQ) {
1626 if (!type_is_pname(mtmp->data))
1628 kformat = KILLED_BY;
1630 make_stoned(5L, (char *) 0, kformat, kname);
1632 /* done_in_by(mtmp, STONING); */
1639 hitmsg(mtmp, mattk);
1640 if (uncancelled && !u.ustuck && !sticks(youmonst.data))
1644 if ((!mtmp->mcan || u.ustuck == mtmp) && !sticks(youmonst.data)) {
1645 if (!u.ustuck && !rn2(10)) {
1646 if (u_slip_free(mtmp, mattk)) {
1650 pline("%s swings itself around you!", Monnam(mtmp));
1652 pline("%s
\82Í
\82 \82È
\82½
\82É
\91Ì
\82ð
\97\8d\82Ý
\82Â
\82©
\82¹
\82½
\81I", Monnam(mtmp));
1655 } else if (u.ustuck == mtmp) {
1656 if (is_pool(mtmp->mx, mtmp->my) && !Swimming && !Amphibious) {
1657 boolean moat = (levl[mtmp->mx][mtmp->my].typ != POOL)
1658 && (levl[mtmp->mx][mtmp->my].typ != WATER)
1659 && !Is_medusa_level(&u.uz)
1660 && !Is_waterlevel(&u.uz);
1663 pline("%s drowns you...", Monnam(mtmp));
1665 pline("
\82 \82È
\82½
\82Í%s
\82É
\97\8d\82Ý
\82Â
\82©
\82ê
\82Ä
\93M
\82ê
\82½
\81D
\81D
\81D", Monnam(mtmp));
1666 killer.format = KILLED_BY_AN;
1668 Sprintf(killer.name, "%s by %s",
1669 moat ? "moat" : "pool of water",
1670 an(mtmp->data->mname));
1672 Sprintf(buf, "%s
\82Ì%s
\82É
\97\8d\82Ý
\82Â
\82©
\82ê
\82Ä",
1673 moat ? "
\96x" : "
\92r",
1677 } else if (mattk->aatyp == AT_HUGS)
1679 You("are being crushed.");
1681 You("
\82Â
\82Ô
\82³
\82ê
\82Â
\82Â
\82 \82é
\81D");
1686 pline("%s brushes against your %s.", Monnam(mtmp),
1689 pline("%s
\82Í
\82 \82È
\82½
\82Ì%s
\82É
\90G
\82ê
\82½
\81D", Monnam(mtmp),
1697 hitmsg(mtmp, mattk);
1698 if (uncancelled && !rn2(4) && u.ulycn == NON_PM
1699 && !Protection_from_shape_changers && !defends(AD_WERE, uwep)) {
1701 You_feel("feverish.");
1703 You("
\94M
\82ª
\82 \82é
\82æ
\82¤
\82È
\8bC
\82ª
\82µ
\82½
\81D");
1704 exercise(A_CON, FALSE);
1705 set_ulycn(monsndx(mdat));
1706 retouch_equipment(2);
1710 hitmsg(mtmp, mattk);
1711 if (youmonst.data->mlet == mdat->mlet)
1718 if (SYSOPT_SEDUCE) {
1719 if (could_seduce(mtmp, &youmonst, mattk) == 1 && !mtmp->mcan)
1725 case AD_SITM: /* for now these are the same */
1727 if (is_animal(mtmp->data)) {
1728 hitmsg(mtmp, mattk);
1731 /* Continue below */
1732 } else if (dmgtype(youmonst.data, AD_SEDU)
1733 || (SYSOPT_SEDUCE && dmgtype(youmonst.data, AD_SSEX))) {
1735 pline("%s %s.", Monnam(mtmp),
1737 ? "brags about the goods some dungeon explorer provided"
1738 : "makes some remarks about how difficult theft is lately");
1740 pline("%s
\82Í%s
\81D", Monnam(mtmp),
1742 ? "
\82 \82é
\96À
\8b{
\92T
\8c\9f\89Æ
\82ª
\92u
\82¢
\82Ä
\82Á
\82½
\95i
\95¨
\82ð
\8e©
\96\9d\82µ
\82½"
1743 : "
\8dÅ
\8bß
\90Þ
\93\90\82ª
\82¢
\82©
\82É
\8d¢
\93ï
\82©
\92W
\81X
\82Æ
\8fq
\82×
\82½");
1745 if (!tele_restrict(mtmp))
1746 (void) rloc(mtmp, TRUE);
1748 } else if (mtmp->mcan) {
1751 pline("%s tries to %s you, but you seem %s.",
1752 Adjmonnam(mtmp, "plain"),
1753 flags.female ? "charm" : "seduce",
1754 flags.female ? "unaffected" : "uninterested");
1756 pline("%s
\82Í
\82 \82È
\82½
\82ð%s
\82µ
\82æ
\82¤
\82Æ
\82µ
\82½
\81C
\82µ
\82©
\82µ
\82 \82È
\82½
\82Í%s
\81D",
1757 Adjmonnam(mtmp, "
\92n
\96¡
\82È"),
1758 flags.female ? "
\96£
\97¹" : "
\97U
\98f",
1759 flags.female ? "
\89e
\8b¿
\82ð
\8eó
\82¯
\82È
\82¢" : "
\8b»
\96¡
\82ª
\82È
\82¢");
1762 if (!tele_restrict(mtmp))
1763 (void) rloc(mtmp, TRUE);
1769 switch (steal(mtmp, buf)) {
1775 if (!is_animal(mtmp->data) && !tele_restrict(mtmp))
1776 (void) rloc(mtmp, TRUE);
1777 if (is_animal(mtmp->data) && *buf) {
1778 if (canseemon(mtmp))
1780 pline("%s tries to %s away with %s.", Monnam(mtmp),
1781 locomotion(mtmp->data, "run"), buf);
1783 pline("%s
\82Í%s
\82ð
\8e\9d\82Á
\82Ä
\93¦
\82°
\8fo
\82µ
\82½
\81D", Monnam(mtmp),
1787 monflee(mtmp, 0, FALSE, FALSE);
1793 hitmsg(mtmp, mattk);
1794 /* when the Wizard or quest nemesis hits, there's a 1/20 chance
1795 to steal a quest artifact (any, not just the one for the hero's
1796 own role) or the Amulet or one of the invocation tools */
1802 hitmsg(mtmp, mattk);
1806 Your("position suddenly seems very uncertain!");
1808 pline("
\8e©
\95ª
\82Ì
\82¢
\82é
\88Ê
\92u
\82ª
\93Ë
\91R
\95s
\96¾
\8am
\82É
\82È
\82Á
\82½
\81I");
1813 hitmsg(mtmp, mattk);
1816 if (u.umonnum == PM_IRON_GOLEM) {
1820 You("
\8eK
\82Ñ
\82Â
\82¢
\82½
\81I");
1821 /* KMH -- this is okay with unchanging */
1825 erode_armor(&youmonst, ERODE_RUST);
1828 hitmsg(mtmp, mattk);
1831 erode_armor(&youmonst, ERODE_CORRODE);
1834 hitmsg(mtmp, mattk);
1837 if (u.umonnum == PM_WOOD_GOLEM || u.umonnum == PM_LEATHER_GOLEM) {
1841 You("
\95\85\82Á
\82½
\81I");
1842 /* KMH -- this is okay with unchanging */
1846 erode_armor(&youmonst, ERODE_ROT);
1849 /* a cancelled nurse is just an ordinary monster,
1850 * nurses don't heal those that cause petrification */
1851 if (mtmp->mcan || (Upolyd && touch_petrifies(youmonst.data))) {
1852 hitmsg(mtmp, mattk);
1855 if (!uwep && !uarmu && !uarm && !uarmc
1856 && !uarms && !uarmg && !uarmf && !uarmh) {
1857 boolean goaway = FALSE;
1860 pline("%s hits! (I hope you don't mind.)", Monnam(mtmp));
1862 pline("%s
\82Ì
\8dU
\8c\82\82Í
\96½
\92\86\82µ
\82½
\81D(
\8bC
\82É
\82µ
\82È
\82¢
\82æ
\82¤
\82É
\81D)", Monnam(mtmp));
1866 /* no upper limit necessary; effect is temporary */
1876 /* hard upper limit via nurse care: 25 * ulevel */
1877 if (u.uhpmax < 5 * u.ulevel + d(2 * u.ulevel, 10))
1882 if (u.uhp > u.uhpmax)
1886 exercise(A_STR, TRUE);
1888 exercise(A_CON, TRUE);
1890 make_sick(0L, (char *) 0, FALSE, SICK_ALL);
1895 } else if (!rn2(33)) {
1896 if (!tele_restrict(mtmp))
1897 (void) rloc(mtmp, TRUE);
1898 monflee(mtmp, d(3, 6), TRUE, FALSE);
1903 if (Role_if(PM_HEALER)) {
1904 if (!Deaf && !(moves % 5))
1906 verbalize("Doc, I can't help you unless you cooperate.");
1908 verbalize("
\83h
\83N
\83^
\81[
\81I
\8b¦
\97Í
\82ð
\82¨
\82Ë
\82ª
\82¢
\82µ
\82Ü
\82·
\82í
\81D");
1911 hitmsg(mtmp, mattk);
1915 hitmsg(mtmp, mattk);
1916 if (!night() && mdat == &mons[PM_GREMLIN])
1918 if (!mtmp->mcan && !rn2(10)) {
1922 You_hear("laughter.");
1924 You_hear("
\8fÎ
\82¢
\90º
\82ð
\95·
\82¢
\82½
\81D");
1927 pline("%s chuckles.", Monnam(mtmp));
1929 pline("%s
\82Í
\83N
\83X
\83N
\83X
\8fÎ
\82Á
\82½
\81D", Monnam(mtmp));
1931 if (u.umonnum == PM_CLAY_GOLEM) {
1933 pline("Some writing vanishes from your head!");
1935 pline("
\82¢
\82
\82Â
\82©
\82Ì
\95¶
\8e\9a\82ª
\82 \82È
\82½
\82Ì
\93ª
\82©
\82ç
\8fÁ
\82¦
\82½
\81I");
1936 /* KMH -- this is okay with unchanging */
1944 hitmsg(mtmp, mattk);
1945 if (!mtmp->mcan && !rn2(4)) {
1946 make_stunned((HStun & TIMEOUT) + (long) dmg, TRUE);
1951 hitmsg(mtmp, mattk);
1952 if (!mtmp->mcan && !rn2(3))
1953 if (Acid_resistance) {
1955 pline("You're covered in %s, but it seems harmless.",
1958 pline("%s
\82Å
\95¢
\82í
\82ê
\82½
\81D
\82µ
\82©
\82µ
\8f\9d\82Â
\82©
\82È
\82¢
\81D",
1964 pline("You're covered in %s! It burns!", hliquid("acid"));
1966 pline("%s
\82Å
\95¢
\82í
\82ê
\8fÄ
\82¯
\82½
\81I", hliquid("
\8e_"));
1967 exercise(A_STR, FALSE);
1973 hitmsg(mtmp, mattk);
1974 if (uncancelled && HFast && !defends(AD_SLOW, uwep) && !rn2(4))
1978 hitmsg(mtmp, mattk);
1979 if (uncancelled && !rn2(4)) /* 25% chance */
1984 hitmsg(mtmp, mattk);
1985 if (!mtmp->mcan && !rn2(4) && !mtmp->mspec_used) {
1986 mtmp->mspec_used = mtmp->mspec_used + (dmg + rn2(6));
1989 You("are getting even more confused.");
1991 You("
\82Ü
\82·
\82Ü
\82·
\8d¬
\97\90\82µ
\82½
\81D");
1994 You("are getting confused.");
1996 You("
\8d¬
\97\90\82µ
\82Ä
\82«
\82½
\81D");
1997 make_confused(HConfusion + dmg, FALSE);
2003 pline("%s reaches out with its deadly touch.", Monnam(mtmp));
2005 pline("%s
\82Í
\8e\80\82Ì
\98r
\82ð
\82Ì
\82Î
\82µ
\82½
\81D", Monnam(mtmp));
2006 if (is_undead(youmonst.data)) {
2007 /* Still does normal damage */
2009 pline("Was that the touch of death?");
2011 pline("
\8d¡
\82Ì
\82Í
\8e\80\82Ì
\90é
\8d\90\82¾
\82Á
\82½
\82Ì
\82©
\82È
\81H");
2019 killer.format = KILLED_BY_AN;
2021 Strcpy(killer.name, "touch of death");
2023 Strcpy(killer.name, "
\8e\80\82Ì
\90é
\8d\90\82Å");
2029 default: /* case 16: ... case 5: */
2031 You_feel("your life force draining away...");
2033 You("
\91Ì
\97Í
\82ª
\92D
\82í
\82ê
\82Ä
\82¢
\82
\82æ
\82¤
\82È
\8bC
\82ª
\82µ
\82½
\81D
\81D
\81D");
2034 permdmg = 1; /* actual damage done below */
2042 shieldeff(u.ux, u.uy);
2044 pline("Lucky for you, it didn't work!");
2046 pline("
\89^
\82Ì
\82æ
\82¢
\82±
\82Æ
\82É
\82È
\82ñ
\82Æ
\82à
\82È
\82©
\82Á
\82½
\81I");
2053 pline("%s reaches out, and you feel fever and chills.", Monnam(mtmp));
2055 pline("%s
\82Í
\98r
\82ð
\82Ì
\82Î
\82µ
\82½
\81C
\82 \82È
\82½
\82Í
\88«
\8a¦
\82ð
\8a´
\82¶
\82½
\81D", Monnam(mtmp));
2056 (void) diseasemu(mdat); /* plus the normal damage */
2060 pline("%s reaches out, and your body shrivels.", Monnam(mtmp));
2062 pline("%s
\82Í
\98r
\82ð
\90L
\82Î
\82µ
\82½
\81C
\82 \82È
\82½
\82Ì
\91Ì
\82Í
\82µ
\82È
\82Ñ
\82½
\81D", Monnam(mtmp));
2063 exercise(A_CON, FALSE);
2065 morehungry(rn1(40, 40));
2066 /* plus the normal damage */
2069 hitmsg(mtmp, mattk);
2072 if (flaming(youmonst.data)) {
2074 pline_The("slime burns away!");
2076 pline_The("
\83X
\83\89\83C
\83\80\82Í
\94R
\82¦
\82½
\81I");
2078 } else if (Unchanging || noncorporeal(youmonst.data)
2079 || youmonst.data == &mons[PM_GREEN_SLIME]) {
2081 You("are unaffected.");
2083 You("
\89e
\8b¿
\82ð
\8eó
\82¯
\82È
\82¢
\81D");
2085 } else if (!Slimed) {
2087 You("don't feel very well.");
2089 You("
\8bC
\95ª
\82ª
\88«
\82¢
\81D");
2090 make_slimed(10L, (char *) 0);
2091 delayed_killer(SLIMED, KILLED_BY_AN, mtmp->data->mname);
2096 pline("
\83E
\83Q
\83F
\81[
\81I");
2098 case AD_ENCH: /* KMH -- remove enchantment (disenchanter) */
2099 hitmsg(mtmp, mattk);
2100 /* uncancelled is sufficient enough; please
2101 don't make this attack less frequent */
2103 struct obj *obj = some_armor(&youmonst);
2106 /* some rings are susceptible;
2107 amulets and blindfolds aren't (at present) */
2125 if (drain_item(obj, FALSE)) {
2127 pline("%s less effective.", Yobjnam2(obj, "seem"));
2129 Your("%s
\82©
\82ç
\96\82\97Í
\82ª
\8fÁ
\82¦
\82½
\82æ
\82¤
\82¾
\81D", xname(obj));
2137 if ((Upolyd ? u.mh : u.uhp) < 1) {
2138 /* already dead? call rehumanize() or done_in_by() as appropriate */
2143 /* Negative armor class reduces damage done instead of fully protecting
2146 if (dmg && u.uac < 0) {
2153 if (Half_physical_damage
2154 /* Mitre of Holiness */
2155 || (Role_if(PM_PRIEST) && uarmh && is_quest_artifact(uarmh)
2156 && (is_undead(mtmp->data) || is_demon(mtmp->data)
2157 || is_vampshifter(mtmp))))
2158 dmg = (dmg + 1) / 2;
2160 if (permdmg) { /* Death's life force drain */
2161 int lowerlimit, *hpmax_p;
2163 * Apply some of the damage to permanent hit points:
2164 * polymorphed 100% against poly'd hpmax
2165 * hpmax > 25*lvl 100% against normal hpmax
2166 * hpmax > 10*lvl 50..100%
2167 * hpmax > 5*lvl 25..75%
2169 * Never reduces hpmax below 1 hit point per level.
2171 permdmg = rn2(dmg / 2 + 1);
2172 if (Upolyd || u.uhpmax > 25 * u.ulevel)
2174 else if (u.uhpmax > 10 * u.ulevel)
2176 else if (u.uhpmax > 5 * u.ulevel)
2181 /* [can't use youmonst.m_lev] */
2182 lowerlimit = min((int) youmonst.data->mlevel, u.ulevel);
2184 hpmax_p = &u.uhpmax;
2185 lowerlimit = u.ulevel;
2187 if (*hpmax_p - permdmg > lowerlimit)
2188 *hpmax_p -= permdmg;
2189 else if (*hpmax_p > lowerlimit)
2190 *hpmax_p = lowerlimit;
2192 * already at or below minimum threshold; do nothing */
2196 mdamageu(mtmp, dmg);
2200 res = passiveum(olduasmon, mtmp, mattk);
2207 /* An interface for use when taking a blindfold off, for example,
2208 * to see if an engulfing attack should immediately take affect, like
2209 * a passive attack. TRUE if engulfing blindness occurred */
2213 struct attack *mattk;
2215 if (!Blinded && u.uswallow
2216 && (mattk = attacktype_fordmg(u.ustuck->data, AT_ENGL, AD_BLND))
2217 && can_blnd(u.ustuck, &youmonst, mattk->aatyp, (struct obj *) 0)) {
2218 ++u.uswldtim; /* compensate for gulpmu change */
2219 (void) gulpmu(u.ustuck, mattk);
2225 /* monster swallows you, or damage if u.uswallow */
2229 struct attack *mattk;
2231 struct trap *t = t_at(u.ux, u.uy);
2232 int tmp = d((int) mattk->damn, (int) mattk->damd);
2236 boolean physical_damage = FALSE;
2238 if (!u.uswallow) { /* swallows you */
2239 int omx = mtmp->mx, omy = mtmp->my;
2241 if (!engulf_target(mtmp, &youmonst))
2243 if ((t && ((t->ttyp == PIT) || (t->ttyp == SPIKED_PIT)))
2244 && sobj_at(BOULDER, u.ux, u.uy))
2248 unplacebc(); /* ball&chain go away */
2249 remove_monster(omx, omy);
2250 mtmp->mtrapped = 0; /* no longer on old trap */
2251 place_monster(mtmp, u.ux, u.uy);
2253 newsym(mtmp->mx, mtmp->my);
2254 if (is_animal(mtmp->data) && u.usteed) {
2257 /* Too many quirks presently if hero and steed
2258 * are swallowed. Pretend purple worms don't
2259 * like horses for now :-)
2261 Strcpy(buf, mon_nam(u.usteed));
2263 pline("%s lunges forward and plucks you off %s!", Monnam(mtmp),
2266 pline("%s
\82Í
\93Ë
\90i
\82µ
\82 \82È
\82½
\82ð%s
\82©
\82ç
\88ø
\82«
\97\8e\82µ
\82½
\81I", Monnam(mtmp),
2269 dismount_steed(DISMOUNT_ENGULFED);
2272 pline("%s engulfs you!", Monnam(mtmp));
2274 pline("%s
\82Í
\82 \82È
\82½
\82ð
\88ù
\82Ý
\82±
\82ñ
\82¾
\81I", Monnam(mtmp));
2276 reset_occupations(); /* behave as if you had moved */
2280 You("are released from the %s!",
2281 u.utraptype == TT_WEB ? "web" : "trap");
2283 You("%s
\82©
\82ç
\89ð
\95ú
\82³
\82ê
\82½
\81I",
2284 u.utraptype == TT_WEB ? "
\82
\82à
\82Ì
\91\83" : "ã©");
2289 i = number_leashed();
2292 const char *s = (i > 1) ? "leashes" : "leash";
2294 pline_The("%s %s loose.", s, vtense(s, "snap"));
2296 pline("
\95R
\82Í
\83p
\83`
\83\93\82Æ
\82Í
\82¸
\82ê
\82½
\81D");
2301 if (touch_petrifies(youmonst.data) && !resists_ston(mtmp)) {
2302 /* put the attacker back where it started;
2303 the resulting statue will end up there */
2304 remove_monster(mtmp->mx, mtmp->my); /* u.ux,u.uy */
2305 place_monster(mtmp, omx, omy);
2306 minstapetrify(mtmp, TRUE);
2307 /* normally unstuck() would do this, but we're not
2308 fully swallowed yet so that won't work here */
2312 return (mtmp->mhp > 0) ? 0 : 2;
2315 display_nhwindow(WIN_MESSAGE, FALSE);
2316 vision_recalc(2); /* hero can't see anything */
2318 /* for digestion, shorter time is more dangerous;
2319 for other swallowings, longer time means more
2320 chances for the swallower to attack */
2321 if (mattk->adtyp == AD_DGST) {
2322 tim_tmp = 25 - (int) mtmp->m_lev;
2324 tim_tmp = rnd(tim_tmp) / 2;
2325 else if (tim_tmp < 0)
2326 tim_tmp = -(rnd(-tim_tmp) / 2);
2327 /* having good armor & high constitution makes
2328 it take longer for you to be digested, but
2329 you'll end up trapped inside for longer too */
2330 tim_tmp += -u.uac + 10 + (ACURR(A_CON) / 3 - 1);
2332 /* higher level attacker takes longer to eject hero */
2333 tim_tmp = rnd((int) mtmp->m_lev + 10 / 2);
2335 /* u.uswldtim always set > 1 */
2336 u.uswldtim = (unsigned) ((tim_tmp < 2) ? 2 : tim_tmp);
2338 for (otmp2 = invent; otmp2; otmp2 = otmp2->nobj)
2339 (void) snuff_lit(otmp2);
2342 if (mtmp != u.ustuck)
2347 switch (mattk->adtyp) {
2349 physical_damage = TRUE;
2350 if (Slow_digestion) {
2351 /* Messages are handled below */
2354 } else if (u.uswldtim == 0) {
2356 pline("%s totally digests you!", Monnam(mtmp));
2358 pline("%s
\82Í
\82 \82È
\82½
\82ð
\8a®
\91S
\82É
\8fÁ
\89»
\82µ
\82½
\81I", Monnam(mtmp));
2360 if (Half_physical_damage)
2361 tmp *= 2; /* sorry */
2364 pline("%s%s digests you!", Monnam(mtmp),
2365 (u.uswldtim == 2) ? " thoroughly"
2366 : (u.uswldtim == 1) ? " utterly" : "");
2368 pline("%s
\82Í
\82 \82È
\82½
\82ð%s
\8fÁ
\89»
\82µ
\82Ä
\82¢
\82é
\81I", Monnam(mtmp),
2369 (u.uswldtim == 2) ? "
\93O
\92ê
\93I
\82É"
2370 : (u.uswldtim == 1) ? "
\8a®
\91S
\82É" : "");
2372 exercise(A_STR, FALSE);
2376 physical_damage = TRUE;
2377 if (mtmp->data == &mons[PM_FOG_CLOUD]) {
2379 You("are laden with moisture and %s",
2380 flaming(youmonst.data)
2381 ? "are smoldering out!"
2382 : Breathless ? "find it mildly uncomfortable."
2383 : amphibious(youmonst.data)
2385 : "can barely breathe!");
2387 You("
\8e¼
\8bC
\82É
\8bê
\82µ
\82ß
\82ç
\82ê
\81C%s",
2388 flaming(youmonst.data)
2389 ? "
\82
\82·
\82Ô
\82Á
\82½
\81I"
2390 : Breathless ? "
\8f
\81X
\95s
\89õ
\82É
\8a´
\82¶
\82½
\81D"
2391 : amphibious(youmonst.data)
2392 ? "
\88À
\82ç
\82¬
\82ð
\8a´
\82¶
\82½
\81D"
2393 : "
\91§
\82ð
\82·
\82é
\82Ì
\82ª
\82â
\82Á
\82Æ
\82¾
\81I");
2395 /* NB: Amphibious includes Breathless */
2396 if (Amphibious && !flaming(youmonst.data))
2400 You("are pummeled with debris!");
2402 You("
\8a¢âI
\82Å
\92É
\82ß
\82Â
\82¯
\82ç
\82ê
\82½
\81I");
2403 exercise(A_STR, FALSE);
2407 if (Acid_resistance) {
2409 You("are covered with a seemingly harmless goo.");
2411 You("
\96³
\8aQ
\82Á
\82Û
\82¢
\82Ë
\82Î
\82Â
\82
\82à
\82Ì
\82Å
\82¨
\82¨
\82í
\82ê
\82½
\81D");
2416 pline("Ouch! You've been slimed!");
2418 pline("
\82°
\82°
\82ñ
\81I
\82 \82È
\82½
\82Í
\82Ê
\82é
\82Ê
\82é
\82¾
\81I");
2421 You("are covered in slime! It burns!");
2423 You("
\82×
\82Æ
\82×
\82Æ
\82É
\82È
\82Á
\82½
\81D
\82»
\82µ
\82Ä
\8e_
\82É
\8fÄ
\82©
\82ê
\82½
\81I");
2424 exercise(A_STR, FALSE);
2428 if (can_blnd(mtmp, &youmonst, mattk->aatyp, (struct obj *) 0)) {
2430 long was_blinded = Blinded;
2433 You_cant("see in here!");
2435 You("
\89½
\82à
\8c©
\82¦
\82È
\82¢
\81I");
2436 make_blinded((long) tmp, FALSE);
2437 if (!was_blinded && !Blind)
2438 Your1(vision_clears);
2440 /* keep him blind until disgorged */
2441 make_blinded(Blinded + 1, FALSE);
2446 if (!mtmp->mcan && rn2(2)) {
2448 pline_The("air around you crackles with electricity.");
2450 pline("
\82 \82È
\82½
\82Ì
\89ñ
\82è
\82Ì
\8bó
\8bC
\82Í
\93d
\8bC
\82Å
\83s
\83\8a\83s
\83\8a\82µ
\82Ä
\82¢
\82é
\81D");
2451 if (Shock_resistance) {
2452 shieldeff(u.ux, u.uy);
2454 You("seem unhurt.");
2456 You("
\8f\9d\82Â
\82©
\82È
\82¢
\82æ
\82¤
\82¾
\81D");
2457 ugolemeffects(AD_ELEC, tmp);
2464 if (!mtmp->mcan && rn2(2)) {
2465 if (Cold_resistance) {
2466 shieldeff(u.ux, u.uy);
2468 You_feel("mildly chilly.");
2470 pline("
\82Ð
\82ñ
\82â
\82è
\82µ
\82½
\81D");
2471 ugolemeffects(AD_COLD, tmp);
2475 You("are freezing to death!");
2477 You("
\93\80\8e\80\82µ
\82»
\82¤
\82¾
\81I");
2482 if (!mtmp->mcan && rn2(2)) {
2483 if (Fire_resistance) {
2484 shieldeff(u.ux, u.uy);
2486 You_feel("mildly hot.");
2488 pline("
\83|
\83J
\83|
\83J
\82µ
\82½
\81D");
2489 ugolemeffects(AD_FIRE, tmp);
2493 You("are burning to a crisp!");
2495 You("
\94R
\82¦
\82Ä
\83J
\83\89\83J
\83\89\82É
\82È
\82Á
\82½
\81I");
2501 if (!diseasemu(mtmp->data))
2505 /* AC magic cancellation doesn't help when engulfed */
2506 if (!mtmp->mcan && rn2(4)) /* 75% chance */
2511 physical_damage = TRUE;
2516 if (physical_damage)
2517 tmp = Maybe_Half_Phys(tmp);
2519 mdamageu(mtmp, tmp);
2523 if (touch_petrifies(youmonst.data) && !resists_ston(mtmp)) {
2525 pline("%s very hurriedly %s you!", Monnam(mtmp),
2526 is_animal(mtmp->data) ? "regurgitates" : "expels");
2528 pline("%s
\82Í
\8dQ
\82Ä
\82Ä
\82 \82È
\82½
\82ð%s
\82µ
\82½
\81I", Monnam(mtmp),
2529 is_animal(mtmp->data)? "
\93f
\82«
\96ß" : "
\94r
\8fo");
2531 expels(mtmp, mtmp->data, FALSE);
2532 } else if (!u.uswldtim || youmonst.data->msize >= MZ_HUGE) {
2534 You("get %s!", is_animal(mtmp->data) ? "regurgitated" : "expelled");
2536 You("%s
\82³
\82ê
\82½
\81I", is_animal(mtmp->data)? "
\93f
\82«
\96ß" : "
\94r
\8fo");
2538 && (is_animal(mtmp->data)
2539 || (dmgtype(mtmp->data, AD_DGST) && Slow_digestion)))
2541 pline("Obviously %s doesn't like your taste.", mon_nam(mtmp));
2543 You("
\82Ç
\82¤
\82à%s
\8dD
\82Ý
\82Ì
\96¡
\82¶
\82á
\82È
\82¢
\82æ
\82¤
\82¾
\81D", mon_nam(mtmp));
2544 expels(mtmp, mtmp->data, FALSE);
2549 /* monster explodes in your face */
2551 explmu(mtmp, mattk, ufound)
2553 struct attack *mattk;
2556 boolean physical_damage = TRUE, kill_agr = TRUE;
2563 pline("%s explodes at a spot in %s!",
2564 canseemon(mtmp) ? Monnam(mtmp) : "It",
2565 levl[mtmp->mux][mtmp->muy].typ == WATER ? "empty water"
2568 pline("%s
\82Í
\89½
\82à
\82È
\82¢%s
\82Å
\94\9a\94
\82µ
\82½
\81I",
2569 canseemon(mtmp) ? Monnam(mtmp) : "
\89½
\8eÒ
\82©",
2570 levl[mtmp->mux][mtmp->muy].typ == WATER ? "
\90\85\92\86"
2574 int tmp = d((int) mattk->damn, (int) mattk->damd);
2575 boolean not_affected = defends((int) mattk->adtyp, uwep);
2577 hitmsg(mtmp, mattk);
2579 switch (mattk->adtyp) {
2581 physical_damage = FALSE;
2582 not_affected |= Cold_resistance;
2585 physical_damage = FALSE;
2586 not_affected |= Fire_resistance;
2589 physical_damage = FALSE;
2590 not_affected |= Shock_resistance;
2593 if (!not_affected) {
2594 if (ACURR(A_DEX) > rnd(20)) {
2596 You("duck some of the blast.");
2598 You("
\8fÕ
\8c\82\82ð
\82³
\82¯
\82½
\81D");
2599 tmp = (tmp + 1) / 2;
2603 You("get blasted!");
2605 You("
\8fÕ
\8c\82\82ð
\82
\82ç
\82Á
\82½
\81I");
2607 if (mattk->adtyp == AD_FIRE)
2609 if (physical_damage)
2610 tmp = Maybe_Half_Phys(tmp);
2611 mdamageu(mtmp, tmp);
2616 not_affected = resists_blnd(&youmonst);
2617 if (!not_affected) {
2618 /* sometimes you're affected even if it's invisible */
2619 if (mon_visible(mtmp) || (rnd(tmp /= 2) > u.ulevel)) {
2621 You("are blinded by a blast of light!");
2623 You("
\82Ü
\82Î
\82ä
\82¢
\8cõ
\82É
\96Ú
\82ª
\82
\82ç
\82ñ
\82¾
\81I");
2624 make_blinded((long) tmp, FALSE);
2626 Your1(vision_clears);
2627 } else if (flags.verbose)
2629 You("get the impression it was not terribly bright.");
2631 You("
\82»
\82ê
\82Í
\8b°
\82ë
\82µ
\82
\82Ü
\82Ô
\82µ
\82¢
\82Æ
\82¢
\82¤
\82Ù
\82Ç
\82¶
\82á
\82È
\82¢
\82Æ
\8ev
\82Á
\82½
\81D");
2636 not_affected |= Blind || (u.umonnum == PM_BLACK_LIGHT
2637 || u.umonnum == PM_VIOLET_FUNGUS
2638 || dmgtype(youmonst.data, AD_STUN));
2639 if (!not_affected) {
2643 You("are caught in a blast of kaleidoscopic light!");
2645 You("
\96\9c\89Ø
\8b¾
\82Ì
\8cõ
\82É
\95ß
\82ç
\82¦
\82ç
\82ê
\82½
\81I");
2646 /* avoid hallucinating the black light as it dies */
2647 mondead(mtmp); /* remove it from map now */
2648 kill_agr = FALSE; /* already killed (maybe lifesaved) */
2650 make_hallucinated(HHallucination + (long) tmp, FALSE, 0L);
2652 You("%s.", chg ? "are freaked out" : "seem unaffected");
2654 You("%s
\81D", chg ? "
\90\8c\82¢
\82µ
\82ê
\82½" : "
\89e
\8b¿
\82ð
\8eó
\82¯
\82È
\82©
\82Á
\82½");
2663 You("seem unaffected by it.");
2665 You("
\89e
\8b¿
\82ð
\8eó
\82¯
\82È
\82¢
\82æ
\82¤
\82¾
\81D");
2666 ugolemeffects((int) mattk->adtyp, tmp);
2671 wake_nearto(mtmp->mx, mtmp->my, 7 * 7);
2672 return (mtmp->mhp > 0) ? 0 : 2;
2675 /* monster gazes at you */
2679 struct attack *mattk;
2681 static const char *const reactions[] = {
2683 "confused", /* [0] */
2684 "stunned", /* [1] */
2685 "puzzled", "dazzled", /* [2,3] */
2686 "irritated", "inflamed", /* [4,5] */
2690 "
\8d¬
\97\90\82µ
\82½", /* [0] */
2691 "
\9eN
\9eO
\82Æ
\82µ
\82½", /* [1] */
2692 "
\8d¢
\98f
\82µ
\82½", "
\8c¶
\98f
\82³
\82ê
\82½", /* [2,3] */
2693 "
\83C
\83\89\83C
\83\89\82µ
\82½", "
\8b»
\95±
\82µ
\82½", /* [4,5] */
2694 "
\94æ
\82ê
\82½", /* [6] */
2695 "
\82Ú
\82ñ
\82â
\82è
\82µ
\82½", /* [7] */
2699 boolean cancelled = (mtmp->mcan != 0), already = FALSE;
2701 /* assumes that hero has to see monster's gaze in order to be
2702 affected, rather than monster just having to look at hero;
2703 when hallucinating, hero's brain doesn't register what
2704 it's seeing correctly so the gaze is usually ineffective
2705 [this could be taken a lot farther and select a gaze effect
2706 appropriate to what's currently being displayed, giving
2707 ordinary monsters a gaze attack when hero thinks he or she
2708 is facing a gazing creature, but let's not go that far...] */
2709 if (Hallucination && rn2(4))
2712 switch (mattk->adtyp) {
2714 if (cancelled || !mtmp->mcansee) {
2715 if (!canseemon(mtmp))
2716 break; /* silently */
2718 pline("%s %s.", Monnam(mtmp),
2719 (mtmp->data == &mons[PM_MEDUSA] && mtmp->mcan)
2720 ? "doesn't look all that ugly"
2721 : "gazes ineffectually");
2723 pline("%s
\82Í%s
\81D", Monnam(mtmp),
2724 (mtmp->data == &mons[PM_MEDUSA] && mtmp->mcan)
2725 ? "
\82»
\82ê
\82Ù
\82Ç
\8fX
\82
\82È
\82¢
\82±
\82Æ
\82É
\8bC
\82ª
\82Â
\82¢
\82½"
2726 : "
\96³
\88Ó
\96¡
\82É
\82É
\82ç
\82ñ
\82¾");
2730 if (Reflecting && couldsee(mtmp->mx, mtmp->my)
2731 && mtmp->data == &mons[PM_MEDUSA]) {
2732 /* hero has line of sight to Medusa and she's not blind */
2733 boolean useeit = canseemon(mtmp);
2737 (void) ureflects("%s gaze is reflected by your %s.",
2738 s_suffix(Monnam(mtmp)));
2740 (void) ureflects("%s
\82Ì
\82É
\82ç
\82Ý
\82Í%s
\82Å
\94½
\8eË
\82³
\82ê
\82½
\81D",
2744 mtmp, !useeit ? (char *) 0
2746 : "The gaze is reflected away by %s %s!"))
2748 : "
\82É
\82ç
\82Ý
\82Í%s
\82Ì%s
\82É
\82æ
\82Á
\82Ä
\94½
\8eË
\82³
\82ê
\82½
\81I"))
2750 if (!m_canseeu(mtmp)) { /* probably you're invisible */
2754 "%s doesn't seem to notice that %s gaze was reflected.",
2755 Monnam(mtmp), mhis(mtmp));
2757 pline("
\82É
\82ç
\82Ý
\82ª
\94½
\8eË
\82µ
\82Ä
\82¢
\82é
\82±
\82Æ
\82É%s
\82Í
\8bC
\95t
\82¢
\82Ä
\82¢
\82È
\82¢
\82æ
\82¤
\82¾
\81D",
2764 pline("%s is turned to stone!", Monnam(mtmp));
2766 pline("%s
\82Í
\90Î
\82É
\82È
\82Á
\82½
\81I", Monnam(mtmp));
2774 if (canseemon(mtmp) && couldsee(mtmp->mx, mtmp->my)
2775 && !Stone_resistance) {
2777 You("meet %s gaze.", s_suffix(mon_nam(mtmp)));
2779 You("%s
\82É
\82É
\82ç
\82Ü
\82ê
\82½
\81D", mon_nam(mtmp));
2781 if (poly_when_stoned(youmonst.data) && polymon(PM_STONE_GOLEM))
2784 You("turn to stone...");
2786 You("
\90Î
\82É
\82È
\82Á
\82½
\81D
\81D
\81D");
2787 killer.format = KILLED_BY;
2788 Strcpy(killer.name, mtmp->data->mname);
2793 if (canseemon(mtmp) && couldsee(mtmp->mx, mtmp->my) && mtmp->mcansee
2794 && !mtmp->mspec_used && rn2(5)) {
2796 react = 0; /* "confused" */
2797 already = (mtmp->mconf != 0);
2801 mtmp->mspec_used = mtmp->mspec_used + (conf + rn2(6));
2804 pline("%s gaze confuses you!", s_suffix(Monnam(mtmp)));
2806 pline("%s
\82Ì
\82É
\82ç
\82Ý
\82Å
\82 \82È
\82½
\82Í
\8d¬
\97\90\82µ
\82½
\81I", Monnam(mtmp));
2809 You("are getting more and more confused.");
2811 You("
\82Ü
\82·
\82Ü
\82·
\8d¬
\97\90\82µ
\82½
\81D");
2812 make_confused(HConfusion + conf, FALSE);
2818 if (canseemon(mtmp) && couldsee(mtmp->mx, mtmp->my) && mtmp->mcansee
2819 && !mtmp->mspec_used && rn2(5)) {
2821 react = 1; /* "stunned" */
2822 already = (mtmp->mstun != 0);
2826 mtmp->mspec_used = mtmp->mspec_used + (stun + rn2(6));
2828 pline("%s stares piercingly at you!", Monnam(mtmp));
2830 pline("%s
\82Í
\97â
\82½
\82¢
\82Ü
\82È
\82´
\82µ
\82ð
\82 \82È
\82½
\82É
\8cü
\82¯
\82½
\81I", Monnam(mtmp));
2831 make_stunned((HStun & TIMEOUT) + (long) stun, TRUE);
2837 if (canseemon(mtmp) && !resists_blnd(&youmonst)
2838 && distu(mtmp->mx, mtmp->my) <= BOLT_LIM * BOLT_LIM) {
2840 react = rn1(2, 2); /* "puzzled" || "dazzled" */
2841 already = (mtmp->mcansee == 0);
2842 /* Archons gaze every round; we don't want cancelled ones
2843 giving the "seems puzzled/dazzled" message that often */
2844 if (mtmp->mcan && mtmp->data == &mons[PM_ARCHON] && rn2(5))
2847 int blnd = d((int) mattk->damn, (int) mattk->damd);
2850 You("are blinded by %s radiance!", s_suffix(mon_nam(mtmp)));
2852 You("%s
\82Ì
\8cõ
\82Å
\96Ú
\82ª
\8c©
\82¦
\82È
\82
\82È
\82Á
\82½
\81I", mon_nam(mtmp));
2853 make_blinded((long) blnd, FALSE);
2855 /* not blind at this point implies you're wearing
2856 the Eyes of the Overworld; make them block this
2857 particular stun attack too */
2859 Your1(vision_clears);
2861 long oldstun = (HStun & TIMEOUT), newstun = (long) rnd(3);
2863 /* we don't want to increment stun duration every time
2864 or sighted hero will become incapacitated */
2865 make_stunned(max(oldstun, newstun), TRUE);
2871 if (canseemon(mtmp) && couldsee(mtmp->mx, mtmp->my) && mtmp->mcansee
2872 && !mtmp->mspec_used && rn2(5)) {
2874 react = rn1(2, 4); /* "irritated" || "inflamed" */
2876 int dmg = d(2, 6), lev = (int) mtmp->m_lev;
2879 pline("%s attacks you with a fiery gaze!", Monnam(mtmp));
2881 pline("%s
\82Í
\89\8a\82Ì
\82É
\82ç
\82Ý
\8dU
\8c\82\82ð
\82µ
\82Ä
\82«
\82½
\81I", Monnam(mtmp));
2883 if (Fire_resistance) {
2885 pline_The("fire doesn't feel hot!");
2887 pline("
\89Î
\82Í
\82º
\82ñ
\82º
\82ñ
\94M
\82
\82È
\82¢
\81I");
2892 destroy_item(SCROLL_CLASS, AD_FIRE);
2894 destroy_item(POTION_CLASS, AD_FIRE);
2896 destroy_item(SPBOOK_CLASS, AD_FIRE);
2898 mdamageu(mtmp, dmg);
2902 #ifdef PM_BEHOLDER /* work in progress */
2904 if (canseemon(mtmp) && couldsee(mtmp->mx, mtmp->my) && mtmp->mcansee
2905 && multi >= 0 && !rn2(5) && !Sleep_resistance) {
2907 react = 6; /* "tired" */
2908 already = (mtmp->mfrozen != 0); /* can't happen... */
2910 fall_asleep(-rnd(10), TRUE);
2912 pline("%s gaze makes you very sleepy...",
2913 s_suffix(Monnam(mtmp)));
2915 pline("%s
\82Ì
\82É
\82ç
\82Ý
\82Å
\82 \82È
\82½
\82Í
\96°
\82
\82È
\82Á
\82½
\81D
\81D
\81D",
2922 if (canseemon(mtmp) && couldsee(mtmp->mx, mtmp->my) && mtmp->mcansee
2923 && (HFast & (INTRINSIC | TIMEOUT)) && !defends(AD_SLOW, uwep)
2926 react = 7; /* "dulled" */
2927 already = (mtmp->mspeed == MSLOW);
2934 #endif /* BEHOLDER */
2936 impossible("Gaze attack %d?", mattk->adtyp);
2940 if (Hallucination && rn2(3))
2941 react = rn2(SIZE(reactions));
2942 /* cancelled/hallucinatory feedback; monster might look "confused",
2943 "stunned",&c but we don't actually set corresponding attribute */
2945 pline("%s looks %s%s.", Monnam(mtmp),
2946 !rn2(3) ? "" : already ? "quite "
2947 : (!rn2(2) ? "a bit " : "somewhat "),
2950 pline("%s
\82Í%s%s
\82æ
\82¤
\82¾
\81D", Monnam(mtmp),
2951 !rn2(3) ? "" : already ? "
\82©
\82È
\82è"
2952 : (!rn2(2) ? "
\8f
\82µ" : "
\82¢
\82
\82ç
\82©"),
2959 /* mtmp hits you for n points damage */
2973 done_in_by(mtmp, DIED);
2977 /* returns 0 if seduction impossible,
2979 * 2 if wrong gender for nymph
2982 could_seduce(magr, mdef, mattk)
2983 struct monst *magr, *mdef;
2984 struct attack *mattk;
2986 struct permonst *pagr;
2987 boolean agrinvis, defperc;
2988 xchar genagr, gendef;
2990 if (is_animal(magr->data))
2992 if (magr == &youmonst) {
2993 pagr = youmonst.data;
2994 agrinvis = (Invis != 0);
2995 genagr = poly_gender();
2998 agrinvis = magr->minvis;
2999 genagr = gender(magr);
3001 if (mdef == &youmonst) {
3002 defperc = (See_invisible != 0);
3003 gendef = poly_gender();
3005 defperc = perceives(mdef->data);
3006 gendef = gender(mdef);
3009 if (agrinvis && !defperc
3010 && (!SYSOPT_SEDUCE || (mattk && mattk->adtyp != AD_SSEX)))
3013 if (pagr->mlet != S_NYMPH
3014 && ((pagr != &mons[PM_INCUBUS] && pagr != &mons[PM_SUCCUBUS])
3015 || (SYSOPT_SEDUCE && mattk && mattk->adtyp != AD_SSEX)))
3018 if (genagr == 1 - gendef)
3021 return (pagr->mlet == S_NYMPH) ? 2 : 0;
3024 /* Returns 1 if monster teleported */
3029 struct obj *ring, *nring;
3030 boolean fem = (mon->data == &mons[PM_SUCCUBUS]); /* otherwise incubus */
3031 int attr_tot, tried_gloves = 0;
3034 if (mon->mcan || mon->mspec_used) {
3036 pline("%s acts as though %s has got a %sheadache.", Monnam(mon),
3037 mhe(mon), mon->mcan ? "severe " : "");
3039 pline("%s
\82Í%s
\93ª
\82ª
\92É
\82¢
\82Ó
\82è
\82ð
\82µ
\82½
\81D", Monnam(mon),
3040 mon->mcan ? "
\82Ð
\82Ç
\82" : "");
3045 if (unconscious()) {
3047 pline("%s seems dismayed at your lack of response.", Monnam(mon));
3049 pline("%s
\82Í
\95Ô
\8e\96\82ª
\82È
\82¢
\82Ì
\82Å
\8bC
\82ª
\88Þ
\82¦
\82½
\82æ
\82¤
\82¾
\81D", Monnam(mon));
3055 pline("It caresses you...");
3057 pline("
\89½
\8eÒ
\82©
\82ª
\82 \82È
\82½
\82ð
\95ø
\82«
\82µ
\82ß
\82Ä
\82¢
\82é
\81D
\81D
\81D");
3060 You_feel("very attracted to %s.", mon_nam(mon));
3062 You("%s
\82É
\88ø
\82«
\82Â
\82¯
\82ç
\82ê
\82Ä
\82é
\82æ
\82¤
\82È
\8bC
\82ª
\82µ
\82½
\81D", mon_nam(mon));
3063 /* if in the process of putting armor on or taking armor off,
3064 interrupt that activity now */
3065 (void) stop_donning((struct obj *) 0);
3066 /* don't try to take off gloves if cursed weapon blocks them */
3070 for (ring = invent; ring; ring = nring) {
3072 if (ring->otyp != RIN_ADORNMENT)
3075 if (ring->owornmask && uarmg) {
3076 /* don't take off worn ring if gloves are in the way */
3077 if (!tried_gloves++)
3079 mayberem(uarmg, "gloves");
3081 mayberem(uarmg, "
\8f¬
\8eè");
3083 continue; /* next ring might not be worn */
3085 if (rn2(20) < ACURR(A_CHA)) {
3087 (void) safe_qbuf(qbuf, "\"That ",
3088 " looks pretty. May I have it?\"", ring,
3089 xname, simpleonames, "ring");
3091 (void) safe_qbuf(qbuf, "
\81u
\82È
\82ñ
\82Ä
\91f
\93G
\82È",
3092 "
\82Å
\82µ
\82å
\82¤
\81D
\82í
\82½
\82µ
\82É
\82
\82ê
\82Ü
\82¹
\82ñ
\81H
\81v", ring,
3093 xname, simpleonames, "
\8ew
\97Ö");
3095 makeknown(RIN_ADORNMENT);
3096 if (yn(qbuf) == 'n')
3100 pline("%s decides she'd like %s, and takes it.",
3101 Blind ? "She" : Monnam(mon), yname(ring));
3103 pline("%s
\82Í%s
\82ª
\82Æ
\82Ä
\82à
\8bC
\82É
\82¢
\82Á
\82Ä
\81C
\82»
\82ê
\82ð
\8eæ
\82è
\82 \82°
\82½
\81D",
3104 Blind ? "
\94Þ
\8f\97" : Monnam(mon), xname(ring));
3106 makeknown(RIN_ADORNMENT);
3107 if (ring == uleft || ring == uright)
3110 setuwep((struct obj *) 0);
3111 if (ring == uswapwep)
3112 setuswapwep((struct obj *) 0);
3113 if (ring == uquiver)
3114 setuqwep((struct obj *) 0);
3116 (void) mpickobj(mon, ring);
3118 if (uleft && uright && uleft->otyp == RIN_ADORNMENT
3119 && uright->otyp == RIN_ADORNMENT)
3121 if (ring == uleft || ring == uright)
3124 /* don't put on ring if gloves are in the way */
3125 if (!tried_gloves++)
3127 mayberem(uarmg, "gloves");
3129 mayberem(uarmg, "
\8f¬
\8eè");
3131 break; /* no point trying further rings */
3133 if (rn2(20) < ACURR(A_CHA)) {
3135 (void) safe_qbuf(qbuf, "\"That ",
3136 " looks pretty. Would you wear it for me?\"",
3137 ring, xname, simpleonames, "ring");
3139 (void) safe_qbuf(qbuf, "
\81u
\82¨
\82â
\82È
\82ñ
\82Ä
\82·
\82Î
\82ç
\82µ
\82¢",
3140 "
\82¾
\81D
\8e\84\82Ì
\82½
\82ß
\82É
\8ew
\82É
\82Í
\82ß
\82Ä
\82
\82ê
\82È
\82¢
\82©
\82¢
\81H
\81v",
3141 ring, xname, simpleonames, "
\8ew
\97Ö");
3143 makeknown(RIN_ADORNMENT);
3144 if (yn(qbuf) == 'n')
3148 pline("%s decides you'd look prettier wearing %s,",
3149 Blind ? "He" : Monnam(mon), yname(ring));
3151 pline("%s
\82Í%s
\82ð
\82Â
\82¯
\82½
\82 \82È
\82½
\82ª
\82æ
\82è
\96£
\97Í
\93I
\82¾
\82Æ
\8dl
\82¦
\81C",
3152 Blind ? "
\94Þ" : Monnam(mon), xname(ring));
3155 pline("and puts it on your finger.");
3157 pline("
\82 \82È
\82½
\82Ì
\8ew
\82É
\82»
\82ê
\82ð
\82Í
\82ß
\82½
\81D");
3159 makeknown(RIN_ADORNMENT);
3162 pline("%s puts %s on your right %s.",
3163 Blind ? "He" : Monnam(mon), the(xname(ring)),
3166 pline("%s
\82Í%s
\82ð
\82 \82È
\82½
\82Ì
\89E%s
\82É
\82Í
\82ß
\82½
\81D",
3167 Blind ? "
\94Þ" : Monnam(mon), the(xname(ring)),
3170 setworn(ring, RIGHT_RING);
3171 } else if (!uleft) {
3173 pline("%s puts %s on your left %s.",
3174 Blind ? "He" : Monnam(mon), the(xname(ring)),
3177 pline("%s
\82Í%s
\82ð
\82 \82È
\82½
\82Ì
\8d¶%s
\82É
\82Í
\82ß
\82½
\81D",
3178 Blind ? "
\94Þ" : Monnam(mon), the(xname(ring)),
3181 setworn(ring, LEFT_RING);
3182 } else if (uright && uright->otyp != RIN_ADORNMENT) {
3184 pline("%s replaces %s with %s.", Blind ? "He" : Monnam(mon),
3185 yname(uright), yname(ring));
3187 pline("%s
\82Í%s
\82ð%s
\82É
\82Æ
\82è
\82©
\82¦
\82½
\81D", Blind ? "
\94Þ" : Monnam(mon),
3188 yname(uright), xname(ring));
3191 setworn(ring, RIGHT_RING);
3192 } else if (uleft && uleft->otyp != RIN_ADORNMENT) {
3194 pline("%s replaces %s with %s.", Blind ? "He" : Monnam(mon),
3195 yname(uleft), yname(ring));
3197 pline("%s
\82Í%s
\82ð%s
\82É
\82Æ
\82è
\82©
\82¦
\82½
\81D", Blind ? "
\94Þ" : Monnam(mon),
3198 yname(uleft), xname(ring));
3201 setworn(ring, LEFT_RING);
3203 impossible("ring replacement");
3205 prinv((char *) 0, ring, 0L);
3209 if (!uarmc && !uarmf && !uarmg && !uarms && !uarmh && !uarmu)
3211 pline("%s murmurs sweet nothings into your ear.",
3212 Blind ? (fem ? "She" : "He") : Monnam(mon));
3214 pline("%s
\82Í
\82 \82È
\82½
\82Ì
\8e¨
\82à
\82Æ
\82Å
\8aÃ
\82¢
\82³
\82³
\82â
\82«
\82ð
\82Â
\82Ô
\82â
\82¢
\82½
\81D",
3215 Blind ? (fem ? "
\94Þ
\8f\97" : "
\94Þ") : Monnam(mon));
3219 pline("%s murmurs in your ear, while helping you undress.",
3220 Blind ? (fem ? "She" : "He") : Monnam(mon));
3222 pline("%s
\82Í
\8e¨
\82à
\82Æ
\82Å
\82 \82È
\82½
\82Ì
\95\9e\82ð
\92E
\82ª
\82¹
\82È
\82ª
\82ç
\82³
\82³
\82â
\82¢
\82½
\81D",
3223 Blind ? (fem ? "
\94Þ
\8f\97" : "
\94Þ") : Monnam(mon));
3225 mayberem(uarmc, cloak_simple_name(uarmc));
3228 mayberem(uarm, "suit");
3230 mayberem(uarm, "
\83X
\81[
\83c");
3232 mayberem(uarmf, "boots");
3234 mayberem(uarmf, "
\83u
\81[
\83c");
3237 mayberem(uarmg, "gloves");
3239 mayberem(uarmg, "
\8f¬
\8eè");
3241 mayberem(uarms, "shield");
3243 mayberem(uarms, "
\8f\82");
3244 mayberem(uarmh, helm_simple_name(uarmh));
3245 if (!uarmc && !uarm)
3247 mayberem(uarmu, "shirt");
3249 mayberem(uarmu, "
\83V
\83\83\83c");
3251 if (uarm || uarmc) {
3253 verbalize("You're such a %s; I wish...",
3254 flags.female ? "sweet lady" : "nice guy");
3256 verbalize("%s
\82¾
\81D
\81D
\81D
\82Æ
\82¢
\82¢
\82Ì
\82É
\81D",
3257 flags.female ? "
\83`
\83\83\81[
\83~
\83\93\83O" : "
\82·
\82Ä
\82«");
3259 if (!tele_restrict(mon))
3260 (void) rloc(mon, TRUE);
3263 if (u.ualign.type == A_CHAOTIC)
3266 /* by this point you have discovered mon's identity, blind or not... */
3268 pline("Time stands still while you and %s lie in each other's arms...",
3270 pline("
\82 \82È
\82½
\82Æ%s
\82ª
\95ø
\82«
\8d\87\82¤
\82Æ
\81C
\8e\9e\82ª
\8e~
\82Ü
\82Á
\82½
\82æ
\82¤
\82É
\8a´
\82¶
\82½
\81D
\81D
\81D",
3272 /* 3.6.1: a combined total for charisma plus intelligence of 35-1
3273 used to guarantee successful outcome; now total maxes out at 32
3274 as far as deciding what will happen; chance for bad outcome when
3275 Cha+Int is 32 or more is 2/35, a bit over 5.7% */
3276 attr_tot = ACURR(A_CHA) + ACURR(A_INT);
3277 if (rn2(35) > min(attr_tot, 32)) {
3278 /* Don't bother with mspec_used here... it didn't get tired! */
3280 pline("%s seems to have enjoyed it more than you...",
3282 pline("%s
\82Í
\82 \82È
\82½
\82æ
\82è
\8ay
\82µ
\82ñ
\82¾
\82æ
\82¤
\82¾
\81D
\81D
\81D",
3287 You_feel("drained of energy.");
3289 You("
\91Ì
\97Í
\82ª
\8fÁ
\96Õ
\82µ
\82½
\82æ
\82¤
\82È
\8bC
\82ª
\82µ
\82½
\81D");
3291 u.uenmax -= rnd(Half_physical_damage ? 5 : 10);
3292 exercise(A_CON, FALSE);
3298 You("are down in the dumps.");
3300 You("
\88Ó
\8bC
\8fÁ
\92¾
\82µ
\82½
\81D");
3301 (void) adjattrib(A_CON, -1, TRUE);
3302 exercise(A_CON, FALSE);
3307 Your("senses are dulled.");
3309 Your("
\8cÜ
\8a´
\82Í
\93Ý
\82Á
\82½
\81D");
3310 (void) adjattrib(A_WIS, -1, TRUE);
3311 exercise(A_WIS, FALSE);
3315 if (!resists_drli(&youmonst)) {
3317 You_feel("out of shape.");
3319 You("
\82
\82½
\82Ñ
\82ê
\82½
\81D");
3321 losexp("overexertion");
3323 losexp("
\89ß
\98J
\82Å");
3326 You("have a curious feeling...");
3328 You("
\95Ï
\82È
\8a´
\82¶
\82ª
\82µ
\82½
\81D
\81D
\81D");
3330 exercise(A_CON, FALSE);
3331 exercise(A_DEX, FALSE);
3332 exercise(A_WIS, FALSE);
3338 You_feel("exhausted.");
3340 You("
\94æ
\82ê
\82ð
\8a´
\82¶
\82½
\81D");
3341 exercise(A_STR, FALSE);
3344 losehp(Maybe_Half_Phys(tmp), "exhaustion", KILLED_BY);
3346 losehp(Maybe_Half_Phys(tmp), "
\90¸
\97Í
\82Ì
\8eg
\82¢
\82·
\82¬
\82Å", KILLED_BY);
3351 mon->mspec_used = rnd(100); /* monster is worn out */
3353 You("seem to have enjoyed it more than %s...", noit_mon_nam(mon));
3355 You("%s
\82æ
\82è
\82à
\8ay
\82µ
\82ñ
\82¾
\82æ
\82¤
\82¾
\81D
\81D
\81D", noit_mon_nam(mon));
3359 You_feel("raised to your full potential.");
3361 You("
\90ö
\8dÝ
\94\
\97Í
\82ª
\8d\82\82Ü
\82Á
\82½
\82æ
\82¤
\82É
\8a´
\82¶
\82½
\81D");
3362 exercise(A_CON, TRUE);
3363 u.uen = (u.uenmax += rnd(5));
3367 You_feel("good enough to do it again.");
3369 You("
\82à
\82¤
\88ê
\93x
\82Å
\82«
\82é
\82Æ
\8ev
\82Á
\82½
\81D");
3370 (void) adjattrib(A_CON, 1, TRUE);
3371 exercise(A_CON, TRUE);
3376 You("will always remember %s...", noit_mon_nam(mon));
3378 You("
\82¢
\82Â
\82Ü
\82Å
\82à%s
\82ð
\8ao
\82¦
\82Ä
\82é
\82¾
\82ë
\82¤
\81D
\81D
\81D", mon_nam(mon));
3379 (void) adjattrib(A_WIS, 1, TRUE);
3380 exercise(A_WIS, TRUE);
3385 pline("That was a very educational experience.");
3387 pline("
\82Æ
\82Ä
\82à
\8bM
\8fd
\82È
\8co
\8c±
\82¾
\82Á
\82½
\81D");
3389 exercise(A_WIS, TRUE);
3393 You_feel("restored to health!");
3395 You("
\82Æ
\82Ä
\82à
\8c\92\8dN
\82É
\82È
\82Á
\82½
\81I");
3399 exercise(A_STR, TRUE);
3405 if (mon->mtame) { /* don't charge */
3407 } else if (rn2(20) < ACURR(A_CHA)) {
3409 pline("%s demands that you pay %s, but you refuse...",
3410 noit_Monnam(mon), Blind ? (fem ? "her" : "him") : mhim(mon));
3412 pline("%s
\82Í
\82 \82È
\82½
\82É
\8bà
\82ð
\95¥
\82¤
\82æ
\82¤
\97v
\8b\81\82µ
\82½
\82ª
\81C
\82 \82È
\82½
\82Í
\8b\91\82ñ
\82¾
\81D
\81D
\81D",
3415 } else if (u.umonnum == PM_LEPRECHAUN) {
3417 pline("%s tries to take your money, but fails...", noit_Monnam(mon));
3419 pline("%s
\82Í
\8bà
\82ð
\8eæ
\82ë
\82¤
\82Æ
\82µ
\82½
\82ª
\81C
\8e¸
\94s
\82µ
\82½
\81D
\81D
\81D", noit_Monnam(mon));
3422 long umoney = money_cnt(invent);
3424 if (umoney > (long) LARGEST_INT - 10L)
3425 cost = (long) rnd(LARGEST_INT) + 500L;
3427 cost = (long) rnd((int) umoney + 10) + 500L;
3428 if (mon->mpeaceful) {
3437 verbalize("It's on the house!");
3439 verbalize("
\82±
\82ê
\82Í
\82¨
\82²
\82è%s
\81I", fem ? "
\82æ" : "
\82³");
3442 pline("%s takes %ld %s for services rendered!", noit_Monnam(mon),
3443 cost, currency(cost));
3445 pline("%s
\82Í
\83T
\81[
\83r
\83X
\97¿
\82Æ
\82µ
\82Ä%ld%s
\92D
\82¢
\8eæ
\82Á
\82½
\81I", noit_Monnam(mon),
3446 cost, currency(cost));
3448 money2mon(mon, cost);
3453 mon->mcan = 1; /* monster is worn out */
3454 if (!tele_restrict(mon))
3455 (void) rloc(mon, TRUE);
3466 if (!obj || !obj->owornmask)
3469 if (rn2(20) < ACURR(A_CHA)) {
3471 Sprintf(qbuf, "\"Shall I remove your %s, %s?\"", str,
3472 (!rn2(2) ? "lover" : !rn2(2) ? "dear" : "sweetheart"));
3474 Sprintf(qbuf,"
\81u%s
\82ð
\8eæ
\82Á
\82Ä
\82¢
\82¢
\81C%s
\81H
\81v", str,
3475 (!rn2(2) ? "
\82Ë
\82¥" : flags.female ? "
\83n
\83j
\81[" : "
\83_
\81[
\83\8a\83\93" ));
3477 if (yn(qbuf) == 'n')
3480 char hairbuf[BUFSZ];
3483 Sprintf(hairbuf, "let me run my fingers through your %s",
3487 flags.female ? "
\82È
\82ñ
\82ÄãY
\97í
\82È%s
\82È
\82ñ
\82¾" : "
\8a\95\82ð
\8eæ
\82Á
\82½
\82ç
\82È
\82©
\82È
\82©
\83C
\83J
\83X
\82¶
\82á
\82È
\82¢",
3491 verbalize("Take off your %s; %s.", str,
3493 ? "let's get a little closer"
3494 : (obj == uarmc || obj == uarms)
3497 ? "let me rub your feet"
3499 ? "they're too clumsy"
3501 ? "let me massage you"
3505 verbalize("%s
\82ð
\92E
\82¢
\82Å
\81D
\81D
\81D%s
\81D", str,
3507 ? "
\82à
\82¤
\82¿
\82å
\82Á
\82Æ
\8añ
\82è
\82»
\82Á
\82Ä"
3508 : (obj == uarmc || obj == uarms)
3509 ? "
\82»
\82¤
\82»
\82¤"
3511 ? (flags.female ? "ãY
\97í
\82È
\91«
\82¾
\82Ë" : "
\82¤
\82Ó
\82Á
\81C
\82½
\82
\82Ü
\82µ
\82¢
\91«
\82Ë")
3513 ? (flags.female ? "
\82È
\82ñ
\82Ä
\91f
\93G
\82È
\8eè
\82¾" : "
\82½
\82
\82Ü
\82µ
\82¢
\98r
\82Ë")
3515 ? (flags.female ? "
\82«
\82ê
\82¢
\82È
\91Ì
\82¾" : "
\82½
\82
\82Ü
\82µ
\82¢
\82Ì
\82Ë")
3520 remove_worn_item(obj, TRUE);
3524 * sequencing issue: a monster's attack might cause poly'd hero
3525 * to revert to normal form. The messages for passive counterattack
3526 * would look better if they came before reverting form, but we need
3527 * to know whether hero reverted in order to decide whether passive
3531 passiveum(olduasmon, mtmp, mattk)
3532 struct permonst *olduasmon;
3534 struct attack *mattk;
3537 struct attack *oldu_mattk = 0;
3540 * mattk == mtmp's attack that hit you;
3541 * oldu_mattk == your passive counterattack (even if mtmp's attack
3542 * has already caused you to revert to normal form).
3544 for (i = 0; !oldu_mattk; i++) {
3547 if (olduasmon->mattk[i].aatyp == AT_NONE
3548 || olduasmon->mattk[i].aatyp == AT_BOOM)
3549 oldu_mattk = &olduasmon->mattk[i];
3551 if (oldu_mattk->damn)
3552 tmp = d((int) oldu_mattk->damn, (int) oldu_mattk->damd);
3553 else if (oldu_mattk->damd)
3554 tmp = d((int) olduasmon->mlevel + 1, (int) oldu_mattk->damd);
3558 /* These affect the enemy even if you were "killed" (rehumanized) */
3559 switch (oldu_mattk->adtyp) {
3563 pline("%s is splashed by %s%s!", Monnam(mtmp),
3564 /* temporary? hack for sequencing issue: "your acid"
3565 looks strange coming immediately after player has
3566 been told that hero has reverted to normal form */
3567 !Upolyd ? "" : "your ", hliquid("acid"));
3569 pline("%s
\82Í%s%s
\82ð
\90H
\82ç
\82Á
\82½
\81I", Monnam(mtmp),
3570 /* temporary? hack for sequencing issue: "your acid"
3571 looks strange coming immediately after player has
3572 been told that hero has reverted to normal form */
3573 !Upolyd ? "" : "
\82 \82È
\82½
\82Ì", hliquid("
\8e_"));
3575 if (resists_acid(mtmp)) {
3577 pline("%s is not affected.", Monnam(mtmp));
3579 pline("%s
\82Í
\89e
\8b¿
\82ð
\8eó
\82¯
\82È
\82¢
\81D", Monnam(mtmp));
3585 erode_armor(mtmp, ERODE_CORRODE);
3587 acid_damage(MON_WEP(mtmp));
3589 case AD_STON: /* cockatrice */
3591 long protector = attk_protection((int) mattk->aatyp),
3592 wornitems = mtmp->misc_worn_check;
3594 /* wielded weapon gives same protection as gloves here */
3595 if (MON_WEP(mtmp) != 0)
3596 wornitems |= W_ARMG;
3598 if (!resists_ston(mtmp)
3600 || (protector != ~0L
3601 && (wornitems & protector) != protector))) {
3602 if (poly_when_stoned(mtmp->data)) {
3607 pline("%s turns to stone!", Monnam(mtmp));
3609 pline("%s
\82Í
\90Î
\82É
\82È
\82Á
\82½
\81I", Monnam(mtmp));
3611 xkilled(mtmp, XKILL_NOMSG);
3618 case AD_ENCH: /* KMH -- remove enchantment (disenchanter) */
3620 /* by_you==True: passive counterattack to hero's action
3622 (void) drain_item(mon_currwep, TRUE);
3632 /* These affect the enemy only if you are still a monster */
3634 switch (oldu_mattk->adtyp) {
3636 if (oldu_mattk->aatyp == AT_BOOM) {
3640 pline("
\82 \82È
\82½
\82Í
\94\9a\94
\82µ
\82½
\81I");
3641 /* KMH, balance patch -- this is okay with unchanging */
3646 case AD_PLYS: /* Floating eye */
3649 if (u.umonnum == PM_FLOATING_EYE) {
3652 if (mtmp->mcansee && haseyes(mtmp->data) && rn2(3)
3653 && (perceives(mtmp->data) || !Invis)) {
3656 pline("As a blind %s, you cannot defend yourself.",
3658 pline("%s
\82Í
\96Ú
\82ª
\8c©
\82¦
\82È
\82¢
\82Ì
\82Å
\81C
\82 \82È
\82½
\82Í
\82É
\82ç
\82Ý
\82Å
\96h
\8cä
\82Å
\82«
\82È
\82¢
\81D",
3659 youmonst.data->mname);
3661 if (mon_reflects(mtmp,
3663 "Your gaze is reflected by %s %s."))
3665 "
\82 \82È
\82½
\82Ì
\82É
\82ç
\82Ý
\82Í%s
\82Ì%s
\82Å
\94½
\8eË
\82µ
\82½
\81D"))
3668 pline("%s is frozen by your gaze!", Monnam(mtmp));
3670 pline("%s
\82Í
\82 \82È
\82½
\82Ì
\82É
\82ç
\82Ý
\82Å
\93®
\82¯
\82È
\82
\82È
\82Á
\82½
\81I", Monnam(mtmp));
3671 paralyze_monst(mtmp, tmp);
3675 } else { /* gelatinous cube */
3677 pline("%s is frozen by you.", Monnam(mtmp));
3679 pline("%s
\82Í
\93®
\82¯
\82È
\82¢
\81D", Monnam(mtmp));
3680 paralyze_monst(mtmp, tmp);
3684 case AD_COLD: /* Brown mold or blue jelly */
3685 if (resists_cold(mtmp)) {
3686 shieldeff(mtmp->mx, mtmp->my);
3688 pline("%s is mildly chilly.", Monnam(mtmp));
3690 pline("%s
\82Í
\97â
\82¦
\82½
\81D", Monnam(mtmp));
3691 golemeffects(mtmp, AD_COLD, tmp);
3696 pline("%s is suddenly very cold!", Monnam(mtmp));
3698 pline("%s
\82Í
\93Ë
\91R
\93\80\82è
\82Ã
\82¯
\82É
\82È
\82Á
\82½
\81I", Monnam(mtmp));
3702 if (u.mhmax > ((youmonst.data->mlevel + 1) * 8))
3703 (void) split_mon(&youmonst, mtmp);
3705 case AD_STUN: /* Yellow mold */
3709 pline("%s %s.", Monnam(mtmp),
3710 makeplural(stagger(mtmp->data, "stagger")));
3712 pline("%s
\82Í%s
\81D", Monnam(mtmp),
3713 jpast(stagger(mtmp->data, "
\82æ
\82ë
\82ß
\82")));
3718 case AD_FIRE: /* Red mold */
3719 if (resists_fire(mtmp)) {
3720 shieldeff(mtmp->mx, mtmp->my);
3722 pline("%s is mildly warm.", Monnam(mtmp));
3724 pline("%s
\82Í
\92g
\82©
\82
\82È
\82Á
\82½
\81D", Monnam(mtmp));
3726 golemeffects(mtmp, AD_FIRE, tmp);
3731 pline("%s is suddenly very hot!", Monnam(mtmp));
3733 pline("%s
\82Í
\93Ë
\91R
\94M
\82
\82È
\82Á
\82½
\81I", Monnam(mtmp));
3737 if (resists_elec(mtmp)) {
3738 shieldeff(mtmp->mx, mtmp->my);
3740 pline("%s is slightly tingled.", Monnam(mtmp));
3742 pline("%s
\82Í
\82¿
\82å
\82Á
\82Æ
\83s
\83\8a\83s
\83\8a\82µ
\82½
\81D", Monnam(mtmp));
3744 golemeffects(mtmp, AD_ELEC, tmp);
3749 pline("%s is jolted with your electricity!", Monnam(mtmp));
3751 pline("%s
\82Í
\93d
\8bC
\83V
\83\87\83b
\83N
\82ð
\82¤
\82¯
\82½
\81I", Monnam(mtmp));
3762 if ((mtmp->mhp -= tmp) <= 0) {
3764 pline("%s dies!", Monnam(mtmp));
3766 pline("%s
\82Í
\8e\80\82ñ
\82¾
\81I", Monnam(mtmp));
3767 xkilled(mtmp, XKILL_NOMSG);
3779 int mndx = monsndx(youmonst.data);
3782 return (struct monst *) 0;
3783 if (mvitals[mndx].mvflags & G_EXTINCT)
3784 return (struct monst *) 0;
3785 mon = makemon(youmonst.data, u.ux, u.uy, NO_MINVENT | MM_EDOG);
3789 mon = christen_monst(mon, plname);
3791 mon->m_lev = youmonst.data->mlevel;
3792 mon->mhpmax = u.mhmax;
3793 mon->mhp = u.mh / 2;