OSDN Git Service

[Refactor] #37353 メッセージ整理と型の置換 / Refactor messages and 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         handle_stuff();
518
519
520         /* Extract spells */
521         for (spell = 0; spell < 32; spell++)
522         {
523                 /* Check for this spell */
524                 if ((fake_spell_flags[sval] & (1L << spell)))
525                 {
526                         /* Collect this spell */
527                         spells[num++] = spell;
528                 }
529         }
530
531
532         /* Save the screen */
533         screen_save();
534
535         /* Clear the top line */
536         prt("", 0, 0);
537
538         /* Keep browsing spells.  Exit browsing on cancel. */
539         while(TRUE)
540         {
541                 /* Ask for a spell, allow cancel */
542                 if (!get_spell(&spell, _("読む", "browse"), o_ptr->sval, TRUE, use_realm))
543                 {
544                         /* If cancelled, leave immediately. */
545                         if (spell == -1) break;
546
547                         /* Display a list of spells */
548                         print_spells(0, spells, num, 1, 15, use_realm);
549
550                         /* Notify that there's nothing to see, and wait. */
551                         if (use_realm == REALM_HISSATSU)
552                                 prt(_("読める技がない。", "No techniques to browse."), 0, 0);
553                         else
554                                 prt(_("読める呪文がない。", "No spells to browse."), 0, 0);
555                         (void)inkey();
556
557
558                         /* Restore the screen */
559                         screen_load();
560
561                         return;
562                 }
563
564                 /* Clear lines, position cursor  (really should use strlen here) */
565                 Term_erase(14, 14, 255);
566                 Term_erase(14, 13, 255);
567                 Term_erase(14, 12, 255);
568                 Term_erase(14, 11, 255);
569
570                 roff_to_buf(do_spell(use_realm, spell, SPELL_DESC), 62, temp, sizeof(temp));
571
572                 for (j = 0, line = 11; temp[j]; j += 1 + strlen(&temp[j]))
573                 {
574                         prt(&temp[j], line, 15);
575                         line++;
576                 }
577         }
578
579         /* Restore the screen */
580         screen_load();
581 }
582
583 /*!
584  * @brief プレイヤーの第二魔法領域を変更する /
585  * @param next_realm 変更先の魔法領域ID
586  * @return なし
587  */
588 static void change_realm2(CHARACTER_IDX next_realm)
589 {
590         int i, j = 0;
591         char tmp[80];
592
593         for (i = 0; i < 64; i++)
594         {
595                 p_ptr->spell_order[j] = p_ptr->spell_order[i];
596                 if (p_ptr->spell_order[i] < 32) j++;
597         }
598         for (; j < 64; j++)
599                 p_ptr->spell_order[j] = 99;
600
601         for (i = 32; i < 64; i++)
602         {
603                 p_ptr->spell_exp[i] = SPELL_EXP_UNSKILLED;
604         }
605         p_ptr->spell_learned2 = 0L;
606         p_ptr->spell_worked2 = 0L;
607         p_ptr->spell_forgotten2 = 0L;
608
609         sprintf(tmp,_("魔法の領域を%sから%sに変更した。", "change magic realm from %s to %s."), realm_names[p_ptr->realm2], realm_names[next_realm]);
610         do_cmd_write_nikki(NIKKI_BUNSHOU, 0, tmp);
611         p_ptr->old_realm |= 1 << (p_ptr->realm2-1);
612         p_ptr->realm2 = next_realm;
613
614         p_ptr->notice |= (PN_REORDER);
615         p_ptr->update |= (PU_SPELLS);
616         handle_stuff();
617
618         /* Load an autopick preference file */
619         autopick_load_pref(FALSE);
620 }
621
622
623 /*!
624  * @brief 魔法を学習するコマンドのメインルーチン /
625  * Study a book to gain a new spell/prayer
626  * @return なし
627  */
628 void do_cmd_study(void)
629 {
630         int     i;
631         OBJECT_IDX item;
632         OBJECT_SUBTYPE_VALUE sval;
633         int     increment = 0;
634         bool    learned = FALSE;
635
636         /* Spells of realm2 will have an increment of +32 */
637         SPELL_IDX spell = -1;
638
639         cptr p = spell_category_name(mp_ptr->spell_book);
640
641         object_type *o_ptr;
642
643         cptr q, s;
644
645         if (!p_ptr->realm1)
646         {
647                 msg_print(_("本を読むことができない!", "You cannot read books!"));
648                 return;
649         }
650
651         if (p_ptr->blind || no_lite())
652         {
653                 msg_print(_("目が見えない!", "You cannot see!"));
654                 return;
655         }
656
657         if (p_ptr->confused)
658         {
659                 msg_print(_("混乱していて読めない!", "You are too confused!"));
660                 return;
661         }
662
663         if (!(p_ptr->new_spells))
664         {
665                 msg_format(_("新しい%sを覚えることはできない!", "You cannot learn any new %ss!"), p);
666                 return;
667         }
668
669         if (p_ptr->special_defense & KATA_MUSOU)
670         {
671                 set_action(ACTION_NONE);
672         }
673
674 #ifdef JP
675         if( p_ptr->new_spells < 10 ){
676                 msg_format("あと %d つの%sを学べる。", p_ptr->new_spells, p);
677         }else{
678                 msg_format("あと %d 個の%sを学べる。", p_ptr->new_spells, p);
679         }
680 #else
681         msg_format("You can learn %d new %s%s.", p_ptr->new_spells, p,
682                 (p_ptr->new_spells == 1?"":"s"));
683 #endif
684
685         msg_print(NULL);
686
687
688         /* Restrict choices to "useful" books */
689         if (p_ptr->realm2 == REALM_NONE) item_tester_tval = mp_ptr->spell_book;
690         else item_tester_hook = item_tester_learn_spell;
691
692         q = _("どの本から学びますか? ", "Study which book? ");
693         s = _("読める本がない。", "You have no books that you can read.");
694
695         if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
696
697         /* Get the item (in the pack) */
698         if (item >= 0)
699         {
700                 o_ptr = &inventory[item];
701         }
702
703         /* Get the item (on the floor) */
704         else
705         {
706                 o_ptr = &o_list[0 - item];
707         }
708
709         /* Access the item's sval */
710         sval = o_ptr->sval;
711
712         if (o_ptr->tval == REALM2_BOOK) increment = 32;
713         else if (o_ptr->tval != REALM1_BOOK)
714         {
715                 if (!get_check(_("本当に魔法の領域を変更しますか?", "Really, change magic realm? "))) return;
716                 change_realm2(tval2realm(o_ptr->tval));
717                 increment = 32;
718         }
719
720         /* Track the object kind */
721         object_kind_track(o_ptr->k_idx);
722         handle_stuff();
723
724         /* Mage -- Learn a selected spell */
725         if (mp_ptr->spell_book != TV_LIFE_BOOK)
726         {
727                 /* Ask for a spell, allow cancel */
728                 if (!get_spell(&spell, _("学ぶ", "study"), sval, FALSE, o_ptr->tval - TV_LIFE_BOOK + 1) && (spell == -1)) return;
729         }
730
731         /* Priest -- Learn a random prayer */
732         else
733         {
734                 int k = 0;
735                 int gift = -1;
736
737                 /* Extract spells */
738                 for (spell = 0; spell < 32; spell++)
739                 {
740                         /* Check spells in the book */
741                         if ((fake_spell_flags[sval] & (1L << spell)))
742                         {
743                                 /* Skip non "okay" prayers */
744                                 if (!spell_okay(spell, FALSE, TRUE,
745                                         (increment ? p_ptr->realm2 : p_ptr->realm1))) continue;
746
747                                 /* Hack -- Prepare the randomizer */
748                                 k++;
749
750                                 /* Hack -- Apply the randomizer */
751                                 if (one_in_(k)) gift = spell;
752                         }
753                 }
754
755                 /* Accept gift */
756                 spell = gift;
757         }
758
759         /* Nothing to study */
760         if (spell < 0)
761         {
762                 msg_format(_("その本には学ぶべき%sがない。", "You cannot learn any %ss in that book."), p);
763
764                 /* Abort */
765                 return;
766         }
767
768         if (increment) spell += increment;
769
770         /* Learn the spell */
771         if (spell < 32)
772         {
773                 if (p_ptr->spell_learned1 & (1L << spell)) learned = TRUE;
774                 else p_ptr->spell_learned1 |= (1L << spell);
775         }
776         else
777         {
778                 if (p_ptr->spell_learned2 & (1L << (spell - 32))) learned = TRUE;
779                 else p_ptr->spell_learned2 |= (1L << (spell - 32));
780         }
781
782         if (learned)
783         {
784                 int max_exp = (spell < 32) ? SPELL_EXP_MASTER : SPELL_EXP_EXPERT;
785                 int old_exp = p_ptr->spell_exp[spell];
786                 int new_rank = EXP_LEVEL_UNSKILLED;
787                 cptr name = do_spell(increment ? p_ptr->realm2 : p_ptr->realm1, spell%32, SPELL_NAME);
788
789                 if (old_exp >= max_exp)
790                 {
791                         msg_format(_("その%sは完全に使いこなせるので学ぶ必要はない。", "You don't need to study this %s anymore."), p);
792                         return;
793                 }
794 #ifdef JP
795                 if (!get_check(format("%sの%sをさらに学びます。よろしいですか?", name, p)))
796 #else
797                 if (!get_check(format("You will study a %s of %s again. Are you sure? ", p, name)))
798 #endif
799                 {
800                         return;
801                 }
802                 else if (old_exp >= SPELL_EXP_EXPERT)
803                 {
804                         p_ptr->spell_exp[spell] = SPELL_EXP_MASTER;
805                         new_rank = EXP_LEVEL_MASTER;
806                 }
807                 else if (old_exp >= SPELL_EXP_SKILLED)
808                 {
809                         if (spell >= 32) p_ptr->spell_exp[spell] = SPELL_EXP_EXPERT;
810                         else p_ptr->spell_exp[spell] += SPELL_EXP_EXPERT - SPELL_EXP_SKILLED;
811                         new_rank = EXP_LEVEL_EXPERT;
812                 }
813                 else if (old_exp >= SPELL_EXP_BEGINNER)
814                 {
815                         p_ptr->spell_exp[spell] = SPELL_EXP_SKILLED + (old_exp - SPELL_EXP_BEGINNER) * 2 / 3;
816                         new_rank = EXP_LEVEL_SKILLED;
817                 }
818                 else
819                 {
820                         p_ptr->spell_exp[spell] = SPELL_EXP_BEGINNER + old_exp / 3;
821                         new_rank = EXP_LEVEL_BEGINNER;
822                 }
823                 msg_format(_("%sの熟練度が%sに上がった。", "Your proficiency of %s is now %s rank."), name, exp_level_str[new_rank]);
824         }
825         else
826         {
827                 /* Find the next open entry in "p_ptr->spell_order[]" */
828                 for (i = 0; i < 64; i++)
829                 {
830                         /* Stop at the first empty space */
831                         if (p_ptr->spell_order[i] == 99) break;
832                 }
833
834                 /* Add the spell to the known list */
835                 p_ptr->spell_order[i++] = spell;
836
837                 /* Mention the result */
838 #ifdef JP
839                 /* 英日切り替え機能に対応 */
840                 if (mp_ptr->spell_book == TV_MUSIC_BOOK)
841                 {
842                         msg_format("%sを学んだ。",
843                                     do_spell(increment ? p_ptr->realm2 : p_ptr->realm1, spell % 32, SPELL_NAME));
844                 }
845                 else
846                 {
847                         msg_format("%sの%sを学んだ。",
848                                     do_spell(increment ? p_ptr->realm2 : p_ptr->realm1, spell % 32, SPELL_NAME) ,p);
849                 }
850 #else
851                 msg_format("You have learned the %s of %s.",
852                         p, do_spell(increment ? p_ptr->realm2 : p_ptr->realm1, spell % 32, SPELL_NAME));
853 #endif
854         }
855
856         p_ptr->energy_use = 100;
857
858         switch (mp_ptr->spell_book)
859         {
860         case TV_LIFE_BOOK:
861                 chg_virtue(V_FAITH, 1);
862                 break;
863         case TV_DEATH_BOOK:
864                 chg_virtue(V_UNLIFE, 1);
865                 break;
866         case TV_NATURE_BOOK:
867                 chg_virtue(V_NATURE, 1);
868                 break;
869         default:
870                 chg_virtue(V_KNOWLEDGE, 1);
871                 break;
872         }
873
874         sound(SOUND_STUDY);
875
876         /* One less spell available */
877         p_ptr->learned_spells++;
878 #
879         /* Update Study */
880         p_ptr->update |= (PU_SPELLS);
881         update_stuff();
882
883         /* Redraw object recall */
884         p_ptr->window |= (PW_OBJECT);
885 }
886
887
888 /*!
889  * @brief 魔法を詠唱するコマンドのメインルーチン /
890  * Cast a spell
891  * @return なし
892  */
893 void do_cmd_cast(void)
894 {
895         OBJECT_IDX item;
896         OBJECT_SUBTYPE_VALUE sval;
897         SPELL_IDX spell;
898         REALM_IDX realm;
899         int     chance;
900         int     increment = 0;
901         REALM_IDX use_realm;
902         MANA_POINT need_mana;
903
904         cptr prayer;
905         object_type     *o_ptr;
906         const magic_type *s_ptr;
907         cptr q, s;
908
909         bool over_exerted = FALSE;
910
911         /* Require spell ability */
912         if (!p_ptr->realm1 && (p_ptr->pclass != CLASS_SORCERER) && (p_ptr->pclass != CLASS_RED_MAGE))
913         {
914                 msg_print(_("呪文を唱えられない!", "You cannot cast spells!"));
915                 return;
916         }
917
918         /* Require lite */
919         if (p_ptr->blind || no_lite())
920         {
921                 if (p_ptr->pclass == CLASS_FORCETRAINER) confirm_use_force(FALSE);
922                 else
923                 {
924                         msg_print(_("目が見えない!", "You cannot see!"));
925                         flush();
926                 }
927                 return;
928         }
929
930         /* Not when confused */
931         if (p_ptr->confused)
932         {
933                 msg_print(_("混乱していて唱えられない!", "You are too confused!"));
934                 flush();
935                 return;
936         }
937
938         /* Hex */
939         if (p_ptr->realm1 == REALM_HEX)
940         {
941                 if (hex_spell_fully())
942                 {
943                         bool flag = FALSE;
944                         msg_print(_("これ以上新しい呪文を詠唱することはできない。", "Can not spell new spells more."));
945                         flush();
946                         if (p_ptr->lev >= 35) flag = stop_hex_spell();
947                         if (!flag) return;
948                 }
949         }
950
951         if (p_ptr->pclass == CLASS_FORCETRAINER)
952         {
953                 if (player_has_no_spellbooks())
954                 {
955                         confirm_use_force(FALSE);
956                         return;
957                 }
958                 select_the_force = TRUE;
959         }
960
961         prayer = spell_category_name(mp_ptr->spell_book);
962
963         /* Restrict choices to spell books */
964         item_tester_tval = mp_ptr->spell_book;
965
966         q = _("どの呪文書を使いますか? ", "Use which book? ");
967         s = _("呪文書がない!", "You have no spell books!");
968
969         if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR)))
970         {
971                 select_the_force = FALSE;
972                 return;
973         }
974         select_the_force = FALSE;
975
976         if (item == INVEN_FORCE) /* the_force */
977         {
978                 do_cmd_mind();
979                 return;
980         }
981
982         /* Get the item (in the pack) */
983         else if (item >= 0)
984         {
985                 o_ptr = &inventory[item];
986         }
987
988         /* Get the item (on the floor) */
989         else
990         {
991                 o_ptr = &o_list[0 - item];
992         }
993
994         /* Access the item's sval */
995         sval = o_ptr->sval;
996
997         if ((p_ptr->pclass != CLASS_SORCERER) && (p_ptr->pclass != CLASS_RED_MAGE) && (o_ptr->tval == REALM2_BOOK)) increment = 32;
998
999
1000         /* Track the object kind */
1001         object_kind_track(o_ptr->k_idx);
1002         handle_stuff();
1003
1004         if ((p_ptr->pclass == CLASS_SORCERER) || (p_ptr->pclass == CLASS_RED_MAGE))
1005                 realm = o_ptr->tval - TV_LIFE_BOOK + 1;
1006         else if (increment) realm = p_ptr->realm2;
1007         else realm = p_ptr->realm1;
1008
1009         /* Ask for a spell */
1010 #ifdef JP
1011         if (!get_spell(&spell, ((mp_ptr->spell_book == TV_LIFE_BOOK) ? "詠唱する" : (mp_ptr->spell_book == TV_MUSIC_BOOK) ? "歌う" : "唱える"), 
1012                         sval, TRUE, realm))
1013         {
1014                 if (spell == -2) msg_format("その本には知っている%sがない。", prayer);
1015                 return;
1016         }
1017 #else
1018         if (!get_spell(&spell, ((mp_ptr->spell_book == TV_LIFE_BOOK) ? "recite" : "cast"),
1019                 sval, TRUE, realm))
1020         {
1021                 if (spell == -2)
1022                         msg_format("You don't know any %ss in that book.", prayer);
1023                 return;
1024         }
1025 #endif
1026
1027
1028         use_realm = tval2realm(o_ptr->tval);
1029
1030         /* Hex */
1031         if (use_realm == REALM_HEX)
1032         {
1033                 if (hex_spelling(spell))
1034                 {
1035                         msg_print(_("その呪文はすでに詠唱中だ。", "You are already casting it."));
1036                         return;
1037                 }
1038         }
1039
1040         if (!is_magic(use_realm))
1041         {
1042                 s_ptr = &technic_info[use_realm - MIN_TECHNIC][spell];
1043         }
1044         else
1045         {
1046                 s_ptr = &mp_ptr->info[realm - 1][spell];
1047         }
1048
1049         /* Extract mana consumption rate */
1050         need_mana = mod_need_mana(s_ptr->smana, spell, realm);
1051
1052         /* Verify "dangerous" spells */
1053         if (need_mana > p_ptr->csp)
1054         {
1055                 if (flush_failure) flush();
1056
1057                 /* Warning */
1058 #ifdef JP
1059                 msg_format("その%sを%sのに十分なマジックポイントがない。",prayer,
1060                          ((mp_ptr->spell_book == TV_LIFE_BOOK) ? "詠唱する" : (mp_ptr->spell_book == TV_LIFE_BOOK) ? "歌う" : "唱える"));
1061 #else
1062                 msg_format("You do not have enough mana to %s this %s.",
1063                         ((mp_ptr->spell_book == TV_LIFE_BOOK) ? "recite" : "cast"),
1064                         prayer);
1065 #endif
1066
1067
1068                 if (!over_exert) return;
1069
1070                 /* Verify */
1071                 if (!get_check_strict(_("それでも挑戦しますか? ", "Attempt it anyway? "), CHECK_OKAY_CANCEL)) return;
1072         }
1073
1074         /* Spell failure chance */
1075         chance = spell_chance(spell, use_realm);
1076
1077         /* Sufficient mana */
1078         if (need_mana <= p_ptr->csp)
1079         {
1080                 /* Use some mana */
1081                 p_ptr->csp -= need_mana;
1082         }
1083         else over_exerted = TRUE;
1084
1085         /* Redraw mana */
1086         p_ptr->redraw |= (PR_MANA);
1087
1088         /* Failed spell */
1089         if (randint0(100) < chance)
1090         {
1091                 if (flush_failure) flush();
1092                 
1093                 msg_format(_("%sをうまく唱えられなかった!", "You failed to get the %s off!"), prayer);
1094                 sound(SOUND_FAIL);
1095
1096                 switch (realm)
1097                 {
1098                 case REALM_LIFE:
1099                         if (randint1(100) < chance) chg_virtue(V_VITALITY, -1);
1100                         break;
1101                 case REALM_DEATH:
1102                         if (randint1(100) < chance) chg_virtue(V_UNLIFE, -1);
1103                         break;
1104                 case REALM_NATURE:
1105                         if (randint1(100) < chance) chg_virtue(V_NATURE, -1);
1106                         break;
1107                 case REALM_DAEMON:
1108                         if (randint1(100) < chance) chg_virtue(V_JUSTICE, 1);
1109                         break;
1110                 case REALM_CRUSADE:
1111                         if (randint1(100) < chance) chg_virtue(V_JUSTICE, -1);
1112                         break;
1113                 case REALM_HEX:
1114                         if (randint1(100) < chance) chg_virtue(V_COMPASSION, -1);
1115                         break;
1116                 default:
1117                         if (randint1(100) < chance) chg_virtue(V_KNOWLEDGE, -1);
1118                         break;
1119                 }
1120
1121                 /* Failure casting may activate some side effect */
1122                 do_spell(realm, spell, SPELL_FAIL);
1123
1124
1125                 if ((o_ptr->tval == TV_CHAOS_BOOK) && (randint1(100) < spell))
1126                 {
1127                         msg_print(_("カオス的な効果を発生した!", "You produce a chaotic effect!"));
1128                         wild_magic(spell);
1129                 }
1130                 else if ((o_ptr->tval == TV_DEATH_BOOK) && (randint1(100) < spell))
1131                 {
1132                         if ((sval == 3) && one_in_(2))
1133                         {
1134                                 sanity_blast(0, TRUE);
1135                         }
1136                         else
1137                         {
1138                                 msg_print(_("痛い!", "It hurts!"));
1139                                 take_hit(DAMAGE_LOSELIFE, damroll(o_ptr->sval + 1, 6), _("暗黒魔法の逆流", "a miscast Death spell"), -1);
1140
1141                                 if ((spell > 15) && one_in_(6) && !p_ptr->hold_exp)
1142                                         lose_exp(spell * 250);
1143                         }
1144                 }
1145                 else if ((o_ptr->tval == TV_MUSIC_BOOK) && (randint1(200) < spell))
1146                 {
1147                         msg_print(_("いやな音が響いた", "An infernal sound echoed."));
1148                         aggravate_monsters(0);
1149                 }
1150                 if (randint1(100) >= chance)
1151                         chg_virtue(V_CHANCE,-1);
1152         }
1153
1154         /* Process spell */
1155         else
1156         {
1157                 /* Canceled spells cost neither a turn nor mana */
1158                 if (!do_spell(realm, spell, SPELL_CAST)) return;
1159
1160                 if (randint1(100) < chance)
1161                         chg_virtue(V_CHANCE,1);
1162
1163                 /* A spell was cast */
1164                 if (!(increment ?
1165                     (p_ptr->spell_worked2 & (1L << spell)) :
1166                     (p_ptr->spell_worked1 & (1L << spell)))
1167                     && (p_ptr->pclass != CLASS_SORCERER)
1168                     && (p_ptr->pclass != CLASS_RED_MAGE))
1169                 {
1170                         int e = s_ptr->sexp;
1171
1172                         /* The spell worked */
1173                         if (realm == p_ptr->realm1)
1174                         {
1175                                 p_ptr->spell_worked1 |= (1L << spell);
1176                         }
1177                         else
1178                         {
1179                                 p_ptr->spell_worked2 |= (1L << spell);
1180                         }
1181
1182                         /* Gain experience */
1183                         gain_exp(e * s_ptr->slevel);
1184
1185                         /* Redraw object recall */
1186                         p_ptr->window |= (PW_OBJECT);
1187
1188                         switch (realm)
1189                         {
1190                         case REALM_LIFE:
1191                                 chg_virtue(V_TEMPERANCE, 1);
1192                                 chg_virtue(V_COMPASSION, 1);
1193                                 chg_virtue(V_VITALITY, 1);
1194                                 chg_virtue(V_DILIGENCE, 1);
1195                                 break;
1196                         case REALM_DEATH:
1197                                 chg_virtue(V_UNLIFE, 1);
1198                                 chg_virtue(V_JUSTICE, -1);
1199                                 chg_virtue(V_FAITH, -1);
1200                                 chg_virtue(V_VITALITY, -1);
1201                                 break;
1202                         case REALM_DAEMON:
1203                                 chg_virtue(V_JUSTICE, -1);
1204                                 chg_virtue(V_FAITH, -1);
1205                                 chg_virtue(V_HONOUR, -1);
1206                                 chg_virtue(V_TEMPERANCE, -1);
1207                                 break;
1208                         case REALM_CRUSADE:
1209                                 chg_virtue(V_FAITH, 1);
1210                                 chg_virtue(V_JUSTICE, 1);
1211                                 chg_virtue(V_SACRIFICE, 1);
1212                                 chg_virtue(V_HONOUR, 1);
1213                                 break;
1214                         case REALM_NATURE:
1215                                 chg_virtue(V_NATURE, 1);
1216                                 chg_virtue(V_HARMONY, 1);
1217                                 break;
1218                         case REALM_HEX:
1219                                 chg_virtue(V_JUSTICE, -1);
1220                                 chg_virtue(V_FAITH, -1);
1221                                 chg_virtue(V_HONOUR, -1);
1222                                 chg_virtue(V_COMPASSION, -1);
1223                                 break;
1224                         default:
1225                                 chg_virtue(V_KNOWLEDGE, 1);
1226                                 break;
1227                         }
1228                 }
1229                 switch (realm)
1230                 {
1231                 case REALM_LIFE:
1232                         if (randint1(100 + p_ptr->lev) < need_mana) chg_virtue(V_TEMPERANCE, 1);
1233                         if (randint1(100 + p_ptr->lev) < need_mana) chg_virtue(V_COMPASSION, 1);
1234                         if (randint1(100 + p_ptr->lev) < need_mana) chg_virtue(V_VITALITY, 1);
1235                         if (randint1(100 + p_ptr->lev) < need_mana) chg_virtue(V_DILIGENCE, 1);
1236                         break;
1237                 case REALM_DEATH:
1238                         if (randint1(100 + p_ptr->lev) < need_mana) chg_virtue(V_UNLIFE, 1);
1239                         if (randint1(100 + p_ptr->lev) < need_mana) chg_virtue(V_JUSTICE, -1);
1240                         if (randint1(100 + p_ptr->lev) < need_mana) chg_virtue(V_FAITH, -1);
1241                         if (randint1(100 + p_ptr->lev) < need_mana) chg_virtue(V_VITALITY, -1);
1242                         break;
1243                 case REALM_DAEMON:
1244                         if (randint1(100 + p_ptr->lev) < need_mana) chg_virtue(V_JUSTICE, -1);
1245                         if (randint1(100 + p_ptr->lev) < need_mana) chg_virtue(V_FAITH, -1);
1246                         if (randint1(100 + p_ptr->lev) < need_mana) chg_virtue(V_HONOUR, -1);
1247                         if (randint1(100 + p_ptr->lev) < need_mana) chg_virtue(V_TEMPERANCE, -1);
1248                         break;
1249                 case REALM_CRUSADE:
1250                         if (randint1(100 + p_ptr->lev) < need_mana) chg_virtue(V_FAITH, 1);
1251                         if (randint1(100 + p_ptr->lev) < need_mana) chg_virtue(V_JUSTICE, 1);
1252                         if (randint1(100 + p_ptr->lev) < need_mana) chg_virtue(V_SACRIFICE, 1);
1253                         if (randint1(100 + p_ptr->lev) < need_mana) chg_virtue(V_HONOUR, 1);
1254                         break;
1255                 case REALM_NATURE:
1256                         if (randint1(100 + p_ptr->lev) < need_mana) chg_virtue(V_NATURE, 1);
1257                         if (randint1(100 + p_ptr->lev) < need_mana) chg_virtue(V_HARMONY, 1);
1258                         break;
1259                 case REALM_HEX:
1260                         if (randint1(100 + p_ptr->lev) < need_mana) chg_virtue(V_JUSTICE, -1);
1261                         if (randint1(100 + p_ptr->lev) < need_mana) chg_virtue(V_FAITH, -1);
1262                         if (randint1(100 + p_ptr->lev) < need_mana) chg_virtue(V_HONOUR, -1);
1263                         if (randint1(100 + p_ptr->lev) < need_mana) chg_virtue(V_COMPASSION, -1);
1264                         break;
1265                 }
1266                 if (mp_ptr->spell_xtra & MAGIC_GAIN_EXP)
1267                 {
1268                         s16b cur_exp = p_ptr->spell_exp[(increment ? 32 : 0)+spell];
1269                         s16b exp_gain = 0;
1270
1271                         if (cur_exp < SPELL_EXP_BEGINNER)
1272                                 exp_gain += 60;
1273                         else if (cur_exp < SPELL_EXP_SKILLED)
1274                         {
1275                                 if ((dun_level > 4) && ((dun_level + 10) > p_ptr->lev))
1276                                         exp_gain = 8;
1277                         }
1278                         else if (cur_exp < SPELL_EXP_EXPERT)
1279                         {
1280                                 if (((dun_level + 5) > p_ptr->lev) && ((dun_level + 5) > s_ptr->slevel))
1281                                         exp_gain = 2;
1282                         }
1283                         else if ((cur_exp < SPELL_EXP_MASTER) && !increment)
1284                         {
1285                                 if (((dun_level + 5) > p_ptr->lev) && (dun_level > s_ptr->slevel))
1286                                         exp_gain = 1;
1287                         }
1288                         p_ptr->spell_exp[(increment ? 32 : 0) + spell] += exp_gain;
1289                 }
1290         }
1291
1292         p_ptr->energy_use = 100;
1293
1294
1295         /* Over-exert the player */
1296         if(over_exerted)
1297         {
1298                 int oops = need_mana;
1299
1300                 /* No mana left */
1301                 p_ptr->csp = 0;
1302                 p_ptr->csp_frac = 0;
1303
1304                 msg_print(_("精神を集中しすぎて気を失ってしまった!", "You faint from the effort!"));
1305
1306                 /* Hack -- Bypass free action */
1307                 (void)set_paralyzed(p_ptr->paralyzed + randint1(5 * oops + 1));
1308
1309                 switch (realm)
1310                 {
1311                 case REALM_LIFE:
1312                         chg_virtue(V_VITALITY, -10);
1313                         break;
1314                 case REALM_DEATH:
1315                         chg_virtue(V_UNLIFE, -10);
1316                         break;
1317                 case REALM_DAEMON:
1318                         chg_virtue(V_JUSTICE, 10);
1319                         break;
1320                 case REALM_NATURE:
1321                         chg_virtue(V_NATURE, -10);
1322                         break;
1323                 case REALM_CRUSADE:
1324                         chg_virtue(V_JUSTICE, -10);
1325                         break;
1326                 case REALM_HEX:
1327                         chg_virtue(V_COMPASSION, 10);
1328                         break;
1329                 default:
1330                         chg_virtue(V_KNOWLEDGE, -10);
1331                         break;
1332                 }
1333
1334                 /* Damage CON (possibly permanently) */
1335                 if (randint0(100) < 50)
1336                 {
1337                         bool perm = (randint0(100) < 25);
1338
1339                         msg_print(_("体を悪くしてしまった!", "You have damaged your health!"));
1340
1341                         /* Reduce constitution */
1342                         (void)dec_stat(A_CON, 15 + randint1(10), perm);
1343                 }
1344         }
1345
1346         p_ptr->window |= (PW_PLAYER);
1347         p_ptr->window |= (PW_SPELL);
1348 }