OSDN Git Service

7aa72988a54b6bcd387694a674e052d20464877a
[hengband/hengband.git] / src / mspells3.c
1 /*!
2  * @file mspells3.c
3  * @brief 青魔法の処理実装 / Blue magic
4  * @date 2014/01/15
5  * @author
6  * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke\n
7  * This software may be copied and distributed for educational, research,\n
8  * and not for profit purposes provided that this copyright and statement\n
9  * are included in all such copies.  Other copyrights may also apply.\n
10  * 2014 Deskull rearranged comment for Doxygen.\n
11  */
12
13 #include "angband.h"
14 #include "spells-summon.h"
15 #include "projection.h"
16 #include "avatar.h"
17 #include "spells-status.h"
18 #include "cmd-spell.h"
19 #include "player-status.h"
20
21 #define pseudo_plev() (((p_ptr->lev + 40) * (p_ptr->lev + 40) - 1550) / 130) /*!< モンスター魔法をプレイヤーが使用する場合の換算レベル */
22
23
24 /*!
25 * @brief 文字列に青魔導師の呪文の攻撃力を加える
26 * @param SPELL_NUM 呪文番号
27 * @param plev プレイヤーレベル
28 * @param msg 表示する文字列
29 * @param tmp 返すメッセージを格納する配列
30 * @return なし
31 */
32 void set_bluemage_damage(int SPELL_NUM, PLAYER_LEVEL plev, concptr msg, char* tmp)
33 {
34     int base_damage = monspell_bluemage_damage(SPELL_NUM, plev, BASE_DAM);
35     int dice_num = monspell_bluemage_damage(SPELL_NUM, plev, DICE_NUM);
36     int dice_side = monspell_bluemage_damage(SPELL_NUM, plev, DICE_SIDE);
37     int dice_mult = monspell_bluemage_damage(SPELL_NUM, plev, DICE_MULT);
38     int dice_div = monspell_bluemage_damage(SPELL_NUM, plev, DICE_DIV);
39     char dmg_str[80];
40     dice_to_string(base_damage, dice_num, dice_side, dice_mult, dice_div, dmg_str);
41     sprintf(tmp, " %s %s", msg, dmg_str);
42 }
43
44 /*!
45  * @brief 受け取ったモンスター魔法のIDに応じて青魔法の効果情報をまとめたフォーマットを返す
46  * @param p 情報を返す文字列参照ポインタ
47  * @param power モンスター魔法のID
48  * @return なし
49  */
50 static void learned_info(char *p, int power)
51 {
52         PLAYER_LEVEL plev = pseudo_plev();
53
54         strcpy(p, "");
55
56         switch (power)
57         {
58                 case MS_SHRIEK:
59                 case MS_XXX1:
60                 case MS_XXX2:
61                 case MS_XXX3:
62                 case MS_XXX4:
63                 case MS_SCARE:
64                 case MS_BLIND:
65                 case MS_CONF:
66                 case MS_SLOW:
67                 case MS_SLEEP:
68                 case MS_HAND_DOOM:
69                 case MS_WORLD:
70                 case MS_SPECIAL:
71                 case MS_TELE_TO:
72                 case MS_TELE_AWAY:
73                 case MS_TELE_LEVEL:
74                 case MS_DARKNESS:
75                 case MS_MAKE_TRAP:
76                 case MS_FORGET:
77                 case MS_S_KIN:
78                 case MS_S_CYBER:
79                 case MS_S_MONSTER:
80                 case MS_S_MONSTERS:
81                 case MS_S_ANT:
82                 case MS_S_SPIDER:
83                 case MS_S_HOUND:
84                 case MS_S_HYDRA:
85                 case MS_S_ANGEL:
86                 case MS_S_DEMON:
87                 case MS_S_UNDEAD:
88                 case MS_S_DRAGON:
89                 case MS_S_HI_UNDEAD:
90                 case MS_S_HI_DRAGON:
91                 case MS_S_AMBERITE:
92                 case MS_S_UNIQUE:
93                         break;
94         case MS_BALL_MANA:
95         case MS_BALL_DARK:
96         case MS_STARBURST: 
97             set_bluemage_damage((power), plev, KWD_DAM, p); break;
98                 case MS_DISPEL:
99                         break;
100         case MS_ROCKET:
101         case MS_SHOOT:
102         case MS_BR_ACID:
103         case MS_BR_ELEC:
104         case MS_BR_FIRE:
105         case MS_BR_COLD:
106         case MS_BR_POIS:
107         case MS_BR_NUKE: 
108         case MS_BR_NEXUS:
109         case MS_BR_TIME:
110         case MS_BR_GRAVITY:
111         case MS_BR_MANA:
112         case MS_BR_NETHER:
113         case MS_BR_LITE:
114         case MS_BR_DARK:
115         case MS_BR_CONF:
116         case MS_BR_SOUND:
117         case MS_BR_CHAOS:
118         case MS_BR_DISEN:
119         case MS_BR_SHARDS:
120         case MS_BR_PLASMA:
121         case MS_BR_INERTIA:
122         case MS_BR_FORCE:
123         case MS_BR_DISI:
124         case MS_BALL_NUKE:
125         case MS_BALL_CHAOS:
126         case MS_BALL_ACID:
127         case MS_BALL_ELEC:
128         case MS_BALL_FIRE:
129         case MS_BALL_COLD:
130         case MS_BALL_POIS:
131         case MS_BALL_NETHER:
132         case MS_BALL_WATER:
133             set_bluemage_damage((power), plev, KWD_DAM, p); break;
134         case MS_DRAIN_MANA:
135             set_bluemage_damage((power), plev, KWD_HEAL, p); break;
136         case MS_MIND_BLAST:
137         case MS_BRAIN_SMASH:
138         case MS_CAUSE_1:
139         case MS_CAUSE_2:
140         case MS_CAUSE_3:
141         case MS_CAUSE_4:
142         case MS_BOLT_ACID:
143         case MS_BOLT_ELEC:
144         case MS_BOLT_FIRE:
145         case MS_BOLT_COLD:
146         case MS_BOLT_NETHER:
147         case MS_BOLT_WATER:
148         case MS_BOLT_MANA:
149         case MS_BOLT_PLASMA:
150         case MS_BOLT_ICE: 
151         case MS_MAGIC_MISSILE: 
152             set_bluemage_damage((power), plev, KWD_DAM, p); break;
153                 case MS_SPEED:
154                         sprintf(p, " %sd%d+%d", KWD_DURATION, 20+plev, plev);
155                         break;
156         case MS_HEAL:
157             set_bluemage_damage((power), plev, KWD_HEAL, p); break;
158                 case MS_INVULNER:
159                         sprintf(p, " %sd7+7", KWD_DURATION);
160                         break;
161                 case MS_BLINK:
162                         sprintf(p, " %s10", KWD_SPHERE);
163                         break;
164                 case MS_TELEPORT:
165                         sprintf(p, " %s%d", KWD_SPHERE, plev * 5);
166                         break;
167         case MS_PSY_SPEAR:
168             set_bluemage_damage((power), plev, KWD_DAM, p); break;
169                         break;
170                 case MS_RAISE_DEAD:
171                         sprintf(p, " %s5", KWD_SPHERE);
172                         break;
173                 default:
174                         break;
175         }
176 }
177
178
179 /*!
180  * @brief 使用可能な青魔法を選択する /
181  * Allow user to choose a imitation.
182  * @param sn 選択したモンスター攻撃ID、キャンセルの場合-1、不正な選択の場合-2を返す
183  * @return 発動可能な魔法を選択した場合TRUE、キャンセル処理か不正な選択が行われた場合FALSEを返す。
184  * @details
185  * If a valid spell is chosen, saves it in '*sn' and returns TRUE\n
186  * If the user hits escape, returns FALSE, and set '*sn' to -1\n
187  * If there are no legal choices, returns FALSE, and sets '*sn' to -2\n
188  *\n
189  * The "prompt" should be "cast", "recite", or "study"\n
190  * The "known" should be TRUE for cast/pray, FALSE for study\n
191  *\n
192  * nb: This function has a (trivial) display bug which will be obvious\n
193  * when you run it. It's probably easy to fix but I haven't tried,\n
194  * sorry.\n
195  */
196 static bool get_learned_power(SPELL_IDX *sn)
197 {
198         int             i = 0;
199         int             num = 0;
200         TERM_LEN y = 1;
201         TERM_LEN x = 18;
202         PERCENTAGE minfail = 0;
203         PLAYER_LEVEL plev = p_ptr->lev;
204         PERCENTAGE chance = 0;
205         int             ask = TRUE, mode = 0;
206         int             spellnum[MAX_MONSPELLS];
207         char            ch;
208         char            choice;
209         char            out_val[160];
210         char            comment[80];
211         BIT_FLAGS f4 = 0L, f5 = 0L, f6 = 0L;
212         concptr p = _("魔法", "magic");
213         COMMAND_CODE code;
214         monster_power   spell;
215         bool            flag, redraw;
216         int menu_line = (use_menu ? 1 : 0);
217
218         /* Assume cancelled */
219         *sn = (-1);
220
221         /* Nothing chosen yet */
222         flag = FALSE;
223
224         /* No redraw yet */
225         redraw = FALSE;
226
227         /* Get the spell, if available */
228         
229         if (repeat_pull(&code))
230         {
231                 *sn = (SPELL_IDX)code;
232                 return (TRUE);
233         }
234
235         if (use_menu)
236         {
237                 screen_save();
238
239                 while(!mode)
240                 {
241                         prt(format(_(" %s ボルト", " %s bolt"), (menu_line == 1) ? _("》", "> ") : "  "), 2, 14);
242                         prt(format(_(" %s ボール", " %s ball"), (menu_line == 2) ? _("》", "> ") : "  "), 3, 14);
243                         prt(format(_(" %s ブレス", " %s breath"), (menu_line == 3) ? _("》", "> ") : "  "), 4, 14);
244                         prt(format(_(" %s 召喚", " %s sommoning"), (menu_line == 4) ? _("》", "> ") : "  "), 5, 14);
245                         prt(format(_(" %s その他", " %s others"), (menu_line == 5) ? _("》", "> ") : "  "), 6, 14);
246                         prt(_("どの種類の魔法を使いますか?", "use which type of magic? "), 0, 0);
247
248                         choice = inkey();
249                         switch(choice)
250                         {
251                         case ESCAPE:
252                         case 'z':
253                         case 'Z':
254                                 screen_load();
255                                 return FALSE;
256                         case '2':
257                         case 'j':
258                         case 'J':
259                                 menu_line++;
260                                 break;
261                         case '8':
262                         case 'k':
263                         case 'K':
264                                 menu_line+= 4;
265                                 break;
266                         case '\r':
267                         case 'x':
268                         case 'X':
269                                 mode = menu_line;
270                                 break;
271                         }
272                         if (menu_line > 5) menu_line -= 5;
273                 }
274                 screen_load();
275         }
276         else
277         {
278         sprintf(comment, _("[A]ボルト, [B]ボール, [C]ブレス, [D]召喚, [E]その他:", "[A] bolt, [B] ball, [C] breath, [D] summoning, [E] others:"));
279         while (TRUE)
280         {
281                 if (!get_com(comment, &ch, TRUE))
282                 {
283                         return FALSE;
284                 }
285                 if (ch == 'A' || ch == 'a')
286                 {
287                         mode = 1;
288                         break;
289                 }
290                 if (ch == 'B' || ch == 'b')
291                 {
292                         mode = 2;
293                         break;
294                 }
295                 if (ch == 'C' || ch == 'c')
296                 {
297                         mode = 3;
298                         break;
299                 }
300                 if (ch == 'D' || ch == 'd')
301                 {
302                         mode = 4;
303                         break;
304                 }
305                 if (ch == 'E' || ch == 'e')
306                 {
307                         mode = 5;
308                         break;
309                 }
310         }
311         }
312
313         set_rf_masks(&f4, &f5, &f6, mode);
314
315         for (i = 0, num = 0; i < 32; i++)
316         {
317                 if ((0x00000001 << i) & f4) spellnum[num++] = i;
318         }
319         for (; i < 64; i++)
320         {
321                 if ((0x00000001 << (i - 32)) & f5) spellnum[num++] = i;
322         }
323         for (; i < 96; i++)
324         {
325                 if ((0x00000001 << (i - 64)) & f6) spellnum[num++] = i;
326         }
327         for (i = 0; i < num; i++)
328         {
329                 if (p_ptr->magic_num2[spellnum[i]])
330                 {
331                         if (use_menu) menu_line = i+1;
332                         break;
333                 }
334         }
335         if (i == num)
336         {
337                 msg_print(_("その種類の魔法は覚えていない!", "You don't know any spell of this type."));
338                 return (FALSE);
339         }
340
341         /* Build a prompt (accept all spells) */
342         (void)strnfmt(out_val, 78, _("(%c-%c, '*'で一覧, ESC) どの%sを唱えますか?", "(%c-%c, *=List, ESC=exit) Use which %s? "),
343                 I2A(0), I2A(num - 1), p);
344
345         if (use_menu) screen_save();
346
347         /* Get a spell from the user */
348
349         choice= (always_show_list || use_menu) ? ESCAPE:1 ;
350         while (!flag)
351         {
352                 if(choice==ESCAPE) choice = ' '; 
353                 else if( !get_com(out_val, &choice, TRUE) )break; 
354
355                 if (use_menu && choice != ' ')
356                 {
357                         switch(choice)
358                         {
359                                 case '0':
360                                 {
361                                         screen_load();
362                                         return (FALSE);
363                                 }
364
365                                 case '8':
366                                 case 'k':
367                                 case 'K':
368                                 {
369                                         do
370                                         {
371                                                 menu_line += (num-1);
372                                                 if (menu_line > num) menu_line -= num;
373                                         } while(!p_ptr->magic_num2[spellnum[menu_line-1]]);
374                                         break;
375                                 }
376
377                                 case '2':
378                                 case 'j':
379                                 case 'J':
380                                 {
381                                         do
382                                         {
383                                                 menu_line++;
384                                                 if (menu_line > num) menu_line -= num;
385                                         } while(!p_ptr->magic_num2[spellnum[menu_line-1]]);
386                                         break;
387                                 }
388
389                                 case '6':
390                                 case 'l':
391                                 case 'L':
392                                 {
393                                         menu_line=num;
394                                         while(!p_ptr->magic_num2[spellnum[menu_line-1]]) menu_line--;
395                                         break;
396                                 }
397
398                                 case '4':
399                                 case 'h':
400                                 case 'H':
401                                 {
402                                         menu_line=1;
403                                         while(!p_ptr->magic_num2[spellnum[menu_line-1]]) menu_line++;
404                                         break;
405                                 }
406
407                                 case 'x':
408                                 case 'X':
409                                 case '\r':
410                                 {
411                                         i = menu_line - 1;
412                                         ask = FALSE;
413                                         break;
414                                 }
415                         }
416                 }
417                 /* Request redraw */
418                 if ((choice == ' ') || (choice == '*') || (choice == '?') || (use_menu && ask))
419                 {
420                         /* Show the list */
421                         if (!redraw || use_menu)
422                         {
423                                 char psi_desc[80];
424                                 redraw = TRUE;
425                                 if (!use_menu) screen_save();
426
427                                 /* Display a list of spells */
428                                 prt("", y, x);
429                                 put_str(_("名前", "Name"), y, x + 5);
430                                 put_str(_("MP 失率 効果", "SP Fail Info"), y, x + 33);
431
432
433                                 /* Dump the spells */
434                                 for (i = 0; i < num; i++)
435                                 {
436                                         int need_mana;
437
438                                         prt("", y + i + 1, x);
439                                         if (!p_ptr->magic_num2[spellnum[i]]) continue;
440
441                                         /* Access the spell */
442                                         spell = monster_powers[spellnum[i]];
443
444                                         chance = spell.fail;
445
446                                         /* Reduce failure rate by "effective" level adjustment */
447                                         if (plev > spell.level) chance -= 3 * (plev - spell.level);
448                                         else chance += (spell.level - plev);
449
450                                         /* Reduce failure rate by INT/WIS adjustment */
451                                         chance -= 3 * (adj_mag_stat[p_ptr->stat_ind[A_INT]] - 1);
452
453                                         chance = mod_spell_chance_1(chance);
454
455                                         need_mana = mod_need_mana(monster_powers[spellnum[i]].smana, 0, REALM_NONE);
456
457                                         /* Not enough mana to cast */
458                                         if (need_mana > p_ptr->csp)
459                                         {
460                                                 chance += 5 * (need_mana - p_ptr->csp);
461                                         }
462
463                                         /* Extract the minimum failure rate */
464                                         minfail = adj_mag_fail[p_ptr->stat_ind[A_INT]];
465
466                                         /* Minimum failure rate */
467                                         if (chance < minfail) chance = minfail;
468
469                                         /* Stunning makes spells harder */
470                                         if (p_ptr->stun > 50) chance += 25;
471                                         else if (p_ptr->stun) chance += 15;
472
473                                         /* Always a 5 percent chance of working */
474                                         if (chance > 95) chance = 95;
475
476                                         chance = mod_spell_chance_2(chance);
477
478                                         /* Get info */
479                                         learned_info(comment, spellnum[i]);
480
481                                         if (use_menu)
482                                         {
483                                                 if (i == (menu_line-1)) strcpy(psi_desc, _("  》", "  > "));
484                                                 else strcpy(psi_desc, "    ");
485                                         }
486                                         else sprintf(psi_desc, "  %c)", I2A(i));
487
488                                         /* Dump the spell --(-- */
489                                         strcat(psi_desc, format(" %-26s %3d %3d%%%s",
490                                                 spell.name, need_mana,
491                                                 chance, comment));
492                                         prt(psi_desc, y + i + 1, x);
493                                 }
494
495                                 /* Clear the bottom line */
496                                 if (y < 22) prt("", y + i + 1, x);
497                         }
498
499                         /* Hide the list */
500                         else
501                         {
502                                 /* Hide list */
503                                 redraw = FALSE;
504                                 screen_load();
505                         }
506
507                         /* Redo asking */
508                         continue;
509                 }
510
511                 if (!use_menu)
512                 {
513                         /* Note verify */
514                         ask = isupper(choice);
515
516                         /* Lowercase */
517                         if (ask) choice = (char)tolower(choice);
518
519                         /* Extract request */
520                         i = (islower(choice) ? A2I(choice) : -1);
521                 }
522
523                 /* Totally Illegal */
524                 if ((i < 0) || (i >= num) || !p_ptr->magic_num2[spellnum[i]])
525                 {
526                         bell();
527                         continue;
528                 }
529
530                 /* Save the spell index */
531                 spell = monster_powers[spellnum[i]];
532
533                 /* Verify it */
534                 if (ask)
535                 {
536                         char tmp_val[160];
537
538                         /* Prompt */
539                         (void) strnfmt(tmp_val, 78, _("%sの魔法を唱えますか?", "Use %s? "), monster_powers[spellnum[i]].name);
540
541                         /* Belay that order */
542                         if (!get_check(tmp_val)) continue;
543                 }
544
545                 /* Stop the loop */
546                 flag = TRUE;
547         }
548         if (redraw) screen_load();
549
550         p_ptr->window |= (PW_SPELL);
551         handle_stuff();
552
553         /* Abort if needed */
554         if (!flag) return (FALSE);
555
556         /* Save the choice */
557         (*sn) = spellnum[i];
558
559         repeat_push((COMMAND_CODE)spellnum[i]);
560
561         /* Success */
562         return (TRUE);
563 }
564
565
566 /*!
567  * @brief 青魔法の発動 /
568  * do_cmd_cast calls this function if the player's class is 'blue-mage'.
569  * @param spell 発動するモンスター攻撃のID
570  * @param success TRUEは成功時、FALSEは失敗時の処理を行う
571  * @return 処理を実行したらTRUE、キャンセルした場合FALSEを返す。
572  */
573 static bool cast_learned_spell(int spell, bool success)
574 {
575         DIRECTION dir;
576         PLAYER_LEVEL plev = pseudo_plev();
577         PLAYER_LEVEL summon_lev = p_ptr->lev * 2 / 3 + randint1(p_ptr->lev/2);
578         HIT_POINT damage = 0;
579         bool pet = success;
580         bool no_trump = FALSE;
581         BIT_FLAGS p_mode, u_mode = 0L, g_mode;
582
583         if (pet)
584         {
585                 p_mode = PM_FORCE_PET;
586                 g_mode = 0;
587         }
588         else
589         {
590                 p_mode = PM_NO_PET;
591                 g_mode = PM_ALLOW_GROUP;
592         }
593
594         if (!success || (randint1(50+plev) < plev/10)) u_mode = PM_ALLOW_UNIQUE;
595
596         /* spell code */
597         switch (spell)
598         {
599         case MS_SHRIEK:
600         msg_print(_("かん高い金切り声をあげた。", "You make a high pitched shriek."));
601                 aggravate_monsters(0);
602                 break;
603         case MS_XXX1:
604                 break;
605         case MS_DISPEL:
606         {
607                 MONSTER_IDX m_idx;
608
609                 if (!target_set(TARGET_KILL)) return FALSE;
610                 m_idx = current_floor_ptr->grid_array[target_row][target_col].m_idx;
611                 if (!m_idx) break;
612                 if (!player_has_los_bold(target_row, target_col)) break;
613                 if (!projectable(p_ptr->y, p_ptr->x, target_row, target_col)) break;
614                 dispel_monster_status(m_idx);
615                 break;
616         }
617         case MS_ROCKET:
618                 if (!get_aim_dir(&dir)) return FALSE;
619                 
620         msg_print(_("ロケットを発射した。", "You fire a rocket."));
621         damage = monspell_bluemage_damage((MS_ROCKET), plev, DAM_ROLL);
622                 fire_rocket(GF_ROCKET, dir, damage, 2);
623                 break;
624         case MS_SHOOT:
625         {
626                 if (!get_aim_dir(&dir)) return FALSE;
627                 
628         msg_print(_("矢を放った。", "You fire an arrow."));
629         damage = monspell_bluemage_damage((MS_SHOOT), plev, DAM_ROLL);
630                 fire_bolt(GF_ARROW, dir, damage);
631                 break;
632         }
633         case MS_XXX2:
634                 break;
635         case MS_XXX3:
636                 break;
637         case MS_XXX4:
638                 break;
639         case MS_BR_ACID:
640                 if (!get_aim_dir(&dir)) return FALSE;
641
642         msg_print(_("酸のブレスを吐いた。", "You breathe acid."));
643         damage = monspell_bluemage_damage((MS_BR_ACID), plev, DAM_ROLL);
644                 fire_breath(GF_ACID, dir, damage, (plev > 40 ? 3 : 2));
645                 break;
646         case MS_BR_ELEC:
647                 if (!get_aim_dir(&dir)) return FALSE;
648
649         msg_print(_("稲妻のブレスを吐いた。", "You breathe lightning."));
650         damage = monspell_bluemage_damage((MS_BR_ELEC), plev, DAM_ROLL);
651                 fire_breath(GF_ELEC, dir, damage, (plev > 40 ? 3 : 2));
652                 break;
653         case MS_BR_FIRE:
654                 if (!get_aim_dir(&dir)) return FALSE;
655
656         msg_print(_("火炎のブレスを吐いた。", "You breathe fire."));
657         damage = monspell_bluemage_damage((MS_BR_FIRE), plev, DAM_ROLL);
658                 fire_breath(GF_FIRE, dir, damage, (plev > 40 ? 3 : 2));
659                 break;
660         case MS_BR_COLD:
661         if (!get_aim_dir(&dir)) return FALSE;
662
663         msg_print(_("冷気のブレスを吐いた。", "You breathe frost."));
664         damage = monspell_bluemage_damage((MS_BR_COLD), plev, DAM_ROLL);
665                 fire_breath(GF_COLD, dir, damage, (plev > 40 ? 3 : 2));
666                 break;
667         case MS_BR_POIS:
668         if (!get_aim_dir(&dir)) return FALSE;
669
670         msg_print(_("ガスのブレスを吐いた。", "You breathe gas."));
671         damage = monspell_bluemage_damage((MS_BR_POIS), plev, DAM_ROLL);
672                 fire_breath(GF_POIS, dir, damage, (plev > 40 ? 3 : 2));
673                 break;
674         case MS_BR_NETHER:
675         if (!get_aim_dir(&dir)) return FALSE;
676
677         msg_print(_("地獄のブレスを吐いた。", "You breathe nether."));
678         damage = monspell_bluemage_damage((MS_BR_NETHER), plev, DAM_ROLL);
679                 fire_breath(GF_NETHER, dir, damage, (plev > 40 ? 3 : 2));
680                 break;
681         case MS_BR_LITE:
682                 if (!get_aim_dir(&dir)) return FALSE;
683
684         msg_print(_("閃光のブレスを吐いた。", "You breathe light."));
685         damage = monspell_bluemage_damage((MS_BR_LITE), plev, DAM_ROLL);
686                 fire_breath(GF_LITE, dir, damage, (plev > 40 ? 3 : 2));
687                 break;
688         case MS_BR_DARK:
689                 if (!get_aim_dir(&dir)) return FALSE;
690
691         msg_print(_("暗黒のブレスを吐いた。", "You breathe darkness."));
692         damage = monspell_bluemage_damage((MS_BR_DARK), plev, DAM_ROLL);
693                 fire_breath(GF_DARK, dir, damage, (plev > 40 ? 3 : 2));
694                 break;
695         case MS_BR_CONF:
696                 if (!get_aim_dir(&dir)) return FALSE;
697
698         msg_print(_("混乱のブレスを吐いた。", "You breathe confusion."));
699         damage = monspell_bluemage_damage((MS_BR_CONF), plev, DAM_ROLL);
700                 fire_breath(GF_CONFUSION, dir, damage, (plev > 40 ? 3 : 2));
701                 break;
702         case MS_BR_SOUND:
703                 if (!get_aim_dir(&dir)) return FALSE;
704
705         msg_print(_("轟音のブレスを吐いた。", "You breathe sound."));
706         damage = monspell_bluemage_damage((MS_BR_SOUND), plev, DAM_ROLL);
707                 fire_breath(GF_SOUND, dir, damage, (plev > 40 ? 3 : 2));
708                 break;
709         case MS_BR_CHAOS:
710                 if (!get_aim_dir(&dir)) return FALSE;
711
712         msg_print(_("カオスのブレスを吐いた。", "You breathe chaos."));
713         damage = monspell_bluemage_damage((MS_BR_CHAOS), plev, DAM_ROLL);
714                 fire_breath(GF_CHAOS, dir, damage, (plev > 40 ? 3 : 2));
715                 break;
716         case MS_BR_DISEN:
717                 if (!get_aim_dir(&dir)) return FALSE;
718
719         msg_print(_("劣化のブレスを吐いた。", "You breathe disenchantment."));
720         damage = monspell_bluemage_damage((MS_BR_DISEN), plev, DAM_ROLL);
721                 fire_breath(GF_DISENCHANT, dir, damage, (plev > 40 ? 3 : 2));
722                 break;
723         case MS_BR_NEXUS:
724                 if (!get_aim_dir(&dir)) return FALSE;
725
726         msg_print(_("因果混乱のブレスを吐いた。", "You breathe nexus."));
727         damage = monspell_bluemage_damage((MS_BR_NEXUS), plev, DAM_ROLL);
728                 fire_breath(GF_NEXUS, dir, damage, (plev > 40 ? 3 : 2));
729                 break;
730         case MS_BR_TIME:
731                 if (!get_aim_dir(&dir)) return FALSE;
732
733         msg_print(_("時間逆転のブレスを吐いた。", "You breathe time."));
734         damage = monspell_bluemage_damage((MS_BR_TIME), plev, DAM_ROLL);
735                 fire_breath(GF_TIME, dir, damage, (plev > 40 ? 3 : 2));
736                 break;
737         case MS_BR_INERTIA:
738                 if (!get_aim_dir(&dir)) return FALSE;
739
740         msg_print(_("遅鈍のブレスを吐いた。", "You breathe inertia."));
741         damage = monspell_bluemage_damage((MS_BR_INERTIA), plev, DAM_ROLL);
742                 fire_breath(GF_INERTIAL, dir, damage, (plev > 40 ? 3 : 2));
743                 break;
744         case MS_BR_GRAVITY:
745                 if (!get_aim_dir(&dir)) return FALSE;
746
747         msg_print(_("重力のブレスを吐いた。", "You breathe gravity."));
748         damage = monspell_bluemage_damage((MS_BR_GRAVITY), plev, DAM_ROLL);
749                 fire_breath(GF_GRAVITY, dir, damage, (plev > 40 ? 3 : 2));
750                 break;
751         case MS_BR_SHARDS:
752         if (!get_aim_dir(&dir)) return FALSE;
753
754         msg_print(_("破片のブレスを吐いた。", "You breathe shards."));
755         damage = monspell_bluemage_damage((MS_BR_SHARDS), plev, DAM_ROLL);
756                 fire_breath(GF_SHARDS, dir, damage, (plev > 40 ? 3 : 2));
757                 break;
758         case MS_BR_PLASMA:
759         if (!get_aim_dir(&dir)) return FALSE;
760
761         msg_print(_("プラズマのブレスを吐いた。", "You breathe plasma."));
762         damage = monspell_bluemage_damage((MS_BR_PLASMA), plev, DAM_ROLL);
763                 fire_breath(GF_PLASMA, dir, damage, (plev > 40 ? 3 : 2));
764                 break;
765         case MS_BR_FORCE:
766         if (!get_aim_dir(&dir)) return FALSE;
767
768         msg_print(_("フォースのブレスを吐いた。", "You breathe force."));
769         damage = monspell_bluemage_damage((MS_BR_FORCE), plev, DAM_ROLL);
770                 fire_breath(GF_FORCE, dir, damage, (plev > 40 ? 3 : 2));
771                 break;
772         case MS_BR_MANA:
773                 if (!get_aim_dir(&dir)) return FALSE;
774
775         msg_print(_("魔力のブレスを吐いた。", "You breathe mana."));
776         damage = monspell_bluemage_damage((MS_BR_MANA), plev, DAM_ROLL);
777                 fire_breath(GF_MANA, dir, damage, (plev > 40 ? 3 : 2));
778                 break;
779         case MS_BALL_NUKE:
780                 if (!get_aim_dir(&dir)) return FALSE;
781
782         msg_print(_("放射能球を放った。", "You cast a ball of radiation."));
783         damage = monspell_bluemage_damage((MS_BALL_NUKE), plev, DAM_ROLL);
784                 fire_ball(GF_NUKE, dir, damage, 2);
785                 break;
786         case MS_BR_NUKE:
787                 if (!get_aim_dir(&dir)) return FALSE;
788
789         msg_print(_("放射性廃棄物のブレスを吐いた。", "You breathe toxic waste."));
790         damage = monspell_bluemage_damage((MS_BR_NUKE), plev, DAM_ROLL);
791                 fire_breath(GF_NUKE, dir, damage, (plev > 40 ? 3 : 2));
792                 break;
793         case MS_BALL_CHAOS:
794                 if (!get_aim_dir(&dir)) return FALSE;
795
796         msg_print(_("純ログルスを放った。", "You invoke a raw Logrus."));
797         damage = monspell_bluemage_damage((MS_BALL_CHAOS), plev, DAM_ROLL);
798                 fire_ball(GF_CHAOS, dir, damage, 4);
799                 break;
800         case MS_BR_DISI:
801                 if (!get_aim_dir(&dir)) return FALSE;
802
803         msg_print(_("分解のブレスを吐いた。", "You breathe disintegration."));
804         damage = monspell_bluemage_damage((MS_BR_DISI), plev, DAM_ROLL);
805                 fire_breath(GF_DISINTEGRATE, dir, damage, (plev > 40 ? 3 : 2));
806                 break;
807         case MS_BALL_ACID:
808                 if (!get_aim_dir(&dir)) return FALSE;
809
810         msg_print(_("アシッド・ボールの呪文を唱えた。", "You cast an acid ball."));
811         damage = monspell_bluemage_damage((MS_BALL_ACID), plev, DAM_ROLL);
812                 fire_ball(GF_ACID, dir, damage, 2);
813                 break;
814         case MS_BALL_ELEC:
815         if (!get_aim_dir(&dir)) return FALSE;
816
817         msg_print(_("サンダー・ボールの呪文を唱えた。", "You cast a lightning ball."));
818         damage = monspell_bluemage_damage((MS_BALL_ELEC), plev, DAM_ROLL);
819                 fire_ball(GF_ELEC, dir, damage, 2);
820                 break;
821         case MS_BALL_FIRE:
822                 if (!get_aim_dir(&dir)) return FALSE;
823
824         msg_print(_("ファイア・ボールの呪文を唱えた。", "You cast a fire ball."));
825         damage = monspell_bluemage_damage((MS_BALL_FIRE), plev, DAM_ROLL);
826                 fire_ball(GF_FIRE, dir, damage, 2);
827                 break;
828         case MS_BALL_COLD:
829         if (!get_aim_dir(&dir)) return FALSE;
830
831         msg_print(_("アイス・ボールの呪文を唱えた。", "You cast a frost ball."));
832         damage = monspell_bluemage_damage((MS_BALL_COLD), plev, DAM_ROLL);
833                 fire_ball(GF_COLD, dir, damage, 2);
834                 break;
835         case MS_BALL_POIS:
836                 if (!get_aim_dir(&dir)) return FALSE;
837
838         msg_print(_("悪臭雲の呪文を唱えた。", "You cast a stinking cloud."));
839         damage = monspell_bluemage_damage((MS_BALL_POIS), plev, DAM_ROLL);
840                 fire_ball(GF_POIS, dir, damage, 2);
841                 break;
842         case MS_BALL_NETHER:
843         if (!get_aim_dir(&dir)) return FALSE;
844
845         msg_print(_("地獄球の呪文を唱えた。", "You cast a nether ball."));
846         damage = monspell_bluemage_damage((MS_BALL_NETHER), plev, DAM_ROLL);
847                 fire_ball(GF_NETHER, dir, damage, 2);
848                 break;
849         case MS_BALL_WATER:
850                 if (!get_aim_dir(&dir)) return FALSE;
851
852         msg_print(_("流れるような身振りをした。", "You gesture fluidly."));
853         damage = monspell_bluemage_damage((MS_BALL_WATER), plev, DAM_ROLL);
854                 fire_ball(GF_WATER, dir, damage, 4);
855                 break;
856         case MS_BALL_MANA:
857         if (!get_aim_dir(&dir)) return FALSE;
858
859         msg_print(_("魔力の嵐の呪文を念じた。", "You invoke a mana storm."));
860         damage = monspell_bluemage_damage((MS_BALL_MANA), plev, DAM_ROLL);
861                 fire_ball(GF_MANA, dir, damage, 4);
862                 break;
863         case MS_BALL_DARK:
864                 if (!get_aim_dir(&dir)) return FALSE;
865
866         msg_print(_("暗黒の嵐の呪文を念じた。", "You invoke a darkness storm."));
867         damage = monspell_bluemage_damage((MS_BALL_DARK), plev, DAM_ROLL);
868                 fire_ball(GF_DARK, dir, damage, 4);
869                 break;
870         case MS_DRAIN_MANA:
871                 if (!get_aim_dir(&dir)) return FALSE;
872
873         damage = monspell_bluemage_damage((MS_DRAIN_MANA), plev, DAM_ROLL);
874         fire_ball_hide(GF_DRAIN_MANA, dir, damage, 0);
875                 break;
876         case MS_MIND_BLAST:
877                 if (!get_aim_dir(&dir)) return FALSE;
878
879         damage = monspell_bluemage_damage((MS_MIND_BLAST), plev, DAM_ROLL);
880                 fire_ball_hide(GF_MIND_BLAST, dir, damage, 0);
881                 break;
882         case MS_BRAIN_SMASH:
883         if (!get_aim_dir(&dir)) return FALSE;
884
885         damage = monspell_bluemage_damage((MS_BRAIN_SMASH), plev, DAM_ROLL);
886                 fire_ball_hide(GF_BRAIN_SMASH, dir, damage, 0);
887                 break;
888         case MS_CAUSE_1:
889                 if (!get_aim_dir(&dir)) return FALSE;
890
891         damage = monspell_bluemage_damage((MS_CAUSE_1), plev, DAM_ROLL);
892                 fire_ball_hide(GF_CAUSE_1, dir, damage, 0);
893                 break;
894         case MS_CAUSE_2:
895                 if (!get_aim_dir(&dir)) return FALSE;
896
897         damage = monspell_bluemage_damage((MS_CAUSE_2), plev, DAM_ROLL);
898                 fire_ball_hide(GF_CAUSE_2, dir, damage, 0);
899                 break;
900         case MS_CAUSE_3:
901                 if (!get_aim_dir(&dir)) return FALSE;
902
903         damage = monspell_bluemage_damage((MS_CAUSE_3), plev, DAM_ROLL);
904                 fire_ball_hide(GF_CAUSE_3, dir, damage, 0);
905                 break;
906         case MS_CAUSE_4:
907                 if (!get_aim_dir(&dir)) return FALSE;
908
909         damage = monspell_bluemage_damage((MS_CAUSE_4), plev, DAM_ROLL);
910                 fire_ball_hide(GF_CAUSE_4, dir, damage, 0);
911                 break;
912         case MS_BOLT_ACID:
913                 if (!get_aim_dir(&dir)) return FALSE;
914
915         msg_print(_("アシッド・ボルトの呪文を唱えた。", "You cast an acid bolt."));
916         damage = monspell_bluemage_damage((MS_BOLT_ACID), plev, DAM_ROLL);
917         fire_bolt(GF_ACID, dir, damage);
918                 break;
919         case MS_BOLT_ELEC:
920                 if (!get_aim_dir(&dir)) return FALSE;
921
922         msg_print(_("サンダー・ボルトの呪文を唱えた。", "You cast a lightning bolt."));
923         damage = monspell_bluemage_damage((MS_BOLT_ELEC), plev, DAM_ROLL);
924                 fire_bolt(GF_ELEC, dir, damage);
925                 break;
926         case MS_BOLT_FIRE:
927                 if (!get_aim_dir(&dir)) return FALSE;
928
929         msg_print(_("ファイア・ボルトの呪文を唱えた。", "You cast a fire bolt."));
930         damage = monspell_bluemage_damage((MS_BOLT_FIRE), plev, DAM_ROLL);
931                 fire_bolt(GF_FIRE, dir, damage);
932                 break;
933         case MS_BOLT_COLD:
934                 if (!get_aim_dir(&dir)) return FALSE;
935
936         msg_print(_("アイス・ボルトの呪文を唱えた。", "You cast a frost bolt."));
937         damage = monspell_bluemage_damage((MS_BOLT_COLD), plev, DAM_ROLL);
938                 fire_bolt(GF_COLD, dir, damage);
939                 break;
940         case MS_STARBURST:
941                 if (!get_aim_dir(&dir)) return FALSE;
942
943         msg_print(_("スターバーストの呪文を念じた。", "You invoke a starburst."));
944         damage = monspell_bluemage_damage((MS_STARBURST), plev, DAM_ROLL);
945                 fire_ball(GF_LITE, dir, damage, 4);
946                 break;
947         case MS_BOLT_NETHER:
948                 if (!get_aim_dir(&dir)) return FALSE;
949
950         msg_print(_("地獄の矢の呪文を唱えた。", "You cast a nether bolt."));
951         damage = monspell_bluemage_damage((MS_BOLT_NETHER), plev, DAM_ROLL);
952                 fire_bolt(GF_NETHER, dir, damage);
953                 break;
954         case MS_BOLT_WATER:
955                 if (!get_aim_dir(&dir)) return FALSE;
956
957         msg_print(_("ウォーター・ボルトの呪文を唱えた。", "You cast a water bolt."));
958         damage = monspell_bluemage_damage((MS_BOLT_WATER), plev, DAM_ROLL);
959                 fire_bolt(GF_WATER, dir, damage);
960                 break;
961         case MS_BOLT_MANA:
962                 if (!get_aim_dir(&dir)) return FALSE;
963
964         msg_print(_("魔力の矢の呪文を唱えた。", "You cast a mana bolt."));
965         damage = monspell_bluemage_damage((MS_BOLT_MANA), plev, DAM_ROLL);
966                 fire_bolt(GF_MANA, dir, damage);
967                 break;
968         case MS_BOLT_PLASMA:
969                 if (!get_aim_dir(&dir)) return FALSE;
970
971         msg_print(_("プラズマ・ボルトの呪文を唱えた。", "You cast a plasma bolt."));
972         damage = monspell_bluemage_damage((MS_BOLT_PLASMA), plev, DAM_ROLL);
973                 fire_bolt(GF_PLASMA, dir, damage);
974                 break;
975         case MS_BOLT_ICE:
976                 if (!get_aim_dir(&dir)) return FALSE;
977
978         msg_print(_("極寒の矢の呪文を唱えた。", "You cast a ice bolt."));
979         damage = monspell_bluemage_damage((MS_BOLT_ICE), plev, DAM_ROLL);
980                 fire_bolt(GF_ICE, dir, damage);
981                 break;
982         case MS_MAGIC_MISSILE:
983                 if (!get_aim_dir(&dir)) return FALSE;
984
985         msg_print(_("マジック・ミサイルの呪文を唱えた。", "You cast a magic missile."));
986         damage = monspell_bluemage_damage((MS_MAGIC_MISSILE), plev, DAM_ROLL);
987                 fire_bolt(GF_MISSILE, dir, damage);
988                 break;
989         case MS_SCARE:
990                 if (!get_aim_dir(&dir)) return FALSE;
991
992         msg_print(_("恐ろしげな幻覚を作り出した。", "You cast a fearful illusion."));
993                 fear_monster(dir, plev+10);
994                 break;
995         case MS_BLIND:
996                 if (!get_aim_dir(&dir)) return FALSE;
997                 confuse_monster(dir, plev * 2);
998                 break;
999         case MS_CONF:
1000                 if (!get_aim_dir(&dir)) return FALSE;
1001
1002         msg_print(_("誘惑的な幻覚をつくり出した。", "You cast a mesmerizing illusion."));
1003                 confuse_monster(dir, plev * 2);
1004                 break;
1005         case MS_SLOW:
1006                 if (!get_aim_dir(&dir)) return FALSE;
1007                 slow_monster(dir, plev);
1008                 break;
1009         case MS_SLEEP:
1010                 if (!get_aim_dir(&dir)) return FALSE;
1011                 sleep_monster(dir, plev);
1012                 break;
1013         case MS_SPEED:
1014                 (void)set_fast(randint1(20 + plev) + plev, FALSE);
1015                 break;
1016         case MS_HAND_DOOM:
1017         {
1018                 if (!get_aim_dir(&dir)) return FALSE;
1019
1020         msg_print(_("<破滅の手>を放った!", "You invoke the Hand of Doom!"));
1021                 fire_ball_hide(GF_HAND_DOOM, dir, plev * 3, 0);
1022                 break;
1023         }
1024         case MS_HEAL:
1025         msg_print(_("自分の傷に念を集中した。", "You concentrate on your wounds!"));
1026                 (void)hp_player(plev*4);
1027                 (void)set_stun(0);
1028                 (void)set_cut(0);
1029                 break;
1030         case MS_INVULNER:
1031         msg_print(_("無傷の球の呪文を唱えた。", "You cast a Globe of Invulnerability."));
1032                 (void)set_invuln(randint1(4) + 4, FALSE);
1033                 break;
1034         case MS_BLINK:
1035                 teleport_player(10, 0L);
1036                 break;
1037         case MS_TELEPORT:
1038                 teleport_player(plev * 5, 0L);
1039                 break;
1040         case MS_WORLD:
1041                 (void)time_walk(p_ptr);
1042                 break;
1043         case MS_SPECIAL:
1044                 break;
1045         case MS_TELE_TO:
1046         {
1047                 monster_type *m_ptr;
1048                 monster_race *r_ptr;
1049                 GAME_TEXT m_name[MAX_NLEN];
1050
1051                 if (!target_set(TARGET_KILL)) return FALSE;
1052                 if (!current_floor_ptr->grid_array[target_row][target_col].m_idx) break;
1053                 if (!player_has_los_bold(target_row, target_col)) break;
1054                 if (!projectable(p_ptr->y, p_ptr->x, target_row, target_col)) break;
1055                 m_ptr = &current_floor_ptr->m_list[current_floor_ptr->grid_array[target_row][target_col].m_idx];
1056                 r_ptr = &r_info[m_ptr->r_idx];
1057                 monster_desc(m_name, m_ptr, 0);
1058                 if (r_ptr->flagsr & RFR_RES_TELE)
1059                 {
1060                         if ((r_ptr->flags1 & (RF1_UNIQUE)) || (r_ptr->flagsr & RFR_RES_ALL))
1061                         {
1062                                 if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= RFR_RES_TELE;
1063                 msg_format(_("%sには効果がなかった!", "%s is unaffected!"), m_name);
1064                                 break;
1065                         }
1066                         else if (r_ptr->level > randint1(100))
1067                         {
1068                                 if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= RFR_RES_TELE;
1069                 msg_format(_("%sには耐性がある!", "%s resists!"), m_name);
1070                                 break;
1071                         }
1072                 }
1073         msg_format(_("%sを引き戻した。", "You command %s to return."), m_name);
1074                 teleport_monster_to(current_floor_ptr->grid_array[target_row][target_col].m_idx, p_ptr->y, p_ptr->x, 100, TELEPORT_PASSIVE);
1075                 break;
1076         }
1077         case MS_TELE_AWAY:
1078                 if (!get_aim_dir(&dir)) return FALSE;
1079
1080                 (void)fire_beam(GF_AWAY_ALL, dir, 100);
1081                 break;
1082
1083         case MS_TELE_LEVEL:
1084                 return teleport_level_other(p_ptr);
1085                 break;
1086
1087         case MS_PSY_SPEAR:
1088                 if (!get_aim_dir(&dir)) return FALSE;
1089
1090         msg_print(_("光の剣を放った。", "You throw a psycho-spear."));
1091         damage = monspell_bluemage_damage((MS_PSY_SPEAR), plev, DAM_ROLL);
1092                 (void)fire_beam(GF_PSY_SPEAR, dir, damage);
1093                 break;
1094         case MS_DARKNESS:
1095
1096         msg_print(_("暗闇の中で手を振った。", "You gesture in shadow."));
1097                 (void)unlite_area(10, 3);
1098                 break;
1099         case MS_MAKE_TRAP:
1100                 if (!target_set(TARGET_KILL)) return FALSE;
1101
1102         msg_print(_("呪文を唱えて邪悪に微笑んだ。", "You cast a spell and cackle evilly."));
1103                 trap_creation(target_row, target_col);
1104                 break;
1105         case MS_FORGET:
1106         msg_print(_("しかし何も起きなかった。", "Nothing happen."));
1107                 break;
1108     case MS_RAISE_DEAD:
1109         msg_print(_("死者復活の呪文を唱えた。", "You cast a animate dead."));
1110                 (void)animate_dead(0, p_ptr->y, p_ptr->x);
1111                 break;
1112         case MS_S_KIN:
1113         {
1114                 int k;
1115
1116         msg_print(_("援軍を召喚した。", "You summon minions."));
1117                 for (k = 0;k < 1; k++)
1118                 {
1119                         if (summon_kin_player(summon_lev, p_ptr->y, p_ptr->x, (pet ? PM_FORCE_PET : 0L)))
1120                         {
1121                                 if (!pet) msg_print(_("召喚された仲間は怒っている!", "Summoned fellows are angry!"));
1122                         }
1123                         else
1124                         {
1125                                 no_trump = TRUE;
1126                         }
1127                 }
1128                 break;
1129         }
1130         case MS_S_CYBER:
1131         {
1132                 int k;
1133
1134         msg_print(_("サイバーデーモンを召喚した!", "You summon a Cyberdemon!"));
1135                 for (k = 0 ;k < 1 ; k++)
1136                         if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, summon_lev, SUMMON_CYBER, p_mode, '\0'))
1137                         {
1138                 if (!pet)
1139                     msg_print(_("召喚されたサイバーデーモンは怒っている!", "The summoned Cyberdemon are angry!"));
1140                         }
1141                         else
1142                         {
1143                                 no_trump = TRUE;
1144                         }
1145                 break;
1146         }
1147         case MS_S_MONSTER:
1148         {
1149                 int k;
1150         msg_print(_("仲間を召喚した。", "You summon help."));
1151                 for (k = 0;k < 1; k++)
1152                         if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, summon_lev, 0, p_mode, '\0'))
1153                         {
1154                 if (!pet)
1155                     msg_print(_("召喚されたモンスターは怒っている!", "The summoned monster is angry!"));
1156                         }
1157                         else
1158                         {
1159                                 no_trump = TRUE;
1160                         }
1161                 break;
1162         }
1163         case MS_S_MONSTERS:
1164         {
1165                 int k;
1166         msg_print(_("モンスターを召喚した!", "You summon monsters!"));
1167                 for (k = 0;k < plev / 15 + 2; k++)
1168                         if(summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, summon_lev, 0, (p_mode | u_mode), '\0'))
1169                         {
1170                 if (!pet)
1171                     msg_print(_("召喚されたモンスターは怒っている!", "The summoned monsters are angry!"));
1172                         }
1173                         else
1174                         {
1175                                 no_trump = TRUE;
1176                         }
1177                 break;
1178         }
1179         case MS_S_ANT:
1180         {
1181                 int k;
1182         msg_print(_("アリを召喚した。", "You summon ants."));
1183                 for (k = 0; k < 1; k++)
1184                         if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, summon_lev, SUMMON_ANT, (PM_ALLOW_GROUP | p_mode), '\0'))
1185                         {
1186                 if (!pet)
1187                     msg_print(_("召喚されたアリは怒っている!", "The summoned ants are angry!"));
1188                         }
1189                         else
1190                         {
1191                                 no_trump = TRUE;
1192                         }
1193                 break;
1194         }
1195         case MS_S_SPIDER:
1196         {
1197                 int k;
1198         msg_print(_("蜘蛛を召喚した。", "You summon spiders."));
1199                 for (k = 0;k < 1; k++)
1200                         if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, summon_lev, SUMMON_SPIDER, (PM_ALLOW_GROUP | p_mode), '\0'))
1201                         {
1202                 if (!pet)
1203                     msg_print(_("召喚された蜘蛛は怒っている!", "Summoned spiders are angry!"));
1204                         }
1205                         else
1206                         {
1207                                 no_trump = TRUE;
1208                         }
1209                 break;
1210         }
1211         case MS_S_HOUND:
1212         {
1213                 int k;
1214         msg_print(_("ハウンドを召喚した。", "You summon hounds."));
1215                 for (k = 0;k < 1; k++)
1216                         if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, summon_lev, SUMMON_HOUND, (PM_ALLOW_GROUP | p_mode), '\0'))
1217                         {
1218                 if (!pet)
1219                     msg_print(_("召喚されたハウンドは怒っている!", "Summoned hounds are angry!"));
1220                         }
1221                         else
1222                         {
1223                                 no_trump = TRUE;
1224                         }
1225                 break;
1226         }
1227         case MS_S_HYDRA:
1228         {
1229                 int k;
1230         msg_print(_("ヒドラを召喚した。", "You summon a hydras."));
1231                 for (k = 0;k < 1; k++)
1232                         if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, summon_lev, SUMMON_HYDRA, (g_mode | p_mode), '\0'))
1233                         {
1234                 if (!pet)
1235                     msg_print(_("召喚されたヒドラは怒っている!", "Summoned hydras are angry!"));
1236                         }
1237                         else
1238                         {
1239                                 no_trump = TRUE;
1240                         }
1241                 break;
1242         }
1243         case MS_S_ANGEL:
1244         {
1245                 int k;
1246         msg_print(_("天使を召喚した!", "You summon an angel!"));
1247                 for (k = 0;k < 1; k++)
1248                         if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, summon_lev, SUMMON_ANGEL, (g_mode | p_mode), '\0'))
1249                         {
1250                 if (!pet)
1251                     msg_print(_("召喚された天使は怒っている!", "Summoned angels are angry!"));
1252                         }
1253                         else
1254                         {
1255                                 no_trump = TRUE;
1256                         }
1257                 break;
1258         }
1259         case MS_S_DEMON:
1260         {
1261                 int k;
1262         msg_print(_("混沌の宮廷から悪魔を召喚した!", "You summon a demon from the Courts of Chaos!"));
1263                 for (k = 0;k < 1; k++)
1264                         if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, summon_lev, SUMMON_DEMON, (g_mode | p_mode), '\0'))
1265                         {
1266                 if (!pet)
1267                     msg_print(_("召喚されたデーモンは怒っている!", "Summoned demons are angry!"));
1268                         }
1269                         else
1270                         {
1271                                 no_trump = TRUE;
1272                         }
1273                 break;
1274         }
1275         case MS_S_UNDEAD:
1276         {
1277                 int k;
1278         msg_print(_("アンデッドの強敵を召喚した!", "You summon an undead adversary!"));
1279                 for (k = 0;k < 1; k++)
1280                         if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, summon_lev, SUMMON_UNDEAD, (g_mode | p_mode), '\0'))
1281                         {
1282                 if (!pet)
1283                     msg_print(_("召喚されたアンデッドは怒っている!", "Summoned undeads are angry!"));
1284                         }
1285                         else
1286                         {
1287                                 no_trump = TRUE;
1288                         }
1289                 break;
1290         }
1291         case MS_S_DRAGON:
1292         {
1293                 int k;
1294         msg_print(_("ドラゴンを召喚した!", "You summon a dragon!"));
1295                 for (k = 0;k < 1; k++)
1296                         if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, summon_lev, SUMMON_DRAGON, (g_mode | p_mode), '\0'))
1297                         {
1298                 if (!pet)
1299                     msg_print(_("召喚されたドラゴンは怒っている!", "Summoned dragons are angry!"));
1300                         }
1301                         else
1302                         {
1303                                 no_trump = TRUE;
1304                         }
1305                 break;
1306         }
1307         case MS_S_HI_UNDEAD:
1308         {
1309                 int k;
1310         msg_print(_("強力なアンデッドを召喚した!", "You summon a greater undead!"));
1311                 for (k = 0;k < 1; k++)
1312                         if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, summon_lev, SUMMON_HI_UNDEAD, (g_mode | p_mode | u_mode), '\0'))
1313                         {
1314                 if (!pet)
1315                     msg_print(_("召喚された上級アンデッドは怒っている!", "Summoned greater undeads are angry!"));
1316                         }
1317                         else
1318                         {
1319                                 no_trump = TRUE;
1320                         }
1321                 break;
1322         }
1323         case MS_S_HI_DRAGON:
1324         {
1325                 int k;
1326         msg_print(_("古代ドラゴンを召喚した!", "You summon an ancient dragon!"));
1327                 for (k = 0;k < 1; k++)
1328                         if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, summon_lev, SUMMON_HI_DRAGON, (g_mode | p_mode | u_mode), '\0'))
1329                         {
1330                 if (!pet)
1331                     msg_print(_("召喚された古代ドラゴンは怒っている!", "Summoned ancient dragons are angry!"));
1332                         }
1333                         else
1334                         {
1335                                 no_trump = TRUE;
1336                         }
1337                 break;
1338         }
1339         case MS_S_AMBERITE:
1340         {
1341                 int k;
1342         msg_print(_("アンバーの王族を召喚した!", "You summon a Lord of Amber!"));
1343                 for (k = 0;k < 1; k++)
1344                         if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, summon_lev, SUMMON_AMBERITES, (g_mode | p_mode | u_mode), '\0'))
1345                         {
1346                 if (!pet)
1347                     msg_print(_("召喚されたアンバーの王族は怒っている!", "Summoned Lords of Amber are angry!"));
1348                         }
1349                         else
1350                         {
1351                                 no_trump = TRUE;
1352                         }
1353                 break;
1354         }
1355         case MS_S_UNIQUE:
1356         {
1357                 int k, count = 0;
1358                 msg_print(_("特別な強敵を召喚した!", "You summon a special opponent!"));
1359                 for (k = 0;k < 1; k++)
1360                         if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, summon_lev, SUMMON_UNIQUE, (g_mode | p_mode | PM_ALLOW_UNIQUE), '\0'))
1361                         {
1362                                 count++;
1363                                 if (!pet)
1364                                         msg_print(_("召喚されたユニーク・モンスターは怒っている!", "Summoned special opponents are angry!"));
1365                         }
1366                 for (k = count;k < 1; k++)
1367                         if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, summon_lev, SUMMON_HI_UNDEAD, (g_mode | p_mode | PM_ALLOW_UNIQUE), '\0'))
1368                         {
1369                                 count++;
1370                                 if (!pet)
1371                                         msg_print(_("召喚された上級アンデッドは怒っている!", "Summoned greater undeads are angry!"));
1372                         }
1373                 if (!count)
1374                 {
1375                         no_trump = TRUE;
1376                 }
1377                 break;
1378         }
1379         default:
1380                 msg_print("hoge?");
1381         }
1382         if (no_trump)
1383     {
1384         msg_print(_("何も現れなかった。", "No one have appeared."));
1385         }
1386
1387         return TRUE;
1388 }
1389
1390 /*!
1391  * @brief 青魔法コマンドのメインルーチン /
1392  * do_cmd_cast calls this function if the player's class is 'Blue-Mage'.
1393  * @return 処理を実行したらTRUE、キャンセルした場合FALSEを返す。
1394  */
1395 bool do_cmd_cast_learned(void)
1396 {
1397         SPELL_IDX n = 0;
1398         PERCENTAGE chance;
1399         PERCENTAGE minfail = 0;
1400         PLAYER_LEVEL plev = p_ptr->lev;
1401         monster_power spell;
1402         bool cast;
1403         MANA_POINT need_mana;
1404
1405         if (cmd_limit_confused(p_ptr)) return FALSE;
1406
1407         if (!get_learned_power(&n)) return FALSE;
1408
1409         spell = monster_powers[n];
1410
1411         need_mana = mod_need_mana(spell.smana, 0, REALM_NONE);
1412
1413         /* Verify "dangerous" spells */
1414         if (need_mana > p_ptr->csp)
1415         {
1416                 /* Warning */
1417                 msg_print(_("MPが足りません。", "You do not have enough mana to use this power."));
1418
1419                 if (!over_exert) return FALSE;
1420
1421                 /* Verify */
1422                 if (!get_check(_("それでも挑戦しますか? ", "Attempt it anyway? "))) return FALSE;
1423         }
1424
1425         /* Spell failure chance */
1426         chance = spell.fail;
1427
1428         /* Reduce failure rate by "effective" level adjustment */
1429         if (plev > spell.level) chance -= 3 * (plev - spell.level);
1430         else chance += (spell.level - plev);
1431
1432         /* Reduce failure rate by INT/WIS adjustment */
1433         chance -= 3 * (adj_mag_stat[p_ptr->stat_ind[A_INT]] - 1);
1434
1435         chance = mod_spell_chance_1(chance);
1436
1437         /* Not enough mana to cast */
1438         if (need_mana > p_ptr->csp)
1439         {
1440                 chance += 5 * (need_mana - p_ptr->csp);
1441         }
1442
1443         /* Extract the minimum failure rate */
1444         minfail = adj_mag_fail[p_ptr->stat_ind[A_INT]];
1445
1446         /* Minimum failure rate */
1447         if (chance < minfail) chance = minfail;
1448
1449         /* Stunning makes spells harder */
1450         if (p_ptr->stun > 50) chance += 25;
1451         else if (p_ptr->stun) chance += 15;
1452
1453         /* Always a 5 percent chance of working */
1454         if (chance > 95) chance = 95;
1455
1456         chance = mod_spell_chance_2(chance);
1457
1458         /* Failed spell */
1459         if (randint0(100) < chance)
1460         {
1461                 if (flush_failure) flush();
1462                 msg_print(_("魔法をうまく唱えられなかった。", "You failed to concentrate hard enough!"));
1463
1464                 sound(SOUND_FAIL);
1465
1466                 if (n >= MS_S_KIN)
1467                         /* Cast the spell */
1468                         cast = cast_learned_spell(n, FALSE);
1469         }
1470         else
1471         {
1472                 sound(SOUND_ZAP);
1473
1474                 /* Cast the spell */
1475                 cast = cast_learned_spell(n, TRUE);
1476
1477                 if (!cast) return FALSE;
1478         }
1479
1480         /* Sufficient mana */
1481         if (need_mana <= p_ptr->csp)
1482         {
1483                 /* Use some mana */
1484                 p_ptr->csp -= need_mana;
1485         }
1486         else
1487         {
1488                 int oops = need_mana;
1489
1490                 /* No mana left */
1491                 p_ptr->csp = 0;
1492                 p_ptr->csp_frac = 0;
1493
1494                 msg_print(_("精神を集中しすぎて気を失ってしまった!", "You faint from the effort!"));
1495
1496                 /* Hack -- Bypass free action */
1497                 (void)set_paralyzed(p_ptr->paralyzed + randint1(5 * oops + 1));
1498
1499                 chg_virtue(V_KNOWLEDGE, -10);
1500
1501                 /* Damage CON (possibly permanently) */
1502                 if (randint0(100) < 50)
1503                 {
1504                         bool perm = (randint0(100) < 25);
1505
1506                         msg_print(_("体を悪くしてしまった!", "You have damaged your health!"));
1507
1508                         /* Reduce constitution */
1509                         (void)dec_stat(A_CON, 15 + randint1(10), perm);
1510                 }
1511         }
1512
1513         take_turn(p_ptr, 100);
1514
1515         p_ptr->redraw |= (PR_MANA);
1516         p_ptr->window |= (PW_PLAYER | PW_SPELL);
1517
1518         return TRUE;
1519 }
1520
1521 /*!
1522  * @brief 青魔法のラーニング判定と成功した場合のラーニング処理
1523  * @param monspell ラーニングを試みるモンスター攻撃のID
1524  * @return なし
1525  */
1526 void learn_spell(int monspell)
1527 {
1528         if (p_ptr->action != ACTION_LEARN) return;
1529         if (monspell < 0) return; /* Paranoia */
1530         if (p_ptr->magic_num2[monspell]) return;
1531         if (p_ptr->confused || p_ptr->blind || p_ptr->image || p_ptr->stun || p_ptr->paralyzed) return;
1532         if (randint1(p_ptr->lev + 70) > monster_powers[monspell].level + 40)
1533         {
1534                 p_ptr->magic_num2[monspell] = 1;
1535                 msg_format(_("%sを学習した!", "You have learned %s!"), monster_powers[monspell].name);
1536                 gain_exp(monster_powers[monspell].level * monster_powers[monspell].smana);
1537
1538                 sound(SOUND_STUDY);
1539
1540                 new_mane = TRUE;
1541                 p_ptr->redraw |= (PR_STATE);
1542         }
1543 }
1544
1545
1546 /*!
1547  * @brief モンスター特殊能力のフラグ配列から特定条件の魔法だけを抜き出す処理
1548  * Extract monster spells mask for the given mode
1549  * @param f4 モンスター特殊能力の4番目のフラグ配列
1550  * @param f5 モンスター特殊能力の5番目のフラグ配列
1551  * @param f6 モンスター特殊能力の6番目のフラグ配列
1552  * @param mode 抜き出したい条件
1553  * @return なし
1554  */
1555 /*
1556  */
1557 void set_rf_masks(BIT_FLAGS *f4, BIT_FLAGS *f5, BIT_FLAGS *f6, BIT_FLAGS mode)
1558 {
1559         switch (mode)
1560         {
1561                 case MONSPELL_TYPE_BOLT:
1562                         *f4 = ((RF4_BOLT_MASK | RF4_BEAM_MASK) & ~(RF4_ROCKET));
1563                         *f5 = RF5_BOLT_MASK | RF5_BEAM_MASK;
1564                         *f6 = RF6_BOLT_MASK | RF6_BEAM_MASK;
1565                         break;
1566
1567                 case MONSPELL_TYPE_BALL:
1568                         *f4 = (RF4_BALL_MASK & ~(RF4_BREATH_MASK));
1569                         *f5 = (RF5_BALL_MASK & ~(RF5_BREATH_MASK));
1570                         *f6 = (RF6_BALL_MASK & ~(RF6_BREATH_MASK));
1571                         break;
1572
1573                 case MONSPELL_TYPE_BREATH:
1574                         *f4 = RF4_BREATH_MASK;
1575                         *f5 = RF5_BREATH_MASK;
1576                         *f6 = RF6_BREATH_MASK;
1577                         break;
1578
1579                 case MONSPELL_TYPE_SUMMON:
1580                         *f4 = RF4_SUMMON_MASK;
1581                         *f5 = RF5_SUMMON_MASK;
1582                         *f6 = RF6_SUMMON_MASK;
1583                         break;
1584
1585                 case MONSPELL_TYPE_OTHER:
1586                         *f4 = RF4_ATTACK_MASK & ~(RF4_BOLT_MASK | RF4_BEAM_MASK | RF4_BALL_MASK | RF4_INDIRECT_MASK);
1587                         *f5 = RF5_ATTACK_MASK & ~(RF5_BOLT_MASK | RF5_BEAM_MASK | RF5_BALL_MASK | RF5_INDIRECT_MASK);
1588                         *f6 = RF6_ATTACK_MASK & ~(RF6_BOLT_MASK | RF6_BEAM_MASK | RF6_BALL_MASK | RF6_INDIRECT_MASK);
1589                         break;
1590         }
1591
1592         return;
1593 }