OSDN Git Service

Initial revision
[hengband/hengband.git] / src / cmd5.c
1 /* File: cmd5.c */
2
3 /* Purpose: Spell/Prayer commands */
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 #include "spellstips.h"
16
17 cptr spell_categoly_name(int tval)
18 {
19         switch (tval)
20         {
21 #ifdef JP
22         case TV_HISSATSU_BOOK:
23                 return "ɬ»¦µ»";
24         case TV_LIFE_BOOK:
25                 return "µ§¤ê";
26         case TV_MUSIC_BOOK:
27                 return "²Î";
28         default:
29                 return "¼öʸ";
30 #else
31         case TV_HISSATSU_BOOK:
32                 return "arts";
33         case TV_LIFE_BOOK:
34                 return "prayer";
35         case TV_MUSIC_BOOK:
36                 return "song";
37         default:
38                 return "spell";
39 #endif
40         }
41 }
42
43 /*
44  * Allow user to choose a spell/prayer from the given book.
45  *
46  * If a valid spell is chosen, saves it in '*sn' and returns TRUE
47  * If the user hits escape, returns FALSE, and set '*sn' to -1
48  * If there are no legal choices, returns FALSE, and sets '*sn' to -2
49  *
50  * The "prompt" should be "cast", "recite", or "study"
51  * The "known" should be TRUE for cast/pray, FALSE for study
52  */
53
54 bool select_spellbook=FALSE;
55 bool select_the_force=FALSE;
56
57 static int get_spell(int *sn, cptr prompt, int sval, bool learned, int use_realm)
58 {
59         int         i;
60         int         spell = -1;
61         int         num = 0;
62         int         ask = TRUE;
63         int         shouhimana;
64         byte        spells[64];
65         bool        flag, redraw, okay;
66         char        choice;
67         magic_type  *s_ptr;
68         char        out_val[160];
69         cptr        p;
70 #ifdef JP
71         unsigned char jverb_buf[128];
72 #endif
73         int menu_line = (use_menu ? 1 : 0);
74
75 #ifdef ALLOW_REPEAT /* TNB */
76
77         /* Get the spell, if available */
78         if (repeat_pull(sn))
79         {
80                 /* Verify the spell */
81                 if (spell_okay(*sn, learned, FALSE, use_realm - 1))
82                 {
83                         /* Success */
84                         return (TRUE);
85                 }
86         }
87
88 #endif /* ALLOW_REPEAT -- TNB */
89
90         p = spell_categoly_name(mp_ptr->spell_book);
91
92         /* Extract spells */
93         for (spell = 0; spell < 32; spell++)
94         {
95                 /* Check for this spell */
96                 if ((fake_spell_flags[sval] & (1L << spell)))
97                 {
98                         /* Collect this spell */
99                         spells[num++] = spell;
100                 }
101         }
102
103         /* Assume no usable spells */
104         okay = FALSE;
105
106         /* Assume no spells available */
107         (*sn) = -2;
108
109         /* Check for "okay" spells */
110         for (i = 0; i < num; i++)
111         {
112                 /* Look for "okay" spells */
113                 if (spell_okay(spells[i], learned, FALSE, use_realm - 1)) okay = TRUE;
114         }
115
116         /* No "okay" spells */
117         if (!okay) return (FALSE);
118         if (((use_realm) != p_ptr->realm1) && ((use_realm) != p_ptr->realm2) && (p_ptr->pclass != CLASS_SORCERER) && (p_ptr->pclass != CLASS_RED_MAGE)) return FALSE;
119         if (((p_ptr->pclass == CLASS_SORCERER) || (p_ptr->pclass == CLASS_RED_MAGE)) && !is_magic(use_realm)) return FALSE;
120         if ((p_ptr->pclass == CLASS_RED_MAGE) && ((use_realm) != REALM_ARCANE) && (sval > 1)) return FALSE;
121
122         /* Assume cancelled */
123         *sn = (-1);
124
125         /* Nothing chosen yet */
126         flag = FALSE;
127
128         /* No redraw yet */
129         redraw = FALSE;
130
131         /* Show choices */
132         if (show_choices)
133         {
134                 /* Update */
135                 p_ptr->window |= (PW_SPELL);
136
137                 /* Window stuff */
138                 window_stuff();
139         }
140
141         /* Build a prompt (accept all spells) */
142 #ifdef JP
143         jverb1( prompt, jverb_buf );
144         (void) strnfmt(out_val, 78, "(%^s:%c-%c, '*'¤Ç°ìÍ÷, ESC¤ÇÃæÃÇ) ¤É¤Î%s¤ò%^s¤Þ¤¹¤«? ",
145                 p, I2A(0), I2A(num - 1), p, jverb_buf );
146 #else
147         (void)strnfmt(out_val, 78, "(%^ss %c-%c, *=List, ESC=exit) %^s which %s? ",
148                 p, I2A(0), I2A(num - 1), prompt, p);
149 #endif
150
151         /* Get a spell from the user */
152
153         choice = (always_show_list || use_menu) ? ESCAPE:1;
154         while (!flag)
155         {
156                 if( choice==ESCAPE ) choice = ' '; 
157                 else if( !get_com(out_val, &choice, TRUE) )break; 
158
159                 if (use_menu && choice != ' ')
160                 {
161                         switch(choice)
162                         {
163                                 case '0':
164                                 {
165                                         screen_load();
166                                         return (FALSE);
167                                         break;
168                                 }
169
170                                 case '8':
171                                 case 'k':
172                                 case 'K':
173                                 {
174                                         menu_line += (num - 1);
175                                         break;
176                                 }
177
178                                 case '2':
179                                 case 'j':
180                                 case 'J':
181                                 {
182                                         menu_line++;
183                                         break;
184                                 }
185
186                                 case 'x':
187                                 case 'X':
188                                 case '\r':
189                                 {
190                                         i = menu_line - 1;
191                                         ask = FALSE;
192                                         break;
193                                 }
194                         }
195                         if (menu_line > num) menu_line -= num;
196                         /* Display a list of spells */
197                         print_spells(menu_line, spells, num, 1, 15, use_realm - 1);
198                         if (ask) continue;
199                 }
200                 else
201                 {
202                         /* Request redraw */
203                         if ((choice == ' ') || (choice == '*') || (choice == '?'))
204                         {
205                                 /* Show the list */
206                                 if (!redraw)
207                                 {
208                                         /* Show list */
209                                         redraw = TRUE;
210
211                                         /* Save the screen */
212                                         screen_save();
213
214                                         /* Display a list of spells */
215                                         print_spells(menu_line, spells, num, 1, 15, use_realm - 1);
216                                 }
217
218                                 /* Hide the list */
219                                 else
220                                 {
221                                         if (use_menu) continue;
222
223                                         /* Hide list */
224                                         redraw = FALSE;
225
226                                         /* Restore the screen */
227                                         screen_load();
228                                 }
229
230                                 /* Redo asking */
231                                 continue;
232                         }
233
234
235                         /* Note verify */
236                         ask = (isupper(choice));
237
238                         /* Lowercase */
239                         if (ask) choice = tolower(choice);
240
241                         /* Extract request */
242                         i = (islower(choice) ? A2I(choice) : -1);
243                 }
244
245                 /* Totally Illegal */
246                 if ((i < 0) || (i >= num))
247                 {
248                         bell();
249                         continue;
250                 }
251
252                 /* Save the spell index */
253                 spell = spells[i];
254
255                 /* Require "okay" spells */
256                 if (!spell_okay(spell, learned, FALSE, use_realm - 1))
257                 {
258                         bell();
259 #ifdef JP
260                         msg_format("¤½¤Î%s¤ò%s¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£", p, prompt);
261 #else
262                         msg_format("You may not %s that %s.", prompt, p);
263 #endif
264
265                         continue;
266                 }
267
268                 /* Verify it */
269                 if (ask)
270                 {
271                         char tmp_val[160];
272
273                         /* Access the spell */
274                         if (!is_magic(use_realm))
275                         {
276                                 s_ptr = &technic_info[use_realm - MIN_TECHNIC - 1][spell];
277                         }
278                         else
279                         {
280                                 s_ptr = &mp_ptr->info[use_realm - 1][spell % 32];
281                         }
282
283                         if (use_realm == REALM_HISSATSU)
284                         {
285                                 shouhimana = s_ptr->smana;
286                         }
287                         else
288                         {
289                                 if (p_ptr->pclass == CLASS_SORCERER)
290                                         shouhimana = s_ptr->smana*2200 + 2399;
291                                 else if (p_ptr->pclass == CLASS_RED_MAGE)
292                                         shouhimana = s_ptr->smana*2600 + 2399;
293                                 else
294                                         shouhimana = (s_ptr->smana*(3800-spell_exp[spell])+2399);
295                                 if(p_ptr->dec_mana)
296                                         shouhimana *= 3;
297                                 else shouhimana *= 4;
298                                 shouhimana /= 9600;
299                                 if(shouhimana < 1) shouhimana = 1;
300                         }
301
302                         /* Prompt */
303 #ifdef JP
304                         jverb1( prompt, jverb_buf );
305                         /* ±ÑÆüÀÚ¤êÂؤ¨µ¡Ç½¤ËÂбþ */
306                         (void) strnfmt(tmp_val, 78, "%s(MP%d, ¼ºÇÔΨ%d%%)¤ò%s¤Þ¤¹¤«? ",
307                                 spell_names[technic2magic(use_realm)-1][spell % 32], shouhimana,
308                                        spell_chance(spell, use_realm -1),jverb_buf);
309 #else
310                         (void)strnfmt(tmp_val, 78, "%^s %s (%d mana, %d%% fail)? ",
311                                 prompt, spell_names[technic2magic(use_realm)-1][spell % 32], shouhimana,
312                                 spell_chance(spell, use_realm - 1));
313 #endif
314
315
316                         /* Belay that order */
317                         if (!get_check(tmp_val)) continue;
318                 }
319
320                 /* Stop the loop */
321                 flag = TRUE;
322         }
323
324
325         /* Restore the screen */
326         if (redraw) screen_load();
327
328
329         /* Show choices */
330         if (show_choices)
331         {
332                 /* Update */
333                 p_ptr->window |= (PW_SPELL);
334
335                 /* Window stuff */
336                 window_stuff();
337         }
338
339
340         /* Abort if needed */
341         if (!flag) return (FALSE);
342
343         /* Save the choice */
344         (*sn) = spell;
345
346 #ifdef ALLOW_REPEAT /* TNB */
347
348         repeat_push(*sn);
349
350 #endif /* ALLOW_REPEAT -- TNB */
351
352         /* Success */
353         return (TRUE);
354 }
355
356
357 static bool item_tester_learn_spell(object_type *o_ptr)
358 {
359         s32b choices = realm_choices2[p_ptr->pclass];
360
361         if (p_ptr->pclass == CLASS_PRIEST)
362         {
363                 if (p_ptr->realm1 == REALM_LIFE)
364                 {
365                         choices &= ~(CH_DEATH | CH_DAEMON);
366                 }
367                 else if ((p_ptr->realm1 == REALM_DEATH) || (p_ptr->realm1 == REALM_DAEMON))
368                 {
369                         choices &= ~(CH_LIFE);
370                 }
371         }
372
373         if ((o_ptr->tval < TV_LIFE_BOOK) || (o_ptr->tval > (TV_LIFE_BOOK + MAX_REALM - 1))) return (FALSE);
374         if ((o_ptr->tval == TV_MUSIC_BOOK) && (p_ptr->pclass == CLASS_BARD)) return (TRUE);
375         else if (!is_magic(tval2realm(o_ptr->tval))) return FALSE;
376         if ((REALM1_BOOK == o_ptr->tval) || (REALM2_BOOK == o_ptr->tval)) return (TRUE);
377         if (choices & (0x0001 << (tval2realm(o_ptr->tval) - 1))) return (TRUE);
378         return (FALSE);
379 }
380
381
382 /*
383  * Peruse the spells/prayers in a book
384  *
385  * Note that *all* spells in the book are listed
386  *
387  * Note that browsing is allowed while confused or blind,
388  * and in the dark, primarily to allow browsing in stores.
389  */
390 void do_cmd_browse(void)
391 {
392         int             item, sval, use_realm = 0, j, line;
393         int             spell = -1;
394         int             num = 0;
395         int             increment = 0;
396
397         byte            spells[64];
398         char            temp[62*4];
399
400         object_type     *o_ptr;
401         magic_type      *s_ptr;
402
403         cptr q, s;
404
405         /* Warriors are illiterate */
406         if (!(p_ptr->realm1 || p_ptr->realm2) && (p_ptr->pclass != CLASS_SORCERER) && (p_ptr->pclass != CLASS_RED_MAGE))
407         {
408 #ifdef JP
409 msg_print("ËܤòÆɤळ¤È¤¬¤Ç¤­¤Ê¤¤¡ª");
410 #else
411                 msg_print("You cannot read books!");
412 #endif
413
414                 return;
415         }
416
417         if (p_ptr->special_defense & KATA_MUSOU)
418         {
419                 set_action(ACTION_NONE);
420         }
421
422         /* Restrict choices to "useful" books */
423         if (p_ptr->realm2 == REALM_NONE) item_tester_tval = mp_ptr->spell_book;
424         else item_tester_hook = item_tester_learn_spell;
425
426         /* Get an item */
427 #ifdef JP
428 q = "¤É¤ÎËܤòÆɤߤޤ¹¤«? ";
429 #else
430         q = "Browse which book? ";
431 #endif
432
433 #ifdef JP
434 s = "Æɤá¤ëËܤ¬¤Ê¤¤¡£";
435 #else
436         s = "You have no books that you can read.";
437 #endif
438
439         select_spellbook=TRUE;
440         if (p_ptr->pclass == CLASS_FORCETRAINER)
441                 select_the_force = TRUE;
442         if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))){
443             select_spellbook = FALSE;
444             select_the_force = FALSE;
445             return;
446         }
447         select_spellbook = FALSE;
448         select_the_force = FALSE;
449
450         if (item == 1111) { /* the_force */
451             do_cmd_mind_browse();
452             return;
453         } else
454         /* Get the item (in the pack) */
455         if (item >= 0)
456         {
457                 o_ptr = &inventory[item];
458         }
459
460         /* Get the item (on the floor) */
461         else
462         {
463                 o_ptr = &o_list[0 - item];
464         }
465
466 #ifdef USE_SCRIPT
467         if (object_browse_callback(o_ptr)) return;
468 #endif /* USE_SCRIPT */
469
470         /* Access the item's sval */
471         sval = o_ptr->sval;
472
473         use_realm = tval2realm(o_ptr->tval);
474         if ((p_ptr->pclass != CLASS_SORCERER) && (p_ptr->pclass != CLASS_RED_MAGE) && is_magic(use_realm))
475         {
476                 if (o_ptr->tval == REALM2_BOOK) increment = 32;
477                 else if (o_ptr->tval != REALM1_BOOK) increment = 64;
478         }
479
480         /* Track the object kind */
481         object_kind_track(o_ptr->k_idx);
482
483         /* Hack -- Handle stuff */
484         handle_stuff();
485
486
487         /* Extract spells */
488         for (spell = 0; spell < 32; spell++)
489         {
490                 /* Check for this spell */
491                 if ((fake_spell_flags[sval] & (1L << spell)))
492                 {
493                         /* Collect this spell */
494                         spells[num++] = spell;
495                 }
496         }
497
498
499         /* Save the screen */
500         screen_save();
501
502         /* Clear the top line */
503         prt("", 0, 0);
504
505         /* Keep browsing spells.  Exit browsing on cancel. */
506         while(TRUE)
507         {
508                 /* Ask for a spell, allow cancel */
509 #ifdef JP
510                 if (!get_spell(&spell, "Æɤà", o_ptr->sval, TRUE, use_realm))
511 #else
512                 if (!get_spell(&spell, "browse", o_ptr->sval, TRUE, use_realm))
513 #endif
514                 {
515                         /* If cancelled, leave immediately. */
516                         if (spell == -1) break;
517
518                         /* Display a list of spells */
519                         print_spells(0, spells, num, 1, 15, use_realm - 1);
520
521                         /* Notify that there's nothing to see, and wait. */
522                         if (use_realm == REALM_HISSATSU)
523 #ifdef JP
524                                 prt("Æɤá¤ëµ»¤¬¤Ê¤¤¡£", 0, 0);
525 #else
526                                 prt("No techniques to browse.", 0, 0);
527 #endif
528                         else
529 #ifdef JP
530                                 prt("Æɤá¤ë¼öʸ¤¬¤Ê¤¤¡£", 0, 0);
531 #else
532                                 prt("No spells to browse.", 0, 0);
533 #endif
534                         (void)inkey();
535                         
536
537                         /* Restore the screen */
538                         screen_load();
539
540                         return;
541                 }                                 
542
543                 /* Clear lines, position cursor  (really should use strlen here) */
544                 Term_erase(14, 14, 255);
545                 Term_erase(14, 13, 255);
546                 Term_erase(14, 12, 255);
547                 Term_erase(14, 11, 255);
548
549                 /* Access the spell */
550                 if (!is_magic(use_realm))
551                 {
552                         s_ptr = &technic_info[use_realm - MIN_TECHNIC - 1][spell];
553                 }
554                 else
555                 {
556                         s_ptr = &mp_ptr->info[use_realm - 1][spell];
557                 }
558
559                 roff_to_buf( spell_tips[technic2magic(use_realm)-1][spell] ,62,temp);
560                 for(j=0, line = 11;temp[j];j+=(1+strlen(&temp[j])))
561                 {
562                         prt(&temp[j], line, 15);
563                         line++;
564                 }
565         }
566
567         /* Restore the screen */
568         screen_load();
569 }
570
571
572 static void change_realm2(int next_realm)
573 {
574         int i, j=0;
575         char tmp[80];
576
577         for (i = 0; i < 64; i++)
578         {
579                 spell_order[j] = spell_order[i];
580                 if(spell_order[i] < 32) j++;
581         }
582         for (; j < 64; j++)
583                 spell_order[j] = 99;
584
585         for (i = 32; i < 64; i++)
586         {
587                 spell_exp[i] = 0;
588         }
589         spell_learned2 = 0L;
590         spell_worked2 = 0L;
591         spell_forgotten2 = 0L;  
592
593 #ifdef JP
594         sprintf(tmp,"ËâË¡¤ÎÎΰè¤ò%s¤«¤é%s¤ËÊѹ¹¤·¤¿¡£", realm_names[p_ptr->realm2], realm_names[next_realm]);
595 #else
596         sprintf(tmp,"change magic realm from %s to %s.", realm_names[p_ptr->realm2], realm_names[next_realm]);
597 #endif
598         do_cmd_write_nikki(NIKKI_BUNSHOU, 0, tmp);
599         p_ptr->old_realm |= 1 << (p_ptr->realm2-1);
600         p_ptr->realm2 = next_realm;
601
602         p_ptr->notice |= (PN_REORDER);
603         p_ptr->update |= (PU_SPELLS);
604         handle_stuff();
605 }
606
607
608 /*
609  * Study a book to gain a new spell/prayer
610  */
611 void do_cmd_study(void)
612 {
613         int     i, item, sval;
614         int     increment = 0;
615         bool    learned = FALSE;
616
617         /* Spells of realm2 will have an increment of +32 */
618         int     spell = -1;
619
620         cptr p = spell_categoly_name(mp_ptr->spell_book);
621
622         object_type *o_ptr;
623
624         cptr q, s;
625
626         if (!p_ptr->realm1)
627         {
628 #ifdef JP
629 msg_print("ËܤòÆɤळ¤È¤¬¤Ç¤­¤Ê¤¤¡ª");
630 #else
631                 msg_print("You cannot read books!");
632 #endif
633
634                 return;
635         }
636
637         if (p_ptr->blind || no_lite())
638         {
639 #ifdef JP
640 msg_print("Ìܤ¬¸«¤¨¤Ê¤¤¡ª");
641 #else
642                 msg_print("You cannot see!");
643 #endif
644
645                 return;
646         }
647
648         if (p_ptr->confused)
649         {
650 #ifdef JP
651 msg_print("º®Í𤷤Ƥ¤¤ÆÆɤá¤Ê¤¤¡ª");
652 #else
653                 msg_print("You are too confused!");
654 #endif
655
656                 return;
657         }
658
659         if (!(p_ptr->new_spells))
660         {
661 #ifdef JP
662 msg_format("¿·¤·¤¤%s¤ò³Ð¤¨¤ë¤³¤È¤Ï¤Ç¤­¤Ê¤¤¡ª", p);
663 #else
664                 msg_format("You cannot learn any new %ss!", p);
665 #endif
666
667                 return;
668         }
669
670         if (p_ptr->special_defense & KATA_MUSOU)
671         {
672                 set_action(ACTION_NONE);
673         }
674
675         p = spell_categoly_name(mp_ptr->spell_book);
676
677 #ifdef JP
678         if( p_ptr->new_spells < 10 ){
679                 msg_format("¤¢¤È %d ¤Ä¤Î%s¤ò³Ø¤Ù¤ë¡£", p_ptr->new_spells, p);
680         }else{
681                 msg_format("¤¢¤È %d ¸Ä¤Î%s¤ò³Ø¤Ù¤ë¡£", p_ptr->new_spells, p);
682         }
683 #else
684         msg_format("You can learn %d new %s%s.", p_ptr->new_spells, p,
685                 (p_ptr->new_spells == 1?"":"s"));
686 #endif
687
688         msg_print(NULL);
689
690
691         /* Restrict choices to "useful" books */
692         if (p_ptr->realm2 == REALM_NONE) item_tester_tval = mp_ptr->spell_book;
693         else item_tester_hook = item_tester_learn_spell;
694
695         /* Get an item */
696 #ifdef JP
697 q = "¤É¤ÎËܤ«¤é³Ø¤Ó¤Þ¤¹¤«? ";
698 #else
699         q = "Study which book? ";
700 #endif
701
702 #ifdef JP
703 s = "Æɤá¤ëËܤ¬¤Ê¤¤¡£";
704 #else
705         s = "You have no books that you can read.";
706 #endif
707
708         select_spellbook=TRUE;
709         if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
710         select_spellbook=FALSE;
711
712         /* Get the item (in the pack) */
713         if (item >= 0)
714         {
715                 o_ptr = &inventory[item];
716         }
717
718         /* Get the item (on the floor) */
719         else
720         {
721                 o_ptr = &o_list[0 - item];
722         }
723
724         /* Access the item's sval */
725         sval = o_ptr->sval;
726
727         if (o_ptr->tval == REALM2_BOOK) increment = 32;
728         else if (o_ptr->tval != REALM1_BOOK)
729         {
730 #ifdef JP
731                 if (!get_check("ËÜÅö¤ËËâË¡¤ÎÎΰè¤òÊѹ¹¤·¤Þ¤¹¤«¡©")) return;
732 #else
733                 if (!get_check("Really, change magic realm? ")) return;
734 #endif
735                 change_realm2(tval2realm(o_ptr->tval));
736                 increment = 32;
737         }
738
739         /* Track the object kind */
740         object_kind_track(o_ptr->k_idx);
741
742         /* Hack -- Handle stuff */
743         handle_stuff();
744
745         /* Mage -- Learn a selected spell */
746         if (mp_ptr->spell_book != TV_LIFE_BOOK)
747         {
748                 /* Ask for a spell, allow cancel */
749 #ifdef JP
750                 if (!get_spell(&spell, "³Ø¤Ö", sval, FALSE, o_ptr->tval - TV_LIFE_BOOK + 1)
751                         && (spell == -1)) return;
752 #else
753                 if (!get_spell(&spell, "study", sval, FALSE, o_ptr->tval - TV_LIFE_BOOK + 1)
754                         && (spell == -1)) return;
755 #endif
756
757         }
758
759         /* Priest -- Learn a random prayer */
760         else
761         {
762                 int k = 0;
763
764                 int gift = -1;
765
766                 /* Extract spells */
767                 for (spell = 0; spell < 32; spell++)
768                 {
769                         /* Check spells in the book */
770                         if ((fake_spell_flags[sval] & (1L << spell)))
771                         {
772                                 /* Skip non "okay" prayers */
773                                 if (!spell_okay(spell, FALSE, TRUE,
774                                         (increment ? p_ptr->realm2 - 1 : p_ptr->realm1 - 1))) continue;
775
776                                 /* Hack -- Prepare the randomizer */
777                                 k++;
778
779                                 /* Hack -- Apply the randomizer */
780                                 if (rand_int(k) == 0) gift = spell;
781                         }
782                 }
783
784                 /* Accept gift */
785                 spell = gift;
786         }
787
788         /* Nothing to study */
789         if (spell < 0)
790         {
791                 /* Message */
792 #ifdef JP
793 msg_format("¤½¤ÎËܤˤϳؤ֤٤­%s¤¬¤Ê¤¤¡£", p);
794 #else
795                 msg_format("You cannot learn any %ss in that book.", p);
796 #endif
797
798
799                 /* Abort */
800                 return;
801         }
802
803
804         if (increment) spell += increment;
805
806         /* Learn the spell */
807         if (spell < 32)
808         {
809                 if (spell_learned1 & (1L << spell)) learned = TRUE;
810                 else spell_learned1 |= (1L << spell);
811         }
812         else
813         {
814                 if (spell_learned2 & (1L << (spell - 32))) learned = TRUE;
815                 else spell_learned2 |= (1L << (spell - 32));
816         }
817
818         if (learned)
819         {
820                 int max_exp = (spell < 32) ? 1600 : 1400;
821                 int old_exp = spell_exp[spell];
822                 int new_rank = 0;
823                 cptr name = spell_names[technic2magic(increment ? p_ptr->realm2 : p_ptr->realm1)-1][spell%32];
824
825                 if (old_exp >= max_exp)
826                 {
827 #ifdef JP
828                         msg_format("¤½¤Î%s¤Ï´°Á´¤Ë»È¤¤¤³¤Ê¤»¤ë¤Î¤Ç³Ø¤ÖɬÍפϤʤ¤¡£", spell_categoly_name(mp_ptr->spell_book));
829 #else
830                         msg_format("You don't need to study this %s anymore.", spell_categoly_name(mp_ptr->spell_book));
831 #endif
832                         return;
833                 }
834 #ifdef JP
835                 if (!get_check(format("%s¤Î%s¤ò¤µ¤é¤Ë³Ø¤Ó¤Þ¤¹¡£¤è¤í¤·¤¤¤Ç¤¹¤«¡©", name, spell_categoly_name(mp_ptr->spell_book))))
836 #else
837                 if (!get_check(format("You will study a %s of %s again. Are you sure? ", spell_categoly_name(mp_ptr->spell_book), name)))
838 #endif
839                 {
840                         return;
841                 }
842                 else if (old_exp >= 1400)
843                 {
844                         spell_exp[spell] = 1600;
845                         new_rank = 4;
846                 }
847                 else if (old_exp >= 1200)
848                 {
849                         if (spell >= 32) spell_exp[spell] = 1400;
850                         else spell_exp[spell] += 200;
851                         new_rank = 3;
852                 }
853                 else if (old_exp >= 900)
854                 {
855                         spell_exp[spell] = 1200+(old_exp-900)*2/3;
856                         new_rank = 2;
857                 }
858                 else
859                 {
860                         spell_exp[spell] = 900+(old_exp)/3;
861                         new_rank = 1;
862                 }
863 #ifdef JP
864                 msg_format("%s¤Î½ÏÎýÅÙ¤¬%s¤Ë¾å¤¬¤Ã¤¿¡£", name, shougou_moji[new_rank]);
865 #else
866                 msg_format("Your proficiency of %s is now %s rank.", name, shougou_moji[new_rank]);
867 #endif
868         }
869         else
870         {
871                 /* Find the next open entry in "spell_order[]" */
872                 for (i = 0; i < 64; i++)
873                 {
874                         /* Stop at the first empty space */
875                         if (spell_order[i] == 99) break;
876                 }
877
878                 /* Add the spell to the known list */
879                 spell_order[i++] = spell;
880
881                 /* Mention the result */
882 #ifdef JP
883                 /* ±ÑÆüÀÚ¤êÂؤ¨µ¡Ç½¤ËÂбþ */
884                 if (mp_ptr->spell_book == TV_MUSIC_BOOK)
885                 {
886                         msg_format("%s¤ò³Ø¤ó¤À¡£",
887                                     spell_names[technic2magic(increment ? p_ptr->realm2 : p_ptr->realm1)-1][spell % 32]);
888                 }
889                 else
890                 {
891                         msg_format("%s¤Î%s¤ò³Ø¤ó¤À¡£",
892                                     spell_names[technic2magic(increment ? p_ptr->realm2 : p_ptr->realm1)-1][spell % 32] ,p);
893                 }
894 #else
895                 msg_format("You have learned the %s of %s.",
896                         p, spell_names[technic2magic(increment ? p_ptr->realm2 : p_ptr->realm1)-1][spell % 32]);
897 #endif
898         }
899
900         /* Take a turn */
901         energy_use = 100;
902
903         if (mp_ptr->spell_book == TV_LIFE_BOOK)
904                 chg_virtue(V_FAITH, 1);
905         else if (mp_ptr->spell_book == TV_DEATH_BOOK)
906                 chg_virtue(V_UNLIFE, 1);
907         else if (mp_ptr->spell_book == TV_NATURE_BOOK)
908                 chg_virtue(V_NATURE, 1);
909         else
910                 chg_virtue(V_KNOWLEDGE, 1);
911
912         /* Sound */
913         sound(SOUND_STUDY);
914
915         /* One less spell available */
916         p_ptr->learned_spells++;
917 #if 0
918         /* Message if needed */
919         if (p_ptr->new_spells)
920         {
921                 /* Message */
922 #ifdef JP
923                         if( p_ptr->new_spells < 10 ){
924                                 msg_format("¤¢¤È %d ¤Ä¤Î%s¤ò³Ø¤Ù¤ë¡£", p_ptr->new_spells, p);
925                         }else{
926                                 msg_format("¤¢¤È %d ¸Ä¤Î%s¤ò³Ø¤Ù¤ë¡£", p_ptr->new_spells, p);
927                         }
928 #else
929                 msg_format("You can learn %d more %s%s.",
930                         p_ptr->new_spells, p,
931                         (p_ptr->new_spells != 1) ? "s" : "");
932 #endif
933
934         }
935 #endif
936
937         /* Update Study */
938         p_ptr->update |= (PU_SPELLS);
939         update_stuff();
940 }
941
942
943 void wild_magic(int spell)
944 {
945         int counter = 0;
946         int type = SUMMON_BIZARRE1 + rand_int(6);
947
948         if (type < SUMMON_BIZARRE1) type = SUMMON_BIZARRE1;
949         else if (type > SUMMON_BIZARRE6) type = SUMMON_BIZARRE6;
950
951         switch (randint(spell) + randint(8) + 1)
952         {
953         case 1:
954         case 2:
955         case 3:
956                 teleport_player(10);
957                 break;
958         case 4:
959         case 5:
960         case 6:
961                 teleport_player(100);
962                 break;
963         case 7:
964         case 8:
965                 teleport_player(200);
966                 break;
967         case 9:
968         case 10:
969         case 11:
970                 unlite_area(10, 3);
971                 break;
972         case 12:
973         case 13:
974         case 14:
975                 lite_area(damroll(2, 3), 2);
976                 break;
977         case 15:
978                 destroy_doors_touch();
979                 break;
980         case 16: case 17:
981                 wall_breaker();
982         case 18:
983                 sleep_monsters_touch();
984                 break;
985         case 19:
986         case 20:
987                 trap_creation(py, px);
988                 break;
989         case 21:
990         case 22:
991                 door_creation();
992                 break;
993         case 23:
994         case 24:
995         case 25:
996                 aggravate_monsters(0);
997                 break;
998         case 26:
999                 earthquake(py, px, 5);
1000                 break;
1001         case 27:
1002         case 28:
1003                 (void)gain_random_mutation(0);
1004                 break;
1005         case 29:
1006         case 30:
1007                 apply_disenchant(0);
1008                 break;
1009         case 31:
1010                 lose_all_info();
1011                 break;
1012         case 32:
1013                 fire_ball(GF_CHAOS, 0, spell + 5, 1 + (spell / 10));
1014                 break;
1015         case 33:
1016                 wall_stone();
1017                 break;
1018         case 34:
1019         case 35:
1020                 while (counter++ < 8)
1021                 {
1022                         (void)summon_specific(0, py, px, (dun_level * 3) / 2, type, TRUE, FALSE, FALSE, FALSE, TRUE);
1023                 }
1024                 break;
1025         case 36:
1026         case 37:
1027                 activate_hi_summon(py, px, FALSE);
1028                 break;
1029         case 38:
1030                 (void)summon_cyber(-1, py, px);
1031                 break;
1032         default:
1033                 {
1034                         int count = 0;
1035                         (void)activate_ty_curse(FALSE, &count);
1036                         break;
1037                 }
1038         }
1039
1040         return;
1041 }
1042
1043
1044 static bool cast_life_spell(int spell)
1045 {
1046         int     dir;
1047         int     plev = p_ptr->lev;
1048
1049         switch (spell)
1050         {
1051         case 0: /* Detect Evil */
1052                 (void)detect_monsters_evil(DETECT_RAD_DEFAULT);
1053                 break;
1054         case 1: /* Cure Light Wounds */
1055                 (void)hp_player(damroll(2, 10));
1056                 (void)set_cut(p_ptr->cut - 10);
1057                 break;
1058         case 2: /* Bless */
1059                 (void)set_blessed(randint(12) + 12, FALSE);
1060                 break;
1061         case 3: /* Remove Fear */
1062                 (void)set_afraid(0);
1063                 break;
1064         case 4: /* Call Light */
1065                 (void)lite_area(damroll(2, (plev / 2)), (plev / 10) + 1);
1066                 break;
1067         case 5: /* Detect Traps + Secret Doors */
1068                 (void)detect_traps(DETECT_RAD_DEFAULT);
1069                 (void)detect_doors(DETECT_RAD_DEFAULT);
1070                 (void)detect_stairs(DETECT_RAD_DEFAULT);
1071                 break;
1072         case 6: /* Cure Medium Wounds */
1073                 (void)hp_player(damroll(4, 10));
1074                 (void)set_cut((p_ptr->cut / 2) - 20);
1075                 break;
1076         case 7: /* Satisfy Hunger */
1077                 (void)set_food(PY_FOOD_MAX - 1);
1078                 break;
1079         case 8: /* Remove Curse */
1080                 if (remove_curse())
1081                 {
1082 #ifdef JP
1083                         msg_print("狼¤Ë¸«¼é¤é¤ì¤Æ¤¤¤ë¤è¤¦¤Êµ¤¤¬¤¹¤ë¡£");
1084 #else
1085                         msg_print("You feel as if someone is watching over you.");
1086 #endif
1087                 }
1088                 break;
1089         case 9: /* Cure Poison */
1090                 (void)set_poisoned(0);
1091                 break;
1092         case 10: /* Cure Critical Wounds */
1093                 (void)hp_player(damroll(8, 10));
1094                 (void)set_stun(0);
1095                 (void)set_cut(0);
1096                 break;
1097         case 11: /* Sense Unseen */
1098                 (void)set_tim_invis(randint(24) + 24, FALSE);
1099                 break;
1100         case 12: /* Holy Orb */
1101                 if (!get_aim_dir(&dir)) return FALSE;
1102
1103                 fire_ball(GF_HOLY_FIRE, dir,
1104                           (damroll(3, 6) + plev +
1105                           (plev / ((p_ptr->pclass == CLASS_PRIEST ||
1106                              p_ptr->pclass == CLASS_HIGH_MAGE ||
1107                              p_ptr->pclass == CLASS_SORCERER) ? 2 : 4))),
1108                           ((plev < 30) ? 2 : 3));
1109
1110                 break;
1111         case 13: /* Protection from Evil */
1112                 (void)set_protevil(randint(25) + 3 * p_ptr->lev, FALSE);
1113                 break;
1114         case 14: /* Healing */
1115                 (void)hp_player(300);
1116                 (void)set_stun(0);
1117                 (void)set_cut(0);
1118                 break;
1119         case 15: /* Glyph of Warding */
1120                 warding_glyph();
1121                 break;
1122         case 16: /* Exorcism */
1123                 (void)dispel_undead(randint(plev));
1124                 (void)dispel_demons(randint(plev));
1125                 (void)turn_evil(plev);
1126                 break;
1127         case 17: /* Dispel Curse */
1128                 if (remove_all_curse())
1129                 {
1130 #ifdef JP
1131                         msg_print("狼¤Ë¸«¼é¤é¤ì¤Æ¤¤¤ë¤è¤¦¤Êµ¤¤¬¤¹¤ë¡£");
1132 #else
1133                         msg_print("You feel as if someone is watching over you.");
1134 #endif
1135                 }
1136                 break;
1137         case 18: /* Dispel Undead + Demons */
1138                 (void)dispel_undead(randint(plev * 3));
1139                 (void)dispel_demons(randint(plev * 3));
1140                 break;
1141         case 19: /* 'Day of the Dove' */
1142                 charm_monsters(plev * 2);
1143                 break;
1144         case 20: /* Dispel Evil */
1145                 (void)dispel_evil(randint(plev * 4));
1146                 break;
1147         case 21: /* Banishment */
1148                 if (banish_evil(100))
1149                 {
1150 #ifdef JP
1151 msg_print("¿À¤Î¸æÎϤ¬¼Ù°­¤òÂǤÁʧ¤Ã¤¿¡ª");
1152 #else
1153                         msg_print("The power of your god banishes evil!");
1154 #endif
1155
1156                 }
1157                 break;
1158         case 22: /* Holy Word */
1159                 (void)dispel_evil(randint(plev * 4));
1160                 (void)hp_player(1000);
1161                 (void)set_afraid(0);
1162                 (void)set_poisoned(0);
1163                 (void)set_stun(0);
1164                 (void)set_cut(0);
1165                 break;
1166         case 23: /* Warding True */
1167                 warding_glyph();
1168                 glyph_creation();
1169                 break;
1170         case 24: /* Heroism */
1171                 (void)set_hero(randint(25) + 25, FALSE);
1172                 (void)hp_player(10);
1173                 (void)set_afraid(0);
1174                 break;
1175         case 25: /* Prayer */
1176                 (void)set_blessed(randint(48) + 48, FALSE);
1177                 break;
1178         case 26: /* Turn Undead */
1179                 (void)mass_genocide_undead(plev+50,TRUE);
1180                 break;
1181         case 27: /* Restoration */
1182                 (void)do_res_stat(A_STR);
1183                 (void)do_res_stat(A_INT);
1184                 (void)do_res_stat(A_WIS);
1185                 (void)do_res_stat(A_DEX);
1186                 (void)do_res_stat(A_CON);
1187                 (void)do_res_stat(A_CHR);
1188                 (void)restore_level();
1189                 break;
1190         case 28: /* Healing True */
1191                 (void)hp_player(2000);
1192                 (void)set_stun(0);
1193                 (void)set_cut(0);
1194                 break;
1195         case 29: /* Holy Vision */
1196                 return identify_fully(FALSE);
1197         case 30: /* Divine Intervention */
1198                 project(0, 1, py, px, 500, GF_HOLY_FIRE, PROJECT_KILL, -1);
1199                 dispel_monsters(plev * 4);
1200                 slow_monsters();
1201                 stun_monsters(plev * 4);
1202                 confuse_monsters(plev * 4);
1203                 turn_monsters(plev * 4);
1204                 stasis_monsters(plev * 4);
1205                 summon_specific(-1, py, px, plev, SUMMON_ANGEL, TRUE, TRUE, TRUE, FALSE, FALSE);
1206                 (void)set_hero(randint(25) + 25, FALSE);
1207                 (void)hp_player(300);
1208                 (void)set_fast(randint(20 + plev) + plev, FALSE);
1209                 (void)set_afraid(0);
1210                 break;
1211         case 31: /* Ultimate resistance */
1212         {
1213                 int v = randint(plev/2)+plev/2;
1214                 (void)set_fast(v, FALSE);
1215                 set_oppose_acid(v, FALSE);
1216                 set_oppose_elec(v, FALSE);
1217                 set_oppose_fire(v, FALSE);
1218                 set_oppose_cold(v, FALSE);
1219                 set_oppose_pois(v, FALSE);
1220                 set_ultimate_res(v, FALSE);
1221                 break;
1222         }
1223         default:
1224 #ifdef JP
1225 msg_format("¤¢¤Ê¤¿¤ÏÉÔÌÀ¤Ê¥é¥¤¥Õ¤Î¼öʸ %d ¤ò¾§¤¨¤¿¡£", spell);
1226 #else
1227                 msg_format("You cast an unknown Life spell: %d.", spell);
1228 #endif
1229
1230                 msg_print(NULL);
1231         }
1232
1233         return TRUE;
1234 }
1235
1236
1237
1238 static bool cast_sorcery_spell(int spell)
1239 {
1240         int     dir;
1241         int     plev = p_ptr->lev;
1242
1243         switch (spell)
1244         {
1245         case 0: /* Detect Monsters */
1246                 (void)detect_monsters_normal(DETECT_RAD_DEFAULT);
1247                 break;
1248         case 1: /* Phase Door */
1249                 teleport_player(10);
1250                 break;
1251         case 2: /* Detect Doors and Traps */
1252                 (void)detect_traps(DETECT_RAD_DEFAULT);
1253                 (void)detect_doors(DETECT_RAD_DEFAULT);
1254                 (void)detect_stairs(DETECT_RAD_DEFAULT);
1255                 break;
1256         case 3: /* Light Area */
1257                 (void)lite_area(damroll(2, (plev / 2)), (plev / 10) + 1);
1258                 break;
1259         case 4: /* Confuse Monster */
1260                 if (!get_aim_dir(&dir)) return FALSE;
1261
1262                 (void)confuse_monster(dir, (plev * 3) / 2);
1263                 break;
1264         case 5: /* Teleport */
1265                 teleport_player(plev * 5);
1266                 break;
1267         case 6: /* Sleep Monster */
1268                 if (!get_aim_dir(&dir)) return FALSE;
1269
1270                 (void)sleep_monster(dir);
1271                 break;
1272         case 7: /* Recharging */
1273                 return recharge(plev * 4);
1274         case 8: /* Magic Mapping */
1275                 map_area(DETECT_RAD_MAP);
1276                 break;
1277         case 9: /* Identify */
1278                 return ident_spell(FALSE);
1279         case 10: /* Slow Monster */
1280                 if (!get_aim_dir(&dir)) return FALSE;
1281
1282                 (void)slow_monster(dir);
1283                 break;
1284         case 11: /* Mass Sleep */
1285                 (void)sleep_monsters();
1286                 break;
1287         case 12: /* Teleport Away */
1288                 if (!get_aim_dir(&dir)) return FALSE;
1289
1290                 (void)fire_beam(GF_AWAY_ALL, dir, plev);
1291                 break;
1292         case 13: /* Haste Self */
1293                 (void)set_fast(randint(20 + plev) + plev, FALSE);
1294                 break;
1295         case 14: /* Detection True */
1296                 (void)detect_all(DETECT_RAD_DEFAULT);
1297                 break;
1298         case 15: /* Identify True */
1299                 return identify_fully(FALSE);
1300         case 16: /* Detect Objects and Treasure*/
1301                 (void)detect_objects_normal(DETECT_RAD_DEFAULT);
1302                 (void)detect_treasure(DETECT_RAD_DEFAULT);
1303                 (void)detect_objects_gold(DETECT_RAD_DEFAULT);
1304                 break;
1305         case 17: /* Charm Monster */
1306                 if (!get_aim_dir(&dir)) return FALSE;
1307
1308                 (void)charm_monster(dir, plev);
1309                 break;
1310         case 18: /* Sense Minds */
1311                 (void)set_tim_esp(randint(30) + 25, FALSE);
1312                 break;
1313         case 19: /* Teleport to town */
1314                 return tele_town();
1315                 break;
1316         case 20: /* Self knowledge */
1317                 (void)self_knowledge();
1318                 break;
1319         case 21: /* Teleport Level */
1320                 if (!get_check("ËÜÅö¤Ë¾¤Î³¬¤Ë¥Æ¥ì¥Ý¡¼¥È¤·¤Þ¤¹¤«¡©")) return FALSE;
1321                 (void)teleport_player_level();
1322                 break;
1323         case 22: /* Word of Recall */
1324                 if (!word_of_recall()) return FALSE;
1325                 break;
1326         case 23: /* Explosive Rune */
1327                 explosive_rune();
1328                 break;
1329         case 24: /* Probing */
1330                 (void)probing();
1331                 break;
1332         case 25: /* Telekinesis */
1333                 if (!get_aim_dir(&dir)) return FALSE;
1334
1335                 fetch(dir, plev * 15, FALSE);
1336                 break;
1337         case 26: /* Clairvoyance */
1338                 chg_virtue(V_KNOWLEDGE, 1);
1339                 chg_virtue(V_ENLIGHTEN, 1);
1340
1341                 wiz_lite(FALSE, FALSE);
1342                 if (!(p_ptr->telepathy))
1343                 {
1344                         (void)set_tim_esp(randint(30) + 25, FALSE);
1345                 }
1346                 break;
1347         case 27: /* Charm Monsters */
1348                 charm_monsters(plev * 2);
1349                 break;
1350         case 28: /* Dimension Door */
1351 #ifdef JP
1352 msg_print("¼¡¸µ¤ÎÈ⤬³«¤¤¤¿¡£ÌÜŪÃϤòÁª¤ó¤Ç²¼¤µ¤¤¡£");
1353 #else
1354                 msg_print("You open a dimensional gate. Choose a destination.");
1355 #endif
1356
1357                 return dimension_door();
1358         case 29: /* Alchemy */
1359                 return alchemy();
1360         case 30: /* Banish */
1361                 banish_monsters(plev * 4);
1362                 break;
1363         case 31: /* Globe of Invulnerability */
1364                 (void)set_invuln(randint(4) + 4, FALSE);
1365                 break;
1366         default:
1367 #ifdef JP
1368 msg_format("¤¢¤Ê¤¿¤ÏÉÔÌÀ¤Ê¥½¡¼¥µ¥ê¡¼¤Î¼öʸ %d ¤ò¾§¤¨¤¿¡£", spell);
1369 #else
1370                 msg_format("You cast an unknown Sorcery spell: %d.", spell);
1371 #endif
1372
1373                 msg_print(NULL);
1374         }
1375
1376         return TRUE;
1377 }
1378
1379
1380 static bool cast_nature_spell(int spell)
1381 {
1382         int         dir;
1383         int         beam;
1384         int         plev = p_ptr->lev;
1385         bool    no_trump = FALSE;
1386
1387         if (p_ptr->pclass == CLASS_MAGE) beam = plev;
1388         else if (p_ptr->pclass == CLASS_HIGH_MAGE || p_ptr->pclass == CLASS_SORCERER) beam = plev + 10;
1389         else beam = plev / 2;
1390
1391         switch (spell)
1392         {
1393         case 0: /* Detect Creatures */
1394                 (void)detect_monsters_normal(DETECT_RAD_DEFAULT);
1395                 break;
1396         case 1: /* Lightning Bolt */
1397                 project_length = plev / 6 + 2;
1398                 if (!get_aim_dir(&dir)) return FALSE;
1399
1400                 fire_beam(GF_ELEC, dir,
1401                         damroll(3 + ((plev - 1) / 5), 4));
1402                 break;
1403         case 2: /* Detect Doors & Traps */
1404                 (void)detect_traps(DETECT_RAD_DEFAULT);
1405                 (void)detect_doors(DETECT_RAD_DEFAULT);
1406                 (void)detect_stairs(DETECT_RAD_DEFAULT);
1407                 break;
1408         case 3: /* Produce Food */
1409                 (void)set_food(PY_FOOD_MAX - 1);
1410                 break;
1411         case 4: /* Daylight */
1412                 (void)lite_area(damroll(2, (plev / 2)), (plev / 10) + 1);
1413                 if ((prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE)) && !p_ptr->resist_lite)
1414                 {
1415 #ifdef JP
1416 msg_print("Æü¤Î¸÷¤¬¤¢¤Ê¤¿¤ÎÆùÂΤò¾Ç¤¬¤·¤¿¡ª");
1417 #else
1418                         msg_print("The daylight scorches your flesh!");
1419 #endif
1420
1421 #ifdef JP
1422 take_hit(DAMAGE_NOESCAPE, damroll(2, 2), "Æü¤Î¸÷", -1);
1423 #else
1424                         take_hit(DAMAGE_NOESCAPE, damroll(2, 2), "daylight", -1);
1425 #endif
1426
1427                 }
1428                 break;
1429         case 5: /* Animal Taming */
1430                 if (!get_aim_dir(&dir)) return FALSE;
1431
1432                 (void)charm_animal(dir, plev);
1433                 break;
1434         case 6: /* Resist Environment */
1435                 (void)set_oppose_cold(randint(20) + 20, FALSE);
1436                 (void)set_oppose_fire(randint(20) + 20, FALSE);
1437                 (void)set_oppose_elec(randint(20) + 20, FALSE);
1438                 break;
1439         case 7: /* Cure Wounds & Poison */
1440                 (void)hp_player(damroll(2, 8));
1441                 (void)set_cut(0);
1442                 (void)set_poisoned(0);
1443                 break;
1444         case 8: /* Stone to Mud */
1445                 if (!get_aim_dir(&dir)) return FALSE;
1446
1447                 (void)wall_to_mud(dir);
1448                 break;
1449         case 9: /* Frost Bolt */
1450                 if (!get_aim_dir(&dir)) return FALSE;
1451                 fire_bolt_or_beam(beam - 10, GF_COLD, dir,
1452                         damroll(3 + ((plev - 5) / 4), 8));
1453                 break;
1454         case 10: /* Nature Awareness -- downgraded */
1455                 map_area(DETECT_RAD_MAP);
1456                 (void)detect_traps(DETECT_RAD_DEFAULT);
1457                 (void)detect_doors(DETECT_RAD_DEFAULT);
1458                 (void)detect_stairs(DETECT_RAD_DEFAULT);
1459                 (void)detect_monsters_normal(DETECT_RAD_DEFAULT);
1460                 break;
1461         case 11: /* Fire Bolt */
1462                 if (!get_aim_dir(&dir)) return FALSE;
1463                 fire_bolt_or_beam(beam - 10, GF_FIRE, dir,
1464                         damroll(5 + ((plev - 5) / 4), 8));
1465                 break;
1466         case 12: /* Ray of Sunlight */
1467                 if (!get_aim_dir(&dir)) return FALSE;
1468 #ifdef JP
1469 msg_print("ÂÀÍÛ¸÷Àþ¤¬¸½¤ì¤¿¡£");
1470 #else
1471                 msg_print("A line of sunlight appears.");
1472 #endif
1473
1474                 (void)lite_line(dir);
1475                 break;
1476         case 13: /* Entangle */
1477                 slow_monsters();
1478                 break;
1479         case 14: /* Summon Animals */
1480                 if (!(summon_specific(-1, py, px, plev, SUMMON_ANIMAL_RANGER, TRUE, TRUE, TRUE, FALSE, FALSE)))
1481                         no_trump = TRUE;
1482                 break;
1483         case 15: /* Herbal Healing */
1484                 (void)hp_player(500);
1485                 (void)set_stun(0);
1486                 (void)set_cut(0);
1487                 (void)set_poisoned(0);
1488                 break;
1489         case 16: /* Stair Building */
1490                 (void)stair_creation();
1491                 break;
1492         case 17: /* Stone Skin */
1493                 (void)set_shield(randint(20) + 30, FALSE);
1494                 break;
1495         case 18: /* Resistance True */
1496                 (void)set_oppose_acid(randint(20) + 20, FALSE);
1497                 (void)set_oppose_elec(randint(20) + 20, FALSE);
1498                 (void)set_oppose_fire(randint(20) + 20, FALSE);
1499                 (void)set_oppose_cold(randint(20) + 20, FALSE);
1500                 (void)set_oppose_pois(randint(20) + 20, FALSE);
1501                 break;
1502         case 19: /* Tree Creation */
1503                 (void)tree_creation();
1504                 break;
1505         case 20: /* Animal Friendship */
1506                 (void)charm_animals(plev * 2);
1507                 break;
1508         case 21: /* Stone Tell */
1509                 return identify_fully(FALSE);
1510         case 22: /* Wall of Stone */
1511                 (void)wall_stone();
1512                 break;
1513         case 23: /* Protection from Corrosion */
1514                 return rustproof();
1515         case 24: /* Earthquake */
1516                 earthquake(py, px, 10);
1517                 break;
1518         case 25: /* Whirlwind Attack */
1519                 {
1520                         int y = 0, x = 0;
1521                         cave_type       *c_ptr;
1522                         monster_type    *m_ptr;
1523
1524                         for (dir = 0; dir < 8; dir++)
1525                         {
1526                                 y = py + ddy_ddd[dir];
1527                                 x = px + ddx_ddd[dir];
1528                                 c_ptr = &cave[y][x];
1529
1530                                 /* Get the monster */
1531                                 m_ptr = &m_list[c_ptr->m_idx];
1532
1533                                 /* Hack -- attack monsters */
1534                                 if (c_ptr->m_idx && (m_ptr->ml || cave_floor_bold(y, x)))
1535                                         py_attack(y, x, 0);
1536                         }
1537                 }
1538                 break;
1539         case 26: /* Blizzard */
1540                 if (!get_aim_dir(&dir)) return FALSE;
1541
1542                 fire_ball(GF_COLD, dir, 70 + plev * 3 / 2, (plev / 12) + 1);
1543                 break;
1544         case 27: /* Lightning Storm */
1545                 if (!get_aim_dir(&dir)) return FALSE;
1546                 fire_ball(GF_ELEC, dir, 90 + plev * 3 / 2, (plev / 12) + 1);
1547                 break;
1548         case 28: /* Whirlpool */
1549                 if (!get_aim_dir(&dir)) return FALSE;
1550                 fire_ball(GF_WATER, dir, 100 + plev * 3 / 2, (plev / 12) + 1);
1551                 break;
1552         case 29: /* Call Sunlight */
1553                 fire_ball(GF_LITE, 0, 150, 8);
1554                 chg_virtue(V_KNOWLEDGE, 1);
1555                 chg_virtue(V_ENLIGHTEN, 1);
1556                 wiz_lite(FALSE, FALSE);
1557                 if ((prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE)) && !p_ptr->resist_lite)
1558                 {
1559 #ifdef JP
1560 msg_print("Æü¸÷¤¬¤¢¤Ê¤¿¤ÎÆùÂΤò¾Ç¤¬¤·¤¿¡ª");
1561 #else
1562                         msg_print("The sunlight scorches your flesh!");
1563 #endif
1564
1565 #ifdef JP
1566 take_hit(DAMAGE_NOESCAPE, 50, "Æü¸÷", -1);
1567 #else
1568                         take_hit(DAMAGE_NOESCAPE, 50, "sunlight", -1);
1569 #endif
1570
1571                 }
1572                 break;
1573         case 30: /* Elemental Branding */
1574                 brand_weapon(rand_int(2));
1575                 break;
1576         case 31: /* Nature's Wrath */
1577                 (void)dispel_monsters(plev * 4);
1578                 earthquake(py, px, 20 + (plev / 2));
1579                 project(0, 1 + plev / 12, py, px,
1580                         (100 + plev) * 2, GF_DISINTEGRATE, PROJECT_KILL | PROJECT_ITEM, -1);
1581                 break;
1582         default:
1583 #ifdef JP
1584 msg_format("¤¢¤Ê¤¿¤ÏÉÔÌÀ¤Ê¥Í¥¤¥Á¥ã¡¼¤Î¼öʸ %d ¤ò¾§¤¨¤¿¡£", spell);
1585 #else
1586                 msg_format("You cast an unknown Nature spell: %d.", spell);
1587 #endif
1588
1589                 msg_print(NULL);
1590         }
1591
1592         if (no_trump)
1593 #ifdef JP
1594 msg_print("ưʪ¤Ï¸½¤ì¤Ê¤«¤Ã¤¿¡£");
1595 #else
1596                 msg_print("No animals arrive.");
1597 #endif
1598
1599
1600         return TRUE;
1601 }
1602
1603
1604 static bool cast_chaos_spell(int spell)
1605 {
1606         int     dir, i, beam;
1607         int     plev = p_ptr->lev;
1608
1609         if (p_ptr->pclass == CLASS_MAGE) beam = plev;
1610         else if (p_ptr->pclass == CLASS_HIGH_MAGE || p_ptr->pclass == CLASS_SORCERER) beam = plev + 10;
1611         else beam = plev / 2;
1612
1613         switch (spell)
1614         {
1615         case 0: /* Magic Missile */
1616                 if (!get_aim_dir(&dir)) return FALSE;
1617
1618                 fire_bolt_or_beam(beam - 10, GF_MISSILE, dir,
1619                         damroll(3 + ((plev - 1) / 5), 4));
1620                 break;
1621         case 1: /* Trap / Door destruction */
1622                 (void)destroy_doors_touch();
1623                 break;
1624         case 2: /* Flash of Light == Light Area */
1625                 (void)lite_area(damroll(2, (plev / 2)), (plev / 10) + 1);
1626                 break;
1627         case 3: /* Touch of Confusion */
1628                 if (!(p_ptr->special_attack & ATTACK_CONFUSE))
1629                 {
1630 #ifdef JP
1631 msg_print("¤¢¤Ê¤¿¤Î¼ê¤Ï¸÷¤ê»Ï¤á¤¿¡£");
1632 #else
1633                         msg_print("Your hands start glowing.");
1634 #endif
1635
1636                         p_ptr->special_attack |= ATTACK_CONFUSE;
1637                         p_ptr->redraw |= (PR_STATUS);
1638                 }
1639                 break;
1640         case 4: /* Mana Burst */
1641                 if (!get_aim_dir(&dir)) return FALSE;
1642
1643                 fire_ball(GF_MISSILE, dir,
1644                         (damroll(3, 5) + plev +
1645                         (plev / (((p_ptr->pclass == CLASS_MAGE)
1646                         || (p_ptr->pclass == CLASS_HIGH_MAGE)
1647                         || (p_ptr->pclass == CLASS_SORCERER)) ? 2 : 4))),
1648                         ((plev < 30) ? 2 : 3));
1649                         /* Shouldn't actually use GF_MANA, as it will destroy all
1650                          * items on the floor */
1651                 break;
1652         case 5: /* Fire Bolt */
1653                 if (!get_aim_dir(&dir)) return FALSE;
1654
1655                 fire_bolt_or_beam(beam, GF_FIRE, dir,
1656                         damroll(8 + ((plev - 5) / 4), 8));
1657                 break;
1658         case 6: /* Fist of Force ("Fist of Fun") */
1659                 if (!get_aim_dir(&dir)) return FALSE;
1660
1661                 fire_ball(GF_DISINTEGRATE, dir,
1662                         damroll(8 + ((plev - 5) / 4), 8), 0);
1663                 break;
1664         case 7: /* Teleport Self */
1665                 teleport_player(plev * 5);
1666                 break;
1667         case 8: /* Wonder */
1668                 {
1669                 /* This spell should become more useful (more
1670                 controlled) as the player gains experience levels.
1671                 Thus, add 1/5 of the player's level to the die roll.
1672                 This eliminates the worst effects later on, while
1673                 keeping the results quite random.  It also allows
1674                         some potent effects only at high level. */
1675
1676                         int die = randint(100) + plev / 5;
1677                         int vir = virtue_number(V_CHANCE);
1678                         if (vir)
1679                         {
1680                                 if (p_ptr->virtues[vir - 1] > 0)
1681                                 {
1682                                         while (randint(400) < p_ptr->virtues[vir - 1]) die++;
1683                                 }
1684                                 else
1685                                 {
1686                                         while (randint(400) < (0-p_ptr->virtues[vir - 1])) die--;
1687                                 }
1688                         }
1689
1690                         if (die < 26)
1691                                 chg_virtue(V_CHANCE, 1);
1692
1693                         if (!get_aim_dir(&dir)) return FALSE;
1694                         if (die > 100)
1695 #ifdef JP
1696 msg_print("¤¢¤Ê¤¿¤ÏÎϤ¬¤ß¤Ê¤®¤ë¤Î¤ò´¶¤¸¤¿¡ª");
1697 #else
1698                                 msg_print("You feel a surge of power!");
1699 #endif
1700
1701                         if (die < 8) clone_monster(dir);
1702                         else if (die < 14) speed_monster(dir);
1703                         else if (die < 26) heal_monster(dir, damroll(4, 6));
1704                         else if (die < 31) poly_monster(dir);
1705                         else if (die < 36)
1706                                 fire_bolt_or_beam(beam - 10, GF_MISSILE, dir,
1707                                     damroll(3 + ((plev - 1) / 5), 4));
1708                         else if (die < 41) confuse_monster(dir, plev);
1709                         else if (die < 46) fire_ball(GF_POIS, dir, 20 + (plev / 2), 3);
1710                         else if (die < 51) (void)lite_line(dir);
1711                         else if (die < 56)
1712                                 fire_bolt_or_beam(beam - 10, GF_ELEC, dir,
1713                                     damroll(3 + ((plev - 5) / 4), 8));
1714                         else if (die < 61)
1715                                 fire_bolt_or_beam(beam - 10, GF_COLD, dir,
1716                                     damroll(5 + ((plev - 5) / 4), 8));
1717                         else if (die < 66)
1718                                 fire_bolt_or_beam(beam, GF_ACID, dir,
1719                                     damroll(6 + ((plev - 5) / 4), 8));
1720                         else if (die < 71)
1721                                 fire_bolt_or_beam(beam, GF_FIRE, dir,
1722                                     damroll(8 + ((plev - 5) / 4), 8));
1723                         else if (die < 76) drain_life(dir, 75);
1724                         else if (die < 81) fire_ball(GF_ELEC, dir, 30 + plev / 2, 2);
1725                         else if (die < 86) fire_ball(GF_ACID, dir, 40 + plev, 2);
1726                         else if (die < 91) fire_ball(GF_ICE, dir, 70 + plev, 3);
1727                         else if (die < 96) fire_ball(GF_FIRE, dir, 80 + plev, 3);
1728                         else if (die < 101) drain_life(dir, 100 + plev);
1729                         else if (die < 104)
1730                         {
1731                                 earthquake(py, px, 12);
1732                         }
1733                         else if (die < 106)
1734                         {
1735                                 destroy_area(py, px, 13+rand_int(5), TRUE);
1736                         }
1737                         else if (die < 108)
1738                         {
1739                                 symbol_genocide(plev+50, TRUE);
1740                         }
1741                         else if (die < 110) dispel_monsters(120);
1742                         else /* RARE */
1743                         {
1744                                 dispel_monsters(150);
1745                                 slow_monsters();
1746                                 sleep_monsters();
1747                                 hp_player(300);
1748                         }
1749                         break;
1750                 }
1751                 break;
1752         case 9: /* Chaos Bolt */
1753                 if (!get_aim_dir(&dir)) return FALSE;
1754
1755                 fire_bolt_or_beam(beam, GF_CHAOS, dir,
1756                         damroll(10 + ((plev - 5) / 4), 8));
1757                 break;
1758         case 10: /* Sonic Boom */
1759 #ifdef JP
1760 msg_print("¥É¡¼¥ó¡ªÉô²°¤¬Íɤ줿¡ª");
1761 #else
1762                 msg_print("BOOM! Shake the room!");
1763 #endif
1764
1765                 project(0, plev / 10 + 2, py, px,
1766                         (60 + plev), GF_SOUND, PROJECT_KILL | PROJECT_ITEM, -1);
1767                 break;
1768         case 11: /* Doom Bolt -- always beam in 2.0.7 or later */
1769                 if (!get_aim_dir(&dir)) return FALSE;
1770
1771                 fire_beam(GF_MANA, dir, damroll(11 + ((plev - 5) / 4), 8));
1772                 break;
1773         case 12: /* Fire Ball */
1774                 if (!get_aim_dir(&dir)) return FALSE;
1775
1776                 fire_ball(GF_FIRE, dir, plev + 55, 2);
1777                 break;
1778         case 13: /* Teleport Other */
1779                 if (!get_aim_dir(&dir)) return FALSE;
1780
1781                 (void)fire_beam(GF_AWAY_ALL, dir, plev);
1782                 break;
1783         case 14: /* Word of Destruction */
1784                 destroy_area(py, px, 13+rand_int(5), TRUE);
1785                 break;
1786         case 15: /* Invoke Logrus */
1787                 if (!get_aim_dir(&dir)) return FALSE;
1788
1789                 fire_ball(GF_CHAOS, dir, plev*2 + 99, plev / 5);
1790                 break;
1791         case 16: /* Polymorph Other */
1792                 if (!get_aim_dir(&dir)) return FALSE;
1793
1794                 (void)poly_monster(dir);
1795                 break;
1796         case 17: /* Chain Lightning */
1797                 for (dir = 0; dir <= 9; dir++)
1798                         fire_beam(GF_ELEC, dir, damroll(5 + (plev / 10), 8));
1799                 break;
1800         case 18: /* Arcane Binding == Charging */
1801                 return recharge(90);
1802         case 19: /* Disintegration */
1803                 if (!get_aim_dir(&dir)) return FALSE;
1804
1805                 fire_ball(GF_DISINTEGRATE, dir, plev + 70, 3 + plev / 40);
1806                 break;
1807         case 20: /* Alter Reality */
1808                 alter_reality();
1809                 break;
1810         case 21: /* Magic Rocket */
1811                 if (!get_aim_dir(&dir)) return FALSE;
1812
1813 #ifdef JP
1814 msg_print("¥í¥±¥Ã¥Èȯ¼Í¡ª");
1815 #else
1816                 msg_print("You launch a rocket!");
1817 #endif
1818
1819                 fire_rocket(GF_ROCKET, dir, 120 + plev*2, 2);
1820                 break;
1821         case 22: /* Chaos Branding */
1822                 brand_weapon(2);
1823                 break;
1824         case 23: /* Summon monster, demon */
1825                 {
1826                         bool pet = (randint(3) == 1);
1827                         bool group = !(pet && (plev < 50));
1828
1829                         if (summon_specific((pet ? -1 : 0), py, px, (plev * 3) / 2, SUMMON_DEMON, group, FALSE, pet, FALSE, !pet))
1830                         {
1831 #ifdef JP
1832 msg_print("ⲫ¤Î°­½­¤¬½¼Ëþ¤·¤¿¡£");
1833 #else
1834                                 msg_print("The area fills with a stench of sulphur and brimstone.");
1835 #endif
1836
1837
1838                                 if (pet)
1839 #ifdef JP
1840 msg_print("¡Ö¤´ÍѤǤ´¤¶¤¤¤Þ¤¹¤«¡¢¤´¼ç¿ÍÍÍ¡×");
1841 #else
1842                                         msg_print("'What is thy bidding... Master?'");
1843 #endif
1844
1845                                 else
1846 #ifdef JP
1847 msg_print("¡ÖÈܤ·¤­¼Ô¤è¡¢²æ¤ÏÆò¤Î²¼Ëͤˤ¢¤é¤º¡ª ¤ªÁ°¤Îº²¤òĺ¤¯¤¾¡ª¡×");
1848 #else
1849                                         msg_print("'NON SERVIAM! Wretch! I shall feast on thy mortal soul!'");
1850 #endif
1851
1852                         }
1853                         break;
1854                 }
1855         case 24: /* Beam of Gravity */
1856                 if (!get_aim_dir(&dir)) return FALSE;
1857
1858                 fire_beam(GF_GRAVITY, dir, damroll(9 + ((plev - 5) / 4), 8));
1859                 break;
1860         case 25: /* Meteor Swarm  */
1861                 {
1862                         int x, y, dx, dy;
1863                         int b = 10 + randint(10);
1864                         for (i = 0; i < b; i++)
1865                         {
1866                                 int count = 0, d = 0;
1867
1868                                 while (1)
1869                                 {
1870                                         count++;
1871                                         if (count > 20) break;
1872                                         x = px - 8 + rand_int(17);
1873                                         y = py - 8 + rand_int(17);
1874
1875                                         if (!in_bounds(y,x) || (!cave_floor_bold(y,x) && (cave[y][x].feat != FEAT_TREES)) || !player_has_los_bold(y, x)) continue;
1876
1877                                         dx = (px > x) ? (px - x) : (x - px);
1878                                         dy = (py > y) ? (py - y) : (y - py);
1879
1880                                         /* Approximate distance */
1881                                         d = (dy > dx) ? (dy + (dx >> 1)) : (dx + (dy >> 1));
1882                                         if (d < 9) break;
1883                                 }
1884
1885                                 if (count > 20) continue;
1886
1887                                 project(0, 2, y, x, plev * 2, GF_METEOR, PROJECT_KILL | PROJECT_JUMP | PROJECT_ITEM, -1);
1888                         }
1889                 }
1890                 break;
1891         case 26: /* Flame Strike */
1892                 fire_ball(GF_FIRE, 0, 300 + (3 * plev), 8);
1893                 break;
1894         case 27: /* Call Chaos */
1895                 call_chaos();
1896                 break;
1897         case 28: /* Polymorph Self */
1898 #ifdef JP
1899                 if (!get_check("ÊѿȤ·¤Þ¤¹¡£¤è¤í¤·¤¤¤Ç¤¹¤«¡©")) return FALSE;
1900 #else
1901                 if (!get_check("You will polymorph yourself. Are you sure?")) return FALSE;
1902 #endif
1903                 do_poly_self();
1904                 break;
1905         case 29: /* Mana Storm */
1906                 if (!get_aim_dir(&dir)) return FALSE;
1907
1908                 fire_ball(GF_MANA, dir, 300 + (plev * 4), 4);
1909                 break;
1910         case 30: /* Breathe Logrus */
1911                 if (!get_aim_dir(&dir)) return FALSE;
1912
1913                 fire_ball(GF_CHAOS, dir, p_ptr->chp, 2);
1914                 break;
1915         case 31: /* Call the Void */
1916                 call_the_();
1917                 break;
1918         default:
1919 #ifdef JP
1920 msg_format("¤¢¤Ê¤¿¤ÏÉÔÌÀ¤Ê¥«¥ª¥¹¤Î¼öʸ %d ¤ò¾§¤¨¤¿¡£", spell);
1921 #else
1922                 msg_format("You cast an unknown Chaos spell: %d.", spell);
1923 #endif
1924
1925                 msg_print(NULL);
1926         }
1927
1928         return TRUE;
1929 }
1930
1931
1932 static bool cast_death_spell(int spell)
1933 {
1934         int     dir;
1935         int     beam;
1936         int     plev = p_ptr->lev;
1937         int     dummy = 0;
1938
1939         if (p_ptr->pclass == CLASS_MAGE) beam = plev;
1940         else if (p_ptr->pclass == CLASS_HIGH_MAGE || p_ptr->pclass == CLASS_SORCERER) beam = plev + 10;
1941         else beam = plev / 2;
1942
1943         switch (spell)
1944         {
1945         case 0: /* Detect Undead & Demons -> Unlife */
1946                 (void)detect_monsters_nonliving(DETECT_RAD_DEFAULT);
1947                 break;
1948         case 1: /* Malediction */
1949                 if (!get_aim_dir(&dir)) return FALSE;
1950                 /* A radius-0 ball may (1) be aimed at objects etc.,
1951                  * and will affect them; (2) may be aimed at ANY
1952                  * visible monster, unlike a 'bolt' which must travel
1953                  * to the monster. */
1954
1955                 fire_ball(GF_HELL_FIRE, dir,
1956                         damroll(3 + ((plev - 1) / 5), 4), 0);
1957
1958                 if (randint(5) == 1)
1959                 {   /* Special effect first */
1960                         dummy = randint(1000);
1961                         if (dummy == 666)
1962                                 fire_ball_hide(GF_DEATH_RAY, dir, plev * 200, 0);
1963                         else if (dummy < 500)
1964                                 fire_ball_hide(GF_TURN_ALL, dir, plev, 0);
1965                         else if (dummy < 800)
1966                                 fire_ball_hide(GF_OLD_CONF, dir, plev, 0);
1967                         else
1968                                 fire_ball_hide(GF_STUN, dir, plev, 0);
1969                 }
1970                 break;
1971         case 2: /* Detect Evil */
1972                 (void)detect_monsters_evil(DETECT_RAD_DEFAULT);
1973                 break;
1974         case 3: /* Stinking Cloud */
1975                 if (!get_aim_dir(&dir)) return FALSE;
1976
1977                 fire_ball(GF_POIS, dir, 10 + (plev / 2), 2);
1978                 break;
1979         case 4: /* Black Sleep */
1980                 if (!get_aim_dir(&dir)) return FALSE;
1981
1982                 (void)sleep_monster(dir);
1983                 break;
1984         case 5: /* Resist Poison */
1985                 (void)set_oppose_pois(randint(20) + 20, FALSE);
1986                 break;
1987         case 6: /* Horrify */
1988                 if (!get_aim_dir(&dir)) return FALSE;
1989
1990                 (void)fear_monster(dir, plev);
1991                 (void)stun_monster(dir, plev);
1992                 break;
1993         case 7: /* Enslave Undead */
1994                 if (!get_aim_dir(&dir)) return FALSE;
1995
1996                 (void)control_one_undead(dir, plev);
1997                 break;
1998         case 8: /* Orb of Entropy */
1999                 if (!get_aim_dir(&dir)) return FALSE;
2000
2001                 fire_ball(GF_OLD_DRAIN, dir,
2002                         (damroll(3, 6) + plev +
2003                         (plev / (((p_ptr->pclass == CLASS_MAGE) ||
2004                         (p_ptr->pclass == CLASS_HIGH_MAGE) ||
2005                         (p_ptr->pclass == CLASS_SORCERER)) ? 2 : 4))),
2006                         ((plev < 30) ? 2 : 3));
2007                 break;
2008         case 9: /* Nether Bolt */
2009                 if (!get_aim_dir(&dir)) return FALSE;
2010
2011                 fire_bolt_or_beam(beam, GF_NETHER, dir,
2012                     damroll(8 + ((plev - 5) / 4), 8));
2013                 break;
2014         case 10: /* Cloud kill */
2015                 project(0, plev / 10 + 2, py, px,
2016                         (30 + plev) * 2, GF_POIS, PROJECT_KILL | PROJECT_ITEM, -1);
2017                 break;
2018         case 11: /* Genocide One */
2019                 if (!get_aim_dir(&dir)) return FALSE;
2020
2021                 fire_ball_hide(GF_GENOCIDE, dir, plev + 50, 0);
2022                 break;
2023         case 12: /* Poison Branding */
2024                 brand_weapon(3);
2025                 break;
2026         case 13: /* Vampiric Drain */
2027                 if (!get_aim_dir(&dir)) return FALSE;
2028
2029                 dummy = plev * 2 + randint(plev * 2);   /* Dmg */
2030                 if (drain_life(dir, dummy))
2031                 {
2032                         chg_virtue(V_SACRIFICE, -1);
2033                         chg_virtue(V_VITALITY, -1);
2034
2035                         (void)hp_player(dummy);
2036                         /* Gain nutritional sustenance: 150/hp drained */
2037                         /* A Food ration gives 5000 food points (by contrast) */
2038                         /* Don't ever get more than "Full" this way */
2039                         /* But if we ARE Gorged,  it won't cure us */
2040                         dummy = p_ptr->food + MIN(5000, 100 * dummy);
2041                         if (p_ptr->food < PY_FOOD_MAX)   /* Not gorged already */
2042                                 (void)set_food(dummy >= PY_FOOD_MAX ? PY_FOOD_MAX - 1 : dummy);
2043                 }
2044                 break;
2045         case 14: /* Animate Dead */
2046                 animate_dead(0, py, px);
2047                 break;
2048         case 15: /* Genocide */
2049                 (void)symbol_genocide(plev+50, TRUE);
2050                 break;
2051         case 16: /* Berserk */
2052                 (void)set_shero(randint(25) + 25, FALSE);
2053                 (void)hp_player(30);
2054                 (void)set_afraid(0);
2055                 break;
2056         case 17: /* Invoke Spirits */
2057                 {
2058                         int die = randint(100) + plev / 5;
2059                         int vir = virtue_number(V_CHANCE);
2060                         if (vir)
2061                         {
2062                                 if (p_ptr->virtues[vir - 1] > 0)
2063                                 {
2064                                         while (randint(400) < p_ptr->virtues[vir - 1]) die++;
2065                                 }
2066                                 else
2067                                 {
2068                                         while (randint(400) < (0-p_ptr->virtues[vir - 1])) die--;
2069                                 }
2070                         }
2071
2072                         if (!get_aim_dir(&dir)) return FALSE;
2073
2074 #ifdef JP
2075 msg_print("¤¢¤Ê¤¿¤Ï»à¼Ô¤¿¤Á¤ÎÎϤò¾·½¸¤·¤¿...");
2076 #else
2077                         msg_print("You call on the power of the dead...");
2078 #endif
2079                         if (die < 26)
2080                                 chg_virtue(V_CHANCE, 1);
2081
2082                         if (die > 100)
2083 #ifdef JP
2084 msg_print("¤¢¤Ê¤¿¤Ï¤ª¤É¤í¤ª¤É¤í¤·¤¤ÎϤΤ¦¤Í¤ê¤ò´¶¤¸¤¿¡ª");
2085 #else
2086                                 msg_print("You feel a surge of eldritch force!");
2087 #endif
2088
2089
2090                         if (die < 8)
2091                         {
2092 #ifdef JP
2093 msg_print("¤Ê¤ó¤Æ¤³¤Ã¤¿¡ª¤¢¤Ê¤¿¤Î¼þ¤ê¤ÎÃÏÌ̤«¤éµà¤Á¤¿¿Í±Æ¤¬Î©¤Á¾å¤¬¤Ã¤Æ¤­¤¿¡ª");
2094 #else
2095                                 msg_print("Oh no! Mouldering forms rise from the earth around you!");
2096 #endif
2097
2098                                 (void)summon_specific(0, py, px, dun_level, SUMMON_UNDEAD, TRUE, FALSE, FALSE, TRUE, TRUE);
2099                                 chg_virtue(V_UNLIFE, 1);
2100                         }
2101                         else if (die < 14)
2102                         {
2103 #ifdef JP
2104 msg_print("̾¾õ¤·Æñ¤¤¼Ù°­¤Ê¸ºß¤¬¤¢¤Ê¤¿¤Î¿´¤òÄ̤ê²á¤®¤Æ¹Ô¤Ã¤¿...");
2105 #else
2106                                 msg_print("An unnamable evil brushes against your mind...");
2107 #endif
2108
2109                                 set_afraid(p_ptr->afraid + randint(4) + 4);
2110                         }
2111                         else if (die < 26)
2112                         {
2113 #ifdef JP
2114 msg_print("¤¢¤Ê¤¿¤ÎƬ¤ËÂçÎ̤ÎÍ©Î¤Á¤ÎÁû¡¹¤·¤¤À¼¤¬²¡¤·´ó¤»¤Æ¤­¤¿...");
2115 #else
2116                                 msg_print("Your head is invaded by a horde of gibbering spectral voices...");
2117 #endif
2118
2119                                 set_confused(p_ptr->confused + randint(4) + 4);
2120                         }
2121                         else if (die < 31)
2122                         {
2123                                 poly_monster(dir);
2124                         }
2125                         else if (die < 36)
2126                         {
2127                                 fire_bolt_or_beam(beam - 10, GF_MISSILE, dir,
2128                                         damroll(3 + ((plev - 1) / 5), 4));
2129                         }
2130                         else if (die < 41)
2131                         {
2132                                 confuse_monster (dir, plev);
2133                         }
2134                         else if (die < 46)
2135                         {
2136                                 fire_ball(GF_POIS, dir, 20 + (plev / 2), 3);
2137                         }
2138                         else if (die < 51)
2139                         {
2140                                 (void)lite_line(dir);
2141                         }
2142                         else if (die < 56)
2143                         {
2144                                 fire_bolt_or_beam(beam - 10, GF_ELEC, dir,
2145                                         damroll(3+((plev-5)/4),8));
2146                         }
2147                         else if (die < 61)
2148                         {
2149                                 fire_bolt_or_beam(beam - 10, GF_COLD, dir,
2150                                         damroll(5+((plev-5)/4),8));
2151                         }
2152                         else if (die < 66)
2153                         {
2154                                 fire_bolt_or_beam(beam, GF_ACID, dir,
2155                                         damroll(6+((plev-5)/4),8));
2156                         }
2157                         else if (die < 71)
2158                         {
2159                                 fire_bolt_or_beam(beam, GF_FIRE, dir,
2160                                         damroll(8+((plev-5)/4),8));
2161                         }
2162                         else if (die < 76)
2163                         {
2164                                 drain_life(dir, 75);
2165                         }
2166                         else if (die < 81)
2167                         {
2168                                 fire_ball(GF_ELEC, dir, 30 + plev / 2, 2);
2169                         }
2170                         else if (die < 86)
2171                         {
2172                                 fire_ball(GF_ACID, dir, 40 + plev, 2);
2173                         }
2174                         else if (die < 91)
2175                         {
2176                                 fire_ball(GF_ICE, dir, 70 + plev, 3);
2177                         }
2178                         else if (die < 96)
2179                         {
2180                                 fire_ball(GF_FIRE, dir, 80 + plev, 3);
2181                         }
2182                         else if (die < 101)
2183                         {
2184                                 drain_life(dir, 100 + plev);
2185                         }
2186                         else if (die < 104)
2187                         {
2188                                 earthquake(py, px, 12);
2189                         }
2190                         else if (die < 106)
2191                         {
2192                                 destroy_area(py, px, 13+rand_int(5), TRUE);
2193                         }
2194                         else if (die < 108)
2195                         {
2196                                 symbol_genocide(plev+50, TRUE);
2197                         }
2198                         else if (die < 110)
2199                         {
2200                                 dispel_monsters(120);
2201                         }
2202                         else
2203                         { /* RARE */
2204                                 dispel_monsters(150);
2205                                 slow_monsters();
2206                                 sleep_monsters();
2207                                 hp_player(300);
2208                         }
2209
2210                         if (die < 31)
2211 #ifdef JP
2212 msg_print("±¢±µ¤ÊÀ¼¤¬¥¯¥¹¥¯¥¹¾Ð¤¦¡£¡Ö¤â¤¦¤¹¤°¤ª¤Þ¤¨¤Ï²æ¡¹¤ÎÃç´Ö¤Ë¤Ê¤ë¤À¤í¤¦¡£¼å¤­¼Ô¤è¡£¡×");
2213 #else
2214                                 msg_print("Sepulchral voices chuckle. 'Soon you will join us, mortal.'");
2215 #endif
2216
2217                         break;
2218                 }
2219         case 18: /* Dark Bolt */
2220                 if (!get_aim_dir(&dir)) return FALSE;
2221
2222                 fire_bolt_or_beam(beam, GF_DARK, dir,
2223                         damroll(4 + ((plev - 5) / 4), 8));
2224                 break;
2225         case 19: /* Battle Frenzy */
2226                 (void)set_shero(randint(25) + 25, FALSE);
2227                 (void)hp_player(30);
2228                 (void)set_afraid(0);
2229                 (void)set_fast(randint(20 + (plev / 2)) + (plev / 2), FALSE);
2230                 break;
2231         case 20: /* Vampiric Branding */
2232                 brand_weapon(4);
2233                 break;
2234         case 21: /* Vampirism True */
2235                 if (!get_aim_dir(&dir)) return FALSE;
2236
2237                 chg_virtue(V_SACRIFICE, -1);
2238                 chg_virtue(V_VITALITY, -1);
2239
2240                 for (dummy = 0; dummy < 3; dummy++)
2241                 {
2242                         if (drain_life(dir, 100))
2243                                 hp_player(100);
2244                 }
2245                 break;
2246         case 22: /* Word of Death */
2247                 (void)dispel_living(randint(plev * 3));
2248                 break;
2249         case 23: /* Darkness Storm */
2250                 if (!get_aim_dir(&dir)) return FALSE;
2251
2252                 fire_ball(GF_DARK, dir, 100+plev*2, 4);
2253                 break;
2254         case 24: /* Death Ray */
2255                 if (!get_aim_dir(&dir)) return FALSE;
2256
2257                 (void)death_ray(dir, plev);
2258                 break;
2259         case 25: /* Raise the Dead */
2260                 {
2261                         bool pet = (randint(3) == 1);
2262                         bool group;
2263                         int type;
2264
2265                         type = (plev > 47 ? SUMMON_HI_UNDEAD : SUMMON_UNDEAD);
2266                         if (pet)
2267                         {
2268                                 group = (((plev > 24) && (randint(3) == 1)) ? TRUE : FALSE);
2269                         }
2270                         else
2271                         {
2272                                 group = TRUE;
2273                         }
2274
2275                         if (summon_specific((pet ? -1 : 0), py, px, (plev * 3) / 2, type, group, FALSE, pet, !pet, !pet))
2276                         {
2277 #ifdef JP
2278 msg_print("Î䤿¤¤É÷¤¬¤¢¤Ê¤¿¤Î¼þ¤ê¤Ë¿á¤­»Ï¤á¤¿¡£¤½¤ì¤ÏÉåÇÔ½­¤ò±¿¤ó¤Ç¤¤¤ë...");
2279 #else
2280                                 msg_print("Cold winds begin to blow around you, carrying with them the stench of decay...");
2281 #endif
2282
2283
2284                                 if (pet)
2285 #ifdef JP
2286 msg_print("¸Å¤¨¤Î»à¤»¤ë¼Ô¶¦¤¬¤¢¤Ê¤¿¤Ë»Å¤¨¤ë¤¿¤áÅÚ¤«¤éᴤä¿¡ª");
2287 #else
2288                                         msg_print("Ancient, long-dead forms arise from the ground to serve you!");
2289 #endif
2290
2291                                 else
2292 #ifdef JP
2293 msg_print("»à¼Ô¤¬á´¤Ã¤¿¡£Ì²¤ê¤ò˸¤²¤ë¤¢¤Ê¤¿¤òȳ¤¹¤ë¤¿¤á¤Ë¡ª");
2294 #else
2295                                         msg_print("'The dead arise... to punish you for disturbing them!'");
2296 #endif
2297
2298                         chg_virtue(V_UNLIFE, 1);
2299                         }
2300
2301                         break;
2302                 }
2303         case 26: /* Esoteria */
2304                 if (randint(50) > plev)
2305                         return ident_spell(FALSE);
2306                 else
2307                         return identify_fully(FALSE);
2308                 break;
2309         case 27: /* Mimic vampire */
2310                 (void)set_mimic(10+plev/2 + randint(10+plev/2), MIMIC_VAMPIRE, FALSE);
2311                 break;
2312         case 28: /* Restore Life */
2313                 (void)restore_level();
2314                 break;
2315         case 29: /* Mass Genocide */
2316                 (void)mass_genocide(plev+50, TRUE);
2317                 break;
2318         case 30: /* Hellfire */
2319                 if (!get_aim_dir(&dir)) return FALSE;
2320
2321                 fire_ball(GF_HELL_FIRE, dir, 666, 3);
2322 #ifdef JP
2323 take_hit(DAMAGE_USELIFE, 20 + randint(30), "ÃϹö¤Î¹å²Ð¤Î¼öʸ¤ò¾§¤¨¤¿ÈèÏ«", -1);
2324 #else
2325                 take_hit(DAMAGE_USELIFE, 20 + randint(30), "the strain of casting Hellfire", -1);
2326 #endif
2327
2328                 break;
2329         case 31: /* Wraithform */
2330                 set_wraith_form(randint(plev / 2) + (plev / 2), FALSE);
2331                 break;
2332         default:
2333                 msg_format("You cast an unknown Death spell: %d.", spell);
2334                 msg_print(NULL);
2335         }
2336
2337         return TRUE;
2338 }
2339
2340
2341 static bool cast_trump_spell(int spell, bool success)
2342 {
2343         int     dir;
2344         int     beam;
2345         int     plev = p_ptr->lev;
2346         int     summon_lev = plev * 2 / 3 + randint(plev/2);
2347         int     dummy = 0;
2348         bool    no_trump = FALSE;
2349         bool    unique_okay = FALSE;
2350
2351
2352         if (p_ptr->pclass == CLASS_MAGE) beam = plev;
2353         else if (p_ptr->pclass == CLASS_HIGH_MAGE || p_ptr->pclass == CLASS_SORCERER) beam = plev + 10;
2354         else beam = plev / 2;
2355
2356         if (summon_lev < 1) summon_lev = 1;
2357         if (!success || (randint(50+plev) < plev/10)) unique_okay = TRUE;
2358         switch (spell)
2359         {
2360                 case 0: /* Phase Door */
2361                         if (success)
2362                         {
2363                                 teleport_player(10);
2364                         }
2365                         break;
2366                 case 1: /* Trump Spiders */
2367                 {
2368                         bool pet = success; /* (randint(5) > 2) */
2369
2370 #ifdef JP
2371 msg_print("¤¢¤Ê¤¿¤ÏÃØéá¤Î¥«¡¼¥É¤Ë½¸Ã椹¤ë...");
2372 #else
2373                         msg_print("You concentrate on the trump of an spider...");
2374 #endif
2375
2376
2377                         if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_SPIDER, TRUE, FALSE, pet, FALSE, !pet))
2378                         {
2379                                 if (!pet)
2380 #ifdef JP
2381 msg_print("¾¤´Ô¤µ¤ì¤¿ÃØéá¤ÏÅܤäƤ¤¤ë¡ª");
2382 #else
2383                                         msg_print("The summoned spiders get angry!");
2384 #endif
2385
2386                         }
2387                         else
2388                         {
2389                                 no_trump = TRUE;
2390                         }
2391
2392                         break;
2393                 }
2394                 case 2: /* Shuffle */
2395                         if (success)
2396                         {
2397                                 /* A limited power 'wonder' spell */
2398                                 int die = randint(120);
2399                                 int vir = virtue_number(V_CHANCE);
2400
2401                                 if ((p_ptr->pclass == CLASS_ROGUE) ||
2402                                         (p_ptr->pclass == CLASS_HIGH_MAGE) ||
2403                                         (p_ptr->pclass == CLASS_SORCERER))
2404                                         die = (randint(110)) + plev / 5;
2405                                 /* Card sharks and high mages get a level bonus */
2406
2407                                 if (vir)
2408                                 {
2409                                         if (p_ptr->virtues[vir - 1] > 0)
2410                                         {
2411                                                 while (randint(400) < p_ptr->virtues[vir - 1]) die++;
2412                                         }
2413                                         else
2414                                         {
2415                                                 while (randint(400) < (0-p_ptr->virtues[vir - 1])) die--;
2416                                         }
2417                                 }
2418
2419 #ifdef JP
2420 msg_print("¤¢¤Ê¤¿¤Ï¥«¡¼¥É¤òÀڤäưìËç°ú¤¤¤¿...");
2421 #else
2422                                 msg_print("You shuffle the deck and draw a card...");
2423 #endif
2424
2425                                 if (die < 30)
2426                                         chg_virtue(V_CHANCE, 1);
2427
2428                                 if (die < 7)
2429                                 {
2430 #ifdef JP
2431 msg_print("¤Ê¤ó¤Æ¤³¤Ã¤¿¡ª¡Ô»à¡Õ¤À¡ª");
2432 #else
2433                                         msg_print("Oh no! It's Death!");
2434 #endif
2435
2436                                         for (dummy = 0; dummy < randint(3); dummy++)
2437                                                 (void)activate_hi_summon(py, px, FALSE);
2438                                 }
2439                                 else if (die < 14)
2440                                 {
2441 #ifdef JP
2442 msg_print("¤Ê¤ó¤Æ¤³¤Ã¤¿¡ª¡Ô°­Ëâ¡Õ¤À¡ª");
2443 #else
2444                                         msg_print("Oh no! It's the Devil!");
2445 #endif
2446
2447                                         (void)summon_specific(0, py, px, dun_level, SUMMON_DEMON, TRUE, FALSE, FALSE, TRUE, TRUE);
2448                                 }
2449                                 else if (die < 18)
2450                                 {
2451                                         int count = 0;
2452 #ifdef JP
2453 msg_print("¤Ê¤ó¤Æ¤³¤Ã¤¿¡ª¡ÔÄߤé¤ì¤¿ÃË¡Õ¤À¡ª");
2454 #else
2455                                         msg_print("Oh no! It's the Hanged Man.");
2456 #endif
2457
2458                                         (void)activate_ty_curse(FALSE, &count);
2459                                 }
2460                                 else if (die < 22)
2461                                 {
2462 #ifdef JP
2463 msg_print("¡ÔÉÔĴϤηõ¡Õ¤À¡£");
2464 #else
2465                                         msg_print("It's the swords of discord.");
2466 #endif
2467
2468                                         aggravate_monsters(0);
2469                                 }
2470                                 else if (die < 26)
2471                                 {
2472 #ifdef JP
2473 msg_print("¡Ô¶ò¼Ô¡Õ¤À¡£");
2474 #else
2475                                         msg_print("It's the Fool.");
2476 #endif
2477
2478                                         (void)do_dec_stat(A_INT);
2479                                         (void)do_dec_stat(A_WIS);
2480                                 }
2481                                 else if (die < 30)
2482                                 {
2483 #ifdef JP
2484 msg_print("´ñ̯¤Ê¥â¥ó¥¹¥¿¡¼¤Î³¨¤À¡£");
2485 #else
2486                                         msg_print("It's the picture of a strange monster.");
2487 #endif
2488
2489                                         if (!(summon_specific(0, py, px, (dun_level * 3) / 2, 32 + randint(6), TRUE, FALSE, FALSE, TRUE, TRUE)))
2490                                                 no_trump = TRUE;
2491                                 }
2492                                 else if (die < 33)
2493                                 {
2494 #ifdef JP
2495 msg_print("¡Ô·î¡Õ¤À¡£");
2496 #else
2497                                         msg_print("It's the Moon.");
2498 #endif
2499
2500                                         unlite_area(10, 3);
2501                                 }
2502                                 else if (die < 38)
2503                                 {
2504 #ifdef JP
2505 msg_print("¡Ô±¿Ì¿¤ÎÎØ¡Õ¤À¡£");
2506 #else
2507                                         msg_print("It's the Wheel of Fortune.");
2508 #endif
2509
2510                                         wild_magic(rand_int(32));
2511                                 }
2512                                 else if (die < 40)
2513                                 {
2514 #ifdef JP
2515 msg_print("¥Æ¥ì¥Ý¡¼¥È¡¦¥«¡¼¥É¤À¡£");
2516 #else
2517                                         msg_print("It's a teleport trump card.");
2518 #endif
2519
2520                                         teleport_player(10);
2521                                 }
2522                                 else if (die < 42)
2523                                 {
2524 #ifdef JP
2525 msg_print("¡ÔÀµµÁ¡Õ¤À¡£");
2526 #else
2527                                         msg_print("It's Justice.");
2528 #endif
2529
2530                                         set_blessed(p_ptr->lev, FALSE);
2531                                 }
2532                                 else if (die < 47)
2533                                 {
2534 #ifdef JP
2535 msg_print("¥Æ¥ì¥Ý¡¼¥È¡¦¥«¡¼¥É¤À¡£");
2536 #else
2537                                         msg_print("It's a teleport trump card.");
2538 #endif
2539
2540                                         teleport_player(100);
2541                                 }
2542                                 else if (die < 52)
2543                                 {
2544 #ifdef JP
2545 msg_print("¥Æ¥ì¥Ý¡¼¥È¡¦¥«¡¼¥É¤À¡£");
2546 #else
2547                                         msg_print("It's a teleport trump card.");
2548 #endif
2549
2550                                         teleport_player(200);
2551                                 }
2552                                 else if (die < 60)
2553                                 {
2554 #ifdef JP
2555 msg_print("¡ÔÅã¡Õ¤À¡£");
2556 #else
2557                                         msg_print("It's the Tower.");
2558 #endif
2559
2560                                         wall_breaker();
2561                                 }
2562                                 else if (die < 72)
2563                                 {
2564 #ifdef JP
2565 msg_print("¡ÔÀáÀ©¡Õ¤À¡£");
2566 #else
2567                                         msg_print("It's Temperance.");
2568 #endif
2569
2570                                         sleep_monsters_touch();
2571                                 }
2572                                 else if (die < 80)
2573                                 {
2574 #ifdef JP
2575 msg_print("¡ÔÅã¡Õ¤À¡£");
2576 #else
2577                                         msg_print("It's the Tower.");
2578 #endif
2579
2580                                         earthquake(py, px, 5);
2581                                 }
2582                                 else if (die < 82)
2583                                 {
2584 #ifdef JP
2585 msg_print("ͧ¹¥Åª¤Ê¥â¥ó¥¹¥¿¡¼¤Î³¨¤À¡£");
2586 #else
2587                                         msg_print("It's the picture of a friendly monster.");
2588 #endif
2589
2590                                         if (!(summon_specific(-1, py, px, (dun_level * 3) / 2, SUMMON_BIZARRE1, FALSE, TRUE, TRUE, FALSE, FALSE)))
2591                                                 no_trump = TRUE;
2592                                 }
2593                                 else if (die < 84)
2594                                 {
2595 #ifdef JP
2596 msg_print("ͧ¹¥Åª¤Ê¥â¥ó¥¹¥¿¡¼¤Î³¨¤À¡£");
2597 #else
2598                                         msg_print("It's the picture of a friendly monster.");
2599 #endif
2600
2601                                         if (!(summon_specific(-1, py, px, (dun_level * 3) / 2, SUMMON_BIZARRE2, FALSE, TRUE, TRUE, FALSE, FALSE)))
2602                                                 no_trump = TRUE;
2603                                 }
2604                                 else if (die < 86)
2605                                 {
2606 #ifdef JP
2607 msg_print("ͧ¹¥Åª¤Ê¥â¥ó¥¹¥¿¡¼¤Î³¨¤À¡£");
2608 #else
2609                                         msg_print("It's the picture of a friendly monster.");
2610 #endif
2611
2612                                         if (!(summon_specific(-1, py, px, (dun_level * 3) / 2, SUMMON_BIZARRE4, FALSE, TRUE, TRUE, FALSE, FALSE)))
2613                                                 no_trump = TRUE;
2614                                 }
2615                                 else if (die < 88)
2616                                 {
2617 #ifdef JP
2618 msg_print("ͧ¹¥Åª¤Ê¥â¥ó¥¹¥¿¡¼¤Î³¨¤À¡£");
2619 #else
2620                                         msg_print("It's the picture of a friendly monster.");
2621 #endif
2622
2623                                         if (!(summon_specific(-1, py, px, (dun_level * 3) / 2, SUMMON_BIZARRE5, FALSE, TRUE, TRUE, FALSE, FALSE)))
2624                                                 no_trump = TRUE;
2625                                 }
2626                                 else if (die < 96)
2627                                 {
2628 #ifdef JP
2629 msg_print("¡ÔÎø¿Í¡Õ¤À¡£");
2630 #else
2631                                         msg_print("It's the Lovers.");
2632 #endif
2633
2634                                         if (get_aim_dir(&dir))
2635                                                 (void)charm_monster(dir, MIN(p_ptr->lev, 20));
2636                                 }
2637                                 else if (die < 101)
2638                                 {
2639 #ifdef JP
2640 msg_print("¡Ô±£¼Ô¡Õ¤À¡£");
2641 #else
2642                                         msg_print("It's the Hermit.");
2643 #endif
2644
2645                                         wall_stone();
2646                                 }
2647                                 else if (die < 111)
2648                                 {
2649 #ifdef JP
2650 msg_print("¡Ô¿³È½¡Õ¤À¡£");
2651 #else
2652                                         msg_print("It's the Judgement.");
2653 #endif
2654
2655                                         do_cmd_rerate(FALSE);
2656                                         if (p_ptr->muta1 || p_ptr->muta2 || p_ptr->muta3)
2657                                         {
2658 #ifdef JP
2659 msg_print("Á´¤Æ¤ÎÆÍÁ³ÊÑ°Û¤¬¼£¤Ã¤¿¡£");
2660 #else
2661                                                 msg_print("You are cured of all mutations.");
2662 #endif
2663
2664                                                 p_ptr->muta1 = p_ptr->muta2 = p_ptr->muta3 = 0;
2665                                                 p_ptr->update |= PU_BONUS;
2666                                                 handle_stuff();
2667                                         }
2668                                 }
2669                                 else if (die < 120)
2670                                 {
2671 #ifdef JP
2672 msg_print("¡ÔÂÀÍÛ¡Õ¤À¡£");
2673 #else
2674                                         msg_print("It's the Sun.");
2675 #endif
2676
2677                                         chg_virtue(V_KNOWLEDGE, 1);
2678                                         chg_virtue(V_ENLIGHTEN, 1);
2679                                         wiz_lite(FALSE, FALSE);
2680                                 }
2681                                 else
2682                                 {
2683 #ifdef JP
2684 msg_print("¡ÔÀ¤³¦¡Õ¤À¡£");
2685 #else
2686                                         msg_print("It's the World.");
2687 #endif
2688
2689                                         if (p_ptr->exp < PY_MAX_EXP)
2690                                         {
2691                                                 s32b ee = (p_ptr->exp / 25) + 1;
2692                                                 if (ee > 5000) ee = 5000;
2693 #ifdef JP
2694 msg_print("¹¹¤Ë·Ð¸³¤òÀѤó¤À¤è¤¦¤Êµ¤¤¬¤¹¤ë¡£");
2695 #else
2696                                                 msg_print("You feel more experienced.");
2697 #endif
2698
2699                                                 gain_exp(ee);
2700                                         }
2701                                 }
2702                         }
2703                         break;
2704                 case 3: /* Reset Recall */
2705                         if (success)
2706                         {
2707                                 if (!reset_recall()) return FALSE;
2708                         }
2709                         break;
2710                 case 4: /* Teleport Self */
2711                         if (success)
2712                         {
2713                                 teleport_player(plev * 4);
2714                         }
2715                         break;
2716                 case 5: /* Trump Spying */
2717                         if (success)
2718                         {
2719                                 (void)set_tim_esp(randint(30) + 25, FALSE);
2720                         }
2721                         break;
2722                 case 6: /* Teleport Away */
2723                         if (success)
2724                         {
2725                                 if (!get_aim_dir(&dir)) return FALSE;
2726                                 (void)fire_beam(GF_AWAY_ALL, dir, plev);
2727                         }
2728                         break;
2729                 case 7: /* Trump Animals */
2730                 {
2731                         bool pet = success; /* was (randint(5) > 2) */
2732                         int type = (pet ? SUMMON_ANIMAL_RANGER : SUMMON_ANIMAL);
2733                         bool group = (pet ? FALSE : TRUE);
2734
2735 #ifdef JP
2736 msg_print("¤¢¤Ê¤¿¤Ïưʪ¤Î¥«¡¼¥É¤Ë½¸Ã椹¤ë...");
2737 #else
2738                         msg_print("You concentrate on the trump of an animal...");
2739 #endif
2740
2741
2742                         if (summon_specific((pet ? -1 : 0), py, px, summon_lev, type, group, FALSE, pet, FALSE, !pet))
2743                         {
2744                                 if (!pet)
2745 #ifdef JP
2746 msg_print("¾¤´­¤µ¤ì¤¿Æ°Êª¤ÏÅܤäƤ¤¤ë¡ª");
2747 #else
2748                                         msg_print("The summoned animal gets angry!");
2749 #endif
2750
2751                         }
2752                         else
2753                         {
2754                                 no_trump = TRUE;
2755                         }
2756
2757                         break;
2758                 }
2759                 case 8: /* Trump Reach */
2760                         if (success)
2761                         {
2762                                 if (!get_aim_dir(&dir)) return FALSE;
2763                                 fetch(dir, plev * 15, TRUE);
2764                         }
2765                         break;
2766                 case 9: /* Trump Kamikaze */
2767                 {
2768                         int x = px, y = py;
2769                         if (success)
2770                         {
2771                                 if (!target_set(TARGET_KILL)) return FALSE;
2772                                 x = target_col;
2773                                 y = target_row;
2774                         }
2775                         no_trump = TRUE;
2776
2777 #ifdef JP
2778 msg_print("¤¢¤Ê¤¿¤Ï¥«¥ß¥«¥¼¤Î¥«¡¼¥É¤Ë½¸Ã椹¤ë...");
2779 #else
2780                         msg_print("You concentrate on several trumps at once...");
2781 #endif
2782
2783
2784                         for (dummy = 2 + rand_int(plev / 7); dummy > 0; dummy--)
2785                         {
2786                                 bool pet = success; /* was (randint(10) > 3) */
2787                                 bool group = (pet ? FALSE : TRUE);
2788                                 int type;
2789
2790                                 if (p_ptr->pclass == CLASS_BEASTMASTER)
2791                                 {
2792                                         type = SUMMON_KAMIKAZE_LIVING;
2793                                 }
2794                                 else
2795                                 {
2796                                         type = SUMMON_KAMIKAZE;
2797                                 }
2798
2799                                 if (summon_specific((pet ? -1 : 0), y, x, summon_lev, type, group, FALSE, pet, FALSE, !pet))
2800                                 {
2801                                         if (!pet)
2802 #ifdef JP
2803 msg_print("¾¤´Ô¤µ¤ì¤¿¥â¥ó¥¹¥¿¡¼¤ÏÅܤäƤ¤¤ë¡ª");
2804 #else
2805                                                 msg_print("The summoned creatures get angry!");
2806 #endif
2807
2808                                         no_trump = FALSE;
2809                                 }
2810                         }
2811                         break;
2812                 }
2813                 case 10: /* Phantasmal Servant */
2814                         if (success)
2815                         {
2816                                 if (summon_specific(-1, py, px, (summon_lev * 3) / 2, SUMMON_PHANTOM, FALSE, TRUE, TRUE, FALSE, FALSE))
2817                                 {
2818 #ifdef JP
2819 msg_print("¸æÍѤǤ´¤¶¤¤¤Þ¤¹¤«¡¢¸æ¼ç¿ÍÍÍ¡©");
2820 #else
2821                                         msg_print("'Your wish, master?'");
2822 #endif
2823
2824                                 }
2825                                 else
2826                                 {
2827                                         no_trump = TRUE;
2828                                 }
2829                         }
2830                         break;
2831                 case 11: /* Speed Monster */
2832                         if (success)
2833                         {
2834                                 bool old_target_pet = target_pet;
2835                                 target_pet = TRUE;
2836                                 if (!get_aim_dir(&dir))
2837                                 {
2838                                         target_pet = old_target_pet;
2839                                         return (FALSE);
2840                                 }
2841                                 target_pet = old_target_pet;
2842                                 (void)speed_monster(dir);
2843                         }
2844                         break;
2845                 case 12: /* Teleport Level */
2846                         if (success)
2847                         {
2848 #ifdef JP
2849                                 if (!get_check("ËÜÅö¤Ë¾¤Î³¬¤Ë¥Æ¥ì¥Ý¡¼¥È¤·¤Þ¤¹¤«¡©")) return FALSE;
2850 #else
2851                                 if (!get_check("Are you sure? (Teleport Level)")) return FALSE;
2852 #endif
2853                                 (void)teleport_player_level();
2854                         }
2855                         break;
2856                 case 13: /* Dimension Door */
2857                         if (success)
2858                         {
2859 #ifdef JP
2860 msg_print("¼¡¸µ¤ÎÈ⤬³«¤¤¤¿¡£ÌÜŪÃϤòÁª¤ó¤Ç²¼¤µ¤¤¡£");
2861 #else
2862                                 msg_print("You open a dimensional gate. Choose a destination.");
2863 #endif
2864
2865                                 return dimension_door();
2866                         }
2867                         break;
2868                 case 14: /* Word of Recall */
2869                         if (success)
2870                         {
2871                                 if (!word_of_recall()) return FALSE;
2872                         }
2873                         break;
2874                 case 15: /* Banish */
2875                         if (success)
2876                         {
2877                                 banish_monsters(plev * 4);
2878                         }
2879                         break;
2880                 case 16: /* Swap Position */
2881                 {
2882                         if (success)
2883                         {
2884                                 project_length = -1;
2885                                 if (!get_aim_dir(&dir))
2886                                 {
2887                                         project_length = 0;
2888                                         return FALSE;
2889                                 }
2890                                 project_length = 0;
2891
2892                                 (void)teleport_swap(dir);
2893                         }
2894                         break;
2895                 }
2896                 case 17: /* Trump Undead */
2897                 {
2898                         bool pet = success; /* (randint(10) > 3) */
2899                         bool group = (pet ? FALSE : TRUE);
2900
2901 #ifdef JP
2902 msg_print("¤¢¤Ê¤¿¤Ï¥¢¥ó¥Ç¥Ã¥É¤Î¥«¡¼¥É¤Ë½¸Ã椹¤ë...");
2903 #else
2904                         msg_print("You concentrate on the trump of an undead creature...");
2905 #endif
2906
2907
2908                         if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_UNDEAD, group, FALSE, pet, FALSE, !pet))
2909                         {
2910                                 if (!pet)
2911 #ifdef JP
2912 msg_print("¾¤´Ô¤µ¤ì¤¿¥¢¥ó¥Ç¥Ã¥É¤ÏÅܤäƤ¤¤ë¡ª");
2913 #else
2914                                         msg_print("The summoned undead creature gets angry!");
2915 #endif
2916
2917                         }
2918                         else
2919                         {
2920                                 no_trump = TRUE;
2921                         }
2922
2923                         break;
2924                 }
2925                 case 18: /* Trump Reptiles */
2926                 {
2927                         bool pet = success; /* was (randint(5) > 2) */
2928                         bool group = !pet;
2929
2930 #ifdef JP
2931 msg_print("¤¢¤Ê¤¿¤Ïà¨ÃîÎà¤Î¥«¡¼¥É¤Ë½¸Ã椹¤ë...");
2932 #else
2933                         msg_print("You concentrate on the trump of a reptile...");
2934 #endif
2935
2936
2937                         if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_HYDRA, group, FALSE, pet, FALSE, !pet))
2938                         {
2939                                 if (!pet)
2940 #ifdef JP
2941 msg_print("¾¤´Ô¤µ¤ì¤¿à¨ÃîÎà¤ÏÅܤäƤ¤¤ë¡ª");
2942 #else
2943                                         msg_print("The summoned reptile gets angry!");
2944 #endif
2945
2946                         }
2947                         else
2948                         {
2949                                 no_trump = TRUE;
2950                         }
2951
2952                         break;
2953                 }
2954                 case 19: /* Trump Monsters */
2955                 {
2956                         no_trump = TRUE;
2957
2958 #ifdef JP
2959 msg_print("¤¢¤Ê¤¿¤Ï¥â¥ó¥¹¥¿¡¼¤Î¥«¡¼¥É¤Ë½¸Ã椹¤ë...");
2960 #else
2961                         msg_print("You concentrate on several trumps at once...");
2962 #endif
2963
2964
2965                         for (dummy = 0; dummy < 1 + ((plev - 15)/ 10); dummy++)
2966                         {
2967                                 bool pet = success; /* was (randint(10) > 3) */
2968                                 bool group = (pet ? FALSE : TRUE);
2969                                 int type;
2970
2971                                 if (p_ptr->pclass == CLASS_BEASTMASTER)
2972                                 {
2973                                         type = SUMMON_LIVING;
2974                                 }
2975                                 else
2976                                 {
2977                                         type = 0;
2978                                 }
2979
2980                                 if (summon_specific((pet ? -1 : 0), py, px, summon_lev, type, group, FALSE, pet, unique_okay, !pet))
2981                                 {
2982                                         if (!pet)
2983 #ifdef JP
2984 msg_print("¾¤´Ô¤µ¤ì¤¿¥â¥ó¥¹¥¿¡¼¤ÏÅܤäƤ¤¤ë¡ª");
2985 #else
2986                                                 msg_print("The summoned creatures get angry!");
2987 #endif
2988
2989                                         no_trump = FALSE;
2990                                 }
2991                         }
2992                         break;
2993                 }
2994                 case 20: /* Trump Hounds */
2995                 {
2996                         bool pet = success; /* was (randint(5) > 2) */
2997
2998 #ifdef JP
2999 msg_print("¤¢¤Ê¤¿¤Ï¥Ï¥¦¥ó¥É¤Î¥«¡¼¥É¤Ë½¸Ã椹¤ë...");
3000 #else
3001                         msg_print("You concentrate on the trump of a hound...");
3002 #endif
3003
3004
3005                         if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_HOUND, TRUE, FALSE, pet, FALSE, !pet))
3006                         {
3007                                 if (!pet)
3008 #ifdef JP
3009 msg_print("¾¤´Ô¤µ¤ì¤¿¥Ï¥¦¥ó¥É¤ÏÅܤäƤ¤¤ë¡ª");
3010 #else
3011                                         msg_print("The summoned hounds get angry!");
3012 #endif
3013
3014                         }
3015                         else
3016                         {
3017                                 no_trump = TRUE;
3018                         }
3019
3020                         break;
3021                 }
3022                 case 21: /* Trump Branding */
3023                         if (success)
3024                         {
3025                                 brand_weapon(5);
3026                         }
3027                         break;
3028                 case 22: /* Living Trump */
3029                         if (success)
3030                         {
3031                                 if (randint(7) == 1)
3032                                         /* Teleport control */
3033                                         dummy = 12;
3034                                 else
3035                                         /* Random teleportation (uncontrolled) */
3036                                         dummy = 77;
3037                                 /* Gain the mutation */
3038                                 if (gain_random_mutation(dummy))
3039 #ifdef JP
3040 msg_print("¤¢¤Ê¤¿¤ÏÀ¸¤­¤Æ¤¤¤ë¥«¡¼¥É¤ËÊѤï¤Ã¤¿¡£");
3041 #else
3042                                         msg_print("You have turned into a Living Trump.");
3043 #endif
3044
3045                         }
3046                         break;
3047                 case 23: /* Trump Cyberdemon */
3048                 {
3049                         bool pet = success; /* was (randint(10) > 3) */
3050
3051 #ifdef JP
3052 msg_print("¤¢¤Ê¤¿¤Ï¥µ¥¤¥Ð¡¼¥Ç¡¼¥â¥ó¤Î¥«¡¼¥É¤Ë½¸Ã椹¤ë...");
3053 #else
3054                         msg_print("You concentrate on the trump of a Cyberdemon...");
3055 #endif
3056
3057
3058                         if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_CYBER, FALSE, FALSE, pet, FALSE, !pet))
3059                         {
3060                                 if (!pet)
3061 #ifdef JP
3062 msg_print("¾¤´Ô¤µ¤ì¤¿¥µ¥¤¥Ð¡¼¥Ç¡¼¥â¥ó¤ÏÅܤäƤ¤¤ë¡ª");
3063 #else
3064                                         msg_print("The summoned Cyberdemon gets angry!");
3065 #endif
3066
3067                         }
3068                         else
3069                         {
3070                                         no_trump = TRUE;
3071                         }
3072
3073                         break;
3074                 }
3075                 case 24: /* Trump Divination */
3076                         if (success)
3077                         {
3078                                 (void)detect_all(DETECT_RAD_DEFAULT);
3079                         }
3080                         break;
3081                 case 25: /* Trump Lore */
3082                         if (success)
3083                         {
3084                                 return identify_fully(FALSE);
3085                         }
3086                         break;
3087                 case 26: /* Heal Monster */
3088                         if (success)
3089                         {
3090                                 bool old_target_pet = target_pet;
3091                                 target_pet = TRUE;
3092                                 if (!get_aim_dir(&dir))
3093                                 {
3094                                         target_pet = old_target_pet;
3095                                         return (FALSE);
3096                                 }
3097                                 target_pet = old_target_pet;
3098
3099                                 (void)heal_monster(dir, p_ptr->lev * 10 + 200);
3100                         }
3101                         break;
3102                 case 27: /* Trump Dragon */
3103                 {
3104                         bool pet = success; /* was (randint(10) > 3) */
3105                         bool group = (pet ? FALSE : TRUE);
3106
3107 #ifdef JP
3108 msg_print("¤¢¤Ê¤¿¤Ï¥É¥é¥´¥ó¤Î¥«¡¼¥É¤Ë½¸Ã椹¤ë...");
3109 #else
3110                         msg_print("You concentrate on the trump of a dragon...");
3111 #endif
3112
3113
3114                         if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_DRAGON, group, FALSE, pet, FALSE, !pet))
3115                         {
3116                                 if (!pet)
3117 #ifdef JP
3118 msg_print("¾¤´Ô¤µ¤ì¤¿¥É¥é¥´¥ó¤ÏÅܤäƤ¤¤ë¡ª");
3119 #else
3120                                         msg_print("The summoned dragon gets angry!");
3121 #endif
3122
3123                         }
3124                         else
3125                         {
3126                                 no_trump = TRUE;
3127                         }
3128
3129                         break;
3130                 }
3131                 case 28: /* Trump Meteor */
3132                         if (success)
3133                         {
3134                                 int x, y, dx, dy, i;
3135                                 int b = 10 + randint(10);
3136                                 for (i = 0; i < b; i++)
3137                                 {
3138                                         int count = 0, d = 0;
3139
3140                                         while (1)
3141                                         {
3142                                                 count++;
3143                                                 if (count > 20) break;
3144                                                 x = px - 8 + rand_int(17);
3145                                                 y = py - 8 + rand_int(17);
3146
3147                                                 if (!in_bounds(y,x) || (!cave_floor_bold(y,x) && (cave[y][x].feat != FEAT_TREES)) || !player_has_los_bold(y, x)) continue;
3148
3149                                                 dx = (px > x) ? (px - x) : (x - px);
3150                                                 dy = (py > y) ? (py - y) : (y - py);
3151
3152                                                 /* Approximate distance */
3153                                                 d = (dy > dx) ? (dy + (dx >> 1)) : (dx + (dy >> 1));
3154                                                 if (d < 9) break;
3155                                         }
3156
3157                                         if (count > 20) continue;
3158
3159                                         project(0, 2, y, x, plev * 2, GF_METEOR, PROJECT_KILL | PROJECT_JUMP | PROJECT_ITEM, -1);
3160                                 }
3161                         }
3162                         break;
3163                 case 29: /* Trump Demon */
3164                 {
3165                         bool pet = success; /* was (randint(10) > 3) */
3166                         bool group = (pet ? FALSE : TRUE);
3167
3168 #ifdef JP
3169 msg_print("¤¢¤Ê¤¿¤Ï¥Ç¡¼¥â¥ó¤Î¥«¡¼¥É¤Ë½¸Ã椹¤ë...");
3170 #else
3171                         msg_print("You concentrate on the trump of a demon...");
3172 #endif
3173
3174
3175                         if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_DEMON, group, FALSE, pet, FALSE, !pet))
3176                         {
3177                                 if (!pet)
3178 #ifdef JP
3179 msg_print("¾¤´Ô¤µ¤ì¤¿¥Ç¡¼¥â¥ó¤ÏÅܤäƤ¤¤ë¡ª");
3180 #else
3181                                         msg_print("The summoned demon gets angry!");
3182 #endif
3183
3184                         }
3185                         else
3186                         {
3187                                 no_trump = TRUE;
3188                         }
3189
3190                         break;
3191                 }
3192                 case 30: /* Trump Greater Undead */
3193                 {
3194                         bool pet = success; /* was (randint(10) > 3) */
3195                         bool group = (pet ? FALSE : TRUE);
3196
3197 #ifdef JP
3198 msg_print("¤¢¤Ê¤¿¤Ï¶¯ÎϤʥ¢¥ó¥Ç¥Ã¥É¤Î¥«¡¼¥É¤Ë½¸Ã椹¤ë...");
3199 #else
3200                         msg_print("You concentrate on the trump of a greater undead being...");
3201 #endif
3202
3203
3204                         if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_HI_UNDEAD, group, FALSE, pet, unique_okay, !pet))
3205                         {
3206                                 if (!pet)
3207 #ifdef JP
3208 msg_print("¾¤´Ô¤µ¤ì¤¿¾åµé¥¢¥ó¥Ç¥Ã¥É¤ÏÅܤäƤ¤¤ë¡ª");
3209 #else
3210                                         msg_print("The summoned greater undead creature gets angry!");
3211 #endif
3212
3213                         }
3214                         else
3215                         {
3216                                 no_trump = TRUE;
3217                         }
3218
3219                         break;
3220                 }
3221                 case 31: /* Trump Ancient Dragon */
3222                 {
3223                         bool pet = success; /* was (randint(10) > 3) */
3224                         bool group = (pet ? FALSE : TRUE);
3225                         int type;
3226                         if (p_ptr->pclass == CLASS_BEASTMASTER)
3227                         {
3228                                 type = SUMMON_HI_DRAGON_LIVING;
3229                         }
3230                         else
3231                         {
3232                                 type = SUMMON_HI_DRAGON;
3233                         }
3234
3235 #ifdef JP
3236 msg_print("¤¢¤Ê¤¿¤Ï¸ÅÂå¥É¥é¥´¥ó¤Î¥«¡¼¥É¤Ë½¸Ã椹¤ë...");
3237 #else
3238                         msg_print("You concentrate on the trump of an ancient dragon...");
3239 #endif
3240
3241
3242                         if (summon_specific((pet ? -1 : 0), py, px, summon_lev, type, group, FALSE, pet, unique_okay, !pet))
3243                         {
3244                                 if (!pet)
3245 #ifdef JP
3246 msg_print("¾¤´Ô¤µ¤ì¤¿¸ÅÂå¥É¥é¥´¥ó¤ÏÅܤäƤ¤¤ë¡ª");
3247 #else
3248                                         msg_print("The summoned ancient dragon gets angry!");
3249 #endif
3250
3251                         }
3252                         else
3253                         {
3254                                 no_trump = TRUE;
3255                         }
3256
3257                         break;
3258                 }
3259                 default:
3260 #ifdef JP
3261 msg_format("̤ÃΤΥ«¡¼¥É¤Î¼öʸ¤Ç¤¹: %d", spell);
3262 #else
3263                         msg_format("You cast an unknown Trump spell: %d.", spell);
3264 #endif
3265
3266                         msg_print(NULL);
3267         }
3268
3269         if (no_trump)
3270         {
3271 #ifdef JP
3272 msg_print("ï¤â¤¢¤Ê¤¿¤Î¥«¡¼¥É¤Î¸Æ¤ÓÀ¼¤ËÅú¤¨¤Ê¤¤¡£");
3273 #else
3274                 msg_print("Nobody answers to your Trump call.");
3275 #endif
3276
3277         }
3278
3279         return TRUE;
3280 }
3281
3282
3283 static bool cast_arcane_spell(int spell)
3284 {
3285         int     dir;
3286         int     beam;
3287         int     plev = p_ptr->lev;
3288         int     dummy = 0;
3289         bool    no_trump = FALSE;
3290
3291         if (p_ptr->pclass == CLASS_MAGE) beam = plev;
3292         else if (p_ptr->pclass == CLASS_HIGH_MAGE || p_ptr->pclass == CLASS_SORCERER) beam = plev + 10;
3293         else beam = plev / 2;
3294
3295         switch (spell)
3296         {
3297         case 0: /* Zap */
3298                 if (!get_aim_dir(&dir)) return FALSE;
3299
3300                 fire_bolt_or_beam(beam - 10, GF_ELEC, dir,
3301                         damroll(3 + ((plev - 1) / 5), 3));
3302                 break;
3303         case 1: /* Wizard Lock */
3304                 if (!get_aim_dir(&dir)) return FALSE;
3305
3306                 (void)wizard_lock(dir);
3307                 break;
3308         case 2: /* Detect Invisibility */
3309                 (void)detect_monsters_invis(DETECT_RAD_DEFAULT);
3310                 break;
3311         case 3: /* Detect Monsters */
3312                 (void)detect_monsters_normal(DETECT_RAD_DEFAULT);
3313                 break;
3314         case 4: /* Blink */
3315                 teleport_player(10);
3316                 break;
3317         case 5: /* Light Area */
3318                 (void)lite_area(damroll(2, (plev / 2)), (plev / 10) + 1);
3319                 break;
3320         case 6: /* Trap & Door Destruction */
3321                 if (!get_aim_dir(&dir)) return FALSE;
3322
3323                 (void)destroy_door(dir);
3324                 break;
3325         case 7: /* Cure Light Wounds */
3326                 (void)hp_player(damroll(2, 8));
3327                 (void)set_cut(p_ptr->cut - 10);
3328                 break;
3329         case 8: /* Detect Doors & Traps */
3330                 (void)detect_traps(DETECT_RAD_DEFAULT);
3331                 (void)detect_doors(DETECT_RAD_DEFAULT);
3332                 (void)detect_stairs(DETECT_RAD_DEFAULT);
3333                 break;
3334         case 9: /* Phlogiston */
3335                 phlogiston();
3336                 break;
3337         case 10: /* Detect Treasure */
3338                 (void)detect_treasure(DETECT_RAD_DEFAULT);
3339                 (void)detect_objects_gold(DETECT_RAD_DEFAULT);
3340                 break;
3341         case 11: /* Detect Enchantment */
3342                 (void)detect_objects_magic(DETECT_RAD_DEFAULT);
3343                 break;
3344         case 12: /* Detect Objects */
3345                 (void)detect_objects_normal(DETECT_RAD_DEFAULT);
3346                 break;
3347         case 13: /* Cure Poison */
3348                 (void)set_poisoned(0);
3349                 break;
3350         case 14: /* Resist Cold */
3351                 (void)set_oppose_cold(randint(20) + 20, FALSE);
3352                 break;
3353         case 15: /* Resist Fire */
3354                 (void)set_oppose_fire(randint(20) + 20, FALSE);
3355                 break;
3356         case 16: /* Resist Lightning */
3357                 (void)set_oppose_elec(randint(20) + 20, FALSE);
3358                 break;
3359         case 17: /* Resist Acid */
3360                 (void)set_oppose_acid(randint(20) + 20, FALSE);
3361                 break;
3362         case 18: /* Cure Medium Wounds */
3363                 (void)hp_player(damroll(4, 8));
3364                 (void)set_cut((p_ptr->cut / 2) - 50);
3365                 break;
3366         case 19: /* Teleport */
3367                 teleport_player(plev * 5);
3368                 break;
3369         case 20: /* Identify */
3370                 return ident_spell(FALSE);
3371         case 21: /* Stone to Mud */
3372                 if (!get_aim_dir(&dir)) return FALSE;
3373
3374                 (void)wall_to_mud(dir);
3375                 break;
3376         case 22: /* Ray of Light */
3377                 if (!get_aim_dir(&dir)) return FALSE;
3378
3379 #ifdef JP
3380 msg_print("¸÷Àþ¤¬Êü¤¿¤ì¤¿¡£");
3381 #else
3382                 msg_print("A line of light appears.");
3383 #endif
3384
3385                 (void)lite_line(dir);
3386                 break;
3387         case 23: /* Satisfy Hunger */
3388                 (void)set_food(PY_FOOD_MAX - 1);
3389                 break;
3390         case 24: /* See Invisible */
3391                 (void)set_tim_invis(randint(24) + 24, FALSE);
3392                 break;
3393         case 25: /* Conjure Elemental */
3394                 if (!summon_specific(-1, py, px, plev, SUMMON_ELEMENTAL, TRUE, TRUE, TRUE, FALSE, FALSE))
3395                         no_trump = TRUE;
3396                 break;
3397         case 26: /* Teleport Level */
3398                 if (!get_check("ËÜÅö¤Ë¾¤Î³¬¤Ë¥Æ¥ì¥Ý¡¼¥È¤·¤Þ¤¹¤«¡©")) return FALSE;
3399                 (void)teleport_player_level();
3400                 break;
3401         case 27: /* Teleport Away */
3402                 if (!get_aim_dir(&dir)) return FALSE;
3403
3404                 (void)fire_beam(GF_AWAY_ALL, dir, plev);
3405                 break;
3406         case 28: /* Elemental Ball */
3407                 if (!get_aim_dir(&dir)) return FALSE;
3408
3409                 switch (randint(4))
3410                 {
3411                         case 1:  dummy = GF_FIRE;break;
3412                         case 2:  dummy = GF_ELEC;break;
3413                         case 3:  dummy = GF_COLD;break;
3414                         default: dummy = GF_ACID;break;
3415                 }
3416                 fire_ball(dummy, dir, 75 + (plev), 2);
3417                 break;
3418         case 29: /* Detection */
3419                 (void)detect_all(DETECT_RAD_DEFAULT);
3420                 break;
3421         case 30: /* Word of Recall */
3422                 if (!word_of_recall()) return FALSE;
3423                 break;
3424         case 31: /* Clairvoyance */
3425                 chg_virtue(V_KNOWLEDGE, 1);
3426                 chg_virtue(V_ENLIGHTEN, 1);
3427                 wiz_lite(FALSE, FALSE);
3428                 if (!p_ptr->telepathy)
3429                 {
3430                         (void)set_tim_esp(randint(30) + 25, FALSE);
3431                 }
3432                 break;
3433         default:
3434                 msg_format("You cast an unknown Arcane spell: %d.", spell);
3435                 msg_print(NULL);
3436         }
3437
3438         if (no_trump)
3439 #ifdef JP
3440 msg_print("¥¨¥ì¥á¥ó¥¿¥ë¤Ï¸½¤ì¤Ê¤«¤Ã¤¿¡£");
3441 #else
3442                 msg_print("No Elementals arrive.");
3443 #endif
3444
3445         return TRUE;
3446 }
3447
3448
3449 static bool cast_enchant_spell(int spell)
3450 {
3451         int     plev = p_ptr->lev;
3452         int     dummy = 0;
3453         bool    no_trump = FALSE;
3454
3455         switch (spell)
3456         {
3457         case 0: /* Infravision */
3458                 set_tim_infra(100 + randint(100), FALSE);
3459                 break;
3460         case 1: /* Regeneration */
3461                 set_tim_regen(80 + randint(80), FALSE);
3462                 break;
3463         case 2: /* Satisfy Hunger */
3464                 (void)set_food(PY_FOOD_MAX - 1);
3465                 break;
3466         case 3: /* Resist Cold */
3467                 (void)set_oppose_cold(randint(20) + 20, FALSE);
3468                 break;
3469         case 4: /* Resist Fire */
3470                 (void)set_oppose_fire(randint(20) + 20, FALSE);
3471                 break;
3472         case 5: /* Heroism */
3473                 (void)set_hero(randint(25) + 25, FALSE);
3474                 (void)hp_player(10);
3475                 (void)set_afraid(0);
3476                 break;
3477         case 6: /* Resist Lightning */
3478                 (void)set_oppose_elec(randint(20) + 20, FALSE);
3479                 break;
3480         case 7: /* Resist Acid */
3481                 (void)set_oppose_acid(randint(20) + 20, FALSE);
3482                 break;
3483         case 8: /* See Invisibility */
3484                 (void)set_tim_invis(randint(24) + 24, FALSE);
3485                 break;
3486         case 9: /* Remove Curse */
3487                 if (remove_curse())
3488                 {
3489 #ifdef JP
3490                         msg_print("狼¤Ë¸«¼é¤é¤ì¤Æ¤¤¤ë¤è¤¦¤Êµ¤¤¬¤¹¤ë¡£");
3491 #else
3492                         msg_print("You feel as if someone is watching over you.");
3493 #endif
3494                 }
3495                 break;
3496         case 10: /* Resist Poison */
3497                 (void)set_oppose_pois(randint(20) + 20, FALSE);
3498                 break;
3499         case 11: /* Berserk */
3500                 (void)set_shero(randint(25) + 25, FALSE);
3501                 (void)hp_player(30);
3502                 (void)set_afraid(0);
3503                 break;
3504         case 12: /* Self Knowledge */
3505                 (void)self_knowledge();
3506                 break;
3507         case 13: /* Protection from Evil */
3508                 (void)set_protevil(randint(25) + 3 * p_ptr->lev, FALSE);
3509                 break;
3510         case 14: /* Healing */
3511                 set_poisoned(0);
3512                 set_stun(0);
3513                 set_cut(0);
3514                 set_image(0);
3515                 break;
3516         case 15: /* Mana Branding */
3517                 return choose_ele_attack();
3518                 break;
3519         case 16: /* Telepathy */
3520                 (void)set_tim_esp(randint(30) + 25, FALSE);
3521                 break;
3522         case 17: /* Stone Skin */
3523                 (void)set_shield(randint(20) + 30, FALSE);
3524                 break;
3525         case 18: /* Resistance */
3526                 (void)set_oppose_acid(randint(20) + 20, FALSE);
3527                 (void)set_oppose_elec(randint(20) + 20, FALSE);
3528                 (void)set_oppose_fire(randint(20) + 20, FALSE);
3529                 (void)set_oppose_cold(randint(20) + 20, FALSE);
3530                 (void)set_oppose_pois(randint(20) + 20, FALSE);
3531                 break;
3532         case 19: /* Haste */
3533                 (void)set_fast(randint(20 + plev) + plev, FALSE);
3534                 break;
3535         case 20: /* Walk through Wall */
3536                 (void)set_kabenuke(randint(plev/2) + plev/2, FALSE);
3537                 break;
3538         case 21: /* Pulish Shield */
3539                 (void)pulish_shield();
3540                 break;
3541         case 22: /* Create Golem */
3542                 if (summon_specific(-1, py, px, plev, SUMMON_GOLEM, FALSE, TRUE, TRUE, FALSE, FALSE))
3543                 {
3544 #ifdef JP
3545 msg_print("¥´¡¼¥ì¥à¤òºî¤Ã¤¿¡£");
3546 #else
3547                 msg_print("You make a golem.");
3548 #endif
3549                 }
3550                 else
3551                 {
3552                         no_trump = TRUE;
3553                 }
3554                 break;
3555         case 23: /* Magic armor */
3556                 (void)set_magicdef(randint(20) + 20, FALSE);
3557                 break;
3558         case 24: /* Remove Enchantment */
3559                 if (!mundane_spell(TRUE)) return FALSE;
3560                 break;
3561         case 25: /* Remove All Curse */
3562                 if (remove_all_curse())
3563                 {
3564 #ifdef JP
3565                         msg_print("狼¤Ë¸«¼é¤é¤ì¤Æ¤¤¤ë¤è¤¦¤Êµ¤¤¬¤¹¤ë¡£");
3566 #else
3567                         msg_print("You feel as if someone is watching over you.");
3568 #endif
3569                 }
3570                 break;
3571         case 26: /* Total Knowledge */
3572                 return identify_fully(FALSE);
3573                 break;
3574         case 27: /* Enchant Weapon */
3575                 return enchant_spell(rand_int(4) + 1, rand_int(4) + 1, 0);
3576                 break;
3577         case 28: /* Enchant Armor */
3578                 return enchant_spell(0, 0, rand_int(3) + 2);
3579                 break;
3580         case 29: /* Brand Weapon */
3581                 brand_weapon(rand_int(17));
3582                 break;
3583         case 30: /* Living Trump */
3584                 if (randint(7) == 1)
3585                         /* Teleport control */
3586                         dummy = 12;
3587                 else
3588                         /* Random teleportation (uncontrolled) */
3589                         dummy = 77;
3590                 /* Gain the mutation */
3591                 if (gain_random_mutation(dummy))
3592 #ifdef JP
3593 msg_print("¤¢¤Ê¤¿¤ÏÀ¸¤­¤Æ¤¤¤ë¥«¡¼¥É¤ËÊѤï¤Ã¤¿¡£");
3594 #else
3595                         msg_print("You have turned into a Living Trump.");
3596 #endif
3597                 break;
3598         case 31: /* Immune */
3599                 return (choose_ele_immune(13 + randint(13)));
3600                 break;
3601         default:
3602                 msg_format("You cast an unknown Craft spell: %d.", spell);
3603                 msg_print(NULL);
3604         }
3605
3606         if (no_trump)
3607 #ifdef JP
3608 msg_print("¤¦¤Þ¤¯¥´¡¼¥ì¥à¤òºî¤ì¤Ê¤«¤Ã¤¿¡£");
3609 #else
3610                 msg_print("No Golems arrive.");
3611 #endif
3612
3613         return TRUE;
3614 }
3615
3616
3617 /*
3618  * An "item_tester_hook" for offer
3619  */
3620 static bool item_tester_offer(object_type *o_ptr)
3621 {
3622         /* Flasks of oil are okay */
3623         if (o_ptr->tval != TV_CORPSE) return (FALSE);
3624
3625         if (o_ptr->sval != SV_CORPSE) return (FALSE);
3626
3627         if (strchr("pht", r_info[o_ptr->pval].d_char)) return (TRUE);
3628
3629         /* Assume not okay */
3630         return (FALSE);
3631 }
3632
3633
3634 static bool cast_daemon_spell(int spell)
3635 {
3636         int     dir, beam;
3637         int     plev = p_ptr->lev;
3638
3639         if (p_ptr->pclass == CLASS_MAGE) beam = plev;
3640         else if (p_ptr->pclass == CLASS_HIGH_MAGE || p_ptr->pclass == CLASS_SORCERER) beam = plev + 10;
3641         else beam = plev / 2;
3642
3643         switch (spell)
3644         {
3645         case 0: /* Magic Missile */
3646                 if (!get_aim_dir(&dir)) return FALSE;
3647
3648                 fire_bolt_or_beam(beam - 10, GF_MISSILE, dir,
3649                         damroll(3 + ((plev - 1) / 5), 4));
3650                 break;
3651         case 1: /* Detect Undead & Demons -> Unlife */
3652                 (void)detect_monsters_nonliving(DETECT_RAD_DEFAULT);
3653                 break;
3654         case 2: /* Bless */
3655                 (void)set_blessed(randint(12) + 12, FALSE);
3656                 break;
3657         case 3: /* Resist Fire */
3658                 (void)set_oppose_fire(randint(20) + 20, FALSE);
3659                 break;
3660         case 4: /* Horrify */
3661                 if (!get_aim_dir(&dir)) return FALSE;
3662
3663                 (void)fear_monster(dir, plev);
3664                 (void)stun_monster(dir, plev);
3665                 break;
3666         case 5: /* Nether Bolt */
3667                 if (!get_aim_dir(&dir)) return FALSE;
3668
3669                 fire_bolt_or_beam(beam, GF_NETHER, dir,
3670                     damroll(6 + ((plev - 5) / 4), 8));
3671                 break;
3672         case 6: /* Summon monster, demon */
3673                 if (!summon_specific(-1, py, px, (plev * 3) / 2, SUMMON_MANES, TRUE, FALSE, TRUE, FALSE, FALSE))
3674                 {
3675 #ifdef JP
3676 msg_print("¸ÅÂå¤Î»àÎî¤Ï¸½¤ì¤Ê¤«¤Ã¤¿¡£");
3677 #else
3678                         msg_print("No Manes arrive.");
3679 #endif
3680                 }
3681                 break;
3682         case 7: /* Mini Hellfire */
3683                 if (!get_aim_dir(&dir)) return FALSE;
3684
3685                 fire_ball(GF_HELL_FIRE, dir,
3686                         (damroll(3, 6) + plev +
3687                         (plev / (((p_ptr->pclass == CLASS_MAGE) ||
3688                         (p_ptr->pclass == CLASS_HIGH_MAGE) ||
3689                         (p_ptr->pclass == CLASS_SORCERER)) ? 2 : 4))),
3690                         ((plev < 30) ? 2 : 3));
3691                 break;
3692         case 8: /* Enslave Demon */
3693                 if (!get_aim_dir(&dir)) return FALSE;
3694
3695                 (void)control_one_demon(dir, plev);
3696                 break;
3697         case 9: /* Vision */
3698                 map_area(DETECT_RAD_MAP);
3699                 break;
3700         case 10: /* Resist Nether */
3701                 (void)set_tim_res_nether(randint(20) + 20, FALSE);
3702                 break;
3703         case 11: /* Plasma Bolt */
3704                 if (!get_aim_dir(&dir)) return FALSE;
3705
3706                 fire_bolt_or_beam(beam, GF_PLASMA, dir,
3707                     damroll(11 + ((plev - 5) / 4), 8));
3708                 break;
3709         case 12: /* Fire Ball */
3710                 if (!get_aim_dir(&dir)) return FALSE;
3711
3712                 fire_ball(GF_FIRE, dir, plev + 55, 2);
3713                 break;
3714         case 13: /* Fire Branding */
3715                 brand_weapon(1);
3716                 break;
3717         case 14: /* Nether Ball */
3718                 if (!get_aim_dir(&dir)) return FALSE;
3719
3720                 fire_ball(GF_NETHER, dir, plev*3/2 + 100, plev / 20+2);
3721                 break;
3722         case 15: /* Summon monster, demon */
3723         {
3724                 bool pet = (randint(3) != 1);
3725                 bool group = !(pet && (plev < 50));
3726
3727                 if (summon_specific((pet ? -1 : 0), py, px, plev*2/3+randint(plev/2), SUMMON_DEMON, group, FALSE, pet, FALSE, !pet))
3728                 {
3729 #ifdef JP
3730 msg_print("ⲫ¤Î°­½­¤¬½¼Ëþ¤·¤¿¡£");
3731 #else
3732                         msg_print("The area fills with a stench of sulphur and brimstone.");
3733 #endif
3734
3735
3736                         if (pet)
3737 #ifdef JP
3738 msg_print("¡Ö¤´ÍѤǤ´¤¶¤¤¤Þ¤¹¤«¡¢¤´¼ç¿ÍÍÍ¡×");
3739 #else
3740                                 msg_print("'What is thy bidding... Master?'");
3741 #endif
3742
3743                         else
3744 #ifdef JP
3745 msg_print("¡ÖÈܤ·¤­¼Ô¤è¡¢²æ¤ÏÆò¤Î²¼Ëͤˤ¢¤é¤º¡ª ¤ªÁ°¤Îº²¤òĺ¤¯¤¾¡ª¡×");
3746 #else
3747                                 msg_print("'NON SERVIAM! Wretch! I shall feast on thy mortal soul!'");
3748 #endif
3749
3750                 }
3751                 else
3752                 {
3753 #ifdef JP
3754 msg_print("°­Ëâ¤Ï¸½¤ì¤Ê¤«¤Ã¤¿¡£");
3755 #else
3756                         msg_print("No Greater Demon arrive.");
3757 #endif
3758                 }
3759                 break;
3760         }
3761         case 16: /* Telepathy */
3762                 (void)set_tim_esp(randint(30) + 25, FALSE);
3763                 break;
3764         case 17: /* Demoncloak */
3765         {
3766                 int dur=randint(20) + 20;
3767                         
3768                 set_oppose_fire(dur, FALSE);
3769                 set_oppose_cold(dur, FALSE);
3770                 set_tim_sh_fire(dur, FALSE);
3771                 set_afraid(0);
3772                 break;
3773         }
3774         case 18: /* Rain of Lava */
3775                 fire_ball(GF_FIRE, 0, (55 + plev)*2, 3);
3776                 fire_ball_hide(GF_LAVA_FLOW, 0, 2+randint(2), 3);
3777                 break;
3778         case 19: /* Plasma ball */
3779                 if (!get_aim_dir(&dir)) return FALSE;
3780
3781                 fire_ball(GF_PLASMA, dir, plev*3/2 + 80, 2 + plev/40);
3782                 break;
3783         case 20: /* Mimic demon */
3784                 (void)set_mimic(10+plev/2 + randint(10+plev/2), MIMIC_DEMON, FALSE);
3785                 break;
3786         case 21: /* Nether Wave == Dispel Good */
3787                 (void)dispel_monsters(randint(plev * 2));
3788                 (void)dispel_good(randint(plev * 2));
3789                 break;
3790         case 22: /*  */
3791                 if (!get_aim_dir(&dir)) return FALSE;
3792                 fire_ball(GF_NEXUS, dir, 100 + plev*2, 4);
3793                 break;
3794         case 23: /* Hand Doom */
3795                 if (!get_aim_dir(&dir)) return FALSE;
3796 #ifdef JP
3797 else msg_print("<ÇËÌǤμê>¤òÊü¤Ã¤¿¡ª");
3798 #else
3799                 else msg_print("You invokes the Hand of Doom!");
3800 #endif
3801
3802                 fire_ball_hide(GF_HAND_DOOM, dir, plev * 2, 0);
3803                 break;
3804         case 24: /* Heroism */
3805                 (void)set_hero(randint(25) + 25, FALSE);
3806                 (void)hp_player(10);
3807                 (void)set_afraid(0);
3808                 break;
3809         case 25: /* Tim resist time */
3810                 (void)set_tim_res_time(randint(20)+20, FALSE);
3811                 break;
3812         case 26: /* Circle of Madness */
3813                 fire_ball(GF_CHAOS, 0, 50+plev, 3+plev/20);
3814                 fire_ball(GF_CONFUSION, 0, 50+plev, 3+plev/20);
3815                 fire_ball(GF_CHARM, 0, 20+plev, 3+plev/20);
3816                 break;
3817         case 27: /* True Discharge Minion */
3818                 discharge_minion(TRUE);
3819                 break;
3820         case 28: /* Summon Greater Demon */
3821         {
3822                 int item;
3823                 cptr q, s;
3824                 int summon_lev;
3825                 object_type *o_ptr;
3826
3827                 item_tester_hook = item_tester_offer;
3828 #ifdef JP
3829                 q = "¤É¤Î»àÂΤòÊû¤²¤Þ¤¹¤«? ";
3830                 s = "Êû¤²¤é¤ì¤ë»àÂΤò»ý¤Ã¤Æ¤¤¤Ê¤¤¡£";
3831 #else
3832                 q = "Sacrifice which corpse? ";
3833                 s = "You have nothing to scrifice.";
3834 #endif
3835                 if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return FALSE;
3836
3837                 /* Get the item (in the pack) */
3838                 if (item >= 0)
3839                 {
3840                         o_ptr = &inventory[item];
3841                 }
3842
3843                 /* Get the item (on the floor) */
3844                 else
3845                 {
3846                         o_ptr = &o_list[0 - item];
3847                 }
3848
3849                 summon_lev = p_ptr->lev * 2 / 3 + r_info[o_ptr->pval].level;
3850                 if (summon_specific(-1, py, px, summon_lev, SUMMON_HI_DEMON, TRUE, FALSE, TRUE, FALSE, FALSE))
3851                 {
3852 #ifdef JP
3853 msg_print("ⲫ¤Î°­½­¤¬½¼Ëþ¤·¤¿¡£");
3854 #else
3855                         msg_print("The area fills with a stench of sulphur and brimstone.");
3856 #endif
3857
3858
3859 #ifdef JP
3860 msg_print("¡Ö¤´ÍѤǤ´¤¶¤¤¤Þ¤¹¤«¡¢¤´¼ç¿ÍÍÍ¡×");
3861 #else
3862                         msg_print("'What is thy bidding... Master?'");
3863 #endif
3864
3865                         /* Decrease the item (from the pack) */
3866                         if (item >= 0)
3867                         {
3868                                 inven_item_increase(item, -1);
3869                                 inven_item_describe(item);
3870                                 inven_item_optimize(item);
3871                         }
3872
3873                         /* Decrease the item (from the floor) */
3874                         else
3875                         {
3876                                 floor_item_increase(0 - item, -1);
3877                                 floor_item_describe(0 - item);
3878                                 floor_item_optimize(0 - item);
3879                         }
3880                 }
3881                 else
3882                 {
3883 #ifdef JP
3884 msg_print("°­Ëâ¤Ï¸½¤ì¤Ê¤«¤Ã¤¿¡£");
3885 #else
3886                         msg_print("No Greater Demon arrive.");
3887 #endif
3888                 }
3889                 break;
3890         }
3891         case 29: /* Nether Storm */
3892                 if (!get_aim_dir(&dir)) return FALSE;
3893
3894                 fire_ball(GF_NETHER, dir, plev*15, plev / 5);
3895                 break;
3896         case 30: /* Blood curse */
3897         {
3898                 if (!get_aim_dir(&dir)) return FALSE;
3899
3900                 fire_ball_hide(GF_BLOOD_CURSE, dir, 600, 0);
3901 #ifdef JP
3902 take_hit(DAMAGE_USELIFE, 20 + randint(30), "·ì¤Î¼ö¤¤", -1);
3903 #else
3904                 take_hit(DAMAGE_USELIFE, 20 + randint(30), "Blood curse", -1);
3905 #endif
3906                 break;
3907         }
3908         case 31: /* Mimic Demon lord */
3909                 (void)set_mimic(15 + randint(15), MIMIC_DEMON_LORD, FALSE);
3910                 break;
3911         default:
3912                 msg_format("You cast an unknown Daemon spell: %d.", spell);
3913                 msg_print(NULL);
3914         }
3915
3916         return TRUE;
3917 }
3918
3919
3920 void stop_singing(void)
3921 {
3922         if (p_ptr->pclass != CLASS_BARD) return;
3923
3924         if (p_ptr->magic_num1[1])
3925         {
3926                 p_ptr->magic_num1[1] = 0;
3927                 return;
3928         }
3929         if (!p_ptr->magic_num1[0]) return;
3930
3931         set_action(ACTION_NONE);
3932
3933         switch(p_ptr->magic_num1[0])
3934         {
3935                 case MUSIC_BLESS:
3936                         if (!p_ptr->blessed)
3937 #ifdef JP
3938 msg_print("¹â·é¤Êµ¤Ê¬¤¬¾Ã¤¨¼º¤»¤¿¡£");
3939 #else
3940                                 msg_print("The prayer has expired.");
3941 #endif
3942                         break;
3943                 case MUSIC_HERO:
3944                         if (!p_ptr->hero)
3945                         {
3946 #ifdef JP
3947 msg_print("¥Ò¡¼¥í¡¼¤Îµ¤Ê¬¤¬¾Ã¤¨¼º¤»¤¿¡£");
3948 #else
3949                                 msg_print("The heroism wears off.");
3950 #endif
3951                                 /* Recalculate hitpoints */
3952                                 p_ptr->update |= (PU_HP);
3953                         }
3954                         break;
3955                 case MUSIC_MIND:
3956                         if (!p_ptr->tim_esp)
3957                         {
3958 #ifdef JP
3959 msg_print("°Õ¼±¤Ï¸µ¤ËÌá¤Ã¤¿¡£");
3960 #else
3961                                 msg_print("Your consciousness contracts again.");
3962 #endif
3963                                 /* Update the monsters */
3964                                 p_ptr->update |= (PU_MONSTERS);
3965                         }
3966                         break;
3967                 case MUSIC_STEALTH:
3968                         if (!p_ptr->tim_stealth)
3969 #ifdef JP
3970 msg_print("»Ñ¤¬¤Ï¤Ã¤­¤ê¤È¸«¤¨¤ë¤è¤¦¤Ë¤Ê¤Ã¤¿¡£");
3971 #else
3972                                 msg_print("You are no longer hided.");
3973 #endif
3974                         break;
3975                 case MUSIC_RESIST:
3976                         if (!p_ptr->oppose_acid)
3977 #ifdef JP
3978 msg_print("»À¤Ø¤ÎÂÑÀ­¤¬Çö¤ì¤¿µ¤¤¬¤¹¤ë¡£");
3979 #else
3980                                 msg_print("You feel less resistant to acid.");
3981 #endif
3982                         if (!p_ptr->oppose_elec)
3983 #ifdef JP
3984 msg_print("ÅÅ·â¤Ø¤ÎÂÑÀ­¤¬Çö¤ì¤¿µ¤¤¬¤¹¤ë¡£");
3985 #else
3986                                 msg_print("You feel less resistant to elec.");
3987 #endif
3988                         if (!p_ptr->oppose_fire)
3989 #ifdef JP
3990 msg_print("²Ð¤Ø¤ÎÂÑÀ­¤¬Çö¤ì¤¿µ¤¤¬¤¹¤ë¡£");
3991 #else
3992                                 msg_print("You feel less resistant to fire.");
3993 #endif
3994                         if (!p_ptr->oppose_cold)
3995 #ifdef JP
3996 msg_print("Î䵤¤Ø¤ÎÂÑÀ­¤¬Çö¤ì¤¿µ¤¤¬¤¹¤ë¡£");
3997 #else
3998                                 msg_print("You feel less resistant to cold.");
3999 #endif
4000                         if (!p_ptr->oppose_pois)
4001 #ifdef JP
4002 msg_print("ÆǤؤÎÂÑÀ­¤¬Çö¤ì¤¿µ¤¤¬¤¹¤ë¡£");
4003 #else
4004                                 msg_print("You feel less resistant to pois.");
4005 #endif
4006                         break;
4007                 case MUSIC_SPEED:
4008                         if (!p_ptr->fast)
4009 #ifdef JP
4010 msg_print("Æ°¤­¤ÎÁÇÁᤵ¤¬¤Ê¤¯¤Ê¤Ã¤¿¤è¤¦¤À¡£");
4011 #else
4012                                 msg_print("You feel yourself slow down.");
4013 #endif
4014                         break;
4015                 case MUSIC_SHERO:
4016                         if (!p_ptr->hero)
4017                         {
4018 #ifdef JP
4019 msg_print("¥Ò¡¼¥í¡¼¤Îµ¤Ê¬¤¬¾Ã¤¨¼º¤»¤¿¡£");
4020 #else
4021                                 msg_print("The heroism wears off.");
4022 #endif
4023                                 /* Recalculate hitpoints */
4024                                 p_ptr->update |= (PU_HP);
4025                         }
4026
4027                         if (!p_ptr->fast)
4028 #ifdef JP
4029 msg_print("Æ°¤­¤ÎÁÇÁᤵ¤¬¤Ê¤¯¤Ê¤Ã¤¿¤è¤¦¤À¡£");
4030 #else
4031                                 msg_print("You feel yourself slow down.");
4032 #endif
4033                         break;
4034                 case MUSIC_INVULN:
4035                         if (!p_ptr->invuln)
4036                         {
4037 #ifdef JP
4038 msg_print("̵Ũ¤Ç¤Ï¤Ê¤¯¤Ê¤Ã¤¿¡£");
4039 #else
4040                                 msg_print("The invulnerability wears off.");
4041 #endif
4042                                 /* Redraw map */
4043                                 p_ptr->redraw |= (PR_MAP);
4044
4045                                 /* Update monsters */
4046                                 p_ptr->update |= (PU_MONSTERS);
4047
4048                                 /* Window stuff */
4049                                 p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
4050                         }
4051                         break;
4052         }
4053         p_ptr->magic_num1[0] = MUSIC_NONE;
4054         p_ptr->magic_num2[0] = 0;
4055
4056         /* Recalculate bonuses */
4057         p_ptr->update |= (PU_BONUS | PU_HP);
4058
4059         /* Redraw status bar */
4060         p_ptr->redraw |= (PR_STATUS);
4061 }
4062
4063
4064 static bool cast_music_spell(int spell)
4065 {
4066         int     plev = p_ptr->lev;
4067         int dir;
4068
4069         if(p_ptr->magic_num1[0])
4070         {
4071                 stop_singing();
4072         }
4073
4074         p_ptr->magic_num2[0] = spell;
4075
4076         switch (spell)
4077         {
4078         case 0: /* Song of Holding ÃÙÆߤβÎ*/
4079 #ifdef JP
4080                 msg_print("¤æ¤Ã¤¯¤ê¤È¤·¤¿¥á¥í¥Ç¥£¤ò¸ý¤º¤µ¤ß»Ï¤á¤¿¡¥¡¥¡¥");
4081 #else
4082                 msg_print("You start humming a slow, steady melody...");
4083 #endif
4084                 p_ptr->magic_num1[0] = MUSIC_SLOW;
4085                 break;
4086         case 1:  /* Song of Blessing ½ËÊ¡¤Î²Î */
4087 #ifdef JP
4088                 msg_print("¸·¤«¤Ê¥á¥í¥Ç¥£¤òÁդǻϤ᤿¡¥¡¥¡¥");
4089 #else
4090                 msg_print("The holy power of the Music of the Ainur enters you...");
4091 #endif
4092                 p_ptr->magic_num1[0] = MUSIC_BLESS;
4093                 break;
4094                 
4095         case 2:  /* Wrecking Note Êø²õ¤Î²»¿§ */
4096                 if (!get_aim_dir(&dir)) return FALSE;
4097                 fire_bolt(GF_SOUND, dir,
4098                           damroll(4 + ((plev - 1) / 5), 4));
4099                 break;
4100         case 3:  /* Stun Pattern Û¯Û°¤ÎÀûΧ */
4101 #ifdef JP
4102                 msg_print("âÁÏǤµ¤»¤ë¥á¥í¥Ç¥£¤òÁդǻϤ᤿¡¥¡¥¡¥");
4103 #else
4104                 msg_print("You weave a pattern of sounds to bewilder and daze...");
4105 #endif
4106                 p_ptr->magic_num1[0] = MUSIC_STUN;
4107                 break;
4108         case 4:  /* Flow of life À¸Ì¿¤Îή¤ì */
4109 #ifdef JP
4110                 msg_print("²Î¤òÄ̤·¤ÆÂΤ˳赤¤¬Ìá¤Ã¤Æ¤­¤¿¡¥¡¥¡¥");
4111 #else
4112                 msg_print("Life flows through you as you sing a song of healing...");
4113 #endif
4114                 p_ptr->magic_num1[0] = MUSIC_L_LIFE;
4115                 break;
4116         case 5:  /* Song of the Sun ÂÀÍۤβΠ*/
4117 #ifdef JP
4118                 msg_print("¸÷¤êµ±¤¯²Î¤¬ÊÕ¤ê¤ò¾È¤é¤·¤¿¡£");
4119 #else
4120                 msg_print("Your uplifting song brings brightness to dark places...");
4121 #endif
4122                 (void)lite_area(damroll(2, (plev / 2)), (plev / 10) + 1);
4123                 break;
4124         case 6:  /* Song of fear ¶²ÉݤβΠ*/
4125 #ifdef JP
4126                 msg_print("¤ª¤É¤í¤ª¤É¤í¤·¤¤¥á¥í¥Ç¥£¤òÁդǻϤ᤿¡¥¡¥¡¥");
4127 #else
4128                 msg_print("You start weaving a fearful pattern...");
4129 #endif
4130                 p_ptr->magic_num1[0] = MUSIC_FEAR;
4131                 break;
4132         case 7:  /* Heroic Ballad À襤¤Î²Î */
4133 #ifdef JP
4134                 msg_print("·ã¤·¤¤À襤¤Î²Î¤ò²Î¤Ã¤¿¡¥¡¥¡¥");
4135 #else
4136                 msg_print("You start singing a song of intense fighting...");
4137 #endif
4138                 p_ptr->magic_num1[0] = MUSIC_HERO;
4139                 break;
4140         case 8:  /* Clairaudience ÎîŪÃγР*/
4141 #ifdef JP
4142                 msg_print("ÀŤ«¤Ê²»³Ú¤¬´¶³Ð¤ò¸¦¤®À¡¤Þ¤µ¤»¤¿¡¥¡¥¡¥");
4143 #else
4144                 msg_print("Your quiet music sharpens your sense of hearing...");
4145 #endif
4146                 p_ptr->magic_num1[0] = MUSIC_DETECT;
4147                 break;
4148         case 9: /* º²¤Î²Î */
4149 #ifdef JP
4150                 msg_print("Àº¿À¤òDZ¤¸¶Ê¤²¤ë²Î¤ò²Î¤Ã¤¿¡¥¡¥¡¥");
4151 #else
4152                 msg_print("You start singing a song of soul in pain...");
4153 #endif
4154                 p_ptr->magic_num1[0] = MUSIC_PSI;
4155                 break;
4156         case 10:  /* Song of Lore Ãμ±¤Î²Î */
4157 #ifdef JP
4158                 msg_print("¤³¤ÎÀ¤³¦¤ÎÃ챤¬Î®¤ì¹þ¤ó¤Ç¤­¤¿¡¥¡¥¡¥");
4159 #else
4160                 msg_print("You recall the rich lore of the world...");
4161 #endif
4162                 p_ptr->magic_num1[0] = MUSIC_ID;
4163                 break;
4164         case 11:  /* hidding song ±£ÆۤβΠ*/
4165 #ifdef JP
4166                 msg_print("¤¢¤Ê¤¿¤Î»Ñ¤¬·Ê¿§¤Ë¤È¤±¤³¤ó¤Ç¤¤¤Ã¤¿¡¥¡¥¡¥");
4167 #else
4168                 msg_print("Your song carries you beyond the sight of mortal eyes...");
4169 #endif
4170                 p_ptr->magic_num1[0] = MUSIC_STEALTH;
4171                 break;
4172         case 12:  /* Illusion Pattern ¸¸±Æ¤ÎÀûΧ */
4173 #ifdef JP
4174                 msg_print("ÊÕ¤ê°ìÌ̤˸¸±Æ¤¬¸½¤ì¤¿¡¥¡¥¡¥");
4175 #else
4176                 msg_print("You weave a pattern of sounds to beguile and confuse...");
4177 #endif
4178                 p_ptr->magic_num1[0] = MUSIC_CONF;
4179                 break;
4180         case 13:  /* Doomcall (vibration song) ÇËÌǤζ«¤Ó */
4181 #ifdef JP
4182                 msg_print("¹ì²»¤¬¶Á¤¤¤¿¡¥¡¥¡¥");
4183 #else
4184                 msg_print("The fury of the Downfall of Numenor lashes out...");
4185 #endif
4186                 p_ptr->magic_num1[0] = MUSIC_SOUND;
4187                 break;
4188         case 14:  /* Firiel's Song (song of the Undeads) ¥Õ¥£¥ê¥¨¥ë¤Î²Î */
4189 #ifdef JP
4190                 msg_print("À¸Ì¿¤ÈÉü³è¤Î¥Æ¡¼¥Þ¤òÁդǻϤ᤿¡¥¡¥¡¥");
4191 #else
4192                 msg_print("The themes of life and revival are woven into your song...");
4193 #endif
4194                 animate_dead(0, py, px);
4195                 break;
4196         case 15:  /* Fellowship Chant (charming song) Î¹¤ÎÃç´Ö */
4197 #ifdef JP
4198                 msg_print("°Â¤é¤«¤Ê¥á¥í¥Ç¥£¤òÁդǻϤ᤿¡¥¡¥¡¥");
4199 #else
4200                 msg_print("You weave a slow, soothing melody of imploration...");
4201 #endif
4202                 p_ptr->magic_num1[0] = MUSIC_CHARM;
4203                 break;
4204         case 16:  /* (wall breaking song) Ê¬²ò²»ÇÈ */
4205 #ifdef JP
4206                 msg_print("Ê´ºÕ¤¹¤ë¥á¥í¥Ç¥£¤òÁդǻϤ᤿¡¥¡¥¡¥");
4207 #else
4208                 msg_print("You weave a violent pattern of sounds to break wall.");
4209 #endif
4210                 p_ptr->magic_num1[0] = MUSIC_WALL;
4211                 project(0, 0, py, px,
4212                         0, GF_DISINTEGRATE, PROJECT_KILL | PROJECT_ITEM | PROJECT_HIDE, -1);
4213                 break;
4214         case 17:  /* Finrod's Resistance (song of resistance) ¸µÁÇÂÑÀ­ */
4215 #ifdef JP
4216                 msg_print("¸µÁǤÎÎϤËÂФ¹¤ëǦÂѤβΤò²Î¤Ã¤¿¡£");
4217 #else
4218                 msg_print("You sing a song of perseverance against powers...");
4219 #endif
4220                 p_ptr->magic_num1[0] = MUSIC_RESIST;
4221                 break;
4222         case 18:  /* Hobbit Melodies (song of time) ¥Û¥Ó¥Ã¥È¤Î¥á¥í¥Ç¥£ */
4223 #ifdef JP
4224                 msg_print("·Ú²÷¤Ê²Î¤ò¸ý¤º¤µ¤ß»Ï¤á¤¿¡¥¡¥¡¥");
4225 #else
4226                 msg_print("You start singing joyful pop song...");
4227 #endif
4228                 p_ptr->magic_num1[0] = MUSIC_SPEED;
4229                 break;
4230         case 19:  /* World Contortion ÏĤó¤ÀÀ¤³¦ */
4231 #ifdef JP
4232                 msg_print("²Î¤¬¶õ´Ö¤òÏĤ᤿¡¥¡¥¡¥");
4233 #else
4234                 msg_print("Reality whirls wildly as you sing a dizzying melody...");
4235 #endif
4236                 project(0, plev/15 + 1, py, px, plev * 3 + 1, GF_AWAY_ALL , PROJECT_KILL, -1);
4237                 break;
4238         case 20: /* Â໶¤Î²Î */
4239 #ifdef JP
4240                 msg_print("ÂѤ¨¤é¤ì¤Ê¤¤ÉÔ¶¨Ï²»¤¬Å¨¤òÀÕ¤áΩ¤Æ¤¿¡¥¡¥¡¥");
4241 #else
4242                 msg_print("You cry out in an ear-wracking voice...");
4243 #endif
4244                 p_ptr->magic_num1[0] = MUSIC_DISPEL;
4245                 break;
4246         case 21: /* The Voice of Saruman ¥µ¥ë¥Þ¥ó¤Î´Å¸À */
4247 #ifdef JP
4248                 msg_print("Í¥¤·¤¯¡¢Ì¥ÎÏŪ¤Ê²Î¤ò¸ý¤º¤µ¤ß»Ï¤á¤¿¡¥¡¥¡¥");
4249 #else
4250                 msg_print("You start humming a gentle and attractive song...");
4251 #endif
4252                 p_ptr->magic_num1[0] = MUSIC_SARUMAN;
4253                 break;
4254         case 22:  /* Song of Tempest (song of death) Íò¤Î²»¿§ */
4255                 if (!get_aim_dir(&dir)) return FALSE;
4256                 fire_beam(GF_SOUND, dir,
4257                           damroll(15 + ((plev - 1) / 2), 10));
4258                 break;
4259         case 23:  /* (song of disruption) ¤â¤¦°ì¤Ä¤ÎÀ¤³¦ */
4260 #ifdef JP
4261                 msg_print("¼þ°Ï¤¬ÊѲ½¤·»Ï¤á¤¿¡¥¡¥¡¥");
4262 #else
4263                 msg_print("You sing of the primeval shaping of Middle-earth...");
4264 #endif
4265                 alter_reality();
4266                 break;
4267         case 24:  /* Wrecking Pattern (destruction shriek) Ç˲õ¤ÎÀûΧ */
4268 #ifdef JP
4269                 msg_print("Ç˲õŪ¤Ê²Î¤¬¶Á¤­¤ï¤¿¤Ã¤¿¡¥¡¥¡¥");
4270 #else
4271                 msg_print("You weave a pattern of sounds to contort and shatter...");
4272 #endif
4273                 p_ptr->magic_num1[0] = MUSIC_QUAKE;
4274                 break;
4275         case 25: /* ÄäÂڤβΠ */
4276 #ifdef JP
4277                 msg_print("¤æ¤Ã¤¯¤ê¤È¤·¤¿¥á¥í¥Ç¥£¤òÁդǻϤ᤿¡¥¡¥¡¥");
4278 #else
4279                 msg_print("You weave a very slow pattern which is almost likely to stop...");
4280 #endif
4281                 p_ptr->magic_num1[0] = MUSIC_STASIS;
4282                 break;
4283         case 26: /* ¼é¤ê¤Î²Î */
4284 #ifdef JP
4285                 msg_print("²Î¤¬¿ÀÀ»¤Ê¾ì¤òºî¤ê½Ð¤·¤¿¡¥¡¥¡¥");
4286 #else
4287                 msg_print("The holy power of the Music is creating sacred field...");
4288 #endif
4289                 warding_glyph();
4290                 break;
4291         case 27: /* ±Ñͺ¤Î»í */
4292 #ifdef JP
4293                 msg_print("±Ñͺ¤Î²Î¤ò¸ý¤º¤µ¤ó¤À¡¥¡¥¡¥");
4294 #else
4295                 msg_print("You chant a powerful, heroic call to arms...");
4296 #endif
4297                 p_ptr->magic_num1[0] = MUSIC_SHERO;
4298                 (void)hp_player(10);
4299                 (void)set_afraid(0);
4300                 break;
4301         case 28: /* ¥ä¥ô¥¡¥ó¥Ê¤Î½õ¤± */
4302 #ifdef JP
4303                 msg_print("²Î¤òÄ̤·¤ÆÂΤ˳赤¤¬Ìá¤Ã¤Æ¤­¤¿¡¥¡¥¡¥");
4304 #else
4305                 msg_print("Life flows through you as you sing the song...");
4306 #endif
4307                 p_ptr->magic_num1[0] = MUSIC_H_LIFE;
4308                 break;
4309         case 29: /* ºÆÀ¸¤Î²Î */
4310 #ifdef JP
4311                 msg_print("°Å¹õ¤ÎÃæ¤Ë¸÷¤ÈÈþ¤ò¤Õ¤ê¤Þ¤¤¤¿¡£ÂΤ¬¸µ¤Î³èÎϤò¼è¤êÌᤷ¤¿¡£");
4312 #else
4313                 msg_print("You strewed light and beauty in the dark as you sing. You feel refreshed.");
4314 #endif
4315                 (void)do_res_stat(A_STR);
4316                 (void)do_res_stat(A_INT);
4317                 (void)do_res_stat(A_WIS);
4318                 (void)do_res_stat(A_DEX);
4319                 (void)do_res_stat(A_CON);
4320                 (void)do_res_stat(A_CHR);
4321                 (void)restore_level();
4322                 break;
4323         case 30:  /* shriek of death ¥µ¥¦¥í¥ó¤ÎËâ½Ñ */
4324                 if (!get_aim_dir(&dir)) return FALSE;
4325                 fire_ball(GF_SOUND, dir, damroll(50 + plev, 10), 0);
4326                 break;
4327         case 31:  /* song of liberty ¥Õ¥£¥ó¥´¥ë¥Õ¥£¥ó¤ÎÄ©Àï */
4328 #ifdef JP
4329                 msg_print("¥Õ¥£¥ó¥´¥ë¥Õ¥£¥ó¤Î̽²¦¤Ø¤ÎÄ©Àï¤ò²Î¤Ã¤¿¡¥¡¥¡¥");
4330 #else
4331                 msg_print("You recall the valor of Fingolfin's challenge to the Dark Lord...");
4332 #endif
4333                 p_ptr->magic_num1[0] = MUSIC_INVULN;
4334                 
4335                 /* Redraw map */
4336                 p_ptr->redraw |= (PR_MAP);
4337                 
4338                 /* Update monsters */
4339                 p_ptr->update |= (PU_MONSTERS);
4340                 
4341                 /* Window stuff */
4342                 p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
4343                 break;
4344         default:
4345 #ifdef JP
4346                 msg_format("̤ÃΤβÎ(%d)¤ò²Î¤Ã¤¿¡£", spell);
4347 #else
4348                 msg_format("You sing an unknown song: %d.", spell);
4349 #endif
4350                 msg_print(NULL);
4351         }
4352
4353         if (p_ptr->magic_num1[0]) set_action(ACTION_SING);
4354
4355         /* Recalculate bonuses */
4356         p_ptr->update |= (PU_BONUS | PU_HP);
4357
4358         /* Redraw status bar */
4359         p_ptr->redraw |= (PR_STATUS);
4360         return TRUE;
4361 }
4362
4363
4364 /*
4365  * Cast a spell
4366  */
4367 void do_cmd_cast(void)
4368 {
4369 #ifdef USE_SCRIPT
4370         use_skill_callback();
4371 #else /* USE_SCRIPT */
4372         int     item, sval, spell, realm;
4373         int     chance;
4374         int     increment = 0;
4375         int     use_realm;
4376         int     shouhimana;
4377         bool cast;
4378
4379         cptr prayer;
4380
4381         object_type     *o_ptr;
4382
4383         magic_type      *s_ptr;
4384
4385         cptr q, s;
4386
4387         /* Require spell ability */
4388         if (!p_ptr->realm1 && (p_ptr->pclass != CLASS_SORCERER) && (p_ptr->pclass != CLASS_RED_MAGE))
4389         {
4390 #ifdef JP
4391 msg_print("¼öʸ¤ò¾§¤¨¤é¤ì¤Ê¤¤¡ª");
4392 #else
4393                 msg_print("You cannot cast spells!");
4394 #endif
4395
4396                 return;
4397         }
4398
4399         /* Require lite */
4400         if (p_ptr->blind || no_lite())
4401         {
4402 #ifdef JP
4403 msg_print("Ìܤ¬¸«¤¨¤Ê¤¤¡ª");
4404 #else
4405                 msg_print("You cannot see!");
4406 #endif
4407                 if (p_ptr->pclass == CLASS_FORCETRAINER)
4408                     do_cmd_mind();
4409                 else
4410                         flush();
4411                 return;
4412         }
4413
4414         /* Not when confused */
4415         if (p_ptr->confused)
4416         {
4417 #ifdef JP
4418 msg_print("º®Í𤷤Ƥ¤¤Æ¾§¤¨¤é¤ì¤Ê¤¤¡ª");
4419 #else
4420                 msg_print("You are too confused!");
4421 #endif
4422                 flush();
4423                 return;
4424         }
4425
4426         prayer = spell_categoly_name(mp_ptr->spell_book);
4427
4428         /* Restrict choices to spell books */
4429         item_tester_tval = mp_ptr->spell_book;
4430
4431         /* Get an item */
4432 #ifdef JP
4433 q = "¤É¤Î¼öʸ½ñ¤ò»È¤¤¤Þ¤¹¤«? ";
4434 #else
4435         q = "Use which book? ";
4436 #endif
4437
4438 #ifdef JP
4439 s = "¼öʸ½ñ¤¬¤Ê¤¤¡ª";
4440 #else
4441         s = "You have no spell books!";
4442 #endif
4443
4444         select_spellbook=TRUE;
4445         if (p_ptr->pclass == CLASS_FORCETRAINER)
4446                 select_the_force = TRUE;
4447         if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))){
4448             select_spellbook = FALSE;
4449             select_the_force = FALSE;
4450             return;
4451         }
4452         select_spellbook = FALSE;
4453         select_the_force = FALSE;
4454
4455         if (item == 1111) { /* the_force */
4456             do_cmd_mind();
4457             return;
4458         } else
4459         /* Get the item (in the pack) */
4460         if (item >= 0)
4461         {
4462                 o_ptr = &inventory[item];
4463         }
4464
4465         /* Get the item (on the floor) */
4466         else
4467         {
4468                 o_ptr = &o_list[0 - item];
4469         }
4470
4471 #ifdef USE_SCRIPT
4472         if (object_cast_callback(o_ptr)) return;
4473 #endif /* USE_SCRIPT */
4474
4475         /* Access the item's sval */
4476         sval = o_ptr->sval;
4477
4478         if ((p_ptr->pclass != CLASS_SORCERER) && (p_ptr->pclass != CLASS_RED_MAGE) && (o_ptr->tval == REALM2_BOOK)) increment = 32;
4479
4480
4481         /* Track the object kind */
4482         object_kind_track(o_ptr->k_idx);
4483
4484         /* Hack -- Handle stuff */
4485         handle_stuff();
4486
4487         if ((p_ptr->pclass == CLASS_SORCERER) || (p_ptr->pclass == CLASS_RED_MAGE))
4488                 realm = o_ptr->tval - TV_LIFE_BOOK + 1;
4489         else if (increment) realm = p_ptr->realm2;
4490         else realm = p_ptr->realm1;
4491
4492         /* Ask for a spell */
4493 #ifdef JP
4494         if (!get_spell(&spell,  
4495                                 ((mp_ptr->spell_book == TV_LIFE_BOOK) ? "±Ó¾§¤¹¤ë" : (mp_ptr->spell_book == TV_MUSIC_BOOK) ? "²Î¤¦" : "¾§¤¨¤ë"), 
4496                        sval, TRUE, realm))
4497         {
4498                 if (spell == -2) msg_format("¤½¤ÎËܤˤÏÃΤäƤ¤¤ë%s¤¬¤Ê¤¤¡£", prayer);
4499                 return;
4500         }
4501 #else
4502         if (!get_spell(&spell, ((mp_ptr->spell_book == TV_LIFE_BOOK) ? "recite" : "cast"),
4503                 sval, TRUE, realm))
4504         {
4505                 if (spell == -2)
4506                         msg_format("You don't know any %ss in that book.", prayer);
4507                 return;
4508         }
4509 #endif
4510
4511
4512         use_realm = tval2realm(o_ptr->tval);
4513
4514         if (!is_magic(use_realm))
4515         {
4516                 s_ptr = &technic_info[use_realm - MIN_TECHNIC - 1][spell];
4517         }
4518         else
4519         {
4520                 s_ptr = &mp_ptr->info[realm - 1][spell];
4521         }
4522
4523         if (p_ptr->pclass == CLASS_SORCERER)
4524                 shouhimana = s_ptr->smana*2200 + 2399;
4525         else if (p_ptr->pclass == CLASS_RED_MAGE)
4526                 shouhimana = s_ptr->smana*2600 + 2399;
4527         else
4528                 shouhimana = (s_ptr->smana*(3800-spell_exp[(increment ? spell+32 : spell)])+2399);
4529         if(p_ptr->dec_mana)
4530                 shouhimana *= 3;
4531         else shouhimana *= 4;
4532         shouhimana /= 9600;
4533         if(shouhimana < 1) shouhimana = 1;
4534
4535         /* Verify "dangerous" spells */
4536         if (shouhimana > p_ptr->csp)
4537         {
4538                 /* Warning */
4539 #ifdef JP
4540 msg_format("¤½¤Î%s¤ò%s¤Î¤Ë½½Ê¬¤Ê¥Þ¥¸¥Ã¥¯¥Ý¥¤¥ó¥È¤¬¤Ê¤¤¡£",prayer,
4541 ((mp_ptr->spell_book == TV_LIFE_BOOK) ? "±Ó¾§¤¹¤ë" : (mp_ptr->spell_book == TV_LIFE_BOOK) ? "²Î¤¦" : "¾§¤¨¤ë"));
4542 #else
4543                 msg_format("You do not have enough mana to %s this %s.",
4544                         ((mp_ptr->spell_book == TV_LIFE_BOOK) ? "recite" : "cast"),
4545                         prayer);
4546 #endif
4547
4548
4549                 if (!over_exert) return;
4550
4551                 /* Verify */
4552 #ifdef JP
4553 if (!get_check("¤½¤ì¤Ç¤âÄ©À路¤Þ¤¹¤«? ")) return;
4554 #else
4555                 if (!get_check("Attempt it anyway? ")) return;
4556 #endif
4557
4558         }
4559
4560
4561         /* Spell failure chance */
4562         chance = spell_chance(spell, use_realm - 1);
4563
4564         /* Failed spell */
4565         if (rand_int(100) < chance)
4566         {
4567                 if (flush_failure) flush();
4568
4569 #ifdef JP
4570 msg_format("%s¤ò¤¦¤Þ¤¯¾§¤¨¤é¤ì¤Ê¤«¤Ã¤¿¡ª", prayer);
4571 #else
4572                 msg_format("You failed to get the %s off!", prayer);
4573 #endif
4574
4575                 sound(SOUND_FAIL);
4576
4577                 if (realm == REALM_LIFE)
4578                 {
4579                         if (randint(100) < chance)
4580                                 chg_virtue(V_FAITH, -1);
4581                 }
4582                 else if (realm == REALM_DEATH)
4583                 {
4584                         if (randint(100) < chance)
4585                                 chg_virtue(V_UNLIFE, -1);
4586                 }
4587                 else if (realm == REALM_NATURE)
4588                 {
4589                         if (randint(100) < chance)
4590                                 chg_virtue(V_NATURE, -1);
4591                 }
4592                 else if (realm == REALM_DAEMON)
4593                 {
4594                         if (randint(100) < chance)
4595                                 chg_virtue(V_JUSTICE, 1);
4596                 }
4597                 else if (randint(100) < chance)
4598                 {
4599                         chg_virtue(V_KNOWLEDGE, -1);
4600                 }
4601
4602                 if (realm == REALM_TRUMP)
4603                 {
4604                         cast_trump_spell(spell, FALSE);
4605                 }
4606                 else if ((o_ptr->tval == TV_CHAOS_BOOK) && (randint(100) < spell))
4607                 {
4608 #ifdef JP
4609 msg_print("¥«¥ª¥¹Åª¤Ê¸ú²Ì¤òȯÀ¸¤·¤¿¡ª");
4610 #else
4611                         msg_print("You produce a chaotic effect!");
4612 #endif
4613
4614                         wild_magic(spell);
4615                 }
4616                 else if ((o_ptr->tval == TV_DEATH_BOOK) && (randint(100) < spell))
4617                 {
4618                         if ((sval == 3) && (randint(2) == 1))
4619                         {
4620                                 sanity_blast(0, TRUE);
4621                         }
4622                         else
4623                         {
4624 #ifdef JP
4625                                 msg_print("Äˤ¤¡ª");
4626 #else
4627                                 msg_print("It hurts!");
4628 #endif
4629
4630 #ifdef JP
4631                                 take_hit(DAMAGE_LOSELIFE, damroll(o_ptr->sval + 1, 6), "°Å¹õËâË¡¤ÎµÕή", -1);
4632 #else
4633                                 take_hit(DAMAGE_LOSELIFE, damroll(o_ptr->sval + 1, 6), "a miscast Death spell", -1);
4634 #endif
4635
4636                                 if ((spell > 15) && (randint(6) == 1) && !p_ptr->hold_life)
4637                                         lose_exp(spell * 250);
4638                         }
4639                 }
4640                 else if ((o_ptr->tval == TV_MUSIC_BOOK) && (randint(200) < spell))
4641                 {
4642 msg_print("¤¤¤ä¤Ê²»¤¬¶Á¤¤¤¿");
4643
4644                         aggravate_monsters(0);
4645                 }
4646                 if (randint(100) >= chance)
4647                         chg_virtue(V_CHANCE,-1);
4648         }
4649
4650         /* Process spell */
4651         else
4652         {
4653                 /* Spells.  */
4654                 switch (realm)
4655                 {
4656                 case REALM_LIFE: /* * LIFE * */
4657                         cast = cast_life_spell(spell);
4658                         break;
4659                 case REALM_SORCERY: /* * SORCERY * */
4660                         cast = cast_sorcery_spell(spell);
4661                         break;
4662                 case REALM_NATURE: /* * NATURE * */
4663                         cast = cast_nature_spell(spell);
4664                         break;
4665                 case REALM_CHAOS: /* * CHAOS * */
4666                         cast = cast_chaos_spell(spell);
4667                         break;
4668                 case REALM_DEATH: /* * DEATH * */
4669                         cast = cast_death_spell(spell);
4670                         break;
4671                 case REALM_TRUMP: /* TRUMP */
4672                         cast = cast_trump_spell(spell, TRUE);
4673                         break;
4674                 case REALM_ARCANE: /* ARCANE */
4675                         cast = cast_arcane_spell(spell);
4676                         break;
4677                 case REALM_ENCHANT: /* ENCHANT */
4678                         cast = cast_enchant_spell(spell);
4679                         break;
4680                 case REALM_DAEMON: /* DAEMON */
4681                         cast = cast_daemon_spell(spell);
4682                         break;
4683                 case REALM_MUSIC: /* MUSIC */
4684                         cast = cast_music_spell(spell);
4685                         break;
4686                 default:
4687                         cast = FALSE;
4688                         msg_format("You cast a spell from an unknown realm: realm %d, spell %d.", realm, spell);
4689                         msg_print(NULL);
4690                 }
4691
4692                 /* Canceled spells cost neither a turn nor mana */
4693                 if (!cast) return;
4694
4695                 if (randint(100) < chance)
4696                         chg_virtue(V_CHANCE,1);
4697
4698                 /* A spell was cast */
4699                 if (!(increment ?
4700                     (spell_worked2 & (1L << spell)) :
4701                     (spell_worked1 & (1L << spell)))
4702                     && (p_ptr->pclass != CLASS_SORCERER)
4703                     && (p_ptr->pclass != CLASS_RED_MAGE))
4704                 {
4705                         int e = s_ptr->sexp;
4706
4707                         /* The spell worked */
4708                         if (realm == p_ptr->realm1)
4709                         {
4710                                 spell_worked1 |= (1L << spell);
4711                         }
4712                         else
4713                         {
4714                                 spell_worked2 |= (1L << spell);
4715                         }
4716
4717                         /* Gain experience */
4718                         gain_exp(e * s_ptr->slevel);
4719
4720                         if (realm == REALM_LIFE)
4721                         {
4722                                 chg_virtue(V_FAITH, 1);
4723                                 chg_virtue(V_COMPASSION, 1);
4724                                 chg_virtue(V_VITALITY, 1);
4725                                 chg_virtue(V_HONOUR, 1);
4726                         }
4727                         else if (realm == REALM_DEATH)
4728                         {
4729                                 chg_virtue(V_UNLIFE, 1);
4730                                 chg_virtue(V_JUSTICE, -1);
4731                                 chg_virtue(V_FAITH, -1);
4732                                 chg_virtue(V_VITALITY, -1);
4733                         }
4734                         else if (realm == REALM_DAEMON)
4735                         {
4736                                 chg_virtue(V_JUSTICE, -1);
4737                                 chg_virtue(V_FAITH, -1);
4738                                 chg_virtue(V_HONOUR, -1);
4739                                 chg_virtue(V_TEMPERANCE, -1);
4740                         }
4741                         else if (realm == REALM_NATURE)
4742                         {
4743                                 chg_virtue(V_NATURE, 1);
4744                                 chg_virtue(V_HARMONY, 1);
4745                         }
4746                         else
4747                                 chg_virtue(V_KNOWLEDGE, 1);
4748                 }
4749                 if (realm == REALM_LIFE)
4750                 {
4751                         if (randint(100 + p_ptr->lev) < shouhimana) chg_virtue(V_FAITH, 1);
4752                         if (randint(100 + p_ptr->lev) < shouhimana) chg_virtue(V_COMPASSION, 1);
4753                         if (randint(100 + p_ptr->lev) < shouhimana) chg_virtue(V_VITALITY, 1);
4754                         if (randint(100 + p_ptr->lev) < shouhimana) chg_virtue(V_HONOUR, 1);
4755                 }
4756                 else if (realm == REALM_DEATH)
4757                 {
4758                         if (randint(100 + p_ptr->lev) < shouhimana) chg_virtue(V_UNLIFE, 1);
4759                         if (randint(100 + p_ptr->lev) < shouhimana) chg_virtue(V_JUSTICE, -1);
4760                         if (randint(100 + p_ptr->lev) < shouhimana) chg_virtue(V_FAITH, -1);
4761                         if (randint(100 + p_ptr->lev) < shouhimana) chg_virtue(V_VITALITY, -1);
4762                 }
4763                 else if (realm == REALM_DAEMON)
4764                 {
4765                         if (randint(100 + p_ptr->lev) < shouhimana) chg_virtue(V_JUSTICE, -1);
4766                         if (randint(100 + p_ptr->lev) < shouhimana) chg_virtue(V_FAITH, -1);
4767                         if (randint(100 + p_ptr->lev) < shouhimana) chg_virtue(V_HONOUR, -1);
4768                         if (randint(100 + p_ptr->lev) < shouhimana) chg_virtue(V_TEMPERANCE, -1);
4769                 }
4770                 else if (realm == REALM_NATURE)
4771                 {
4772                         if (randint(100 + p_ptr->lev) < shouhimana) chg_virtue(V_NATURE, 1);
4773                         if (randint(100 + p_ptr->lev) < shouhimana) chg_virtue(V_HARMONY, 1);
4774                 }
4775                 if (mp_ptr->spell_xtra & MAGIC_GAIN_EXP)
4776                 {
4777                         if (spell_exp[(increment ? 32 : 0)+spell] < 900)
4778                                 spell_exp[(increment ? 32 : 0)+spell]+=60;
4779                         else if(spell_exp[(increment ? 32 : 0)+spell] < 1200)
4780                                 {if ((dun_level > 4) && ((dun_level + 10) > p_ptr->lev)) spell_exp[(increment ? 32 : 0)+spell]+=8;}
4781                         else if(spell_exp[(increment ? 32 : 0)+spell] < 1400)
4782                                 {if (((dun_level + 5) > p_ptr->lev) && ((dun_level + 5) > s_ptr->slevel)) spell_exp[(increment ? 32 : 0)+spell]+=2;}
4783                         else if((spell_exp[(increment ? 32 : 0)+spell] < 1600) && !increment)
4784                                 {if (((dun_level + 5) > p_ptr->lev) && (dun_level > s_ptr->slevel)) spell_exp[(increment ? 32 : 0)+spell]+=1;}
4785                 }
4786         }
4787
4788         /* Take a turn */
4789         energy_use = 100;
4790
4791         /* Sufficient mana */
4792         if (shouhimana <= p_ptr->csp)
4793         {
4794                 /* Use some mana */
4795                 p_ptr->csp -= shouhimana;
4796         }
4797
4798         /* Over-exert the player */
4799         else
4800         {
4801                 int oops = shouhimana;
4802
4803                 /* No mana left */
4804                 p_ptr->csp = 0;
4805                 p_ptr->csp_frac = 0;
4806
4807                 /* Message */
4808 #ifdef JP
4809 msg_print("Àº¿À¤ò½¸Ã椷¤¹¤®¤Æµ¤¤ò¼º¤Ã¤Æ¤·¤Þ¤Ã¤¿¡ª");
4810 #else
4811                 msg_print("You faint from the effort!");
4812 #endif
4813
4814
4815                 /* Hack -- Bypass free action */
4816                 (void)set_paralyzed(p_ptr->paralyzed + randint(5 * oops + 1));
4817
4818                 if (realm == REALM_LIFE)
4819                         chg_virtue(V_FAITH, -10);
4820                 else if (realm == REALM_DEATH)
4821                         chg_virtue(V_UNLIFE, -10);
4822                 else if (realm == REALM_DAEMON)
4823                         chg_virtue(V_JUSTICE, 10);
4824                 else if (realm == REALM_NATURE)
4825                         chg_virtue(V_NATURE, -10);
4826                 else
4827                         chg_virtue(V_KNOWLEDGE, -10);
4828
4829                 /* Damage CON (possibly permanently) */
4830                 if (rand_int(100) < 50)
4831                 {
4832                         bool perm = (rand_int(100) < 25);
4833
4834                         /* Message */
4835 #ifdef JP
4836 msg_print("ÂΤò°­¤¯¤·¤Æ¤·¤Þ¤Ã¤¿¡ª");
4837 #else
4838                         msg_print("You have damaged your health!");
4839 #endif
4840
4841
4842                         /* Reduce constitution */
4843                         (void)dec_stat(A_CON, 15 + randint(10), perm);
4844                 }
4845         }
4846
4847         /* Redraw mana */
4848         p_ptr->redraw |= (PR_MANA);
4849
4850         /* Window stuff */
4851         p_ptr->window |= (PW_PLAYER);
4852         p_ptr->window |= (PW_SPELL);
4853 #endif /* USE_SCRIPT */
4854 }
4855
4856
4857 /*
4858  * Pray a prayer -- Unused in Hengband
4859  */
4860 void do_cmd_pray(void)
4861 {
4862         msg_print("Praying is not used in Hengband. Use magic spell casting instead.");
4863 }
4864
4865 static bool ang_sort_comp_pet_dismiss(vptr u, vptr v, int a, int b)
4866 {
4867         u16b *who = (u16b*)(u);
4868
4869         int w1 = who[a];
4870         int w2 = who[b];
4871
4872         monster_type *m_ptr1 = &m_list[w1];
4873         monster_type *m_ptr2 = &m_list[w2];
4874         monster_race *r_ptr1 = &r_info[m_ptr1->r_idx];
4875         monster_race *r_ptr2 = &r_info[m_ptr2->r_idx];
4876
4877         if (w1 == p_ptr->riding) return TRUE;
4878         if (w2 == p_ptr->riding) return FALSE;
4879
4880         if (m_ptr1->nickname && !m_ptr2->nickname) return TRUE;
4881         if (m_ptr2->nickname && !m_ptr1->nickname) return FALSE;
4882
4883         if ((r_ptr1->flags1 & RF1_UNIQUE) && !(r_ptr2->flags1 & RF1_UNIQUE)) return TRUE;
4884         if ((r_ptr2->flags1 & RF1_UNIQUE) && !(r_ptr1->flags1 & RF1_UNIQUE)) return FALSE;
4885
4886         if (r_ptr1->level > r_ptr2->level) return TRUE;
4887         if (r_ptr2->level > r_ptr1->level) return FALSE;
4888
4889         if (m_ptr1->hp > m_ptr2->hp) return TRUE;
4890         if (m_ptr2->hp > m_ptr1->hp) return FALSE;
4891         
4892         return w1 <= w2;
4893 }
4894
4895 int calculate_upkeep(void)
4896 {
4897         s32b old_friend_align = friend_align;
4898         int m_idx;
4899         bool have_a_unique = FALSE;
4900
4901         total_friends = 0;
4902         total_friend_levels = 0;
4903         friend_align = 0;
4904
4905         for (m_idx = m_max - 1; m_idx >=1; m_idx--)
4906         {
4907                 monster_type *m_ptr;
4908                 monster_race *r_ptr;
4909                 
4910                 m_ptr = &m_list[m_idx];
4911                 if (!m_ptr->r_idx) continue;
4912                 r_ptr = &r_info[m_ptr->r_idx];
4913
4914                 if (is_pet(m_ptr))
4915                 {
4916                         total_friends++;
4917                         if (r_ptr->flags1 & RF1_UNIQUE)
4918                         {
4919                                 if (p_ptr->pclass == CLASS_CAVALRY)
4920                                 {
4921                                         if (p_ptr->riding == m_idx)
4922                                                 total_friend_levels += (r_ptr->level+5)*2;
4923                                         else if (!have_a_unique && (r_info[m_ptr->r_idx].flags7 & RF7_RIDING))
4924                                                 total_friend_levels += (r_ptr->level+5)*7/2;
4925                                         else
4926                                                 total_friend_levels += (r_ptr->level+5)*10;
4927                                         have_a_unique = TRUE;
4928                                 }
4929                                 else
4930                                         total_friend_levels += (r_ptr->level+5)*10;
4931                         }
4932                         else
4933                                 total_friend_levels += r_ptr->level;
4934                         
4935                         /* Determine pet alignment */
4936                         if (r_ptr->flags3 & RF3_GOOD)
4937                         {
4938                                 friend_align += r_ptr->level;
4939                         }
4940                         else if (r_ptr->flags3 & RF3_EVIL)
4941                         {
4942                                 friend_align -= r_ptr->level;
4943                         }
4944                 }
4945         }
4946         if (old_friend_align != friend_align) p_ptr->update |= (PU_BONUS);
4947         if (total_friends)
4948         {
4949                 int upkeep_factor;
4950                 upkeep_factor = (total_friend_levels - (p_ptr->lev * 80 / (cp_ptr->pet_upkeep_div)));
4951                 if (upkeep_factor < 0) upkeep_factor = 0;
4952                 if (upkeep_factor > 1000) upkeep_factor = 1000;
4953                 return upkeep_factor;
4954         }
4955         else
4956                 return 0;
4957 }
4958
4959 void do_cmd_pet_dismiss(void)
4960 {
4961         monster_type    *m_ptr;
4962         bool            all_pets = FALSE;
4963         int pet_ctr, i;
4964         int Dismissed = 0;
4965
4966         u16b *who;
4967         u16b dummy_why;
4968         int max_pet = 0;
4969         int cu, cv;
4970
4971         cu = Term->scr->cu;
4972         cv = Term->scr->cv;
4973         Term->scr->cu = 0;
4974         Term->scr->cv = 1;
4975
4976         /* Allocate the "who" array */
4977         C_MAKE(who, max_m_idx, u16b);
4978
4979         /* Process the monsters (backwards) */
4980         for (pet_ctr = m_max - 1; pet_ctr >= 1; pet_ctr--)
4981         {
4982                 if (is_pet(&m_list[pet_ctr]))
4983                         who[max_pet++] = pet_ctr;
4984         }
4985
4986         /* Select the sort method */
4987         ang_sort_comp = ang_sort_comp_pet_dismiss;
4988         ang_sort_swap = ang_sort_swap_hook;
4989
4990         ang_sort(who, &dummy_why, max_pet);
4991
4992         /* Process the monsters (backwards) */
4993         for (i = 0; i < max_pet; i++)
4994         {
4995                 /* Access the monster */
4996                 pet_ctr = who[i];
4997                 m_ptr = &m_list[pet_ctr];
4998
4999                 {
5000                         bool delete_this = FALSE;
5001                         char friend_name[80];
5002                         bool kakunin = ((pet_ctr == p_ptr->riding) || (m_ptr->nickname));
5003                         monster_desc(friend_name, m_ptr, 0x80);
5004
5005                         if (all_pets && !kakunin)
5006                                 delete_this = TRUE;
5007                         else
5008                         {
5009                                 char ch;
5010                                 char check_friend[80];
5011                                 if (all_pets)
5012                                 {
5013 #ifdef JP
5014 sprintf(check_friend, "%s¤òÊü¤·¤Þ¤¹¤«¡© [Yes/No]", friend_name);
5015 #else
5016  sprintf(check_friend, "Dismiss %s? [Yes/No]", friend_name);
5017 #endif
5018                                 }
5019                                 else
5020                                 {
5021 #ifdef JP
5022 sprintf(check_friend, "%s¤òÊü¤·¤Þ¤¹¤«¡© [Yes/No/All(%dɤ)]", friend_name, max_pet-i);
5023 #else
5024  sprintf(check_friend, "Dismiss %s? [Yes/No/All(%d remain)]", friend_name, max_pet-i);
5025 #endif
5026                                 }
5027                                 /* Hack -- health bar for this monster */
5028                                 health_track(pet_ctr);
5029
5030                                 /* Hack -- handle stuff */
5031                                 handle_stuff();
5032
5033                                 prt(check_friend, 0, 0);
5034
5035                                 if (m_ptr->ml)
5036                                         move_cursor_relative(m_ptr->fy, m_ptr->fx);
5037                                 while (TRUE)
5038                                 {
5039                                         ch = inkey();
5040                                         if (ch == ESCAPE) break;
5041                                         if (strchr("YyNnAa", ch)) break;
5042                                         bell();
5043                                 }
5044
5045                                 if (ch == 'A' || ch == 'a') all_pets = TRUE;
5046
5047                                 if (ch == 'Y' || ch == 'y' || ch == 'A' || ch == 'a')
5048                                 {
5049                                         if (kakunin)
5050                                         {
5051 #ifdef JP
5052                                                 sprintf(check_friend, "ËÜÅö¤Ë¤è¤í¤·¤¤¤Ç¤¹¤«¡© (%s) ", friend_name);
5053 #else
5054                                                 sprintf(check_friend, "Really? (%s) ", friend_name);
5055 #endif
5056                                                 if (!get_check(check_friend)) continue;
5057                                         }
5058                                         if (record_named_pet && m_ptr->nickname)
5059                                         {
5060                                                 char m_name[80];
5061
5062                                                 monster_desc(m_name, m_ptr, 0x08);
5063                                                 do_cmd_write_nikki(NIKKI_NAMED_PET, 2, m_name);
5064                                         }
5065                                         delete_this = TRUE;
5066                                 }
5067                         }
5068
5069                         if (delete_this)
5070                         {
5071                                 if (pet_ctr == p_ptr->riding)
5072                                 {
5073 #ifdef JP
5074 msg_format("%s¤«¤é¹ß¤ê¤¿¡£", friend_name);
5075 #else
5076                                         msg_format("You have got off %s. ", friend_name);
5077 #endif
5078
5079                                         p_ptr->riding = 0;
5080
5081                                         /* Update the monsters */
5082                                         p_ptr->update |= (PU_BONUS | PU_MONSTERS);
5083                                         p_ptr->redraw |= (PR_EXTRA);
5084                                 }
5085                                 delete_monster_idx(pet_ctr);
5086                                 Dismissed++;
5087                         }
5088                 }
5089         }
5090
5091         Term->scr->cu = cu;
5092         Term->scr->cv = cv;
5093         Term_fresh();
5094
5095         C_KILL(who, max_m_idx, u16b);
5096
5097 #ifdef JP
5098 msg_format("%d É¤¤Î¥Ú¥Ã¥È¤òÊü¤·¤Þ¤·¤¿¡£", Dismissed);
5099 #else
5100         msg_format("You have dismissed %d pet%s.", Dismissed,
5101                 (Dismissed == 1 ? "" : "s"));
5102 #endif
5103
5104         p_ptr->update |= (PU_MON_LITE);
5105 }
5106
5107 bool rakuba(int dam, bool force)
5108 {
5109         int i, y, x, oy, ox;
5110         int sn = 0, sy = 0, sx = 0;
5111         char m_name[80];
5112         monster_type *m_ptr = &m_list[p_ptr->riding];
5113         monster_race *r_ptr = &r_info[m_ptr->r_idx];
5114
5115         if (!p_ptr->riding) return FALSE;
5116         if (p_ptr->wild_mode) return FALSE;
5117
5118         if (dam >= 0 || force)
5119         {
5120                 if (!force)
5121                 {
5122                         int level = r_ptr->level;
5123                         if (p_ptr->riding_ryoute) level += 20;
5124                         if ((dam/2 + r_ptr->level) > (skill_exp[GINOU_RIDING]/30+10))
5125                         {
5126                                 if((skill_exp[GINOU_RIDING] < skill_exp_settei[p_ptr->pclass][GINOU_RIDING][1]) && skill_exp_settei[p_ptr->pclass][GINOU_RIDING][1] > 1000)
5127                                 {
5128                                         if (r_ptr->level*100 > (skill_exp[GINOU_RIDING] + 1500))
5129                                                 skill_exp[GINOU_RIDING] += (1+(r_ptr->level - skill_exp[GINOU_RIDING]/100 - 15));
5130                                         else skill_exp[GINOU_RIDING]++;
5131                                 }
5132                         }
5133                         if (rand_int(dam/2 + level*2) < (skill_exp[GINOU_RIDING]/30+10))
5134                         {
5135                                 if ((((p_ptr->pclass == CLASS_BEASTMASTER) || (p_ptr->pclass == CLASS_CAVALRY)) && !p_ptr->riding_ryoute) || !one_in_(p_ptr->lev*(p_ptr->riding_ryoute ? 2 : 3)+30))
5136                                 {
5137                                         return FALSE;
5138                                 }
5139                         }
5140                 }
5141                 /* Check around the player */
5142                 for (i = 0; i < 8; i++)
5143                 {
5144                         cave_type *c_ptr;
5145
5146                         /* Access the location */
5147                         y = py + ddy_ddd[i];
5148                         x = px + ddx_ddd[i];
5149
5150                         c_ptr = &cave[y][x];
5151
5152                         /* Skip non-empty grids */
5153                         if (cave_perma_grid(c_ptr)) continue;
5154                         if (!cave_empty_grid2(c_ptr)) continue;
5155
5156                         if (c_ptr->m_idx) continue;
5157
5158                         /* Count "safe" grids */
5159                         sn++;
5160
5161                         /* Randomize choice */
5162                         if (rand_int(sn) > 0) continue;
5163
5164                         /* Save the safe location */
5165                         sy = y; sx = x;
5166                 }
5167                 if (!sn)
5168                 {
5169                         monster_desc(m_name, m_ptr, 0);
5170 #ifdef JP
5171 msg_format("%s¤«¤é¿¶¤êÍî¤È¤µ¤ì¤½¤¦¤Ë¤Ê¤Ã¤Æ¡¢Êɤˤ֤Ĥ«¤Ã¤¿¡£",m_name);
5172                         take_hit(DAMAGE_NOESCAPE, r_ptr->level+3, "Êɤؤξ×ÆÍ", -1);
5173 #else
5174                         msg_format("You have nearly fallen from %s, but bumped into wall.",m_name);
5175                         take_hit(DAMAGE_NOESCAPE, r_ptr->level+3, "bumping into wall", -1);
5176 #endif
5177                         return FALSE;
5178                 }
5179
5180                 oy = py;
5181                 ox = px;
5182
5183                 py = sy;
5184                 px = sx;
5185
5186                 /* Redraw the old spot */
5187                 lite_spot(oy, ox);
5188
5189                 /* Redraw the new spot */
5190                 lite_spot(py, px);
5191
5192                 /* Check for new panel */
5193                 verify_panel();
5194         }
5195
5196         p_ptr->riding = 0;
5197         p_ptr->pet_extra_flags &= ~(PF_RYOUTE);
5198         p_ptr->riding_ryoute = p_ptr->old_riding_ryoute = FALSE;
5199
5200         calc_bonuses();
5201
5202         p_ptr->update |= (PU_BONUS);
5203
5204         /* Update stuff */
5205         p_ptr->update |= (PU_VIEW | PU_LITE | PU_FLOW);
5206
5207         /* Update the monsters */
5208         p_ptr->update |= (PU_DISTANCE);
5209
5210         /* Window stuff */
5211         p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
5212
5213         p_ptr->redraw |= (PR_EXTRA);
5214
5215         if (p_ptr->ffall && !force)
5216         {
5217                 monster_desc(m_name, m_ptr, 0);
5218 #ifdef JP
5219 msg_format("%s¤«¤éÍî¤Á¤¿¤¬¡¢¶õÃæ¤Ç¤¦¤Þ¤¯ÂÎÀª¤òΩ¤Æľ¤·¤ÆÃåÃϤ·¤¿¡£",m_name);
5220 #else
5221                 msg_format("You are thrown from %s, but make a good landing.",m_name);
5222 #endif
5223                 return FALSE;
5224         }
5225 #ifdef JP
5226         take_hit(DAMAGE_NOESCAPE, r_ptr->level+3, "ÍîÇÏ", -1);
5227 #else
5228         take_hit(DAMAGE_NOESCAPE, r_ptr->level+3, "Falling from riding", -1);
5229 #endif
5230         p_ptr->redraw |= (PR_UHEALTH);
5231
5232         return TRUE;
5233 }
5234
5235 bool do_riding(bool force)
5236 {
5237         int oy, ox, x, y, dir = 0;
5238         cave_type *c_ptr;
5239         monster_type *m_ptr;
5240
5241         if (!get_rep_dir2(&dir)) return FALSE;
5242         y = py + ddy[dir];
5243         x = px + ddx[dir];
5244         c_ptr = &cave[y][x];
5245
5246         if (p_ptr->riding)
5247         {
5248                 /* Skip non-empty grids */
5249                 if (!cave_empty_bold2(y, x) || c_ptr->m_idx)
5250                 {
5251 #ifdef JP
5252 msg_print("¤½¤Á¤é¤Ë¤Ï¹ß¤ê¤é¤ì¤Þ¤»¤ó¡£");
5253 #else
5254                         msg_print("You cannot go to that direction.");
5255 #endif
5256                         return FALSE;
5257                 }
5258                 p_ptr->riding = 0;
5259                 p_ptr->pet_extra_flags &= ~(PF_RYOUTE);
5260                 p_ptr->riding_ryoute = p_ptr->old_riding_ryoute = FALSE;
5261         }
5262         else
5263         {
5264                 if (p_ptr->confused)
5265                 {
5266 #ifdef JP
5267 msg_print("º®Í𤷤Ƥ¤¤Æ¾è¤ì¤Ê¤¤¡ª");
5268 #else
5269                         msg_print("You are too confused!");
5270 #endif
5271                         return FALSE;
5272                 }
5273                 if (!(c_ptr->m_idx))
5274                 {
5275 #ifdef JP
5276 msg_print("¤½¤Î¾ì½ê¤Ë¤Ï¥â¥ó¥¹¥¿¡¼¤Ï¤¤¤Þ¤»¤ó¡£");
5277 #else
5278                         msg_print("Here is no pet.");
5279 #endif
5280
5281                         return FALSE;
5282                 }
5283
5284                 m_ptr = &m_list[c_ptr->m_idx];
5285
5286                 if (!is_pet(m_ptr) && !force)
5287                 {
5288 #ifdef JP
5289 msg_print("¤½¤Î¥â¥ó¥¹¥¿¡¼¤Ï¥Ú¥Ã¥È¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£");
5290 #else
5291                         msg_print("That monster is no a pet.");
5292 #endif
5293
5294                         return FALSE;
5295                 }
5296                 if (!(r_info[m_ptr->r_idx].flags7 & RF7_RIDING))
5297                 {
5298 #ifdef JP
5299 msg_print("¤½¤Î¥â¥ó¥¹¥¿¡¼¤Ë¤Ï¾è¤ì¤Ê¤µ¤½¤¦¤À¡£");
5300 #else
5301                         msg_print("This monster doesn't seem suitable for riding.");
5302 #endif
5303
5304                         return FALSE;
5305                 }
5306                 if (!(p_ptr->pass_wall) && (c_ptr->feat >= FEAT_RUBBLE) && (c_ptr->feat <= FEAT_PERM_SOLID))
5307                 {
5308 #ifdef JP
5309 msg_print("¤½¤Î¥â¥ó¥¹¥¿¡¼¤ÏÊɤÎÃæ¤Ë¤¤¤ë¡£");
5310 #else
5311                         msg_print("This monster is in the wall.");
5312 #endif
5313
5314                         return FALSE;
5315                 }
5316                 if ((cave[py][px].feat >= FEAT_PATTERN_START) && (cave[py][px].feat <= FEAT_PATTERN_XTRA2) && ((cave[y][x].feat < FEAT_PATTERN_START) || (cave[y][x].feat > FEAT_PATTERN_XTRA2)))
5317                 {
5318 #ifdef JP
5319 msg_print("¥Ñ¥¿¡¼¥ó¤Î¾å¤«¤é¤Ï¾è¤ì¤Þ¤»¤ó¡£");
5320 #else
5321                         msg_print("You cannot ride from on Pattern.");
5322 #endif
5323
5324                         return FALSE;
5325                 }
5326                 if (!m_ptr->ml)
5327                 {
5328 #ifdef JP
5329 msg_print("¤½¤Î¾ì½ê¤Ë¤Ï¥â¥ó¥¹¥¿¡¼¤Ï¤¤¤Þ¤»¤ó¡£");
5330 #else
5331                         msg_print("Here is no monster.");
5332 #endif
5333
5334                         return FALSE;
5335                 }
5336                 if (r_info[m_ptr->r_idx].level > randint((skill_exp[GINOU_RIDING]/50 + p_ptr->lev/2 +20)))
5337                 {
5338 #ifdef JP
5339 msg_print("¤¦¤Þ¤¯¾è¤ì¤Ê¤«¤Ã¤¿¡£");
5340 #else
5341                         msg_print("You failed to ride.");
5342 #endif
5343
5344                         energy_use = 100;
5345
5346                         return FALSE;
5347                 }
5348                 if (m_ptr->csleep)
5349                 {
5350                         char m_name[80];
5351                         monster_desc(m_name, m_ptr, 0);
5352                         m_ptr->csleep = 0;
5353 #ifdef JP
5354 msg_format("%s¤òµ¯¤³¤·¤¿¡£", m_name);
5355 #else
5356                         msg_format("You have waked %s up.", m_name);
5357 #endif
5358                 }
5359
5360                 p_ptr->riding = c_ptr->m_idx;
5361         }
5362
5363         /* Save the old location */
5364         oy = py;
5365         ox = px;
5366
5367         /* Move the player to the safe location */
5368         py = y;
5369         px = x;
5370
5371         /* Redraw the old spot */
5372         lite_spot(oy, ox);
5373
5374         /* Redraw the new spot */
5375         lite_spot(py, px);
5376
5377         /* Check for new panel */
5378         verify_panel();
5379
5380         energy_use = 100;
5381
5382         /* Mega-Hack -- Forget the view and lite */
5383         p_ptr->update |= (PU_UN_VIEW | PU_UN_LITE);
5384
5385         /* Update stuff */
5386         p_ptr->update |= (PU_VIEW | PU_LITE | PU_FLOW);
5387
5388         /* Update the monsters */
5389         p_ptr->update |= (PU_DISTANCE);
5390
5391         /* Update the monsters */
5392         p_ptr->update |= (PU_BONUS);
5393
5394         /* Redraw map */
5395         p_ptr->redraw |= (PR_MAP | PR_EXTRA);
5396
5397         /* Window stuff */
5398         p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
5399
5400         p_ptr->redraw |= (PR_UHEALTH);
5401
5402         handle_stuff();
5403         return TRUE;
5404 }
5405
5406 void do_name_pet(void)
5407 {
5408         monster_type *m_ptr;
5409         char out_val[20];
5410         char m_name[80];
5411         bool old_name = FALSE;
5412         bool old_target_pet = target_pet;
5413
5414         target_pet = TRUE;
5415         if (!target_set(TARGET_KILL))
5416         {
5417                 target_pet = old_target_pet;
5418                 return;
5419         }
5420         target_pet = old_target_pet;
5421
5422         if (cave[target_row][target_col].m_idx)
5423         {
5424                 m_ptr = &m_list[cave[target_row][target_col].m_idx];
5425
5426                 if (!is_pet(m_ptr))
5427                 {
5428                         /* Message */
5429 #ifdef JP
5430                         msg_print("¤½¤Î¥â¥ó¥¹¥¿¡¼¤Ï¥Ú¥Ã¥È¤Ç¤Ï¤Ê¤¤¡£");
5431 #else
5432                         msg_format("This monster is not a pet.");
5433 #endif
5434                         return;
5435                 }
5436                 if (r_info[m_ptr->r_idx].flags1 & RF1_UNIQUE)
5437                 {
5438 #ifdef JP
5439                         msg_print("¤½¤Î¥â¥ó¥¹¥¿¡¼¤Î̾Á°¤ÏÊѤ¨¤é¤ì¤Ê¤¤¡ª");
5440 #else
5441                         msg_format("You cannot change name of this monster!");
5442 #endif
5443                         return;
5444                 }
5445                 monster_desc(m_name, m_ptr, 0);
5446
5447                 /* Message */
5448 #ifdef JP
5449                 msg_format("%s¤Ë̾Á°¤ò¤Ä¤±¤ë¡£", m_name);
5450 #else
5451                 msg_format("Name %s.", m_name);
5452 #endif
5453
5454                 msg_print(NULL);
5455
5456                 /* Start with nothing */
5457                 strcpy(out_val, "");
5458
5459                 /* Use old inscription */
5460                 if (m_ptr->nickname)
5461                 {
5462                         /* Start with the old inscription */
5463                         strcpy(out_val, quark_str(m_ptr->nickname));
5464                         old_name = TRUE;
5465                 }
5466
5467                 /* Get a new inscription (possibly empty) */
5468 #ifdef JP
5469                 if (get_string("̾Á°: ", out_val, 15))
5470 #else
5471                 if (get_string("Name: ", out_val, 15))
5472 #endif
5473
5474                 {
5475                         if (out_val[0])
5476                         {
5477                                 /* Save the inscription */
5478                                 m_ptr->nickname = quark_add(out_val);
5479                                 if (record_named_pet)
5480                                 {
5481                                         char m_name[80];
5482
5483                                         monster_desc(m_name, m_ptr, 0x08);
5484                                         do_cmd_write_nikki(NIKKI_NAMED_PET, 0, m_name);
5485                                 }
5486                         }
5487                         else
5488                         {
5489                                 if (record_named_pet && old_name)
5490                                 {
5491                                         char m_name[80];
5492
5493                                         monster_desc(m_name, m_ptr, 0x08);
5494                                         do_cmd_write_nikki(NIKKI_NAMED_PET, 1, m_name);
5495                                 }
5496                                 m_ptr->nickname = 0;
5497                         }
5498                 }
5499         }
5500 }
5501
5502 /*
5503  * Issue a pet command
5504  */
5505 void do_cmd_pet(void)
5506 {
5507         int                     i = 0;
5508         int                     num;
5509         int                     powers[36];
5510         cptr                    power_desc[36];
5511         bool                    flag, redraw;
5512         int                     ask;
5513         char                    choice;
5514         char                    out_val[160];
5515         int                     pets = 0, pet_ctr;
5516         monster_type    *m_ptr;
5517
5518         int mode = 0;
5519
5520         byte y = 1, x = 0;
5521         int ctr = 0;
5522         char buf[160];
5523
5524         num = 0;
5525
5526         /* Calculate pets */
5527         /* Process the monsters (backwards) */
5528         for (pet_ctr = m_max - 1; pet_ctr >= 1; pet_ctr--)
5529         {
5530                 /* Access the monster */
5531                 m_ptr = &m_list[pet_ctr];
5532
5533                 if (is_pet(m_ptr)) pets++;
5534         }
5535
5536 #ifdef JP
5537         power_desc[num] = "¥Ú¥Ã¥È¤òÊü¤¹";
5538 #else
5539         power_desc[num] = "dismiss pets";
5540 #endif
5541
5542         powers[num++] = PET_DISMISS;
5543
5544 #ifdef JP
5545         sprintf(buf,"¥Ú¥Ã¥È¤Î¥¿¡¼¥²¥Ã¥È¤ò»ØÄê (¸½ºß¡§%s)",
5546                 (pet_t_m_idx ? r_name + r_info[m_list[pet_t_m_idx].r_idx].name : "»ØÄê¤Ê¤·"));
5547 #else
5548         sprintf(buf,"specify a targert of pet (now:%s)",
5549                 (pet_t_m_idx ? r_name + r_info[m_list[pet_t_m_idx].r_idx].name : "nothing"));
5550 #endif
5551         power_desc[num] = buf;
5552
5553         powers[num++] = PET_TARGET;
5554
5555 #ifdef JP
5556 power_desc[num] = "¶á¤¯¤Ë¤¤¤í";
5557 #else
5558         power_desc[num] = "stay close";
5559 #endif
5560
5561         if (p_ptr->pet_follow_distance == PET_CLOSE_DIST) mode = num;
5562         powers[num++] = PET_STAY_CLOSE;
5563
5564 #ifdef JP
5565         power_desc[num] = "¤Ä¤¤¤ÆÍ褤";
5566 #else
5567         power_desc[num] = "follow me";
5568 #endif
5569
5570         if (p_ptr->pet_follow_distance == PET_FOLLOW_DIST) mode = num;
5571         powers[num++] = PET_FOLLOW_ME;
5572
5573 #ifdef JP
5574 power_desc[num] = "Ũ¤ò¸«¤Ä¤±¤ÆÅݤ»";
5575 #else
5576         power_desc[num] = "seek and destroy";
5577 #endif
5578
5579         if (p_ptr->pet_follow_distance == PET_DESTROY_DIST) mode = num;
5580         powers[num++] = PET_SEEK_AND_DESTROY;
5581
5582 #ifdef JP
5583 power_desc[num] = "¾¯¤·Î¥¤ì¤Æ¤¤¤í";
5584 #else
5585         power_desc[num] = "give me space";
5586 #endif
5587
5588         if (p_ptr->pet_follow_distance == PET_SPACE_DIST) mode = num;
5589         powers[num++] = PET_ALLOW_SPACE;
5590
5591 #ifdef JP
5592 power_desc[num] = "Î¥¤ì¤Æ¤¤¤í";
5593 #else
5594         power_desc[num] = "stay away";
5595 #endif
5596
5597         if (p_ptr->pet_follow_distance == PET_AWAY_DIST) mode = num;
5598         powers[num++] = PET_STAY_AWAY;
5599
5600         if (p_ptr->pet_extra_flags & PF_OPEN_DOORS)
5601         {
5602 #ifdef JP
5603                 power_desc[num] = "¥É¥¢¤ò³«¤±¤ë (¸½ºß:ON)";
5604 #else
5605                 power_desc[num] = "pets open doors (now On)";
5606 #endif
5607
5608         }
5609         else
5610         {
5611 #ifdef JP
5612                 power_desc[num] = "¥É¥¢¤ò³«¤±¤ë (¸½ºß:OFF)";
5613 #else
5614                 power_desc[num] = "pets open doors (now Off)";
5615 #endif
5616
5617         }
5618         powers[num++] = PET_OPEN_DOORS;
5619
5620         if (p_ptr->pet_extra_flags & PF_PICKUP_ITEMS)
5621         {
5622 #ifdef JP
5623                 power_desc[num] = "¥¢¥¤¥Æ¥à¤ò½¦¤¦ (¸½ºß:ON)";
5624 #else
5625                 power_desc[num] = "pets pick up items (now On)";
5626 #endif
5627
5628         }
5629         else
5630         {
5631 #ifdef JP
5632                 power_desc[num] = "¥¢¥¤¥Æ¥à¤ò½¦¤¦ (¸½ºß:OFF)";
5633 #else
5634                 power_desc[num] = "pets pick up items (now Off)";
5635 #endif
5636
5637         }
5638         powers[num++] = PET_TAKE_ITEMS;
5639
5640         if (p_ptr->pet_extra_flags & PF_TELEPORT)
5641         {
5642 #ifdef JP
5643                 power_desc[num] = "¥Æ¥ì¥Ý¡¼¥È·ÏËâË¡¤ò»È¤¦ (¸½ºß:ON)";
5644 #else
5645                 power_desc[num] = "allow teleport (now On)";
5646 #endif
5647
5648         }
5649         else
5650         {
5651 #ifdef JP
5652                 power_desc[num] = "¥Æ¥ì¥Ý¡¼¥È·ÏËâË¡¤ò»È¤¦ (¸½ºß:OFF)";
5653 #else
5654                 power_desc[num] = "allow teleport (now Off)";
5655 #endif
5656
5657         }
5658         powers[num++] = PET_TELEPORT;
5659
5660         if (p_ptr->pet_extra_flags & PF_ATTACK_SPELL)
5661         {
5662 #ifdef JP
5663                 power_desc[num] = "¹¶·âËâË¡¤ò»È¤¦ (¸½ºß:ON)";
5664 #else
5665                 power_desc[num] = "allow cast attack spell (now On)";
5666 #endif
5667
5668         }
5669         else
5670         {
5671 #ifdef JP
5672                 power_desc[num] = "¹¶·âËâË¡¤ò»È¤¦ (¸½ºß:OFF)";
5673 #else
5674                 power_desc[num] = "allow cast attack spell (now Off)";
5675 #endif
5676
5677         }
5678         powers[num++] = PET_ATTACK_SPELL;
5679
5680         if (p_ptr->pet_extra_flags & PF_SUMMON_SPELL)
5681         {
5682 #ifdef JP
5683                 power_desc[num] = "¾¤´­ËâË¡¤ò»È¤¦ (¸½ºß:ON)";
5684 #else
5685                 power_desc[num] = "allow cast summon spell (now On)";
5686 #endif
5687
5688         }
5689         else
5690         {
5691 #ifdef JP
5692                 power_desc[num] = "¾¤´­ËâË¡¤ò»È¤¦ (¸½ºß:OFF)";
5693 #else
5694                 power_desc[num] = "allow cast summon spell (now Off)";
5695 #endif
5696
5697         }
5698         powers[num++] = PET_SUMMON_SPELL;
5699
5700         if (p_ptr->pet_extra_flags & PF_BALL_SPELL)
5701         {
5702 #ifdef JP
5703                 power_desc[num] = "¥×¥ì¥¤¥ä¡¼¤ò´¬¤­¹þ¤àÈÏ°ÏËâË¡¤ò»È¤¦ (¸½ºß:ON)";
5704 #else
5705                 power_desc[num] = "allow involve player in area spell (now On)";
5706 #endif
5707
5708         }
5709         else
5710         {
5711 #ifdef JP
5712                 power_desc[num] = "¥×¥ì¥¤¥ä¡¼¤ò´¬¤­¹þ¤àÈÏ°ÏËâË¡¤ò»È¤¦ (¸½ºß:OFF)";
5713 #else
5714                 power_desc[num] = "allow involve player in area spell (now Off)";
5715 #endif
5716
5717         }
5718         powers[num++] = PET_BALL_SPELL;
5719
5720         if (p_ptr->riding)
5721         {
5722 #ifdef JP
5723                 power_desc[num] = "¥Ú¥Ã¥È¤«¤é¹ß¤ê¤ë";
5724 #else
5725                 power_desc[num] = "get off a pet";
5726 #endif
5727
5728         }
5729         else
5730         {
5731 #ifdef JP
5732                 power_desc[num] = "¥Ú¥Ã¥È¤Ë¾è¤ë";
5733 #else
5734                 power_desc[num] = "ride a pet";
5735 #endif
5736
5737         }
5738         powers[num++] = PET_RIDING;
5739
5740 #ifdef JP
5741         power_desc[num] = "¥Ú¥Ã¥È¤Ë̾Á°¤ò¤Ä¤±¤ë¡£";
5742 #else
5743         power_desc[num] = "name pets";
5744 #endif
5745
5746         powers[num++] = PET_NAME;
5747
5748         if (p_ptr->riding && buki_motteruka(INVEN_RARM) && (empty_hands(FALSE) & 0x00000001) && ((inventory[INVEN_RARM].weight > 99) || (inventory[INVEN_RARM].tval == TV_POLEARM)))
5749         {
5750                 if (p_ptr->pet_extra_flags & PF_RYOUTE)
5751                 {
5752 #ifdef JP
5753                         power_desc[num] = "Éð´ï¤òÊÒ¼ê¤Ç»ý¤Ä";
5754 #else
5755                         power_desc[num] = "use one hand to control a riding pet";
5756 #endif
5757
5758                 }
5759                 else
5760                 {
5761 #ifdef JP
5762                         power_desc[num] = "Éð´ï¤òξ¼ê¤Ç»ý¤Ä";
5763 #else
5764                         power_desc[num] = "use both hands for a weapon.";
5765 #endif
5766
5767                 }
5768
5769                 powers[num++] = PET_RYOUTE;
5770         }
5771
5772         /* Nothing chosen yet */
5773         flag = FALSE;
5774
5775         /* Build a prompt (accept all spells) */
5776         if (num <= 26)
5777         {
5778                 /* Build a prompt (accept all spells) */
5779 #ifdef JP
5780 strnfmt(out_val, 78, "(¥³¥Þ¥ó¥É %c-%c¡¢'*'=°ìÍ÷¡¢ESC=½ªÎ») ¥³¥Þ¥ó¥É¤òÁª¤ó¤Ç¤¯¤À¤µ¤¤:",
5781 #else
5782                 strnfmt(out_val, 78, "(Command %c-%c, *=List, ESC=exit) Select a command: ",
5783 #endif
5784
5785                         I2A(0), I2A(num - 1));
5786         }
5787         else
5788         {
5789 #ifdef JP
5790 strnfmt(out_val, 78, "(¥³¥Þ¥ó¥É %c-%c¡¢'*'=°ìÍ÷¡¢ESC=½ªÎ») ¥³¥Þ¥ó¥É¤òÁª¤ó¤Ç¤¯¤À¤µ¤¤:",
5791 #else
5792                 strnfmt(out_val, 78, "(Command %c-%c, *=List, ESC=exit) Select a command: ",
5793 #endif
5794
5795                         I2A(0), '0' + num - 27);
5796         }
5797
5798         /* Show list */
5799         redraw = TRUE;
5800
5801         /* Save the screen */
5802         Term_save();
5803
5804         prt("", y++, x);
5805
5806         while (ctr < num)
5807         {
5808                 prt(format("%s%c) %s", (ctr == mode) ? "*" : " ", I2A(ctr), power_desc[ctr]), y + ctr, x);
5809                 ctr++;
5810         }
5811
5812         if (ctr < 17)
5813         {
5814                 prt("", y + ctr, x);
5815         }
5816         else
5817         {
5818                 prt("", y + 17, x);
5819         }
5820
5821         /* Get a command from the user */
5822         while (!flag && get_com(out_val, &choice, TRUE))
5823         {
5824                 /* Request redraw */
5825                 if ((choice == ' ') || (choice == '*') || (choice == '?'))
5826                 {
5827                         /* Show the list */
5828                         if (!redraw)
5829                         {
5830                                 y = 1;
5831                                 x = 0;
5832                                 ctr = 0;
5833
5834                                 /* Show list */
5835                                 redraw = TRUE;
5836
5837                                 /* Save the screen */
5838                                 Term_save();
5839
5840                                 prt("", y++, x);
5841
5842                                 while (ctr < num)
5843                                 {
5844                                         sprintf(buf, "%s%c) %s", (ctr == mode) ? "*" : " ", I2A(ctr), power_desc[ctr]);
5845                                         prt(buf, y + ctr, x);
5846                                         ctr++;
5847                                 }
5848
5849                                 if (ctr < 17)
5850                                 {
5851                                         prt("", y + ctr, x);
5852                                 }
5853                                 else
5854                                 {
5855                                         prt("", y + 17, x);
5856                                 }
5857                         }
5858
5859                         /* Hide the list */
5860                         else
5861                         {
5862                                 /* Hide list */
5863                                 redraw = FALSE;
5864
5865                                 /* Restore the screen */
5866                                 Term_load();
5867                         }
5868
5869                         /* Redo asking */
5870                         continue;
5871                 }
5872
5873                 if (choice == '\r' && num == 1)
5874                 {
5875                         choice = 'a';
5876                 }
5877
5878                 if (isalpha(choice))
5879                 {
5880                         /* Note verify */
5881                         ask = (isupper(choice));
5882
5883                         /* Lowercase */
5884                         if (ask) choice = tolower(choice);
5885
5886                         /* Extract request */
5887                         i = (islower(choice) ? A2I(choice) : -1);
5888                 }
5889                 else
5890                 {
5891                         ask = FALSE; /* Can't uppercase digits */
5892
5893                         i = choice - '0' + 26;
5894                 }
5895
5896                 /* Totally Illegal */
5897                 if ((i < 0) || (i >= num))
5898                 {
5899                         bell();
5900                         continue;
5901                 }
5902
5903                 /* Verify it */
5904                 if (ask)
5905                 {
5906                         /* Prompt */
5907 #ifdef JP
5908                         strnfmt(buf, 78, "%s¤ò»È¤¤¤Þ¤¹¤«¡© ", power_desc[i]);
5909 #else
5910                         strnfmt(buf, 78, "Use %s? ", power_desc[i]);
5911 #endif
5912
5913
5914                         /* Belay that order */
5915                         if (!get_check(buf)) continue;
5916                 }
5917
5918                 /* Stop the loop */
5919                 flag = TRUE;
5920         }
5921
5922         /* Restore the screen */
5923         if (redraw) Term_load();
5924
5925         /* Abort if needed */
5926         if (!flag)
5927         {
5928                 energy_use = 0;
5929                 return;
5930         }
5931
5932         switch (powers[i])
5933         {
5934                 case PET_DISMISS: /* Dismiss pets */
5935                 {
5936                         if (!pets)
5937                         {
5938 #ifdef JP
5939                                 msg_print("¥Ú¥Ã¥È¤¬¤¤¤Ê¤¤¡ª");
5940 #else
5941                                 msg_print("You have no pets!");
5942 #endif
5943                                 break;
5944                         }
5945                         do_cmd_pet_dismiss();
5946                         (void)calculate_upkeep();
5947                         break;
5948                 }
5949                 case PET_TARGET:
5950                 {
5951                         project_length = -1;
5952                         if (!target_set(TARGET_KILL)) pet_t_m_idx = 0;
5953                         else
5954                         {
5955                                 cave_type *c_ptr = &cave[target_row][target_col];
5956                                 if (c_ptr->m_idx && (m_list[c_ptr->m_idx].ml))
5957                                 {
5958                                         pet_t_m_idx = cave[target_row][target_col].m_idx;
5959                                         p_ptr->pet_follow_distance = PET_DESTROY_DIST;
5960                                 }
5961                                 else pet_t_m_idx = 0;
5962                         }
5963                         project_length = 0;
5964
5965                         break;
5966                 }
5967                 /* Call pets */
5968                 case PET_STAY_CLOSE:
5969                 {
5970                         p_ptr->pet_follow_distance = PET_CLOSE_DIST;
5971                         pet_t_m_idx = 0;
5972                         break;
5973                 }
5974                 /* "Follow Me" */
5975                 case PET_FOLLOW_ME:
5976                 {
5977                         p_ptr->pet_follow_distance = PET_FOLLOW_DIST;
5978                         pet_t_m_idx = 0;
5979                         break;
5980                 }
5981                 /* "Seek and destoy" */
5982                 case PET_SEEK_AND_DESTROY:
5983                 {
5984                         p_ptr->pet_follow_distance = PET_DESTROY_DIST;
5985                         break;
5986                 }
5987                 /* "Give me space" */
5988                 case PET_ALLOW_SPACE:
5989                 {
5990                         p_ptr->pet_follow_distance = PET_SPACE_DIST;
5991                         break;
5992                 }
5993                 /* "Stay away" */
5994                 case PET_STAY_AWAY:
5995                 {
5996                         p_ptr->pet_follow_distance = PET_AWAY_DIST;
5997                         break;
5998                 }
5999                 /* flag - allow pets to open doors */
6000                 case PET_OPEN_DOORS:
6001                 {
6002                         if (p_ptr->pet_extra_flags & PF_OPEN_DOORS) p_ptr->pet_extra_flags &= ~(PF_OPEN_DOORS);
6003                         else p_ptr->pet_extra_flags |= (PF_OPEN_DOORS);
6004                         break;
6005                 }
6006                 /* flag - allow pets to pickup items */
6007                 case PET_TAKE_ITEMS:
6008                 {
6009                         if (p_ptr->pet_extra_flags & PF_PICKUP_ITEMS)
6010                         {
6011                                 p_ptr->pet_extra_flags &= ~(PF_PICKUP_ITEMS);
6012                                 for (pet_ctr = m_max - 1; pet_ctr >= 1; pet_ctr--)
6013                                 {
6014                                         /* Access the monster */
6015                                         m_ptr = &m_list[pet_ctr];
6016
6017                                         if (is_pet(m_ptr))
6018                                         {
6019                                                 monster_drop_carried_objects(m_ptr);
6020                                         }
6021                                 }
6022                         }
6023                         else p_ptr->pet_extra_flags |= (PF_PICKUP_ITEMS);
6024
6025                         break;
6026                 }
6027                 /* flag - allow pets to teleport */
6028                 case PET_TELEPORT:
6029                 {
6030                         if (p_ptr->pet_extra_flags & PF_TELEPORT) p_ptr->pet_extra_flags &= ~(PF_TELEPORT);
6031                         else p_ptr->pet_extra_flags |= (PF_TELEPORT);
6032                         break;
6033                 }
6034                 /* flag - allow pets to cast attack spell */
6035                 case PET_ATTACK_SPELL:
6036                 {
6037                         if (p_ptr->pet_extra_flags & PF_ATTACK_SPELL) p_ptr->pet_extra_flags &= ~(PF_ATTACK_SPELL);
6038                         else p_ptr->pet_extra_flags |= (PF_ATTACK_SPELL);
6039                         break;
6040                 }
6041                 /* flag - allow pets to cast attack spell */
6042                 case PET_SUMMON_SPELL:
6043                 {
6044                         if (p_ptr->pet_extra_flags & PF_SUMMON_SPELL) p_ptr->pet_extra_flags &= ~(PF_SUMMON_SPELL);
6045                         else p_ptr->pet_extra_flags |= (PF_SUMMON_SPELL);
6046                         break;
6047                 }
6048                 /* flag - allow pets to cast attack spell */
6049                 case PET_BALL_SPELL:
6050                 {
6051                         if (p_ptr->pet_extra_flags & PF_BALL_SPELL) p_ptr->pet_extra_flags &= ~(PF_BALL_SPELL);
6052                         else p_ptr->pet_extra_flags |= (PF_BALL_SPELL);
6053                         break;
6054                 }
6055
6056                 case PET_RIDING:
6057                 {
6058                         do_riding(FALSE);
6059                         break;
6060                 }
6061
6062                 case PET_NAME:
6063                 {
6064                         do_name_pet();
6065                         break;
6066                 }
6067
6068                 case PET_RYOUTE:
6069                 {
6070                         if (p_ptr->pet_extra_flags & PF_RYOUTE) p_ptr->pet_extra_flags &= ~(PF_RYOUTE);
6071                         else p_ptr->pet_extra_flags |= (PF_RYOUTE);
6072                         p_ptr->update |= (PU_BONUS);
6073                         handle_stuff();
6074                         break;
6075                 }
6076         }
6077 }