OSDN Git Service

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