1 /* NetHack 3.6 mhitu.c $NHDT-Date: 1446854230 2015/11/06 23:57:10 $ $NHDT-Branch: master $:$NHDT-Revision: 1.130 $ */
2 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
3 /* NetHack may be freely redistributed. See license for details. */
5 /* JNetHack Copyright */
6 /* (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 */
7 /* For 3.4-, Copyright (c) SHIRAKATA Kentaro, 2002-2016 */
8 /* JNetHack may be freely redistributed. See license for details. */
13 STATIC_VAR NEARDATA struct obj *otmp;
15 STATIC_DCL boolean FDECL(u_slip_free, (struct monst *, struct attack *));
16 STATIC_DCL int FDECL(passiveum,
17 (struct permonst *, struct monst *, struct attack *));
19 STATIC_DCL void FDECL(mayberem, (struct obj *, const char *));
21 STATIC_DCL boolean FDECL(diseasemu, (struct permonst *));
22 STATIC_DCL int FDECL(hitmu, (struct monst *, struct attack *));
23 STATIC_DCL int FDECL(gulpmu, (struct monst *, struct attack *));
24 STATIC_DCL int FDECL(explmu, (struct monst *, struct attack *, BOOLEAN_P));
25 STATIC_DCL void FDECL(missmu, (struct monst *, BOOLEAN_P, struct attack *));
26 STATIC_DCL void FDECL(mswings, (struct monst *, struct obj *));
27 STATIC_DCL void FDECL(wildmiss, (struct monst *, struct attack *));
29 STATIC_DCL void FDECL(hitmsg, (struct monst *, struct attack *));
31 /* See comment in mhitm.c. If we use this a lot it probably should be */
32 /* changed to a parameter to mhitu. */
37 register struct monst *mtmp;
38 register struct attack *mattk;
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)) && !mtmp->mcan
45 && !mtmp->mspec_used) {
47 pline("%s %s you %s.", Monnam(mtmp), Blind ? "talks to" : "smiles at",
48 compat == 2 ? "engagingly" : "seductively");
50 pline("%s
\82Í
\82 \82È
\82½%s%s
\81D", Monnam(mtmp),
51 compat == 2 ? "
\82ð
\88ø
\82«
\82Â
\82¯
\82é
\82æ
\82¤
\82É" : "
\82É
\8dD
\88Ó
\82ð
\82æ
\82¹
\82é
\82æ
\82¤
\82É",
52 Blind ? "
\98b
\82µ
\82©
\82¯
\82½" : "
\94÷
\8fÎ
\82ñ
\82¾");
55 switch (mattk->aatyp) {
58 pline("%s bites!", Monnam(mtmp));
60 pline("%s
\82Í
\8a\9a\82Ý
\82Â
\82¢
\82½
\81I", Monnam(mtmp));
64 pline("%s kicks%c", Monnam(mtmp),
65 thick_skinned(youmonst.data) ? '.' : '!');
67 pline("%s
\82Í
\8fR
\82Æ
\82Î
\82µ
\82½%s",Monnam(mtmp),
68 thick_skinned(youmonst.data) ? "
\81D" : "
\81I");
73 pline("%s stings!", Monnam(mtmp));
75 pline("%s
\82Í
\93Ë
\82«
\82³
\82µ
\82½
\81I", Monnam(mtmp));
79 pline("%s butts!", Monnam(mtmp));
81 pline("%s
\82Í
\93ª
\93Ë
\82«
\82ð
\82
\82ç
\82í
\82µ
\82½
\81I", Monnam(mtmp));
85 pline("%s touches you!", Monnam(mtmp));
87 pline("%s
\82Í
\82 \82È
\82½
\82É
\90G
\82ê
\82½
\81I", Monnam(mtmp));
91 pline("%s tentacles suck you!", s_suffix(Monnam(mtmp)));
93 pline("%s
\82Ì
\90G
\8eè
\82ª
\82 \82È
\82½
\82Ì
\91Ì
\89t
\82ð
\8bz
\82¢
\82Æ
\82Á
\82½
\81I", Monnam(mtmp));
98 pline("%s explodes!", Monnam(mtmp));
100 pline("%s
\82Í
\94\9a\94
\82µ
\82½
\81I", Monnam(mtmp));
104 pline("%s hits!", Monnam(mtmp));
106 pline("%s
\82Ì
\8dU
\8c\82\82Í
\96½
\92\86\82µ
\82½
\81I", Monnam(mtmp));
110 /* monster missed you */
112 missmu(mtmp, nearmiss, mattk)
115 struct attack *mattk;
117 if (!canspotmon(mtmp))
118 map_invisible(mtmp->mx, mtmp->my);
120 if (could_seduce(mtmp, &youmonst, mattk) && !mtmp->mcan)
122 pline("%s pretends to be friendly.", Monnam(mtmp));
124 pline("%s
\82Í
\97F
\8dD
\93I
\82È
\82Ó
\82è
\82ð
\82µ
\82Ä
\82¢
\82é
\81D",Monnam(mtmp));
127 pline("%s %smisses!", Monnam(mtmp),
128 (nearmiss && flags.verbose) ? "just " : "");
130 pline("%s
\82Ì
\8dU
\8c\82\82Í%s
\82½
\81D", Monnam(mtmp),
131 (nearmiss && flags.verbose) ? "
\8bó
\82ð
\90Ø
\82Á" : "
\82Í
\82¸
\82ê");
137 /* monster swings obj */
143 if (flags.verbose && !Blind && mon_visible(mtmp)) {
145 pline("%s %s %s%s %s.", Monnam(mtmp),
146 (objects[otemp->otyp].oc_dir & PIERCE) ? "thrusts" : "swings",
147 (otemp->quan > 1L) ? "one of " : "", mhis(mtmp), xname(otemp));
149 pline("%s
\82Í%s%s
\81D", Monnam(mtmp),
151 (objects[otemp->otyp].oc_dir & PIERCE) ? "
\82ð
\93Ë
\82¢
\82½" : "
\82ð
\90U
\82è
\82Ü
\82í
\82µ
\82½");
156 /* return how a poison attack was delivered */
158 mpoisons_subj(mtmp, mattk)
160 struct attack *mattk;
162 if (mattk->aatyp == AT_WEAP) {
163 struct obj *mwep = (mtmp == &youmonst) ? uwep : MON_WEP(mtmp);
164 /* "Foo's attack was poisoned." is pretty lame, but at least
165 it's better than "sting" when not a stinging attack... */
167 return (!mwep || !mwep->opoisoned) ? "attack" : "weapon";
169 return (!mwep || !mwep->opoisoned) ? "
\8dU
\8c\82" : "
\95\90\8aí";
172 return (mattk->aatyp == AT_TUCH) ? "contact"
173 : (mattk->aatyp == AT_GAZE) ? "gaze"
174 : (mattk->aatyp == AT_BITE) ? "bite" : "sting";
176 return (mattk->aatyp == AT_TUCH) ? "
\90Ú
\90G"
177 : (mattk->aatyp == AT_GAZE) ? "
\82É
\82ç
\82Ý"
178 : (mattk->aatyp == AT_BITE) ? "
\8a\9a\82Ý
\82Â
\82«" : "
\93Ë
\82«
\82³
\82µ";
183 /* called when your intrinsic speed is taken away */
192 You("
\93®
\82«
\82ª
\92x
\82
\82È
\82Á
\82½
\81D");
193 else /* speed boots */
195 Your("quickness feels less natural.");
197 You("
\91¬
\82³
\82É
\82Â
\82¢
\82Ä
\82¢
\82¯
\82È
\82
\82È
\82Á
\82½
\81D");
198 exercise(A_DEX, FALSE);
201 /* monster attacked your displaced image */
203 wildmiss(mtmp, mattk)
204 register struct monst *mtmp;
205 register struct attack *mattk;
209 /* no map_invisible() -- no way to tell where _this_ is coming from */
213 if (!cansee(mtmp->mx, mtmp->my))
215 /* maybe it's attacking an image around the corner? */
217 compat = ((mattk->adtyp == AD_SEDU || mattk->adtyp == AD_SSEX)
218 && could_seduce(mtmp, &youmonst, (struct attack *) 0));
220 if (!mtmp->mcansee || (Invis && !perceives(mtmp->data))) {
223 mattk->aatyp == AT_BITE
225 : mattk->aatyp == AT_KICK
227 : (mattk->aatyp == AT_STNG || mattk->aatyp == AT_BUTT
228 || nolimbs(mtmp->data))
233 mattk->aatyp == AT_BITE
234 ? "
\8a\9a\82Ý
\82Â
\82"
235 : mattk->aatyp == AT_KICK
237 : (mattk->aatyp == AT_STNG || mattk->aatyp == AT_BUTT
238 || nolimbs(mtmp->data))
240 : "
\90U
\82è
\89ñ
\82·";
245 pline("%s tries to touch you and misses!", Monnam(mtmp));
247 pline("%s
\82Í
\82 \82È
\82½
\82É
\90G
\82ë
\82¤
\82Æ
\82µ
\82½
\82ª
\8e¸
\94s
\82µ
\82½
\81I", Monnam(mtmp));
252 pline("%s %s wildly and misses!", Monnam(mtmp), swings);
254 pline("%s
\82Í
\8c\83\82µ
\82%s
\82ª
\81C
\82Í
\82¸
\82µ
\82½
\81D", Monnam(mtmp), jpast(swings));
258 pline("%s attacks a spot beside you.", Monnam(mtmp));
260 pline("%s
\82Ì
\8dU
\8c\82\82Í
\82 \82È
\82½
\82Ì
\98e
\95 \82ð
\82©
\82·
\82ß
\82½
\81D", Monnam(mtmp));
264 pline("%s strikes at %s!", Monnam(mtmp),
265 levl[mtmp->mux][mtmp->muy].typ == WATER ? "empty water"
268 pline("%s
\82Í%s
\82ð
\91Å
\82¿
\82Â
\82¯
\82½
\81I", Monnam(mtmp),
269 levl[mtmp->mux][mtmp->muy].typ == WATER ? "
\90\85"
270 : "
\89½
\82à
\82È
\82¢
\82Æ
\82±
\82ë");
275 pline("%s %s wildly!", Monnam(mtmp), swings);
277 pline("%s
\82Í
\8c\83\82µ
\82%s
\81I", Monnam(mtmp), jpast(swings));
281 } else if (Displaced) {
284 pline("%s smiles %s at your %sdisplaced image...", Monnam(mtmp),
285 compat == 2 ? "engagingly" : "seductively",
286 Invis ? "invisible " : "");
288 pline("%s
\82Í%s
\82 \82È
\82½
\82Ì
\8c¶
\89e
\82É
\91Î
\82µ
\82Ä%s
\94÷
\8fÎ
\82ñ
\82¾
\81D
\81D
\81D", Monnam(mtmp),
289 Invis ? "
\93§
\96¾
\82È" : "",
290 compat == 2 ? "
\96£
\97Í
\93I
\82É" : "
\97U
\98f
\93I
\82É");
294 pline("%s strikes at your %sdisplaced image and misses you!",
295 /* Note: if you're both invisible and displaced,
296 * only monsters which see invisible will attack your
297 * displaced image, since the displaced image is also
300 Monnam(mtmp), Invis ? "invisible " : "");
302 pline("%s
\82Í
\82 \82È
\82½
\82Ì%s
\8c¶
\89e
\82ð
\8dU
\8c\82\82µ
\81C
\82Í
\82¸
\82µ
\82½
\81I",
303 Monnam(mtmp), Invis ? "
\93§
\96¾
\82È" : "");
306 } else if (Underwater) {
307 /* monsters may miss especially on water level where
308 bubbles shake the player here and there */
311 pline("%s reaches towards your distorted image.", Monnam(mtmp));
313 pline("%s
\82Í
\82 \82È
\82½
\82Ì
\98c
\82ñ
\82¾
\8c¶
\89e
\82Ì
\95û
\82Ö
\8cü
\82©
\82Á
\82½
\81D", Monnam(mtmp));
316 pline("%s is fooled by water reflections and misses!",
318 pline("%s
\82Í
\90\85\82Ì
\94½
\8eË
\82É
\82¾
\82Ü
\82³
\82ê
\81C
\82Í
\82¸
\82µ
\82½
\81I",
322 impossible("%s attacks you without knowing your location?",
327 expels(mtmp, mdat, message)
329 struct permonst *mdat; /* if mtmp is polymorphed, mdat != mtmp->data */
335 You("get regurgitated!");
337 You("
\93f
\82«
\82¾
\82³
\82ê
\82½
\81I");
343 for (i = 0; i < NATTK; i++)
344 if (mdat->mattk[i].aatyp == AT_ENGL)
346 if (mdat->mattk[i].aatyp != AT_ENGL)
347 impossible("Swallower has no engulfing attack?");
349 if (is_whirly(mdat)) {
350 switch (mdat->mattk[i].adtyp) {
353 Strcpy(blast, " in a shower of sparks");
355 Strcpy(blast, "
\82Ì
\89Î
\89Ô
\82Ì
\89J
\82Ì
\92\86\82©
\82ç");
359 Strcpy(blast, " in a blast of frost");
361 Strcpy(blast, "
\82Ì
\97â
\8bC
\82Ì
\95\97\82Ì
\92\86\82©
\82ç");
366 Strcpy(blast, " with a squelch");
368 Strcpy(blast, "
\82©
\82ç
\93f
\82«
\8fo
\82³
\82ê
\82é
\82æ
\82¤
\82É");
370 You("get expelled from %s%s!", mon_nam(mtmp), blast);
372 You("%s%s
\92E
\8fo
\82µ
\82½
\81I", mon_nam(mtmp), blast);
376 unstuck(mtmp); /* ball&chain returned in unstuck() */
380 /* to cover for a case where mtmp is not in a next square */
381 if (um_dist(mtmp->mx, mtmp->my, 1))
383 pline("Brrooaa... You land hard at some distance.");
385 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");
388 /* select a monster's next attack, possibly substituting for its usual one */
390 getmattk(mptr, indx, prev_result, alt_attk_buf)
391 struct permonst *mptr;
392 int indx, prev_result[];
393 struct attack *alt_attk_buf;
395 struct attack *attk = &mptr->mattk[indx];
397 /* prevent a monster with two consecutive disease or hunger attacks
398 from hitting with both of them on the same turn; if the first has
399 already hit, switch to a stun attack for the second */
400 if (indx > 0 && prev_result[indx - 1] > 0
401 && (attk->adtyp == AD_DISE || attk->adtyp == AD_PEST
402 || attk->adtyp == AD_FAMN)
403 && attk->adtyp == mptr->mattk[indx - 1].adtyp) {
404 *alt_attk_buf = *attk;
406 attk->adtyp = AD_STUN;
412 * mattacku: monster attacks you
413 * returns 1 if monster dies (e.g. "yellow light"), 0 otherwise
414 * Note: if you're displaced or invisible the monster might attack the
416 * Assumption: it's attacking you or an empty square; if there's another
417 * monster which it attacks by mistake, the caller had better
422 register struct monst *mtmp;
424 struct attack *mattk, alt_attk;
425 int i, j, tmp, sum[NATTK];
426 struct permonst *mdat = mtmp->data;
427 boolean ranged = (distu(mtmp->mx, mtmp->my) > 3);
428 /* Is it near you? Affects your actions */
429 boolean range2 = !monnear(mtmp, mtmp->mux, mtmp->muy);
430 /* Does it think it's near you? Affects its actions */
431 boolean foundyou = (mtmp->mux == u.ux && mtmp->muy == u.uy);
432 /* Is it attacking you or your image? */
433 boolean youseeit = canseemon(mtmp);
434 /* Might be attacking your image around the corner, or
435 * invisible, or you might be blind....
437 boolean skipnonmagc = FALSE;
438 /* Are further physical attack attempts useless? */
442 if (mtmp->mhp <= 0 || (Underwater && !is_swimmer(mtmp->data)))
445 /* If swallowed, can only be affected by u.ustuck */
447 if (mtmp != u.ustuck)
449 u.ustuck->mux = u.ux;
450 u.ustuck->muy = u.uy;
454 return 0; /* stomachs can't hurt you! */
456 } else if (u.usteed) {
457 if (mtmp == u.usteed)
458 /* Your steed won't attack you */
460 /* Orcs like to steal and eat horses and the like */
461 if (!rn2(is_orc(mtmp->data) ? 2 : 4)
462 && distu(mtmp->mx, mtmp->my) <= 2) {
463 /* Attack your steed instead */
464 i = mattackm(mtmp, u.usteed);
465 if ((i & MM_AGR_DIED))
467 /* make sure steed is still alive and within range */
468 if ((i & MM_DEF_DIED) || !u.usteed
469 || distu(mtmp->mx, mtmp->my) > 2)
471 /* Let your steed retaliate */
472 return !!(mattackm(u.usteed, mtmp) & MM_DEF_DIED);
476 if (u.uundetected && !range2 && foundyou && !u.uswallow) {
477 if (!canspotmon(mtmp))
478 map_invisible(mtmp->mx, mtmp->my);
480 if (is_hider(youmonst.data) && u.umonnum != PM_TRAPPER) {
482 coord cc; /* maybe we need a unexto() function? */
486 You("fall from the %s!", ceiling(u.ux, u.uy));
488 You("%s
\82©
\82ç
\97\8e\82¿
\82½
\81I", ceiling(u.ux,u.uy));
489 /* take monster off map now so that its location
490 is eligible for placing hero; we assume that a
491 removed monster remembers its old spot <mx,my> */
492 remove_monster(mtmp->mx, mtmp->my);
493 if (!enexto(&cc, u.ux, u.uy, youmonst.data)
494 /* a fish won't voluntarily swap positions
495 when it's in water and hero is over land */
496 || (mtmp->data->mlet == S_EEL
497 && is_pool(mtmp->mx, mtmp->my)
498 && !is_pool(u.ux, u.uy))) {
499 /* couldn't find any spot for hero; this used to
500 kill off attacker, but now we just give a "miss"
501 message and keep both mtmp and hero at their
502 original positions; hero has become unconcealed
503 so mtmp's next move will be a regular attack */
504 place_monster(mtmp, mtmp->mx, mtmp->my); /* put back */
505 newsym(u.ux, u.uy); /* u.uundetected was toggled */
507 pline("%s draws back as you drop!", Monnam(mtmp));
509 pline("
\82 \82È
\82½
\82ª
\97\8e\82¿
\82é
\82±
\82Æ
\82Å%s
\82Í
\88ø
\82«
\96ß
\82³
\82ê
\82½
\81I", Monnam(mtmp));
513 /* put mtmp at hero's spot and move hero to <cc.x,.y> */
514 newsym(mtmp->mx, mtmp->my); /* finish removal */
515 place_monster(mtmp, u.ux, u.uy);
518 /* tail hasn't grown, so if it now occupies <cc.x,.y>
519 then one of its original spots must be free */
520 if (m_at(cc.x, cc.y))
521 (void) enexto(&cc, u.ux, u.uy, youmonst.data);
523 teleds(cc.x, cc.y, TRUE); /* move hero */
527 if (youmonst.data->mlet != S_PIERCER)
528 return 0; /* lurkers don't attack */
530 obj = which_armor(mtmp, WORN_HELMET);
531 if (obj && is_metallic(obj)) {
533 Your("blow glances off %s %s.", s_suffix(mon_nam(mtmp)),
534 helm_simple_name(obj));
536 Your("
\8dU
\8c\82\82Í%s
\82Ì%s
\82ð
\82©
\82·
\82ß
\82½
\82¾
\82¯
\82¾
\82Á
\82½
\81D", mon_nam(mtmp),
537 helm_simple_name(obj));
540 if (3 + find_mac(mtmp) <= rnd(20)) {
542 pline("%s is hit by a falling piercer (you)!",
544 pline("%s
\82Í
\97\8e\82¿
\82Ä
\82«
\82½
\90j(
\82 \82È
\82½)
\82Å
\8f\9d\82Â
\82¢
\82½
\81I",
546 if ((mtmp->mhp -= d(3, 6)) < 1)
550 pline("%s is almost hit by a falling piercer (you)!",
552 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",
560 pline("It tries to move where you are hiding.");
562 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");
564 /* Ugly kludge for eggs. The message is phrased so as
565 * to be directed at the monster, not the player,
566 * which makes "laid by you" wrong. For the
567 * parallelism to work, we can't rephrase it, so we
568 * zap the "laid by you" momentarily instead.
570 struct obj *obj = level.objects[u.ux][u.uy];
572 if (obj || u.umonnum == PM_TRAPPER
573 || (youmonst.data->mlet == S_EEL
574 && is_pool(u.ux, u.uy))) {
575 int save_spe = 0; /* suppress warning */
579 if (obj->otyp == EGG)
582 if (youmonst.data->mlet == S_EEL
583 || u.umonnum == PM_TRAPPER)
586 "Wait, %s! There's a hidden %s named %s there!",
587 m_monnam(mtmp), youmonst.data->mname, plname);
589 "
\91Ò
\82Ä
\81C%s
\81I%s
\82Æ
\82¢
\82¤
\96¼
\82Ì%s
\82ª
\89B
\82ê
\82Ä
\82¢
\82é
\81I",
590 m_monnam(mtmp), plname, youmonst.data->mname);
595 "Wait, %s! There's a %s named %s hiding under %s!",
596 m_monnam(mtmp), youmonst.data->mname, plname,
597 doname(level.objects[u.ux][u.uy]));
599 "
\91Ò
\82Ä
\81C%s
\81I%s
\82Æ
\82¢
\82¤
\96¼
\82Ì%s
\82ª%s
\82Ì
\89º
\82É
\89B
\82ê
\82Ä
\82¢
\82é
\81I",
600 m_monnam(mtmp), plname, youmonst.data->mname,
601 doname(level.objects[u.ux][u.uy]));
606 impossible("hiding under nothing?");
613 /* hero might be a mimic, concealed via #monster */
614 if (youmonst.data->mlet == S_MIMIC && youmonst.m_ap_type && !range2
615 && foundyou && !u.uswallow) {
616 boolean sticky = sticks(youmonst.data);
618 if (!canspotmon(mtmp))
619 map_invisible(mtmp->mx, mtmp->my);
620 if (sticky && !youseeit)
622 pline("It gets stuck on you.");
624 pline("
\89½
\8eÒ
\82©
\82ª
\82 \82È
\82½
\82Ì
\8fã
\82É
\82Ì
\82µ
\82©
\82©
\82Á
\82½
\81D");
627 pline("Wait, %s! That's a %s named %s!", m_monnam(mtmp),
628 youmonst.data->mname, plname);
630 pline("
\91Ò
\82Ä
\81C%s
\81I
\82»
\82ê
\82Í%s
\82Æ
\82¢
\82¤
\96¼
\82Ì%s
\82¾
\81I", m_monnam(mtmp),
631 plname, youmonst.data->mname);
635 youmonst.m_ap_type = M_AP_NOTHING;
636 youmonst.mappearance = 0;
641 /* non-mimic hero might be mimicking an object after eating m corpse */
642 if (youmonst.m_ap_type == M_AP_OBJECT && !range2 && foundyou
644 if (!canspotmon(mtmp))
645 map_invisible(mtmp->mx, mtmp->my);
648 pline("%s %s!", Something, (likes_gold(mtmp->data)
649 && youmonst.mappearance == GOLD_PIECE)
650 ? "tries to pick you up"
653 pline("%s
\82Í%s
\81I", Something, (likes_gold(mtmp->data)
654 && youmonst.mappearance == GOLD_PIECE)
655 ? "
\82 \82È
\82½
\82ð
\8fE
\82¨
\82¤
\82Æ
\82µ
\82½"
656 : "
\96³
\8e\8b\82µ
\82½");
660 pline("Wait, %s! That %s is really %s named %s!", m_monnam(mtmp),
661 mimic_obj_name(&youmonst), an(mons[u.umonnum].mname),
664 pline("
\91Ò
\82Ä
\81C%s
\81I
\82»
\82Ì%s
\82Í%s
\82Æ
\82¢
\82¤
\96¼
\82Ì%s
\82¾
\81I", m_monnam(mtmp),
665 mimic_obj_name(&youmonst), plname,
666 mons[u.umonnum].mname);
668 if (multi < 0) { /* this should always be the case */
672 Sprintf(buf, "You appear to be %s again.",
673 Upolyd ? (const char *) an(youmonst.data->mname)
674 : (const char *) "yourself");
676 Sprintf(buf, "
\82 \82È
\82½
\82Í
\82Ó
\82½
\82½
\82Ñ%s
\82É
\82È
\82Á
\82½
\81D",
677 Upolyd ? (const char *) youmonst.data->mname
678 : (const char *) "
\8e©
\95ª
\8e©
\90g");
680 unmul(buf); /* immediately stop mimicking */
685 /* Work out the armor class differential */
686 tmp = AC_VALUE(u.uac) + 10; /* tmp ~= 0 - 20 */
690 if ((Invis && !perceives(mdat)) || !mtmp->mcansee)
697 /* make eels visible the moment they hit/miss us */
698 if (mdat->mlet == S_EEL && mtmp->minvis && cansee(mtmp->mx, mtmp->my)) {
700 newsym(mtmp->mx, mtmp->my);
703 /* Special demon handling code */
704 if ((mtmp->cham == NON_PM) && is_demon(mdat) && !range2
705 && mtmp->data != &mons[PM_BALROG] && mtmp->data != &mons[PM_SUCCUBUS]
706 && mtmp->data != &mons[PM_INCUBUS])
707 if (!mtmp->mcan && !rn2(13))
708 (void) msummon(mtmp);
710 /* Special lycanthrope handling code */
711 if ((mtmp->cham == NON_PM) && is_were(mdat) && !range2) {
712 if (is_human(mdat)) {
713 if (!rn2(5 - (night() * 2)) && !mtmp->mcan)
715 } else if (!rn2(30) && !mtmp->mcan)
719 if (!rn2(10) && !mtmp->mcan) {
720 int numseen, numhelp;
721 char buf[BUFSZ], genericwere[BUFSZ];
724 Strcpy(genericwere, "creature");
726 Strcpy(genericwere, "
\89½
\82©");
727 numhelp = were_summon(mdat, FALSE, &numseen, genericwere);
730 pline("%s summons help!", Monnam(mtmp));
732 pline("%s
\82Í
\8f\95\82¯
\82ð
\8cÄ
\82ñ
\82¾
\81I", Monnam(mtmp));
736 You_feel("hemmed in.");
738 pline("
\89½
\8eÒ
\82©
\82É
\88Í
\82Ü
\82ê
\82½
\82æ
\82¤
\82È
\8bC
\82ª
\82·
\82é
\81D");
741 pline("But none comes.");
743 pline("
\82µ
\82©
\82µ
\89½
\82à
\97\88\82È
\82©
\82Á
\82½
\81D");
745 const char *from_nowhere;
749 pline("%s %s!", Something, makeplural(growl_sound(mtmp)));
751 pline("
\89½
\82©
\82ª%s
\81I", growl_sound(mtmp));
755 from_nowhere = " from nowhere";
757 from_nowhere = "
\82Ç
\82±
\82©
\82ç
\82Æ
\82à
\82È
\82";
761 You_feel("hemmed in.");
763 pline("
\89½
\8eÒ
\82©
\82É
\88Í
\82Ü
\82ê
\82½
\82æ
\82¤
\82È
\8bC
\82ª
\82·
\82é
\81D");
767 Sprintf(buf, "%s appears", an(genericwere));
769 Sprintf(buf, "%s appear",
770 makeplural(genericwere));
771 pline("%s%s!", upstart(buf), from_nowhere);
773 pline("%s
\82ª%s
\8c»
\82ê
\82½
\81I",
774 genericwere, from_nowhere);
777 } /* else no help came; but you didn't know it tried */
782 if (u.uinvulnerable) {
783 /* monsters won't attack you */
784 if (mtmp == u.ustuck)
786 pline("%s loosens its grip slightly.", Monnam(mtmp));
788 pline("%s
\82Í
\92÷
\82ß
\82Â
\82¯
\82ð
\82í
\82¸
\82©
\82É
\8aÉ
\82ß
\82½
\81D", Monnam(mtmp));
790 if (youseeit || sensemon(mtmp))
792 pline("%s starts to attack you, but pulls back.",
794 pline("%s
\82Í
\82 \82È
\82½
\82ð
\8dU
\8c\82\82µ
\82©
\82¯
\82½
\82ª
\81C
\82Ð
\82Á
\82±
\82ß
\82½
\81D",
798 You_feel("%s move nearby.", something);
800 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");
805 /* Unlike defensive stuff, don't let them use item _and_ attack. */
806 if (find_offensive(mtmp)) {
807 int foo = use_offensive(mtmp);
813 for (i = 0; i < NATTK; i++) {
815 mattk = getmattk(mdat, i, sum, &alt_attk);
816 if ((u.uswallow && mattk->aatyp != AT_ENGL)
817 || (skipnonmagc && mattk->aatyp != AT_MAGC))
820 switch (mattk->aatyp) {
821 case AT_CLAW: /* "hand to hand" attacks */
828 if (!range2 && (!MON_WEP(mtmp) || mtmp->mconf || Conflict
829 || !touch_petrifies(youmonst.data))) {
831 if (tmp > (j = rnd(20 + i))) {
832 if (mattk->aatyp != AT_KICK
833 || !thick_skinned(youmonst.data))
834 sum[i] = hitmu(mtmp, mattk);
836 missmu(mtmp, (tmp == j), mattk);
838 wildmiss(mtmp, mattk);
839 /* skip any remaining non-spell attacks */
845 case AT_HUGS: /* automatic if prev two attacks succeed */
846 /* Note: if displaced, prev attacks never succeeded */
847 if ((!range2 && i >= 2 && sum[i - 1] && sum[i - 2])
849 sum[i] = hitmu(mtmp, mattk);
852 case AT_GAZE: /* can affect you either ranged or not */
853 /* Medusa gaze already operated through m_respond in
854 dochug(); don't gaze more than once per round. */
855 if (mdat != &mons[PM_MEDUSA])
856 sum[i] = gazemu(mtmp, mattk);
859 case AT_EXPL: /* automatic hit if next to, and aimed at you */
861 sum[i] = explmu(mtmp, mattk, foundyou);
867 if (u.uswallow || tmp > (j = rnd(20 + i))) {
868 /* Force swallowing monster to be
869 * displayed even when player is
872 sum[i] = gulpmu(mtmp, mattk);
874 missmu(mtmp, (tmp == j), mattk);
876 } else if (is_animal(mtmp->data)) {
878 pline("%s gulps some air!", Monnam(mtmp));
880 pline("%s
\82Í
\91§
\82ð
\8bz
\82¢
\82±
\82ñ
\82¾
\81I", Monnam(mtmp));
884 pline("%s lunges forward and recoils!", Monnam(mtmp));
886 pline("%s
\82Í
\93Ë
\90i
\82µ
\81C
\96ß
\82Á
\82½
\81I", Monnam(mtmp));
889 You_hear("a %s nearby.",
890 is_whirly(mtmp->data) ? "rushing noise"
893 You_hear("
\82·
\82®
\82»
\82Î
\82Å%s
\89¹
\82ð
\95·
\82¢
\82½
\81D",
894 is_whirly(mtmp->data) ? "
\93Ë
\8c\82\82µ
\82Ä
\82
\82é"
895 : "
\83s
\83V
\83\83\83b
\82Æ
\82¢
\82¤");
902 sum[i] = breamu(mtmp, mattk);
903 /* Note: breamu takes care of displacement */
907 sum[i] = spitmu(mtmp, mattk);
908 /* Note: spitmu takes care of displacement */
912 if (!Is_rogue_level(&u.uz))
917 /* Rare but not impossible. Normally the monster
918 * wields when 2 spaces away, but it can be
919 * teleported or whatever....
921 if (mtmp->weapon_check == NEED_WEAPON || !MON_WEP(mtmp)) {
922 mtmp->weapon_check = NEED_HTH_WEAPON;
923 /* mon_wield_item resets weapon_check as appropriate */
924 if (mon_wield_item(mtmp) != 0)
928 otmp = MON_WEP(mtmp);
930 hittmp = hitval(otmp, &youmonst);
934 if (tmp > (j = dieroll = rnd(20 + i)))
935 sum[i] = hitmu(mtmp, mattk);
937 missmu(mtmp, (tmp == j), mattk);
938 /* KMH -- Don't accumulate to-hit bonuses */
942 wildmiss(mtmp, mattk);
943 /* skip any remaining non-spell attacks */
950 sum[i] = buzzmu(mtmp, mattk);
952 sum[i] = castmu(mtmp, mattk, TRUE, foundyou);
955 default: /* no attack */
960 /* give player a chance of waking up before dying -kaa */
961 if (sum[i] == 1) { /* successful attack */
962 if (u.usleep && u.usleep < monstermoves && !rn2(10)) {
965 nomovemsg = "The combat suddenly awakens you.";
967 nomovemsg = "
\82 \82È
\82½
\82Í
\8bN
\82±
\82³
\82ê
\82½
\81D";
971 return 1; /* attacker dead */
973 break; /* attacker teleported, no more attacks */
974 /* sum[i] == 0: unsuccessful attack */
981 struct permonst *mdat;
983 if (Sick_resistance) {
985 You_feel("a slight illness.");
987 You("
\82·
\82±
\82µ
\8bC
\95ª
\82ª
\88«
\82
\82È
\82Á
\82½
\82æ
\82¤
\82È
\8bC
\82ª
\82µ
\82½
\81D");
990 make_sick(Sick ? Sick / 3L + 1L : (long) rn1(ACURR(A_CON), 20),
991 mdat->mname, TRUE, SICK_NONVOMITABLE);
996 /* check whether slippery clothing protects from hug or wrap attack */
998 u_slip_free(mtmp, mattk)
1000 struct attack *mattk;
1002 struct obj *obj = (uarmc ? uarmc : uarm);
1006 if (mattk->adtyp == AD_DRIN)
1009 /* if your cloak/armor is greased, monster slips off; this
1010 protection might fail (33% chance) when the armor is cursed */
1011 if (obj && (obj->greased || obj->otyp == OILSKIN_CLOAK)
1012 && (!obj->cursed || rn2(3))) {
1014 pline("%s %s your %s %s!", Monnam(mtmp),
1015 (mattk->adtyp == AD_WRAP) ? "slips off of"
1016 : "grabs you, but cannot hold onto",
1017 obj->greased ? "greased" : "slippery",
1018 /* avoid "slippery slippery cloak"
1019 for undiscovered oilskin cloak */
1020 (obj->greased || objects[obj->otyp].oc_name_known)
1022 : cloak_simple_name(obj));
1024 pline("%s
\82Í%s%s%s
\81I", Monnam(mtmp),
1025 obj->greased ? "
\96û
\82Ì
\93h
\82ç
\82ê
\82½" : "
\8a\8a\82è
\82â
\82·
\82¢",
1026 (obj->greased || objects[obj->otyp].oc_name_known)
1028 : cloak_simple_name(obj),
1029 (mattk->adtyp == AD_WRAP) ? "
\82Å
\8a\8a\82Á
\82½"
1030 : "
\82ð
\82Â
\82©
\82Ü
\82¦
\82æ
\82¤
\82Æ
\82µ
\82½
\82ª
\81C
\82Å
\82«
\82È
\82©
\82Á
\82½");
1033 if (obj->greased && !rn2(2)) {
1035 pline_The("grease wears off.");
1037 pline("
\8e\89\82Í
\97\8e\82¿
\82Ä
\82µ
\82Ü
\82Á
\82½
\81D");
1046 /* armor that sufficiently covers the body might be able to block magic */
1054 boolean is_you = (mon == &youmonst),
1055 gotprot = is_you ? (EProtection != 0L)
1056 /* high priests have innate protection */
1057 : (mon->data == &mons[PM_HIGH_PRIEST]);
1059 for (o = is_you ? invent : mon->minvent; o; o = o->nobj) {
1060 /* a_can field is only applicable for armor (which must be worn) */
1061 if ((o->owornmask & W_ARMOR) != 0L) {
1062 armpro = objects[o->otyp].a_can;
1066 /* if we've already confirmed Protection, skip additional checks */
1067 if (is_you || gotprot)
1070 /* omit W_SWAPWEP+W_QUIVER; W_ART+W_ARTI handled by protects() */
1071 wearmask = W_ARMOR | W_ACCESSORY;
1072 if (o->oclass == WEAPON_CLASS || is_weptool(o))
1074 if (protects(o, ((o->owornmask & wearmask) != 0L) ? TRUE : FALSE))
1079 /* extrinsic Protection increases mc by 1 */
1082 } else if (mc < 1) {
1083 /* intrinsic Protection is weaker (play balance; obtaining divine
1084 protection is too easy); it confers minimum mc 1 instead of 0 */
1085 if ((is_you && ((HProtection && u.ublessed) || u.uspellprot))
1086 /* aligned priests and angels have innate intrinsic Protection */
1087 || (mon->data == &mons[PM_ALIGNED_PRIEST] || is_minion(mon->data)))
1094 * hitmu: monster hits you
1095 * returns 2 if monster dies (e.g. "yellow light"), 1 otherwise
1096 * 3 if the monster lives but teleported/paralyzed, so it can't keep
1101 register struct monst *mtmp;
1102 register struct attack *mattk;
1104 register struct permonst *mdat = mtmp->data;
1105 register int uncancelled, ptmp;
1106 int dmg, armpro, permdmg;
1108 struct permonst *olduasmon = youmonst.data;
1111 if (!canspotmon(mtmp))
1112 map_invisible(mtmp->mx, mtmp->my);
1114 /* If the monster is undetected & hits you, you should know where
1115 * the attack came from.
1117 if (mtmp->mundetected && (hides_under(mdat) || mdat->mlet == S_EEL)) {
1118 mtmp->mundetected = 0;
1119 if (!(Blind ? Blind_telepat : Unblind_telepat)) {
1125 if ((obj = level.objects[mtmp->mx][mtmp->my]) != 0) {
1127 if (Blind && !obj->dknown)
1129 else if (is_pool(mtmp->mx, mtmp->my) && !Underwater)
1134 pline("%s was hidden under %s!", Amonnam(mtmp), what);
1136 if (Blind && !obj->dknown)
1137 pline("%s
\82ª
\89½
\82©
\82Ì
\89º
\82É
\89B
\82ê
\82Ä
\82¢
\82é
\81I", Amonnam(mtmp));
1138 else if (is_pool(mtmp->mx, mtmp->my) && !Underwater)
1139 pline("%s
\82ª
\90\85\92\86\82É
\89B
\82ê
\82Ä
\82¢
\82é
\81I", Amonnam(mtmp));
1141 pline("%s
\82ª%s
\82Ì
\89º
\82É
\89B
\82ê
\82Ä
\82¢
\82é
\81I", Amonnam(mtmp), doname(obj));
1144 newsym(mtmp->mx, mtmp->my);
1148 /* First determine the base damage done */
1149 dmg = d((int) mattk->damn, (int) mattk->damd);
1150 if ((is_undead(mdat) || is_vampshifter(mtmp)) && midnight())
1151 dmg += d((int) mattk->damn, (int) mattk->damd); /* extra damage */
1153 /* Next a cancellation factor.
1154 * Use uncancelled when cancellation factor takes into account certain
1155 * armor's special magic protection. Otherwise just use !mtmp->mcan.
1157 armpro = magic_negation(&youmonst);
1158 uncancelled = !mtmp->mcan && (rn2(10) >= 3 * armpro);
1161 /* Now, adjust damages via resistances or specific attacks */
1162 switch (mattk->adtyp) {
1164 if (mattk->aatyp == AT_HUGS && !sticks(youmonst.data)) {
1165 if (!u.ustuck && rn2(2)) {
1166 if (u_slip_free(mtmp, mattk)) {
1171 pline("%s grabs you!", Monnam(mtmp));
1173 pline("%s
\82É
\82Â
\82©
\82Ü
\82¦
\82ç
\82ê
\82Ä
\82¢
\82é
\81I", Monnam(mtmp));
1175 } else if (u.ustuck == mtmp) {
1176 exercise(A_STR, FALSE);
1178 You("are being %s.", (mtmp->data == &mons[PM_ROPE_GOLEM])
1182 You("%s
\82Ä
\82¢
\82é
\81D", (mtmp->data == &mons[PM_ROPE_GOLEM])
1183 ? "
\8eñ
\82ð
\8di
\82ß
\82ç
\82ê"
1184 : "
\89\9f\82µ
\82Â
\82Ô
\82³
\82ê");
1187 } else { /* hand to hand weapon */
1188 if (mattk->aatyp == AT_WEAP && otmp) {
1191 if (otmp->otyp == CORPSE
1192 && touch_petrifies(&mons[otmp->corpsenm])) {
1195 pline("%s hits you with the %s corpse.", Monnam(mtmp),
1196 mons[otmp->corpsenm].mname);
1198 pline("%s
\82Í%s
\82Ì
\8e\80\91Ì
\82Å
\8dU
\8c\82\82µ
\82½
\81D", Monnam(mtmp),
1199 mons[otmp->corpsenm].mname);
1204 dmg += dmgval(otmp, &youmonst);
1207 if (!(otmp->oartifact
1208 && artifact_hit(mtmp, &youmonst, otmp, &dmg, dieroll)))
1209 hitmsg(mtmp, mattk);
1212 if (objects[otmp->otyp].oc_material == SILVER
1215 pline_The("silver sears your flesh!");
1217 pline("
\82 \82È
\82½
\82Ì
\91Ì
\82Í
\8bâ
\82Å
\8fÄ
\82©
\82ê
\82½
\81I");
1218 exercise(A_CON, FALSE);
1220 /* this redundancy necessary because you have
1221 to take the damage _before_ being cloned;
1222 need to have at least 2 hp left to split */
1228 if (u.mh - tmp > 1 && objects[otmp->otyp].oc_material == IRON
1229 && (u.umonnum == PM_BLACK_PUDDING
1230 || u.umonnum == PM_BROWN_PUDDING)) {
1232 exercise(A_STR, FALSE);
1233 /* inflict damage now; we know it can't be fatal */
1236 dmg = 0; /* don't inflict more damage below */
1239 You("divide as %s hits you!", mon_nam(mtmp));
1241 pline("%s
\82Ì
\8dU
\8c\82\82É
\82æ
\82Á
\82Ä
\82 \82È
\82½
\82Í
\95ª
\97ô
\82µ
\82½
\81I", mon_nam(mtmp));
1243 rustm(&youmonst, otmp);
1244 } else if (mattk->aatyp != AT_TUCH || dmg != 0
1245 || mtmp != u.ustuck)
1246 hitmsg(mtmp, mattk);
1250 hitmsg(mtmp, mattk);
1251 if (!diseasemu(mdat))
1255 hitmsg(mtmp, mattk);
1258 pline("You're %s!", on_fire(youmonst.data, mattk));
1260 pline("
\82 \82È
\82½
\82Í%s
\81I", on_fire(youmonst.data, mattk));
1261 if (youmonst.data == &mons[PM_STRAW_GOLEM]
1262 || youmonst.data == &mons[PM_PAPER_GOLEM]) {
1266 You("
\8fÅ
\82°
\82½
\81I");
1267 /* KMH -- this is okay with unchanging */
1270 } else if (Fire_resistance) {
1272 pline_The("fire doesn't feel hot!");
1274 pline("
\89Î
\82Í
\82º
\82ñ
\82º
\82ñ
\94M
\82
\82È
\82¢
\81I");
1277 if ((int) mtmp->m_lev > rn2(20))
1278 destroy_item(SCROLL_CLASS, AD_FIRE);
1279 if ((int) mtmp->m_lev > rn2(20))
1280 destroy_item(POTION_CLASS, AD_FIRE);
1281 if ((int) mtmp->m_lev > rn2(25))
1282 destroy_item(SPBOOK_CLASS, AD_FIRE);
1288 hitmsg(mtmp, mattk);
1291 pline("You're covered in frost!");
1293 You("
\95X
\82Å
\95¢
\82í
\82ê
\82½
\81I");
1294 if (Cold_resistance) {
1296 pline_The("frost doesn't seem cold!");
1298 pline("
\95X
\82Í
\97â
\82³
\82ð
\8a´
\82¶
\82³
\82¹
\82È
\82¢
\81I");
1301 if ((int) mtmp->m_lev > rn2(20))
1302 destroy_item(POTION_CLASS, AD_COLD);
1307 hitmsg(mtmp, mattk);
1312 You("
\93d
\8c\82\82ð
\82
\82ç
\82Á
\82½
\81I");
1313 if (Shock_resistance) {
1315 pline_The("zap doesn't shock you!");
1317 pline("
\93d
\8c\82\82Í
\82µ
\82Ñ
\82ê
\82ð
\8a´
\82¶
\82³
\82¹
\82È
\82¢
\81I");
1320 if ((int) mtmp->m_lev > rn2(20))
1321 destroy_item(WAND_CLASS, AD_ELEC);
1322 if ((int) mtmp->m_lev > rn2(20))
1323 destroy_item(RING_CLASS, AD_ELEC);
1328 hitmsg(mtmp, mattk);
1329 if (uncancelled && multi >= 0 && !rn2(5)) {
1330 if (Sleep_resistance)
1332 fall_asleep(-rnd(10), TRUE);
1335 You("are put to sleep!");
1337 You("
\96°
\82è
\82É
\82¨
\82¿
\82½
\81I");
1340 You("are put to sleep by %s!", mon_nam(mtmp));
1342 You("%s
\82É
\96°
\82ç
\82³
\82ê
\82½
\81I", mon_nam(mtmp));
1346 if (can_blnd(mtmp, &youmonst, mattk->aatyp, (struct obj *) 0)) {
1349 pline("%s blinds you!", Monnam(mtmp));
1351 pline("%s
\82Ì
\8dU
\8c\82\82Å
\96Ú
\82ª
\8c©
\82¦
\82È
\82
\82È
\82Á
\82½
\81I", Monnam(mtmp));
1352 make_blinded(Blinded + (long) dmg, FALSE);
1354 Your1(vision_clears);
1367 hitmsg(mtmp, mattk);
1368 if (uncancelled && !rn2(8)) {
1370 Sprintf(buf, "%s %s", s_suffix(Monnam(mtmp)),
1371 mpoisons_subj(mtmp, mattk));
1373 Sprintf(buf, "%s
\82Ì%s", Monnam(mtmp),
1374 mpoisons_subj(mtmp, mattk));
1376 poisoned(buf, ptmp, mdat->mname, 30, FALSE);
1380 hitmsg(mtmp, mattk);
1381 if (defends(AD_DRIN, uwep) || !has_head(youmonst.data)) {
1383 You("don't seem harmed.");
1385 You("
\8f\9d\82Â
\82¢
\82Ä
\82¢
\82È
\82¢
\82æ
\82¤
\82¾
\81D");
1386 /* Not clear what to do for green slimes */
1389 if (u_slip_free(mtmp, mattk))
1392 if (uarmh && rn2(8)) {
1393 /* not body_part(HEAD) */
1395 Your("%s blocks the attack to your head.",
1397 Your("%s
\82ª
\93ª
\82Ö
\82Ì
\8dU
\8c\82\82ð
\96h
\82¢
\82¾
\81D",
1398 helm_simple_name(uarmh));
1401 if (Half_physical_damage)
1402 dmg = (dmg + 1) / 2;
1403 mdamageu(mtmp, dmg);
1405 if (!uarmh || uarmh->otyp != DUNCE_CAP) {
1406 /* eat_brains() will miss if target is mindless (won't
1407 happen here; hero is considered to retain his mind
1408 regardless of current shape) or is noncorporeal
1409 (can't happen here; no one can poly into a ghost
1410 or shade) so this check for missing is academic */
1411 if (eat_brains(mtmp, &youmonst, TRUE, (int *) 0) == MM_MISS)
1414 /* adjattrib gives dunce cap message when appropriate */
1415 (void) adjattrib(A_INT, -rnd(2), FALSE);
1416 forget_levels(25); /* lose memory of 25% of levels */
1417 forget_objects(25); /* lose memory of 25% of objects */
1420 hitmsg(mtmp, mattk);
1421 if (uncancelled && multi >= 0 && !rn2(3)) {
1424 You("momentarily stiffen.");
1426 You("
\88ê
\8fu
\8dd
\92¼
\82µ
\82½
\81D");
1432 You("
\93®
\82¯
\82È
\82¢
\81I");
1435 You("are frozen by %s!", mon_nam(mtmp));
1437 pline("%s
\82É
\82æ
\82Á
\82Ä
\93®
\82¯
\82È
\82
\82È
\82Á
\82½
\81I", mon_nam(mtmp));
1438 nomovemsg = You_can_move_again;
1441 multi_reason = "paralyzed by a monster";
1443 multi_reason = "
\89ö
\95¨
\82É
\96\83á
\83\82³
\82¹
\82ç
\82ê
\82½
\8c\84\82É";
1444 exercise(A_DEX, FALSE);
1449 hitmsg(mtmp, mattk);
1450 if (uncancelled && !rn2(3) && !Drain_resistance) {
1452 losexp("life drainage");
1454 losexp("
\90¶
\96½
\97Í
\82ð
\8bz
\8eû
\82³
\82ê
\82Ä");
1458 register long side = rn2(2) ? RIGHT_SIDE : LEFT_SIDE;
1460 const char *sidestr = (side == RIGHT_SIDE) ? "right" : "left";
1462 const char *sidestr = (side == RIGHT_SIDE) ? "
\89E" : "
\8d¶";
1464 /* This case is too obvious to ignore, but Nethack is not in
1465 * general very good at considering height--most short monsters
1466 * still _can_ attack you when you're flying or mounted.
1467 * [FIXME: why can't a flying attacker overcome this?]
1469 if (u.usteed || Levitation || Flying) {
1471 pline("%s tries to reach your %s %s!", Monnam(mtmp), sidestr,
1474 pline("%s
\82Í
\82 \82È
\82½
\82Ì%s%s
\82É
\8dU
\8c\82\82µ
\82æ
\82¤
\82Æ
\82µ
\82½
\81I", Monnam(mtmp), sidestr,
1478 } else if (mtmp->mcan) {
1480 pline("%s nuzzles against your %s %s!", Monnam(mtmp), sidestr,
1483 pline("%s
\82Í
\82 \82È
\82½
\82Ì%s%s
\82É
\95@
\82ð
\82·
\82è
\82æ
\82¹
\82½
\81I", Monnam(mtmp), sidestr,
1489 if (rn2(2) && (uarmf->otyp == LOW_BOOTS
1490 || uarmf->otyp == IRON_SHOES))
1492 pline("%s pricks the exposed part of your %s %s!",
1493 Monnam(mtmp), sidestr, body_part(LEG));
1495 pline("%s
\82Í
\82 \82È
\82½
\82Ì%s%s
\82ð
\82¿
\82
\82è
\82Æ
\8eh
\82µ
\82½
\81I",
1496 Monnam(mtmp), sidestr, body_part(LEG));
1500 pline("%s pricks through your %s boot!", Monnam(mtmp),
1503 pline("%s
\82Í
\82 \82È
\82½
\82Ì%s
\82Ì
\8cC
\82²
\82µ
\82É
\82¿
\82
\82è
\82Æ
\8eh
\82µ
\82½
\81I", Monnam(mtmp),
1508 pline("%s scratches your %s boot!", Monnam(mtmp),
1511 pline("%s
\82Í
\82 \82È
\82½
\82Ì%s
\82Ì
\8cC
\82ð
\82Ð
\82Á
\82©
\82¢
\82½
\81I", Monnam(mtmp),
1519 pline("%s pricks your %s %s!", Monnam(mtmp), sidestr,
1522 pline("%s
\82Í
\82 \82È
\82½
\82Ì%s%s
\82ð
\82¿
\82
\82è
\82Æ
\8eh
\82µ
\82½
\81I", Monnam(mtmp), sidestr,
1525 set_wounded_legs(side, rnd(60 - ACURR(A_DEX)));
1526 exercise(A_STR, FALSE);
1527 exercise(A_DEX, FALSE);
1531 case AD_STON: /* cockatrice */
1532 hitmsg(mtmp, mattk);
1537 You_hear("a cough from %s!", mon_nam(mtmp));
1539 You_hear("%s
\82ª
\83S
\83z
\83b
\83S
\83z
\83b
\82Æ
\82¢
\82¤
\89¹
\82ð
\95·
\82¢
\82½
\81I", mon_nam(mtmp));
1543 You_hear("%s hissing!", s_suffix(mon_nam(mtmp)));
1545 You_hear("%s
\82ª
\83V
\83\85\81[
\83b
\82Æ
\82¢
\82¤
\90º
\82ð
\95·
\82¢
\82½
\81I", mon_nam(mtmp));
1547 || (flags.moonphase == NEW_MOON && !have_lizard())) {
1549 if (!Stoned && !Stone_resistance
1550 && !(poly_when_stoned(youmonst.data)
1551 && polymon(PM_STONE_GOLEM))) {
1552 int kformat = KILLED_BY_AN;
1553 const char *kname = mtmp->data->mname;
1555 if (mtmp->data->geno & G_UNIQ) {
1556 if (!type_is_pname(mtmp->data))
1558 kformat = KILLED_BY;
1560 make_stoned(5L, (char *) 0, kformat, kname);
1562 /* done_in_by(mtmp, STONING); */
1569 hitmsg(mtmp, mattk);
1570 if (uncancelled && !u.ustuck && !sticks(youmonst.data))
1574 if ((!mtmp->mcan || u.ustuck == mtmp) && !sticks(youmonst.data)) {
1575 if (!u.ustuck && !rn2(10)) {
1576 if (u_slip_free(mtmp, mattk)) {
1580 pline("%s swings itself around you!", Monnam(mtmp));
1582 pline("%s
\82Í
\82 \82È
\82½
\82É
\91Ì
\82ð
\97\8d\82Ý
\82Â
\82©
\82¹
\82½
\81I", Monnam(mtmp));
1585 } else if (u.ustuck == mtmp) {
1586 if (is_pool(mtmp->mx, mtmp->my) && !Swimming && !Amphibious) {
1587 boolean moat = (levl[mtmp->mx][mtmp->my].typ != POOL)
1588 && (levl[mtmp->mx][mtmp->my].typ != WATER)
1589 && !Is_medusa_level(&u.uz)
1590 && !Is_waterlevel(&u.uz);
1593 pline("%s drowns you...", Monnam(mtmp));
1595 pline("
\82 \82È
\82½
\82Í%s
\82É
\97\8d\82Ý
\82Â
\82©
\82ê
\82Ä
\93M
\82ê
\82½
\81D
\81D
\81D", Monnam(mtmp));
1596 killer.format = KILLED_BY_AN;
1598 Sprintf(killer.name, "%s by %s",
1599 moat ? "moat" : "pool of water",
1600 an(mtmp->data->mname));
1602 Sprintf(buf, "%s
\82Ì%s
\82É
\97\8d\82Ý
\82Â
\82©
\82ê
\82Ä",
1603 moat ? "
\96x" : "
\92r",
1607 } else if (mattk->aatyp == AT_HUGS)
1609 You("are being crushed.");
1611 You("
\82Â
\82Ô
\82³
\82ê
\82Â
\82Â
\82 \82é
\81D");
1616 pline("%s brushes against your %s.", Monnam(mtmp),
1619 pline("%s
\82Í
\82 \82È
\82½
\82Ì%s
\82É
\90G
\82ê
\82½
\81D", Monnam(mtmp),
1627 hitmsg(mtmp, mattk);
1628 if (uncancelled && !rn2(4) && u.ulycn == NON_PM
1629 && !Protection_from_shape_changers && !defends(AD_WERE, uwep)) {
1631 You_feel("feverish.");
1633 You("
\94M
\82ª
\82 \82é
\82æ
\82¤
\82È
\8bC
\82ª
\82µ
\82½
\81D");
1634 exercise(A_CON, FALSE);
1635 u.ulycn = monsndx(mdat);
1636 retouch_equipment(2);
1640 hitmsg(mtmp, mattk);
1641 if (youmonst.data->mlet == mdat->mlet)
1648 if (SYSOPT_SEDUCE) {
1649 if (could_seduce(mtmp, &youmonst, mattk) == 1 && !mtmp->mcan)
1655 case AD_SITM: /* for now these are the same */
1657 if (is_animal(mtmp->data)) {
1658 hitmsg(mtmp, mattk);
1661 /* Continue below */
1662 } else if (dmgtype(youmonst.data, AD_SEDU)
1663 || (SYSOPT_SEDUCE && dmgtype(youmonst.data, AD_SSEX))) {
1665 pline("%s %s.", Monnam(mtmp),
1667 ? "brags about the goods some dungeon explorer provided"
1668 : "makes some remarks about how difficult theft is lately");
1670 pline("%s
\82Í%s
\81D", Monnam(mtmp),
1672 ? "
\82 \82é
\96À
\8b{
\92T
\8c\9f\89Æ
\82ª
\92u
\82¢
\82Ä
\82Á
\82½
\95i
\95¨
\82ð
\8e©
\96\9d\82µ
\82½"
1673 : "
\8dÅ
\8bß
\90Þ
\93\90\82ª
\82¢
\82©
\82É
\8d¢
\93ï
\82©
\92W
\81X
\82Æ
\8fq
\82×
\82½");
1675 if (!tele_restrict(mtmp))
1676 (void) rloc(mtmp, TRUE);
1678 } else if (mtmp->mcan) {
1681 pline("%s tries to %s you, but you seem %s.",
1682 Adjmonnam(mtmp, "plain"),
1683 flags.female ? "charm" : "seduce",
1684 flags.female ? "unaffected" : "uninterested");
1686 pline("%s
\82Í
\82 \82È
\82½
\82ð%s
\82µ
\82æ
\82¤
\82Æ
\82µ
\82½
\81C
\82µ
\82©
\82µ
\82 \82È
\82½
\82Í%s
\81D",
1687 Adjmonnam(mtmp, "
\92n
\96¡
\82È"),
1688 flags.female ? "
\96£
\97¹" : "
\97U
\98f",
1689 flags.female ? "
\89e
\8b¿
\82ð
\8eó
\82¯
\82È
\82¢" : "
\8b»
\96¡
\82ª
\82È
\82¢");
1693 if (!tele_restrict(mtmp))
1694 (void) rloc(mtmp, TRUE);
1700 switch (steal(mtmp, buf)) {
1706 if (!is_animal(mtmp->data) && !tele_restrict(mtmp))
1707 (void) rloc(mtmp, TRUE);
1708 if (is_animal(mtmp->data) && *buf) {
1709 if (canseemon(mtmp))
1711 pline("%s tries to %s away with %s.", Monnam(mtmp),
1712 locomotion(mtmp->data, "run"), buf);
1714 pline("%s
\82Í%s
\82ð
\8e\9d\82Á
\82Ä
\93¦
\82°
\8fo
\82µ
\82½
\81D", Monnam(mtmp),
1718 monflee(mtmp, 0, FALSE, FALSE);
1724 hitmsg(mtmp, mattk);
1725 /* when the Wiz hits, 1/20 steals the amulet */
1726 if (u.uhave.amulet || u.uhave.bell || u.uhave.book || u.uhave.menorah
1727 || u.uhave.questart) /* carrying the Quest Artifact */
1733 hitmsg(mtmp, mattk);
1737 Your("position suddenly seems very uncertain!");
1739 pline("
\8e©
\95ª
\82Ì
\82¢
\82é
\88Ê
\92u
\82ª
\93Ë
\91R
\95s
\96¾
\8am
\82É
\82È
\82Á
\82½
\81I");
1744 hitmsg(mtmp, mattk);
1747 if (u.umonnum == PM_IRON_GOLEM) {
1751 You("
\8eK
\82Ñ
\82Â
\82¢
\82½
\81I");
1752 /* KMH -- this is okay with unchanging */
1756 erode_armor(&youmonst, ERODE_RUST);
1759 hitmsg(mtmp, mattk);
1762 erode_armor(&youmonst, ERODE_CORRODE);
1765 hitmsg(mtmp, mattk);
1768 if (u.umonnum == PM_WOOD_GOLEM || u.umonnum == PM_LEATHER_GOLEM) {
1772 You("
\95\85\82Á
\82½
\81I");
1773 /* KMH -- this is okay with unchanging */
1777 erode_armor(&youmonst, ERODE_ROT);
1780 /* a cancelled nurse is just an ordinary monster,
1781 * nurses don't heal those that cause petrification */
1782 if (mtmp->mcan || (Upolyd && touch_petrifies(youmonst.data))) {
1783 hitmsg(mtmp, mattk);
1786 if (!uwep && !uarmu && !uarm && !uarmh && !uarms && !uarmg && !uarmc
1788 boolean goaway = FALSE;
1790 pline("%s hits! (I hope you don't mind.)", Monnam(mtmp));
1792 pline("%s
\82Ì
\8dU
\8c\82\82Í
\96½
\92\86\82µ
\82½
\81D(
\8bC
\82É
\82µ
\82È
\82¢
\82æ
\82¤
\82É
\81D)", Monnam(mtmp));
1796 /* no upper limit necessary; effect is temporary */
1806 /* hard upper limit via nurse care: 25 * ulevel */
1807 if (u.uhpmax < 5 * u.ulevel + d(2 * u.ulevel, 10))
1812 if (u.uhp > u.uhpmax)
1816 exercise(A_STR, TRUE);
1818 exercise(A_CON, TRUE);
1820 make_sick(0L, (char *) 0, FALSE, SICK_ALL);
1825 } else if (!rn2(33)) {
1826 if (!tele_restrict(mtmp))
1827 (void) rloc(mtmp, TRUE);
1828 monflee(mtmp, d(3, 6), TRUE, FALSE);
1833 if (Role_if(PM_HEALER)) {
1834 if (!Deaf && !(moves % 5))
1836 verbalize("Doc, I can't help you unless you cooperate.");
1838 verbalize("
\83h
\83N
\83^
\81[
\81I
\8b¦
\97Í
\82ð
\82¨
\82Ë
\82ª
\82¢
\82µ
\82Ü
\82·
\82í
\81D");
1841 hitmsg(mtmp, mattk);
1845 hitmsg(mtmp, mattk);
1846 if (!night() && mdat == &mons[PM_GREMLIN])
1848 if (!mtmp->mcan && !rn2(10)) {
1852 You_hear("laughter.");
1854 You_hear("
\8fÎ
\82¢
\90º
\82ð
\95·
\82¢
\82½
\81D");
1857 pline("%s chuckles.", Monnam(mtmp));
1859 pline("%s
\82Í
\83N
\83X
\83N
\83X
\8fÎ
\82Á
\82½
\81D", Monnam(mtmp));
1861 if (u.umonnum == PM_CLAY_GOLEM) {
1863 pline("Some writing vanishes from your head!");
1865 pline("
\82¢
\82
\82Â
\82©
\82Ì
\95¶
\8e\9a\82ª
\82 \82È
\82½
\82Ì
\93ª
\82©
\82ç
\8fÁ
\82¦
\82½
\81I");
1866 /* KMH -- this is okay with unchanging */
1874 hitmsg(mtmp, mattk);
1875 if (!mtmp->mcan && !rn2(4)) {
1876 make_stunned((HStun & TIMEOUT) + (long) dmg, TRUE);
1881 hitmsg(mtmp, mattk);
1882 if (!mtmp->mcan && !rn2(3))
1883 if (Acid_resistance) {
1885 pline("You're covered in acid, but it seems harmless.");
1887 pline("
\8e_
\82Å
\95¢
\82í
\82ê
\82½
\81D
\82µ
\82©
\82µ
\8f\9d\82Â
\82©
\82È
\82¢
\81D");
1891 pline("You're covered in acid! It burns!");
1893 You("
\8e_
\82Å
\95¢
\82í
\82ê
\8fÄ
\82¯
\82½
\81I");
1894 exercise(A_STR, FALSE);
1900 hitmsg(mtmp, mattk);
1901 if (uncancelled && HFast && !defends(AD_SLOW, uwep) && !rn2(4))
1905 hitmsg(mtmp, mattk);
1906 if (uncancelled && !rn2(4))
1911 hitmsg(mtmp, mattk);
1912 if (!mtmp->mcan && !rn2(4) && !mtmp->mspec_used) {
1913 mtmp->mspec_used = mtmp->mspec_used + (dmg + rn2(6));
1916 You("are getting even more confused.");
1918 You("
\82Ü
\82·
\82Ü
\82·
\8d¬
\97\90\82µ
\82½
\81D");
1921 You("are getting confused.");
1923 You("
\8d¬
\97\90\82µ
\82Ä
\82«
\82½
\81D");
1924 make_confused(HConfusion + dmg, FALSE);
1930 pline("%s reaches out with its deadly touch.", Monnam(mtmp));
1932 pline("%s
\82Í
\8e\80\82Ì
\98r
\82ð
\82Ì
\82Î
\82µ
\82½
\81D", Monnam(mtmp));
1933 if (is_undead(youmonst.data)) {
1934 /* Still does normal damage */
1936 pline("Was that the touch of death?");
1938 pline("
\8d¡
\82Ì
\82Í
\8e\80\82Ì
\90é
\8d\90\82¾
\82Á
\82½
\82Ì
\82©
\82È
\81H");
1946 killer.format = KILLED_BY_AN;
1948 Strcpy(killer.name, "touch of death");
1950 Strcpy(killer.name, "
\8e\80\82Ì
\90é
\8d\90\82Å");
1954 } /* else FALLTHRU */
1955 default: /* case 16: ... case 5: */
1957 You_feel("your life force draining away...");
1959 You("
\91Ì
\97Í
\82ª
\92D
\82í
\82ê
\82Ä
\82¢
\82
\82æ
\82¤
\82È
\8bC
\82ª
\82µ
\82½
\81D
\81D
\81D");
1960 permdmg = 1; /* actual damage done below */
1968 shieldeff(u.ux, u.uy);
1970 pline("Lucky for you, it didn't work!");
1972 pline("
\89^
\82Ì
\82æ
\82¢
\82±
\82Æ
\82É
\82È
\82ñ
\82Æ
\82à
\82È
\82©
\82Á
\82½
\81I");
1979 pline("%s reaches out, and you feel fever and chills.", Monnam(mtmp));
1981 pline("%s
\82Í
\98r
\82ð
\82Ì
\82Î
\82µ
\82½
\81C
\82 \82È
\82½
\82Í
\88«
\8a¦
\82ð
\8a´
\82¶
\82½
\81D", Monnam(mtmp));
1982 (void) diseasemu(mdat); /* plus the normal damage */
1986 pline("%s reaches out, and your body shrivels.", Monnam(mtmp));
1988 pline("%s
\82Í
\98r
\82ð
\90L
\82Î
\82µ
\82½
\81C
\82 \82È
\82½
\82Ì
\91Ì
\82Í
\82µ
\82È
\82Ñ
\82½
\81D", Monnam(mtmp));
1989 exercise(A_CON, FALSE);
1991 morehungry(rn1(40, 40));
1992 /* plus the normal damage */
1995 hitmsg(mtmp, mattk);
1998 if (flaming(youmonst.data)) {
2000 pline_The("slime burns away!");
2002 pline_The("
\83X
\83\89\83C
\83\80\82Í
\94R
\82¦
\82½
\81I");
2004 } else if (Unchanging || noncorporeal(youmonst.data)
2005 || youmonst.data == &mons[PM_GREEN_SLIME]) {
2007 You("are unaffected.");
2009 You("
\89e
\8b¿
\82ð
\8eó
\82¯
\82È
\82¢
\81D");
2011 } else if (!Slimed) {
2013 You("don't feel very well.");
2015 You("
\8bC
\95ª
\82ª
\88«
\82¢
\81D");
2016 make_slimed(10L, (char *) 0);
2017 delayed_killer(SLIMED, KILLED_BY_AN, mtmp->data->mname);
2022 pline("
\83E
\83Q
\83F
\81[
\81I");
2024 case AD_ENCH: /* KMH -- remove enchantment (disenchanter) */
2025 hitmsg(mtmp, mattk);
2026 /* uncancelled is sufficient enough; please
2027 don't make this attack less frequent */
2029 struct obj *obj = some_armor(&youmonst);
2031 if (drain_item(obj)) {
2033 pline("%s less effective.", Yobjnam2(obj, "seem"));
2035 Your("%s
\82©
\82ç
\96\82\97Í
\82ª
\8fÁ
\82¦
\82½
\82æ
\82¤
\82¾
\81D", xname(obj));
2044 done_in_by(mtmp, DIED);
2046 /* Negative armor class reduces damage done instead of fully protecting
2049 if (dmg && u.uac < 0) {
2056 if (Half_physical_damage
2057 /* Mitre of Holiness */
2058 || (Role_if(PM_PRIEST) && uarmh && is_quest_artifact(uarmh)
2059 && (is_undead(mtmp->data) || is_demon(mtmp->data)
2060 || is_vampshifter(mtmp))))
2061 dmg = (dmg + 1) / 2;
2063 if (permdmg) { /* Death's life force drain */
2064 int lowerlimit, *hpmax_p;
2066 * Apply some of the damage to permanent hit points:
2067 * polymorphed 100% against poly'd hpmax
2068 * hpmax > 25*lvl 100% against normal hpmax
2069 * hpmax > 10*lvl 50..100%
2070 * hpmax > 5*lvl 25..75%
2072 * Never reduces hpmax below 1 hit point per level.
2074 permdmg = rn2(dmg / 2 + 1);
2075 if (Upolyd || u.uhpmax > 25 * u.ulevel)
2077 else if (u.uhpmax > 10 * u.ulevel)
2079 else if (u.uhpmax > 5 * u.ulevel)
2084 /* [can't use youmonst.m_lev] */
2085 lowerlimit = min((int) youmonst.data->mlevel, u.ulevel);
2087 hpmax_p = &u.uhpmax;
2088 lowerlimit = u.ulevel;
2090 if (*hpmax_p - permdmg > lowerlimit)
2091 *hpmax_p -= permdmg;
2092 else if (*hpmax_p > lowerlimit)
2093 *hpmax_p = lowerlimit;
2095 * already at or below minimum threshold; do nothing */
2099 mdamageu(mtmp, dmg);
2103 res = passiveum(olduasmon, mtmp, mattk);
2110 /* An interface for use when taking a blindfold off, for example,
2111 * to see if an engulfing attack should immediately take affect, like
2112 * a passive attack. TRUE if engulfing blindness occurred */
2116 struct attack *mattk;
2118 if (!Blinded && u.uswallow
2119 && (mattk = attacktype_fordmg(u.ustuck->data, AT_ENGL, AD_BLND))
2120 && can_blnd(u.ustuck, &youmonst, mattk->aatyp, (struct obj *) 0)) {
2121 ++u.uswldtim; /* compensate for gulpmu change */
2122 (void) gulpmu(u.ustuck, mattk);
2128 /* monster swallows you, or damage if u.uswallow */
2131 register struct monst *mtmp;
2132 register struct attack *mattk;
2134 struct trap *t = t_at(u.ux, u.uy);
2135 int tmp = d((int) mattk->damn, (int) mattk->damd);
2137 register struct obj *otmp2;
2139 boolean physical_damage = FALSE;
2141 if (!u.uswallow) { /* swallows you */
2142 int omx = mtmp->mx, omy = mtmp->my;
2144 if (!engulf_target(mtmp, &youmonst))
2146 if ((t && ((t->ttyp == PIT) || (t->ttyp == SPIKED_PIT)))
2147 && sobj_at(BOULDER, u.ux, u.uy))
2151 unplacebc(); /* ball&chain go away */
2152 remove_monster(omx, omy);
2153 mtmp->mtrapped = 0; /* no longer on old trap */
2154 place_monster(mtmp, u.ux, u.uy);
2156 newsym(mtmp->mx, mtmp->my);
2157 if (is_animal(mtmp->data) && u.usteed) {
2159 /* Too many quirks presently if hero and steed
2160 * are swallowed. Pretend purple worms don't
2161 * like horses for now :-)
2163 Strcpy(buf, mon_nam(u.usteed));
2165 pline("%s lunges forward and plucks you off %s!", Monnam(mtmp),
2168 pline("%s
\82Í
\93Ë
\90i
\82µ
\82 \82È
\82½
\82ð%s
\82©
\82ç
\88ø
\82«
\97\8e\82µ
\82½
\81I", Monnam(mtmp),
2171 dismount_steed(DISMOUNT_ENGULFED);
2174 pline("%s engulfs you!", Monnam(mtmp));
2176 pline("%s
\82Í
\82 \82È
\82½
\82ð
\88ù
\82Ý
\82±
\82ñ
\82¾
\81I", Monnam(mtmp));
2178 reset_occupations(); /* behave as if you had moved */
2182 You("are released from the %s!",
2183 u.utraptype == TT_WEB ? "web" : "trap");
2185 You("%s
\82©
\82ç
\89ð
\95ú
\82³
\82ê
\82½
\81I",
2186 u.utraptype == TT_WEB ? "
\82
\82à
\82Ì
\91\83" : "ã©");
2191 i = number_leashed();
2194 const char *s = (i > 1) ? "leashes" : "leash";
2195 pline_The("%s %s loose.", s, vtense(s, "snap"));
2197 pline("
\95R
\82Í
\83p
\83`
\83\93\82Æ
\90Ø
\82ê
\82½
\81D");
2202 if (touch_petrifies(youmonst.data) && !resists_ston(mtmp)) {
2203 /* put the attacker back where it started;
2204 the resulting statue will end up there */
2205 remove_monster(mtmp->mx, mtmp->my); /* u.ux,u.uy */
2206 place_monster(mtmp, omx, omy);
2207 minstapetrify(mtmp, TRUE);
2208 /* normally unstuck() would do this, but we're not
2209 fully swallowed yet so that won't work here */
2213 return (mtmp->mhp > 0) ? 0 : 2;
2216 display_nhwindow(WIN_MESSAGE, FALSE);
2217 vision_recalc(2); /* hero can't see anything */
2219 /* for digestion, shorter time is more dangerous;
2220 for other swallowings, longer time means more
2221 chances for the swallower to attack */
2222 if (mattk->adtyp == AD_DGST) {
2223 tim_tmp = 25 - (int) mtmp->m_lev;
2225 tim_tmp = rnd(tim_tmp) / 2;
2226 else if (tim_tmp < 0)
2227 tim_tmp = -(rnd(-tim_tmp) / 2);
2228 /* having good armor & high constitution makes
2229 it take longer for you to be digested, but
2230 you'll end up trapped inside for longer too */
2231 tim_tmp += -u.uac + 10 + (ACURR(A_CON) / 3 - 1);
2233 /* higher level attacker takes longer to eject hero */
2234 tim_tmp = rnd((int) mtmp->m_lev + 10 / 2);
2236 /* u.uswldtim always set > 1 */
2237 u.uswldtim = (unsigned) ((tim_tmp < 2) ? 2 : tim_tmp);
2239 for (otmp2 = invent; otmp2; otmp2 = otmp2->nobj)
2240 (void) snuff_lit(otmp2);
2243 if (mtmp != u.ustuck)
2248 switch (mattk->adtyp) {
2250 physical_damage = TRUE;
2251 if (Slow_digestion) {
2252 /* Messages are handled below */
2255 } else if (u.uswldtim == 0) {
2257 pline("%s totally digests you!", Monnam(mtmp));
2259 pline("%s
\82Í
\82 \82È
\82½
\82ð
\8a®
\91S
\82É
\8fÁ
\89»
\82µ
\82½
\81I", Monnam(mtmp));
2261 if (Half_physical_damage)
2262 tmp *= 2; /* sorry */
2265 pline("%s%s digests you!", Monnam(mtmp),
2266 (u.uswldtim == 2) ? " thoroughly"
2267 : (u.uswldtim == 1) ? " utterly" : "");
2269 pline("%s
\82Í
\82 \82È
\82½
\82ð%s
\8fÁ
\89»
\82µ
\82Ä
\82¢
\82é
\81I", Monnam(mtmp),
2270 (u.uswldtim == 2) ? "
\93O
\92ê
\93I
\82É"
2271 : (u.uswldtim == 1) ? "
\8a®
\91S
\82É" : "");
2273 exercise(A_STR, FALSE);
2277 physical_damage = TRUE;
2278 if (mtmp->data == &mons[PM_FOG_CLOUD]) {
2280 You("are laden with moisture and %s",
2281 flaming(youmonst.data)
2282 ? "are smoldering out!"
2283 : Breathless ? "find it mildly uncomfortable."
2284 : amphibious(youmonst.data)
2286 : "can barely breathe!");
2288 You("
\8e¼
\8bC
\82É
\8bê
\82µ
\82ß
\82ç
\82ê
\81C%s",
2289 flaming(youmonst.data)
2290 ? "
\82
\82·
\82Ô
\82Á
\82½
\81I"
2291 : Breathless ? "
\8f
\81X
\95s
\89õ
\82É
\8a´
\82¶
\82½
\81D"
2292 : amphibious(youmonst.data)
2293 ? "
\88À
\82ç
\82¬
\82ð
\8a´
\82¶
\82½
\81D"
2294 : "
\91§
\82ð
\82·
\82é
\82Ì
\82ª
\82â
\82Á
\82Æ
\82¾
\81I");
2296 /* NB: Amphibious includes Breathless */
2297 if (Amphibious && !flaming(youmonst.data))
2301 You("are pummeled with debris!");
2303 You("
\8a¢âI
\82Å
\92É
\82ß
\82Â
\82¯
\82ç
\82ê
\82½
\81I");
2304 exercise(A_STR, FALSE);
2308 if (Acid_resistance) {
2310 You("are covered with a seemingly harmless goo.");
2312 You("
\96³
\8aQ
\82Á
\82Û
\82¢
\82Ë
\82Î
\82Â
\82
\82à
\82Ì
\82Å
\82¨
\82¨
\82í
\82ê
\82½
\81D");
2317 pline("Ouch! You've been slimed!");
2319 pline("
\82°
\82°
\82ñ
\81I
\82 \82È
\82½
\82Í
\82Ê
\82é
\82Ê
\82é
\82¾
\81I");
2322 You("are covered in slime! It burns!");
2324 You("
\82×
\82Æ
\82×
\82Æ
\82É
\82È
\82Á
\82½
\81D
\82»
\82µ
\82Ä
\8e_
\82É
\8fÄ
\82©
\82ê
\82½
\81I");
2325 exercise(A_STR, FALSE);
2329 if (can_blnd(mtmp, &youmonst, mattk->aatyp, (struct obj *) 0)) {
2331 long was_blinded = Blinded;
2334 You_cant("see in here!");
2336 You("
\89½
\82à
\8c©
\82¦
\82È
\82¢
\81I");
2337 make_blinded((long) tmp, FALSE);
2338 if (!was_blinded && !Blind)
2339 Your1(vision_clears);
2341 /* keep him blind until disgorged */
2342 make_blinded(Blinded + 1, FALSE);
2347 if (!mtmp->mcan && rn2(2)) {
2349 pline_The("air around you crackles with electricity.");
2351 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");
2352 if (Shock_resistance) {
2353 shieldeff(u.ux, u.uy);
2355 You("seem unhurt.");
2357 You("
\8f\9d\82Â
\82©
\82È
\82¢
\82æ
\82¤
\82¾
\81D");
2358 ugolemeffects(AD_ELEC, tmp);
2365 if (!mtmp->mcan && rn2(2)) {
2366 if (Cold_resistance) {
2367 shieldeff(u.ux, u.uy);
2369 You_feel("mildly chilly.");
2371 pline("
\82Ð
\82ñ
\82â
\82è
\82µ
\82½
\81D");
2372 ugolemeffects(AD_COLD, tmp);
2376 You("are freezing to death!");
2378 You("
\93\80\8e\80\82µ
\82»
\82¤
\82¾
\81I");
2383 if (!mtmp->mcan && rn2(2)) {
2384 if (Fire_resistance) {
2385 shieldeff(u.ux, u.uy);
2387 You_feel("mildly hot.");
2389 pline("
\83|
\83J
\83|
\83J
\82µ
\82½
\81D");
2390 ugolemeffects(AD_FIRE, tmp);
2394 You("are burning to a crisp!");
2396 You("
\94R
\82¦
\82Ä
\83J
\83\89\83J
\83\89\82É
\82È
\82Á
\82½
\81I");
2402 if (!diseasemu(mtmp->data))
2406 /* AC magic cancellation doesn't help when engulfed */
2407 if (!mtmp->mcan && rn2(4))
2412 physical_damage = TRUE;
2417 if (physical_damage)
2418 tmp = Maybe_Half_Phys(tmp);
2420 mdamageu(mtmp, tmp);
2424 if (touch_petrifies(youmonst.data) && !resists_ston(mtmp)) {
2426 pline("%s very hurriedly %s you!", Monnam(mtmp),
2427 is_animal(mtmp->data) ? "regurgitates" : "expels");
2429 pline("%s
\82Í
\8dQ
\82Ä
\82Ä
\82 \82È
\82½
\82ð%s
\82µ
\82½
\81I", Monnam(mtmp),
2430 is_animal(mtmp->data)? "
\93f
\82«
\96ß" : "
\94r
\8fo");
2432 expels(mtmp, mtmp->data, FALSE);
2433 } else if (!u.uswldtim || youmonst.data->msize >= MZ_HUGE) {
2435 You("get %s!", is_animal(mtmp->data) ? "regurgitated" : "expelled");
2437 You("%s
\82³
\82ê
\82½
\81I", is_animal(mtmp->data)? "
\93f
\82«
\96ß" : "
\94r
\8fo");
2439 && (is_animal(mtmp->data)
2440 || (dmgtype(mtmp->data, AD_DGST) && Slow_digestion)))
2442 pline("Obviously %s doesn't like your taste.", mon_nam(mtmp));
2444 You("
\82Ç
\82¤
\82à%s
\8dD
\82Ý
\82Ì
\96¡
\82¶
\82á
\82È
\82¢
\82æ
\82¤
\82¾
\81D", mon_nam(mtmp));
2445 expels(mtmp, mtmp->data, FALSE);
2450 /* monster explodes in your face */
2452 explmu(mtmp, mattk, ufound)
2453 register struct monst *mtmp;
2454 register struct attack *mattk;
2457 boolean physical_damage = TRUE, kill_agr = TRUE;
2464 pline("%s explodes at a spot in %s!",
2465 canseemon(mtmp) ? Monnam(mtmp) : "It",
2466 levl[mtmp->mux][mtmp->muy].typ == WATER ? "empty water"
2469 pline("%s
\82Í
\89½
\82à
\82È
\82¢%s
\82Å
\94\9a\94
\82µ
\82½
\81I",
2470 canseemon(mtmp) ? Monnam(mtmp) : "
\89½
\8eÒ
\82©",
2471 levl[mtmp->mux][mtmp->muy].typ == WATER ? "
\90\85\92\86"
2475 register int tmp = d((int) mattk->damn, (int) mattk->damd);
2476 register boolean not_affected = defends((int) mattk->adtyp, uwep);
2478 hitmsg(mtmp, mattk);
2480 switch (mattk->adtyp) {
2482 physical_damage = FALSE;
2483 not_affected |= Cold_resistance;
2486 physical_damage = FALSE;
2487 not_affected |= Fire_resistance;
2490 physical_damage = FALSE;
2491 not_affected |= Shock_resistance;
2494 if (!not_affected) {
2495 if (ACURR(A_DEX) > rnd(20)) {
2497 You("duck some of the blast.");
2499 You("
\8fÕ
\8c\82\82ð
\82³
\82¯
\82½
\81D");
2500 tmp = (tmp + 1) / 2;
2504 You("get blasted!");
2506 You("
\8fÕ
\8c\82\82ð
\82
\82ç
\82Á
\82½
\81I");
2508 if (mattk->adtyp == AD_FIRE)
2510 if (physical_damage)
2511 tmp = Maybe_Half_Phys(tmp);
2512 mdamageu(mtmp, tmp);
2517 not_affected = resists_blnd(&youmonst);
2518 if (!not_affected) {
2519 /* sometimes you're affected even if it's invisible */
2520 if (mon_visible(mtmp) || (rnd(tmp /= 2) > u.ulevel)) {
2522 You("are blinded by a blast of light!");
2524 You("
\82Ü
\82Î
\82ä
\82¢
\8cõ
\82É
\96Ú
\82ª
\82
\82ç
\82ñ
\82¾
\81I");
2525 make_blinded((long) tmp, FALSE);
2527 Your1(vision_clears);
2528 } else if (flags.verbose)
2530 You("get the impression it was not terribly bright.");
2532 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");
2537 not_affected |= Blind || (u.umonnum == PM_BLACK_LIGHT
2538 || u.umonnum == PM_VIOLET_FUNGUS
2539 || dmgtype(youmonst.data, AD_STUN));
2540 if (!not_affected) {
2544 You("are caught in a blast of kaleidoscopic light!");
2546 You("
\96\9c\89Ø
\8b¾
\82Ì
\8cõ
\82É
\95ß
\82ç
\82¦
\82ç
\82ê
\82½
\81I");
2547 /* avoid hallucinating the black light as it dies */
2548 mondead(mtmp); /* remove it from map now */
2549 kill_agr = FALSE; /* already killed (maybe lifesaved) */
2551 make_hallucinated(HHallucination + (long) tmp, FALSE, 0L);
2553 You("%s.", chg ? "are freaked out" : "seem unaffected");
2555 You("%s
\81D", chg ? "
\90\8c\82¢
\82µ
\82ê
\82½" : "
\89e
\8b¿
\82ð
\8eó
\82¯
\82È
\82©
\82Á
\82½");
2564 You("seem unaffected by it.");
2566 You("
\89e
\8b¿
\82ð
\8eó
\82¯
\82È
\82¢
\82æ
\82¤
\82¾
\81D");
2567 ugolemeffects((int) mattk->adtyp, tmp);
2572 wake_nearto(mtmp->mx, mtmp->my, 7 * 7);
2573 return (mtmp->mhp > 0) ? 0 : 2;
2576 /* monster gazes at you */
2579 register struct monst *mtmp;
2580 register struct attack *mattk;
2582 static const char *const reactions[] = {
2584 "confused", /* [0] */
2585 "stunned", /* [1] */
2586 "puzzled", "dazzled", /* [2,3] */
2587 "irritated", "inflamed", /* [4,5] */
2591 "
\8d¬
\97\90\82µ
\82½", /* [0] */
2592 "
\9eN
\9eO
\82Æ
\82µ
\82½", /* [1] */
2593 "
\8d¢
\98f
\82µ
\82½", "
\8c¶
\98f
\82³
\82ê
\82½", /* [2,3] */
2594 "
\83C
\83\89\83C
\83\89\82µ
\82½", "
\8b»
\95±
\82µ
\82½", /* [4,5] */
2595 "
\94æ
\82ê
\82½", /* [6] */
2596 "
\82Ú
\82ñ
\82â
\82è
\82µ
\82½", /* [7] */
2600 boolean cancelled = (mtmp->mcan != 0), already = FALSE;
2602 /* assumes that hero has to see monster's gaze in order to be
2603 affected, rather than monster just having to look at hero;
2604 when hallucinating, hero's brain doesn't register what
2605 it's seeing correctly so the gaze is usually ineffective
2606 [this could be taken a lot farther and select a gaze effect
2607 appropriate to what's currently being displayed, giving
2608 ordinary monsters a gaze attack when hero thinks he or she
2609 is facing a gazing creature, but let's not go that far...] */
2610 if (Hallucination && rn2(4))
2613 switch (mattk->adtyp) {
2615 if (cancelled || !mtmp->mcansee) {
2616 if (!canseemon(mtmp))
2617 break; /* silently */
2619 pline("%s %s.", Monnam(mtmp),
2620 (mtmp->data == &mons[PM_MEDUSA] && mtmp->mcan)
2621 ? "doesn't look all that ugly"
2622 : "gazes ineffectually");
2624 pline("%s
\82Í%s
\81D", Monnam(mtmp),
2625 (mtmp->data == &mons[PM_MEDUSA] && mtmp->mcan)
2626 ? "
\82»
\82ê
\82Ù
\82Ç
\8fX
\82
\82È
\82¢
\82±
\82Æ
\82É
\8bC
\82ª
\82Â
\82¢
\82½"
2627 : "
\96³
\88Ó
\96¡
\82É
\82É
\82ç
\82ñ
\82¾");
2631 if (Reflecting && couldsee(mtmp->mx, mtmp->my)
2632 && mtmp->data == &mons[PM_MEDUSA]) {
2633 /* hero has line of sight to Medusa and she's not blind */
2634 boolean useeit = canseemon(mtmp);
2638 (void) ureflects("%s gaze is reflected by your %s.",
2640 (void) ureflects("%s
\82Ì
\82É
\82ç
\82Ý
\82Í%s
\82Å
\94½
\8eË
\82³
\82ê
\82½
\81D",
2641 s_suffix(Monnam(mtmp)));
2643 mtmp, !useeit ? (char *) 0
2645 : "The gaze is reflected away by %s %s!"))
2647 : "
\82É
\82ç
\82Ý
\82Í%s
\82Ì%s
\82É
\82æ
\82Á
\82Ä
\94½
\8eË
\82³
\82ê
\82½
\81I"))
2649 if (!m_canseeu(mtmp)) { /* probably you're invisible */
2653 "%s doesn't seem to notice that %s gaze was reflected.",
2654 Monnam(mtmp), mhis(mtmp));
2656 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",
2663 pline("%s is turned to stone!", Monnam(mtmp));
2665 pline("%s
\82Í
\90Î
\82É
\82È
\82Á
\82½
\81I", Monnam(mtmp));
2673 if (canseemon(mtmp) && couldsee(mtmp->mx, mtmp->my)
2674 && !Stone_resistance) {
2676 You("meet %s gaze.", s_suffix(mon_nam(mtmp)));
2678 You("%s
\82É
\82É
\82ç
\82Ü
\82ê
\82½
\81D", s_suffix(mon_nam(mtmp)));
2680 if (poly_when_stoned(youmonst.data) && polymon(PM_STONE_GOLEM))
2683 You("turn to stone...");
2685 You("
\90Î
\82É
\82È
\82Á
\82½
\81D
\81D
\81D");
2686 killer.format = KILLED_BY;
2687 Strcpy(killer.name, mtmp->data->mname);
2692 if (canseemon(mtmp) && couldsee(mtmp->mx, mtmp->my) && mtmp->mcansee
2693 && !mtmp->mspec_used && rn2(5)) {
2695 react = 0; /* "confused" */
2696 already = (mtmp->mconf != 0);
2700 mtmp->mspec_used = mtmp->mspec_used + (conf + rn2(6));
2703 pline("%s gaze confuses you!", s_suffix(Monnam(mtmp)));
2705 pline("%s
\82Ì
\82É
\82ç
\82Ý
\82Å
\82 \82È
\82½
\82Í
\8d¬
\97\90\82µ
\82½
\81I", s_suffix(Monnam(mtmp)));
2708 You("are getting more and more confused.");
2710 You("
\82Ü
\82·
\82Ü
\82·
\8d¬
\97\90\82µ
\82½
\81D");
2711 make_confused(HConfusion + conf, FALSE);
2717 if (canseemon(mtmp) && couldsee(mtmp->mx, mtmp->my) && mtmp->mcansee
2718 && !mtmp->mspec_used && rn2(5)) {
2720 react = 1; /* "stunned" */
2721 already = (mtmp->mstun != 0);
2725 mtmp->mspec_used = mtmp->mspec_used + (stun + rn2(6));
2727 pline("%s stares piercingly at you!", Monnam(mtmp));
2729 pline("%s
\82Í
\97â
\82½
\82¢
\82Ü
\82È
\82´
\82µ
\82ð
\82 \82È
\82½
\82É
\8cü
\82¯
\82½
\81I", Monnam(mtmp));
2730 make_stunned((HStun & TIMEOUT) + (long) stun, TRUE);
2736 if (canseemon(mtmp) && !resists_blnd(&youmonst)
2737 && distu(mtmp->mx, mtmp->my) <= BOLT_LIM * BOLT_LIM) {
2739 react = rn1(2, 2); /* "puzzled" || "dazzled" */
2740 already = (mtmp->mcansee == 0);
2741 /* Archons gaze every round; we don't want cancelled ones
2742 giving the "seems puzzled/dazzled" message that often */
2743 if (mtmp->mcan && mtmp->data == &mons[PM_ARCHON] && rn2(5))
2746 int blnd = d((int) mattk->damn, (int) mattk->damd);
2749 You("are blinded by %s radiance!", s_suffix(mon_nam(mtmp)));
2751 You("%s
\82Ì
\8cõ
\82Å
\96Ú
\82ª
\8c©
\82¦
\82È
\82
\82È
\82Á
\82½
\81I", mon_nam(mtmp));
2752 make_blinded((long) blnd, FALSE);
2754 /* not blind at this point implies you're wearing
2755 the Eyes of the Overworld; make them block this
2756 particular stun attack too */
2758 Your1(vision_clears);
2760 make_stunned((long) d(1, 3), TRUE);
2765 if (canseemon(mtmp) && couldsee(mtmp->mx, mtmp->my) && mtmp->mcansee
2766 && !mtmp->mspec_used && rn2(5)) {
2768 react = rn1(2, 4); /* "irritated" || "inflamed" */
2770 int dmg = d(2, 6), lev = (int) mtmp->m_lev;
2773 pline("%s attacks you with a fiery gaze!", Monnam(mtmp));
2775 pline("%s
\82Í
\89\8a\82Ì
\82É
\82ç
\82Ý
\8dU
\8c\82\82ð
\82µ
\82Ä
\82«
\82½
\81I", Monnam(mtmp));
2777 if (Fire_resistance) {
2779 pline_The("fire doesn't feel hot!");
2781 pline("
\89Î
\82Í
\82º
\82ñ
\82º
\82ñ
\94M
\82
\82È
\82¢
\81I");
2786 destroy_item(SCROLL_CLASS, AD_FIRE);
2788 destroy_item(POTION_CLASS, AD_FIRE);
2790 destroy_item(SPBOOK_CLASS, AD_FIRE);
2792 mdamageu(mtmp, dmg);
2796 #ifdef PM_BEHOLDER /* work in progress */
2798 if (canseemon(mtmp) && couldsee(mtmp->mx, mtmp->my) && mtmp->mcansee
2799 && multi >= 0 && !rn2(5) && !Sleep_resistance) {
2801 react = 6; /* "tired" */
2802 already = (mtmp->mfrozen != 0); /* can't happen... */
2804 fall_asleep(-rnd(10), TRUE);
2806 pline("%s gaze makes you very sleepy...",
2808 pline("%s
\82Ì
\82É
\82ç
\82Ý
\82Å
\82 \82È
\82½
\82Í
\96°
\82
\82È
\82Á
\82½
\81D
\81D
\81D",
2809 s_suffix(Monnam(mtmp)));
2814 if (canseemon(mtmp) && couldsee(mtmp->mx, mtmp->my) && mtmp->mcansee
2815 && (HFast & (INTRINSIC | TIMEOUT)) && !defends(AD_SLOW, uwep)
2818 react = 7; /* "dulled" */
2819 already = (mtmp->mspeed == MSLOW);
2826 #endif /* BEHOLDER */
2828 impossible("Gaze attack %d?", mattk->adtyp);
2832 if (Hallucination && rn2(3))
2833 react = rn2(SIZE(reactions));
2834 /* cancelled/hallucinatory feedback; monster might look "confused",
2835 "stunned",&c but we don't actually set corresponding attribute */
2837 pline("%s looks %s%s.", Monnam(mtmp),
2838 !rn2(3) ? "" : already ? "quite "
2839 : (!rn2(2) ? "a bit " : "somewhat "),
2842 pline("%s
\82Í%s%s
\82æ
\82¤
\82¾
\81D", Monnam(mtmp),
2843 !rn2(3) ? "" : already ? "
\82©
\82È
\82è"
2844 : (!rn2(2) ? "
\8f
\82µ" : "
\82¢
\82
\82ç
\82©"),
2851 /* mtmp hits you for n points damage */
2854 register struct monst *mtmp;
2865 done_in_by(mtmp, DIED);
2869 /* returns 0 if seduction impossible,
2871 * 2 if wrong gender for nymph
2874 could_seduce(magr, mdef, mattk)
2875 struct monst *magr, *mdef;
2876 struct attack *mattk;
2878 register struct permonst *pagr;
2879 boolean agrinvis, defperc;
2880 xchar genagr, gendef;
2882 if (is_animal(magr->data))
2884 if (magr == &youmonst) {
2885 pagr = youmonst.data;
2886 agrinvis = (Invis != 0);
2887 genagr = poly_gender();
2890 agrinvis = magr->minvis;
2891 genagr = gender(magr);
2893 if (mdef == &youmonst) {
2894 defperc = (See_invisible != 0);
2895 gendef = poly_gender();
2897 defperc = perceives(mdef->data);
2898 gendef = gender(mdef);
2901 if (agrinvis && !defperc
2902 && (!SYSOPT_SEDUCE || (mattk && mattk->adtyp != AD_SSEX)))
2905 if (pagr->mlet != S_NYMPH
2906 && ((pagr != &mons[PM_INCUBUS] && pagr != &mons[PM_SUCCUBUS])
2907 || (SYSOPT_SEDUCE && mattk && mattk->adtyp != AD_SSEX)))
2910 if (genagr == 1 - gendef)
2913 return (pagr->mlet == S_NYMPH) ? 2 : 0;
2916 /* Returns 1 if monster teleported */
2919 register struct monst *mon;
2921 register struct obj *ring, *nring;
2922 boolean fem = (mon->data == &mons[PM_SUCCUBUS]); /* otherwise incubus */
2923 int tried_gloves = 0;
2926 if (mon->mcan || mon->mspec_used) {
2928 pline("%s acts as though %s has got a %sheadache.", Monnam(mon),
2929 mhe(mon), mon->mcan ? "severe " : "");
2931 pline("%s
\82Í%s
\93ª
\82ª
\92É
\82¢
\82Ó
\82è
\82ð
\82µ
\82½
\81D", Monnam(mon),
2932 mon->mcan ? "
\82Ð
\82Ç
\82" : "");
2937 if (unconscious()) {
2939 pline("%s seems dismayed at your lack of response.", Monnam(mon));
2941 pline("%s
\82Í
\95Ô
\8e\96\82ª
\82È
\82¢
\82Ì
\82Å
\8bC
\82ª
\88Þ
\82¦
\82½
\82æ
\82¤
\82¾
\81D", Monnam(mon));
2947 pline("It caresses you...");
2949 pline("
\89½
\8eÒ
\82©
\82ª
\82 \82È
\82½
\82ð
\95ø
\82«
\82µ
\82ß
\82Ä
\82¢
\82é
\81D
\81D
\81D");
2952 You_feel("very attracted to %s.", mon_nam(mon));
2954 You("%s
\82É
\88ø
\82«
\82Â
\82¯
\82ç
\82ê
\82Ä
\82é
\82æ
\82¤
\82È
\8bC
\82ª
\82µ
\82½
\81D", mon_nam(mon));
2955 /* if in the process of putting armor on or taking armor off,
2956 interrupt that activity now */
2957 (void) stop_donning((struct obj *) 0);
2958 /* don't try to take off gloves if cursed weapon blocks them */
2962 for (ring = invent; ring; ring = nring) {
2964 if (ring->otyp != RIN_ADORNMENT)
2967 if (ring->owornmask && uarmg) {
2968 /* don't take off worn ring if gloves are in the way */
2969 if (!tried_gloves++)
2970 mayberem(uarmg, "gloves");
2972 continue; /* next ring might not be worn */
2974 if (rn2(20) < ACURR(A_CHA)) {
2976 (void) safe_qbuf(qbuf, "\"That ",
2977 " looks pretty. May I have it?\"", ring,
2978 xname, simpleonames, "ring");
2980 (void) safe_qbuf(qbuf, "
\81u
\82È
\82ñ
\82Ä
\91f
\93G
\82È",
2981 "
\82Å
\82µ
\82å
\82¤
\81D
\82í
\82½
\82µ
\82É
\82
\82ê
\82Ü
\82¹
\82ñ
\81H
\81v", ring,
2982 xname, simpleonames, "
\8ew
\97Ö");
2984 makeknown(RIN_ADORNMENT);
2985 if (yn(qbuf) == 'n')
2989 pline("%s decides she'd like %s, and takes it.",
2990 Blind ? "She" : Monnam(mon), yname(ring));
2992 pline("%s
\82Í%s
\82ª
\82Æ
\82Ä
\82à
\8bC
\82É
\82¢
\82Á
\82Ä
\81C
\82»
\82ê
\82ð
\8eæ
\82è
\82 \82°
\82½
\81D",
2993 Blind ? "
\94Þ
\8f\97" : Monnam(mon), xname(ring));
2995 makeknown(RIN_ADORNMENT);
2996 if (ring == uleft || ring == uright)
2999 setuwep((struct obj *) 0);
3000 if (ring == uswapwep)
3001 setuswapwep((struct obj *) 0);
3002 if (ring == uquiver)
3003 setuqwep((struct obj *) 0);
3005 (void) mpickobj(mon, ring);
3007 if (uleft && uright && uleft->otyp == RIN_ADORNMENT
3008 && uright->otyp == RIN_ADORNMENT)
3010 if (ring == uleft || ring == uright)
3013 /* don't put on ring if gloves are in the way */
3014 if (!tried_gloves++)
3016 mayberem(uarmg, "gloves");
3018 mayberem(uarmg, "
\8f¬
\8eè");
3020 break; /* no point trying further rings */
3022 if (rn2(20) < ACURR(A_CHA)) {
3024 (void) safe_qbuf(qbuf, "\"That ",
3025 " looks pretty. Would you wear it for me?\"",
3026 ring, xname, simpleonames, "ring");
3028 (void) safe_qbuf(qbuf, "
\81u
\82¨
\82â
\82È
\82ñ
\82Ä
\82·
\82Î
\82ç
\82µ
\82¢",
3029 "
\82¾
\81D
\8e\84\82Ì
\82½
\82ß
\82É
\8ew
\82É
\82Í
\82ß
\82Ä
\82
\82ê
\82È
\82¢
\82©
\82¢
\81H
\81v",
3030 ring, xname, simpleonames, "
\8ew
\97Ö");
3032 makeknown(RIN_ADORNMENT);
3033 if (yn(qbuf) == 'n')
3037 pline("%s decides you'd look prettier wearing %s,",
3038 Blind ? "He" : Monnam(mon), yname(ring));
3040 pline("%s
\82Í%s
\82ð
\82Â
\82¯
\82½
\82 \82È
\82½
\82ª
\82æ
\82è
\96£
\97Í
\93I
\82¾
\82Æ
\8dl
\82¦
\81C",
3041 Blind ? "
\94Þ" : Monnam(mon), xname(ring));
3044 pline("and puts it on your finger.");
3046 pline("
\82 \82È
\82½
\82Ì
\8ew
\82É
\82»
\82ê
\82ð
\82Í
\82ß
\82½
\81D");
3048 makeknown(RIN_ADORNMENT);
3051 pline("%s puts %s on your right %s.",
3052 Blind ? "He" : Monnam(mon), the(xname(ring)),
3055 pline("%s
\82Í%s
\82ð
\82 \82È
\82½
\82Ì
\89E%s
\82É
\82Í
\82ß
\82½
\81D",
3056 Blind ? "
\94Þ" : Monnam(mon), the(xname(ring)),
3059 setworn(ring, RIGHT_RING);
3060 } else if (!uleft) {
3062 pline("%s puts %s on your left %s.",
3063 Blind ? "He" : Monnam(mon), the(xname(ring)),
3066 pline("%s
\82Í%s
\82ð
\82 \82È
\82½
\82Ì
\8d¶%s
\82É
\82Í
\82ß
\82½
\81D",
3067 Blind ? "
\94Þ" : Monnam(mon), the(xname(ring)),
3070 setworn(ring, LEFT_RING);
3071 } else if (uright && uright->otyp != RIN_ADORNMENT) {
3073 pline("%s replaces %s with %s.", Blind ? "He" : Monnam(mon),
3074 yname(uright), yname(ring));
3076 pline("%s
\82Í%s
\82ð%s
\82É
\82Æ
\82è
\82©
\82¦
\82½
\81D", Blind ? "
\94Þ" : Monnam(mon),
3077 yname(uright), xname(ring));
3080 setworn(ring, RIGHT_RING);
3081 } else if (uleft && uleft->otyp != RIN_ADORNMENT) {
3083 pline("%s replaces %s with %s.", Blind ? "He" : Monnam(mon),
3084 yname(uleft), yname(ring));
3086 pline("%s
\82Í%s
\82ð%s
\82É
\82Æ
\82è
\82©
\82¦
\82½
\81D", Blind ? "
\94Þ" : Monnam(mon),
3087 yname(uleft), xname(ring));
3090 setworn(ring, LEFT_RING);
3092 impossible("ring replacement");
3094 prinv((char *) 0, ring, 0L);
3098 if (!uarmc && !uarmf && !uarmg && !uarms && !uarmh && !uarmu)
3100 pline("%s murmurs sweet nothings into your ear.",
3101 Blind ? (fem ? "She" : "He") : Monnam(mon));
3103 pline("%s
\82Í
\82 \82È
\82½
\82Ì
\8e¨
\82à
\82Æ
\82Å
\8aÃ
\82¢
\82³
\82³
\82â
\82«
\82ð
\82Â
\82Ô
\82â
\82¢
\82½
\81D",
3104 Blind ? (fem ? "
\94Þ
\8f\97" : "
\94Þ") : Monnam(mon));
3108 pline("%s murmurs in your ear, while helping you undress.",
3109 Blind ? (fem ? "She" : "He") : Monnam(mon));
3111 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",
3112 Blind ? (fem ? "
\94Þ
\8f\97" : "
\94Þ") : Monnam(mon));
3114 mayberem(uarmc, cloak_simple_name(uarmc));
3117 mayberem(uarm, "suit");
3119 mayberem(uarm, "
\83X
\81[
\83c");
3121 mayberem(uarmf, "boots");
3123 mayberem(uarmf, "
\83u
\81[
\83c");
3126 mayberem(uarmg, "gloves");
3128 mayberem(uarmg, "
\8f¬
\8eè");
3130 mayberem(uarms, "shield");
3132 mayberem(uarms, "
\8f\82");
3133 mayberem(uarmh, helm_simple_name(uarmh));
3134 if (!uarmc && !uarm)
3136 mayberem(uarmu, "shirt");
3138 mayberem(uarmu, "
\83V
\83\83\83c");
3140 if (uarm || uarmc) {
3142 verbalize("You're such a %s; I wish...",
3143 flags.female ? "sweet lady" : "nice guy");
3145 verbalize("%s
\82¾
\81D
\81D
\81D
\82Æ
\82¢
\82¢
\82Ì
\82É
\81D",
3146 flags.female ? "
\83`
\83\83\81[
\83~
\83\93\83O" : "
\82·
\82Ä
\82«");
3148 if (!tele_restrict(mon))
3149 (void) rloc(mon, TRUE);
3152 if (u.ualign.type == A_CHAOTIC)
3155 /* by this point you have discovered mon's identity, blind or not... */
3157 pline("Time stands still while you and %s lie in each other's arms...",
3159 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",
3161 if (rn2(35) > ACURR(A_CHA) + ACURR(A_INT)) {
3162 /* Don't bother with mspec_used here... it didn't get tired! */
3164 pline("%s seems to have enjoyed it more than you...",
3166 pline("%s
\82Í
\82 \82È
\82½
\82æ
\82è
\8ay
\82µ
\82ñ
\82¾
\82æ
\82¤
\82¾
\81D
\81D
\81D",
3171 You_feel("drained of energy.");
3173 You("
\91Ì
\97Í
\82ª
\8fÁ
\96Õ
\82µ
\82½
\82æ
\82¤
\82È
\8bC
\82ª
\82µ
\82½
\81D");
3175 u.uenmax -= rnd(Half_physical_damage ? 5 : 10);
3176 exercise(A_CON, FALSE);
3182 You("are down in the dumps.");
3184 You("
\88Ó
\8bC
\8fÁ
\92¾
\82µ
\82½
\81D");
3185 (void) adjattrib(A_CON, -1, TRUE);
3186 exercise(A_CON, FALSE);
3191 Your("senses are dulled.");
3193 Your("
\8cÜ
\8a´
\82Í
\93Ý
\82Á
\82½
\81D");
3194 (void) adjattrib(A_WIS, -1, TRUE);
3195 exercise(A_WIS, FALSE);
3199 if (!resists_drli(&youmonst)) {
3201 You_feel("out of shape.");
3203 You("
\82
\82½
\82Ñ
\82ê
\82½
\81D");
3205 losexp("overexertion");
3207 losexp("
\89ß
\98J
\82Å");
3210 You("have a curious feeling...");
3212 You("
\95Ï
\82È
\8a´
\82¶
\82ª
\82µ
\82½
\81D
\81D
\81D");
3218 You_feel("exhausted.");
3220 You("
\94æ
\82ê
\82ð
\8a´
\82¶
\82½
\81D");
3221 exercise(A_STR, FALSE);
3224 losehp(Maybe_Half_Phys(tmp), "exhaustion", KILLED_BY);
3226 losehp(Maybe_Half_Phys(tmp), "
\90¸
\97Í
\82Ì
\8eg
\82¢
\82·
\82¬
\82Å", KILLED_BY);
3231 mon->mspec_used = rnd(100); /* monster is worn out */
3233 You("seem to have enjoyed it more than %s...", noit_mon_nam(mon));
3235 You("%s
\82æ
\82è
\82à
\8ay
\82µ
\82ñ
\82¾
\82æ
\82¤
\82¾
\81D
\81D
\81D", noit_mon_nam(mon));
3239 You_feel("raised to your full potential.");
3241 You("
\90ö
\8dÝ
\94\
\97Í
\82ª
\8d\82\82Ü
\82Á
\82½
\82æ
\82¤
\82É
\8a´
\82¶
\82½
\81D");
3242 exercise(A_CON, TRUE);
3243 u.uen = (u.uenmax += rnd(5));
3247 You_feel("good enough to do it again.");
3249 You("
\82à
\82¤
\88ê
\93x
\82Å
\82«
\82é
\82Æ
\8ev
\82Á
\82½
\81D");
3250 (void) adjattrib(A_CON, 1, TRUE);
3251 exercise(A_CON, TRUE);
3256 You("will always remember %s...", noit_mon_nam(mon));
3258 You("
\82¢
\82Â
\82Ü
\82Å
\82à%s
\82ð
\8ao
\82¦
\82Ä
\82é
\82¾
\82ë
\82¤
\81D
\81D
\81D", mon_nam(mon));
3259 (void) adjattrib(A_WIS, 1, TRUE);
3260 exercise(A_WIS, TRUE);
3265 pline("That was a very educational experience.");
3267 pline("
\82Æ
\82Ä
\82à
\8bM
\8fd
\82È
\8co
\8c±
\82¾
\82Á
\82½
\81D");
3269 exercise(A_WIS, TRUE);
3273 You_feel("restored to health!");
3275 You("
\82Æ
\82Ä
\82à
\8c\92\8dN
\82É
\82È
\82Á
\82½
\81I");
3279 exercise(A_STR, TRUE);
3285 if (mon->mtame) /* don't charge */
3287 else if (rn2(20) < ACURR(A_CHA)) {
3289 pline("%s demands that you pay %s, but you refuse...",
3290 noit_Monnam(mon), Blind ? (fem ? "her" : "him") : mhim(mon));
3292 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",
3295 } else if (u.umonnum == PM_LEPRECHAUN)
3297 pline("%s tries to take your money, but fails...", noit_Monnam(mon));
3299 pline("%s
\82Í
\8bà
\82ð
\8eæ
\82ë
\82¤
\82Æ
\82µ
\82½
\82ª
\81C
\8e¸
\94s
\82µ
\82½
\81D
\81D
\81D", noit_Monnam(mon));
3302 long umoney = money_cnt(invent);
3304 if (umoney > (long) LARGEST_INT - 10L)
3305 cost = (long) rnd(LARGEST_INT) + 500L;
3307 cost = (long) rnd((int) umoney + 10) + 500L;
3308 if (mon->mpeaceful) {
3317 verbalize("It's on the house!");
3319 verbalize("
\82±
\82ê
\82Í
\82¨
\82²
\82è%s
\81I", fem ? "
\82æ" : "
\82³");
3322 pline("%s takes %ld %s for services rendered!", noit_Monnam(mon),
3323 cost, currency(cost));
3325 pline("%s
\82Í
\83T
\81[
\83r
\83X
\97¿
\82Æ
\82µ
\82Ä%ld%s
\92D
\82¢
\8eæ
\82Á
\82½
\81I", noit_Monnam(mon),
3326 cost, currency(cost));
3328 money2mon(mon, cost);
3333 mon->mcan = 1; /* monster is worn out */
3334 if (!tele_restrict(mon))
3335 (void) rloc(mon, TRUE);
3341 register struct obj *obj;
3346 if (!obj || !obj->owornmask)
3349 if (rn2(20) < ACURR(A_CHA)) {
3351 Sprintf(qbuf, "\"Shall I remove your %s, %s?\"", str,
3352 (!rn2(2) ? "lover" : !rn2(2) ? "dear" : "sweetheart"));
3354 Sprintf(qbuf,"
\81u%s
\82ð
\8eæ
\82Á
\82Ä
\82¢
\82¢
\81C%s
\81H
\81v", str,
3355 (!rn2(2) ? "
\82Ë
\82¥" : flags.female ? "
\83n
\83j
\81[" : "
\83_
\81[
\83\8a\83\93" ));
3357 if (yn(qbuf) == 'n')
3360 char hairbuf[BUFSZ];
3363 Sprintf(hairbuf, "let me run my fingers through your %s",
3367 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¢",
3371 verbalize("Take off your %s; %s.", str,
3373 ? "let's get a little closer"
3374 : (obj == uarmc || obj == uarms)
3377 ? "let me rub your feet"
3379 ? "they're too clumsy"
3381 ? "let me massage you"
3385 verbalize("%s
\82ð
\92E
\82¢
\82Å
\81D
\81D
\81D%s
\81D", str,
3387 ? "
\82à
\82¤
\82¿
\82å
\82Á
\82Æ
\8añ
\82è
\82»
\82Á
\82Ä"
3388 : (obj == uarmc || obj == uarms)
3389 ? "
\82»
\82¤
\82»
\82¤"
3391 ? (flags.female ? "ãY
\97í
\82È
\91«
\82¾
\82Ë" : "
\82¤
\82Ó
\82Á
\81C
\82½
\82
\82Ü
\82µ
\82¢
\91«
\82Ë")
3393 ? (flags.female ? "
\82È
\82ñ
\82Ä
\91f
\93G
\82È
\8eè
\82¾" : "
\82½
\82
\82Ü
\82µ
\82¢
\98r
\82Ë")
3395 ? (flags.female ? "
\82«
\82ê
\82¢
\82È
\91Ì
\82¾" : "
\82½
\82
\82Ü
\82µ
\82¢
\82Ì
\82Ë")
3400 remove_worn_item(obj, TRUE);
3404 passiveum(olduasmon, mtmp, mattk)
3405 struct permonst *olduasmon;
3406 register struct monst *mtmp;
3407 register struct attack *mattk;
3414 if (olduasmon->mattk[i].aatyp == AT_NONE
3415 || olduasmon->mattk[i].aatyp == AT_BOOM)
3418 if (olduasmon->mattk[i].damn)
3420 d((int) olduasmon->mattk[i].damn, (int) olduasmon->mattk[i].damd);
3421 else if (olduasmon->mattk[i].damd)
3422 tmp = d((int) olduasmon->mlevel + 1, (int) olduasmon->mattk[i].damd);
3426 /* These affect the enemy even if you were "killed" (rehumanized) */
3427 switch (olduasmon->mattk[i].adtyp) {
3431 pline("%s is splashed by your acid!", Monnam(mtmp));
3433 pline("%s
\82Í
\82 \82È
\82½
\82Ì
\8e_
\82ð
\82
\82ç
\82Á
\82½
\81I", Monnam(mtmp));
3434 if (resists_acid(mtmp)) {
3436 pline("%s is not affected.", Monnam(mtmp));
3438 pline("%s
\82Í
\89e
\8b¿
\82ð
\8eó
\82¯
\82È
\82¢
\81D", Monnam(mtmp));
3444 erode_armor(mtmp, ERODE_CORRODE);
3446 acid_damage(MON_WEP(mtmp));
3448 case AD_STON: /* cockatrice */
3450 long protector = attk_protection((int) mattk->aatyp),
3451 wornitems = mtmp->misc_worn_check;
3453 /* wielded weapon gives same protection as gloves here */
3454 if (MON_WEP(mtmp) != 0)
3455 wornitems |= W_ARMG;
3457 if (!resists_ston(mtmp)
3459 || (protector != ~0L
3460 && (wornitems & protector) != protector))) {
3461 if (poly_when_stoned(mtmp->data)) {
3466 pline("%s turns to stone!", Monnam(mtmp));
3468 pline("%s
\82Í
\90Î
\82É
\82È
\82Á
\82½
\81I", Monnam(mtmp));
3477 case AD_ENCH: /* KMH -- remove enchantment (disenchanter) */
3479 (void) drain_item(otmp);
3489 /* These affect the enemy only if you are still a monster */
3491 switch (youmonst.data->mattk[i].adtyp) {
3493 if (youmonst.data->mattk[i].aatyp == AT_BOOM) {
3497 pline("
\82 \82È
\82½
\82Í
\94\9a\94
\82µ
\82½
\81I");
3498 /* KMH, balance patch -- this is okay with unchanging */
3503 case AD_PLYS: /* Floating eye */
3506 if (u.umonnum == PM_FLOATING_EYE) {
3509 if (mtmp->mcansee && haseyes(mtmp->data) && rn2(3)
3510 && (perceives(mtmp->data) || !Invis)) {
3513 pline("As a blind %s, you cannot defend yourself.",
3515 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",
3516 youmonst.data->mname);
3518 if (mon_reflects(mtmp,
3520 "Your gaze is reflected by %s %s."))
3522 "
\82 \82È
\82½
\82Ì
\82É
\82ç
\82Ý
\82Í%s
\82Ì%s
\82Å
\94½
\8eË
\82µ
\82½
\81D"))
3525 pline("%s is frozen by your gaze!", Monnam(mtmp));
3527 pline("%s
\82Í
\82 \82È
\82½
\82Ì
\82É
\82ç
\82Ý
\82Å
\93®
\82¯
\82È
\82
\82È
\82Á
\82½
\81I", Monnam(mtmp));
3528 paralyze_monst(mtmp, tmp);
3532 } else { /* gelatinous cube */
3534 pline("%s is frozen by you.", Monnam(mtmp));
3536 pline("%s
\82Í
\93®
\82¯
\82È
\82¢
\81D", Monnam(mtmp));
3537 paralyze_monst(mtmp, tmp);
3541 case AD_COLD: /* Brown mold or blue jelly */
3542 if (resists_cold(mtmp)) {
3543 shieldeff(mtmp->mx, mtmp->my);
3545 pline("%s is mildly chilly.", Monnam(mtmp));
3547 pline("%s
\82Í
\97â
\82¦
\82½
\81D", Monnam(mtmp));
3548 golemeffects(mtmp, AD_COLD, tmp);
3553 pline("%s is suddenly very cold!", Monnam(mtmp));
3555 pline("%s
\82Í
\93Ë
\91R
\93\80\82è
\82Ã
\82¯
\82É
\82È
\82Á
\82½
\81I", Monnam(mtmp));
3559 if (u.mhmax > ((youmonst.data->mlevel + 1) * 8))
3560 (void) split_mon(&youmonst, mtmp);
3562 case AD_STUN: /* Yellow mold */
3566 pline("%s %s.", Monnam(mtmp),
3567 makeplural(stagger(mtmp->data, "stagger")));
3569 pline("%s
\82Í
\82
\82ç
\82
\82ç
\82µ
\82½
\81D", Monnam(mtmp));
3574 case AD_FIRE: /* Red mold */
3575 if (resists_fire(mtmp)) {
3576 shieldeff(mtmp->mx, mtmp->my);
3578 pline("%s is mildly warm.", Monnam(mtmp));
3580 pline("%s
\82Í
\92g
\82©
\82
\82È
\82Á
\82½
\81D", Monnam(mtmp));
3582 golemeffects(mtmp, AD_FIRE, tmp);
3587 pline("%s is suddenly very hot!", Monnam(mtmp));
3589 pline("%s
\82Í
\93Ë
\91R
\94M
\82
\82È
\82Á
\82½
\81I", Monnam(mtmp));
3593 if (resists_elec(mtmp)) {
3594 shieldeff(mtmp->mx, mtmp->my);
3596 pline("%s is slightly tingled.", Monnam(mtmp));
3598 pline("%s
\82Í
\82¿
\82å
\82Á
\82Æ
\83s
\83\8a\83s
\83\8a\82µ
\82½
\81D", Monnam(mtmp));
3600 golemeffects(mtmp, AD_ELEC, tmp);
3605 pline("%s is jolted with your electricity!", Monnam(mtmp));
3607 pline("%s
\82Í
\93d
\8bC
\83V
\83\87\83b
\83N
\82ð
\82¤
\82¯
\82½
\81I", Monnam(mtmp));
3618 if ((mtmp->mhp -= tmp) <= 0) {
3620 pline("%s dies!", Monnam(mtmp));
3622 pline("%s
\82Í
\8e\80\82ñ
\82¾
\81I", Monnam(mtmp));
3634 register struct monst *mon;
3635 int mndx = monsndx(youmonst.data);
3638 return (struct monst *) 0;
3639 if (mvitals[mndx].mvflags & G_EXTINCT)
3640 return (struct monst *) 0;
3641 mon = makemon(youmonst.data, u.ux, u.uy, NO_MINVENT | MM_EDOG);
3645 mon = christen_monst(mon, plname);
3647 mon->m_lev = youmonst.data->mlevel;
3648 mon->mhpmax = u.mhmax;
3649 mon->mhp = u.mh / 2;