OSDN Git Service

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