OSDN Git Service

青魔術師の魔法の英語名を修正。
[hengband/hengband.git] / src / mspells3.c
1 /* File: mspells3.c */
2
3 /* Purpose: Mane code */
4
5 /*
6  * Copyright (c) 1989 James E. Wilson, Robert A. Koeneke
7  *
8  * This software may be copied and distributed for educational, research, and
9  * not for profit purposes provided that this copyright and statement are
10  * included in all such copies.
11  */
12
13 #include "angband.h"
14
15 #define pseudo_plev() (((p_ptr->lev + 40) * (p_ptr->lev + 40) - 1550) / 130)
16
17 void learned_info(char *p, int power)
18 {
19         int plev = pseudo_plev();
20         int hp = p_ptr->chp;
21
22 #ifdef JP
23         cptr s_dam = "»½ý:";
24         cptr s_dur = "´ü´Ö:";
25         cptr s_range = "ÈÏ°Ï:";
26         cptr s_heal = "²óÉü:";
27 #else
28         cptr s_dam = "dam ";
29         cptr s_dur = "dur ";
30         cptr s_range = "range ";
31         cptr s_heal = "heal ";
32 #endif
33
34         strcpy(p, "");
35
36         switch (power)
37         {
38                 case MS_SHRIEK:
39                 case MS_XXX1:
40                 case MS_SCARE:
41                 case MS_BLIND:
42                 case MS_CONF:
43                 case MS_SLOW:
44                 case MS_SLEEP:
45                 case MS_HAND_DOOM:
46                 case MS_WORLD:
47                 case MS_SPECIAL:
48                 case MS_TELE_TO:
49                 case MS_TELE_AWAY:
50                 case MS_TELE_LEVEL:
51                 case MS_DARKNESS:
52                 case MS_MAKE_TRAP:
53                 case MS_FORGET:
54                 case MS_S_KIN:
55                 case MS_S_CYBER:
56                 case MS_S_MONSTER:
57                 case MS_S_MONSTERS:
58                 case MS_S_ANT:
59                 case MS_S_SPIDER:
60                 case MS_S_HOUND:
61                 case MS_S_HYDRA:
62                 case MS_S_ANGEL:
63                 case MS_S_DEMON:
64                 case MS_S_UNDEAD:
65                 case MS_S_DRAGON:
66                 case MS_S_HI_UNDEAD:
67                 case MS_S_HI_DRAGON:
68                 case MS_S_AMBERITE:
69                 case MS_S_UNIQUE:
70                         break;
71                 case MS_BALL_MANA:
72                 case MS_BALL_DARK:
73                 case MS_STARBURST:
74                         sprintf(p, " %s%d+10d10", s_dam, plev * 8 + 50);
75                         break;
76                 case MS_DISPEL:
77                         break;
78                 case MS_ROCKET:
79                         sprintf(p, " %s%d", s_dam, hp/4);
80                         break;
81                 case MS_ARROW_1:
82                         sprintf(p, " %s2d5", s_dam);
83                         break;
84                 case MS_ARROW_2:
85                         sprintf(p, " %s3d6", s_dam);
86                         break;
87                 case MS_ARROW_3:
88                         sprintf(p, " %s5d6", s_dam);
89                         break;
90                 case MS_ARROW_4:
91                         sprintf(p, " %s7d6", s_dam);
92                         break;
93                 case MS_BR_ACID:
94                 case MS_BR_ELEC:
95                 case MS_BR_FIRE:
96                 case MS_BR_COLD:
97                 case MS_BR_POIS:
98                 case MS_BR_NUKE:
99                         sprintf(p, " %s%d", s_dam, hp/3);
100                         break;
101                 case MS_BR_NEXUS:
102                         sprintf(p, " %s%d", s_dam, MIN(hp/3, 250));
103                         break;
104                 case MS_BR_TIME:
105                         sprintf(p, " %s%d", s_dam, MIN(hp/3, 150));
106                         break;
107                 case MS_BR_GRAVITY:
108                         sprintf(p, " %s%d", s_dam, MIN(hp/3, 200));
109                         break;
110                 case MS_BR_MANA:
111                         sprintf(p, " %s%d", s_dam, MIN(hp/3, 250));
112                         break;
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                         sprintf(p, " %s%d", s_dam, hp/6);
123                         break;
124                 case MS_BR_INERTIA:
125                 case MS_BR_FORCE:
126                         sprintf(p, " %s%d", s_dam, MIN(hp/6, 200));
127                         break;
128                 case MS_BR_DISI:
129                         sprintf(p, " %s%d", s_dam, MIN(hp/6, 150));
130                         break;
131                 case MS_BALL_NUKE:
132                         sprintf(p, " %s%d+10d6", s_dam, plev * 2);
133                         break;
134                 case MS_BALL_CHAOS:
135                         sprintf(p, " %s%d+10d10", s_dam, plev * 4);
136                         break;
137                 case MS_BALL_ACID:
138                         sprintf(p, " %s15+d%d", s_dam, plev * 6);
139                         break;
140                 case MS_BALL_ELEC:
141                         sprintf(p, " %s8+d%d", s_dam, plev * 3);
142                         break;
143                 case MS_BALL_FIRE:
144                         sprintf(p, " %s10+d%d", s_dam, plev * 7);
145                         break;
146                 case MS_BALL_COLD:
147                         sprintf(p, " %s10+d%d", s_dam, plev * 3);
148                         break;
149                 case MS_BALL_POIS:
150                         sprintf(p, " %s12d2", s_dam);
151                         break;
152                 case MS_BALL_NETHER:
153                         sprintf(p, " %s%d+10d10", s_dam, plev * 2 + 50);
154                         break;
155                 case MS_BALL_WATER:
156                         sprintf(p, " %s50+d%d", s_dam, plev * 4);
157                         break;
158                 case MS_DRAIN_MANA:
159                         sprintf(p, " %sd%d+%d", s_heal, plev, plev);
160                         break;
161                 case MS_MIND_BLAST:
162                         sprintf(p, " %s8d8", s_dam);
163                         break;
164                 case MS_BRAIN_SMASH:
165                         sprintf(p, " %s12d15", s_dam);
166                         break;
167                 case MS_CAUSE_1:
168                         sprintf(p, " %s3d8", s_dam);
169                         break;
170                 case MS_CAUSE_2:
171                         sprintf(p, " %s8d8", s_dam);
172                         break;
173                 case MS_CAUSE_3:
174                         sprintf(p, " %s10d15", s_dam);
175                         break;
176                 case MS_CAUSE_4:
177                         sprintf(p, " %s15d15", s_dam);
178                         break;
179                 case MS_BOLT_ACID:
180                         sprintf(p, " %s%d+7d8", s_dam, plev * 2 / 3);
181                         break;
182                 case MS_BOLT_ELEC:
183                         sprintf(p, " %s%d+4d8", s_dam, plev * 2 / 3);
184                         break;
185                 case MS_BOLT_FIRE:
186                         sprintf(p, " %s%d+9d8", s_dam, plev * 2 / 3);
187                         break;
188                 case MS_BOLT_COLD:
189                         sprintf(p, " %s%d+6d8", s_dam, plev * 2 / 3);
190                         break;
191                 case MS_BOLT_NETHER:
192                         sprintf(p, " %s%d+5d5", s_dam, 30 + plev * 8 / 3);
193                         break;
194                 case MS_BOLT_WATER:
195                         sprintf(p, " %s%d+10d10", s_dam, plev * 2);
196                         break;
197                 case MS_BOLT_MANA:
198                         sprintf(p, " %s50+d%d", s_dam, plev * 7);
199                         break;
200                 case MS_BOLT_PLASMA:
201                         sprintf(p, " %s%d+8d7", s_dam, plev * 2 + 10);
202                         break;
203                 case MS_BOLT_ICE:
204                         sprintf(p, " %s%d+6d6", s_dam, plev * 2);
205                         break;
206                 case MS_MAGIC_MISSILE:
207                         sprintf(p, " %s%d+2d6", s_dam, plev * 2 / 3);
208                         break;
209                 case MS_SPEED:
210                         sprintf(p, " %sd%d+%d", s_dur, 20+plev, plev);
211                         break;
212                 case MS_HEAL:
213                         sprintf(p, " %s%d", s_heal, plev*4);
214                         break;
215                 case MS_INVULNER:
216                         sprintf(p, " %sd7+7", s_dur);
217                         break;
218                 case MS_BLINK:
219                         sprintf(p, " %s10", s_range);
220                         break;
221                 case MS_TELEPORT:
222                         sprintf(p, " %s%d", s_range, plev * 5);
223                         break;
224                 case MS_PSY_SPEAR:
225                         sprintf(p, " %s100+d%d", s_dam, plev * 3);
226                         break;
227                 case MS_RAISE_DEAD:
228                         sprintf(p, " %s5", s_range);
229                         break;
230                 default:
231                         break;
232         }
233 }
234
235
236 /*
237  * Allow user to choose a imitation.
238  *
239  * If a valid spell is chosen, saves it in '*sn' and returns TRUE
240  * If the user hits escape, returns FALSE, and set '*sn' to -1
241  * If there are no legal choices, returns FALSE, and sets '*sn' to -2
242  *
243  * The "prompt" should be "cast", "recite", or "study"
244  * The "known" should be TRUE for cast/pray, FALSE for study
245  *
246  * nb: This function has a (trivial) display bug which will be obvious
247  * when you run it. It's probably easy to fix but I haven't tried,
248  * sorry.
249  */
250 static int get_learned_power(int *sn)
251 {
252         int             i = 0;
253         int             num = 0;
254         int             y = 1;
255         int             x = 18;
256         int             minfail = 0;
257         int             plev = p_ptr->lev;
258         int             chance = 0;
259         int             ask = TRUE, mode = 0;
260         int             spellnum[MAX_MONSPELLS];
261         char            ch;
262         char            choice;
263         char            out_val[160];
264         char            comment[80];
265         s32b            f4 = 0, f5 = 0, f6 = 0;
266 #ifdef JP
267 cptr            p = "ËâË¡";
268 #else
269         cptr            p = "magic";
270 #endif
271
272         monster_power   spell;
273         bool            flag, redraw;
274         int menu_line = (use_menu ? 1 : 0);
275
276         /* Assume cancelled */
277         *sn = (-1);
278
279         /* Nothing chosen yet */
280         flag = FALSE;
281
282         /* No redraw yet */
283         redraw = FALSE;
284
285 #ifdef ALLOW_REPEAT /* TNB */
286
287         /* Get the spell, if available */
288         if (repeat_pull(sn))
289         {
290                 /* Success */
291                 return (TRUE);
292         }
293
294 #endif /* ALLOW_REPEAT -- TNB */
295
296         if (use_menu)
297         {
298                 screen_save();
299
300                 while(!mode)
301                 {
302 #ifdef JP
303                         prt(format(" %s ¥Ü¥ë¥È", (menu_line == 1) ? "¡Õ" : "  "), 2, 14);
304                         prt(format(" %s ¥Ü¡¼¥ë", (menu_line == 2) ? "¡Õ" : "  "), 3, 14);
305                         prt(format(" %s ¥Ö¥ì¥¹", (menu_line == 3) ? "¡Õ" : "  "), 4, 14);
306                         prt(format(" %s ¾¤´­", (menu_line == 4) ? "¡Õ" : "  "), 5, 14);
307                         prt(format(" %s ¤½¤Î¾", (menu_line == 5) ? "¡Õ" : "  "), 6, 14);
308                         prt("¤É¤Î¼ïÎà¤ÎËâË¡¤ò»È¤¤¤Þ¤¹¤«¡©", 0, 0);
309 #else
310                         prt(format(" %s bolt", (menu_line == 1) ? "> " : "  "), 2, 14);
311                         prt(format(" %s ball", (menu_line == 2) ? "> " : "  "), 3, 14);
312                         prt(format(" %s breath", (menu_line == 3) ? "> " : "  "), 4, 14);
313                         prt(format(" %s sommoning", (menu_line == 4) ? "> " : "  "), 5, 14);
314                         prt(format(" %s others", (menu_line == 5) ? "> " : "  "), 6, 14);
315                         prt("use which type of magic? ", 0, 0);
316 #endif
317                         choice = inkey();
318                         switch(choice)
319                         {
320                         case ESCAPE:
321                         case 'z':
322                         case 'Z':
323                                 screen_load();
324                                 return FALSE;
325                         case '2':
326                         case 'j':
327                         case 'J':
328                                 menu_line++;
329                                 break;
330                         case '8':
331                         case 'k':
332                         case 'K':
333                                 menu_line+= 4;
334                                 break;
335                         case '\r':
336                         case 'x':
337                         case 'X':
338                                 mode = menu_line;
339                                 break;
340                         }
341                         if (menu_line > 5) menu_line -= 5;
342                 }
343                 screen_load();
344         }
345         else
346         {
347 #ifdef JP
348         sprintf(comment, "[A]¥Ü¥ë¥È, [B]¥Ü¡¼¥ë, [C]¥Ö¥ì¥¹, [D]¾¤´­, [E]¤½¤Î¾:");
349 #else
350         sprintf(comment, "[A] bolt, [B] ball, [C] breath, [D] summoning, [E] others:");
351 #endif
352         while (TRUE)
353         {
354                 if (!get_com(comment, &ch, TRUE))
355                 {
356                         return FALSE;
357                 }
358                 if (ch == 'A' || ch == 'a')
359                 {
360                         mode = 1;
361                         break;
362                 }
363                 if (ch == 'B' || ch == 'b')
364                 {
365                         mode = 2;
366                         break;
367                 }
368                 if (ch == 'C' || ch == 'c')
369                 {
370                         mode = 3;
371                         break;
372                 }
373                 if (ch == 'D' || ch == 'd')
374                 {
375                         mode = 4;
376                         break;
377                 }
378                 if (ch == 'E' || ch == 'e')
379                 {
380                         mode = 5;
381                         break;
382                 }
383         }
384         }
385
386         if (mode == 1)
387         {
388                 f4 = ((RF4_BOLT_MASK | RF4_BEAM_MASK) & ~(RF4_ROCKET));
389                 f5 = RF5_BOLT_MASK | RF5_BEAM_MASK;
390                 f6 = RF6_BOLT_MASK | RF6_BEAM_MASK;
391         }
392         else if (mode == 2)
393         {
394                 f4 = (RF4_BALL_MASK & ~(RF4_BREATH_MASK));
395                 f5 = (RF5_BALL_MASK & ~(RF5_BREATH_MASK));
396                 f6 = (RF6_BALL_MASK & ~(RF6_BREATH_MASK));
397         }
398         else if (mode == 3)
399         {
400                 f4 = RF4_BREATH_MASK;
401                 f5 = RF5_BREATH_MASK;
402                 f6 = RF6_BREATH_MASK;
403         }
404         else if (mode == 4)
405         {
406                 f4 = RF4_SUMMON_MASK;
407                 f5 = RF5_SUMMON_MASK;
408                 f6 = RF6_SUMMON_MASK;
409         }
410         else if (mode == 5)
411         {
412                 f4 = ~(RF4_BOLT_MASK | RF4_BEAM_MASK | RF4_BALL_MASK | RF4_SUMMON_MASK | RF4_INDIRECT_MASK | RF4_RIDING_MASK);
413                 f5 = ~(RF5_BOLT_MASK | RF5_BEAM_MASK | RF5_BALL_MASK | RF5_SUMMON_MASK | RF5_INDIRECT_MASK | RF5_RIDING_MASK);
414                 f6 = (~(RF6_BOLT_MASK | RF6_BEAM_MASK | RF6_BALL_MASK | RF6_SUMMON_MASK | RF6_INDIRECT_MASK | RF6_RIDING_MASK)) | (RF6_TRAPS | RF6_DARKNESS);
415         }
416
417         for (i = 0, num = 0; i < 32; i++)
418         {
419                 if ((0x00000001 << i) & f4) spellnum[num++] = i;
420         }
421         for (; i < 64; i++)
422         {
423                 if ((0x00000001 << (i - 32)) & f5) spellnum[num++] = i;
424         }
425         for (; i < 96; i++)
426         {
427                 if ((0x00000001 << (i - 64)) & f6) spellnum[num++] = i;
428         }
429         for (i = 0; i < num; i++)
430         {
431                 if (p_ptr->magic_num2[spellnum[i]])
432                 {
433                         if (use_menu) menu_line = i+1;
434                         break;
435                 }
436         }
437         if (i == num)
438         {
439 #ifdef JP
440                 msg_print("¤½¤Î¼ïÎà¤ÎËâË¡¤Ï³Ð¤¨¤Æ¤¤¤Ê¤¤¡ª");
441 #else
442                 msg_print("You don't know any spell of this type.");
443 #endif
444                 return (FALSE);
445         }
446
447         /* Build a prompt (accept all spells) */
448 #ifdef JP
449 (void) strnfmt(out_val, 78, "(%c-%c, '*'¤Ç°ìÍ÷, ESC) ¤É¤Î%s¤ò¾§¤¨¤Þ¤¹¤«¡©",
450 #else
451         (void)strnfmt(out_val, 78, "(%c-%c, *=List, ESC=exit) Use which %s? ",
452 #endif
453
454                 I2A(0), I2A(num - 1), p);
455
456         if (use_menu) screen_save();
457
458         /* Get a spell from the user */
459
460         choice= (always_show_list || use_menu) ? ESCAPE:1 ;
461         while (!flag)
462         {
463                 if(choice==ESCAPE) choice = ' '; 
464                 else if( !get_com(out_val, &choice, TRUE) )break; 
465
466                 if (use_menu && choice != ' ')
467                 {
468                         switch(choice)
469                         {
470                                 case '0':
471                                 {
472                                         screen_load();
473                                         return (FALSE);
474                                         break;
475                                 }
476
477                                 case '8':
478                                 case 'k':
479                                 case 'K':
480                                 {
481                                         do
482                                         {
483                                                 menu_line += (num-1);
484                                                 if (menu_line > num) menu_line -= num;
485                                         } while(!p_ptr->magic_num2[spellnum[menu_line-1]]);
486                                         break;
487                                 }
488
489                                 case '2':
490                                 case 'j':
491                                 case 'J':
492                                 {
493                                         do
494                                         {
495                                                 menu_line++;
496                                                 if (menu_line > num) menu_line -= num;
497                                         } while(!p_ptr->magic_num2[spellnum[menu_line-1]]);
498                                         break;
499                                 }
500
501                                 case '6':
502                                 case 'l':
503                                 case 'L':
504                                 {
505                                         menu_line=num;
506                                         while(!p_ptr->magic_num2[spellnum[menu_line-1]]) menu_line--;
507                                         break;
508                                 }
509
510                                 case '4':
511                                 case 'h':
512                                 case 'H':
513                                 {
514                                         menu_line=1;
515                                         while(!p_ptr->magic_num2[spellnum[menu_line-1]]) menu_line++;
516                                         break;
517                                 }
518
519                                 case 'x':
520                                 case 'X':
521                                 case '\r':
522                                 {
523                                         i = menu_line - 1;
524                                         ask = FALSE;
525                                         break;
526                                 }
527                         }
528                 }
529                 /* Request redraw */
530                 if ((choice == ' ') || (choice == '*') || (choice == '?') || (use_menu && ask))
531                 {
532                         /* Show the list */
533                         if (!redraw || use_menu)
534                         {
535                                 char psi_desc[80];
536
537                                 /* Show list */
538                                 redraw = TRUE;
539
540                                 /* Save the screen */
541                                 if (!use_menu) screen_save();
542
543                                 /* Display a list of spells */
544                                 prt("", y, x);
545 #ifdef JP
546 put_str("̾Á°", y, x + 5);
547 #else
548                                 put_str("Name", y, x + 5);
549 #endif
550
551 #ifdef JP
552 put_str("MP ¼ºÎ¨ ¸ú²Ì", y, x + 33);
553 #else
554                                 put_str("SP Fail Info", y, x + 32);
555 #endif
556
557
558                                 /* Dump the spells */
559                                 for (i = 0; i < num; i++)
560                                 {
561                                         int shouhimana;
562
563                                         prt("", y + i + 1, x);
564                                         if (!p_ptr->magic_num2[spellnum[i]]) continue;
565
566                                         /* Access the spell */
567                                         spell = monster_powers[spellnum[i]];
568
569                                         chance = spell.fail;
570
571                                         /* Reduce failure rate by "effective" level adjustment */
572                                         if (plev > spell.level) chance -= 3 * (plev - spell.level);
573                                         else chance += (spell.level - plev);
574
575                                         if (p_ptr->pseikaku == SEIKAKU_NAMAKE) chance += 10;
576                                         if (p_ptr->pseikaku == SEIKAKU_KIREMONO) chance -= 3;
577                                         if ((p_ptr->pseikaku == SEIKAKU_GAMAN) || (p_ptr->pseikaku == SEIKAKU_CHIKARA)) chance++;
578
579                                         /* Reduce failure rate by INT/WIS adjustment */
580                                         chance -= 3 * (adj_mag_stat[p_ptr->stat_ind[A_INT]] - 1);
581
582                                         if (p_ptr->heavy_spell) chance += 20;
583                                         if(p_ptr->dec_mana || p_ptr->easy_spell) chance-=4;
584                                         else if (p_ptr->easy_spell) chance-=3;
585                                         else if (p_ptr->dec_mana) chance-=2;
586
587                                         shouhimana = monster_powers[spellnum[i]].smana;
588                                         if (p_ptr->dec_mana)
589                                         {
590                                                 shouhimana = (shouhimana + 1) * 3 / 4;
591                                         }
592
593                                         /* Not enough mana to cast */
594                                         if (shouhimana > p_ptr->csp)
595                                         {
596                                                 chance += 5 * (shouhimana - p_ptr->csp);
597                                         }
598
599                                         /* Extract the minimum failure rate */
600                                         minfail = adj_mag_fail[p_ptr->stat_ind[A_INT]];
601
602                                         /* Minimum failure rate */
603                                         if (chance < minfail) chance = minfail;
604
605                                         /* Stunning makes spells harder */
606                                         if (p_ptr->stun > 50) chance += 25;
607                                         else if (p_ptr->stun) chance += 15;
608
609                                         /* Always a 5 percent chance of working */
610                                         if (chance > 95) chance = 95;
611
612                                         if(p_ptr->dec_mana) chance--;
613                                         if (p_ptr->heavy_spell) chance += 5;
614                                         chance = MAX(chance,0);
615
616                                         /* Get info */
617                                         learned_info(comment, spellnum[i]);
618
619                                         if (use_menu)
620                                         {
621 #ifdef JP
622                                                 if (i == (menu_line-1)) strcpy(psi_desc, "  ¡Õ");
623 #else
624                                                 if (i == (menu_line-1)) strcpy(psi_desc, "  > ");
625 #endif
626                                                 else strcpy(psi_desc, "    ");
627                                         }
628                                         else sprintf(psi_desc, "  %c)", I2A(i));
629
630                                         /* Dump the spell --(-- */
631                                         strcat(psi_desc, format(" %-26s %3d %3d%%%s",
632                                                 spell.name, shouhimana,
633                                                 chance, comment));
634                                         prt(psi_desc, y + i + 1, x);
635                                 }
636
637                                 /* Clear the bottom line */
638                                 if (y < 22) prt("", y + i + 1, x);
639                         }
640
641                         /* Hide the list */
642                         else
643                         {
644                                 /* Hide list */
645                                 redraw = FALSE;
646
647                                 /* Restore the screen */
648                                 screen_load();
649                         }
650
651                         /* Redo asking */
652                         continue;
653                 }
654
655                 if (!use_menu)
656                 {
657                         /* Note verify */
658                         ask = isupper(choice);
659
660                         /* Lowercase */
661                         if (ask) choice = tolower(choice);
662
663                         /* Extract request */
664                         i = (islower(choice) ? A2I(choice) : -1);
665                 }
666
667                 /* Totally Illegal */
668                 if ((i < 0) || (i >= num) || !p_ptr->magic_num2[spellnum[i]])
669                 {
670                         bell();
671                         continue;
672                 }
673
674                 /* Save the spell index */
675                 spell = monster_powers[spellnum[i]];
676
677                 /* Verify it */
678                 if (ask)
679                 {
680                         char tmp_val[160];
681
682                         /* Prompt */
683 #ifdef JP
684 (void) strnfmt(tmp_val, 78, "%s¤ÎËâË¡¤ò¾§¤¨¤Þ¤¹¤«¡©", monster_powers[spellnum[i]].name);
685 #else
686                         (void)strnfmt(tmp_val, 78, "Use %s? ", monster_powers[spellnum[i]].name);
687 #endif
688
689
690                         /* Belay that order */
691                         if (!get_check(tmp_val)) continue;
692                 }
693
694                 /* Stop the loop */
695                 flag = TRUE;
696         }
697
698         /* Restore the screen */
699         if (redraw) screen_load();
700
701         /* Show choices */
702         if (show_choices)
703         {
704                 /* Update */
705                 p_ptr->window |= (PW_SPELL);
706
707                 /* Window stuff */
708                 window_stuff();
709         }
710
711         /* Abort if needed */
712         if (!flag) return (FALSE);
713
714         /* Save the choice */
715         (*sn) = spellnum[i];
716
717 #ifdef ALLOW_REPEAT /* TNB */
718
719         repeat_push(*sn);
720
721 #endif /* ALLOW_REPEAT -- TNB */
722
723         /* Success */
724         return (TRUE);
725 }
726
727
728 /*
729  * do_cmd_cast calls this function if the player's class
730  * is 'imitator'.
731  */
732 static bool cast_learned_spell(int spell, bool success)
733 {
734         int             dir;
735         int             plev = pseudo_plev();
736         int     summon_lev = p_ptr->lev * 2 / 3 + randint(p_ptr->lev/2);
737         int             hp = p_ptr->chp;
738         int             damage = 0;
739         bool    unique_okay = FALSE;
740         bool   pet = success;
741         bool   not_pet = (bool)(!pet);
742         bool   no_trump = FALSE;
743
744         if (!success || (randint(50+plev) < plev/10)) unique_okay = TRUE;
745
746         /* spell code */
747         switch (spell)
748         {
749         case MS_SHRIEK:
750 #ifdef JP
751 msg_print("¤«¤ó¹â¤¤¶âÀÚ¤êÀ¼¤ò¤¢¤²¤¿¡£");
752 #else
753                 msg_print("You makes a high pitched shriek.");
754 #endif
755
756                 aggravate_monsters(0);
757                 break;
758         case MS_XXX1:
759                 break;
760         case MS_DISPEL:
761         {
762                 monster_type *m_ptr;
763                 char m_name[80];
764
765                 if (!target_set(TARGET_KILL)) return FALSE;
766                 if (!cave[target_row][target_col].m_idx) break;
767                 if (!los(py, px, target_row, target_col)) break;
768                 m_ptr = &m_list[cave[target_row][target_col].m_idx];
769                 monster_desc(m_name, m_ptr, 0);
770                 if (m_ptr->invulner)
771                 {
772                         m_ptr->invulner = 0;
773 #ifdef JP
774 msg_format("%s¤Ï¤â¤¦ÌµÅ¨¤Ç¤Ï¤Ê¤¤¡£", m_name);
775 #else
776                         msg_format("%^s is no longer invulnerable.", m_name);
777 #endif
778                         m_ptr->energy -= 100;
779                 }
780                 if (m_ptr->fast)
781                 {
782                         m_ptr->fast = 0;
783 #ifdef JP
784 msg_format("%s¤Ï¤â¤¦²Ã®¤µ¤ì¤Æ¤¤¤Ê¤¤¡£", m_name);
785 #else
786                         msg_format("%^s is no longer fast.", m_name);
787 #endif
788                 }
789                 if (m_ptr->slow)
790                 {
791                         m_ptr->slow = 0;
792 #ifdef JP
793 msg_format("%s¤Ï¤â¤¦¸ºÂ®¤µ¤ì¤Æ¤¤¤Ê¤¤¡£", m_name);
794 #else
795                         msg_format("%^s is no longer slow.", m_name);
796 #endif
797                 }
798                 p_ptr->redraw |= (PR_HEALTH);
799                 if (p_ptr->riding == cave[target_row][target_col].m_idx) p_ptr->redraw |= (PR_UHEALTH);
800
801                 break;
802         }
803         case MS_ROCKET:
804                 if (!get_aim_dir(&dir)) return FALSE;
805                 else
806 #ifdef JP
807 msg_print("¥í¥±¥Ã¥È¤òȯ¼Í¤·¤¿¡£");
808 #else
809                         msg_print("You fires a rocket.");
810 #endif
811                 damage = hp / 4;
812                         fire_rocket(GF_ROCKET, dir, damage, 2);
813                 break;
814         case MS_ARROW_1:
815                 if (!get_aim_dir(&dir)) return FALSE;
816                 else
817 #ifdef JP
818 msg_print("Ìð¤òÊü¤Ã¤¿¡£");
819 #else
820                         msg_print("You fires an arrow.");
821 #endif
822                 damage = damroll(2, 5);
823                 fire_bolt(GF_ARROW, dir, damage);
824                 break;
825         case MS_ARROW_2:
826                 if (!get_aim_dir(&dir)) return FALSE;
827                 else
828 #ifdef JP
829 msg_print("Ìð¤òÊü¤Ã¤¿¡£");
830 #else
831                         msg_print("You fires an arrow.");
832 #endif
833                 damage = damroll(3, 6);
834                 fire_bolt(GF_ARROW, dir, damage);
835                 break;
836         case MS_ARROW_3:
837                 if (!get_aim_dir(&dir)) return FALSE;
838                 else
839 #ifdef JP
840 msg_print("¥Ü¥ë¥È¤ò·â¤Ã¤¿¡£");
841 #else
842                         msg_print("You fires a bolt.");
843 #endif
844                 damage = damroll(5, 6);
845                 fire_bolt(GF_ARROW, dir, damage);
846                 break;
847         case MS_ARROW_4:
848                 if (!get_aim_dir(&dir)) return FALSE;
849                 else
850 #ifdef JP
851 msg_print("¥Ü¥ë¥È¤ò·â¤Ã¤¿¡£");
852 #else
853                         msg_print("You fires a bolt.");
854 #endif
855                 damage = damroll(7, 6);
856                 fire_bolt(GF_ARROW, dir, damage);
857                 break;
858         case MS_BR_ACID:
859                 if (!get_aim_dir(&dir)) return FALSE;
860 #ifdef JP
861 else msg_print("»À¤Î¥Ö¥ì¥¹¤òÅǤ¤¤¿¡£");
862 #else
863                         else msg_print("You breathes acid.");
864 #endif
865                 damage = hp / 3;
866                 fire_ball(GF_ACID, dir, damage, (plev > 40 ? -3 : -2));
867                 break;
868         case MS_BR_ELEC:
869                 if (!get_aim_dir(&dir)) return FALSE;
870 #ifdef JP
871 else msg_print("°ðºÊ¤Î¥Ö¥ì¥¹¤òÅǤ¤¤¿¡£");
872 #else
873                         else msg_print("You breathes lightning.");
874 #endif
875                 damage = hp / 3;
876                 fire_ball(GF_ELEC, dir, damage, (plev > 40 ? -3 : -2));
877                 break;
878         case MS_BR_FIRE:
879                 if (!get_aim_dir(&dir)) return FALSE;
880 #ifdef JP
881 else msg_print("²Ð±ê¤Î¥Ö¥ì¥¹¤òÅǤ¤¤¿¡£");
882 #else
883                         else msg_print("You breathes fire.");
884 #endif
885                 damage = hp / 3;
886                 fire_ball(GF_FIRE, dir, damage, (plev > 40 ? -3 : -2));
887                 break;
888         case MS_BR_COLD:
889                 if (!get_aim_dir(&dir)) return FALSE;
890 #ifdef JP
891 else msg_print("Î䵤¤Î¥Ö¥ì¥¹¤òÅǤ¤¤¿¡£");
892 #else
893                         else msg_print("You breathes frost.");
894 #endif
895                 damage = hp / 3;
896                 fire_ball(GF_COLD, dir, damage, (plev > 40 ? -3 : -2));
897                 break;
898         case MS_BR_POIS:
899                 if (!get_aim_dir(&dir)) return FALSE;
900 #ifdef JP
901 else msg_print("¥¬¥¹¤Î¥Ö¥ì¥¹¤òÅǤ¤¤¿¡£");
902 #else
903                         else msg_print("You breathes gas.");
904 #endif
905                 damage = hp / 3;
906                 fire_ball(GF_POIS, dir, damage, (plev > 40 ? -3 : -2));
907                 break;
908         case MS_BR_NETHER:
909                 if (!get_aim_dir(&dir)) return FALSE;
910 #ifdef JP
911 else msg_print("ÃϹö¤Î¥Ö¥ì¥¹¤òÅǤ¤¤¿¡£");
912 #else
913                         else msg_print("You breathes nether.");
914 #endif
915                 damage = hp / 6;
916                 fire_ball(GF_NETHER, dir, damage, (plev > 40 ? -3 : -2));
917                 break;
918         case MS_BR_LITE:
919                 if (!get_aim_dir(&dir)) return FALSE;
920 #ifdef JP
921 else msg_print("Á®¸÷¤Î¥Ö¥ì¥¹¤òÅǤ¤¤¿¡£");
922 #else
923                         else msg_print("You breathes light.");
924 #endif
925                 damage = hp / 6;
926                 fire_ball(GF_LITE, dir, damage, (plev > 40 ? -3 : -2));
927                 break;
928         case MS_BR_DARK:
929                 if (!get_aim_dir(&dir)) return FALSE;
930 #ifdef JP
931 else msg_print("°Å¹õ¤Î¥Ö¥ì¥¹¤òÅǤ¤¤¿¡£");
932 #else
933                         else msg_print("You breathes darkness.");
934 #endif
935                 damage = hp / 6;
936                 fire_ball(GF_DARK, dir, damage, (plev > 40 ? -3 : -2));
937                 break;
938         case MS_BR_CONF:
939                 if (!get_aim_dir(&dir)) return FALSE;
940 #ifdef JP
941 else msg_print("º®Íð¤Î¥Ö¥ì¥¹¤òÅǤ¤¤¿¡£");
942 #else
943                         else msg_print("You breathes confusion.");
944 #endif
945                 damage = hp / 6;
946                 fire_ball(GF_CONFUSION, dir, damage, (plev > 40 ? -3 : -2));
947                 break;
948         case MS_BR_SOUND:
949                 if (!get_aim_dir(&dir)) return FALSE;
950 #ifdef JP
951 else msg_print("¹ì²»¤Î¥Ö¥ì¥¹¤òÅǤ¤¤¿¡£");
952 #else
953                         else msg_print("You breathes sound.");
954 #endif
955                 damage = hp / 6;
956                 fire_ball(GF_SOUND, dir, damage, (plev > 40 ? -3 : -2));
957                 break;
958         case MS_BR_CHAOS:
959                 if (!get_aim_dir(&dir)) return FALSE;
960 #ifdef JP
961 else msg_print("¥«¥ª¥¹¤Î¥Ö¥ì¥¹¤òÅǤ¤¤¿¡£");
962 #else
963                         else msg_print("You breathes chaos.");
964 #endif
965                 damage = hp / 6;
966                 fire_ball(GF_CHAOS, dir, damage, (plev > 40 ? -3 : -2));
967                 break;
968         case MS_BR_DISEN:
969                 if (!get_aim_dir(&dir)) return FALSE;
970 #ifdef JP
971 else msg_print("Îô²½¤Î¥Ö¥ì¥¹¤òÅǤ¤¤¿¡£");
972 #else
973                         else msg_print("You breathes disenchantment.");
974 #endif
975                 damage = hp / 6;
976                 fire_ball(GF_DISENCHANT, dir, damage, (plev > 40 ? -3 : -2));
977                 break;
978         case MS_BR_NEXUS:
979                 if (!get_aim_dir(&dir)) return FALSE;
980 #ifdef JP
981 else msg_print("°ø²Ìº®Íð¤Î¥Ö¥ì¥¹¤òÅǤ¤¤¿¡£");
982 #else
983                         else msg_print("You breathes nexus.");
984 #endif
985                 damage = MIN(hp / 3, 250);
986                 fire_ball(GF_NEXUS, dir, damage, (plev > 40 ? -3 : -2));
987                 break;
988         case MS_BR_TIME:
989                 if (!get_aim_dir(&dir)) return FALSE;
990 #ifdef JP
991 else msg_print("»þ´ÖµÕž¤Î¥Ö¥ì¥¹¤òÅǤ¤¤¿¡£");
992 #else
993                         else msg_print("You breathes time.");
994 #endif
995                 damage = MIN(hp / 3, 150);
996                 fire_ball(GF_TIME, dir, damage, (plev > 40 ? -3 : -2));
997                 break;
998         case MS_BR_INERTIA:
999                 if (!get_aim_dir(&dir)) return FALSE;
1000 #ifdef JP
1001 else msg_print("ÃÙÆߤΥ֥쥹¤òÅǤ¤¤¿¡£");
1002 #else
1003                         else msg_print("You breathes inertia.");
1004 #endif
1005                 damage = MIN(hp / 6, 200);
1006                 fire_ball(GF_INERTIA, dir, damage, (plev > 40 ? -3 : -2));
1007                 break;
1008         case MS_BR_GRAVITY:
1009                 if (!get_aim_dir(&dir)) return FALSE;
1010 #ifdef JP
1011 else msg_print("½ÅÎϤΥ֥쥹¤òÅǤ¤¤¿¡£");
1012 #else
1013                         else msg_print("You breathes gravity.");
1014 #endif
1015                 damage = MIN(hp / 3, 200);
1016                 fire_ball(GF_GRAVITY, dir, damage, (plev > 40 ? -3 : -2));
1017                 break;
1018         case MS_BR_SHARDS:
1019                 if (!get_aim_dir(&dir)) return FALSE;
1020 #ifdef JP
1021 else msg_print("ÇËÊҤΥ֥쥹¤òÅǤ¤¤¿¡£");
1022 #else
1023                         else msg_print("You breathes shards.");
1024 #endif
1025                 damage = hp / 6;
1026                 fire_ball(GF_SHARDS, dir, damage, (plev > 40 ? -3 : -2));
1027                 break;
1028         case MS_BR_PLASMA:
1029                 if (!get_aim_dir(&dir)) return FALSE;
1030 #ifdef JP
1031 else msg_print("¥×¥é¥º¥Þ¤Î¥Ö¥ì¥¹¤òÅǤ¤¤¿¡£");
1032 #else
1033                         else msg_print("You breathes plasma.");
1034 #endif
1035                 damage = MIN(hp / 6, 150);
1036                 fire_ball(GF_PLASMA, dir, damage, (plev > 40 ? -3 : -2));
1037                 break;
1038         case MS_BR_FORCE:
1039                 if (!get_aim_dir(&dir)) return FALSE;
1040 #ifdef JP
1041 else msg_print("¥Õ¥©¡¼¥¹¤Î¥Ö¥ì¥¹¤òÅǤ¤¤¿¡£");
1042 #else
1043                         else msg_print("You breathes force.");
1044 #endif
1045                 damage = MIN(hp / 6, 200);
1046                 fire_ball(GF_FORCE, dir, damage, (plev > 40 ? -3 : -2));
1047                 break;
1048         case MS_BR_MANA:
1049                 if (!get_aim_dir(&dir)) return FALSE;
1050 #ifdef JP
1051 else msg_print("ËâÎϤΥ֥쥹¤òÅǤ¤¤¿¡£");
1052 #else
1053                         else msg_print("You breathes mana.");
1054 #endif
1055                 
1056                 damage = MIN(hp / 3, 250);
1057                 fire_ball(GF_MANA, dir, damage, (plev > 40 ? -3 : -2));
1058                 break;
1059         case MS_BALL_NUKE:
1060                 if (!get_aim_dir(&dir)) return FALSE;
1061 #ifdef JP
1062 else msg_print("Êü¼Íǽµå¤òÊü¤Ã¤¿¡£");
1063 #else
1064                         else msg_print("You casts a ball of radiation.");
1065 #endif
1066                 damage = plev * 2 + damroll(10, 6);
1067                 fire_ball(GF_NUKE, dir, damage, 2);
1068                 break;
1069         case MS_BR_NUKE:
1070                 if (!get_aim_dir(&dir)) return FALSE;
1071 #ifdef JP
1072 else msg_print("Êü¼ÍÀ­ÇÑ´þʪ¤Î¥Ö¥ì¥¹¤òÅǤ¤¤¿¡£");
1073 #else
1074                         else msg_print("You breathes toxic waste.");
1075 #endif
1076                 damage = hp / 3;
1077                 fire_ball(GF_NUKE, dir, damage, (plev > 40 ? -3 : -2));
1078                 break;
1079         case MS_BALL_CHAOS:
1080                 if (!get_aim_dir(&dir)) return FALSE;
1081 #ifdef JP
1082 else msg_print("½ã¥í¥°¥ë¥¹¤òÊü¤Ã¤¿¡£");
1083 #else
1084                         else msg_print("You invokes a raw Logrus.");
1085 #endif
1086                 damage = plev * 4 + damroll(10, 10);
1087                 fire_ball(GF_CHAOS, dir, damage, 4);
1088                 break;
1089         case MS_BR_DISI:
1090                 if (!get_aim_dir(&dir)) return FALSE;
1091 #ifdef JP
1092 else msg_print("ʬ²ò¤Î¥Ö¥ì¥¹¤òÅǤ¤¤¿¡£");
1093 #else
1094                         else msg_print("You breathes disintegration.");
1095 #endif
1096                 damage = MIN(hp / 6, 150);
1097                 fire_ball(GF_DISINTEGRATE, dir, damage, (plev > 40 ? -3 : -2));
1098                 break;
1099         case MS_BALL_ACID:
1100                 if (!get_aim_dir(&dir)) return FALSE;
1101 #ifdef JP
1102 else msg_print("¥¢¥·¥Ã¥É¡¦¥Ü¡¼¥ë¤Î¼öʸ¤ò¾§¤¨¤¿¡£");
1103 #else
1104                         else msg_print("You casts an acid ball.");
1105 #endif
1106                 damage = randint(plev * 6) + 15;
1107                 fire_ball(GF_ACID, dir, damage, 2);
1108                 break;
1109         case MS_BALL_ELEC:
1110                 if (!get_aim_dir(&dir)) return FALSE;
1111 #ifdef JP
1112 else msg_print("¥µ¥ó¥À¡¼¡¦¥Ü¡¼¥ë¤Î¼öʸ¤ò¾§¤¨¤¿¡£");
1113 #else
1114                         else msg_print("You casts a lightning ball.");
1115 #endif
1116                 damage = randint(plev * 3) + 8;
1117                 fire_ball(GF_ELEC, dir, damage, 2);
1118                 break;
1119         case MS_BALL_FIRE:
1120                 if (!get_aim_dir(&dir)) return FALSE;
1121 #ifdef JP
1122 else msg_print("¥Õ¥¡¥¤¥¢¡¦¥Ü¡¼¥ë¤Î¼öʸ¤ò¾§¤¨¤¿¡£");
1123 #else
1124                         else msg_print("You casts a fire ball.");
1125 #endif
1126                 damage = randint(plev * 7) + 10;
1127                 fire_ball(GF_FIRE, dir, damage, 2);
1128                 break;
1129         case MS_BALL_COLD:
1130                 if (!get_aim_dir(&dir)) return FALSE;
1131 #ifdef JP
1132 else msg_print("¥¢¥¤¥¹¡¦¥Ü¡¼¥ë¤Î¼öʸ¤ò¾§¤¨¤¿¡£");
1133 #else
1134                         else msg_print("You casts a frost ball.");
1135 #endif
1136                 damage = randint(plev * 3) + 10;
1137                 fire_ball(GF_COLD, dir, damage, 2);
1138                 break;
1139         case MS_BALL_POIS:
1140                 if (!get_aim_dir(&dir)) return FALSE;
1141 #ifdef JP
1142 else msg_print("°­½­±À¤Î¼öʸ¤ò¾§¤¨¤¿¡£");
1143 #else
1144                         else msg_print("You casts a stinking cloud.");
1145 #endif
1146                 damage = damroll(12,2);
1147                 fire_ball(GF_POIS, dir, damage, 2);
1148                 break;
1149         case MS_BALL_NETHER:
1150                 if (!get_aim_dir(&dir)) return FALSE;
1151 #ifdef JP
1152 else msg_print("ÃϹöµå¤Î¼öʸ¤ò¾§¤¨¤¿¡£");
1153 #else
1154                         else msg_print("You casts a nether ball.");
1155 #endif
1156                 damage = plev * 2 + 50 + damroll(10, 10);
1157                 fire_ball(GF_NETHER, dir, damage, 2);
1158                 break;
1159         case MS_BALL_WATER:
1160                 if (!get_aim_dir(&dir)) return FALSE;
1161 #ifdef JP
1162 else msg_print("ή¤ì¤ë¤è¤¦¤Ê¿È¿¶¤ê¤ò¤·¤¿¡£");
1163 #else
1164                         else msg_print("You gestures fluidly.");
1165 #endif
1166                 damage = randint(plev * 4) + 50;
1167                 fire_ball(GF_WATER, dir, damage, 4);
1168                 break;
1169         case MS_BALL_MANA:
1170                 if (!get_aim_dir(&dir)) return FALSE;
1171 #ifdef JP
1172 else msg_print("ËâÎϤÎÍò¤Î¼öʸ¤òÇ°¤¸¤¿¡£");
1173 #else
1174                         else msg_print("You invokes a mana storm.");
1175 #endif
1176                 damage = plev * 8 + 50 + damroll(10, 10);
1177                 fire_ball(GF_MANA, dir, damage, 4);
1178                 break;
1179         case MS_BALL_DARK:
1180                 if (!get_aim_dir(&dir)) return FALSE;
1181 #ifdef JP
1182 else msg_print("°Å¹õ¤ÎÍò¤Î¼öʸ¤òÇ°¤¸¤¿¡£");
1183 #else
1184                         else msg_print("You invokes a darkness storm.");
1185 #endif
1186                 damage = plev * 8 + 50 + damroll(10, 10);
1187                 fire_ball(GF_DARK, dir, damage, 4);
1188                 break;
1189         case MS_DRAIN_MANA:
1190                 if (!get_aim_dir(&dir)) return FALSE;
1191                 fire_ball_hide(GF_DRAIN_MANA, dir, randint(plev)+plev, 0);
1192                 break;
1193         case MS_MIND_BLAST:
1194                 if (!get_aim_dir(&dir)) return FALSE;
1195                 damage = damroll(7, 7);
1196                 fire_ball_hide(GF_MIND_BLAST, dir, damage, 0);
1197                 break;
1198         case MS_BRAIN_SMASH:
1199                 if (!get_aim_dir(&dir)) return FALSE;
1200                 damage = damroll(12, 12);
1201                 fire_ball_hide(GF_BRAIN_SMASH, dir, damage, 0);
1202                 break;
1203         case MS_CAUSE_1:
1204                 if (!get_aim_dir(&dir)) return FALSE;
1205                 damage = damroll(3, 8);
1206                 fire_ball_hide(GF_CAUSE_1, dir, damage, 0);
1207                 break;
1208         case MS_CAUSE_2:
1209                 if (!get_aim_dir(&dir)) return FALSE;
1210                 damage = damroll(8, 8);
1211                 fire_ball_hide(GF_CAUSE_2, dir, damage, 0);
1212                 break;
1213         case MS_CAUSE_3:
1214                 if (!get_aim_dir(&dir)) return FALSE;
1215                 damage = damroll(10, 15);
1216                 fire_ball_hide(GF_CAUSE_3, dir, damage, 0);
1217                 break;
1218         case MS_CAUSE_4:
1219                 if (!get_aim_dir(&dir)) return FALSE;
1220                 damage = damroll(15, 15);
1221                 fire_ball_hide(GF_CAUSE_4, dir, damage, 0);
1222                 break;
1223         case MS_BOLT_ACID:
1224                 if (!get_aim_dir(&dir)) return FALSE;
1225 #ifdef JP
1226 else msg_print("¥¢¥·¥Ã¥É¡¦¥Ü¥ë¥È¤Î¼öʸ¤ò¾§¤¨¤¿¡£");
1227 #else
1228                         else msg_print("You casts an acid bolt.");
1229 #endif
1230                 damage = damroll(7, 8) + plev * 2 / 3;
1231                 fire_bolt(GF_ACID, dir, damage);
1232                 break;
1233         case MS_BOLT_ELEC:
1234                 if (!get_aim_dir(&dir)) return FALSE;
1235 #ifdef JP
1236 else msg_print("¥µ¥ó¥À¡¼¡¦¥Ü¥ë¥È¤Î¼öʸ¤ò¾§¤¨¤¿¡£");
1237 #else
1238                         else msg_print("You casts a lightning bolt.");
1239 #endif
1240                 damage = damroll(4, 8) + plev * 2 / 3;
1241                 fire_bolt(GF_ELEC, dir, damage);
1242                 break;
1243         case MS_BOLT_FIRE:
1244                 if (!get_aim_dir(&dir)) return FALSE;
1245 #ifdef JP
1246 else msg_print("¥Õ¥¡¥¤¥¢¡¦¥Ü¥ë¥È¤Î¼öʸ¤ò¾§¤¨¤¿¡£");
1247 #else
1248                         else msg_print("You casts a fire bolt.");
1249 #endif
1250                 damage = damroll(9, 8) + plev * 2 / 3;
1251                 fire_bolt(GF_FIRE, dir, damage);
1252                 break;
1253         case MS_BOLT_COLD:
1254                 if (!get_aim_dir(&dir)) return FALSE;
1255 #ifdef JP
1256 else msg_print("¥¢¥¤¥¹¡¦¥Ü¥ë¥È¤Î¼öʸ¤ò¾§¤¨¤¿¡£");
1257 #else
1258                         else msg_print("You casts a frost bolt.");
1259 #endif
1260                 damage = damroll(6, 8) + plev * 2 / 3;
1261                 fire_bolt(GF_COLD, dir, damage);
1262                 break;
1263         case MS_STARBURST:
1264                 if (!get_aim_dir(&dir)) return FALSE;
1265                 else
1266 #ifdef JP
1267 msg_print("¥¹¥¿¡¼¥Ð¡¼¥¹¥È¤Î¼öʸ¤òÇ°¤¸¤¿¡£");
1268 #else
1269                         msg_print("You invokes a starburst.");
1270 #endif
1271                 damage = plev * 8 + 50 + damroll(10, 10);
1272                 fire_ball(GF_LITE, dir, damage, 4);
1273                 break;
1274         case MS_BOLT_NETHER:
1275                 if (!get_aim_dir(&dir)) return FALSE;
1276 #ifdef JP
1277 else msg_print("ÃϹö¤ÎÌð¤Î¼öʸ¤ò¾§¤¨¤¿¡£");
1278 #else
1279                         else msg_print("You casts a nether bolt.");
1280 #endif
1281                 damage = 30 + damroll(5, 5) + plev * 8 / 3;
1282                 fire_bolt(GF_NETHER, dir, damage);
1283                 break;
1284         case MS_BOLT_WATER:
1285                 if (!get_aim_dir(&dir)) return FALSE;
1286 #ifdef JP
1287 else msg_print("¥¦¥©¡¼¥¿¡¼¡¦¥Ü¥ë¥È¤Î¼öʸ¤ò¾§¤¨¤¿¡£");
1288 #else
1289                         else msg_print("You casts a water bolt.");
1290 #endif
1291                 damage = damroll(10, 10) + plev * 2;
1292                 fire_bolt(GF_WATER, dir, damage);
1293                 break;
1294         case MS_BOLT_MANA:
1295                 if (!get_aim_dir(&dir)) return FALSE;
1296 #ifdef JP
1297 else msg_print("ËâÎϤÎÌð¤Î¼öʸ¤ò¾§¤¨¤¿¡£");
1298 #else
1299                         else msg_print("You casts a mana bolt.");
1300 #endif
1301                 damage = randint(plev * 7) + 50;
1302                 fire_bolt(GF_MANA, dir, damage);
1303                 break;
1304         case MS_BOLT_PLASMA:
1305                 if (!get_aim_dir(&dir)) return FALSE;
1306 #ifdef JP
1307 else msg_print("¥×¥é¥º¥Þ¡¦¥Ü¥ë¥È¤Î¼öʸ¤ò¾§¤¨¤¿¡£");
1308 #else
1309                         else msg_print("You casts a plasma bolt.");
1310 #endif
1311                 damage = 10 + damroll(8, 7) + plev * 2;
1312                 fire_bolt(GF_PLASMA, dir, damage);
1313                 break;
1314         case MS_BOLT_ICE:
1315                 if (!get_aim_dir(&dir)) return FALSE;
1316 #ifdef JP
1317 else msg_print("¶Ë´¨¤ÎÌð¤Î¼öʸ¤ò¾§¤¨¤¿¡£");
1318 #else
1319                         else msg_print("You casts a ice bolt.");
1320 #endif
1321                 damage = damroll(6, 6) + plev * 2;
1322                 fire_bolt(GF_ICE, dir, damage);
1323                 break;
1324         case MS_MAGIC_MISSILE:
1325                 if (!get_aim_dir(&dir)) return FALSE;
1326 #ifdef JP
1327 else msg_print("¥Þ¥¸¥Ã¥¯¡¦¥ß¥µ¥¤¥ë¤Î¼öʸ¤ò¾§¤¨¤¿¡£");
1328 #else
1329                         else msg_print("You casts a magic missile.");
1330 #endif
1331                 damage = damroll(2, 6) + plev * 2 / 3;
1332                 fire_bolt(GF_MISSILE, dir, damage);
1333                 break;
1334         case MS_SCARE:
1335                 if (!get_aim_dir(&dir)) return FALSE;
1336 #ifdef JP
1337 else msg_print("¶²¤í¤·¤²¤Ê¸¸³Ð¤òºî¤ê½Ð¤·¤¿¡£");
1338 #else
1339                         else msg_print("You casts a fearful illusion.");
1340 #endif
1341                 fear_monster(dir, plev+10);
1342                 break;
1343         case MS_BLIND:
1344                 if (!get_aim_dir(&dir)) return FALSE;
1345                 confuse_monster(dir, plev * 2);
1346                 break;
1347         case MS_CONF:
1348                 if (!get_aim_dir(&dir)) return FALSE;
1349 #ifdef JP
1350 else msg_print("ͶÏÇŪ¤Ê¸¸³Ð¤ò¤Ä¤¯¤ê½Ð¤·¤¿¡£");
1351 #else
1352                         else msg_print("You casts a mesmerizing illusion.");
1353 #endif
1354                 confuse_monster(dir, plev * 2);
1355                 break;
1356         case MS_SLOW:
1357                 if (!get_aim_dir(&dir)) return FALSE;
1358                 slow_monster(dir);
1359                 break;
1360         case MS_SLEEP:
1361                 if (!get_aim_dir(&dir)) return FALSE;
1362                 sleep_monster(dir);
1363                 break;
1364         case MS_SPEED:
1365                 (void)set_fast(randint(20 + plev) + plev, FALSE);
1366                 break;
1367         case MS_HAND_DOOM:
1368         {
1369                 if (!get_aim_dir(&dir)) return FALSE;
1370 #ifdef JP
1371 else msg_print("<ÇËÌǤμê>¤òÊü¤Ã¤¿¡ª");
1372 #else
1373                 else msg_print("You invokes the Hand of Doom!");
1374 #endif
1375
1376                 fire_ball_hide(GF_HAND_DOOM, dir, plev * 3, 0);
1377                 break;
1378         }
1379         case MS_HEAL:
1380 #ifdef JP
1381 msg_print("¼«Ê¬¤Î½ý¤ËÇ°¤ò½¸Ã椷¤¿¡£");
1382 #else
1383                         msg_print("You concentrates on your wounds!");
1384 #endif
1385                 (void)hp_player(plev*4);
1386                 (void)set_stun(0);
1387                 (void)set_cut(0);
1388                 break;
1389         case MS_INVULNER:
1390 #ifdef JP
1391 msg_print("̵½ý¤Îµå¤Î¼öʸ¤ò¾§¤¨¤¿¡£");
1392 #else
1393                         msg_print("You casts a Globe of Invulnerability.");
1394 #endif
1395                 (void)set_invuln(randint(4) + 4, FALSE);
1396                 break;
1397         case MS_BLINK:
1398                 teleport_player(10);
1399                 break;
1400         case MS_TELEPORT:
1401                 teleport_player(plev * 5);
1402                 break;
1403         case MS_WORLD:
1404                 world_player = TRUE;
1405 #ifdef JP
1406                 msg_print("¡Ö»þ¤è¡ª¡×");
1407 #else
1408                 msg_print("'Time!'");
1409 #endif
1410                 msg_print(NULL);
1411
1412                 p_ptr->energy += (randint(200)+1200);
1413
1414                 /* Redraw map */
1415                 p_ptr->redraw |= (PR_MAP);
1416
1417                 /* Update monsters */
1418                 p_ptr->update |= (PU_MONSTERS);
1419
1420                 /* Window stuff */
1421                 p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
1422
1423                 handle_stuff();
1424                 break;
1425         case MS_SPECIAL:
1426                 break;
1427         case MS_TELE_TO:
1428         {
1429                 monster_type *m_ptr;
1430                 monster_race *r_ptr;
1431                 char m_name[80];
1432
1433                 if (!target_set(TARGET_KILL)) return FALSE;
1434                 if (!cave[target_row][target_col].m_idx) break;
1435                 if (!player_has_los_bold(target_row, target_col)) break;
1436                 m_ptr = &m_list[cave[target_row][target_col].m_idx];
1437                 r_ptr = &r_info[m_ptr->r_idx];
1438                 monster_desc(m_name, m_ptr, 0);
1439                 if (r_ptr->flags3 & (RF3_RES_TELE))
1440                 {
1441                         if ((r_ptr->flags1 & (RF1_UNIQUE)) || (r_ptr->flags3 & (RF3_RES_ALL)))
1442                         {
1443                                 r_ptr->r_flags3 |= RF3_RES_TELE;
1444 #ifdef JP
1445 msg_format("%s¤Ë¤Ï¸ú²Ì¤¬¤Ê¤«¤Ã¤¿¡ª", m_name);
1446 #else
1447                                 msg_format("%s is unaffected!", m_name);
1448 #endif
1449
1450                                 break;
1451                         }
1452                         else if (r_ptr->level > randint(100))
1453                         {
1454                                 r_ptr->r_flags3 |= RF3_RES_TELE;
1455 #ifdef JP
1456 msg_format("%s¤Ë¤ÏÂÑÀ­¤¬¤¢¤ë¡ª", m_name);
1457 #else
1458                                 msg_format("%s resists!", m_name);
1459 #endif
1460
1461                                 break;
1462                         }
1463                 }
1464 #ifdef JP
1465 msg_format("%s¤ò°ú¤­Ìᤷ¤¿¡£", m_name);
1466 #else
1467                 msg_format("You command %s to return.", m_name);
1468 #endif
1469
1470                 teleport_to_player(cave[target_row][target_col].m_idx, 100);
1471                 break;
1472         }
1473         case MS_TELE_AWAY:
1474                 if (!get_aim_dir(&dir)) return FALSE;
1475
1476                 (void)fire_beam(GF_AWAY_ALL, dir, 100);
1477                 break;
1478         case MS_TELE_LEVEL:
1479         {
1480                 monster_type *m_ptr;
1481                 monster_race *r_ptr;
1482                 char m_name[80];
1483
1484                 if (!target_set(TARGET_KILL)) return FALSE;
1485                 if (!cave[target_row][target_col].m_idx) break;
1486                 if (!los(py, px, target_row, target_col)) break;
1487                 m_ptr = &m_list[cave[target_row][target_col].m_idx];
1488                 r_ptr = &r_info[m_ptr->r_idx];
1489                 monster_desc(m_name, m_ptr, 0);
1490 #ifdef JP
1491 msg_format("%s¤Î­¤ò»Ø¤µ¤·¤¿¡£", m_name);
1492 #else
1493                         msg_format("You gestures at %s's feet.", m_name);
1494 #endif
1495
1496                 if ((r_ptr->flags3 & RF3_RES_TELE) || (r_ptr->flags1 & RF1_QUESTOR) || (r_ptr->level + randint(50) > plev + randint(60)))
1497                 {
1498 #ifdef JP
1499 msg_print("¤·¤«¤·¸ú²Ì¤¬¤Ê¤«¤Ã¤¿¡ª");
1500 #else
1501                         msg_format("%s are unaffected!", m_name);
1502 #endif
1503
1504                 }
1505                 else if (randint(2) == 1)
1506                 {
1507 #ifdef JP
1508 msg_format("%s¤Ï¾²¤òÆͤ­ÇˤäÆÄÀ¤ó¤Ç¤¤¤Ã¤¿¡£", m_name);
1509 #else
1510                         msg_format("%s sink through the floor.", m_name);
1511 #endif
1512                         delete_monster_idx(cave[target_row][target_col].m_idx);
1513                 }
1514                 else
1515                 {
1516 #ifdef JP
1517 msg_format("%s¤ÏÅ·°æ¤òÆͤ­ÇˤäÆÃè¤ØÉ⤤¤Æ¤¤¤Ã¤¿¡£",m_name);
1518 #else
1519                         msg_format("%s rise up through the ceiling.", m_name);
1520 #endif
1521                         delete_monster_idx(cave[target_row][target_col].m_idx);
1522                 }
1523                 break;
1524         }
1525         case MS_PSY_SPEAR:
1526                 if (!get_aim_dir(&dir)) return FALSE;
1527
1528 #ifdef JP
1529 else msg_print("¸÷¤Î·õ¤òÊü¤Ã¤¿¡£");
1530 #else
1531                         else msg_print("You throws a psycho-spear.");
1532 #endif
1533                 damage = randint(plev * 3) + 100;
1534                 (void)fire_beam(GF_PSY_SPEAR, dir, damage);
1535                 break;
1536         case MS_DARKNESS:
1537 #ifdef JP
1538 msg_print("°Å°Ç¤ÎÃæ¤Ç¼ê¤ò¿¶¤Ã¤¿¡£");
1539 #else
1540                         msg_print("You gestures in shadow.");
1541 #endif
1542                 (void)unlite_area(10, 3);
1543                 break;
1544         case MS_MAKE_TRAP:
1545                 if (!target_set(TARGET_KILL)) return FALSE;
1546 #ifdef JP
1547 msg_print("¼öʸ¤ò¾§¤¨¤Æ¼Ù°­¤ËÈù¾Ð¤ó¤À¡£");
1548 #else
1549                         msg_print("You casts a spell and cackles evilly.");
1550 #endif
1551                 trap_creation(target_row, target_col);
1552                 break;
1553         case MS_FORGET:
1554 #ifdef JP
1555 msg_print("¤·¤«¤·²¿¤âµ¯¤­¤Ê¤«¤Ã¤¿¡£");
1556 #else
1557                         msg_print("Nothing happen.");
1558 #endif
1559                 break;
1560         case MS_RAISE_DEAD:
1561 #ifdef JP
1562 msg_print("»à¼ÔÉü³è¤Î¼öʸ¤ò¾§¤¨¤¿¡£");
1563 #else
1564                 msg_print("You casts a animate dead.");
1565 #endif
1566                 (void)animate_dead(0, py, px);
1567                 break;
1568         case MS_S_KIN:
1569         {
1570                 int k;
1571 #ifdef JP
1572 msg_print("±ç·³¤ò¾¤´­¤·¤¿¡£");
1573 #else
1574                         msg_print("You summons minions.");
1575 #endif
1576                 for (k = 0;k < 1; k++)
1577                 {
1578                         if (summon_kin_player(pet, summon_lev, py, px, FALSE))
1579                         {
1580                                 if (!pet)
1581 #ifdef JP
1582 msg_print("¾¤´Ô¤µ¤ì¤¿Ãç´Ö¤ÏÅܤäƤ¤¤ë¡ª");
1583 #else
1584 msg_print("Summoned fellows is angry!");
1585 #endif
1586                         }
1587                         else
1588                         {
1589                                 no_trump = TRUE;
1590                         }
1591                 }
1592                 break;
1593         }
1594         case MS_S_CYBER:
1595         {
1596                 int k;
1597 #ifdef JP
1598 msg_print("¥µ¥¤¥Ð¡¼¥Ç¡¼¥â¥ó¤ò¾¤´­¤·¤¿¡ª");
1599 #else
1600                         msg_print("You summons Cyberdemons!");
1601 #endif
1602                 for (k = 0 ;k < 1 ; k++)
1603                         if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_CYBER, FALSE, FALSE, pet, FALSE, not_pet))
1604                         {
1605                                 if (!pet)
1606 #ifdef JP
1607 msg_print("¾¤´Ô¤µ¤ì¤¿¥µ¥¤¥Ð¡¼¥Ç¡¼¥â¥ó¤ÏÅܤäƤ¤¤ë¡ª");
1608 #else
1609 msg_print("Summoned Cyberdemons are angry!");
1610 #endif
1611                         }
1612                         else
1613                         {
1614                                 no_trump = TRUE;
1615                         }
1616                 break;
1617         }
1618         case MS_S_MONSTER:
1619         {
1620                 int k;
1621 #ifdef JP
1622 msg_print("Ãç´Ö¤ò¾¤´­¤·¤¿¡£");
1623 #else
1624                         msg_print("You summons help.");
1625 #endif
1626                 for (k = 0;k < 1; k++)
1627                         if (summon_specific((pet ? -1 : 0), py, px, summon_lev, 0, FALSE, FALSE, pet, FALSE, not_pet))
1628                         {
1629                                 if (!pet)
1630 #ifdef JP
1631 msg_print("¾¤´Ô¤µ¤ì¤¿¥â¥ó¥¹¥¿¡¼¤ÏÅܤäƤ¤¤ë¡ª");
1632 #else
1633 msg_print("Summoned monster is angry!");
1634 #endif
1635                         }
1636                         else
1637                         {
1638                                 no_trump = TRUE;
1639                         }
1640                 break;
1641         }
1642         case MS_S_MONSTERS:
1643         {
1644                 int k;
1645 #ifdef JP
1646 msg_print("¥â¥ó¥¹¥¿¡¼¤ò¾¤´­¤·¤¿¡ª");
1647 #else
1648                         msg_print("You summons monsters!");
1649 #endif
1650                 for (k = 0;k < plev / 15 + 2; k++)
1651                         if(summon_specific((pet ? -1 : 0), py, px, summon_lev, 0, FALSE, FALSE, pet, unique_okay, not_pet))
1652                         {
1653                                 if (!pet)
1654 #ifdef JP
1655 msg_print("¾¤´Ô¤µ¤ì¤¿¥â¥ó¥¹¥¿¡¼¤ÏÅܤäƤ¤¤ë¡ª");
1656 #else
1657 msg_print("Summoned monsters are angry!");
1658 #endif
1659                         }
1660                         else
1661                         {
1662                                 no_trump = TRUE;
1663                         }
1664                 break;
1665         }
1666         case MS_S_ANT:
1667         {
1668                 int k;
1669 #ifdef JP
1670 msg_print("¥¢¥ê¤ò¾¤´­¤·¤¿¡£");
1671 #else
1672                         msg_print("You summons ants.");
1673 #endif
1674                 for (k = 0;k < 1; k++)
1675                         if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_ANT, TRUE, FALSE, pet, FALSE, not_pet))
1676                         {
1677                                 if (!pet)
1678 #ifdef JP
1679 msg_print("¾¤´Ô¤µ¤ì¤¿¥¢¥ê¤ÏÅܤäƤ¤¤ë¡ª");
1680 #else
1681 msg_print("Summoned ants are angry!");
1682 #endif
1683                         }
1684                         else
1685                         {
1686                                 no_trump = TRUE;
1687                         }
1688                 break;
1689         }
1690         case MS_S_SPIDER:
1691         {
1692                 int k;
1693 #ifdef JP
1694 msg_print("ÃØéá¤ò¾¤´­¤·¤¿¡£");
1695 #else
1696                         msg_print("You summons spiders.");
1697 #endif
1698                 for (k = 0;k < 1; k++)
1699                         if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_SPIDER, TRUE, FALSE, pet, FALSE, not_pet))
1700                         {
1701                                 if (!pet)
1702 #ifdef JP
1703 msg_print("¾¤´Ô¤µ¤ì¤¿ÃØéá¤ÏÅܤäƤ¤¤ë¡ª");
1704 #else
1705 msg_print("Summoned spiders are angry!");
1706 #endif
1707                         }
1708                         else
1709                         {
1710                                 no_trump = TRUE;
1711                         }
1712                 break;
1713         }
1714         case MS_S_HOUND:
1715         {
1716                 int k;
1717 #ifdef JP
1718 msg_print("¥Ï¥¦¥ó¥É¤ò¾¤´­¤·¤¿¡£");
1719 #else
1720                         msg_print("You summons hounds.");
1721 #endif
1722                 for (k = 0;k < 1; k++)
1723                         if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_HOUND, TRUE, FALSE, pet, FALSE, not_pet))
1724                         {
1725                                 if (!pet)
1726 #ifdef JP
1727 msg_print("¾¤´Ô¤µ¤ì¤¿¥Ï¥¦¥ó¥É¤ÏÅܤäƤ¤¤ë¡ª");
1728 #else
1729 msg_print("Summoned hounds are angry!");
1730 #endif
1731                         }
1732                         else
1733                         {
1734                                 no_trump = TRUE;
1735                         }
1736                 break;
1737         }
1738         case MS_S_HYDRA:
1739         {
1740                 int k;
1741 #ifdef JP
1742 msg_print("¥Ò¥É¥é¤ò¾¤´­¤·¤¿¡£");
1743 #else
1744                         msg_print("You summons hydras.");
1745 #endif
1746                 for (k = 0;k < 1; k++)
1747                         if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_HYDRA, not_pet, FALSE, pet, FALSE, not_pet))
1748                         {
1749                                 if (!pet)
1750 #ifdef JP
1751 msg_print("¾¤´Ô¤µ¤ì¤¿¥Ò¥É¥é¤ÏÅܤäƤ¤¤ë¡ª");
1752 #else
1753 msg_print("Summoned hydras are angry!");
1754 #endif
1755                         }
1756                         else
1757                         {
1758                                 no_trump = TRUE;
1759                         }
1760                 break;
1761         }
1762         case MS_S_ANGEL:
1763         {
1764                 int k;
1765 #ifdef JP
1766 msg_print("Å·»È¤ò¾¤´­¤·¤¿¡ª");
1767 #else
1768                         msg_print("You summons angel!");
1769 #endif
1770                 for (k = 0;k < 1; k++)
1771                         if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_ANGEL, not_pet, FALSE, pet, FALSE, not_pet))
1772                         {
1773                                 if (!pet)
1774 #ifdef JP
1775 msg_print("¾¤´Ô¤µ¤ì¤¿Å·»È¤ÏÅܤäƤ¤¤ë¡ª");
1776 #else
1777 msg_print("Summoned angel is angry!");
1778 #endif
1779                         }
1780                         else
1781                         {
1782                                 no_trump = TRUE;
1783                         }
1784                 break;
1785         }
1786         case MS_S_DEMON:
1787         {
1788                 int k;
1789 #ifdef JP
1790 msg_print("º®Æ٤εÜÄ¤é°­Ëâ¤ò¾¤´­¤·¤¿¡ª");
1791 #else
1792                         msg_print("You summons a demon from the Courts of Chaos!");
1793 #endif
1794                 for (k = 0;k < 1; k++)
1795                         if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_DEMON, not_pet, FALSE, pet, FALSE, not_pet))
1796                         {
1797                                 if (!pet)
1798 #ifdef JP
1799 msg_print("¾¤´Ô¤µ¤ì¤¿¥Ç¡¼¥â¥ó¤ÏÅܤäƤ¤¤ë¡ª");
1800 #else
1801 msg_print("Summoned demon is angry!");
1802 #endif
1803                         }
1804                         else
1805                         {
1806                                 no_trump = TRUE;
1807                         }
1808                 break;
1809         }
1810         case MS_S_UNDEAD:
1811         {
1812                 int k;
1813 #ifdef JP
1814 msg_print("¥¢¥ó¥Ç¥Ã¥É¤Î¶¯Å¨¤ò¾¤´­¤·¤¿¡ª");
1815 #else
1816                         msg_print("You summons an undead adversary!");
1817 #endif
1818                 for (k = 0;k < 1; k++)
1819                         if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_UNDEAD, not_pet, FALSE, pet, FALSE, not_pet))
1820                         {
1821                                 if (!pet)
1822 #ifdef JP
1823 msg_print("¾¤´Ô¤µ¤ì¤¿¥¢¥ó¥Ç¥Ã¥É¤ÏÅܤäƤ¤¤ë¡ª");
1824 #else
1825 msg_print("Summoned undead is angry!");
1826 #endif
1827                         }
1828                         else
1829                         {
1830                                 no_trump = TRUE;
1831                         }
1832                 break;
1833         }
1834         case MS_S_DRAGON:
1835         {
1836                 int k;
1837 #ifdef JP
1838 msg_print("¥É¥é¥´¥ó¤ò¾¤´­¤·¤¿¡ª");
1839 #else
1840                         msg_print("You summons dragon!");
1841 #endif
1842                 for (k = 0;k < 1; k++)
1843                         if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_DRAGON, not_pet, FALSE, pet, FALSE, not_pet))
1844                         {
1845                                 if (!pet)
1846 #ifdef JP
1847 msg_print("¾¤´Ô¤µ¤ì¤¿¥É¥é¥´¥ó¤ÏÅܤäƤ¤¤ë¡ª");
1848 #else
1849 msg_print("Summoned dragon is angry!");
1850 #endif
1851                         }
1852                         else
1853                         {
1854                                 no_trump = TRUE;
1855                         }
1856                 break;
1857         }
1858         case MS_S_HI_UNDEAD:
1859         {
1860                 int k;
1861 #ifdef JP
1862 msg_print("¶¯ÎϤʥ¢¥ó¥Ç¥Ã¥É¤ò¾¤´­¤·¤¿¡ª");
1863 #else
1864                         msg_print("You summons greater undead!");
1865 #endif
1866                 for (k = 0;k < 1; k++)
1867                         if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_HI_UNDEAD, not_pet, FALSE, pet, unique_okay, not_pet))
1868                         {
1869                                 if (!pet)
1870 #ifdef JP
1871 msg_print("¾¤´Ô¤µ¤ì¤¿¾åµé¥¢¥ó¥Ç¥Ã¥É¤ÏÅܤäƤ¤¤ë¡ª");
1872 #else
1873 msg_print("Summoned greater undead is angry!");
1874 #endif
1875                         }
1876                         else
1877                         {
1878                                 no_trump = TRUE;
1879                         }
1880                 break;
1881         }
1882         case MS_S_HI_DRAGON:
1883         {
1884                 int k;
1885 #ifdef JP
1886 msg_print("¸ÅÂå¥É¥é¥´¥ó¤ò¾¤´­¤·¤¿¡ª");
1887 #else
1888                         msg_print("You summons ancient dragons!");
1889 #endif
1890                 for (k = 0;k < 1; k++)
1891                         if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_HI_DRAGON, not_pet, FALSE, pet, unique_okay, not_pet))
1892                         {
1893                                 if (!pet)
1894 #ifdef JP
1895 msg_print("¾¤´Ô¤µ¤ì¤¿¸ÅÂå¥É¥é¥´¥ó¤ÏÅܤäƤ¤¤ë¡ª");
1896 #else
1897 msg_print("Summoned ancient dragon is angry!");
1898 #endif
1899                         }
1900                         else
1901                         {
1902                                 no_trump = TRUE;
1903                         }
1904                 break;
1905         }
1906         case MS_S_AMBERITE:
1907         {
1908                 int k;
1909 #ifdef JP
1910 msg_print("¥¢¥ó¥Ð¡¼¤Î²¦¤ò¾¤´­¤·¤¿¡ª");
1911 #else
1912                         msg_print("You summons Lords of Amber!");
1913 #endif
1914                 for (k = 0;k < 1; k++)
1915                         if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_AMBERITES, not_pet, FALSE, pet, unique_okay, not_pet))
1916                         {
1917                                 if (!pet)
1918 #ifdef JP
1919 msg_print("¾¤´Ô¤µ¤ì¤¿¥¢¥ó¥Ð¡¼¤Î²¦¤ÏÅܤäƤ¤¤ë¡ª");
1920 #else
1921 msg_print("Summoned Lords of Amber are angry!");
1922 #endif
1923                         }
1924                         else
1925                         {
1926                                 no_trump = TRUE;
1927                         }
1928                 break;
1929         }
1930         case MS_S_UNIQUE:
1931         {
1932                 int k, count = 0;
1933 #ifdef JP
1934 msg_print("ÆÃÊ̤ʶ¯Å¨¤ò¾¤´­¤·¤¿¡ª");
1935 #else
1936                         msg_print("You summons special opponents!");
1937 #endif
1938                 for (k = 0;k < 1; k++)
1939                         if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_UNIQUE, not_pet, FALSE, pet, TRUE, not_pet))
1940                         {
1941                                 count++;
1942                                 if (!pet)
1943 #ifdef JP
1944 msg_print("¾¤´Ô¤µ¤ì¤¿¥æ¥Ë¡¼¥¯¡¦¥â¥ó¥¹¥¿¡¼¤ÏÅܤäƤ¤¤ë¡ª");
1945 #else
1946 msg_print("Summoned special opponents are angry!");
1947 #endif
1948                         }
1949                 for (k = count;k < 1; k++)
1950                         if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_HI_UNDEAD, not_pet, FALSE, pet, TRUE, not_pet))
1951                         {
1952                                 count++;
1953                                 if (!pet)
1954 #ifdef JP
1955 msg_print("¾¤´Ô¤µ¤ì¤¿¾åµé¥¢¥ó¥Ç¥Ã¥É¤ÏÅܤäƤ¤¤ë¡ª");
1956 #else
1957 msg_print("Summoned greater undead are angry!");
1958 #endif
1959                         }
1960                 if (!count)
1961                 {
1962                         no_trump = TRUE;
1963                 }
1964                 break;
1965         }
1966         default:
1967                 msg_print("hoge?");
1968         }
1969         if (no_trump)
1970         {
1971 #ifdef JP
1972 msg_print("²¿¤â¸½¤ì¤Ê¤«¤Ã¤¿¡£");
1973 #else
1974 msg_print("No one have appeared.");
1975 #endif
1976         }
1977
1978         return TRUE;
1979 }
1980
1981
1982 /*
1983  * do_cmd_cast calls this function if the player's class
1984  * is 'Blue-Mage'.
1985  */
1986 bool do_cmd_cast_learned(void)
1987 {
1988         int             n = 0;
1989         int             chance;
1990         int             minfail = 0;
1991         int             plev = p_ptr->lev;
1992         monster_power   spell;
1993         bool            cast;
1994         int             shouhimana;
1995
1996
1997         /* not if confused */
1998         if (p_ptr->confused)
1999         {
2000 #ifdef JP
2001 msg_print("º®Í𤷤Ƥ¤¤Æ¾§¤¨¤é¤ì¤Ê¤¤¡ª");
2002 #else
2003                 msg_print("You are too confused!");
2004 #endif
2005
2006                 return TRUE;
2007         }
2008
2009         /* get power */
2010         if (!get_learned_power(&n)) return FALSE;
2011
2012         spell = monster_powers[n];
2013
2014         shouhimana = spell.smana;
2015
2016         if (p_ptr->dec_mana)
2017         {
2018                 shouhimana = (shouhimana + 1) * 3 / 4;
2019         }
2020
2021         /* Verify "dangerous" spells */
2022         if (shouhimana > p_ptr->csp)
2023         {
2024                 /* Warning */
2025 #ifdef JP
2026 msg_print("£Í£Ð¤¬Â­¤ê¤Þ¤»¤ó¡£");
2027 #else
2028                 msg_print("You do not have enough mana to use this power.");
2029 #endif
2030
2031
2032                 if (!over_exert) return FALSE;
2033
2034                 /* Verify */
2035 #ifdef JP
2036 if (!get_check("¤½¤ì¤Ç¤âÄ©À路¤Þ¤¹¤«? ")) return FALSE;
2037 #else
2038                 if (!get_check("Attempt it anyway? ")) return FALSE;
2039 #endif
2040
2041         }
2042
2043         /* Spell failure chance */
2044         chance = spell.fail;
2045
2046         /* Reduce failure rate by "effective" level adjustment */
2047         if (plev > spell.level) chance -= 3 * (plev - spell.level);
2048         else chance += (spell.level - plev);
2049
2050         if (p_ptr->pseikaku == SEIKAKU_NAMAKE) chance += 10;
2051         if (p_ptr->pseikaku == SEIKAKU_KIREMONO) chance -= 3;
2052         if ((p_ptr->pseikaku == SEIKAKU_GAMAN) || (p_ptr->pseikaku == SEIKAKU_CHIKARA)) chance++;
2053
2054         /* Reduce failure rate by INT/WIS adjustment */
2055         chance -= 3 * (adj_mag_stat[p_ptr->stat_ind[A_INT]] - 1);
2056
2057         if (p_ptr->heavy_spell) chance += 20;
2058         if(p_ptr->dec_mana && p_ptr->easy_spell) chance-=4;
2059         else if (p_ptr->easy_spell) chance-=3;
2060         else if (p_ptr->dec_mana) chance-=2;
2061
2062         /* Not enough mana to cast */
2063         if (shouhimana > p_ptr->csp)
2064         {
2065                 chance += 5 * (shouhimana - p_ptr->csp);
2066         }
2067
2068         /* Extract the minimum failure rate */
2069         minfail = adj_mag_fail[p_ptr->stat_ind[A_INT]];
2070
2071         /* Minimum failure rate */
2072         if (chance < minfail) chance = minfail;
2073
2074         /* Stunning makes spells harder */
2075         if (p_ptr->stun > 50) chance += 25;
2076         else if (p_ptr->stun) chance += 15;
2077
2078         /* Always a 5 percent chance of working */
2079         if (chance > 95) chance = 95;
2080
2081         if(p_ptr->dec_mana) chance--;
2082         if (p_ptr->heavy_spell) chance += 5;
2083         chance = MAX(chance,0);
2084
2085         /* Failed spell */
2086         if (rand_int(100) < chance)
2087         {
2088                 if (flush_failure) flush();
2089 #ifdef JP
2090 msg_print("ËâË¡¤ò¤¦¤Þ¤¯¾§¤¨¤é¤ì¤Ê¤«¤Ã¤¿¡£");
2091 #else
2092                 msg_print("You failed to concentrate hard enough!");
2093 #endif
2094
2095                 sound(SOUND_FAIL);
2096
2097                 if (n >= MS_S_KIN)
2098                         /* Cast the spell */
2099                         cast = cast_learned_spell(n, FALSE);
2100         }
2101         else
2102         {
2103                 sound(SOUND_ZAP);
2104
2105                 /* Cast the spell */
2106                 cast = cast_learned_spell(n, TRUE);
2107
2108                 if (!cast) return FALSE;
2109         }
2110
2111         /* Sufficient mana */
2112         if (shouhimana <= p_ptr->csp)
2113         {
2114                 /* Use some mana */
2115                 p_ptr->csp -= shouhimana;
2116         }
2117         else
2118         {
2119                 int oops = shouhimana;
2120
2121                 /* No mana left */
2122                 p_ptr->csp = 0;
2123                 p_ptr->csp_frac = 0;
2124
2125                 /* Message */
2126 #ifdef JP
2127 msg_print("Àº¿À¤ò½¸Ã椷¤¹¤®¤Æµ¤¤ò¼º¤Ã¤Æ¤·¤Þ¤Ã¤¿¡ª");
2128 #else
2129                 msg_print("You faint from the effort!");
2130 #endif
2131
2132
2133                 /* Hack -- Bypass free action */
2134                 (void)set_paralyzed(p_ptr->paralyzed + randint(5 * oops + 1));
2135
2136                 chg_virtue(V_KNOWLEDGE, -10);
2137
2138                 /* Damage CON (possibly permanently) */
2139                 if (rand_int(100) < 50)
2140                 {
2141                         bool perm = (rand_int(100) < 25);
2142
2143                         /* Message */
2144 #ifdef JP
2145 msg_print("ÂΤò°­¤¯¤·¤Æ¤·¤Þ¤Ã¤¿¡ª");
2146 #else
2147                         msg_print("You have damaged your health!");
2148 #endif
2149
2150
2151                         /* Reduce constitution */
2152                         (void)dec_stat(A_CON, 15 + randint(10), perm);
2153                 }
2154         }
2155
2156         /* Take a turn */
2157         energy_use = 100;
2158
2159         /* Window stuff */
2160         p_ptr->redraw |= (PR_MANA);
2161         p_ptr->window |= (PW_PLAYER);
2162         p_ptr->window |= (PW_SPELL);
2163
2164         return TRUE;
2165 }
2166
2167 void learn_spell(int monspell)
2168 {
2169         if (p_ptr->action != ACTION_LEARN) return;
2170         if (p_ptr->magic_num2[monspell]) return;
2171         if (p_ptr->confused || p_ptr->blind || p_ptr->image || p_ptr->stun || p_ptr->paralyzed) return;
2172         if (randint(p_ptr->lev + 70) > monster_powers[monspell].level + 40)
2173         {
2174                 p_ptr->magic_num2[monspell] = 1;
2175 #ifdef JP
2176                 msg_format("%s¤ò³Ø½¬¤·¤¿¡ª", monster_powers[monspell].name);
2177 #else
2178                 msg_format("You have learned %s!", monster_powers[monspell].name);
2179 #endif
2180                 gain_exp(monster_powers[monspell].level * monster_powers[monspell].smana);
2181
2182                 /* Sound */
2183                 sound(SOUND_STUDY);
2184
2185                 new_mane = TRUE;
2186                 p_ptr->redraw |= (PR_STATE);
2187         }
2188 }