OSDN Git Service

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