1 /* NetHack 3.6 mcastu.c $NHDT-Date: 1436753517 2015/07/13 02:11:57 $ $NHDT-Branch: master $:$NHDT-Revision: 1.44 $ */
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. */
12 /* monster mage spells */
13 #define MGC_PSI_BOLT 0
14 #define MGC_CURE_SELF 1
15 #define MGC_HASTE_SELF 2
16 #define MGC_STUN_YOU 3
17 #define MGC_DISAPPEAR 4
18 #define MGC_WEAKEN_YOU 5
19 #define MGC_DESTRY_ARMR 6
20 #define MGC_CURSE_ITEMS 7
21 #define MGC_AGGRAVATION 8
22 #define MGC_SUMMON_MONS 9
23 #define MGC_CLONE_WIZ 10
24 #define MGC_DEATH_TOUCH 11
26 /* monster cleric spells */
27 #define CLC_OPEN_WOUNDS 0
28 #define CLC_CURE_SELF 1
29 #define CLC_CONFUSE_YOU 2
30 #define CLC_PARALYZE 3
31 #define CLC_BLIND_YOU 4
33 #define CLC_CURSE_ITEMS 6
34 #define CLC_LIGHTNING 7
35 #define CLC_FIRE_PILLAR 8
38 STATIC_DCL void FDECL(cursetxt, (struct monst *, BOOLEAN_P));
39 STATIC_DCL int FDECL(choose_magic_spell, (int));
40 STATIC_DCL int FDECL(choose_clerical_spell, (int));
41 STATIC_DCL void FDECL(cast_wizard_spell, (struct monst *, int, int));
42 STATIC_DCL void FDECL(cast_cleric_spell, (struct monst *, int, int));
43 STATIC_DCL boolean FDECL(is_undirected_spell, (unsigned int, int));
45 FDECL(spell_would_be_useless, (struct monst *, unsigned int, int));
47 extern const char *const flash_types[]; /* from zap.c */
49 /* feedback when frustrated monster couldn't cast a spell */
52 cursetxt(mtmp, undirected)
56 if (canseemon(mtmp) && couldsee(mtmp->mx, mtmp->my)) {
57 const char *point_msg; /* spellcasting monsters are impolite */
61 point_msg = "all around, then curses";
63 point_msg = "
\82 \82½
\82è
\88ê
\96Ê
\82ð";
64 else if ((Invis && !perceives(mtmp->data)
65 && (mtmp->mux != u.ux || mtmp->muy != u.uy))
66 || is_obj_mappear(&youmonst, STRANGE_OBJECT)
69 point_msg = "and curses in your general direction";
71 point_msg = "
\82 \82È
\82½
\82Ì
\82¢
\82é
\82 \82½
\82è
\82ð";
72 else if (Displaced && (mtmp->mux != u.ux || mtmp->muy != u.uy))
74 point_msg = "and curses at your displaced image";
76 point_msg = "
\82 \82È
\82½
\82Ì
\8c¶
\89e
\82ð";
79 point_msg = "at you, then curses";
81 point_msg = "
\82 \82È
\82½
\82ð";
84 pline("%s points %s.", Monnam(mtmp), point_msg);
86 pline("%s
\82Í%s
\8ew
\8d·
\82µ
\81C
\8eô
\82¢
\82ð
\82©
\82¯
\82½
\81D", Monnam(mtmp), point_msg);
87 } else if ((!(moves % 4) || !rn2(4))) {
90 Norep("You hear a mumbled curse.");
92 Norep("
\8eô
\82¢
\82Ì
\8c¾
\97t
\82ð
\82Â
\82Ô
\82â
\82
\90º
\82ð
\95·
\82¢
\82½
\81D");
96 /* convert a level based random selection into a specific mage spell;
97 inappropriate choices will be screened out by spell_would_be_useless() */
99 choose_magic_spell(spellval)
102 /* for 3.4.3 and earlier, val greater than 22 selected the default spell
104 while (spellval > 24 && rn2(25))
105 spellval = rn2(spellval);
110 if (Antimagic || Hallucination)
112 /* else FALL THROUGH */
116 return MGC_DEATH_TOUCH;
119 return MGC_CLONE_WIZ;
123 return MGC_SUMMON_MONS;
126 return MGC_AGGRAVATION;
130 return MGC_CURSE_ITEMS;
133 return MGC_DESTRY_ARMR;
136 return MGC_WEAKEN_YOU;
139 return MGC_DISAPPEAR;
143 return MGC_HASTE_SELF;
145 return MGC_CURE_SELF;
152 /* convert a level based random selection into a specific cleric spell */
154 choose_clerical_spell(spellnum)
157 /* for 3.4.3 and earlier, num greater than 13 selected the default spell
159 while (spellnum > 15 && rn2(16))
160 spellnum = rn2(spellnum);
166 return CLC_OPEN_WOUNDS;
167 /* else FALL THROUGH */
171 return CLC_FIRE_PILLAR;
173 return CLC_LIGHTNING;
176 return CLC_CURSE_ITEMS;
181 return CLC_BLIND_YOU;
187 return CLC_CONFUSE_YOU;
189 return CLC_CURE_SELF;
192 return CLC_OPEN_WOUNDS;
197 * 1: successful spell
198 * 0: unsuccessful spell
201 castmu(mtmp, mattk, thinks_it_foundyou, foundyou)
202 register struct monst *mtmp;
203 register struct attack *mattk;
204 boolean thinks_it_foundyou;
207 int dmg, ml = mtmp->m_lev;
212 * -- monster is attacking you. Search for a useful spell.
213 * -- monster thinks it's attacking you. Search for a useful spell,
214 * without checking for undirected. If the spell found is directed,
215 * it fails with cursetxt() and loss of mspec_used.
216 * -- monster isn't trying to attack. Select a spell once. Don't keep
217 * searching; if that spell is not useful (or if it's directed),
218 * return and do something else.
219 * Since most spells are directed, this means that a monster that isn't
220 * attacking casts spells only a small portion of the time that an
221 * attacking monster does.
223 if ((mattk->adtyp == AD_SPEL || mattk->adtyp == AD_CLRC) && ml) {
228 if (mattk->adtyp == AD_SPEL)
229 spellnum = choose_magic_spell(spellnum);
231 spellnum = choose_clerical_spell(spellnum);
232 /* not trying to attack? don't allow directed spells */
233 if (!thinks_it_foundyou) {
234 if (!is_undirected_spell(mattk->adtyp, spellnum)
235 || spell_would_be_useless(mtmp, mattk->adtyp, spellnum)) {
238 "spellcasting monster found you and doesn't know it?");
244 && spell_would_be_useless(mtmp, mattk->adtyp, spellnum));
249 /* monster unable to cast spells? */
250 if (mtmp->mcan || mtmp->mspec_used || !ml) {
251 cursetxt(mtmp, is_undirected_spell(mattk->adtyp, spellnum));
255 if (mattk->adtyp == AD_SPEL || mattk->adtyp == AD_CLRC) {
256 mtmp->mspec_used = 10 - mtmp->m_lev;
257 if (mtmp->mspec_used < 2)
258 mtmp->mspec_used = 2;
261 /* monster can cast spells, but is casting a directed spell at the
262 wrong place? If so, give a message, and return. Do this *after*
263 penalizing mspec_used. */
264 if (!foundyou && thinks_it_foundyou
265 && !is_undirected_spell(mattk->adtyp, spellnum)) {
267 pline("%s casts a spell at %s!",
268 canseemon(mtmp) ? Monnam(mtmp) : "Something",
269 levl[mtmp->mux][mtmp->muy].typ == WATER ? "empty water"
272 pline("%s
\82Í
\89½
\82à
\82È
\82¢%s
\82É
\96\82\96@
\82ð
\82©
\82¯
\82½
\81I",
273 canseemon(mtmp) ? Monnam(mtmp) : "
\89½
\8eÒ
\82©",
274 levl[mtmp->mux][mtmp->muy].typ == WATER ? "
\90\85\92\86"
281 if (rn2(ml * 10) < (mtmp->mconf ? 100 : 20)) { /* fumbled attack */
282 if (canseemon(mtmp) && !Deaf)
284 pline_The("air crackles around %s.", mon_nam(mtmp));
286 pline("%s
\82Ì
\89ñ
\82è
\82Ì
\8bó
\8bC
\82ª
\83p
\83`
\83p
\83`
\89¹
\82ð
\82½
\82Ä
\82Ä
\82¢
\82é
\81D", mon_nam(mtmp));
289 if (canspotmon(mtmp) || !is_undirected_spell(mattk->adtyp, spellnum)) {
291 pline("%s casts a spell%s!",
292 canspotmon(mtmp) ? Monnam(mtmp) : "Something",
293 is_undirected_spell(mattk->adtyp, spellnum)
295 : (Invisible && !perceives(mtmp->data)
296 && (mtmp->mux != u.ux || mtmp->muy != u.uy))
297 ? " at a spot near you"
299 && (mtmp->mux != u.ux || mtmp->muy != u.uy))
300 ? " at your displaced image"
303 char *who = (canspotmon(mtmp) ? Monnam(mtmp) : "
\89½
\8eÒ
\82©");
304 if(is_undirected_spell(mattk->adtyp, spellnum)){
305 pline("%s
\82Í
\8eô
\95¶
\82ð
\8f¥
\82¦
\82½
\81I", who);
307 pline("%s
\82Í
\82 \82È
\82½%s
\82É
\96\82\96@
\82ð
\82©
\82¯
\82½
\81I",
309 (Invisible && !perceives(mtmp->data) &&
310 (mtmp->mux != u.ux || mtmp->muy != u.uy)) ?
311 "
\82Ì
\82·
\82®
\82»
\82Î" :
312 (Displaced && (mtmp->mux != u.ux || mtmp->muy != u.uy)) ?
320 * As these are spells, the damage is related to the level
321 * of the monster casting the spell.
325 if (mattk->adtyp != AD_SPEL && mattk->adtyp != AD_CLRC) {
327 "%s casting non-hand-to-hand version of hand-to-hand spell %d?",
328 Monnam(mtmp), mattk->adtyp);
331 } else if (mattk->damd)
332 dmg = d((int) ((ml / 2) + mattk->damn), (int) mattk->damd);
334 dmg = d((int) ((ml / 2) + 1), 6);
335 if (Half_spell_damage)
340 switch (mattk->adtyp) {
343 pline("You're enveloped in flames.");
345 You("
\89\8a\82É
\82Â
\82Â
\82Ü
\82ê
\82½
\81D");
346 if (Fire_resistance) {
347 shieldeff(u.ux, u.uy);
349 pline("But you resist the effects.");
351 pline("
\82µ
\82©
\82µ
\81C
\82 \82È
\82½
\82Í
\89e
\8b¿
\82ð
\8eó
\82¯
\82È
\82¢
\81D");
358 pline("You're covered in frost.");
360 You("
\95X
\82É
\95¢
\82í
\82ê
\82½
\81D");
361 if (Cold_resistance) {
362 shieldeff(u.ux, u.uy);
364 pline("But you resist the effects.");
366 pline("
\82µ
\82©
\82µ
\81C
\82 \82È
\82½
\82Í
\89e
\8b¿
\82ð
\8eó
\82¯
\82È
\82¢
\81D");
372 You("are hit by a shower of missiles!");
374 You("
\96\82\96@
\82Ì
\96î
\82ð
\82
\82ç
\82Á
\82½
\81I");
376 shieldeff(u.ux, u.uy);
378 pline_The("missiles bounce off!");
380 pline("
\96\82\96@
\82Ì
\96î
\82Í
\94½
\8eË
\82µ
\82½
\81I");
383 dmg = d((int) mtmp->m_lev / 2 + 1, 6);
385 case AD_SPEL: /* wizard spell */
386 case AD_CLRC: /* clerical spell */
388 if (mattk->adtyp == AD_SPEL)
389 cast_wizard_spell(mtmp, dmg, spellnum);
391 cast_cleric_spell(mtmp, dmg, spellnum);
392 dmg = 0; /* done by the spell casting functions */
401 /* monster wizard and cleric spellcasting functions */
403 If dmg is zero, then the monster is not casting at you.
404 If the monster is intentionally not casting at you, we have previously
405 called spell_would_be_useless() and spellnum should always be a valid
407 If you modify either of these, be sure to change is_undirected_spell()
408 and spell_would_be_useless().
412 cast_wizard_spell(mtmp, dmg, spellnum)
417 if (dmg == 0 && !is_undirected_spell(AD_SPEL, spellnum)) {
418 impossible("cast directed wizard spell (%d) with dmg=0?", spellnum);
423 case MGC_DEATH_TOUCH:
425 pline("Oh no, %s's using the touch of death!", mhe(mtmp));
427 pline("
\82È
\82ñ
\82Ä
\82±
\82Á
\82½
\82¢
\81C%s
\82Í
\8e\80\82Ì
\90é
\8d\90\82ð
\8eg
\82Á
\82Ä
\82¢
\82é
\81I", mhe(mtmp));
428 if (nonliving(youmonst.data) || is_demon(youmonst.data)) {
430 You("seem no deader than before.");
432 You("
\82±
\82ê
\88È
\8fã
\8e\80\82Ë
\82È
\82¢
\82æ
\82¤
\82¾
\81D");
433 } else if (!Antimagic && rn2(mtmp->m_lev) > 12) {
436 You("have an out of body experience.");
438 You("
\97H
\91Ì
\97£
\92E
\82ð
\91Ì
\8c±
\82µ
\82½
\81D");
440 killer.format = KILLED_BY_AN;
442 Strcpy(killer.name, "touch of death");
444 Strcpy(killer.name, "
\8e\80\82Ì
\90é
\8d\90\82Å");
449 shieldeff(u.ux, u.uy);
451 pline("Lucky for you, it didn't work!");
453 pline("
\89^
\82Ì
\82æ
\82¢
\82±
\82Æ
\82É
\82È
\82ñ
\82Æ
\82à
\82È
\82©
\82Á
\82½
\81I");
458 if (mtmp->iswiz && context.no_of_wizards == 1) {
460 pline("Double Trouble...");
462 pline("
\93ñ
\8fd
\8bê
\82¾
\81D
\81D
\81D");
466 impossible("bad wizard cloning?");
468 case MGC_SUMMON_MONS: {
471 count = nasty(mtmp); /* summon something nasty */
474 verbalize("Destroy the thief, my pet%s!", plur(count));
476 verbalize("
\93\90\91¯
\82ð
\8eE
\82¹
\81I
\89ä
\82ª
\89º
\96l
\82æ
\81I");
479 const char *mappear =
480 (count == 1) ? "A monster appears" : "Monsters appear";
483 /* messages not quite right if plural monsters created but
484 only a single monster is seen */
485 if (Invisible && !perceives(mtmp->data)
486 && (mtmp->mux != u.ux || mtmp->muy != u.uy))
488 pline("%s around a spot near you!", mappear);
490 pline("
\89ö
\95¨
\82ª
\82 \82È
\82½
\82Ì
\82·
\82®
\82»
\82Î
\82É
\8c»
\82ê
\82½
\81I");
492 else if (Displaced && (mtmp->mux != u.ux || mtmp->muy != u.uy))
494 pline("%s around your displaced image!", mappear);
496 pline("
\89ö
\95¨
\82ª
\82 \82È
\82½
\82Ì
\8c¶
\89e
\82Ì
\82·
\82®
\82»
\82Î
\82É
\8c»
\82ê
\82½
\81I");
500 pline("%s from nowhere!", mappear);
502 pline("
\89ö
\95¨
\82ª
\82Ç
\82±
\82©
\82ç
\82Æ
\82à
\82È
\82
\8c»
\82ê
\82½
\81I");
508 case MGC_AGGRAVATION:
510 You_feel("that monsters are aware of your presence.");
512 You_feel("
\89ö
\95¨
\82½
\82¿
\82ª
\82 \82È
\82½
\82Ì
\91¶
\8dÝ
\82É
\8bC
\95t
\82¢
\82½
\82æ
\82¤
\82È
\8bC
\82ª
\82µ
\82½
\81D");
516 case MGC_CURSE_ITEMS:
518 You_feel("as if you need some help.");
520 You_feel("
\8f\95\82¯
\82ª
\95K
\97v
\82È
\8bC
\82ª
\82µ
\82½
\81D");
524 case MGC_DESTRY_ARMR:
526 shieldeff(u.ux, u.uy);
528 pline("A field of force surrounds you!");
530 pline("
\95s
\8ev
\8bc
\82È
\97Í
\82ª
\82 \82È
\82½
\82ð
\82Æ
\82è
\82Ü
\82¢
\82½
\81I");
531 } else if (!destroy_arm(some_armor(&youmonst))) {
533 Your("skin itches.");
535 You("
\83\80\83Y
\83\80\83Y
\82µ
\82½
\81D");
539 case MGC_WEAKEN_YOU: /* drain strength */
541 shieldeff(u.ux, u.uy);
543 You_feel("momentarily weakened.");
545 You_feel("
\88ê
\8fu
\8eã
\82
\82È
\82Á
\82½
\82æ
\82¤
\82È
\8bC
\82ª
\82µ
\82½
\81D");
548 You("suddenly feel weaker!");
550 You("
\93Ë
\91R
\8eã
\82
\82È
\82Á
\82½
\82æ
\82¤
\82È
\8bC
\82ª
\82µ
\82½
\81D");
551 dmg = mtmp->m_lev - 6;
552 if (Half_spell_damage)
556 done_in_by(mtmp, DIED);
560 case MGC_DISAPPEAR: /* makes self invisible */
561 if (!mtmp->minvis && !mtmp->invis_blkd) {
564 pline("%s suddenly %s!", Monnam(mtmp),
565 !See_invisible ? "disappears" : "becomes transparent");
567 pline("%s
\82Í
\93Ë
\91R%s
\81I", Monnam(mtmp),
568 !See_invisible ? "
\8fÁ
\82¦
\82½" : "
\93§
\96¾
\82É
\82È
\82Á
\82½");
570 mon_set_minvis(mtmp);
573 impossible("no reason for monster to cast disappear spell?");
576 if (Antimagic || Free_action) {
577 shieldeff(u.ux, u.uy);
580 You_feel("momentarily disoriented.");
582 You("
\88ê
\8fu
\95û
\8cü
\8a´
\8ao
\82ð
\8e¸
\82Á
\82½
\81D");
583 make_stunned(1L, FALSE);
586 You(Stunned ? "struggle to keep your balance." : "reel...");
588 You(Stunned ? "
\83o
\83\89\83\93\83X
\82ð
\8eæ
\82ë
\82¤
\82Æ
\82à
\82ª
\82¢
\82½
\81D" : "
\82æ
\82ë
\82ß
\82¢
\82½
\81D
\81D
\81D");
589 dmg = d(ACURR(A_DEX) < 12 ? 6 : 4, 4);
590 if (Half_spell_damage)
592 make_stunned((HStun & TIMEOUT) + (long) dmg, FALSE);
597 mon_adjust_speed(mtmp, 1, (struct obj *) 0);
601 if (mtmp->mhp < mtmp->mhpmax) {
604 pline("%s looks better.", Monnam(mtmp));
606 pline("%s
\82Í
\8bC
\95ª
\82ª
\82æ
\82
\82È
\82Á
\82½
\82æ
\82¤
\82¾
\81D", Monnam(mtmp));
607 /* note: player healing does 6d4; this used to do 1d8 */
608 if ((mtmp->mhp += d(3, 6)) > mtmp->mhpmax)
609 mtmp->mhp = mtmp->mhpmax;
614 /* prior to 3.4.0 Antimagic was setting the damage to 1--this
615 made the spell virtually harmless to players with magic res. */
617 shieldeff(u.ux, u.uy);
622 You("get a slight %sache.", body_part(HEAD));
624 You("
\82¿
\82å
\82Á
\82Æ%s
\92É
\82ª
\82µ
\82½
\81D",body_part(HEAD));
627 Your("brain is on fire!");
629 You("
\93{
\82è
\82É
\82Â
\82Â
\82Ü
\82ê
\82½
\81I");
632 Your("%s suddenly aches painfully!", body_part(HEAD));
634 You("
\93Ë
\91R%s
\92É
\82É
\82¨
\82»
\82í
\82ê
\82½
\81I", body_part(HEAD));
637 Your("%s suddenly aches very painfully!", body_part(HEAD));
639 You("
\93Ë
\91R
\8c\83\82µ
\82¢%s
\92É
\82É
\82¨
\82»
\82í
\82ê
\82½
\81I", body_part(HEAD));
642 impossible("mcastu: invalid magic spell (%d)", spellnum);
653 cast_cleric_spell(mtmp, dmg, spellnum)
658 if (dmg == 0 && !is_undirected_spell(AD_CLRC, spellnum)) {
659 impossible("cast directed cleric spell (%d) with dmg=0?", spellnum);
665 /* this is physical damage (force not heat),
666 * not magical damage or fire damage
669 pline("A sudden geyser slams into you from nowhere!");
671 pline("
\91÷
\97¬
\82ª
\82Ç
\82±
\82©
\82ç
\82Æ
\82à
\82È
\82
\8c»
\82ê
\82Ä
\82 \82È
\82½
\82ð
\91Å
\82¿
\82Â
\82¯
\82½
\81I");
673 if (Half_physical_damage)
676 case CLC_FIRE_PILLAR:
678 pline("A pillar of fire strikes all around you!");
680 pline("
\82 \82È
\82½
\82Ì
\8eü
\82è
\82É
\89Î
\92\8c\82ª
\97§
\82Á
\82½
\81I");
681 if (Fire_resistance) {
682 shieldeff(u.ux, u.uy);
686 if (Half_spell_damage)
689 (void) burnarmor(&youmonst);
690 destroy_item(SCROLL_CLASS, AD_FIRE);
691 destroy_item(POTION_CLASS, AD_FIRE);
692 destroy_item(SPBOOK_CLASS, AD_FIRE);
693 (void) burn_floor_objects(u.ux, u.uy, TRUE, FALSE);
695 case CLC_LIGHTNING: {
699 pline("A bolt of lightning strikes down at you from above!");
701 pline("
\82 \82È
\82½
\82Ì
\90^
\8fã
\82©
\82ç
\88î
\8dÈ
\82ª
\8d~
\82è
\92\8d\82¢
\82¾
\81I");
703 reflects = ureflects("It bounces off your %s%s.", "");
705 reflects = ureflects("
\82»
\82ê
\82Í
\82 \82È
\82½
\82Ì%s%s
\82Å
\92µ
\82Ë
\95Ô
\82Á
\82½
\81D", "");
706 if (reflects || Shock_resistance) {
707 shieldeff(u.ux, u.uy);
713 if (Half_spell_damage)
715 destroy_item(WAND_CLASS, AD_ELEC);
716 destroy_item(RING_CLASS, AD_ELEC);
717 (void) flashburn((long) rnd(100));
720 case CLC_CURSE_ITEMS:
722 You_feel("as if you need some help.");
724 You_feel("
\8f\95\82¯
\82ª
\95K
\97v
\82È
\8bC
\82ª
\82µ
\82½
\81D");
729 /* Try for insects, and if there are none
730 left, go for (sticks to) snakes. -3. */
731 struct permonst *pm = mkclass(S_ANT, 0);
732 struct monst *mtmp2 = (struct monst *) 0;
733 char let = (pm ? S_ANT : S_SNAKE);
734 boolean success = FALSE, seecaster;
735 int i, quan, oldseen, newseen;
739 oldseen = monster_census(TRUE);
740 quan = (mtmp->m_lev < 2) ? 1 : rnd((int) mtmp->m_lev / 2);
743 for (i = 0; i <= quan; i++) {
744 if (!enexto(&bypos, mtmp->mux, mtmp->muy, mtmp->data))
746 if ((pm = mkclass(let, 0)) != 0
747 && (mtmp2 = makemon(pm, bypos.x, bypos.y, MM_ANGRY)) != 0) {
749 mtmp2->msleeping = mtmp2->mpeaceful = mtmp2->mtame = 0;
753 newseen = monster_census(TRUE);
755 /* not canspotmon(), which includes unseen things sensed via warning
757 seecaster = canseemon(mtmp) || tp_sensemon(mtmp) || Detect_monsters;
761 char *arg; /* [not const: upstart(N==1 ? an() : makeplural())] */
762 const char *what = (let == S_SNAKE) ? "snake" : "insect";
764 if (newseen <= oldseen || Unaware) {
765 /* unseen caster fails or summons unseen critters,
766 or unconscious hero ("You dream that you hear...") */
767 You_hear("someone summoning %s.", makeplural(what));
769 /* unseen caster summoned seen critter(s) */
770 arg = (newseen == oldseen + 1) ? an(what) : makeplural(what);
772 You_hear("someone summoning something, and %s %s.", arg,
773 vtense(arg, "appear"));
775 pline("%s %s.", upstart(arg), vtense(arg, "appear"));
778 /* seen caster, possibly producing unseen--or just one--critters;
779 hero is told what the caster is doing and doesn't necessarily
780 observe complete accuracy of that caster's results (in other
781 words, no need to fuss with visibility or singularization;
782 player is told what's happening even if hero is unconscious) */
785 fmt = "%s casts at a clump of sticks, but nothing happens.";
787 fmt = "%s
\82Í
\96_
\90Ø
\82ê
\82É
\96\82\96@
\82ð
\82©
\82¯
\82½
\82ª
\81C
\82È
\82É
\82à
\82¨
\82±
\82ç
\82È
\82©
\82Á
\82½
\81D";
788 else if (let == S_SNAKE)
790 fmt = "%s transforms a clump of sticks into snakes!";
792 fmt = "%s
\82Í
\96_
\90Ø
\82ê
\82ð
\83w
\83r
\82É
\95Ï
\82¦
\82½
\81I";
793 else if (Invisible && !perceives(mtmp->data)
794 && (mtmp->mux != u.ux || mtmp->muy != u.uy))
796 fmt = "%s summons insects around a spot near you!";
798 fmt = "%s
\82Í
\92\8e\82ð
\82 \82È
\82½
\82Ì
\82·
\82®
\82»
\82Î
\82É
\8f¢
\8a«
\82µ
\82½
\81I";
799 else if (Displaced && (mtmp->mux != u.ux || mtmp->muy != u.uy))
801 fmt = "%s summons insects around your displaced image!";
803 fmt = "%s
\82Í
\92\8e\82ð
\82 \82È
\82½
\82Ì
\8c¶
\89e
\82Ì
\8eü
\82è
\82É
\8f¢
\8a«
\82µ
\82½
\81I";
806 fmt = "%s summons insects!";
808 fmt = "%s
\82Í
\92\8e\82ð
\8f¢
\8a«
\82µ
\82½
\81I";
810 pline(fmt, Monnam(mtmp));
816 /* note: resists_blnd() doesn't apply here */
818 int num_eyes = eyecount(youmonst.data);
820 pline("Scales cover your %s!", (num_eyes == 1)
822 : makeplural(body_part(EYE)));
824 pline("
\97Ø
\82ª
\82 \82È
\82½
\82Ì%s
\82ð
\95¢
\82Á
\82½
\81I", body_part(EYE));
826 make_blinded(Half_spell_damage ? 100L : 200L, FALSE);
828 Your1(vision_clears);
831 impossible("no reason for monster to cast blindness spell?");
834 if (Antimagic || Free_action) {
835 shieldeff(u.ux, u.uy);
838 You("stiffen briefly.");
840 You("
\88ê
\8fu
\8dd
\92¼
\82µ
\82½
\81D");
842 multi_reason = "paralyzed by a monster";
846 You("are frozen in place!");
848 You("
\82»
\82Ì
\8fê
\82Å
\93®
\82¯
\82È
\82
\82È
\82Á
\82½
\81I");
849 dmg = 4 + (int) mtmp->m_lev;
850 if (Half_spell_damage)
853 multi_reason = "paralyzed by a monster";
858 case CLC_CONFUSE_YOU:
860 shieldeff(u.ux, u.uy);
862 You_feel("momentarily dizzy.");
864 You("
\88ê
\8fu
\82ß
\82Ü
\82¢
\82ª
\82µ
\82½
\81D");
866 boolean oldprop = !!Confusion;
868 dmg = (int) mtmp->m_lev;
869 if (Half_spell_damage)
871 make_confused(HConfusion + dmg, TRUE);
874 You_feel("%s!", oldprop ? "trippier" : "trippy");
876 You("%s
\82Ö
\82ë
\82Ö
\82ë
\82É
\82È
\82Á
\82½
\81I", oldprop ? "
\82à
\82Á
\82Æ" : "");
880 You_feel("%sconfused!", oldprop ? "more " : "");
882 You("%s
\8d¬
\97\90\82µ
\82½
\81I", oldprop ? "
\82à
\82Á
\82Æ" : "");
888 if (mtmp->mhp < mtmp->mhpmax) {
891 pline("%s looks better.", Monnam(mtmp));
893 pline("%s
\82Í
\8bC
\95ª
\82ª
\82æ
\82
\82È
\82Á
\82½
\82æ
\82¤
\82¾
\81D", Monnam(mtmp));
895 /* note: player healing does 6d4; this used to do 1d8 */
896 if ((mtmp->mhp += d(3, 6)) > mtmp->mhpmax)
897 mtmp->mhp = mtmp->mhpmax;
901 case CLC_OPEN_WOUNDS:
903 shieldeff(u.ux, u.uy);
908 Your("skin itches badly for a moment.");
910 Your("
\94ç
\95\86\82Í
\88ê
\8fu
\81C
\83\80\83Y
\83\80\83Y
\82Á
\82Æ
\82µ
\82½
\81D");
913 pline("Wounds appear on your body!");
915 pline("
\8f\9d\82ª
\82 \82È
\82½
\82Ì
\91Ì
\82É
\8fo
\97\88\82½
\81I");
918 pline("Severe wounds appear on your body!");
920 pline("
\82Ð
\82Ç
\82¢
\8f\9d\82ª
\82 \82È
\82½
\82Ì
\91Ì
\82É
\8fo
\97\88\82½
\81I");
923 Your("body is covered with painful wounds!");
925 pline("
\91Ì
\82ª
\8f\9d\82¾
\82ç
\82¯
\82É
\82È
\82Á
\82½
\81I");
928 impossible("mcastu: invalid clerical spell (%d)", spellnum);
939 is_undirected_spell(adtyp, spellnum)
943 if (adtyp == AD_SPEL) {
946 case MGC_SUMMON_MONS:
947 case MGC_AGGRAVATION:
955 } else if (adtyp == AD_CLRC) {
967 /* Some spells are useless under some circumstances. */
970 spell_would_be_useless(mtmp, adtyp, spellnum)
975 /* Some spells don't require the player to really be there and can be cast
976 * by the monster when you're invisible, yet still shouldn't be cast when
977 * the monster doesn't even think you're there.
978 * This check isn't quite right because it always uses your real position.
979 * We really want something like "if the monster could see mux, muy".
981 boolean mcouldseeu = couldsee(mtmp->mx, mtmp->my);
983 if (adtyp == AD_SPEL) {
984 /* aggravate monsters, etc. won't be cast by peaceful monsters */
986 && (spellnum == MGC_AGGRAVATION || spellnum == MGC_SUMMON_MONS
987 || spellnum == MGC_CLONE_WIZ))
989 /* haste self when already fast */
990 if (mtmp->permspeed == MFAST && spellnum == MGC_HASTE_SELF)
992 /* invisibility when already invisible */
993 if ((mtmp->minvis || mtmp->invis_blkd) && spellnum == MGC_DISAPPEAR)
995 /* peaceful monster won't cast invisibility if you can't see
997 same as when monsters drink potions of invisibility. This doesn't
998 really make a lot of sense, but lets the player avoid hitting
999 peaceful monsters by mistake */
1000 if (mtmp->mpeaceful && !See_invisible && spellnum == MGC_DISAPPEAR)
1002 /* healing when already healed */
1003 if (mtmp->mhp == mtmp->mhpmax && spellnum == MGC_CURE_SELF)
1005 /* don't summon monsters if it doesn't think you're around */
1006 if (!mcouldseeu && (spellnum == MGC_SUMMON_MONS
1007 || (!mtmp->iswiz && spellnum == MGC_CLONE_WIZ)))
1009 if ((!mtmp->iswiz || context.no_of_wizards > 1)
1010 && spellnum == MGC_CLONE_WIZ)
1012 /* aggravation (global wakeup) when everyone is already active */
1013 if (spellnum == MGC_AGGRAVATION) {
1014 struct monst *nxtmon;
1016 for (nxtmon = fmon; nxtmon; nxtmon = nxtmon->nmon) {
1017 if (DEADMONSTER(nxtmon))
1019 if ((nxtmon->mstrategy & STRAT_WAITFORU) != 0
1020 || nxtmon->msleeping || !nxtmon->mcanmove)
1023 /* if nothing needs to be awakened then this spell is useless
1024 but caster might not realize that [chance to pick it then
1025 must be very small otherwise caller's many retry attempts
1026 will eventually end up picking it too often] */
1028 return rn2(100) ? TRUE : FALSE;
1030 } else if (adtyp == AD_CLRC) {
1031 /* summon insects/sticks to snakes won't be cast by peaceful monsters
1033 if (mtmp->mpeaceful && spellnum == CLC_INSECTS)
1035 /* healing when already healed */
1036 if (mtmp->mhp == mtmp->mhpmax && spellnum == CLC_CURE_SELF)
1038 /* don't summon insects if it doesn't think you're around */
1039 if (!mcouldseeu && spellnum == CLC_INSECTS)
1041 /* blindness spell on blinded player */
1042 if (Blinded && spellnum == CLC_BLIND_YOU)
1048 /* convert 1..10 to 0..9; add 10 for second group (spell casting) */
1049 #define ad_to_typ(k) (10 + (int) k - 1)
1051 /* monster uses spell (ranged) */
1054 register struct monst *mtmp;
1055 register struct attack *mattk;
1057 /* don't print constant stream of curse messages for 'normal'
1058 spellcasting monsters at range */
1059 if (mattk->adtyp > AD_SPC2)
1063 cursetxt(mtmp, FALSE);
1066 if (lined_up(mtmp) && rn2(3)) {
1068 if (mattk->adtyp && (mattk->adtyp < 11)) { /* no cf unsigned >0 */
1069 if (canseemon(mtmp))
1071 pline("%s zaps you with a %s!", Monnam(mtmp),
1072 flash_types[ad_to_typ(mattk->adtyp)]);
1074 pline("%s
\82Í%s
\82ð
\82 \82È
\82½
\82É
\8cü
\82¯
\82Ä
\95ú
\82Á
\82½
\81D", Monnam(mtmp),
1075 flash_types[ad_to_typ(mattk->adtyp)]);
1077 buzz(-ad_to_typ(mattk->adtyp), (int) mattk->damn, mtmp->mx,
1078 mtmp->my, sgn(tbx), sgn(tby));
1080 impossible("Monster spell %d cast", mattk->adtyp - 1);