OSDN Git Service

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