OSDN Git Service

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