OSDN Git Service

[Refactor] #37353 型の置換(QUEST_IDX) / Type replacement.
[hengband/hengband.git] / src / racial.c
1 /*!
2  * @file racial.c
3  * @brief レイシャルと突然変異の技能処理 / Racial powers (and mutations)
4  * @date 2014/01/08
5  * @author
6  * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke\n
7  * This software may be copied and distributed for educational, research,\n
8  * and not for profit purposes provided that this copyright and statement\n
9  * are included in all such copies.  Other copyrights may also apply.\n
10  * 2014 Deskull rearranged comment for Doxygen. \n
11  */
12
13 #include "angband.h"
14 #include "cmd-magiceat.h"
15 #include "cmd-zapwand.h"
16 #include "cmd-pet.h"
17 #include "melee.h"
18 #include "object-hook.h"
19
20 #include "mutation.h"
21
22 /*!
23  * @brief レイシャル「弾/矢の製造」処理 / do_cmd_cast calls this function if the player's class is 'archer'.
24  * Hook to determine if an object is contertible in an arrow/bolt
25  * @return 製造を実際に行ったらTRUE、キャンセルしたらFALSEを返す
26  */
27 static bool do_cmd_archer(void)
28 {
29         int ext=0;
30         char ch;
31
32         object_type     forge;
33         object_type     *q_ptr;
34
35         char com[80];
36         GAME_TEXT o_name[MAX_NLEN];
37
38         q_ptr = &forge;
39
40         if(p_ptr->lev >= 20)
41                 sprintf(com, _("[S]弾, [A]矢, [B]クロスボウの矢 :", "Create [S]hots, Create [A]rrow or Create [B]olt ?"));
42         else if(p_ptr->lev >= 10)
43                 sprintf(com, _("[S]弾, [A]矢:", "Create [S]hots or Create [A]rrow ?"));
44         else
45                 sprintf(com, _("[S]弾:", "Create [S]hots ?"));
46
47         if (p_ptr->confused)
48         {
49                 msg_print(_("混乱してる!", "You are too confused!"));
50                 return FALSE;
51         }
52
53         if (p_ptr->blind)
54         {
55                 msg_print(_("目が見えない!", "You are blind!"));
56                 return FALSE;
57         }
58
59         while (TRUE)
60         {
61                 if (!get_com(com, &ch, TRUE))
62                 {
63                         return FALSE;
64                 }
65                 if (ch == 'S' || ch == 's')
66                 {
67                         ext = 1;
68                         break;
69                 }
70                 if ((ch == 'A' || ch == 'a')&&(p_ptr->lev >= 10))
71                 {
72                         ext = 2;
73                         break;
74                 }
75                 if ((ch == 'B' || ch == 'b')&&(p_ptr->lev >= 20))
76                 {
77                         ext = 3;
78                         break;
79                 }
80         }
81
82         /**********Create shots*********/
83         if (ext == 1)
84         {
85                 POSITION x, y;
86                 DIRECTION dir;
87                 cave_type *c_ptr;
88
89                 if (!get_rep_dir(&dir, FALSE)) return FALSE;
90                 y = p_ptr->y + ddy[dir];
91                 x = p_ptr->x + ddx[dir];
92                 c_ptr = &cave[y][x];
93
94                 if (!have_flag(f_info[get_feat_mimic(c_ptr)].flags, FF_CAN_DIG))
95                 {
96                         msg_print(_("そこには岩石がない。", "You need pile of rubble."));
97                         return FALSE;
98                 }
99                 else if (!cave_have_flag_grid(c_ptr, FF_CAN_DIG) || !cave_have_flag_grid(c_ptr, FF_HURT_ROCK))
100                 {
101                         msg_print(_("硬すぎて崩せなかった。", "You failed to make ammo."));
102                 }
103                 else
104                 {
105                         s16b slot;
106                         q_ptr = &forge;
107
108                         /* Hack -- Give the player some small firestones */
109                         object_prep(q_ptr, lookup_kind(TV_SHOT, (OBJECT_SUBTYPE_VALUE)m_bonus(1, p_ptr->lev) + 1));
110                         q_ptr->number = (byte)rand_range(15,30);
111                         object_aware(q_ptr);
112                         object_known(q_ptr);
113                         apply_magic(q_ptr, p_ptr->lev, AM_NO_FIXED_ART);
114                         q_ptr->discount = 99;
115
116                         slot = inven_carry(q_ptr);
117
118                         object_desc(o_name, q_ptr, 0);
119                         msg_format(_("%sを作った。", "You make some ammo."), o_name);
120
121                         /* Auto-inscription */
122                         if (slot >= 0) autopick_alter_item(slot, FALSE);
123
124                         /* Destroy the wall */
125                         cave_alter_feat(y, x, FF_HURT_ROCK);
126
127                         p_ptr->update |= (PU_FLOW);
128                 }
129         }
130         /**********Create arrows*********/
131         else if (ext == 2)
132         {
133                 OBJECT_IDX item;
134                 concptr q, s;
135                 s16b slot;
136
137                 item_tester_hook = item_tester_hook_convertible;
138
139                 q = _("どのアイテムから作りますか? ", "Convert which item? ");
140                 s = _("材料を持っていない。", "You have no item to convert.");
141                 q_ptr = choose_object(&item, q, s, (USE_INVEN | USE_FLOOR));
142                 if (!q_ptr) return FALSE;
143
144                 q_ptr = &forge;
145
146                 /* Hack -- Give the player some small firestones */
147                 object_prep(q_ptr, lookup_kind(TV_ARROW, (OBJECT_SUBTYPE_VALUE)m_bonus(1, p_ptr->lev)+ 1));
148                 q_ptr->number = (byte)rand_range(5, 10);
149                 object_aware(q_ptr);
150                 object_known(q_ptr);
151                 apply_magic(q_ptr, p_ptr->lev, AM_NO_FIXED_ART);
152
153                 q_ptr->discount = 99;
154
155                 object_desc(o_name, q_ptr, 0);
156                 msg_format(_("%sを作った。", "You make some ammo."), o_name);
157
158                 if (item >= 0)
159                 {
160                         inven_item_increase(item, -1);
161                         inven_item_describe(item);
162                         inven_item_optimize(item);
163                 }
164                 else
165                 {
166                         floor_item_increase(0 - item, -1);
167                         floor_item_describe(0 - item);
168                         floor_item_optimize(0 - item);
169                 }
170
171                 slot = inven_carry(q_ptr);
172
173                 /* Auto-inscription */
174                 if (slot >= 0) autopick_alter_item(slot, FALSE);
175         }
176         /**********Create bolts*********/
177         else if (ext == 3)
178         {
179                 OBJECT_IDX item;
180                 concptr q, s;
181                 s16b slot;
182
183                 item_tester_hook = item_tester_hook_convertible;
184
185                 q = _("どのアイテムから作りますか? ", "Convert which item? ");
186                 s = _("材料を持っていない。", "You have no item to convert.");
187
188                 q_ptr = choose_object(&item, q, s, (USE_INVEN | USE_FLOOR));
189                 if (!q_ptr) return FALSE;
190
191                 q_ptr = &forge;
192
193                 /* Hack -- Give the player some small firestones */
194                 object_prep(q_ptr, lookup_kind(TV_BOLT, (OBJECT_SUBTYPE_VALUE)m_bonus(1, p_ptr->lev)+1));
195                 q_ptr->number = (byte)rand_range(4, 8);
196                 object_aware(q_ptr);
197                 object_known(q_ptr);
198                 apply_magic(q_ptr, p_ptr->lev, AM_NO_FIXED_ART);
199
200                 q_ptr->discount = 99;
201
202                 object_desc(o_name, q_ptr, 0);
203                 msg_format(_("%sを作った。", "You make some ammo."), o_name);
204
205                 if (item >= 0)
206                 {
207                         inven_item_increase(item, -1);
208                         inven_item_describe(item);
209                         inven_item_optimize(item);
210                 }
211                 else
212                 {
213                         floor_item_increase(0 - item, -1);
214                         floor_item_describe(0 - item);
215                         floor_item_optimize(0 - item);
216                 }
217
218                 slot = inven_carry(q_ptr);
219
220                 /* Auto-inscription */
221                 if (slot >= 0) autopick_alter_item(slot, FALSE);
222         }
223         return TRUE;
224 }
225
226 /*!
227  * @brief 魔道具術師の魔力取り込み処理
228  * @return 取り込みを実行したらTRUE、キャンセルしたらFALSEを返す
229  */
230 bool gain_magic(void)
231 {
232         OBJECT_IDX item;
233         PARAMETER_VALUE pval;
234         int ext = 0;
235         concptr q, s;
236         object_type *o_ptr;
237         GAME_TEXT o_name[MAX_NLEN];
238
239         /* Only accept legal items */
240         item_tester_hook = item_tester_hook_recharge;
241
242         q = _("どのアイテムの魔力を取り込みますか? ", "Gain power of which item? ");
243         s = _("魔力を取り込めるアイテムがない。", "You have nothing to gain power.");
244
245         o_ptr = choose_object(&item, q, s, (USE_INVEN | USE_FLOOR));
246         if (!o_ptr) return (FALSE);
247
248         if (o_ptr->tval == TV_STAFF && o_ptr->sval == SV_STAFF_NOTHING)
249         {
250                 msg_print(_("この杖には発動の為の能力は何も備わっていないようだ。", "This staff doesn't have any magical ability."));
251                 return FALSE;
252         }
253
254         if (!object_is_known(o_ptr))
255         {
256                 msg_print(_("鑑定されていないと取り込めない。", "You need to identify before absorbing."));
257                 return FALSE;
258         }
259
260         if (o_ptr->timeout)
261         {
262                 msg_print(_("充填中のアイテムは取り込めない。", "This item is still charging."));
263                 return FALSE;
264         }
265
266         pval = o_ptr->pval;
267         if (o_ptr->tval == TV_ROD)
268                 ext = 72;
269         else if (o_ptr->tval == TV_WAND)
270                 ext = 36;
271
272         if (o_ptr->tval == TV_ROD)
273         {
274                 p_ptr->magic_num2[o_ptr->sval + ext] += (MAGIC_NUM2)o_ptr->number;
275                 if (p_ptr->magic_num2[o_ptr->sval + ext] > 99) p_ptr->magic_num2[o_ptr->sval + ext] = 99;
276         }
277         else
278         {
279                 int num;
280                 for (num = o_ptr->number; num; num--)
281                 {
282                         int gain_num = pval;
283                         if (o_ptr->tval == TV_WAND) gain_num = (pval + num - 1) / num;
284                         if (p_ptr->magic_num2[o_ptr->sval + ext])
285                         {
286                                 gain_num *= 256;
287                                 gain_num = (gain_num/3 + randint0(gain_num/3)) / 256;
288                                 if (gain_num < 1) gain_num = 1;
289                         }
290                         p_ptr->magic_num2[o_ptr->sval + ext] += (MAGIC_NUM2)gain_num;
291                         if (p_ptr->magic_num2[o_ptr->sval + ext] > 99) p_ptr->magic_num2[o_ptr->sval + ext] = 99;
292                         p_ptr->magic_num1[o_ptr->sval + ext] += pval * 0x10000;
293                         if (p_ptr->magic_num1[o_ptr->sval + ext] > 99 * 0x10000) p_ptr->magic_num1[o_ptr->sval + ext] = 99 * 0x10000;
294                         if (p_ptr->magic_num1[o_ptr->sval + ext] > p_ptr->magic_num2[o_ptr->sval + ext] * 0x10000) p_ptr->magic_num1[o_ptr->sval + ext] = p_ptr->magic_num2[o_ptr->sval + ext] * 0x10000;
295                         if (o_ptr->tval == TV_WAND) pval -= (pval + num - 1) / num;
296                 }
297         }
298
299         object_desc(o_name, o_ptr, 0);
300         msg_format(_("%sの魔力を取り込んだ。", "You absorb magic of %s."), o_name);
301
302         /* Eliminate the item (from the pack) */
303         if (item >= 0)
304         {
305                 inven_item_increase(item, -999);
306                 inven_item_describe(item);
307                 inven_item_optimize(item);
308         }
309
310         /* Eliminate the item (from the floor) */
311         else
312         {
313                 floor_item_increase(0 - item, -999);
314                 floor_item_describe(0 - item);
315                 floor_item_optimize(0 - item);
316         }
317         p_ptr->energy_use = 100;
318         return TRUE;
319 }
320
321 /*!
322  * @brief 魔法系コマンドを実行できるかの判定を返す
323  * @return 魔法系コマンドを使用可能ならTRUE、不可能ならば理由をメッセージ表示してFALSEを返す。
324  */
325 static bool can_do_cmd_cast(void)
326 {
327         if (dun_level && (d_info[dungeon_type].flags1 & DF1_NO_MAGIC))
328         {
329                 msg_print(_("ダンジョンが魔法を吸収した!", "The dungeon absorbs all attempted magic!"));
330                 msg_print(NULL);
331                 return FALSE;
332         }
333         else if (p_ptr->anti_magic)
334         {
335                 msg_print(_("反魔法バリアが魔法を邪魔した!", "An anti-magic shell disrupts your magic!"));
336                 return FALSE;
337         }
338         else if (p_ptr->shero)
339         {
340                 msg_format(_("狂戦士化していて頭が回らない!", "You cannot think directly!"));
341                 return FALSE;
342         }
343         else
344                 return TRUE;
345 }
346
347 /*!
348  * @brief 修行僧の構え設定処理
349  * @return 構えを変化させたらTRUE、構え不能かキャンセルしたらFALSEを返す。
350  */
351 static bool choose_kamae(void)
352 {
353         char choice;
354         int new_kamae = 0;
355         int i;
356         char buf[80];
357
358         if (p_ptr->confused)
359         {
360                 msg_print(_("混乱していて構えられない!", "Too confused."));
361                 return FALSE;
362         }
363         screen_save();
364         prt(_(" a) 構えをとく", " a) No form"), 2, 20);
365
366         for (i = 0; i < MAX_KAMAE; i++)
367         {
368                 if (p_ptr->lev >= kamae_shurui[i].min_level)
369                 {
370                         sprintf(buf," %c) %-12s  %s",I2A(i+1), kamae_shurui[i].desc, kamae_shurui[i].info);
371                         prt(buf, 3+i, 20);
372                 }
373         }
374
375         prt("", 1, 0);
376         prt(_("        どの構えをとりますか?", "        Choose Form: "), 1, 14);
377
378         while(1)
379         {
380                 choice = inkey();
381
382                 if (choice == ESCAPE)
383                 {
384                         screen_load();
385                         return FALSE;
386                 }
387                 else if ((choice == 'a') || (choice == 'A'))
388                 {
389                         if (p_ptr->action == ACTION_KAMAE)
390                         {
391                                 set_action(ACTION_NONE);
392                         }
393                         else
394                                 msg_print(_("もともと構えていない。", "You are not assuming a posture."));
395                         screen_load();
396                         return TRUE;
397                 }
398                 else if ((choice == 'b') || (choice == 'B'))
399                 {
400                         new_kamae = 0;
401                         break;
402                 }
403                 else if (((choice == 'c') || (choice == 'C')) && (p_ptr->lev > 29))
404                 {
405                         new_kamae = 1;
406                         break;
407                 }
408                 else if (((choice == 'd') || (choice == 'D')) && (p_ptr->lev > 34))
409                 {
410                         new_kamae = 2;
411                         break;
412                 }
413                 else if (((choice == 'e') || (choice == 'E')) && (p_ptr->lev > 39))
414                 {
415                         new_kamae = 3;
416                         break;
417                 }
418         }
419         set_action(ACTION_KAMAE);
420
421         if (p_ptr->special_defense & (KAMAE_GENBU << new_kamae))
422         {
423                 msg_print(_("構え直した。", "You reassume a posture."));
424         }
425         else
426         {
427                 p_ptr->special_defense &= ~(KAMAE_MASK);
428                 p_ptr->update |= (PU_BONUS);
429                 p_ptr->redraw |= (PR_STATE);
430                 msg_format(_("%sの構えをとった。", "You assume a posture of %s form."),kamae_shurui[new_kamae].desc);
431                 p_ptr->special_defense |= (KAMAE_GENBU << new_kamae);
432         }
433         p_ptr->redraw |= PR_STATE;
434         screen_load();
435         return TRUE;
436 }
437
438 /*!
439  * @brief 剣術家の型設定処理
440  * @return 型を変化させたらTRUE、型の構え不能かキャンセルしたらFALSEを返す。
441  */
442 static bool choose_kata(void)
443 {
444         char choice;
445         int new_kata = 0;
446         int i;
447         char buf[80];
448
449         if (p_ptr->confused)
450         {
451                 msg_print(_("混乱していて構えられない!", "Too confused."));
452                 return FALSE;
453         }
454
455         if (p_ptr->stun)
456         {
457                 msg_print(_("意識がはっきりとしない。", "You are not clear headed"));
458                 return FALSE;
459         }
460
461         if (p_ptr->afraid)
462         {
463                 msg_print(_("体が震えて構えられない!", "You are trembling with fear!"));
464                 return FALSE;
465         }
466         screen_save();
467         prt(_(" a) 型を崩す", " a) No Form"), 2, 20);
468
469         for (i = 0; i < MAX_KATA; i++)
470         {
471                 if (p_ptr->lev >= kata_shurui[i].min_level)
472                 {
473                         sprintf(buf,_(" %c) %sの型    %s", " %c) Form of %-12s  %s"),I2A(i+1), kata_shurui[i].desc, kata_shurui[i].info);
474                         prt(buf, 3+i, 20);
475                 }
476         }
477
478         prt("", 1, 0);
479         prt(_("        どの型で構えますか?", "        Choose Form: "), 1, 14);
480
481         while(1)
482         {
483                 choice = inkey();
484
485                 if (choice == ESCAPE)
486                 {
487                         screen_load();
488                         return FALSE;
489                 }
490                 else if ((choice == 'a') || (choice == 'A'))
491                 {
492                         if (p_ptr->action == ACTION_KATA)
493                         {
494                                 set_action(ACTION_NONE);
495                         }
496                         else
497                                 msg_print(_("もともと構えていない。", "You are not assuming posture."));
498                         screen_load();
499                         return TRUE;
500                 }
501                 else if ((choice == 'b') || (choice == 'B'))
502                 {
503                         new_kata = 0;
504                         break;
505                 }
506                 else if (((choice == 'c') || (choice == 'C')) && (p_ptr->lev > 29))
507                 {
508                         new_kata = 1;
509                         break;
510                 }
511                 else if (((choice == 'd') || (choice == 'D')) && (p_ptr->lev > 34))
512                 {
513                         new_kata = 2;
514                         break;
515                 }
516                 else if (((choice == 'e') || (choice == 'E')) && (p_ptr->lev > 39))
517                 {
518                         new_kata = 3;
519                         break;
520                 }
521         }
522         set_action(ACTION_KATA);
523
524         if (p_ptr->special_defense & (KATA_IAI << new_kata))
525         {
526                 msg_print(_("構え直した。", "You reassume a posture."));
527         }
528         else
529         {
530                 p_ptr->special_defense &= ~(KATA_MASK);
531                 p_ptr->update |= (PU_BONUS);
532                 p_ptr->update |= (PU_MONSTERS);
533                 msg_format(_("%sの型で構えた。", "You assume a posture of %s form."),kata_shurui[new_kata].desc);
534                 p_ptr->special_defense |= (KATA_IAI << new_kata);
535         }
536         p_ptr->redraw |= (PR_STATE);
537         p_ptr->redraw |= (PR_STATUS);
538         screen_load();
539         return TRUE;
540 }
541
542
543 /*!
544  * @brief レイシャル・パワー情報のtypedef
545  */
546 typedef struct power_desc_type power_desc_type;
547
548 /*!
549  * @brief レイシャル・パワー情報の構造体定義
550  */
551 struct power_desc_type
552 {
553         GAME_TEXT name[MAX_NLEN];      //!<レイシャル名
554         PLAYER_LEVEL level;     //!<体得レベル
555         int cost;
556         int stat;
557         int fail;
558         int number;
559 };
560
561
562 /*!
563  * @brief レイシャル・パワーの発動成功率を計算する / Returns the chance to activate a racial power/mutation
564  * @param pd_ptr 発動したいレイシャル・パワー情報の構造体参照ポインタ
565  * @return 成功率(%)を返す
566  */
567 static PERCENTAGE racial_chance(power_desc_type *pd_ptr)
568 {
569         PLAYER_LEVEL min_level  = pd_ptr->level;
570         int difficulty = pd_ptr->fail;
571
572         int i;
573         int val;
574         int sum = 0;
575         int stat = p_ptr->stat_cur[pd_ptr->stat];
576
577         /* No chance for success */
578         if ((p_ptr->lev < min_level) || p_ptr->confused)
579         {
580                 return (0);
581         }
582
583         if (difficulty == 0) return 100;
584
585         /* Calculate difficulty */
586         if (p_ptr->stun)
587         {
588                 difficulty += p_ptr->stun;
589         }
590         else if (p_ptr->lev > min_level)
591         {
592                 int lev_adj = ((p_ptr->lev - min_level) / 3);
593                 if (lev_adj > 10) lev_adj = 10;
594                 difficulty -= lev_adj;
595         }
596
597         if (difficulty < 5) difficulty = 5;
598
599         /* We only need halfs of the difficulty */
600         difficulty = difficulty / 2;
601
602         for (i = 1; i <= stat; i++)
603         {
604                 val = i - difficulty;
605                 if (val > 0)
606                         sum += (val <= difficulty) ? val : difficulty;
607         }
608
609         if (difficulty == 0)
610                 return (100);
611         else
612                 return (((sum * 100) / difficulty) / stat);
613 }
614
615
616 static int  racial_cost;
617
618 /*!
619  * @brief レイシャル・パワーの発動の判定処理
620  * @param pd_ptr 発動したいレイシャル・パワー情報の構造体参照ポインタ
621  * @return
622  * 発動成功ならば1、発動失敗ならば-1、キャンセルならば0を返す。
623  * return value indicates that we have succesfully used the power 1: Succeeded, 0: Cancelled, -1: Failed
624  */
625 static int racial_aux(power_desc_type *pd_ptr)
626 {
627         PLAYER_LEVEL min_level  = pd_ptr->level;
628         int  use_stat   = pd_ptr->stat;
629         int  difficulty = pd_ptr->fail;
630         int  use_hp = 0;
631
632         racial_cost = pd_ptr->cost;
633
634         /* Not enough mana - use hp */
635         if (p_ptr->csp < racial_cost) use_hp = racial_cost - p_ptr->csp;
636
637         /* Power is not available yet */
638         if (p_ptr->lev < min_level)
639         {
640                 msg_format(_("この能力を使用するにはレベル %d に達していなければなりません。", 
641                                          "You need to attain level %d to use this power."), min_level);
642
643                 p_ptr->energy_use = 0;
644                 return 0;
645         }
646
647         /* Too confused */
648         else if (p_ptr->confused)
649         {
650                 msg_print(_("混乱していてその能力は使えない。", "You are too confused to use this power."));
651                 p_ptr->energy_use = 0;
652                 return 0;
653         }
654
655         /* Risk death? */
656         else if (p_ptr->chp < use_hp)
657         {
658                 if (!get_check(_("本当に今の衰弱した状態でこの能力を使いますか?", "Really use the power in your weakened state? ")))
659                 {
660                         p_ptr->energy_use = 0;
661                         return 0;
662                 }
663         }
664
665         /* Else attempt to do it! */
666
667         if (difficulty)
668         {
669                 if (p_ptr->stun)
670                 {
671                         difficulty += p_ptr->stun;
672                 }
673                 else if (p_ptr->lev > min_level)
674                 {
675                         int lev_adj = ((p_ptr->lev - min_level) / 3);
676                         if (lev_adj > 10) lev_adj = 10;
677                         difficulty -= lev_adj;
678                 }
679
680                 if (difficulty < 5) difficulty = 5;
681         }
682
683         /* take time and pay the price */
684         p_ptr->energy_use = 100;
685
686         /* Success? */
687         if (randint1(p_ptr->stat_cur[use_stat]) >= ((difficulty / 2) + randint1(difficulty / 2)))
688         {
689                 return 1;
690         }
691
692         if (flush_failure) flush();
693         msg_print(_("充分に集中できなかった。", "You've failed to concentrate hard enough."));
694
695         return -1;
696 }
697
698
699 /*!
700  * @brief レイシャル・パワー発動処理
701  * @param command 発動するレイシャルのID
702  * @return 処理を実際に実行した場合はTRUE、キャンセルした場合FALSEを返す。
703  */
704 static bool cmd_racial_power_aux(s32b command)
705 {
706         PLAYER_LEVEL plev = p_ptr->lev;
707         DIRECTION dir = 0;
708
709         if (command <= -3)
710         {
711                 switch (p_ptr->pclass)
712                 {
713                 case CLASS_WARRIOR:
714                 {
715                         POSITION y = 0, x = 0;
716                         int i;
717                         cave_type *c_ptr;
718
719                         for (i = 0; i < A_MAX; i++)
720                         {
721                                 dir = randint0(8);
722                                 y = p_ptr->y + ddy_ddd[dir];
723                                 x = p_ptr->x + ddx_ddd[dir];
724                                 c_ptr = &cave[y][x];
725
726                                 /* Hack -- attack monsters */
727                                 if (c_ptr->m_idx)
728                                         py_attack(y, x, 0);
729                                 else
730                                 {
731                                         msg_print(_("攻撃が空をきった。", "You attack the empty air."));
732                                 }
733                         }
734                         break;
735                 }
736                 case CLASS_HIGH_MAGE:
737                 if (p_ptr->realm1 == REALM_HEX)
738                 {
739                         bool retval = stop_hex_spell();
740                         if (retval) p_ptr->energy_use = 10;
741                         return (retval);
742                 }
743                 case CLASS_MAGE:
744                 /* case CLASS_HIGH_MAGE: */
745                 case CLASS_SORCERER:
746                 {
747                         if (!eat_magic(p_ptr->lev * 2)) return FALSE;
748                         break;
749                 }
750                 case CLASS_PRIEST:
751                 {
752                         if (is_good_realm(p_ptr->realm1))
753                         {
754                                 if (!bless_weapon()) return FALSE;
755                         }
756                         else
757                         {
758                                 (void)dispel_monsters(plev * 4);
759                                 turn_monsters(plev * 4);
760                                 banish_monsters(plev * 4);
761                         }
762                         break;
763                 }
764                 case CLASS_ROGUE:
765                 {
766                         if(!panic_hit()) return FALSE;
767                         break;
768                 }
769                 case CLASS_RANGER:
770                 case CLASS_SNIPER:
771                 {
772                         msg_print(_("敵を調査した...", "You examine your foes..."));
773                         probing();
774                         break;
775                 }
776                 case CLASS_PALADIN:
777                 {
778                         if (!get_aim_dir(&dir)) return FALSE;
779                         fire_beam(is_good_realm(p_ptr->realm1) ? GF_HOLY_FIRE : GF_HELL_FIRE,
780                                   dir, plev * 3);
781                         break;
782                 }
783                 case CLASS_WARRIOR_MAGE:
784                 {
785                         if (command == -3)
786                         {
787                                 int gain_sp = take_hit(DAMAGE_USELIFE, p_ptr->lev, _("HPからMPへの無謀な変換", "thoughtless convertion from HP to SP"), -1) / 5;
788                                 if (gain_sp)
789                                 {
790                                         p_ptr->csp += gain_sp;
791                                         if (p_ptr->csp > p_ptr->msp)
792                                         {
793                                                 p_ptr->csp = p_ptr->msp;
794                                                 p_ptr->csp_frac = 0;
795                                         }
796                                 }
797                                 else
798                                 {
799                                         msg_print(_("変換に失敗した。", "You failed to convert."));
800                                 }
801                         }
802                         else if (command == -4)
803                         {
804                                 if (p_ptr->csp >= p_ptr->lev / 5)
805                                 {
806                                         p_ptr->csp -= p_ptr->lev / 5;
807                                         hp_player(p_ptr->lev);
808                                 }
809                                 else
810                                 {
811                                         msg_print(_("変換に失敗した。", "You failed to convert."));
812                                 }
813                         }
814
815                         /* Redraw mana and hp */
816                         p_ptr->redraw |= (PR_HP | PR_MANA);
817
818                         break;
819                 }
820                 case CLASS_CHAOS_WARRIOR:
821                 {
822                         msg_print(_("辺りを睨んだ...", "You glare nearby monsters..."));
823                         slow_monsters(p_ptr->lev);
824                         stun_monsters(p_ptr->lev * 4);
825                         confuse_monsters(p_ptr->lev * 4);
826                         turn_monsters(p_ptr->lev * 4);
827                         stasis_monsters(p_ptr->lev * 4);
828                         break;
829                 }
830                 case CLASS_MONK:
831                 {
832                         if (!(empty_hands(TRUE) & EMPTY_HAND_RARM))
833                         {
834                                 msg_print(_("素手じゃないとできません。", "You need to be bare hand."));
835                                 return FALSE;
836                         }
837                         if (p_ptr->riding)
838                         {
839                                 msg_print(_("乗馬中はできません。", "You need to get off a pet."));
840                                 return FALSE;
841                         }
842
843                         if (command == -3)
844                         {
845                                 if (!choose_kamae()) return FALSE;
846                                 p_ptr->update |= (PU_BONUS);
847                         }
848                         else if (command == -4)
849                         {
850                                 POSITION x, y;
851
852                                 if (!get_rep_dir(&dir, FALSE)) return FALSE;
853                                 y = p_ptr->y + ddy[dir];
854                                 x = p_ptr->x + ddx[dir];
855                                 if (cave[y][x].m_idx)
856                                 {
857                                         if (one_in_(2)) 
858                                                 msg_print(_("あーたたたたたたたたたたたたたたたたたたたたたた!!!", 
859                                                                         "Ahhhtatatatatatatatatatatatatatataatatatatattaaaaa!!!!"));
860                                         else
861                                                 msg_print(_("オラオラオラオラオラオラオラオラオラオラオラオラ!!!",
862                                                                         "Oraoraoraoraoraoraoraoraoraoraoraoraoraoraoraoraora!!!!"));
863
864                                         py_attack(y, x, 0);
865                                         if (cave[y][x].m_idx)
866                                         {
867                                                 handle_stuff();
868                                                 py_attack(y, x, 0);
869                                         }
870                                         p_ptr->energy_need += ENERGY_NEED();
871                                 }
872                                 else
873                                 {
874                                         msg_print(_("その方向にはモンスターはいません。", "You don't see any monster in this direction"));
875                                         msg_print(NULL);
876                                 }
877                         }
878                         break;
879                 }
880                 case CLASS_MINDCRAFTER:
881                 case CLASS_FORCETRAINER:
882                 {
883                         if (total_friends)
884                         {
885                                 msg_print(_("今はペットを操ることに集中していないと。", "You need concentration on the pets now."));
886                                 return FALSE;
887                         }
888                         msg_print(_("少し頭がハッキリした。", "You feel your head clear a little."));
889
890                         p_ptr->csp += (3 + p_ptr->lev/20);
891                         if (p_ptr->csp >= p_ptr->msp)
892                         {
893                                 p_ptr->csp = p_ptr->msp;
894                                 p_ptr->csp_frac = 0;
895                         }
896                         p_ptr->redraw |= (PR_MANA);
897                         break;
898                 }
899                 case CLASS_TOURIST:
900                 {
901                         if (command == -3)
902                         {
903                                 if (!get_aim_dir(&dir)) return FALSE;
904                                 project_length = 1;
905                                 fire_beam(GF_PHOTO, dir, 1);
906                         }
907                         else if (command == -4)
908                         {
909                                 if (!identify_fully(FALSE)) return FALSE;
910                         }
911                         break;
912                 }
913                 case CLASS_IMITATOR:
914                 {
915                         handle_stuff();
916                         if (!do_cmd_mane(TRUE)) return FALSE;
917                         break;
918                 }
919                 case CLASS_BEASTMASTER:
920                 {
921                         if (command == -3)
922                         {
923                                 if (!get_aim_dir(&dir)) return FALSE;
924                                 (void)fire_ball_hide(GF_CHARM_LIVING, dir, p_ptr->lev, 0);
925                         }
926                         else if (command == -4)
927                         {
928                                 project_all_los(GF_CHARM_LIVING, p_ptr->lev);
929                         }
930                         break;
931                 }
932                 case CLASS_ARCHER:
933                 {
934                         if (!do_cmd_archer()) return FALSE;
935                         break;
936                 }
937                 case CLASS_MAGIC_EATER:
938                 {
939                         if (command == -3) {
940                                 if (!gain_magic()) return FALSE;
941                         } else if (command == -4) {
942                                 if (!can_do_cmd_cast()) return FALSE;
943                                 if (!do_cmd_magic_eater(FALSE, TRUE)) return FALSE;
944                         }
945                         break;
946                 }
947                 case CLASS_BARD:
948                 {
949                         /* Singing is already stopped */
950                         if (!SINGING_SONG_EFFECT(p_ptr) && !INTERUPTING_SONG_EFFECT(p_ptr)) return FALSE;
951
952                         stop_singing();
953                         p_ptr->energy_use = 10;
954                         break;
955                 }
956                 case CLASS_RED_MAGE:
957                 {
958                         if (!can_do_cmd_cast()) return FALSE;
959                         handle_stuff();
960                         do_cmd_cast();
961                         handle_stuff();
962                         if (!p_ptr->paralyzed && can_do_cmd_cast())
963                                 do_cmd_cast();
964                         break;
965                 }
966                 case CLASS_SAMURAI:
967                 {
968                         if (command == -3)
969                         {
970                                 int max_csp = MAX(p_ptr->msp*4, p_ptr->lev*5+5);
971
972                                 if (total_friends)
973                                 {
974                                         msg_print(_("今はペットを操ることに集中していないと。", "You need concentration on the pets now."));
975                                         return FALSE;
976                                 }
977                                 if (p_ptr->special_defense & KATA_MASK)
978                                 {
979                                         msg_print(_("今は構えに集中している。", "You need concentration on your form."));
980                                         return FALSE;
981                                 }
982                                 msg_print(_("精神を集中して気合いを溜めた。", "You concentrate to charge your power."));
983
984                                 p_ptr->csp += p_ptr->msp / 2;
985                                 if (p_ptr->csp >= max_csp)
986                                 {
987                                         p_ptr->csp = max_csp;
988                                         p_ptr->csp_frac = 0;
989                                 }
990                                 p_ptr->redraw |= (PR_MANA);
991                         }
992                         else if (command == -4)
993                         {
994                                 if (!buki_motteruka(INVEN_RARM) && !buki_motteruka(INVEN_LARM))
995                                 {
996                                         msg_print(_("武器を持たないといけません。", "You need to wield a weapon."));
997                                         return FALSE;
998                                 }
999                                 if (!choose_kata()) return FALSE;
1000                                 p_ptr->update |= (PU_BONUS);
1001                         }
1002                         break;
1003                 }
1004                 case CLASS_BLUE_MAGE:
1005                 {
1006                         if (p_ptr->action == ACTION_LEARN)
1007                         {
1008                                 set_action(ACTION_NONE);
1009                         }
1010                         else
1011                         {
1012                                 set_action(ACTION_LEARN);
1013                         }
1014                         p_ptr->energy_use = 0;
1015                         break;
1016                 }
1017                 case CLASS_CAVALRY:
1018                 {
1019                         GAME_TEXT m_name[MAX_NLEN];
1020                         monster_type *m_ptr;
1021                         monster_race *r_ptr;
1022                         int rlev;
1023
1024                         if (p_ptr->riding)
1025                         {
1026                                 msg_print(_("今は乗馬中だ。", "You ARE riding."));
1027                                 return FALSE;
1028                         }
1029                         if (!do_riding(TRUE)) return TRUE;
1030                         m_ptr = &m_list[p_ptr->riding];
1031                         r_ptr = &r_info[m_ptr->r_idx];
1032                         monster_desc(m_name, m_ptr, 0);
1033                         msg_format(_("%sに乗った。", "You ride on %s."),m_name);
1034                         if (is_pet(m_ptr)) break;
1035                         rlev = r_ptr->level;
1036                         if (r_ptr->flags1 & RF1_UNIQUE) rlev = rlev * 3 / 2;
1037                         if (rlev > 60) rlev = 60+(rlev-60)/2;
1038                         if ((randint1(p_ptr->skill_exp[GINOU_RIDING] / 120 + p_ptr->lev * 2 / 3) > rlev)
1039                             && one_in_(2) && !p_ptr->inside_arena && !p_ptr->inside_battle
1040                             && !(r_ptr->flags7 & (RF7_GUARDIAN)) && !(r_ptr->flags1 & (RF1_QUESTOR))
1041                             && (rlev < p_ptr->lev * 3 / 2 + randint0(p_ptr->lev / 5)))
1042                         {
1043                                 msg_format(_("%sを手なずけた。", "You tame %s."),m_name);
1044                                 set_pet(m_ptr);
1045                         }
1046                         else
1047                         {
1048                                 msg_format(_("%sに振り落とされた!", "You have thrown off by %s."),m_name);
1049                                 rakuba(1,TRUE);
1050
1051                                 /* Paranoia */
1052                                 /* 落馬処理に失敗してもとにかく乗馬解除 */
1053                                 p_ptr->riding = 0;
1054                         }
1055                         break;
1056                 }
1057                 case CLASS_BERSERKER:
1058                 {
1059                         if (!recall_player(p_ptr, randint0(21) + 15)) return FALSE;
1060                         break;
1061                 }
1062                 case CLASS_SMITH:
1063                 {
1064                         if (p_ptr->lev > 29)
1065                         {
1066                                 if (!identify_fully(TRUE)) return FALSE;
1067                         }
1068                         else
1069                         {
1070                                 if (!ident_spell(TRUE)) return FALSE;
1071                         }
1072                         break;
1073                 }
1074                 case CLASS_MIRROR_MASTER:
1075                 {
1076                         if (command == -3)
1077                         {
1078                                 /* Explode all mirrors */
1079                                 remove_all_mirrors(TRUE);
1080                         }
1081                         else if (command == -4)
1082                         {
1083                                 if (total_friends)
1084                                 {
1085                                         msg_print(_("今はペットを操ることに集中していないと。", "You need concentration on the pets now."));
1086                                         return FALSE;
1087                                 }
1088                                 if (is_mirror_grid(&cave[p_ptr->y][p_ptr->x]))
1089                                 {
1090                                         msg_print(_("少し頭がハッキリした。", "You feel your head clear a little."));
1091
1092                                         p_ptr->csp += (5 + p_ptr->lev * p_ptr->lev / 100);
1093                                         if (p_ptr->csp >= p_ptr->msp)
1094                                         {
1095                                                 p_ptr->csp = p_ptr->msp;
1096                                                 p_ptr->csp_frac = 0;
1097                                         }
1098                                         p_ptr->redraw |= (PR_MANA);
1099                                 }
1100                                 else
1101                                 {
1102                                         msg_print(_("鏡の上でないと集中できない!", "Here are not any mirrors!"));
1103                                 }
1104                         }
1105                         break;
1106                 }
1107                 case CLASS_NINJA:
1108                 {
1109                         if (p_ptr->action == ACTION_HAYAGAKE)
1110                         {
1111                                 set_action(ACTION_NONE);
1112                         }
1113                         else
1114                         {
1115                                 cave_type *c_ptr = &cave[p_ptr->y][p_ptr->x];
1116                                 feature_type *f_ptr = &f_info[c_ptr->feat];
1117
1118                                 if (!have_flag(f_ptr->flags, FF_PROJECT) ||
1119                                     (!p_ptr->levitation && have_flag(f_ptr->flags, FF_DEEP)))
1120                                 {
1121                                         msg_print(_("ここでは素早く動けない。", "You cannot run in here."));
1122                                 }
1123                                 else
1124                                 {
1125                                         set_action(ACTION_HAYAGAKE);
1126                                 }
1127                         }
1128
1129
1130                         p_ptr->energy_use = 0;
1131                         break;
1132                 }
1133
1134                 }
1135         }
1136         else if (p_ptr->mimic_form)
1137         {
1138                 switch (p_ptr->mimic_form)
1139                 {
1140                 case MIMIC_DEMON:
1141                 case MIMIC_DEMON_LORD:
1142                 {
1143                         int type = (one_in_(2) ? GF_NETHER : GF_FIRE);
1144                         if (!get_aim_dir(&dir)) return FALSE;
1145                         stop_mouth();
1146                         msg_format(_("あなたは%sのブレスを吐いた。", "You breathe %s."),((type == GF_NETHER) ? _("地獄", "nether") : _("火炎", "fire")));
1147                         fire_breath(type, dir, plev * 3, (plev / 15) + 1);
1148                         break;
1149                 }
1150                 case MIMIC_VAMPIRE:
1151                         vampirism();
1152                         break;
1153                 }
1154         }
1155
1156         else 
1157         {
1158
1159         switch (p_ptr->prace)
1160         {
1161                 case RACE_DWARF:
1162                         msg_print(_("周囲を調べた。", "You examine your surroundings."));
1163                         (void)detect_traps(DETECT_RAD_DEFAULT, TRUE);
1164                         (void)detect_doors(DETECT_RAD_DEFAULT);
1165                         (void)detect_stairs(DETECT_RAD_DEFAULT);
1166                         break;
1167
1168                 case RACE_HOBBIT:
1169                         {
1170                                 object_type *q_ptr;
1171                                 object_type forge;
1172                                 q_ptr = &forge;
1173
1174                                 /* Create the food ration */
1175                                 object_prep(q_ptr, lookup_kind(TV_FOOD, SV_FOOD_RATION));
1176
1177                                 /* Drop the object from heaven */
1178                                 (void)drop_near(q_ptr, -1, p_ptr->y, p_ptr->x);
1179                                 msg_print(_("食事を料理して作った。", "You cook some food."));
1180                         }
1181                         break;
1182
1183                 case RACE_GNOME:
1184                         msg_print(_("パッ!", "Blink!"));
1185                         teleport_player(10, 0L);
1186                         break;
1187
1188                 case RACE_HALF_ORC:
1189                         msg_print(_("勇気を出した。", "You play tough."));
1190                         (void)set_afraid(0);
1191                         break;
1192
1193                 case RACE_HALF_TROLL:
1194                         msg_print(_("うがぁぁ!", "RAAAGH!"));
1195                         (void)berserk(10 + randint1(plev));
1196                         break;
1197
1198                 case RACE_AMBERITE:
1199                         if (command == -1)
1200                         {
1201                                 msg_print(_("あなたは歩き周り始めた。", "You start walking around. "));
1202                                 alter_reality();
1203                         }
1204                         else if (command == -2)
1205                         {
1206                                 msg_print(_("あなたは「パターン」を心に描いてその上を歩いた...", "You picture the Pattern in your mind and walk it..."));
1207
1208                                 (void)true_healing(0);
1209                                 (void)restore_all_status();
1210                                 (void)restore_level();
1211                         }
1212                         break;
1213
1214                 case RACE_BARBARIAN:
1215                         msg_print(_("うぉぉおお!", "Raaagh!"));
1216                         (void)berserk(10 + randint1(plev));
1217                         break;
1218
1219                 case RACE_HALF_OGRE:
1220                         msg_print(_("爆発のルーンを慎重に仕掛けた...", "You carefully set an explosive rune..."));
1221                         explosive_rune();
1222                         break;
1223
1224                 case RACE_HALF_GIANT:
1225                         if (!get_aim_dir(&dir)) return FALSE;
1226                         (void)wall_to_mud(dir, 20 + randint1(30));
1227                         break;
1228
1229                 case RACE_HALF_TITAN:
1230                         msg_print(_("敵を調査した...", "You examine your foes..."));
1231                         probing();
1232                         break;
1233
1234                 case RACE_CYCLOPS:
1235                         if (!get_aim_dir(&dir)) return FALSE;
1236                         msg_print(_("巨大な岩を投げた。", "You throw a huge boulder."));
1237                         fire_bolt(GF_MISSILE, dir, (3 * plev) / 2);
1238                         break;
1239
1240                 case RACE_YEEK:
1241                         if (!get_aim_dir(&dir)) return FALSE;
1242                         stop_mouth();
1243                         msg_print(_("身の毛もよだつ叫び声を上げた!", "You make a horrible scream!"));
1244                         (void)fear_monster(dir, plev);
1245                         break;
1246
1247                 case RACE_KLACKON:
1248                         if (!get_aim_dir(&dir)) return FALSE;
1249                         stop_mouth();
1250                         msg_print(_("酸を吐いた。", "You spit acid."));
1251                         if (plev < 25) fire_bolt(GF_ACID, dir, plev);
1252                         else fire_ball(GF_ACID, dir, plev, 2);
1253                         break;
1254
1255                 case RACE_KOBOLD:
1256                         if (!get_aim_dir(&dir)) return FALSE;
1257                         msg_print(_("毒のダーツを投げた。", "You throw a dart of poison."));
1258                         fire_bolt(GF_POIS, dir, plev);
1259                         break;
1260
1261                 case RACE_NIBELUNG:
1262                         msg_print(_("周囲を調査した。", "You examine your surroundings."));
1263                         (void)detect_traps(DETECT_RAD_DEFAULT, TRUE);
1264                         (void)detect_doors(DETECT_RAD_DEFAULT);
1265                         (void)detect_stairs(DETECT_RAD_DEFAULT);
1266                         break;
1267
1268                 case RACE_DARK_ELF:
1269                         if (!get_aim_dir(&dir)) return FALSE;
1270                         msg_print(_("マジック・ミサイルを放った。", "You cast a magic missile."));
1271                         fire_bolt_or_beam(10, GF_MISSILE, dir,
1272                             damroll(3 + ((plev - 1) / 5), 4));
1273                         break;
1274
1275                 case RACE_DRACONIAN:
1276                         {
1277                                 int Type = (one_in_(3) ? GF_COLD : GF_FIRE);
1278                                 concptr Type_desc = ((Type == GF_COLD) ? _("冷気", "cold") : _("炎", "fire"));
1279
1280                                 if (!get_aim_dir(&dir)) return FALSE;
1281
1282                                 if (randint1(100) < plev)
1283                                 {
1284                                         switch (p_ptr->pclass)
1285                                         {
1286                                                 case CLASS_WARRIOR:
1287                                                 case CLASS_BERSERKER:
1288                                                 case CLASS_RANGER:
1289                                                 case CLASS_TOURIST:
1290                                                 case CLASS_IMITATOR:
1291                                                 case CLASS_ARCHER:
1292                                                 case CLASS_SMITH:
1293                                                         if (one_in_(3))
1294                                                         {
1295                                                                 Type = GF_MISSILE;
1296                                                                 Type_desc = _("エレメント", "the elements");
1297                                                         }
1298                                                         else
1299                                                         {
1300                                                                 Type = GF_SHARDS;
1301                                                                 Type_desc = _("破片", "shards");
1302                                                         }
1303                                                         break;
1304                                                 case CLASS_MAGE:
1305                                                 case CLASS_WARRIOR_MAGE:
1306                                                 case CLASS_HIGH_MAGE:
1307                                                 case CLASS_SORCERER:
1308                                                 case CLASS_MAGIC_EATER:
1309                                                 case CLASS_RED_MAGE:
1310                                                 case CLASS_BLUE_MAGE:
1311                                                 case CLASS_MIRROR_MASTER:
1312                                                         if (one_in_(3))
1313                                                         {
1314                                                                 Type = GF_MANA;
1315                                                                 Type_desc = _("魔力", "mana");
1316                                                         }
1317                                                         else
1318                                                         {
1319                                                                 Type = GF_DISENCHANT;
1320                                                                 Type_desc = _("劣化", "disenchantment");
1321                                                         }
1322                                                         break;
1323                                                 case CLASS_CHAOS_WARRIOR:
1324                                                         if (!one_in_(3))
1325                                                         {
1326                                                                 Type = GF_CONFUSION;
1327                                                                 Type_desc = _("混乱", "confusion");
1328                                                         }
1329                                                         else
1330                                                         {
1331                                                                 Type = GF_CHAOS;
1332                                                                 Type_desc = _("カオス", "chaos");
1333                                                         }
1334                                                         break;
1335                                                 case CLASS_MONK:
1336                                                 case CLASS_SAMURAI:
1337                                                 case CLASS_FORCETRAINER:
1338                                                         if (!one_in_(3))
1339                                                         {
1340                                                                 Type = GF_CONFUSION;
1341                                                                 Type_desc = _("混乱", "confusion");
1342                                                         }
1343                                                         else
1344                                                         {
1345                                                                 Type = GF_SOUND;
1346                                                                 Type_desc = _("轟音", "sound");
1347                                                         }
1348                                                         break;
1349                                                 case CLASS_MINDCRAFTER:
1350                                                         if (!one_in_(3))
1351                                                         {
1352                                                                 Type = GF_CONFUSION;
1353                                                                 Type_desc = _("混乱", "confusion");
1354                                                         }
1355                                                         else
1356                                                         {
1357                                                                 Type = GF_PSI;
1358                                                                 Type_desc = _("精神エネルギー", "mental energy");
1359                                                         }
1360                                                         break;
1361                                                 case CLASS_PRIEST:
1362                                                 case CLASS_PALADIN:
1363                                                         if (one_in_(3))
1364                                                         {
1365                                                                 Type = GF_HELL_FIRE;
1366                                                                 Type_desc = _("地獄の劫火", "hellfire");
1367                                                         }
1368                                                         else
1369                                                         {
1370                                                                 Type = GF_HOLY_FIRE;
1371                                                                 Type_desc = _("聖なる炎", "holy fire");
1372                                                         }
1373                                                         break;
1374                                                 case CLASS_ROGUE:
1375                                                 case CLASS_NINJA:
1376                                                         if (one_in_(3))
1377                                                         {
1378                                                                 Type = GF_DARK;
1379                                                                 Type_desc = _("暗黒", "darkness");
1380                                                         }
1381                                                         else
1382                                                         {
1383                                                                 Type = GF_POIS;
1384                                                                 Type_desc = _("毒", "poison");
1385                                                         }
1386                                                         break;
1387                                                 case CLASS_BARD:
1388                                                         if (!one_in_(3))
1389                                                         {
1390                                                                 Type = GF_SOUND;
1391                                                                 Type_desc = _("轟音", "sound");
1392                                                         }
1393                                                         else
1394                                                         {
1395                                                                 Type = GF_CONFUSION;
1396                                                                 Type_desc = _("混乱", "confusion");
1397                                                         }
1398                                                         break;
1399                                         }
1400                                 }
1401
1402                                 stop_mouth();
1403                                 msg_format(_("あなたは%sのブレスを吐いた。", "You breathe %s."), Type_desc);
1404
1405                                 fire_breath(Type, dir, plev * 2, (plev / 15) + 1);
1406                         }
1407                         break;
1408
1409                 case RACE_MIND_FLAYER:
1410                         if (!get_aim_dir(&dir)) return FALSE;
1411                         msg_print(_("あなたは集中し、目が赤く輝いた...", "You concentrate and your eyes glow red..."));
1412                         fire_bolt(GF_PSI, dir, plev);
1413                         break;
1414
1415                 case RACE_IMP:
1416                         if (!get_aim_dir(&dir)) return FALSE;
1417                         if (plev >= 30)
1418                         {
1419                                 msg_print(_("ファイア・ボールを放った。", "You cast a ball of fire."));
1420                                 fire_ball(GF_FIRE, dir, plev, 2);
1421                         }
1422                         else
1423                         {
1424                                 msg_print(_("ファイア・ボルトを放った。", "You cast a bolt of fire."));
1425                                 fire_bolt(GF_FIRE, dir, plev);
1426                         }
1427                         break;
1428
1429                 case RACE_GOLEM:
1430                         (void)set_shield(randint1(20) + 30, FALSE);
1431                         break;
1432
1433                 case RACE_SKELETON:
1434                 case RACE_ZOMBIE:
1435                         msg_print(_("あなたは失ったエネルギーを取り戻そうと試みた。", "You attempt to restore your lost energies."));
1436                         (void)restore_level();
1437                         break;
1438
1439                 case RACE_VAMPIRE:
1440                         vampirism();
1441                         break;
1442
1443                 case RACE_SPECTRE:
1444                         if (!get_aim_dir(&dir)) return FALSE;
1445                         stop_mouth();
1446                         msg_print(_("あなたはおどろおどろしい叫び声をあげた!", "You emit an eldritch howl!"));
1447                         (void)fear_monster(dir, plev);
1448                         break;
1449
1450                 case RACE_SPRITE:
1451                         msg_print(_("あなたは魔法の粉を投げつけた...", "You throw some magic dust..."));
1452                         if (plev < 25) sleep_monsters_touch();
1453                         else (void)sleep_monsters(plev);
1454                         break;
1455
1456                 case RACE_DEMON:
1457                         {
1458                                 int type = (one_in_(2) ? GF_NETHER : GF_FIRE);
1459                                 if (!get_aim_dir(&dir)) return FALSE;
1460                                 stop_mouth();
1461                                 msg_format(_("あなたは%sのブレスを吐いた。", "You breathe %s."),((type == GF_NETHER) ? _("地獄", "nether") : _("火炎", "fire")));
1462                                 fire_breath(type, dir, plev * 3, (plev / 15) + 1);
1463                         }
1464                         break;
1465
1466                 case RACE_KUTAR:
1467                         (void)set_tsubureru(randint1(20) + 30, FALSE);
1468                         break;
1469
1470                 case RACE_ANDROID:
1471                         if (!get_aim_dir(&dir)) return FALSE;
1472                         if (plev < 10)
1473                         {
1474                                 msg_print(_("レイガンを発射した。", "You fire your ray gun."));
1475                                 fire_bolt(GF_MISSILE, dir, (plev+1) / 2);
1476                         }
1477                         else if (plev < 25)
1478                         {
1479                                 msg_print(_("ブラスターを発射した。", "You fire your blaster."));
1480                                 fire_bolt(GF_MISSILE, dir, plev);
1481                         }
1482                         else if (plev < 35)
1483                         {
1484                                 msg_print(_("バズーカを発射した。", "You fire your bazooka."));
1485                                 fire_ball(GF_MISSILE, dir, plev * 2, 2);
1486                         }
1487                         else if (plev < 45)
1488                         {
1489                                 msg_print(_("ビームキャノンを発射した。", "You fire a beam cannon."));
1490                                 fire_beam(GF_MISSILE, dir, plev * 2);
1491                         }
1492                         else
1493                         {
1494                                 msg_print(_("ロケットを発射した。", "You fire a rocket."));
1495                                 fire_rocket(GF_ROCKET, dir, plev * 5, 2);
1496                         }
1497                         break;
1498
1499                 default:
1500                         msg_print(_("この種族は特殊な能力を持っていません。", "This race has no bonus power."));
1501                         p_ptr->energy_use = 0;
1502         }
1503         }
1504         return TRUE;
1505 }
1506
1507 /*!
1508  * @brief レイシャル・パワーコマンドのメインルーチン / Allow user to choose a power (racial / mutation) to activate
1509  * @return なし
1510  */
1511 void do_cmd_racial_power(void)
1512 {
1513         power_desc_type power_desc[36];
1514         int num;
1515         COMMAND_CODE i = 0;
1516         int ask = TRUE;
1517         PLAYER_LEVEL lvl = p_ptr->lev;
1518         bool            flag, redraw, cast = FALSE;
1519         bool            warrior = ((p_ptr->pclass == CLASS_WARRIOR || p_ptr->pclass == CLASS_BERSERKER) ? TRUE : FALSE);
1520         char            choice;
1521         char            out_val[160];
1522         int menu_line = (use_menu ? 1 : 0);
1523
1524         if (p_ptr->wild_mode) return;
1525
1526         for (num = 0; num < 36; num++)
1527         {
1528                 strcpy(power_desc[num].name, "");
1529                 power_desc[num].number = 0;
1530         }
1531
1532         num = 0;
1533
1534         if (p_ptr->confused)
1535         {
1536                 msg_print(_("混乱していて特殊能力を使えません!", "You are too confused to use any powers!"));
1537                 p_ptr->energy_use = 0;
1538                 return;
1539         }
1540
1541         if (p_ptr->special_defense & (KATA_MUSOU | KATA_KOUKIJIN))
1542         {
1543                 set_action(ACTION_NONE);
1544         }
1545
1546         switch (p_ptr->pclass)
1547         {
1548         case CLASS_WARRIOR:
1549         {
1550                 strcpy(power_desc[num].name, _("剣の舞い", "Sword Dancing"));
1551                 power_desc[num].level = 40;
1552                 power_desc[num].cost = 75;
1553                 power_desc[num].stat = A_DEX;
1554                 power_desc[num].fail = 35;
1555                 power_desc[num++].number = -3;
1556                 break;
1557         }
1558         case CLASS_HIGH_MAGE:
1559         if (p_ptr->realm1 == REALM_HEX)
1560         {
1561                 strcpy(power_desc[num].name, _("詠唱をやめる", "Stop spelling"));
1562                 power_desc[num].level = 1;
1563                 power_desc[num].cost = 0;
1564                 power_desc[num].stat = A_INT;
1565                 power_desc[num].fail = 0;
1566                 power_desc[num++].number = -3;
1567                 break;
1568         }
1569         case CLASS_MAGE:
1570         /* case CLASS_HIGH_MAGE: */
1571         case CLASS_SORCERER:
1572         {
1573                 strcpy(power_desc[num].name, _("魔力食い", "Eat Magic"));
1574                 power_desc[num].level = 25;
1575                 power_desc[num].cost = 1;
1576                 power_desc[num].stat = A_INT;
1577                 power_desc[num].fail = 25;
1578                 power_desc[num++].number = -3;
1579                 break;
1580         }
1581         case CLASS_PRIEST:
1582         {
1583                 if (is_good_realm(p_ptr->realm1))
1584                 {
1585                         strcpy(power_desc[num].name, _("武器祝福", "Bless Weapon"));
1586                         power_desc[num].level = 35;
1587                         power_desc[num].cost = 70;
1588                         power_desc[num].stat = A_WIS;
1589                         power_desc[num].fail = 50;
1590                         power_desc[num++].number = -3;
1591                 }
1592                 else
1593                 {
1594                         strcpy(power_desc[num].name, _("召魂", "Evocation"));
1595                         power_desc[num].level = 42;
1596                         power_desc[num].cost = 40;
1597                         power_desc[num].stat = A_WIS;
1598                         power_desc[num].fail = 35;
1599                         power_desc[num++].number = -3;
1600                 }
1601                 break;
1602         }
1603         case CLASS_ROGUE:
1604         {
1605                 strcpy(power_desc[num].name, _("ヒット&アウェイ", "Hit and Away"));
1606                 power_desc[num].level = 8;
1607                 power_desc[num].cost = 12;
1608                 power_desc[num].stat = A_DEX;
1609                 power_desc[num].fail = 14;
1610                 power_desc[num++].number = -3;
1611                 break;
1612         }
1613         case CLASS_RANGER:
1614         case CLASS_SNIPER:
1615         {
1616                 strcpy(power_desc[num].name, _("モンスター調査", "Probe Monster"));
1617                 power_desc[num].level = 15;
1618                 power_desc[num].cost = 20;
1619                 power_desc[num].stat = A_INT;
1620                 power_desc[num].fail = 12;
1621                 power_desc[num++].number = -3;
1622                 break;
1623         }
1624         case CLASS_PALADIN:
1625         {
1626                 if (is_good_realm(p_ptr->realm1))
1627                 {
1628                         strcpy(power_desc[num].name, _("ホーリー・ランス", "Holy Lance"));
1629                         power_desc[num].level = 30;
1630                         power_desc[num].cost = 30;
1631                         power_desc[num].stat = A_WIS;
1632                         power_desc[num].fail = 30;
1633                         power_desc[num++].number = -3;
1634                 }
1635                 else
1636                 {
1637                         strcpy(power_desc[num].name, _("ヘル・ランス", "Hell Lance"));
1638                         power_desc[num].level = 30;
1639                         power_desc[num].cost = 30;
1640                         power_desc[num].stat = A_WIS;
1641                         power_desc[num].fail = 30;
1642                         power_desc[num++].number = -3;
1643                 }
1644                 break;
1645         }
1646         case CLASS_WARRIOR_MAGE:
1647         {
1648                 strcpy(power_desc[num].name, _("変換: HP→MP", "Convert HP to SP"));
1649                 power_desc[num].level = 25;
1650                 power_desc[num].cost = 0;
1651                 power_desc[num].stat = A_INT;
1652                 power_desc[num].fail = 10;
1653                 power_desc[num++].number = -3;
1654                         
1655                 strcpy(power_desc[num].name, _("変換: MP→HP", "Convert SP to HP"));
1656                 power_desc[num].level = 25;
1657                 power_desc[num].cost = 0;
1658                 power_desc[num].stat = A_INT;
1659                 power_desc[num].fail = 10;
1660                 power_desc[num++].number = -4;
1661                 break;
1662         }
1663         case CLASS_CHAOS_WARRIOR:
1664         {
1665                 strcpy(power_desc[num].name, _("幻惑の光", "Confusing Light"));
1666                 power_desc[num].level = 40;
1667                 power_desc[num].cost = 50;
1668                 power_desc[num].stat = A_INT;
1669                 power_desc[num].fail = 25;
1670                 power_desc[num++].number = -3;
1671                 break;
1672         }
1673         case CLASS_MONK:
1674         {
1675                 strcpy(power_desc[num].name, _("構える", "Assume a Posture"));
1676                 power_desc[num].level = 25;
1677                 power_desc[num].cost = 0;
1678                 power_desc[num].stat = A_DEX;
1679                 power_desc[num].fail = 0;
1680                 power_desc[num++].number = -3;
1681                         
1682                 strcpy(power_desc[num].name, _("百裂拳", "Double Attack"));
1683                 power_desc[num].level = 30;
1684                 power_desc[num].cost = 30;
1685                 power_desc[num].stat = A_STR;
1686                 power_desc[num].fail = 20;
1687                 power_desc[num++].number = -4;
1688                 break;
1689         }
1690         case CLASS_MINDCRAFTER:
1691         case CLASS_FORCETRAINER:
1692         {
1693                 strcpy(power_desc[num].name, _("明鏡止水", "Clear Mind"));
1694                 power_desc[num].level = 15;
1695                 power_desc[num].cost = 0;
1696                 power_desc[num].stat = A_WIS;
1697                 power_desc[num].fail = 10;
1698                 power_desc[num++].number = -3;
1699                 break;
1700         }
1701         case CLASS_TOURIST:
1702         {
1703                 strcpy(power_desc[num].name, _("写真撮影", "Take a Photograph"));
1704                 power_desc[num].level = 1;
1705                 power_desc[num].cost = 0;
1706                 power_desc[num].stat = A_DEX;
1707                 power_desc[num].fail = 0;
1708                 power_desc[num++].number = -3;
1709                 
1710                 strcpy(power_desc[num].name, _("真・鑑定", "Identify True"));
1711                 power_desc[num].level = 25;
1712                 power_desc[num].cost = 20;
1713                 power_desc[num].stat = A_INT;
1714                 power_desc[num].fail = 20;
1715                 power_desc[num++].number = -4;
1716                 break;
1717         }
1718         case CLASS_IMITATOR:
1719         {
1720                 strcpy(power_desc[num].name, _("倍返し", "Double Revenge"));
1721                 power_desc[num].level = 30;
1722                 power_desc[num].cost = 100;
1723                 power_desc[num].stat = A_DEX;
1724                 power_desc[num].fail = 30;
1725                 power_desc[num++].number = -3;
1726                 break;
1727         }
1728         case CLASS_BEASTMASTER:
1729         {
1730                 strcpy(power_desc[num].name, _("生物支配", "Dominate a Living Thing"));
1731                 power_desc[num].level = 1;
1732                 power_desc[num].cost = (p_ptr->lev+3)/4;
1733                 power_desc[num].stat = A_CHR;
1734                 power_desc[num].fail = 10;
1735                 power_desc[num++].number = -3;
1736                 
1737                 strcpy(power_desc[num].name, _("真・生物支配", "Dominate Living Things"));
1738                 power_desc[num].level = 30;
1739                 power_desc[num].cost = (p_ptr->lev+20)/2;
1740                 power_desc[num].stat = A_CHR;
1741                 power_desc[num].fail = 10;
1742                 power_desc[num++].number = -4;
1743                 break;
1744         }
1745         case CLASS_ARCHER:
1746         {
1747                 strcpy(power_desc[num].name, _("弾/矢の製造", "Create Ammo"));
1748                 power_desc[num].level = 1;
1749                 power_desc[num].cost = 0;
1750                 power_desc[num].stat = A_DEX;
1751                 power_desc[num].fail = 0;
1752                 power_desc[num++].number = -3;
1753                 break;
1754         }
1755         case CLASS_MAGIC_EATER:
1756         {
1757                 strcpy(power_desc[num].name, _("魔力の取り込み", "Absorb Magic"));
1758                 power_desc[num].level = 1;
1759                 power_desc[num].cost = 0;
1760                 power_desc[num].stat = A_INT;
1761                 power_desc[num].fail = 0;
1762                 power_desc[num++].number = -3;
1763
1764                 strcpy(power_desc[num].name, _("強力発動", "Powerful Activation"));
1765                 power_desc[num].level = 10;
1766                 power_desc[num].cost = 10 + (lvl - 10) / 2;
1767                 power_desc[num].stat = A_INT;
1768                 power_desc[num].fail = 0;
1769                 power_desc[num++].number = -4;
1770                 break;
1771         }
1772         case CLASS_BARD:
1773         {
1774                 strcpy(power_desc[num].name, _("歌を止める", "Stop Singing"));
1775                 power_desc[num].level = 1;
1776                 power_desc[num].cost = 0;
1777                 power_desc[num].stat = A_CHR;
1778                 power_desc[num].fail = 0;
1779                 power_desc[num++].number = -3;
1780                 break;
1781         }
1782         case CLASS_RED_MAGE:
1783         {
1784                 strcpy(power_desc[num].name, _("連続魔", "Double Magic"));
1785                 power_desc[num].level = 48;
1786                 power_desc[num].cost = 20;
1787                 power_desc[num].stat = A_INT;
1788                 power_desc[num].fail = 0;
1789                 power_desc[num++].number = -3;
1790                 break;
1791         }
1792         case CLASS_SAMURAI:
1793         {
1794                 strcpy(power_desc[num].name, _("気合いため", "Concentration"));
1795                 power_desc[num].level = 1;
1796                 power_desc[num].cost = 0;
1797                 power_desc[num].stat = A_WIS;
1798                 power_desc[num].fail = 0;
1799                 power_desc[num++].number = -3;
1800                 
1801                 strcpy(power_desc[num].name, _("型", "Assume a Posture"));
1802                 power_desc[num].level = 25;
1803                 power_desc[num].cost = 0;
1804                 power_desc[num].stat = A_DEX;
1805                 power_desc[num].fail = 0;
1806                 power_desc[num++].number = -4;
1807                 break;
1808         }
1809         case CLASS_BLUE_MAGE:
1810         {
1811                 strcpy(power_desc[num].name, _("ラーニング", "Learning"));
1812                 power_desc[num].level = 1;
1813                 power_desc[num].cost = 0;
1814                 power_desc[num].stat = A_INT;
1815                 power_desc[num].fail = 0;
1816                 power_desc[num++].number = -3;
1817                 break;
1818         }
1819         case CLASS_CAVALRY:
1820         {
1821                 strcpy(power_desc[num].name, _("荒馬ならし", "Rodeo"));
1822                 power_desc[num].level = 10;
1823                 power_desc[num].cost = 0;
1824                 power_desc[num].stat = A_STR;
1825                 power_desc[num].fail = 10;
1826                 power_desc[num++].number = -3;
1827                 break;
1828         }
1829         case CLASS_BERSERKER:
1830         {
1831                 strcpy(power_desc[num].name, _("帰還", "Recall"));
1832                 power_desc[num].level = 10;
1833                 power_desc[num].cost = 10;
1834                 power_desc[num].stat = A_DEX;
1835                 power_desc[num].fail = 20;
1836                 power_desc[num++].number = -3;
1837                 break;
1838         }
1839         case CLASS_MIRROR_MASTER:
1840         {
1841                 strcpy(power_desc[num].name, _("鏡割り", "Break Mirrors"));
1842                 power_desc[num].level = 1;
1843                 power_desc[num].cost = 0;
1844                 power_desc[num].stat = A_INT;
1845                 power_desc[num].fail = 0;
1846                 power_desc[num++].number = -3;
1847                 
1848                 strcpy(power_desc[num].name, _("静水", "Mirror Concentration"));
1849                 power_desc[num].level = 30;
1850                 power_desc[num].cost = 0;
1851                 power_desc[num].stat = A_INT;
1852                 power_desc[num].fail = 20;
1853                 power_desc[num++].number = -4;
1854                 break;
1855         }
1856         case CLASS_SMITH:
1857         {
1858                 strcpy(power_desc[num].name, _("目利き", "Judgment"));
1859                 power_desc[num].level = 5;
1860                 power_desc[num].cost = 15;
1861                 power_desc[num].stat = A_INT;
1862                 power_desc[num].fail = 20;
1863                 power_desc[num++].number = -3;
1864                 break;
1865         }
1866         case CLASS_NINJA:
1867         {
1868                 strcpy(power_desc[num].name, _("速駆け", "Quick Walk"));
1869                 power_desc[num].level = 20;
1870                 power_desc[num].cost = 0;
1871                 power_desc[num].stat = A_DEX;
1872                 power_desc[num].fail = 0;
1873                 power_desc[num++].number = -3;
1874                 break;
1875         }
1876         default:
1877                 strcpy(power_desc[0].name, _("(なし)", "(none)"));
1878         }
1879
1880         if (p_ptr->mimic_form)
1881         {
1882                 switch (p_ptr->mimic_form)
1883                 {
1884                 case MIMIC_DEMON:
1885                 case MIMIC_DEMON_LORD:
1886                         sprintf(power_desc[num].name, _("地獄/火炎のブレス (ダメージ %d)", "Nether or Fire Breath (dam %d)"), lvl * 3);
1887                         power_desc[num].level = 15;
1888                         power_desc[num].cost = 10+lvl/3;
1889                         power_desc[num].stat = A_CON;
1890                         power_desc[num].fail = 20;
1891                         power_desc[num++].number = -1;
1892                         break;
1893                 case MIMIC_VAMPIRE:
1894                         strcpy(power_desc[num].name, _("吸血", "Vampiric Drain"));
1895                         power_desc[num].level = 2;
1896                         power_desc[num].cost = 1 + (lvl / 3);
1897                         power_desc[num].stat = A_CON;
1898                         power_desc[num].fail = 9;
1899                         power_desc[num++].number = -1;
1900                         break;
1901                 }
1902         }
1903         else
1904         {
1905         switch (p_ptr->prace)
1906         {
1907                 case RACE_DWARF:
1908                         strcpy(power_desc[num].name, _("ドアと罠 感知", "Detect Doors+Traps"));
1909                         power_desc[num].level = 5;
1910                         power_desc[num].cost = 5;
1911                         power_desc[num].stat = A_WIS;
1912                         power_desc[num].fail = 12;
1913                         power_desc[num++].number = -1;
1914                         break;
1915                 case RACE_NIBELUNG:
1916                         strcpy(power_desc[num].name, _("ドアと罠 感知", "Detect Doors+Traps"));
1917                         power_desc[num].level = 10;
1918                         power_desc[num].cost = 5;
1919                         power_desc[num].stat = A_WIS;
1920                         power_desc[num].fail = 10;
1921                         power_desc[num++].number = -1;
1922                         break;
1923                 case RACE_HOBBIT:
1924                         strcpy(power_desc[num].name, _("食糧生成", "Create Food"));
1925                         power_desc[num].level = 15;
1926                         power_desc[num].cost = 10;
1927                         power_desc[num].stat = A_INT;
1928                         power_desc[num].fail = 10;
1929                         power_desc[num++].number = -1;
1930                         break;
1931                 case RACE_GNOME:
1932                         sprintf(power_desc[num].name, _("ショート・テレポート", "Blink"));
1933                         power_desc[num].level = 5;
1934                         power_desc[num].cost = 5;
1935                         power_desc[num].stat = A_INT;
1936                         power_desc[num].fail = 12;
1937                         power_desc[num++].number = -1;
1938                         break;
1939                 case RACE_HALF_ORC:
1940                         strcpy(power_desc[num].name, _("恐怖除去", "Remove Fear"));
1941                         power_desc[num].level = 3;
1942                         power_desc[num].cost = 5;
1943                         power_desc[num].stat = A_WIS;
1944                         power_desc[num].fail = warrior ? 5 : 10;
1945                         power_desc[num++].number = -1;
1946                         break;
1947                 case RACE_HALF_TROLL:
1948                         strcpy(power_desc[num].name, _("狂戦士化", "Berserk"));
1949                         power_desc[num].level = 10;
1950                         power_desc[num].cost = 12;
1951                         power_desc[num].stat = A_STR;
1952                         power_desc[num].fail = warrior ? 6 : 12;
1953                         power_desc[num++].number = -1;
1954                         break;
1955                 case RACE_BARBARIAN:
1956                         strcpy(power_desc[num].name, _("狂戦士化", "Berserk"));
1957                         power_desc[num].level = 8;
1958                         power_desc[num].cost = 10;
1959                         power_desc[num].stat = A_STR;
1960                         power_desc[num].fail = warrior ? 6 : 12;
1961                         power_desc[num++].number = -1;
1962                         break;
1963                 case RACE_AMBERITE:
1964                         strcpy(power_desc[num].name, _("シャドウ・シフト", "Shadow Shifting"));
1965                         power_desc[num].level = 30;
1966                         power_desc[num].cost = 50;
1967                         power_desc[num].stat = A_INT;
1968                         power_desc[num].fail = 50;
1969                         power_desc[num++].number = -1;
1970                         
1971                         strcpy(power_desc[num].name, _("パターン・ウォーク", "Pattern Mindwalking"));
1972                         power_desc[num].level = 40;
1973                         power_desc[num].cost = 75;
1974                         power_desc[num].stat = A_WIS;
1975                         power_desc[num].fail = 50;
1976                         power_desc[num++].number = -2;
1977                         break;
1978                 case RACE_HALF_OGRE:
1979                         strcpy(power_desc[num].name, _("爆発のルーン", "Explosive Rune"));
1980                         power_desc[num].level = 25;
1981                         power_desc[num].cost = 35;
1982                         power_desc[num].stat = A_INT;
1983                         power_desc[num].fail = 15;
1984                         power_desc[num++].number = -1;
1985                         break;
1986                 case RACE_HALF_GIANT:
1987                         strcpy(power_desc[num].name, _("岩石溶解", "Stone to Mud"));
1988                         power_desc[num].level = 20;
1989                         power_desc[num].cost = 10;
1990                         power_desc[num].stat = A_STR;
1991                         power_desc[num].fail = 12;
1992                         power_desc[num++].number = -1;
1993                         break;
1994                 case RACE_HALF_TITAN:
1995                         strcpy(power_desc[num].name, _("スキャン・モンスター", "Probing"));
1996                         power_desc[num].level = 15;
1997                         power_desc[num].cost = 10;
1998                         power_desc[num].stat = A_INT;
1999                         power_desc[num].fail = 12;
2000                         power_desc[num++].number = -1;
2001                         break;
2002                 case RACE_CYCLOPS:
2003                         sprintf(power_desc[num].name, _("岩石投げ(ダメージ %d)", "Throw Boulder (dam %d)"), (3 * lvl) / 2);
2004                         power_desc[num].level = 20;
2005                         power_desc[num].cost = 15;
2006                         power_desc[num].stat = A_STR;
2007                         power_desc[num].fail = 12;
2008                         power_desc[num++].number = -1;
2009                         break;
2010                 case RACE_YEEK:
2011                         strcpy(power_desc[num].name, _("モンスター恐慌", "Scare Monster"));
2012                         power_desc[num].level = 15;
2013                         power_desc[num].cost = 15;
2014                         power_desc[num].stat = A_WIS;
2015                         power_desc[num].fail = 10;
2016                         power_desc[num++].number = -1;
2017                         break;
2018                 case RACE_SPECTRE:
2019                         strcpy(power_desc[num].name, _("モンスター恐慌", "Scare Monster"));
2020                         power_desc[num].level = 4;
2021                         power_desc[num].cost = 6;
2022                         power_desc[num].stat = A_INT;
2023                         power_desc[num].fail = 3;
2024                         power_desc[num++].number = -1;
2025                         break;
2026                 case RACE_KLACKON:
2027                         sprintf(power_desc[num].name, _("酸の唾 (ダメージ %d)", "Spit Acid (dam %d)"), lvl);
2028                         power_desc[num].level = 9;
2029                         power_desc[num].cost = 9;
2030                         power_desc[num].stat = A_DEX;
2031                         power_desc[num].fail = 14;
2032                         power_desc[num++].number = -1;
2033                         break;
2034                 case RACE_KOBOLD:
2035                         sprintf(power_desc[num].name, _("毒のダーツ (ダメージ %d)", "Poison Dart (dam %d)"), lvl);
2036                         power_desc[num].level = 12;
2037                         power_desc[num].cost = 8;
2038                         power_desc[num].stat = A_DEX;
2039                         power_desc[num].fail = 14;
2040                         power_desc[num++].number = -1;
2041                         break;
2042                 case RACE_DARK_ELF:
2043                         sprintf(power_desc[num].name, _("マジック・ミサイル (ダメージ %dd%d)", "Magic Missile (dm %dd%d)"), 3 + ((lvl - 1) / 5), 4);
2044                         power_desc[num].level = 2;
2045                         power_desc[num].cost = 2;
2046                         power_desc[num].stat = A_INT;
2047                         power_desc[num].fail = 9;
2048                         power_desc[num++].number = -1;
2049                         break;
2050                 case RACE_DRACONIAN:
2051                         sprintf(power_desc[num].name, _("ブレス (ダメージ %d)", "Breath Weapon (dam %d)"), lvl * 2);
2052                         power_desc[num].level = 1;
2053                         power_desc[num].cost = lvl;
2054                         power_desc[num].stat = A_CON;
2055                         power_desc[num].fail = 12;
2056                         power_desc[num++].number = -1;
2057                         break;
2058                 case RACE_MIND_FLAYER:
2059                         sprintf(power_desc[num].name, _("精神攻撃 (ダメージ %d)", "Mind Blast (dam %d)"), lvl);
2060                         power_desc[num].level = 15;
2061                         power_desc[num].cost = 12;
2062                         power_desc[num].stat = A_INT;
2063                         power_desc[num].fail = 14;
2064                         power_desc[num++].number = -1;
2065                         break;
2066                 case RACE_IMP:
2067                         sprintf(power_desc[num].name, _("ファイア・ボルト/ボール (ダメージ %d)", "Fire Bolt/Ball (dam %d)"), lvl);
2068                         power_desc[num].level = 9;
2069                         power_desc[num].cost = 15;
2070                         power_desc[num].stat = A_WIS;
2071                         power_desc[num].fail = 15;
2072                         power_desc[num++].number = -1;
2073                         break;
2074                 case RACE_GOLEM:
2075                         strcpy(power_desc[num].name, _("肌石化 (期間 1d20+30)", "Stone Skin (dur 1d20+30)"));
2076                         power_desc[num].level = 20;
2077                         power_desc[num].cost = 15;
2078                         power_desc[num].stat = A_CON;
2079                         power_desc[num].fail = 8;
2080                         power_desc[num++].number = -1;
2081                         break;
2082                 case RACE_SKELETON:
2083                 case RACE_ZOMBIE:
2084                         strcpy(power_desc[num].name, _("経験値復活", "Restore Experience"));
2085                         power_desc[num].level = 30;
2086                         power_desc[num].cost = 30;
2087                         power_desc[num].stat = A_WIS;
2088                         power_desc[num].fail = 18;
2089                         power_desc[num++].number = -1;
2090                         break;
2091                 case RACE_VAMPIRE:
2092                         strcpy(power_desc[num].name, _("吸血", "Vampiric Drain"));
2093                         power_desc[num].level = 2;
2094                         power_desc[num].cost = 1 + (lvl / 3);
2095                         power_desc[num].stat = A_CON;
2096                         power_desc[num].fail = 9;
2097                         power_desc[num++].number = -1;
2098                         break;
2099                 case RACE_SPRITE:
2100                         strcpy(power_desc[num].name, _("眠り粉", "Sleeping Dust"));
2101                         power_desc[num].level = 12;
2102                         power_desc[num].cost = 12;
2103                         power_desc[num].stat = A_INT;
2104                         power_desc[num].fail = 15;
2105                         power_desc[num++].number = -1;
2106                         break;
2107                 case RACE_DEMON:
2108                         sprintf(power_desc[num].name, _("地獄/火炎のブレス (ダメージ %d)", "Nether or Fire Breath (dam %d)"), lvl * 3);
2109                         power_desc[num].level = 15;
2110                         power_desc[num].cost = 10+lvl/3;
2111                         power_desc[num].stat = A_CON;
2112                         power_desc[num].fail = 20;
2113                         power_desc[num++].number = -1;
2114                         break;
2115                 case RACE_KUTAR:
2116                         strcpy(power_desc[num].name, _("横に伸びる", "Expand Horizontally (dur 30+1d20)"));
2117                         power_desc[num].level = 20;
2118                         power_desc[num].cost = 15;
2119                         power_desc[num].stat = A_CHR;
2120                         power_desc[num].fail = 8;
2121                         power_desc[num++].number = -1;
2122                         break;
2123                 case RACE_ANDROID:
2124                         if (p_ptr->lev < 10)
2125                         {
2126                                 strcpy(power_desc[num].name, _("レイガン", "Ray Gun"));
2127                                 power_desc[num].level = 1;
2128                                 power_desc[num].cost = 7;
2129                                 power_desc[num].fail = 8;
2130                         }
2131                         else if (p_ptr->lev < 25)
2132                         {
2133                                 strcpy(power_desc[num].name, _("ブラスター", "Blaster"));
2134                                 power_desc[num].level = 10;
2135                                 power_desc[num].cost = 13;
2136                                 power_desc[num].fail = 10;
2137                         }
2138                         else if (p_ptr->lev < 35)
2139                         {
2140                                 strcpy(power_desc[num].name, _("バズーカ", "Bazooka"));
2141                                 power_desc[num].level = 25;
2142                                 power_desc[num].cost = 26;
2143                                 power_desc[num].fail = 12;
2144                         }
2145                         else if (p_ptr->lev < 45)
2146                         {
2147                                 strcpy(power_desc[num].name, _("ビームキャノン", "Beam Cannon"));
2148                                 power_desc[num].level = 35;
2149                                 power_desc[num].cost = 40;
2150                                 power_desc[num].fail = 15;
2151                         }
2152                         else
2153                         {
2154                                 strcpy(power_desc[num].name, _("ロケット", "Rocket"));
2155                                 power_desc[num].level = 45;
2156                                 power_desc[num].cost = 60;
2157                                 power_desc[num].fail = 18;
2158                         }
2159                         power_desc[num].stat = A_STR;
2160                         power_desc[num++].number = -1;
2161                         break;
2162                 default:
2163                 {
2164                         break;
2165                 }
2166         }
2167         }
2168
2169         if (p_ptr->muta1)
2170         {
2171                 if (p_ptr->muta1 & MUT1_SPIT_ACID)
2172                 {
2173                         strcpy(power_desc[num].name, _("酸の唾", "Spit Acid"));
2174                         power_desc[num].level = 9;
2175                         power_desc[num].cost = 9;
2176                         power_desc[num].stat = A_DEX;
2177                         power_desc[num].fail = 15;
2178                         power_desc[num++].number = MUT1_SPIT_ACID;
2179                 }
2180
2181                 if (p_ptr->muta1 & MUT1_BR_FIRE)
2182                 {
2183                         strcpy(power_desc[num].name, _("炎のブレス", "Fire Breath"));
2184                         power_desc[num].level = 20;
2185                         power_desc[num].cost = lvl;
2186                         power_desc[num].stat = A_CON;
2187                         power_desc[num].fail = 18;
2188                         power_desc[num++].number = MUT1_BR_FIRE;
2189                 }
2190
2191                 if (p_ptr->muta1 & MUT1_HYPN_GAZE)
2192                 {
2193                         strcpy(power_desc[num].name, _("催眠睨み", "Hypnotic Gaze"));
2194                         power_desc[num].level = 12;
2195                         power_desc[num].cost = 12;
2196                         power_desc[num].stat = A_CHR;
2197                         power_desc[num].fail = 18;
2198                         power_desc[num++].number = MUT1_HYPN_GAZE;
2199                 }
2200
2201                 if (p_ptr->muta1 & MUT1_TELEKINES)
2202                 {
2203                         strcpy(power_desc[num].name, _("念動力", "Telekinesis"));
2204                         power_desc[num].level = 9;
2205                         power_desc[num].cost = 9;
2206                         power_desc[num].stat = A_WIS;
2207                         power_desc[num].fail = 14;
2208                         power_desc[num++].number = MUT1_TELEKINES;
2209                 }
2210
2211                 if (p_ptr->muta1 & MUT1_VTELEPORT)
2212                 {
2213                         strcpy(power_desc[num].name, _("テレポート", "Teleport"));
2214                         power_desc[num].level = 7;
2215                         power_desc[num].cost = 7;
2216                         power_desc[num].stat = A_WIS;
2217                         power_desc[num].fail = 15;
2218                         power_desc[num++].number = MUT1_VTELEPORT;
2219                 }
2220
2221                 if (p_ptr->muta1 & MUT1_MIND_BLST)
2222                 {
2223                         strcpy(power_desc[num].name, _("精神攻撃", "Mind Blast"));
2224                         power_desc[num].level = 5;
2225                         power_desc[num].cost = 3;
2226                         power_desc[num].stat = A_WIS;
2227                         power_desc[num].fail = 15;
2228                         power_desc[num++].number = MUT1_MIND_BLST;
2229                 }
2230
2231                 if (p_ptr->muta1 & MUT1_RADIATION)
2232                 {
2233                         strcpy(power_desc[num].name, _("放射能", "Emit Radiation"));
2234                         power_desc[num].level = 15;
2235                         power_desc[num].cost = 15;
2236                         power_desc[num].stat = A_CON;
2237                         power_desc[num].fail = 14;
2238                         power_desc[num++].number = MUT1_RADIATION;
2239                 }
2240
2241                 if (p_ptr->muta1 & MUT1_VAMPIRISM)
2242                 {
2243                         strcpy(power_desc[num].name, _("吸血", "Vampiric Drain"));
2244                         power_desc[num].level = 2;
2245                         power_desc[num].cost = (1 + (lvl / 3));
2246                         power_desc[num].stat = A_CON;
2247                         power_desc[num].fail = 9;
2248                         power_desc[num++].number = MUT1_VAMPIRISM;
2249                 }
2250
2251                 if (p_ptr->muta1 & MUT1_SMELL_MET)
2252                 {
2253                         strcpy(power_desc[num].name, _("金属嗅覚", "Smell Metal"));
2254                         power_desc[num].level = 3;
2255                         power_desc[num].cost = 2;
2256                         power_desc[num].stat = A_INT;
2257                         power_desc[num].fail = 12;
2258                         power_desc[num++].number = MUT1_SMELL_MET;
2259                 }
2260
2261                 if (p_ptr->muta1 & MUT1_SMELL_MON)
2262                 {
2263                         strcpy(power_desc[num].name, _("敵臭嗅覚", "Smell Monsters"));
2264                         power_desc[num].level = 5;
2265                         power_desc[num].cost = 4;
2266                         power_desc[num].stat = A_INT;
2267                         power_desc[num].fail = 15;
2268                         power_desc[num++].number = MUT1_SMELL_MON;
2269                 }
2270
2271                 if (p_ptr->muta1 & MUT1_BLINK)
2272                 {
2273                         strcpy(power_desc[num].name, _("ショート・テレポート", "Blink"));
2274                         power_desc[num].level = 3;
2275                         power_desc[num].cost = 3;
2276                         power_desc[num].stat = A_WIS;
2277                         power_desc[num].fail = 12;
2278                         power_desc[num++].number = MUT1_BLINK;
2279                 }
2280
2281                 if (p_ptr->muta1 & MUT1_EAT_ROCK)
2282                 {
2283                         strcpy(power_desc[num].name, _("岩食い", "Eat Rock"));
2284                         power_desc[num].level = 8;
2285                         power_desc[num].cost = 12;
2286                         power_desc[num].stat = A_CON;
2287                         power_desc[num].fail = 18;
2288                         power_desc[num++].number = MUT1_EAT_ROCK;
2289                 }
2290
2291                 if (p_ptr->muta1 & MUT1_SWAP_POS)
2292                 {
2293                         strcpy(power_desc[num].name, _("位置交換", "Swap Position"));
2294                         power_desc[num].level = 15;
2295                         power_desc[num].cost = 12;
2296                         power_desc[num].stat = A_DEX;
2297                         power_desc[num].fail = 16;
2298                         power_desc[num++].number = MUT1_SWAP_POS;
2299                 }
2300
2301                 if (p_ptr->muta1 & MUT1_SHRIEK)
2302                 {
2303                         strcpy(power_desc[num].name, _("叫び", "Shriek"));
2304                         power_desc[num].level = 20;
2305                         power_desc[num].cost = 14;
2306                         power_desc[num].stat = A_CON;
2307                         power_desc[num].fail = 16;
2308                         power_desc[num++].number = MUT1_SHRIEK;
2309                 }
2310
2311                 if (p_ptr->muta1 & MUT1_ILLUMINE)
2312                 {
2313                         strcpy(power_desc[num].name, _("照明", "Illuminate"));
2314                         power_desc[num].level = 3;
2315                         power_desc[num].cost = 2;
2316                         power_desc[num].stat = A_INT;
2317                         power_desc[num].fail = 10;
2318                         power_desc[num++].number = MUT1_ILLUMINE;
2319                 }
2320
2321                 if (p_ptr->muta1 & MUT1_DET_CURSE)
2322                 {
2323                         strcpy(power_desc[num].name, _("呪い感知", "Detect Curses"));
2324                         power_desc[num].level = 7;
2325                         power_desc[num].cost = 14;
2326                         power_desc[num].stat = A_WIS;
2327                         power_desc[num].fail = 14;
2328                         power_desc[num++].number = MUT1_DET_CURSE;
2329                 }
2330
2331                 if (p_ptr->muta1 & MUT1_BERSERK)
2332                 {
2333                         strcpy(power_desc[num].name, _("狂戦士化", "Berserk"));
2334                         power_desc[num].level = 8;
2335                         power_desc[num].cost = 8;
2336                         power_desc[num].stat = A_STR;
2337                         power_desc[num].fail = 14;
2338                         power_desc[num++].number = MUT1_BERSERK;
2339                 }
2340
2341                 if (p_ptr->muta1 & MUT1_POLYMORPH)
2342                 {
2343                         strcpy(power_desc[num].name, _("変身", "Polymorph"));
2344                         power_desc[num].level = 18;
2345                         power_desc[num].cost = 20;
2346                         power_desc[num].stat = A_CON;
2347                         power_desc[num].fail = 18;
2348                         power_desc[num++].number = MUT1_POLYMORPH;
2349                 }
2350
2351                 if (p_ptr->muta1 & MUT1_MIDAS_TCH)
2352                 {
2353                         strcpy(power_desc[num].name, _("ミダスの手", "Midas Touch"));
2354                         power_desc[num].level = 10;
2355                         power_desc[num].cost = 5;
2356                         power_desc[num].stat = A_INT;
2357                         power_desc[num].fail = 12;
2358                         power_desc[num++].number = MUT1_MIDAS_TCH;
2359                 }
2360
2361                 if (p_ptr->muta1 & MUT1_GROW_MOLD)
2362                 {
2363                         strcpy(power_desc[num].name, _("カビ発生", "Grow Mold"));
2364                         power_desc[num].level = 1;
2365                         power_desc[num].cost = 6;
2366                         power_desc[num].stat = A_CON;
2367                         power_desc[num].fail = 14;
2368                         power_desc[num++].number = MUT1_GROW_MOLD;
2369                 }
2370
2371                 if (p_ptr->muta1 & MUT1_RESIST)
2372                 {
2373                         strcpy(power_desc[num].name, _("エレメント耐性", "Resist Elements"));
2374                         power_desc[num].level = 10;
2375                         power_desc[num].cost = 12;
2376                         power_desc[num].stat = A_CON;
2377                         power_desc[num].fail = 12;
2378                         power_desc[num++].number = MUT1_RESIST;
2379                 }
2380
2381                 if (p_ptr->muta1 & MUT1_EARTHQUAKE)
2382                 {
2383                         strcpy(power_desc[num].name, _("地震", "Earthquake"));
2384                         power_desc[num].level = 12;
2385                         power_desc[num].cost = 12;
2386                         power_desc[num].stat = A_STR;
2387                         power_desc[num].fail = 16;
2388                         power_desc[num++].number = MUT1_EARTHQUAKE;
2389                 }
2390
2391                 if (p_ptr->muta1 & MUT1_EAT_MAGIC)
2392                 {
2393                         strcpy(power_desc[num].name, _("魔力食い", "Eat Magic"));
2394                         power_desc[num].level = 17;
2395                         power_desc[num].cost = 1;
2396                         power_desc[num].stat = A_WIS;
2397                         power_desc[num].fail = 15;
2398                         power_desc[num++].number = MUT1_EAT_MAGIC;
2399                 }
2400
2401                 if (p_ptr->muta1 & MUT1_WEIGH_MAG)
2402                 {
2403                         strcpy(power_desc[num].name, _("魔力感知", "Weigh Magic"));
2404                         power_desc[num].level = 6;
2405                         power_desc[num].cost = 6;
2406                         power_desc[num].stat = A_INT;
2407                         power_desc[num].fail = 10;
2408                         power_desc[num++].number = MUT1_WEIGH_MAG;
2409                 }
2410
2411                 if (p_ptr->muta1 & MUT1_STERILITY)
2412                 {
2413                         strcpy(power_desc[num].name, _("増殖阻止", "Sterilize"));
2414                         power_desc[num].level = 12;
2415                         power_desc[num].cost = 23;
2416                         power_desc[num].stat = A_CHR;
2417                         power_desc[num].fail = 15;
2418                         power_desc[num++].number = MUT1_STERILITY;
2419                 }
2420
2421                 if (p_ptr->muta1 & MUT1_PANIC_HIT)
2422                 {
2423                         strcpy(power_desc[num].name, _("ヒット&アウェイ", "Panic Hit"));
2424                         power_desc[num].level = 10;
2425                         power_desc[num].cost = 12;
2426                         power_desc[num].stat = A_DEX;
2427                         power_desc[num].fail = 14;
2428                         power_desc[num++].number = MUT1_PANIC_HIT;
2429                 }
2430
2431                 if (p_ptr->muta1 & MUT1_DAZZLE)
2432                 {
2433                         strcpy(power_desc[num].name, _("眩惑", "Dazzle"));
2434                         power_desc[num].level = 7;
2435                         power_desc[num].cost = 15;
2436                         power_desc[num].stat = A_CHR;
2437                         power_desc[num].fail = 8;
2438                         power_desc[num++].number = MUT1_DAZZLE;
2439                 }
2440
2441                 if (p_ptr->muta1 & MUT1_LASER_EYE)
2442                 {
2443                         strcpy(power_desc[num].name, _("レーザー・アイ", "Laser Eye"));
2444                         power_desc[num].level = 7;
2445                         power_desc[num].cost = 10;
2446                         power_desc[num].stat = A_WIS;
2447                         power_desc[num].fail = 9;
2448                         power_desc[num++].number = MUT1_LASER_EYE;
2449                 }
2450
2451                 if (p_ptr->muta1 & MUT1_RECALL)
2452                 {
2453                         strcpy(power_desc[num].name, _("帰還", "Recall"));
2454                         power_desc[num].level = 17;
2455                         power_desc[num].cost = 50;
2456                         power_desc[num].stat = A_INT;
2457                         power_desc[num].fail = 16;
2458                         power_desc[num++].number = MUT1_RECALL;
2459                 }
2460
2461                 if (p_ptr->muta1 & MUT1_BANISH)
2462                 {
2463                         strcpy(power_desc[num].name, _("邪悪消滅", "Banish Evil"));
2464                         power_desc[num].level = 25;
2465                         power_desc[num].cost = 25;
2466                         power_desc[num].stat = A_WIS;
2467                         power_desc[num].fail = 18;
2468                         power_desc[num++].number = MUT1_BANISH;
2469                 }
2470
2471                 if (p_ptr->muta1 & MUT1_COLD_TOUCH)
2472                 {
2473                         strcpy(power_desc[num].name, _("凍結の手", "Cold Touch"));
2474                         power_desc[num].level = 2;
2475                         power_desc[num].cost = 2;
2476                         power_desc[num].stat = A_CON;
2477                         power_desc[num].fail = 11;
2478                         power_desc[num++].number = MUT1_COLD_TOUCH;
2479                 }
2480
2481                 if (p_ptr->muta1 & MUT1_LAUNCHER)
2482                 {
2483                         strcpy(power_desc[num].name, _("アイテム投げ", "Throw Object"));
2484                         power_desc[num].level = 1;
2485                         power_desc[num].cost = lvl;
2486                         power_desc[num].stat = A_STR;
2487                         power_desc[num].fail = 6;
2488                         /* XXX_XXX_XXX Hack! MUT1_LAUNCHER counts as negative... */
2489                         power_desc[num++].number = 3;
2490                 }
2491         }
2492
2493         /* Nothing chosen yet */
2494         flag = FALSE;
2495
2496         /* No redraw yet */
2497         redraw = FALSE;
2498
2499         /* Build a prompt */
2500         (void) strnfmt(out_val, 78, 
2501                                 _("(特殊能力 %c-%c, *'で一覧, ESCで中断) どの特殊能力を使いますか?", "(Powers %c-%c, *=List, ESC=exit) Use which power? "),
2502                                 I2A(0), (num <= 26) ? I2A(num - 1) : '0' + num - 27);
2503
2504 if (!repeat_pull(&i) || i<0 || i>=num) {
2505         if (use_menu) screen_save();
2506          /* Get a spell from the user */
2507
2508         choice = (always_show_list || use_menu) ? ESCAPE:1;
2509         while (!flag)
2510         {
2511                 if( choice==ESCAPE ) choice = ' '; 
2512                 else if( !get_com(out_val, &choice, FALSE) )break; 
2513
2514                 if (use_menu && choice != ' ')
2515                 {
2516                         switch(choice)
2517                         {
2518                                 case '0':
2519                                 {
2520                                         screen_load();
2521                                         p_ptr->energy_use = 0;
2522                                         return;
2523                                 }
2524
2525                                 case '8':
2526                                 case 'k':
2527                                 case 'K':
2528                                 {
2529                                         menu_line += (num - 1);
2530                                         break;
2531                                 }
2532
2533                                 case '2':
2534                                 case 'j':
2535                                 case 'J':
2536                                 {
2537                                         menu_line++;
2538                                         break;
2539                                 }
2540
2541                                 case '6':
2542                                 case 'l':
2543                                 case 'L':
2544                                 case '4':
2545                                 case 'h':
2546                                 case 'H':
2547                                 {
2548                                         if (menu_line > 18)
2549                                                 menu_line -= 18;
2550                                         else if (menu_line+18 <= num)
2551                                                 menu_line += 18;
2552                                         break;
2553                                 }
2554
2555                                 case 'x':
2556                                 case 'X':
2557                                 case '\r':
2558                                 {
2559                                         i = menu_line - 1;
2560                                         ask = FALSE;
2561                                         break;
2562                                 }
2563                         }
2564                         if (menu_line > num) menu_line -= num;
2565                 }
2566                 /* Request redraw */
2567                 if ((choice == ' ') || (choice == '*') || (choice == '?') || (use_menu && ask))
2568                 {
2569                         /* Show the list */
2570                         if (!redraw || use_menu)
2571                         {
2572                                 byte y = 1, x = 0;
2573                                 int ctr = 0;
2574                                 char dummy[80];
2575                                 char letter;
2576                                 TERM_LEN x1, y1;
2577
2578                                 strcpy(dummy, "");
2579
2580                                 /* Show list */
2581                                 redraw = TRUE;
2582                                 if (!use_menu) screen_save();
2583
2584                                 /* Print header(s) */
2585                                 if (num < 18)
2586                                         prt(_("                            Lv   MP 失率", "                            Lv Cost Fail"), y++, x);
2587                                 else
2588                                 prt(_("                            Lv   MP 失率                            Lv   MP 失率", 
2589                                           "                            Lv Cost Fail                            Lv Cost Fail"), y++, x);
2590
2591
2592                                 /* Print list */
2593                                 while (ctr < num)
2594                                 {
2595                                         x1 = ((ctr < 18) ? x : x + 40);
2596                                         y1 = ((ctr < 18) ? y + ctr : y + ctr - 18);
2597
2598                                         if (use_menu)
2599                                         {
2600                                                 if (ctr == (menu_line-1)) strcpy(dummy, _(" 》 ", " >  "));
2601                                                 else strcpy(dummy, "    ");
2602                                         }
2603                                         else
2604                                         {
2605                                                 /* letter/number for power selection */
2606                                                 if (ctr < 26)
2607                                                         letter = I2A(ctr);
2608                                                 else
2609                                                         letter = '0' + ctr - 26;
2610                                                 sprintf(dummy, " %c) ",letter);
2611                                         }
2612                                         strcat(dummy, format("%-23.23s %2d %4d %3d%%",
2613                                                 power_desc[ctr].name, power_desc[ctr].level, power_desc[ctr].cost,
2614                                                 100 - racial_chance(&power_desc[ctr])));
2615                                         prt(dummy, y1, x1);
2616                                         ctr++;
2617                                 }
2618                         }
2619
2620                         /* Hide the list */
2621                         else
2622                         {
2623                                 /* Hide list */
2624                                 redraw = FALSE;
2625                                 screen_load();
2626                         }
2627
2628                         /* Redo asking */
2629                         continue;
2630                 }
2631
2632                 if (!use_menu)
2633                 {
2634                         if (choice == '\r' && num == 1)
2635                         {
2636                                 choice = 'a';
2637                         }
2638
2639                         if (isalpha(choice))
2640                         {
2641                                 /* Note verify */
2642                                 ask = (isupper(choice));
2643
2644                                 /* Lowercase */
2645                                 if (ask) choice = (char)tolower(choice);
2646
2647                                 /* Extract request */
2648                                 i = (islower(choice) ? A2I(choice) : -1);
2649                         }
2650                         else
2651                         {
2652                                 ask = FALSE; /* Can't uppercase digits */
2653
2654                                 i = choice - '0' + 26;
2655                         }
2656                 }
2657
2658                 /* Totally Illegal */
2659                 if ((i < 0) || (i >= num))
2660                 {
2661                         bell();
2662                         continue;
2663                 }
2664
2665                 /* Verify it */
2666                 if (ask)
2667                 {
2668                         char tmp_val[160];
2669
2670                         /* Prompt */
2671                         (void) strnfmt(tmp_val, 78, _("%sを使いますか? ", "Use %s? "), power_desc[i].name);
2672
2673                         /* Belay that order */
2674                         if (!get_check(tmp_val)) continue;
2675                 }
2676
2677                 /* Stop the loop */
2678                 flag = TRUE;
2679         }
2680         if (redraw) screen_load();
2681
2682         /* Abort if needed */
2683         if (!flag)
2684         {
2685                 p_ptr->energy_use = 0;
2686                 return;
2687         }
2688         repeat_push(i);
2689         } /*if (!repeat_pull(&i) || ...)*/
2690         switch (racial_aux(&power_desc[i]))
2691         {
2692         case 1:
2693                 if (power_desc[i].number < 0)
2694                         cast = cmd_racial_power_aux(power_desc[i].number);
2695                 else
2696                         cast = mutation_power_aux(power_desc[i].number);
2697                 break;
2698         case 0:
2699                 cast = FALSE;
2700                 break;
2701         case -1:
2702                 cast = TRUE;
2703                 break;
2704         }
2705
2706         if (cast)
2707         {
2708                 if (racial_cost)
2709                 {
2710                         int actual_racial_cost = racial_cost / 2 + randint1(racial_cost / 2);
2711
2712                         /* If mana is not enough, player consumes hit point! */
2713                         if (p_ptr->csp < actual_racial_cost)
2714                         {
2715                                 actual_racial_cost -= p_ptr->csp;
2716                                 p_ptr->csp = 0;
2717                                 take_hit(DAMAGE_USELIFE, actual_racial_cost, _("過度の集中", "concentrating too hard"), -1);
2718                         }
2719                         else p_ptr->csp -= actual_racial_cost;
2720
2721                         /* Redraw mana and hp */
2722                         p_ptr->redraw |= (PR_HP | PR_MANA);
2723
2724                         p_ptr->window |= (PW_PLAYER | PW_SPELL);
2725                 }
2726         }
2727         else p_ptr->energy_use = 0;
2728
2729         /* Success */
2730         return;
2731 }