OSDN Git Service

[Refactor] #37353 型の置換。 / Type replacement.
[hengband/hengband.git] / src / cmd5.c
1 /*!
2  *  @file cmd5.c
3  *  @brief プレイヤーの魔法に関するコマンドの実装 / Spell/Prayer commands
4  *  @date 2014/01/02
5  *  @author
6  * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke
7  *
8  * This software may be copied and distributed for educational, research,
9  * and not for profit purposes provided that this copyright and statement
10  * are included in all such copies.  Other copyrights may also apply.
11  */
12
13
14 #include "angband.h"
15
16 /*!
17  * @brief 領域魔法に応じて技能の名称を返す。
18  * @param tval 魔法書のtval
19  * @return 領域魔法の技能名称を保管した文字列ポインタ
20  */
21 cptr spell_category_name(OBJECT_TYPE_VALUE tval)
22 {
23         switch (tval)
24         {
25         case TV_HISSATSU_BOOK:
26                 return _("必殺技", "art");
27         case TV_LIFE_BOOK:
28                 return _("祈り", "prayer");
29         case TV_MUSIC_BOOK:
30                 return _("歌", "song");
31         default:
32                 return _("呪文", "spell");
33         }
34 }
35
36
37 bool select_the_force = FALSE;
38
39 /*!
40  * @brief 領域魔法の閲覧、学習、使用選択するインターフェイス処理
41  * Allow user to choose a spell/prayer from the given book.
42  * @param sn 選択した魔法IDを返す参照ポインタ
43  * @param prompt 魔法を利用する際の動詞表記
44  * @param sval 魔道書のsval
45  * @param learned 閲覧/使用選択ならばTRUE、学習処理ならFALSE
46  * @param use_realm 魔法領域ID
47  * @return
48  * <pre>
49  * If a valid spell is chosen, saves it in '*sn' and returns TRUE
50  * If the user hits escape, returns FALSE, and set '*sn' to -1
51  * If there are no legal choices, returns FALSE, and sets '*sn' to -2
52  * The "prompt" should be "cast", "recite", or "study"
53  * The "known" should be TRUE for cast/pray, FALSE for study
54  * </pre>
55  */
56 static int get_spell(SPELL_IDX *sn, cptr prompt, OBJECT_SUBTYPE_VALUE sval, bool learned, REALM_IDX use_realm)
57 {
58         int         i;
59         SPELL_IDX   spell = -1;
60         int         num = 0;
61         int         ask = TRUE;
62         MANA_POINT  need_mana;
63         SPELL_IDX   spells[64];
64         bool        flag, redraw, okay;
65         char        choice;
66         const magic_type  *s_ptr;
67         char        out_val[160];
68         cptr        p;
69         COMMAND_CODE code;
70 #ifdef JP
71         char jverb_buf[128];
72 #endif
73         int menu_line = (use_menu ? 1 : 0);
74
75         /* Get the spell, if available */
76         if (repeat_pull(&code))
77         {
78                 *sn = (SPELL_IDX)code;
79                 /* Verify the spell */
80                 if (spell_okay(*sn, learned, FALSE, use_realm))
81                 {
82                         /* Success */
83                         return (TRUE);
84                 }
85         }
86
87         p = spell_category_name(mp_ptr->spell_book);
88
89         /* Extract spells */
90         for (spell = 0; spell < 32; spell++)
91         {
92                 /* Check for this spell */
93                 if ((fake_spell_flags[sval] & (1L << spell)))
94                 {
95                         /* Collect this spell */
96                         spells[num++] = spell;
97                 }
98         }
99
100         /* Assume no usable spells */
101         okay = FALSE;
102
103         /* Assume no spells available */
104         (*sn) = -2;
105
106         /* Check for "okay" spells */
107         for (i = 0; i < num; i++)
108         {
109                 /* Look for "okay" spells */
110                 if (spell_okay(spells[i], learned, FALSE, use_realm)) okay = TRUE;
111         }
112
113         /* No "okay" spells */
114         if (!okay) return (FALSE);
115         if (((use_realm) != p_ptr->realm1) && ((use_realm) != p_ptr->realm2) && (p_ptr->pclass != CLASS_SORCERER) && (p_ptr->pclass != CLASS_RED_MAGE)) return FALSE;
116         if (((p_ptr->pclass == CLASS_SORCERER) || (p_ptr->pclass == CLASS_RED_MAGE)) && !is_magic(use_realm)) return FALSE;
117         if ((p_ptr->pclass == CLASS_RED_MAGE) && ((use_realm) != REALM_ARCANE) && (sval > 1)) return FALSE;
118
119         /* Assume cancelled */
120         *sn = (-1);
121
122         /* Nothing chosen yet */
123         flag = FALSE;
124
125         /* No redraw yet */
126         redraw = FALSE;
127
128         /* Show choices */
129         p_ptr->window |= (PW_SPELL);
130
131         window_stuff();
132
133         /* Build a prompt (accept all spells) */
134 #ifdef JP
135         jverb( prompt, jverb_buf, JVERB_AND );
136         (void) strnfmt(out_val, 78, "(%^s:%c-%c, '*'で一覧, ESCで中断) どの%sを%^sますか? ",
137                 p, I2A(0), I2A(num - 1), p, jverb_buf );
138 #else
139         (void)strnfmt(out_val, 78, "(%^ss %c-%c, *=List, ESC=exit) %^s which %s? ",
140                 p, I2A(0), I2A(num - 1), prompt, p);
141 #endif
142
143         /* Get a spell from the user */
144
145         choice = (always_show_list || use_menu) ? ESCAPE : 1;
146         while (!flag)
147         {
148                 if (choice == ESCAPE) choice = ' '; 
149                 else if (!get_com(out_val, &choice, TRUE))break;
150
151                 if (use_menu && choice != ' ')
152                 {
153                         switch (choice)
154                         {
155                                 case '0':
156                                 {
157                                         screen_load();
158                                         return FALSE;
159                                 }
160
161                                 case '8':
162                                 case 'k':
163                                 case 'K':
164                                 {
165                                         menu_line += (num - 1);
166                                         break;
167                                 }
168
169                                 case '2':
170                                 case 'j':
171                                 case 'J':
172                                 {
173                                         menu_line++;
174                                         break;
175                                 }
176
177                                 case 'x':
178                                 case 'X':
179                                 case '\r':
180                                 case '\n':
181                                 {
182                                         i = menu_line - 1;
183                                         ask = FALSE;
184                                         break;
185                                 }
186                         }
187                         if (menu_line > num) menu_line -= num;
188                         /* Display a list of spells */
189                         print_spells(menu_line, spells, num, 1, 15, use_realm);
190                         if (ask) continue;
191                 }
192                 else
193                 {
194                         /* Request redraw */
195                         if ((choice == ' ') || (choice == '*') || (choice == '?'))
196                         {
197                                 /* Show the list */
198                                 if (!redraw)
199                                 {
200                                         /* Show list */
201                                         redraw = TRUE;
202
203                                         /* Save the screen */
204                                         screen_save();
205
206                                         /* Display a list of spells */
207                                         print_spells(menu_line, spells, num, 1, 15, use_realm);
208                                 }
209
210                                 /* Hide the list */
211                                 else
212                                 {
213                                         if (use_menu) continue;
214
215                                         /* Hide list */
216                                         redraw = FALSE;
217
218                                         /* Restore the screen */
219                                         screen_load();
220                                 }
221
222                                 /* Redo asking */
223                                 continue;
224                         }
225
226
227                         /* Note verify */
228                         ask = (isupper(choice));
229
230                         /* Lowercase */
231                         if (ask) choice = (char)tolower(choice);
232
233                         /* Extract request */
234                         i = (islower(choice) ? A2I(choice) : -1);
235                 }
236
237                 /* Totally Illegal */
238                 if ((i < 0) || (i >= num))
239                 {
240                         bell();
241                         continue;
242                 }
243
244                 /* Save the spell index */
245                 spell = spells[i];
246
247                 /* Require "okay" spells */
248                 if (!spell_okay(spell, learned, FALSE, use_realm))
249                 {
250                         bell();
251 #ifdef JP
252                         msg_format("その%sを%sことはできません。", p, prompt);
253 #else
254                         msg_format("You may not %s that %s.", prompt, p);
255 #endif
256
257                         continue;
258                 }
259
260                 /* Verify it */
261                 if (ask)
262                 {
263                         char tmp_val[160];
264
265                         /* Access the spell */
266                         if (!is_magic(use_realm))
267                         {
268                                 s_ptr = &technic_info[use_realm - MIN_TECHNIC][spell];
269                         }
270                         else
271                         {
272                                 s_ptr = &mp_ptr->info[use_realm - 1][spell];
273                         }
274
275                         /* Extract mana consumption rate */
276                         if (use_realm == REALM_HISSATSU)
277                         {
278                                 need_mana = s_ptr->smana;
279                         }
280                         else
281                         {
282                                 need_mana = mod_need_mana(s_ptr->smana, spell, use_realm);
283                         }
284
285                         /* Prompt */
286 #ifdef JP
287                         jverb( prompt, jverb_buf, JVERB_AND );
288                         /* 英日切り替え機能に対応 */
289                         (void) strnfmt(tmp_val, 78, "%s(MP%d, 失敗率%d%%)を%sますか? ",
290                                 do_spell(use_realm, spell, SPELL_NAME), need_mana,
291                                        spell_chance(spell, use_realm),jverb_buf);
292 #else
293                         (void)strnfmt(tmp_val, 78, "%^s %s (%d mana, %d%% fail)? ",
294                                 prompt, do_spell(use_realm, spell, SPELL_NAME), need_mana,
295                                 spell_chance(spell, use_realm));
296 #endif
297
298
299                         /* Belay that order */
300                         if (!get_check(tmp_val)) continue;
301                 }
302
303                 /* Stop the loop */
304                 flag = TRUE;
305         }
306
307
308         /* Restore the screen */
309         if (redraw) screen_load();
310
311
312         /* Show choices */
313         p_ptr->window |= (PW_SPELL);
314
315         window_stuff();
316
317
318         /* Abort if needed */
319         if (!flag) return FALSE;
320
321         /* Save the choice */
322         (*sn) = spell;
323
324         repeat_push((COMMAND_CODE)spell);
325
326         /* Success */
327         return TRUE;
328 }
329
330 /*!
331  * @brief オブジェクトがプレイヤーが使用可能な魔道書かどうかを判定する
332  * @param o_ptr 判定したいオブ会ジェクトの構造体参照ポインタ
333  * @return 学習できる魔道書ならばTRUEを返す
334  */
335 static bool item_tester_learn_spell(object_type *o_ptr)
336 {
337         s32b choices = realm_choices2[p_ptr->pclass];
338
339         if (p_ptr->pclass == CLASS_PRIEST)
340         {
341                 if (is_good_realm(p_ptr->realm1))
342                 {
343                         choices &= ~(CH_DEATH | CH_DAEMON);
344                 }
345                 else
346                 {
347                         choices &= ~(CH_LIFE | CH_CRUSADE);
348                 }
349         }
350
351         if ((o_ptr->tval < TV_LIFE_BOOK) || (o_ptr->tval > (TV_LIFE_BOOK + MAX_REALM - 1))) return (FALSE);
352         if ((o_ptr->tval == TV_MUSIC_BOOK) && (p_ptr->pclass == CLASS_BARD)) return (TRUE);
353         else if (!is_magic(tval2realm(o_ptr->tval))) return FALSE;
354         if ((REALM1_BOOK == o_ptr->tval) || (REALM2_BOOK == o_ptr->tval)) return (TRUE);
355         if (choices & (0x0001 << (tval2realm(o_ptr->tval) - 1))) return (TRUE);
356         return (FALSE);
357 }
358
359 /*!
360  * @brief プレイヤーが魔道書を一冊も持っていないかを判定する
361  * @return 魔道書を一冊も持っていないならTRUEを返す
362  */
363 static bool player_has_no_spellbooks(void)
364 {
365         int         i;
366         object_type *o_ptr;
367
368         for (i = 0; i < INVEN_PACK; i++)
369         {
370                 o_ptr = &inventory[i];
371                 if (o_ptr->k_idx && check_book_realm(o_ptr->tval, o_ptr->sval)) return FALSE;
372         }
373
374         for (i = cave[p_ptr->y][p_ptr->x].o_idx; i; i = o_ptr->next_o_idx)
375         {
376                 o_ptr = &o_list[i];
377                 if (o_ptr->k_idx && (o_ptr->marked & OM_FOUND) && check_book_realm(o_ptr->tval, o_ptr->sval)) return FALSE;
378         }
379
380         return TRUE;
381 }
382
383 /*!
384  * @brief プレイヤーの職業が練気術師の時、領域魔法と練気術を切り換える処理のインターフェイス
385  * @param browse_only 魔法と技能の閲覧を行うならばTRUE
386  * @return 魔道書を一冊も持っていないならTRUEを返す
387  */
388 static void confirm_use_force(bool browse_only)
389 {
390         char which;
391         COMMAND_CODE code;
392
393         /* Get the item index */
394         if (repeat_pull(&code) && (code == INVEN_FORCE))
395         {
396                 browse_only ? do_cmd_mind_browse() : do_cmd_mind();
397                 return;
398         }
399
400         /* Show the prompt */
401         prt(_("('w'練気術, ESC) 'w'かESCを押してください。 ", "(w for the Force, ESC) Hit 'w' or ESC. "), 0, 0);
402
403         while (1)
404         {
405                 /* Get a key */
406                 which = inkey();
407
408                 if (which == ESCAPE) break;
409                 else if (which == 'w')
410                 {
411
412                         repeat_push(INVEN_FORCE);
413
414                         break;
415                 }
416         }
417
418         /* Clear the prompt line */
419         prt("", 0, 0);
420
421         if (which == 'w')
422         {
423                 browse_only ? do_cmd_mind_browse() : do_cmd_mind();
424         }
425 }
426
427
428 /*!
429  * @brief プレイヤーの魔法と技能を閲覧するコマンドのメインルーチン /
430  * Peruse the spells/prayers in a book
431  * @return なし
432  * @details
433  * <pre>
434  * Note that *all* spells in the book are listed
435  *
436  * Note that browsing is allowed while confused or blind,
437  * and in the dark, primarily to allow browsing in stores.
438  * </pre>
439  */
440 void do_cmd_browse(void)
441 {
442         OBJECT_IDX item;
443         OBJECT_SUBTYPE_VALUE sval;
444         REALM_IDX use_realm = 0;
445         int j, line;
446         SPELL_IDX spell = -1;
447         int num = 0;
448
449         SPELL_IDX spells[64];
450         char temp[62*4];
451
452         object_type     *o_ptr;
453
454         cptr q, s;
455
456         /* Warriors are illiterate */
457         if (!(p_ptr->realm1 || p_ptr->realm2) && (p_ptr->pclass != CLASS_SORCERER) && (p_ptr->pclass != CLASS_RED_MAGE))
458         {
459                 msg_print(_("本を読むことができない!", "You cannot read books!"));
460                 return;
461         }
462
463         if (p_ptr->special_defense & KATA_MUSOU)
464         {
465                 set_action(ACTION_NONE);
466         }
467
468         if (p_ptr->pclass == CLASS_FORCETRAINER)
469         {
470                 if (player_has_no_spellbooks())
471                 {
472                         confirm_use_force(TRUE);
473                         return;
474                 }
475                 select_the_force = TRUE;
476         }
477
478         /* Restrict choices to "useful" books */
479         if (p_ptr->realm2 == REALM_NONE) item_tester_tval = mp_ptr->spell_book;
480         else item_tester_hook = item_tester_learn_spell;
481
482         q = _("どの本を読みますか? ", "Browse which book? ");
483         s = _("読める本がない。", "You have no books that you can read.");
484
485         if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR)))
486         {
487                 select_the_force = FALSE;
488                 return;
489         }
490         select_the_force = FALSE;
491
492         if (item == INVEN_FORCE) /* the_force */
493         {
494                 do_cmd_mind_browse();
495                 return;
496         }
497
498         /* Get the item (in the pack) */
499         else if (item >= 0)
500         {
501                 o_ptr = &inventory[item];
502         }
503
504         /* Get the item (on the floor) */
505         else
506         {
507                 o_ptr = &o_list[0 - item];
508         }
509
510         /* Access the item's sval */
511         sval = o_ptr->sval;
512
513         use_realm = tval2realm(o_ptr->tval);
514
515         /* Track the object kind */
516         object_kind_track(o_ptr->k_idx);
517
518         /* Hack -- Handle stuff */
519         handle_stuff();
520
521
522         /* Extract spells */
523         for (spell = 0; spell < 32; spell++)
524         {
525                 /* Check for this spell */
526                 if ((fake_spell_flags[sval] & (1L << spell)))
527                 {
528                         /* Collect this spell */
529                         spells[num++] = spell;
530                 }
531         }
532
533
534         /* Save the screen */
535         screen_save();
536
537         /* Clear the top line */
538         prt("", 0, 0);
539
540         /* Keep browsing spells.  Exit browsing on cancel. */
541         while(TRUE)
542         {
543                 /* Ask for a spell, allow cancel */
544                 if (!get_spell(&spell, _("読む", "browse"), o_ptr->sval, TRUE, use_realm))
545                 {
546                         /* If cancelled, leave immediately. */
547                         if (spell == -1) break;
548
549                         /* Display a list of spells */
550                         print_spells(0, spells, num, 1, 15, use_realm);
551
552                         /* Notify that there's nothing to see, and wait. */
553                         if (use_realm == REALM_HISSATSU)
554                                 prt(_("読める技がない。", "No techniques to browse."), 0, 0);
555                         else
556                                 prt(_("読める呪文がない。", "No spells to browse."), 0, 0);
557                         (void)inkey();
558
559
560                         /* Restore the screen */
561                         screen_load();
562
563                         return;
564                 }
565
566                 /* Clear lines, position cursor  (really should use strlen here) */
567                 Term_erase(14, 14, 255);
568                 Term_erase(14, 13, 255);
569                 Term_erase(14, 12, 255);
570                 Term_erase(14, 11, 255);
571
572                 roff_to_buf(do_spell(use_realm, spell, SPELL_DESC), 62, temp, sizeof(temp));
573
574                 for (j = 0, line = 11; temp[j]; j += 1 + strlen(&temp[j]))
575                 {
576                         prt(&temp[j], line, 15);
577                         line++;
578                 }
579         }
580
581         /* Restore the screen */
582         screen_load();
583 }
584
585 /*!
586  * @brief プレイヤーの第二魔法領域を変更する /
587  * @param next_realm 変更先の魔法領域ID
588  * @return なし
589  */
590 static void change_realm2(CHARACTER_IDX next_realm)
591 {
592         int i, j = 0;
593         char tmp[80];
594
595         for (i = 0; i < 64; i++)
596         {
597                 p_ptr->spell_order[j] = p_ptr->spell_order[i];
598                 if (p_ptr->spell_order[i] < 32) j++;
599         }
600         for (; j < 64; j++)
601                 p_ptr->spell_order[j] = 99;
602
603         for (i = 32; i < 64; i++)
604         {
605                 p_ptr->spell_exp[i] = SPELL_EXP_UNSKILLED;
606         }
607         p_ptr->spell_learned2 = 0L;
608         p_ptr->spell_worked2 = 0L;
609         p_ptr->spell_forgotten2 = 0L;
610
611         sprintf(tmp,_("魔法の領域を%sから%sに変更した。", "change magic realm from %s to %s."), realm_names[p_ptr->realm2], realm_names[next_realm]);
612         do_cmd_write_nikki(NIKKI_BUNSHOU, 0, tmp);
613         p_ptr->old_realm |= 1 << (p_ptr->realm2-1);
614         p_ptr->realm2 = next_realm;
615
616         p_ptr->notice |= (PN_REORDER);
617         p_ptr->update |= (PU_SPELLS);
618         handle_stuff();
619
620         /* Load an autopick preference file */
621         autopick_load_pref(FALSE);
622 }
623
624
625 /*!
626  * @brief 魔法を学習するコマンドのメインルーチン /
627  * Study a book to gain a new spell/prayer
628  * @return なし
629  */
630 void do_cmd_study(void)
631 {
632         int     i;
633         OBJECT_IDX item;
634         OBJECT_SUBTYPE_VALUE sval;
635         int     increment = 0;
636         bool    learned = FALSE;
637
638         /* Spells of realm2 will have an increment of +32 */
639         SPELL_IDX spell = -1;
640
641         cptr p = spell_category_name(mp_ptr->spell_book);
642
643         object_type *o_ptr;
644
645         cptr q, s;
646
647         if (!p_ptr->realm1)
648         {
649                 msg_print(_("本を読むことができない!", "You cannot read books!"));
650                 return;
651         }
652
653         if (p_ptr->blind || no_lite())
654         {
655                 msg_print(_("目が見えない!", "You cannot see!"));
656                 return;
657         }
658
659         if (p_ptr->confused)
660         {
661                 msg_print(_("混乱していて読めない!", "You are too confused!"));
662                 return;
663         }
664
665         if (!(p_ptr->new_spells))
666         {
667                 msg_format(_("新しい%sを覚えることはできない!", "You cannot learn any new %ss!"), p);
668                 return;
669         }
670
671         if (p_ptr->special_defense & KATA_MUSOU)
672         {
673                 set_action(ACTION_NONE);
674         }
675
676 #ifdef JP
677         if( p_ptr->new_spells < 10 ){
678                 msg_format("あと %d つの%sを学べる。", p_ptr->new_spells, p);
679         }else{
680                 msg_format("あと %d 個の%sを学べる。", p_ptr->new_spells, p);
681         }
682 #else
683         msg_format("You can learn %d new %s%s.", p_ptr->new_spells, p,
684                 (p_ptr->new_spells == 1?"":"s"));
685 #endif
686
687         msg_print(NULL);
688
689
690         /* Restrict choices to "useful" books */
691         if (p_ptr->realm2 == REALM_NONE) item_tester_tval = mp_ptr->spell_book;
692         else item_tester_hook = item_tester_learn_spell;
693
694         q = _("どの本から学びますか? ", "Study which book? ");
695         s = _("読める本がない。", "You have no books that you can read.");
696
697         if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
698
699         /* Get the item (in the pack) */
700         if (item >= 0)
701         {
702                 o_ptr = &inventory[item];
703         }
704
705         /* Get the item (on the floor) */
706         else
707         {
708                 o_ptr = &o_list[0 - item];
709         }
710
711         /* Access the item's sval */
712         sval = o_ptr->sval;
713
714         if (o_ptr->tval == REALM2_BOOK) increment = 32;
715         else if (o_ptr->tval != REALM1_BOOK)
716         {
717                 if (!get_check(_("本当に魔法の領域を変更しますか?", "Really, change magic realm? "))) return;
718                 change_realm2(tval2realm(o_ptr->tval));
719                 increment = 32;
720         }
721
722         /* Track the object kind */
723         object_kind_track(o_ptr->k_idx);
724
725         /* Hack -- Handle stuff */
726         handle_stuff();
727
728         /* Mage -- Learn a selected spell */
729         if (mp_ptr->spell_book != TV_LIFE_BOOK)
730         {
731                 /* Ask for a spell, allow cancel */
732                 if (!get_spell(&spell, _("学ぶ", "study"), sval, FALSE, o_ptr->tval - TV_LIFE_BOOK + 1) && (spell == -1)) return;
733         }
734
735         /* Priest -- Learn a random prayer */
736         else
737         {
738                 int k = 0;
739                 int gift = -1;
740
741                 /* Extract spells */
742                 for (spell = 0; spell < 32; spell++)
743                 {
744                         /* Check spells in the book */
745                         if ((fake_spell_flags[sval] & (1L << spell)))
746                         {
747                                 /* Skip non "okay" prayers */
748                                 if (!spell_okay(spell, FALSE, TRUE,
749                                         (increment ? p_ptr->realm2 : p_ptr->realm1))) continue;
750
751                                 /* Hack -- Prepare the randomizer */
752                                 k++;
753
754                                 /* Hack -- Apply the randomizer */
755                                 if (one_in_(k)) gift = spell;
756                         }
757                 }
758
759                 /* Accept gift */
760                 spell = gift;
761         }
762
763         /* Nothing to study */
764         if (spell < 0)
765         {
766                 msg_format(_("その本には学ぶべき%sがない。", "You cannot learn any %ss in that book."), p);
767
768                 /* Abort */
769                 return;
770         }
771
772         if (increment) spell += increment;
773
774         /* Learn the spell */
775         if (spell < 32)
776         {
777                 if (p_ptr->spell_learned1 & (1L << spell)) learned = TRUE;
778                 else p_ptr->spell_learned1 |= (1L << spell);
779         }
780         else
781         {
782                 if (p_ptr->spell_learned2 & (1L << (spell - 32))) learned = TRUE;
783                 else p_ptr->spell_learned2 |= (1L << (spell - 32));
784         }
785
786         if (learned)
787         {
788                 int max_exp = (spell < 32) ? SPELL_EXP_MASTER : SPELL_EXP_EXPERT;
789                 int old_exp = p_ptr->spell_exp[spell];
790                 int new_rank = EXP_LEVEL_UNSKILLED;
791                 cptr name = do_spell(increment ? p_ptr->realm2 : p_ptr->realm1, spell%32, SPELL_NAME);
792
793                 if (old_exp >= max_exp)
794                 {
795                         msg_format(_("その%sは完全に使いこなせるので学ぶ必要はない。", "You don't need to study this %s anymore."), p);
796                         return;
797                 }
798 #ifdef JP
799                 if (!get_check(format("%sの%sをさらに学びます。よろしいですか?", name, p)))
800 #else
801                 if (!get_check(format("You will study a %s of %s again. Are you sure? ", p, name)))
802 #endif
803                 {
804                         return;
805                 }
806                 else if (old_exp >= SPELL_EXP_EXPERT)
807                 {
808                         p_ptr->spell_exp[spell] = SPELL_EXP_MASTER;
809                         new_rank = EXP_LEVEL_MASTER;
810                 }
811                 else if (old_exp >= SPELL_EXP_SKILLED)
812                 {
813                         if (spell >= 32) p_ptr->spell_exp[spell] = SPELL_EXP_EXPERT;
814                         else p_ptr->spell_exp[spell] += SPELL_EXP_EXPERT - SPELL_EXP_SKILLED;
815                         new_rank = EXP_LEVEL_EXPERT;
816                 }
817                 else if (old_exp >= SPELL_EXP_BEGINNER)
818                 {
819                         p_ptr->spell_exp[spell] = SPELL_EXP_SKILLED + (old_exp - SPELL_EXP_BEGINNER) * 2 / 3;
820                         new_rank = EXP_LEVEL_SKILLED;
821                 }
822                 else
823                 {
824                         p_ptr->spell_exp[spell] = SPELL_EXP_BEGINNER + old_exp / 3;
825                         new_rank = EXP_LEVEL_BEGINNER;
826                 }
827                 msg_format(_("%sの熟練度が%sに上がった。", "Your proficiency of %s is now %s rank."), name, exp_level_str[new_rank]);
828         }
829         else
830         {
831                 /* Find the next open entry in "p_ptr->spell_order[]" */
832                 for (i = 0; i < 64; i++)
833                 {
834                         /* Stop at the first empty space */
835                         if (p_ptr->spell_order[i] == 99) break;
836                 }
837
838                 /* Add the spell to the known list */
839                 p_ptr->spell_order[i++] = spell;
840
841                 /* Mention the result */
842 #ifdef JP
843                 /* 英日切り替え機能に対応 */
844                 if (mp_ptr->spell_book == TV_MUSIC_BOOK)
845                 {
846                         msg_format("%sを学んだ。",
847                                     do_spell(increment ? p_ptr->realm2 : p_ptr->realm1, spell % 32, SPELL_NAME));
848                 }
849                 else
850                 {
851                         msg_format("%sの%sを学んだ。",
852                                     do_spell(increment ? p_ptr->realm2 : p_ptr->realm1, spell % 32, SPELL_NAME) ,p);
853                 }
854 #else
855                 msg_format("You have learned the %s of %s.",
856                         p, do_spell(increment ? p_ptr->realm2 : p_ptr->realm1, spell % 32, SPELL_NAME));
857 #endif
858         }
859
860         p_ptr->energy_use = 100;
861
862         switch (mp_ptr->spell_book)
863         {
864         case TV_LIFE_BOOK:
865                 chg_virtue(V_FAITH, 1);
866                 break;
867         case TV_DEATH_BOOK:
868                 chg_virtue(V_UNLIFE, 1);
869                 break;
870         case TV_NATURE_BOOK:
871                 chg_virtue(V_NATURE, 1);
872                 break;
873         default:
874                 chg_virtue(V_KNOWLEDGE, 1);
875                 break;
876         }
877
878         sound(SOUND_STUDY);
879
880         /* One less spell available */
881         p_ptr->learned_spells++;
882 #
883         /* Update Study */
884         p_ptr->update |= (PU_SPELLS);
885         update_stuff();
886
887         /* Redraw object recall */
888         p_ptr->window |= (PW_OBJECT);
889 }
890
891
892 /*!
893  * @brief 魔法を詠唱するコマンドのメインルーチン /
894  * Cast a spell
895  * @return なし
896  */
897 void do_cmd_cast(void)
898 {
899         OBJECT_IDX item;
900         OBJECT_SUBTYPE_VALUE sval;
901         SPELL_IDX spell;
902         REALM_IDX realm;
903         int     chance;
904         int     increment = 0;
905         REALM_IDX use_realm;
906         MANA_POINT need_mana;
907
908         cptr prayer;
909         object_type     *o_ptr;
910         const magic_type *s_ptr;
911         cptr q, s;
912
913         bool over_exerted = FALSE;
914
915         /* Require spell ability */
916         if (!p_ptr->realm1 && (p_ptr->pclass != CLASS_SORCERER) && (p_ptr->pclass != CLASS_RED_MAGE))
917         {
918                 msg_print(_("呪文を唱えられない!", "You cannot cast spells!"));
919                 return;
920         }
921
922         /* Require lite */
923         if (p_ptr->blind || no_lite())
924         {
925                 if (p_ptr->pclass == CLASS_FORCETRAINER) confirm_use_force(FALSE);
926                 else
927                 {
928                         msg_print(_("目が見えない!", "You cannot see!"));
929                         flush();
930                 }
931                 return;
932         }
933
934         /* Not when confused */
935         if (p_ptr->confused)
936         {
937                 msg_print(_("混乱していて唱えられない!", "You are too confused!"));
938                 flush();
939                 return;
940         }
941
942         /* Hex */
943         if (p_ptr->realm1 == REALM_HEX)
944         {
945                 if (hex_spell_fully())
946                 {
947                         bool flag = FALSE;
948                         msg_print(_("これ以上新しい呪文を詠唱することはできない。", "Can not spell new spells more."));
949                         flush();
950                         if (p_ptr->lev >= 35) flag = stop_hex_spell();
951                         if (!flag) return;
952                 }
953         }
954
955         if (p_ptr->pclass == CLASS_FORCETRAINER)
956         {
957                 if (player_has_no_spellbooks())
958                 {
959                         confirm_use_force(FALSE);
960                         return;
961                 }
962                 select_the_force = TRUE;
963         }
964
965         prayer = spell_category_name(mp_ptr->spell_book);
966
967         /* Restrict choices to spell books */
968         item_tester_tval = mp_ptr->spell_book;
969
970         q = _("どの呪文書を使いますか? ", "Use which book? ");
971         s = _("呪文書がない!", "You have no spell books!");
972
973         if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR)))
974         {
975                 select_the_force = FALSE;
976                 return;
977         }
978         select_the_force = FALSE;
979
980         if (item == INVEN_FORCE) /* the_force */
981         {
982                 do_cmd_mind();
983                 return;
984         }
985
986         /* Get the item (in the pack) */
987         else if (item >= 0)
988         {
989                 o_ptr = &inventory[item];
990         }
991
992         /* Get the item (on the floor) */
993         else
994         {
995                 o_ptr = &o_list[0 - item];
996         }
997
998         /* Access the item's sval */
999         sval = o_ptr->sval;
1000
1001         if ((p_ptr->pclass != CLASS_SORCERER) && (p_ptr->pclass != CLASS_RED_MAGE) && (o_ptr->tval == REALM2_BOOK)) increment = 32;
1002
1003
1004         /* Track the object kind */
1005         object_kind_track(o_ptr->k_idx);
1006
1007         /* Hack -- Handle stuff */
1008         handle_stuff();
1009
1010         if ((p_ptr->pclass == CLASS_SORCERER) || (p_ptr->pclass == CLASS_RED_MAGE))
1011                 realm = o_ptr->tval - TV_LIFE_BOOK + 1;
1012         else if (increment) realm = p_ptr->realm2;
1013         else realm = p_ptr->realm1;
1014
1015         /* Ask for a spell */
1016 #ifdef JP
1017         if (!get_spell(&spell, ((mp_ptr->spell_book == TV_LIFE_BOOK) ? "詠唱する" : (mp_ptr->spell_book == TV_MUSIC_BOOK) ? "歌う" : "唱える"), 
1018                         sval, TRUE, realm))
1019         {
1020                 if (spell == -2) msg_format("その本には知っている%sがない。", prayer);
1021                 return;
1022         }
1023 #else
1024         if (!get_spell(&spell, ((mp_ptr->spell_book == TV_LIFE_BOOK) ? "recite" : "cast"),
1025                 sval, TRUE, realm))
1026         {
1027                 if (spell == -2)
1028                         msg_format("You don't know any %ss in that book.", prayer);
1029                 return;
1030         }
1031 #endif
1032
1033
1034         use_realm = tval2realm(o_ptr->tval);
1035
1036         /* Hex */
1037         if (use_realm == REALM_HEX)
1038         {
1039                 if (hex_spelling(spell))
1040                 {
1041                         msg_print(_("その呪文はすでに詠唱中だ。", "You are already casting it."));
1042                         return;
1043                 }
1044         }
1045
1046         if (!is_magic(use_realm))
1047         {
1048                 s_ptr = &technic_info[use_realm - MIN_TECHNIC][spell];
1049         }
1050         else
1051         {
1052                 s_ptr = &mp_ptr->info[realm - 1][spell];
1053         }
1054
1055         /* Extract mana consumption rate */
1056         need_mana = mod_need_mana(s_ptr->smana, spell, realm);
1057
1058         /* Verify "dangerous" spells */
1059         if (need_mana > p_ptr->csp)
1060         {
1061                 if (flush_failure) flush();
1062
1063                 /* Warning */
1064 #ifdef JP
1065                 msg_format("その%sを%sのに十分なマジックポイントがない。",prayer,
1066                          ((mp_ptr->spell_book == TV_LIFE_BOOK) ? "詠唱する" : (mp_ptr->spell_book == TV_LIFE_BOOK) ? "歌う" : "唱える"));
1067 #else
1068                 msg_format("You do not have enough mana to %s this %s.",
1069                         ((mp_ptr->spell_book == TV_LIFE_BOOK) ? "recite" : "cast"),
1070                         prayer);
1071 #endif
1072
1073
1074                 if (!over_exert) return;
1075
1076                 /* Verify */
1077                 if (!get_check_strict(_("それでも挑戦しますか? ", "Attempt it anyway? "), CHECK_OKAY_CANCEL)) return;
1078         }
1079
1080         /* Spell failure chance */
1081         chance = spell_chance(spell, use_realm);
1082
1083         /* Sufficient mana */
1084         if (need_mana <= p_ptr->csp)
1085         {
1086                 /* Use some mana */
1087                 p_ptr->csp -= need_mana;
1088         }
1089         else over_exerted = TRUE;
1090
1091         /* Redraw mana */
1092         p_ptr->redraw |= (PR_MANA);
1093
1094         /* Failed spell */
1095         if (randint0(100) < chance)
1096         {
1097                 if (flush_failure) flush();
1098                 
1099                 msg_format(_("%sをうまく唱えられなかった!", "You failed to get the %s off!"), prayer);
1100                 sound(SOUND_FAIL);
1101
1102                 switch (realm)
1103                 {
1104                 case REALM_LIFE:
1105                         if (randint1(100) < chance) chg_virtue(V_VITALITY, -1);
1106                         break;
1107                 case REALM_DEATH:
1108                         if (randint1(100) < chance) chg_virtue(V_UNLIFE, -1);
1109                         break;
1110                 case REALM_NATURE:
1111                         if (randint1(100) < chance) chg_virtue(V_NATURE, -1);
1112                         break;
1113                 case REALM_DAEMON:
1114                         if (randint1(100) < chance) chg_virtue(V_JUSTICE, 1);
1115                         break;
1116                 case REALM_CRUSADE:
1117                         if (randint1(100) < chance) chg_virtue(V_JUSTICE, -1);
1118                         break;
1119                 case REALM_HEX:
1120                         if (randint1(100) < chance) chg_virtue(V_COMPASSION, -1);
1121                         break;
1122                 default:
1123                         if (randint1(100) < chance) chg_virtue(V_KNOWLEDGE, -1);
1124                         break;
1125                 }
1126
1127                 /* Failure casting may activate some side effect */
1128                 do_spell(realm, spell, SPELL_FAIL);
1129
1130
1131                 if ((o_ptr->tval == TV_CHAOS_BOOK) && (randint1(100) < spell))
1132                 {
1133                         msg_print(_("カオス的な効果を発生した!", "You produce a chaotic effect!"));
1134                         wild_magic(spell);
1135                 }
1136                 else if ((o_ptr->tval == TV_DEATH_BOOK) && (randint1(100) < spell))
1137                 {
1138                         if ((sval == 3) && one_in_(2))
1139                         {
1140                                 sanity_blast(0, TRUE);
1141                         }
1142                         else
1143                         {
1144                                 msg_print(_("痛い!", "It hurts!"));
1145                                 take_hit(DAMAGE_LOSELIFE, damroll(o_ptr->sval + 1, 6), _("暗黒魔法の逆流", "a miscast Death spell"), -1);
1146
1147                                 if ((spell > 15) && one_in_(6) && !p_ptr->hold_exp)
1148                                         lose_exp(spell * 250);
1149                         }
1150                 }
1151                 else if ((o_ptr->tval == TV_MUSIC_BOOK) && (randint1(200) < spell))
1152                 {
1153                         msg_print(_("いやな音が響いた", "An infernal sound echoed."));
1154                         aggravate_monsters(0);
1155                 }
1156                 if (randint1(100) >= chance)
1157                         chg_virtue(V_CHANCE,-1);
1158         }
1159
1160         /* Process spell */
1161         else
1162         {
1163                 /* Canceled spells cost neither a turn nor mana */
1164                 if (!do_spell(realm, spell, SPELL_CAST)) return;
1165
1166                 if (randint1(100) < chance)
1167                         chg_virtue(V_CHANCE,1);
1168
1169                 /* A spell was cast */
1170                 if (!(increment ?
1171                     (p_ptr->spell_worked2 & (1L << spell)) :
1172                     (p_ptr->spell_worked1 & (1L << spell)))
1173                     && (p_ptr->pclass != CLASS_SORCERER)
1174                     && (p_ptr->pclass != CLASS_RED_MAGE))
1175                 {
1176                         int e = s_ptr->sexp;
1177
1178                         /* The spell worked */
1179                         if (realm == p_ptr->realm1)
1180                         {
1181                                 p_ptr->spell_worked1 |= (1L << spell);
1182                         }
1183                         else
1184                         {
1185                                 p_ptr->spell_worked2 |= (1L << spell);
1186                         }
1187
1188                         /* Gain experience */
1189                         gain_exp(e * s_ptr->slevel);
1190
1191                         /* Redraw object recall */
1192                         p_ptr->window |= (PW_OBJECT);
1193
1194                         switch (realm)
1195                         {
1196                         case REALM_LIFE:
1197                                 chg_virtue(V_TEMPERANCE, 1);
1198                                 chg_virtue(V_COMPASSION, 1);
1199                                 chg_virtue(V_VITALITY, 1);
1200                                 chg_virtue(V_DILIGENCE, 1);
1201                                 break;
1202                         case REALM_DEATH:
1203                                 chg_virtue(V_UNLIFE, 1);
1204                                 chg_virtue(V_JUSTICE, -1);
1205                                 chg_virtue(V_FAITH, -1);
1206                                 chg_virtue(V_VITALITY, -1);
1207                                 break;
1208                         case REALM_DAEMON:
1209                                 chg_virtue(V_JUSTICE, -1);
1210                                 chg_virtue(V_FAITH, -1);
1211                                 chg_virtue(V_HONOUR, -1);
1212                                 chg_virtue(V_TEMPERANCE, -1);
1213                                 break;
1214                         case REALM_CRUSADE:
1215                                 chg_virtue(V_FAITH, 1);
1216                                 chg_virtue(V_JUSTICE, 1);
1217                                 chg_virtue(V_SACRIFICE, 1);
1218                                 chg_virtue(V_HONOUR, 1);
1219                                 break;
1220                         case REALM_NATURE:
1221                                 chg_virtue(V_NATURE, 1);
1222                                 chg_virtue(V_HARMONY, 1);
1223                                 break;
1224                         case REALM_HEX:
1225                                 chg_virtue(V_JUSTICE, -1);
1226                                 chg_virtue(V_FAITH, -1);
1227                                 chg_virtue(V_HONOUR, -1);
1228                                 chg_virtue(V_COMPASSION, -1);
1229                                 break;
1230                         default:
1231                                 chg_virtue(V_KNOWLEDGE, 1);
1232                                 break;
1233                         }
1234                 }
1235                 switch (realm)
1236                 {
1237                 case REALM_LIFE:
1238                         if (randint1(100 + p_ptr->lev) < need_mana) chg_virtue(V_TEMPERANCE, 1);
1239                         if (randint1(100 + p_ptr->lev) < need_mana) chg_virtue(V_COMPASSION, 1);
1240                         if (randint1(100 + p_ptr->lev) < need_mana) chg_virtue(V_VITALITY, 1);
1241                         if (randint1(100 + p_ptr->lev) < need_mana) chg_virtue(V_DILIGENCE, 1);
1242                         break;
1243                 case REALM_DEATH:
1244                         if (randint1(100 + p_ptr->lev) < need_mana) chg_virtue(V_UNLIFE, 1);
1245                         if (randint1(100 + p_ptr->lev) < need_mana) chg_virtue(V_JUSTICE, -1);
1246                         if (randint1(100 + p_ptr->lev) < need_mana) chg_virtue(V_FAITH, -1);
1247                         if (randint1(100 + p_ptr->lev) < need_mana) chg_virtue(V_VITALITY, -1);
1248                         break;
1249                 case REALM_DAEMON:
1250                         if (randint1(100 + p_ptr->lev) < need_mana) chg_virtue(V_JUSTICE, -1);
1251                         if (randint1(100 + p_ptr->lev) < need_mana) chg_virtue(V_FAITH, -1);
1252                         if (randint1(100 + p_ptr->lev) < need_mana) chg_virtue(V_HONOUR, -1);
1253                         if (randint1(100 + p_ptr->lev) < need_mana) chg_virtue(V_TEMPERANCE, -1);
1254                         break;
1255                 case REALM_CRUSADE:
1256                         if (randint1(100 + p_ptr->lev) < need_mana) chg_virtue(V_FAITH, 1);
1257                         if (randint1(100 + p_ptr->lev) < need_mana) chg_virtue(V_JUSTICE, 1);
1258                         if (randint1(100 + p_ptr->lev) < need_mana) chg_virtue(V_SACRIFICE, 1);
1259                         if (randint1(100 + p_ptr->lev) < need_mana) chg_virtue(V_HONOUR, 1);
1260                         break;
1261                 case REALM_NATURE:
1262                         if (randint1(100 + p_ptr->lev) < need_mana) chg_virtue(V_NATURE, 1);
1263                         if (randint1(100 + p_ptr->lev) < need_mana) chg_virtue(V_HARMONY, 1);
1264                         break;
1265                 case REALM_HEX:
1266                         if (randint1(100 + p_ptr->lev) < need_mana) chg_virtue(V_JUSTICE, -1);
1267                         if (randint1(100 + p_ptr->lev) < need_mana) chg_virtue(V_FAITH, -1);
1268                         if (randint1(100 + p_ptr->lev) < need_mana) chg_virtue(V_HONOUR, -1);
1269                         if (randint1(100 + p_ptr->lev) < need_mana) chg_virtue(V_COMPASSION, -1);
1270                         break;
1271                 }
1272                 if (mp_ptr->spell_xtra & MAGIC_GAIN_EXP)
1273                 {
1274                         s16b cur_exp = p_ptr->spell_exp[(increment ? 32 : 0)+spell];
1275                         s16b exp_gain = 0;
1276
1277                         if (cur_exp < SPELL_EXP_BEGINNER)
1278                                 exp_gain += 60;
1279                         else if (cur_exp < SPELL_EXP_SKILLED)
1280                         {
1281                                 if ((dun_level > 4) && ((dun_level + 10) > p_ptr->lev))
1282                                         exp_gain = 8;
1283                         }
1284                         else if (cur_exp < SPELL_EXP_EXPERT)
1285                         {
1286                                 if (((dun_level + 5) > p_ptr->lev) && ((dun_level + 5) > s_ptr->slevel))
1287                                         exp_gain = 2;
1288                         }
1289                         else if ((cur_exp < SPELL_EXP_MASTER) && !increment)
1290                         {
1291                                 if (((dun_level + 5) > p_ptr->lev) && (dun_level > s_ptr->slevel))
1292                                         exp_gain = 1;
1293                         }
1294                         p_ptr->spell_exp[(increment ? 32 : 0) + spell] += exp_gain;
1295                 }
1296         }
1297
1298         p_ptr->energy_use = 100;
1299
1300
1301         /* Over-exert the player */
1302         if(over_exerted)
1303         {
1304                 int oops = need_mana;
1305
1306                 /* No mana left */
1307                 p_ptr->csp = 0;
1308                 p_ptr->csp_frac = 0;
1309
1310                 msg_print(_("精神を集中しすぎて気を失ってしまった!", "You faint from the effort!"));
1311
1312                 /* Hack -- Bypass free action */
1313                 (void)set_paralyzed(p_ptr->paralyzed + randint1(5 * oops + 1));
1314
1315                 switch (realm)
1316                 {
1317                 case REALM_LIFE:
1318                         chg_virtue(V_VITALITY, -10);
1319                         break;
1320                 case REALM_DEATH:
1321                         chg_virtue(V_UNLIFE, -10);
1322                         break;
1323                 case REALM_DAEMON:
1324                         chg_virtue(V_JUSTICE, 10);
1325                         break;
1326                 case REALM_NATURE:
1327                         chg_virtue(V_NATURE, -10);
1328                         break;
1329                 case REALM_CRUSADE:
1330                         chg_virtue(V_JUSTICE, -10);
1331                         break;
1332                 case REALM_HEX:
1333                         chg_virtue(V_COMPASSION, 10);
1334                         break;
1335                 default:
1336                         chg_virtue(V_KNOWLEDGE, -10);
1337                         break;
1338                 }
1339
1340                 /* Damage CON (possibly permanently) */
1341                 if (randint0(100) < 50)
1342                 {
1343                         bool perm = (randint0(100) < 25);
1344
1345                         msg_print(_("体を悪くしてしまった!", "You have damaged your health!"));
1346
1347                         /* Reduce constitution */
1348                         (void)dec_stat(A_CON, 15 + randint1(10), perm);
1349                 }
1350         }
1351
1352         p_ptr->window |= (PW_PLAYER);
1353         p_ptr->window |= (PW_SPELL);
1354 }