OSDN Git Service

ascii_to_zenkakuの全角マイナス記号を適切なものに修正
[hengband/hengband.git] / src / mind.c
1 /*!
2  * @file mind.c
3  * @brief 各職業の特殊技能実装 / Special magics
4  * @date 2014/01/15
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  * 2005 henkma \n
11  * 2014 Deskull rearranged comment for Doxygen.\n
12  * @details
13  * mind.cとあるが実際には超能力者、練気術師、狂戦士、鏡使い、忍者までの
14  * 特殊技能を揃えて実装している。
15  */
16
17
18
19 #include "angband.h"
20 #include "mindtips.h"
21
22 /*! 特殊技能の一覧テーブル */
23 mind_power mind_powers[5] =
24 {
25   {
26     {
27       /* Level gained,  cost,  %fail,  name */
28 #ifdef JP
29       { 1,   1,  15, "霊視"},
30       { 2,   1,  20, "神経攻撃"},
31       { 3,   2,  25, "次元の瞬き"},
32       { 7,   6,  35, "虚空の幻影"},
33       { 9,   7,  50, "精神支配"},
34       { 11,  7,  30, "念動衝撃弾"},
35       { 13, 12,  50, "鎧化"},
36       { 15, 12,  60, "サイコメトリー"},
37       { 18, 10,  45, "精神波動"},
38       { 23, 15,  50, "アドレナリン・ドーピング"},
39       { 26, 28,  60, "テレキネシス"},
40       { 28, 10,  40, "サイキック・ドレイン"},
41       { 35, 35,  75, "光の剣"},
42       { 45,150,  85, "完全な世界"},
43       { 99,  0,   0, ""},
44       { 99,  0,   0, ""},
45       { 99,  0,   0, ""},
46       { 99,  0,   0, ""},
47       { 99,  0,   0, ""},
48       { 99,  0,   0, ""},
49       { 99,  0,   0, ""},
50 #else
51       { 1,   1,  15, "Precognition"},
52       { 2,   1,  20, "Neural Blast"},
53       { 3,   2,  25, "Minor Displacement"},
54       { 7,   6,  35, "Major Displacement"},
55       { 9,   7,  50, "Domination"},
56       { 11,  7,  30, "Pulverise"},
57       { 13, 12,  50, "Character Armour"},
58       { 15, 12,  60, "Psychometry" },
59       { 18, 10,  45, "Mind Wave" },
60       { 23, 15,  50, "Adrenaline Channeling"},
61       { 26, 28,  60, "Telekinesis"},
62       { 28, 10,  40, "Psychic Drain"},
63       { 35, 35,  75, "Psycho-Spear"},
64       { 45,150,  85, "The World"},
65       { 99,  0,   0, ""},
66       { 99,  0,   0, ""},
67       { 99,  0,   0, ""},
68       { 99,  0,   0, ""},
69       { 99,  0,   0, ""},
70       { 99,  0,   0, ""},
71       { 99,  0,   0, ""},
72 #endif
73       
74     }
75   },
76   
77   {
78     {
79       /* Level gained,  cost,  %fail,  name */
80 #ifdef JP
81       { 1,   1,  15, "小龍"},
82       { 3,   3,  30, "閃光"},
83       { 5,   6,  35, "舞空術"},
84       { 8,   5,  40, "カメハメ波"},
85       { 10,  7,  45, "対魔法防御"},
86       { 13,  5,  60, "練気"},
87       { 17, 17,  50, "纏闘気"},
88       { 20, 20,  50, "衝波"},
89       { 23, 18,  55, "彗龍"},
90       { 25, 30,  70, "いてつく波動"},
91       { 28, 26,  50, "幻霊召喚"},
92       { 32, 35,  65, "煉獄火炎"},
93       { 38, 42,  75, "超カメハメ波"},
94       { 44, 50,  80, "光速移動"},
95       { 99,  0,   0, ""},
96       { 99,  0,   0, ""},
97       { 99,  0,   0, ""},
98       { 99,  0,   0, ""},
99       { 99,  0,   0, ""},
100       { 99,  0,   0, ""},
101       { 99,  0,   0, ""},
102 #else
103       { 1,   1,  15, "Small Force Ball"},
104       { 3,   3,  30, "Flash Light"},
105       { 5,   6,  35, "Flying Technique"},
106       { 8,   5,  40, "Kamehameha"},
107       { 10,  7,  45, "Magic Resistance"},
108       { 13,  5,  60, "Improve Force"},
109       { 17, 17,  50, "Aura of Force"},
110       { 20, 20,  50, "Shock Power"},
111       { 23, 18,  55, "Large Force Ball"},
112       { 25, 30,  70, "Dispel Magic"},
113       { 28, 26,  50, "Summon Ghost"},
114       { 32, 35,  65, "Exploding Frame"},
115       { 38, 42,  75, "Super Kamehameha"},
116       { 44, 50,  80, "Light Speed"},
117       { 99,  0,   0, ""},
118       { 99,  0,   0, ""},
119       { 99,  0,   0, ""},
120       { 99,  0,   0, ""},
121       { 99,  0,   0, ""},
122       { 99,  0,   0, ""},
123       { 99,  0,   0, ""},
124 #endif
125       
126     }
127   },
128   
129   {
130     {
131       /* Level gained,  cost,  %fail,  name */
132 #ifdef JP
133       {  8,  5,  40, "殺気感知"},
134       { 15, 20,   0, "突撃"},
135       { 20, 15,   0, "トラップ粉砕"},
136       { 25, 20,  60, "地震"},
137       { 30, 80,  75, "皆殺し"},
138       { 99,  0,   0, ""},
139       { 99,  0,   0, ""},
140       { 99,  0,   0, ""},
141       { 99,  0,   0, ""},
142       { 99,  0,   0, ""},
143       { 99,  0,   0, ""},
144       { 99,  0,   0, ""},
145       { 99,  0,   0, ""},
146       { 99,  0,   0, ""},
147       { 99,  0,   0, ""},
148       { 99,  0,   0, ""},
149       { 99,  0,   0, ""},
150       { 99,  0,   0, ""},
151       { 99,  0,   0, ""},
152       { 99,  0,   0, ""},
153       { 99,  0,   0, ""},
154 #else
155       {  8,  5,  40, "Detect Atmosphere of Menace"},
156       { 15, 20,   0, "Charge"},
157       { 20, 15,   0, "Smash a Trap"},
158       { 25, 20,  60, "Quake"},
159       { 30, 80,  75, "Massacre"},
160       { 99,  0,   0, ""},
161       { 99,  0,   0, ""},
162       { 99,  0,   0, ""},
163       { 99,  0,   0, ""},
164       { 99,  0,   0, ""},
165       { 99,  0,   0, ""},
166       { 99,  0,   0, ""},
167       { 99,  0,   0, ""},
168       { 99,  0,   0, ""},
169       { 99,  0,   0, ""},
170       { 99,  0,   0, ""},
171       { 99,  0,   0, ""},
172       { 99,  0,   0, ""},
173       { 99,  0,   0, ""},
174       { 99,  0,   0, ""},
175       { 99,  0,   0, ""},
176 #endif
177       
178     }
179   },
180
181   {
182     {
183       /* Level gained,  cost,  %fail,  name */
184 #ifdef JP
185       { 1,   1,  15, "真見の鏡"},
186       { 1,   2,  40, "鏡生成"},
187       { 2,   2,  20, "光のしずく"},
188       { 3,   2,  20, "歪んだ鏡"},
189       { 5,   3,  35, "閃光鏡"},
190       { 6,   5,  35, "彷える鏡"},
191
192       { 10,  5,  30, "微塵隠れ"},
193       { 12, 12,  30, "追放の鏡"},
194       { 15, 15,  30, "鏡砕き"},
195       { 19, 13,  30, "催眠鏡"},
196       { 23, 18,  50, "シーカーレイ"},
197
198       { 25, 20,  40, "鏡の封印"},
199       { 27, 30,  60, "水鏡の盾"},
200       { 29, 30,  60, "スーパーレイ"},
201       { 31, 35,  60, "幻惑の光"},
202       { 33, 50,  80, "鏡の国"},
203
204       { 36, 30,  80, "鏡抜け"},
205       { 38, 40,  70, "帰還の鏡"},
206       { 40, 50,  55, "影分身"},
207       { 43, 55,  70, "封魔結界"},
208       { 46, 70,  75, "ラフノールの鏡"},
209 #else
210       { 1,   1,  15, "Mirror of Seeing"},
211       { 1,   2,  40, "Making a Mirror"},
212       { 2,   2,  20, "Drip of Light"},
213       { 3,   2,  20, "Warped Mirror"},
214       { 5,   3,  35, "Mirror of Light"},
215       { 6,   5,  35, "Mirror of Wandering"},
216
217       { 10,  5,  30, "Robe of Dust"},
218       { 12, 12,  30, "Banishing Mirror"},
219       { 15, 15,  30, "Mirror Clashing"},
220       { 19, 13,  30, "Mirror Sleeping"},
221       { 23, 18,  50, "Seeker Ray"},
222
223       { 25, 20,  40, "Seal of Mirror"},
224       { 27, 30,  60, "Shield of Water"},
225       { 29, 30,  60, "Super Ray"},
226       { 31, 35,  60, "Illusion Light"},
227       { 33, 50,  80, "Mirror Shift"},
228
229       { 36, 30,  80, "Mirror Tunnel"},
230       { 38, 40,  70, "Mirror of Recall"},
231       { 40, 50,  55, "Multi-Shadow"},
232       { 43, 55,  70, "Binding Field"},
233       { 46, 70,  75, "Mirror of Ruffnor"},
234 #endif
235       
236     }
237   },
238   
239   {
240     {
241       /* Level gained,  cost,  %fail,  name */
242 #ifdef JP
243       {  1,  1,  20, "暗闇生成"},
244       {  2,  2,  25, "周辺調査"},
245       {  3,  3,  25, "葉隠れ"},
246       {  5,  3,  30, "変わり身"},
247       {  7,  8,  35, "高飛び"},
248       {  8, 10,  35, "一撃離脱"},
249       { 10, 10,  40, "金縛り"},
250       { 12, 12,  70, "古の口伝"},
251       { 15, 10,  50, "浮雲"},
252       { 17, 12,  45, "火遁"},
253       { 18, 20,  40, "入身"},
254       { 20,  5,  50, "八方手裏剣"},
255       { 22, 15,  55, "鎖鎌"},
256       { 25, 32,  60, "煙玉"},
257       { 28, 32,  60, "転身"},
258       { 30, 30,  70, "爆発の紋章"},
259       { 32, 40,  40, "土遁"},
260       { 34, 35,  50, "霧隠れ"},
261       { 38, 40,  60, "煉獄火炎"},
262       { 41, 50,  55, "分身"},
263       { 99,  0,   0, ""},
264 #else
265       {  1,  1,  20, "Create Darkness"},
266       {  2,  2,  25, "Detect Near"},
267       {  3,  3,  25, "Hide in Leafs"},
268       {  5,  3,  30, "Kawarimi"},
269       {  7,  8,  35, "Absconding"},
270       {  8, 10,  35, "Hit and Away"},
271       { 10, 10,  40, "Bind Monster"},
272       { 12, 12,  70, "Ancient Knowledge"},
273       { 15, 10,  50, "Floating"},
274       { 17, 12,  45, "Hide in Flame"},
275       { 18, 20,  40, "Nyusin"},
276       { 20,  5,  50, "Syuriken Spreading"},
277       { 22, 15,  55, "Chain Hook"},
278       { 25, 32,  60, "Smoke Ball"},
279       { 28, 32,  60, "Swap Position"},
280       { 30, 30,  70, "Glyph of Explosion"},
281       { 32, 40,  40, "Hide in Mud"},
282       { 34, 35,  50, "Hide in Mist"},
283       { 38, 40,  60, "Rengoku-Kaen"},
284       { 41, 50,  55, "Bunshin"},
285       { 99,  0,   0, ""},
286 #endif
287       
288     }
289   },
290 };
291
292 /*!
293  * @brief 特殊技能の効果情報をまとめたフォーマットを返す
294  * @param p 情報を返す文字列参照ポインタ
295  * @param use_mind 職業毎の特殊技能ID
296  * @param power モンスター魔法のID
297  * @return なし
298  */
299 void mindcraft_info(char *p, int use_mind, int power)
300 {
301 #ifdef JP
302         cptr s_dam = "損傷:";
303         cptr s_dur = "期間:";
304         cptr s_range = "範囲:";
305 #else
306         cptr s_dam = "dam ";
307         cptr s_dur = "dur ";
308         cptr s_range = "range ";
309 #endif
310         int plev = p_ptr->lev;
311
312         strcpy(p, "");
313
314         switch (use_mind)
315         {
316         case MIND_MINDCRAFTER:
317                 switch (power)
318                 {
319                 case 0:  break;
320                 case 1:  sprintf(p, " %s%dd%d", s_dam, 3 + ((plev - 1) / 4), 3 + plev/15); break;
321                 case 2:  sprintf(p, " %s10", s_range); break;
322                 case 3:  sprintf(p, " %s%d", s_range, plev * 5);  break;
323                 case 4:  break;
324                 case 5: sprintf(p, " %s%dd8", s_dam, 8 + ((plev - 5) / 4));  break;
325                 case 6:  sprintf(p, " %s%d", s_dur, plev);  break;
326                 case 7:  break;
327                 case 8:  sprintf(p, (plev < 25 ? " %s%d" : " %sd%d"), s_dam, (plev < 25 ? plev * 3 / 2 : plev * ((plev - 5) / 10 + 1))); break;
328                 case 9:  sprintf(p, " %s10+d%d", s_dur, plev * 3 / 2);  break;
329 #ifdef JP
330                 case 10: sprintf(p, " 最大重量:%d.%dkg", lbtokg1(plev * 15),lbtokg2(plev * 15));  break;
331 #else
332                 case 10: sprintf(p, " max wgt %d", plev * 15);  break;
333 #endif
334                 case 11: sprintf(p, " %s%dd6", s_dam, plev / 2);  break;
335                 case 12: sprintf(p, " %sd%d+%d", s_dam, plev * 3, plev * 3); break;
336 #ifdef JP
337                 case 13: sprintf(p, " 行動:%ld回", (long int)(p_ptr->csp + 100-p_ptr->energy_need - 50)/100); break;
338 #else
339                 case 13: sprintf(p, " %ld acts.", (p_ptr->csp + 100-p_ptr->energy_need - 50)/100); break;
340 #endif
341                 }
342                 break;
343         case MIND_KI:
344         {
345                 int boost = p_ptr->magic_num1[0];
346
347                 if (heavy_armor()) boost /= 2;
348
349                 switch (power)
350                 {
351                 case 0:  sprintf(p, " %s%dd4", s_dam, 3 + ((plev - 1) / 5) + boost / 12); break;
352                 case 1:  break;
353                 case 2:  sprintf(p, " %s%d+d30", s_dur, 30 + boost / 5); break;
354                 case 3:  sprintf(p, " %s%dd5", s_dam, 5 + ((plev - 1) / 5) + boost / 10); break;
355                 case 4:  sprintf(p, " %s%d+d20", s_dur, 20 + boost / 5); break;
356                 case 5:  break;
357                 case 6:  sprintf(p, " %s%d+d%d", s_dur, 15 + boost / 7, plev / 2); break;
358                 case 7:  sprintf(p, " %s%dd8", s_dam, 8 + ((plev - 5) / 5) + boost / 12); break;
359                 case 8:  sprintf(p, " %s10d6+%d", s_dam, plev * 3 / 2 + boost * 3 / 5); break;
360                 case 9:  break;
361 #ifdef JP
362                 case 10: sprintf(p, " 最大%d体", 1+boost/100); break;
363 #else
364                 case 10: sprintf(p, " max %d", 1+boost/100); break;
365 #endif
366                 case 11: sprintf(p, " %s%d", s_dam, 100 + plev + boost); break;
367                 case 12: sprintf(p, " %s%dd15", s_dam, 10 + plev / 2 + boost * 3 / 10); break;
368 #ifdef JP
369                 case 13: sprintf(p, " 行動:%d+d16回", 16+boost/20); break;
370 #else
371                 case 13: sprintf(p, " %d+d16 acts", 16+boost/20); break;
372 #endif
373                 }
374                 break;
375         }
376         case MIND_MIRROR_MASTER:
377         {
378                 switch (power)
379                 {
380                 case 0:  break;
381                 case 1:  break;
382                 case 2:  sprintf(p, " %s%dd4", s_dam,  3 + ((plev - 1) / 5) ); break;
383                 case 3:  sprintf(p, " %s10", s_range); break;
384                 case 4:  break;
385                 case 5:  sprintf(p, " %s%d", s_range, plev *5); break;
386                 case 6:  sprintf(p, " %s20+d20", s_dur);  break;
387                 case 7:  break;
388                 case 8:  sprintf(p, " %s%dd8", s_dam, 8+((plev -5)/4) ); break;
389                 case 9:  break;
390                 case 10: sprintf(p, " %s%dd8", s_dam, 11+(plev-5)/4 ); break;
391                 case 11: break;
392                 case 12: sprintf(p, " %s20+d20", s_dur);  break;
393                 case 13: sprintf(p, " %s150+d%d", s_dam, plev*2 ); break;
394                 case 14: break;
395                 case 15: break;
396                 case 16: sprintf(p, " %s%d", s_range, plev/2 +10); break;
397                 case 17: break;
398                 case 18: sprintf(p, " %s6+d6", s_dur);  break;
399                 case 19: sprintf(p, " %s%d", s_dam, plev*11+5 ); break;
400                 case 20: sprintf(p, " %s4+d4", s_dur);  break;
401                 }
402                 break;
403         }
404         case MIND_NINJUTSU:
405         {
406                 switch (power)
407                 {
408                 case 0:  break;
409                 case 1:  break;
410                 case 2:  sprintf(p, " %s10", s_range); break;
411                 case 3:  break;
412                 case 4:  sprintf(p, " %s%d", s_range , plev *5); break;
413                 case 5:  sprintf(p, " %s30", s_range); break;
414                 case 6:  break;
415                 case 7:  break;
416                 case 8:  sprintf(p, " %s20+d20", s_dur);  break;
417                 case 9:  sprintf(p, " %s%d", s_dam, (50+plev)/2 ); break;
418                 case 10: break;
419                 case 11: break;
420                 case 12: break;
421                 case 13: break;
422                 case 14: break;
423                 case 15: break;
424                 case 16: sprintf(p, " %s%d+d%d", s_dur, plev/2, plev/2);  break;
425                 case 17: sprintf(p, " %s%d*3", s_dam, (75+plev*2/3)/2 ); break;
426                 case 18: sprintf(p, " %s%dd10", s_dam, 6+plev/8 ); break;
427                 case 19: sprintf(p, " %s6+d6", s_dur);  break;
428                 }
429                 break;
430         }
431         }
432 }
433
434 /*!
435  * @brief 使用可能な特殊技能を選択する /
436  * Allow user to choose a mindcrafter power.
437  * @param sn 選択した特殊技能ID、キャンセルの場合-1、不正な選択の場合-2を返す
438  * @param only_browse 一覧を見るだけの場合TRUEを返す
439  * @return 発動可能な魔法を選択した場合TRUE、キャンセル処理か不正な選択が行われた場合FALSEを返す。
440  * @details
441  * If a valid spell is chosen, saves it in '*sn' and returns TRUE\n
442  * If the user hits escape, returns FALSE, and set '*sn' to -1\n
443  * If there are no legal choices, returns FALSE, and sets '*sn' to -2\n
444  *\n
445  * The "prompt" should be "cast", "recite", or "study"\n
446  * The "known" should be TRUE for cast/pray, FALSE for study\n
447  *\n
448  * nb: This function has a (trivial) display bug which will be obvious\n
449  * when you run it. It's probably easy to fix but I haven't tried,\n
450  * sorry.\n
451  */
452   static int get_mind_power(int *sn, bool only_browse)
453     {
454       int             i;
455       int             num = 0;
456       int             y = 1;
457       int             x = 10;
458       int             minfail = 0;
459       int             plev = p_ptr->lev;
460       int             chance = 0;
461       int             ask = TRUE;
462       char            choice;
463       char            out_val[160];
464       char            comment[80];
465       cptr            p;
466
467       mind_type       spell;
468       mind_power      *mind_ptr;
469       bool            flag, redraw;
470       int             use_mind;
471       int menu_line = (use_menu ? 1 : 0);
472
473       switch(p_ptr->pclass)
474         {
475         case CLASS_MINDCRAFTER:
476           {
477             use_mind = MIND_MINDCRAFTER;
478 #ifdef JP
479             p = "超能力";
480 #else
481             p = "mindcraft";
482 #endif
483             break;
484           }
485         case CLASS_FORCETRAINER:
486           {
487             use_mind = MIND_KI;
488 #ifdef JP
489             p = "練気術";
490 #else
491             p = "Force";
492 #endif
493             break;
494           }
495         case CLASS_BERSERKER:
496           {
497             use_mind = MIND_BERSERKER;
498 #ifdef JP
499             p = "技";
500 #else
501             p = "brutal power";
502 #endif
503             break;
504           }
505         case CLASS_MIRROR_MASTER:
506           {
507             use_mind = MIND_MIRROR_MASTER;
508 #ifdef JP
509             p = "鏡魔法";
510 #else
511             p = "magic";
512 #endif
513             break;
514           }
515         case CLASS_NINJA:
516           {
517             use_mind = MIND_NINJUTSU;
518 #ifdef JP
519             p = "忍術";
520 #else
521             p = "ninjutsu";
522 #endif
523             break;
524           }
525         default:
526           {
527             use_mind = 0;
528 #ifdef JP
529             p = "超能力";
530 #else
531             p = "mindcraft";
532 #endif
533             break;
534           }
535         }
536       mind_ptr = &mind_powers[use_mind];
537
538         /* Assume cancelled */
539       *sn = (-1);
540
541 #ifdef ALLOW_REPEAT /* TNB */
542
543         /* Get the spell, if available */
544         if (repeat_pull(sn))
545         {
546                 /* Hack -- If requested INVEN_FORCE(1111), pull again */
547                 if (*sn == INVEN_FORCE) repeat_pull(sn);
548
549                 /* Verify the spell */
550                 if (mind_ptr->info[*sn].min_lev <= plev)
551                 {
552                         /* Success */
553                         return (TRUE);
554                 }
555         }
556
557 #endif /* ALLOW_REPEAT -- TNB */
558
559       /* Nothing chosen yet */
560       flag = FALSE;
561
562       /* No redraw yet */
563       redraw = FALSE;
564
565       for (i = 0; i < MAX_MIND_POWERS; i++)
566         {
567           if (mind_ptr->info[i].min_lev <= plev)
568             {
569               num++;
570             }
571         }
572
573       /* Build a prompt (accept all spells) */
574       if (only_browse)
575         {
576 #ifdef JP
577           (void) strnfmt(out_val, 78, "(%^s %c-%c, '*'で一覧, ESC) どの%sについて知りますか?",
578 #else
579           (void) strnfmt(out_val, 78, "(%^ss %c-%c, *=List, ESC=exit) Use which %s? ",
580 #endif
581                                        p, I2A(0), I2A(num - 1), p);
582           }
583         else
584           {
585 #ifdef JP
586 (void) strnfmt(out_val, 78, "(%^s %c-%c, '*'で一覧, ESC) どの%sを使いますか?",
587 #else
588                 (void)strnfmt(out_val, 78, "(%^ss %c-%c, *=List, ESC=exit) Use which %s? ",
589 #endif
590                 p, I2A(0), I2A(num - 1), p);
591         }
592
593         if (use_menu && !only_browse) screen_save();
594         /* Get a spell from the user */
595
596         choice= (always_show_list || use_menu) ? ESCAPE:1 ;
597         while (!flag)
598         {
599                 if(choice==ESCAPE) choice = ' '; 
600                 else if( !get_com(out_val, &choice, TRUE) )break;
601
602                 if (use_menu && choice != ' ')
603                 {
604                         switch(choice)
605                         {
606                                 case '0':
607                                 {
608                                         if (!only_browse) screen_load();
609                                         return (FALSE);
610                                 }
611
612                                 case '8':
613                                 case 'k':
614                                 case 'K':
615                                 {
616                                         menu_line += (num - 1);
617                                         break;
618                                 }
619
620                                 case '2':
621                                 case 'j':
622                                 case 'J':
623                                 {
624                                         menu_line++;
625                                         break;
626                                 }
627
628                                 case 'x':
629                                 case 'X':
630                                 case '\r':
631                                 case '\n':
632                                 {
633                                         i = menu_line - 1;
634                                         ask = FALSE;
635                                         break;
636                                 }
637                         }
638                         if (menu_line > num) menu_line -= num;
639                 }
640                 /* Request redraw */
641                 if ((choice == ' ') || (choice == '*') || (choice == '?') || (use_menu && ask))
642                 {
643                         /* Show the list */
644                         if (!redraw || use_menu)
645                         {
646                                 char psi_desc[80];
647                                 bool has_weapon[2];
648
649                                 /* Show list */
650                                 redraw = TRUE;
651
652                                 /* Save the screen */
653                                 if (!only_browse && !use_menu) screen_save();
654
655                                 /* Display a list of spells */
656                                 prt("", y, x);
657 #ifdef JP
658 put_str("名前", y, x + 5);
659 #else
660                                 put_str("Name", y, x + 5);
661 #endif
662
663 #ifdef JP
664 put_str(format("Lv   %s   失率 効果", ((use_mind == MIND_BERSERKER) || (use_mind == MIND_NINJUTSU)) ? "HP" : "MP"), y, x + 35);
665 #else
666 put_str(format("Lv   %s   Fail Info", ((use_mind == MIND_BERSERKER) || (use_mind == MIND_NINJUTSU)) ? "HP" : "MP"), y, x + 35);
667 #endif
668                                 has_weapon[0] = buki_motteruka(INVEN_RARM);
669                                 has_weapon[1] = buki_motteruka(INVEN_LARM);
670
671                                 /* Dump the spells */
672                                 for (i = 0; i < MAX_MIND_POWERS; i++)
673                                 {
674                                         int mana_cost;
675
676                                         /* Access the spell */
677                                         spell = mind_ptr->info[i];
678
679                                         if (spell.min_lev > plev)   break;
680
681                                         chance = spell.fail;
682
683                                         mana_cost = spell.mana_cost;
684                                         if (chance)
685                                         {
686
687                                                 /* Reduce failure rate by "effective" level adjustment */
688                                                 chance -= 3 * (plev - spell.min_lev);
689
690                                                 /* Reduce failure rate by INT/WIS adjustment */
691                                                 chance -= 3 * (adj_mag_stat[p_ptr->stat_ind[mp_ptr->spell_stat]] - 1);
692
693                                                 if (use_mind == MIND_KI)
694                                                 {
695                                                         if (heavy_armor()) chance += 20;
696                                                         if (p_ptr->icky_wield[0]) chance += 20;
697                                                         else if (has_weapon[0]) chance += 10;
698                                                         if (p_ptr->icky_wield[1]) chance += 20;
699                                                         else if (has_weapon[1]) chance += 10;
700                                                         if (i == 5)
701                                                         {
702                                                                 int j;
703                                                                 for (j = 0; j < p_ptr->magic_num1[0] / 50; j++)
704                                                                         mana_cost += (j+1) * 3 / 2;
705                                                         }
706                                                 }
707
708                                                 /* Not enough mana to cast */
709                                                 if ((use_mind != MIND_BERSERKER) && (use_mind != MIND_NINJUTSU) && (mana_cost > p_ptr->csp))
710                                                 {
711                                                         chance += 5 * (mana_cost - p_ptr->csp);
712                                                 }
713
714                                                 chance += p_ptr->to_m_chance;
715
716                                                 /* Extract the minimum failure rate */
717                                                 minfail = adj_mag_fail[p_ptr->stat_ind[mp_ptr->spell_stat]];
718
719                                                 /* Minimum failure rate */
720                                                 if (chance < minfail) chance = minfail;
721
722                                                 /* Stunning makes spells harder */
723                                                 if (p_ptr->stun > 50) chance += 25;
724                                                 else if (p_ptr->stun) chance += 15;
725
726                                                 if (use_mind == MIND_KI)
727                                                 {
728                                                         if (heavy_armor()) chance += 5;
729                                                         if (p_ptr->icky_wield[0]) chance += 5;
730                                                         if (p_ptr->icky_wield[1]) chance += 5;
731                                                 }
732                                                 /* Always a 5 percent chance of working */
733                                                 if (chance > 95) chance = 95;
734                                         }
735
736                                         /* Get info */
737                                         mindcraft_info(comment, use_mind, i);
738
739                                         if (use_menu)
740                                         {
741 #ifdef JP
742                                                 if (i == (menu_line-1)) strcpy(psi_desc, "  》 ");
743 #else
744                                                 if (i == (menu_line-1)) strcpy(psi_desc, "  >  ");
745 #endif
746                                                 else strcpy(psi_desc, "     ");
747                                         }
748                                         else
749                                                 sprintf(psi_desc, "  %c) ",I2A(i));
750                                         /* Dump the spell --(-- */
751                                         strcat(psi_desc,
752                                                format("%-30s%2d %4d%s %3d%%%s",
753                                                       spell.name, spell.min_lev, mana_cost,
754 #ifdef JP
755                                                       (((use_mind == MIND_MINDCRAFTER) && (i == 13)) ? "~" : "  "), 
756 #else
757                                                       (((use_mind == MIND_MINDCRAFTER) && (i == 13)) ? "~ " : "  "), 
758 #endif
759                                                       chance, comment));
760                                         prt(psi_desc, y + i + 1, x);
761                                 }
762
763                                 /* Clear the bottom line */
764                                 prt("", y + i + 1, x);
765                         }
766
767                         /* Hide the list */
768                         else if (!only_browse)
769                         {
770                                 /* Hide list */
771                                 redraw = FALSE;
772
773                                 /* Restore the screen */
774                                 screen_load();
775                         }
776
777                         /* Redo asking */
778                         continue;
779                 }
780
781                 if (!use_menu)
782                 {
783                         /* Note verify */
784                         ask = isupper(choice);
785
786                         /* Lowercase */
787                         if (ask) choice = tolower(choice);
788
789                         /* Extract request */
790                         i = (islower(choice) ? A2I(choice) : -1);
791                 }
792
793                 /* Totally Illegal */
794                 if ((i < 0) || (i >= num))
795                 {
796                         bell();
797                         continue;
798                 }
799
800                 /* Save the spell index */
801                 spell = mind_ptr->info[i];
802
803                 /* Verify it */
804                 if (ask)
805                 {
806                         char tmp_val[160];
807
808                         /* Prompt */
809 #ifdef JP
810 (void) strnfmt(tmp_val, 78, "%sを使いますか?", spell.name);
811 #else
812                         (void)strnfmt(tmp_val, 78, "Use %s? ", spell.name);
813 #endif
814
815
816                         /* Belay that order */
817                         if (!get_check(tmp_val)) continue;
818                 }
819
820                 /* Stop the loop */
821                 flag = TRUE;
822         }
823
824         /* Restore the screen */
825         if (redraw && !only_browse) screen_load();
826
827         /* Show choices */
828         p_ptr->window |= (PW_SPELL);
829
830         /* Window stuff */
831         window_stuff();
832
833         /* Abort if needed */
834         if (!flag) return (FALSE);
835
836         /* Save the choice */
837         (*sn) = i;
838
839 #ifdef ALLOW_REPEAT /* TNB */
840
841         repeat_push(*sn);
842
843 #endif /* ALLOW_REPEAT -- TNB */
844
845         /* Success */
846         return (TRUE);
847 }
848
849 /*!
850  * @brief 超能力の発動 /
851  * do_cmd_cast calls this function if the player's class is 'mindcrafter'.
852  * @param spell 発動する特殊技能のID
853  * @return 処理を実行したらTRUE、キャンセルした場合FALSEを返す。
854  */
855 static bool cast_mindcrafter_spell(int spell)
856 {
857         int             b = 0;
858         int             dir;
859         int             plev = p_ptr->lev;
860
861         /* spell code */
862         switch (spell)
863         {
864         case 0:   /* Precog */
865                 if (plev > 44)
866                 {
867                         chg_virtue(V_KNOWLEDGE, 1);
868                         chg_virtue(V_ENLIGHTEN, 1);
869                         wiz_lite(FALSE);
870                 }
871                 else if (plev > 19)
872                         map_area(DETECT_RAD_MAP);
873
874                 if (plev < 30)
875                 {
876                         b = detect_monsters_normal(DETECT_RAD_DEFAULT);
877                         if (plev > 14) b |= detect_monsters_invis(DETECT_RAD_DEFAULT);
878                         if (plev > 4)  {
879                                 b |= detect_traps(DETECT_RAD_DEFAULT, TRUE);
880                                 b |= detect_doors(DETECT_RAD_DEFAULT);
881                         }
882                 }
883                 else
884                 {
885                         b = detect_all(DETECT_RAD_DEFAULT);
886                 }
887
888                 if ((plev > 24) && (plev < 40))
889                         set_tim_esp(plev, FALSE);
890
891 #ifdef JP
892 if (!b) msg_print("安全な気がする。");
893 #else
894                 if (!b) msg_print("You feel safe.");
895 #endif
896
897                 break;
898         case 1:
899                 /* Mindblast */
900                 if (!get_aim_dir(&dir)) return FALSE;
901
902                 if (randint1(100) < plev * 2)
903                         fire_beam(GF_PSI, dir, damroll(3 + ((plev - 1) / 4), (3 + plev / 15)));
904                 else
905                         fire_ball(GF_PSI, dir, damroll(3 + ((plev - 1) / 4), (3 + plev / 15)), 0);
906                 break;
907         case 2:
908                 /* Minor displace */
909                 teleport_player(10, 0L);
910                 break;
911         case 3:
912                 /* Major displace */
913                 teleport_player(plev * 5, 0L);
914                 break;
915         case 4:
916                 /* Domination */
917                 if (plev < 30)
918                 {
919                         if (!get_aim_dir(&dir)) return FALSE;
920
921                         fire_ball(GF_DOMINATION, dir, plev, 0);
922                 }
923                 else
924                 {
925                         charm_monsters(plev * 2);
926                 }
927                 break;
928         case 5:
929                 /* Fist of Force  ---  not 'true' TK  */
930                 if (!get_aim_dir(&dir)) return FALSE;
931
932                 fire_ball(GF_TELEKINESIS, dir, damroll(8 + ((plev - 5) / 4), 8),
933                         (plev > 20 ? (plev - 20) / 8 + 1 : 0));
934                 break;
935         case 6:
936                 /* Character Armour */
937                 set_shield(plev, FALSE);
938                 if (plev > 14) set_oppose_acid(plev, FALSE);
939                 if (plev > 19) set_oppose_fire(plev, FALSE);
940                 if (plev > 24) set_oppose_cold(plev, FALSE);
941                 if (plev > 29) set_oppose_elec(plev, FALSE);
942                 if (plev > 34) set_oppose_pois(plev, FALSE);
943                 break;
944         case 7:
945                 /* Psychometry */
946                 if (plev < 25)
947                         return psychometry();
948                 else
949                         return ident_spell(FALSE);
950         case 8:
951                 /* Mindwave */
952 #ifdef JP
953 msg_print("精神を捻じ曲げる波動を発生させた!");
954 #else
955                 msg_print("Mind-warping forces emanate from your brain!");
956 #endif
957
958                 if (plev < 25)
959                         project(0, 2 + plev / 10, py, px,
960                         (plev * 3), GF_PSI, PROJECT_KILL, -1);
961                 else
962                         (void)mindblast_monsters(randint1(plev * ((plev - 5) / 10 + 1)));
963                 break;
964         case 9:
965                 /* Adrenaline */
966                 set_afraid(0);
967                 set_stun(0);
968
969                 /*
970                  * Only heal when Adrenalin Channeling is not active. We check
971                  * that by checking if the player isn't fast and 'heroed' atm.
972                  */
973                 if (!IS_FAST() || !IS_HERO())
974                 {
975                         hp_player(plev);
976                 }
977
978                 b = 10 + randint1((plev * 3) / 2);
979                 set_hero(b, FALSE);
980                 /* Haste */
981                 (void)set_fast(b, FALSE);
982                 break;
983         case 10:
984                 /* Telekinesis */
985                 if (!get_aim_dir(&dir)) return FALSE;
986
987                 fetch(dir, plev * 15, FALSE);
988
989                 break;
990         case 11:
991                 /* Psychic Drain */
992                 if (!get_aim_dir(&dir)) return FALSE;
993
994                 b = damroll(plev / 2, 6);
995
996                 /* This is always a radius-0 ball now */
997                 if (fire_ball(GF_PSI_DRAIN, dir, b, 0))
998                         p_ptr->energy_need += randint1(150);
999                 break;
1000         case 12:
1001                 /* psycho-spear */
1002                 if (!get_aim_dir(&dir)) return FALSE;
1003
1004                 fire_beam(GF_PSY_SPEAR, dir, randint1(plev*3)+plev*3);
1005                 break;
1006         case 13:
1007         {
1008                 if (world_player)
1009                 {
1010 #ifdef JP
1011                         msg_print("既に時は止まっている。");
1012 #else
1013                         msg_print("Time is already stopped.");
1014 #endif
1015                         return (FALSE);
1016                 }
1017                 world_player = TRUE;
1018 #ifdef JP
1019                 msg_print("「時よ!」");
1020 #else
1021                 msg_print("You yell 'Time!'");
1022 #endif
1023                 msg_print(NULL);
1024
1025                 /* Hack */
1026                 p_ptr->energy_need -= 1000 + (100 + p_ptr->csp - 50)*TURNS_PER_TICK/10;
1027
1028                 /* Redraw map */
1029                 p_ptr->redraw |= (PR_MAP);
1030
1031                 /* Update monsters */
1032                 p_ptr->update |= (PU_MONSTERS);
1033
1034                 /* Window stuff */
1035                 p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
1036
1037                 handle_stuff();
1038                 break;
1039         }
1040         default:
1041 #ifdef JP
1042 msg_print("なに?");
1043 #else
1044                 msg_print("Zap?");
1045 #endif
1046
1047         }
1048
1049         return TRUE;
1050 }
1051
1052 /*!
1053  * @brief 練気術の発動 /
1054  * do_cmd_cast calls this function if the player's class is 'ForceTrainer'.
1055  * @param spell 発動する特殊技能のID
1056  * @return 処理を実行したらTRUE、キャンセルした場合FALSEを返す。
1057  */
1058 static bool cast_force_spell(int spell)
1059 {
1060         int             dir;
1061         int             plev = p_ptr->lev;
1062         int             boost = p_ptr->magic_num1[0];
1063
1064         if (heavy_armor()) boost /= 2;
1065
1066         /* spell code */
1067         switch (spell)
1068         {
1069         case 0:
1070                 if (!get_aim_dir(&dir)) return FALSE;
1071                 fire_ball(GF_MISSILE, dir, damroll(3 + ((plev - 1) / 5) + boost / 12, 4), 0);
1072                 break;
1073         case 1:
1074                 (void)lite_area(damroll(2, (plev / 2)), (plev / 10) + 1);
1075                 break;
1076         case 2:
1077                 set_tim_levitation(randint1(30) + 30 + boost / 5, FALSE);
1078                 break;
1079         case 3:
1080                 project_length = plev / 8 + 3;
1081                 if (!get_aim_dir(&dir)) return FALSE;
1082
1083                 fire_beam(GF_MISSILE, dir, damroll(5 + ((plev - 1) / 5) + boost / 10, 5));
1084                 break;
1085         case 4:
1086                 set_resist_magic(randint1(20) + 20 + boost / 5, FALSE);
1087                 break;
1088         case 5:
1089 #ifdef JP
1090                 msg_print("気を練った。");
1091 #else
1092                 msg_print("You improved the Force.");
1093 #endif
1094                 p_ptr->magic_num1[0] += (70 + plev);
1095                 p_ptr->update |= (PU_BONUS);
1096                 if (randint1(p_ptr->magic_num1[0]) > (plev * 4 + 120))
1097                 {
1098 #ifdef JP
1099                         msg_print("気が暴走した!");
1100 #else
1101                         msg_print("The Force exploded!");
1102 #endif
1103                         fire_ball(GF_MANA, 0, p_ptr->magic_num1[0] / 2, 10);
1104 #ifdef JP
1105                         take_hit(DAMAGE_LOSELIFE, p_ptr->magic_num1[0] / 2, "気の暴走", -1);
1106 #else
1107                         take_hit(DAMAGE_LOSELIFE, p_ptr->magic_num1[0] / 2, "Explosion of the Force", -1);
1108 #endif
1109                 }
1110                 else return TRUE;
1111                 break;
1112         case 6:
1113                 set_tim_sh_touki(randint1(plev / 2) + 15 + boost / 7, FALSE);
1114                 break;
1115         case 7:
1116         {
1117                 int y, x, dam;
1118                 project_length = 1;
1119                 if (!get_aim_dir(&dir)) return FALSE;
1120
1121                 y = py + ddy[dir];
1122                 x = px + ddx[dir];
1123                 dam = damroll(8 + ((plev - 5) / 4) + boost / 12, 8);
1124                 fire_beam(GF_MISSILE, dir, dam);
1125                 if (cave[y][x].m_idx)
1126                 {
1127                         int i;
1128                         int ty = y, tx = x;
1129                         int oy = y, ox = x;
1130                         int m_idx = cave[y][x].m_idx;
1131                         monster_type *m_ptr = &m_list[m_idx];
1132                         monster_race *r_ptr = &r_info[m_ptr->r_idx];
1133                         char m_name[80];
1134
1135                         monster_desc(m_name, m_ptr, 0);
1136
1137                         if (randint1(r_ptr->level * 3 / 2) > randint0(dam / 2) + dam/2)
1138                         {
1139 #ifdef JP
1140                                 msg_format("%sは飛ばされなかった。", m_name);
1141 #else
1142                                 msg_format("%^s was not blown away.", m_name);
1143 #endif
1144                         }
1145                         else
1146                         {
1147                                 for (i = 0; i < 5; i++)
1148                                 {
1149                                         y += ddy[dir];
1150                                         x += ddx[dir];
1151                                         if (cave_empty_bold(y, x))
1152                                         {
1153                                                 ty = y;
1154                                                 tx = x;
1155                                         }
1156                                         else break;
1157                                 }
1158                                 if ((ty != oy) || (tx != ox))
1159                                 {
1160 #ifdef JP
1161                                         msg_format("%sを吹き飛ばした!", m_name);
1162 #else
1163                                         msg_format("You blow %s away!", m_name);
1164 #endif
1165                                         cave[oy][ox].m_idx = 0;
1166                                         cave[ty][tx].m_idx = m_idx;
1167                                         m_ptr->fy = ty;
1168                                         m_ptr->fx = tx;
1169
1170                                         update_mon(m_idx, TRUE);
1171                                         lite_spot(oy, ox);
1172                                         lite_spot(ty, tx);
1173
1174                                         if (r_ptr->flags7 & (RF7_LITE_MASK | RF7_DARK_MASK))
1175                                                 p_ptr->update |= (PU_MON_LITE);
1176                                 }
1177                         }
1178                 }
1179                 break;
1180         }
1181         case 8:
1182                 if (!get_aim_dir(&dir)) return FALSE;
1183                 fire_ball(GF_MISSILE, dir, damroll(10, 6) + plev * 3 / 2 + boost * 3 / 5, (plev < 30) ? 2 : 3);
1184                 break;
1185         case 9:
1186         {
1187                 int m_idx;
1188
1189                 if (!target_set(TARGET_KILL)) return FALSE;
1190                 m_idx = cave[target_row][target_col].m_idx;
1191                 if (!m_idx) break;
1192                 if (!player_has_los_bold(target_row, target_col)) break;
1193                 if (!projectable(py, px, target_row, target_col)) break;
1194                 dispel_monster_status(m_idx);
1195                 break;
1196         }
1197         case 10:
1198         {
1199                 int i;
1200                 bool success = FALSE;
1201
1202                 for (i = 0; i < 1 + boost/100; i++)
1203                         if (summon_specific(-1, py, px, plev, SUMMON_PHANTOM, PM_FORCE_PET))
1204                                 success = TRUE;
1205                 if (success)
1206                 {
1207 #ifdef JP
1208 msg_print("御用でございますが、御主人様?");
1209 #else
1210                         msg_print("'Your wish, master?'");
1211 #endif
1212                 }
1213                 else
1214                 {
1215 #ifdef JP
1216                         msg_print("何も現れなかった。");
1217 #else
1218                         msg_print("Nothing happen.");
1219 #endif
1220                 }
1221                 break;
1222         }
1223         case 11:
1224                 fire_ball(GF_FIRE, 0, 200 + (2 * plev) + boost * 2, 10);
1225                 break;
1226         case 12:
1227                 if (!get_aim_dir(&dir)) return FALSE;
1228
1229                 fire_beam(GF_MANA, dir, damroll(10 + (plev / 2) + boost * 3 / 10, 15));
1230                 break;
1231         case 13:
1232                 set_lightspeed(randint1(16) + 16 + boost / 20, FALSE);
1233                 break;
1234         default:
1235 #ifdef JP
1236 msg_print("なに?");
1237 #else
1238                 msg_print("Zap?");
1239 #endif
1240
1241         }
1242         p_ptr->magic_num1[0] = 0;
1243         p_ptr->update |= (PU_BONUS);
1244
1245         return TRUE;
1246 }
1247
1248
1249 /*!
1250  * @brief 現在フロアに存在している鏡の数を数える / calculate mirrors
1251  * @return 鏡の枚数
1252  */
1253 static int number_of_mirrors( void )
1254 {
1255   int x,y;
1256   int val=0;
1257   for( x=0 ; x < cur_wid ; x++ ){
1258     for( y=0 ; y < cur_hgt ; y++ ){
1259       if (is_mirror_grid(&cave[y][x])) val++;
1260     }
1261   }
1262   return val;
1263 }
1264
1265 /*!
1266  * @brief 鏡魔法の発動 /
1267  * do_cmd_cast calls this function if the player's class is 'Mirror magic'.
1268  * @param spell 発動する特殊技能のID
1269  * @return 処理を実行したらTRUE、キャンセルした場合FALSEを返す。
1270  */
1271 static bool cast_mirror_spell(int spell)
1272 {
1273         int             dir;
1274         int             plev = p_ptr->lev;
1275         int             tmp;
1276         int             x,y;
1277
1278         /* spell code */
1279         switch (spell)
1280         {
1281         /* mirror of seeing */
1282         case 0:
1283           tmp = is_mirror_grid(&cave[py][px]) ? 4 : 0;
1284           if( plev + tmp > 4)detect_monsters_normal(DETECT_RAD_DEFAULT);
1285           if( plev + tmp > 18 )detect_monsters_invis(DETECT_RAD_DEFAULT);
1286           if( plev + tmp > 28 )set_tim_esp(plev,FALSE);
1287           if( plev + tmp > 38 )map_area(DETECT_RAD_MAP);
1288           if( tmp == 0 && plev < 5 ){
1289 #ifdef JP
1290             msg_print("鏡がなくて集中できなかった!");
1291 #else
1292             msg_print("You need a mirror to concentrate!");
1293 #endif
1294           }
1295           break;
1296         /* drip of light */
1297         case 1:
1298           if( number_of_mirrors() < 4 + plev/10 ){
1299             place_mirror();
1300           }
1301           else {
1302 #ifdef JP
1303 msg_format("これ以上鏡は制御できない!");
1304 #else
1305 msg_format("There are too many mirrors to control!");
1306 #endif
1307           }
1308           break;
1309         case 2:
1310           if (!get_aim_dir(&dir)) return FALSE;
1311           if ( plev > 9 && is_mirror_grid(&cave[py][px]) ) {
1312             fire_beam(GF_LITE, dir,damroll(3+((plev-1)/5),4));
1313           }
1314           else {
1315             fire_bolt(GF_LITE, dir,damroll(3+((plev-1)/5),4));
1316           }
1317           break;
1318         /* warped mirror */
1319         case 3:
1320           teleport_player(10, 0L);
1321           break;
1322         /* mirror of light */
1323         case 4:
1324           (void)lite_area(damroll(2, (plev / 2)), (plev / 10) + 1);
1325           break;
1326         /* mirror of wandering */
1327         case 5:
1328           teleport_player(plev * 5, 0L);
1329           break;
1330         /* robe of dust */
1331         case 6:
1332           set_dustrobe(20+randint1(20),FALSE);
1333           break;
1334         /* banishing mirror */
1335         case 7:
1336           if (!get_aim_dir(&dir)) return FALSE;
1337           (void)fire_beam(GF_AWAY_ALL, dir , plev);
1338           break;
1339         /* mirror clashing */
1340         case 8:
1341           if (!get_aim_dir(&dir)) return FALSE;
1342           fire_ball(GF_SHARDS, dir, damroll(8 + ((plev - 5) / 4), 8),
1343                     (plev > 20 ? (plev - 20) / 8 + 1 : 0));
1344           break;
1345         /* mirror sleeping */
1346         case 9:
1347           for(x=0;x<cur_wid;x++){
1348             for(y=0;y<cur_hgt;y++){
1349               if (is_mirror_grid(&cave[y][x])) {
1350                 project(0,2,y,x,plev,GF_OLD_SLEEP,(PROJECT_GRID|PROJECT_ITEM|PROJECT_KILL|PROJECT_JUMP|PROJECT_NO_HANGEKI),-1);
1351               }
1352             }
1353           }
1354           break;
1355         /* seeker ray */
1356         case 10:
1357           if (!get_aim_dir(&dir)) return FALSE;
1358           fire_beam(GF_SEEKER,dir, damroll(11+(plev-5)/4,8));
1359           break;
1360         /* seal of mirror */
1361         case 11:
1362           seal_of_mirror(plev*4+100);
1363           break;
1364         /* shield of water */
1365         case 12:
1366           tmp = 20+randint1(20);
1367           set_shield(tmp, FALSE);
1368           if( plev > 31 )set_tim_reflect(tmp, FALSE);
1369           if( plev > 39 )set_resist_magic(tmp,FALSE);
1370           break;
1371         /* super ray */
1372         case 13:
1373           if (!get_aim_dir(&dir)) return FALSE;
1374           fire_beam(GF_SUPER_RAY,dir, 150+randint1(2*plev));
1375           break;
1376         /* illusion light */
1377         case 14:
1378           tmp = is_mirror_grid(&cave[py][px]) ? 4 : 3;
1379           slow_monsters(plev);
1380           stun_monsters(plev*tmp);
1381           confuse_monsters(plev*tmp);
1382           turn_monsters(plev*tmp);
1383           stun_monsters(plev*tmp);
1384           stasis_monsters(plev*tmp);
1385           break;
1386         /* mirror shift */
1387         case 15:
1388           if( !is_mirror_grid(&cave[py][px]) ){
1389 #ifdef JP
1390                 msg_print("鏡の国の場所がわからない!");
1391 #else
1392                 msg_print("You cannot find out where is the world of mirror!");
1393 #endif
1394                 break;
1395           }
1396           alter_reality();
1397           break;
1398         /* mirror tunnel */
1399         case 16:
1400 #ifdef JP
1401           msg_print("鏡の世界を通り抜け…  ");
1402 #else
1403           msg_print("Go through the world of mirror...");
1404 #endif
1405           return mirror_tunnel();
1406
1407         /* mirror of recall */
1408         case 17:
1409                 return word_of_recall();
1410         /* multi-shadow */
1411         case 18:
1412           set_multishadow(6+randint1(6),FALSE);
1413           break;
1414         /* binding field */
1415         case 19:
1416 #ifdef JP
1417           if( !binding_field(plev*11+5) )msg_print("適当な鏡を選べなかった!");
1418 #else
1419           if( !binding_field(plev*11+5) )msg_print("You were not able to choose suitable mirrors!");
1420 #endif
1421           break;
1422         /* mirror of Ruffnor */
1423         case 20:
1424           (void)set_invuln(randint1(4)+4,FALSE);
1425           break;
1426         default:
1427 #ifdef JP
1428 msg_print("なに?");
1429 #else
1430                 msg_print("Zap?");
1431 #endif
1432
1433         }
1434         p_ptr->magic_num1[0] = 0;
1435
1436         return TRUE;
1437 }
1438
1439 /*!
1440  * @brief 怒りの発動 /
1441  * do_cmd_cast calls this function if the player's class is 'berserker'.
1442  * @param spell 発動する特殊技能のID
1443  * @return 処理を実行したらTRUE、キャンセルした場合FALSEを返す。
1444  */
1445 static bool cast_berserk_spell(int spell)
1446 {
1447         int y, x;
1448         int dir;
1449
1450         /* spell code */
1451         switch (spell)
1452         {
1453         case 0:
1454                 detect_monsters_mind(DETECT_RAD_DEFAULT);
1455                 break;
1456         case 1:
1457         {
1458                 if (p_ptr->riding)
1459                 {
1460 #ifdef JP
1461                         msg_print("乗馬中には無理だ。");
1462 #else
1463                         msg_print("You cannot do it when riding.");
1464 #endif
1465                         return FALSE;
1466                 }
1467
1468                 if (!get_rep_dir2(&dir)) return FALSE;
1469
1470                 if (dir == 5) return FALSE;
1471                 y = py + ddy[dir];
1472                 x = px + ddx[dir];
1473
1474                 if (!cave[y][x].m_idx)
1475                 {
1476 #ifdef JP
1477                         msg_print("その方向にはモンスターはいません。");
1478 #else
1479                         msg_print("There is no monster.");
1480 #endif
1481                         return FALSE;
1482                 }
1483
1484                 py_attack(y, x, 0);
1485
1486                 if (!player_can_enter(cave[y][x].feat, 0) || is_trap(cave[y][x].feat))
1487                         break;
1488
1489                 y += ddy[dir];
1490                 x += ddx[dir];
1491
1492                 if (player_can_enter(cave[y][x].feat, 0) && !is_trap(cave[y][x].feat) && !cave[y][x].m_idx)
1493                 {
1494                         msg_print(NULL);
1495
1496                         /* Move the player */
1497                         (void)move_player_effect(y, x, MPE_FORGET_FLOW | MPE_HANDLE_STUFF | MPE_DONT_PICKUP);
1498                 }
1499                 break;
1500         }
1501         case 2:
1502         {
1503                 if (!get_rep_dir2(&dir)) return FALSE;
1504                 y = py + ddy[dir];
1505                 x = px + ddx[dir];
1506                 move_player(dir, easy_disarm, TRUE);
1507                 break;
1508         }
1509         case 3:
1510                 earthquake(py, px, 8+randint0(5));
1511                 break;
1512         case 4:
1513                 massacre(py, px);
1514                 break;
1515         default:
1516 #ifdef JP
1517 msg_print("なに?");
1518 #else
1519                 msg_print("Zap?");
1520 #endif
1521
1522         }
1523         return TRUE;
1524 }
1525
1526 /*!
1527  * @brief 忍術の発動 /
1528  * do_cmd_cast calls this function if the player's class is 'ninja'.
1529  * @param spell 発動する特殊技能のID
1530  * @return 処理を実行したらTRUE、キャンセルした場合FALSEを返す。
1531  */
1532 static bool cast_ninja_spell(int spell)
1533 {
1534         int x, y;
1535         int dir;
1536         int plev = p_ptr->lev;
1537
1538         /* spell code */
1539         switch (spell)
1540         {
1541         case 0:
1542                 (void)unlite_area(0, 3);
1543                 break;
1544         case 1:
1545                 if (plev > 44)
1546                 {
1547                         wiz_lite(TRUE);
1548                 }
1549                 detect_monsters_normal(DETECT_RAD_DEFAULT);
1550                 if (plev > 4)
1551                 {
1552                         detect_traps(DETECT_RAD_DEFAULT, TRUE);
1553                         detect_doors(DETECT_RAD_DEFAULT);
1554                         detect_stairs(DETECT_RAD_DEFAULT);
1555                 }
1556                 if (plev > 14)
1557                 {
1558                         detect_objects_normal(DETECT_RAD_DEFAULT);
1559                 }
1560                 break;
1561         case 2:
1562         {
1563                 teleport_player(10, 0L);
1564                 break;
1565         }
1566         case 3:
1567         {
1568                 if (!(p_ptr->special_defense & NINJA_KAWARIMI))
1569                 {
1570 #ifdef JP
1571                         msg_print("敵の攻撃に対して敏感になった。");
1572 #else
1573                         msg_print("You are now prepare to evade any attacks.");
1574 #endif
1575
1576                         p_ptr->special_defense |= NINJA_KAWARIMI;
1577                         p_ptr->redraw |= (PR_STATUS);
1578                 }
1579                 break;
1580         }
1581         case 4:
1582         {
1583                 teleport_player(p_ptr->lev * 5, 0L);
1584                 break;
1585         }
1586         case 5:
1587         {
1588                 if (!get_rep_dir(&dir, FALSE)) return FALSE;
1589                 y = py + ddy[dir];
1590                 x = px + ddx[dir];
1591                 if (cave[y][x].m_idx)
1592                 {
1593                         py_attack(y, x, 0);
1594                         if (randint0(p_ptr->skill_dis) < 7)
1595 #ifdef JP
1596 msg_print("うまく逃げられなかった。");
1597 #else
1598                                 msg_print("You failed to run away.");
1599 #endif
1600                         else
1601                         {
1602                                 teleport_player(30, 0L);
1603                         }
1604                 }
1605                 else
1606                 {
1607 #ifdef JP
1608 msg_print("その方向にはモンスターはいません。");
1609 #else
1610                         msg_print("You don't see any monster in this direction");
1611 #endif
1612
1613                         msg_print(NULL);
1614                 }
1615                 break;
1616         }
1617         case 6:
1618         {
1619                 if (!get_aim_dir(&dir)) return FALSE;
1620                 (void)stasis_monster(dir);
1621                 break;
1622         }
1623         case 7:
1624                 return ident_spell(FALSE);
1625         case 8:
1626                 set_tim_levitation(randint1(20) + 20, FALSE);
1627                 break;
1628         case 9:
1629                 fire_ball(GF_FIRE, 0, 50+plev, plev/10+2);
1630                 teleport_player(30, 0L);
1631                 set_oppose_fire(plev, FALSE);
1632                 break;
1633         case 10:
1634                 return rush_attack(NULL);
1635         case 11:
1636         {
1637                 int i;
1638                 for (i = 0; i < 8; i++)
1639                 {
1640                         int slot;
1641
1642                         for (slot = 0; slot < INVEN_PACK; slot++)
1643                         {
1644                                 if (inventory[slot].tval == TV_SPIKE) break;
1645                         }
1646                         if (slot == INVEN_PACK)
1647                         {
1648 #ifdef JP
1649                                 if (!i) msg_print("くさびを持っていない。");
1650                                 else msg_print("くさびがなくなった。");
1651 #else
1652                                 if (!i) msg_print("You have no Iron Spikes.");
1653                                 else msg_print("You have no more Iron Spikes.");
1654 #endif
1655                                 return FALSE;
1656                         }
1657
1658                         /* Gives a multiplier of 2 at first, up to 3 at 40th */
1659                         do_cmd_throw_aux(1, FALSE, slot);
1660
1661                         energy_use = 100;
1662                 }
1663                 break;
1664         }
1665         case 12:
1666         {
1667                 monster_type *m_ptr;
1668                 int m_idx;
1669                 char m_name[80];
1670                 int i;
1671                 int path_n;
1672                 u16b path_g[512];
1673                 int ty,tx;
1674
1675                 if (!target_set(TARGET_KILL)) return FALSE;
1676                 m_idx = cave[target_row][target_col].m_idx;
1677                 if (!m_idx) break;
1678                 if (m_idx == p_ptr->riding) break;
1679                 if (!player_has_los_bold(target_row, target_col)) break;
1680                 if (!projectable(py, px, target_row, target_col)) break;
1681                 m_ptr = &m_list[m_idx];
1682                 monster_desc(m_name, m_ptr, 0);
1683 #ifdef JP
1684                 msg_format("%sを引き戻した。", m_name);
1685 #else
1686                 msg_format("You pull back %s.", m_name);
1687 #endif
1688
1689                 path_n = project_path(path_g, MAX_RANGE, target_row, target_col, py, px, 0);
1690                 ty = target_row, tx = target_col;
1691                 for (i = 1; i < path_n; i++)
1692                 {
1693                         int ny = GRID_Y(path_g[i]);
1694                         int nx = GRID_X(path_g[i]);
1695                         cave_type *c_ptr = &cave[ny][nx];
1696
1697                         if (in_bounds(ny, nx) && cave_empty_bold(ny, nx) &&
1698                             !(c_ptr->info & CAVE_OBJECT) &&
1699                                 !pattern_tile(ny, nx))
1700                         {
1701                                 ty = ny;
1702                                 tx = nx;
1703                         }
1704                 }
1705                 /* Update the old location */
1706                 cave[target_row][target_col].m_idx = 0;
1707
1708                 /* Update the new location */
1709                 cave[ty][tx].m_idx = m_idx;
1710
1711                 /* Move the monster */
1712                 m_ptr->fy = ty;
1713                 m_ptr->fx = tx;
1714
1715                 /* Wake the monster up */
1716                 (void)set_monster_csleep(m_idx, 0);
1717
1718                 /* Update the monster (new location) */
1719                 update_mon(m_idx, TRUE);
1720
1721                 /* Redraw the old grid */
1722                 lite_spot(target_row, target_col);
1723
1724                 /* Redraw the new grid */
1725                 lite_spot(ty, tx);
1726
1727                 if (r_info[m_ptr->r_idx].flags7 & (RF7_LITE_MASK | RF7_DARK_MASK))
1728                         p_ptr->update |= (PU_MON_LITE);
1729
1730                 if (m_ptr->ml)
1731                 {
1732                         /* Auto-Recall if possible and visible */
1733                         if (!p_ptr->image) monster_race_track(m_ptr->ap_r_idx);
1734
1735                         /* Track a new monster */
1736                         health_track(m_idx);
1737                 }
1738
1739                 break;
1740         }
1741         case 13:
1742                 if (!get_aim_dir(&dir)) return FALSE;
1743                 fire_ball(GF_OLD_CONF, dir, plev*3, 3);
1744                 break;
1745         case 14:
1746                 project_length = -1;
1747                 if (!get_aim_dir(&dir))
1748                 {
1749                         project_length = 0;
1750                         return FALSE;
1751                 }
1752                 project_length = 0;
1753
1754                 (void)teleport_swap(dir);
1755                 break;
1756         case 15:
1757                 explosive_rune();
1758                 break;
1759         case 16:
1760                 (void)set_kabenuke(randint1(plev/2) + plev/2, FALSE);
1761                 set_oppose_acid(plev, FALSE);
1762                 break;
1763         case 17:
1764                 fire_ball(GF_POIS, 0, 75+plev*2/3, plev/5+2);
1765                 fire_ball(GF_OLD_DRAIN, 0, 75+plev*2/3, plev/5+2);
1766                 fire_ball(GF_CONFUSION, 0, 75+plev*2/3, plev/5+2);
1767                 teleport_player(30, 0L);
1768                 break;
1769         case 18:
1770         {
1771                 int k;
1772                 int num = damroll(3, 9);
1773
1774                 for (k = 0; k < num; k++)
1775                 {
1776                         int typ = one_in_(2) ? GF_FIRE : one_in_(3) ? GF_NETHER : GF_PLASMA;
1777                         int attempts = 1000;
1778
1779                         while (attempts--)
1780                         {
1781                                 scatter(&y, &x, py, px, 4, 0);
1782
1783                                 if (!player_bold(y, x)) break;
1784                         }
1785                         project(0, 0, y, x, damroll(6 + plev / 8, 10), typ,
1786                                 (PROJECT_BEAM | PROJECT_THRU | PROJECT_GRID | PROJECT_KILL), -1);
1787                 }
1788                 break;
1789         }
1790         case 19:
1791                 set_multishadow(6+randint1(6), FALSE);
1792                 break;
1793         default:
1794 #ifdef JP
1795 msg_print("なに?");
1796 #else
1797                 msg_print("Zap?");
1798 #endif
1799
1800         }
1801         return TRUE;
1802 }
1803
1804 /*!
1805  * @brief 特殊技能コマンドのメインルーチン /
1806  * @return なし
1807  */
1808 void do_cmd_mind(void)
1809 {
1810         int             n = 0,  b = 0;
1811         int             chance;
1812         int             minfail = 0;
1813         int             plev = p_ptr->lev;
1814         int             old_csp = p_ptr->csp;
1815         mind_type       spell;
1816         bool            cast;
1817         int             use_mind, mana_cost;
1818 #ifdef JP
1819         cptr            p;
1820 #endif
1821         bool            on_mirror = FALSE;
1822
1823         /* not if confused */
1824         if (p_ptr->confused)
1825         {
1826 #ifdef JP
1827 msg_print("混乱していて集中できない!");
1828 #else
1829                 msg_print("You are too confused!");
1830 #endif
1831
1832                 return;
1833         }
1834
1835         /* get power */
1836         if (!get_mind_power(&n, FALSE)) return;
1837
1838 #ifdef JP
1839         switch(p_ptr->pclass)
1840         {
1841                 case CLASS_MINDCRAFTER: use_mind = MIND_MINDCRAFTER;p = "精神";break;
1842                 case CLASS_FORCETRAINER:          use_mind = MIND_KI;p = "気";break;
1843                 case CLASS_BERSERKER:   use_mind = MIND_BERSERKER;p = "怒り";break;
1844                 case CLASS_MIRROR_MASTER:   use_mind = MIND_MIRROR_MASTER;p = "鏡魔法";break;
1845                 case CLASS_NINJA:       use_mind = MIND_NINJUTSU;p = "精神";break;
1846                 default:                use_mind = 0;p = "超能力";break;
1847         }
1848 #else
1849         switch(p_ptr->pclass)
1850         {
1851                 case CLASS_MINDCRAFTER: use_mind = MIND_MINDCRAFTER;break;
1852                 case CLASS_FORCETRAINER:          use_mind = MIND_KI;break;
1853                 case CLASS_BERSERKER:   use_mind = MIND_BERSERKER;break;
1854                 case CLASS_MIRROR_MASTER:   use_mind = MIND_MIRROR_MASTER;break;
1855                 case CLASS_NINJA:       use_mind = MIND_NINJUTSU;break;
1856                 default:                use_mind = 0;break;
1857         }
1858 #endif
1859         spell = mind_powers[use_mind].info[n];
1860
1861         /* Spell failure chance */
1862         chance = spell.fail;
1863
1864         mana_cost = spell.mana_cost;
1865         if (use_mind == MIND_KI)
1866         {
1867                 if (heavy_armor()) chance += 20;
1868                 if (p_ptr->icky_wield[0]) chance += 20;
1869                 else if (buki_motteruka(INVEN_RARM)) chance += 10;
1870                 if (p_ptr->icky_wield[1]) chance += 20;
1871                 else if (buki_motteruka(INVEN_LARM)) chance += 10;
1872                 if (n == 5)
1873                 {
1874                         int j;
1875                         for (j = 0; j < p_ptr->magic_num1[0] / 50; j++)
1876                                 mana_cost += (j+1) * 3 / 2;
1877                 }
1878         }
1879
1880         /* Verify "dangerous" spells */
1881         if ((use_mind == MIND_BERSERKER) || (use_mind == MIND_NINJUTSU))
1882         {
1883                 if (mana_cost > p_ptr->chp)
1884                 {
1885 #ifdef JP
1886 msg_print("HPが足りません。");
1887 #else
1888                         msg_print("You do not have enough hp to use this power.");
1889 #endif
1890                         return;
1891                 }
1892         }
1893         else if (mana_cost > p_ptr->csp)
1894         {
1895                 /* Warning */
1896 #ifdef JP
1897 msg_print("MPが足りません。");
1898 #else
1899                 msg_print("You do not have enough mana to use this power.");
1900 #endif
1901
1902
1903                 if (!over_exert) return;
1904
1905                 /* Verify */
1906 #ifdef JP
1907 if (!get_check("それでも挑戦しますか? ")) return;
1908 #else
1909                 if (!get_check("Attempt it anyway? ")) return;
1910 #endif
1911
1912         }
1913
1914         if (chance)
1915         {
1916                 /* Reduce failure rate by "effective" level adjustment */
1917                 chance -= 3 * (plev - spell.min_lev);
1918
1919                 chance += p_ptr->to_m_chance;
1920
1921                 /* Reduce failure rate by INT/WIS adjustment */
1922                 chance -= 3 * (adj_mag_stat[p_ptr->stat_ind[mp_ptr->spell_stat]] - 1);
1923
1924                 /* Not enough mana to cast */
1925                 if ((mana_cost > p_ptr->csp) && (use_mind != MIND_BERSERKER) && (use_mind != MIND_NINJUTSU))
1926                 {
1927                         chance += 5 * (mana_cost - p_ptr->csp);
1928                 }
1929
1930                 /* Extract the minimum failure rate */
1931                 minfail = adj_mag_fail[p_ptr->stat_ind[mp_ptr->spell_stat]];
1932
1933                 /* Minimum failure rate */
1934                 if (chance < minfail) chance = minfail;
1935
1936                 /* Stunning makes spells harder */
1937                 if (p_ptr->stun > 50) chance += 25;
1938                 else if (p_ptr->stun) chance += 15;
1939
1940                 if (use_mind == MIND_KI)
1941                 {
1942                         if (heavy_armor()) chance += 5;
1943                         if (p_ptr->icky_wield[0]) chance += 5;
1944                         if (p_ptr->icky_wield[1]) chance += 5;
1945                 }
1946         }
1947
1948         /* Always a 5 percent chance of working */
1949         if (chance > 95) chance = 95;
1950
1951         /* Failed spell */
1952         if (randint0(100) < chance)
1953         {
1954                 if (flush_failure) flush();
1955 #ifdef JP
1956 msg_format("%sの集中に失敗した!",p);
1957 #else
1958                 msg_format("You failed to concentrate hard enough!");
1959 #endif
1960
1961                 sound(SOUND_FAIL);
1962
1963                 if ((use_mind != MIND_BERSERKER) && (use_mind != MIND_NINJUTSU))
1964                 {
1965                         if ((use_mind == MIND_KI) && (n != 5) && p_ptr->magic_num1[0])
1966                         {
1967 #ifdef JP
1968                                 msg_print("気が散ってしまった...");
1969 #else
1970                                 msg_print("Your improved Force has gone away...");
1971 #endif
1972                                 p_ptr->magic_num1[0] = 0;
1973                         }
1974
1975                         if (randint1(100) < (chance / 2))
1976                         {
1977                                 /* Backfire */
1978                           b = randint1(100);
1979
1980                           if( use_mind == MIND_MINDCRAFTER ){
1981                                 if (b < 5)
1982                                 {
1983 #ifdef JP
1984 msg_print("なんてこった!頭の中が真っ白になった!");
1985 #else
1986                                         msg_print("Oh, no! Your mind has gone blank!");
1987 #endif
1988
1989                                         lose_all_info();
1990                                 }
1991                                 else if (b < 15)
1992                                 {
1993 #ifdef JP
1994 msg_print("奇妙な光景が目の前で踊っている...");
1995 #else
1996                                         msg_print("Weird visions seem to dance before your eyes...");
1997 #endif
1998
1999                                         set_image(p_ptr->image + 5 + randint1(10));
2000                                 }
2001                                 else if (b < 45)
2002                                 {
2003 #ifdef JP
2004 msg_print("あなたの頭は混乱した!");
2005 #else
2006                                         msg_print("Your brain is addled!");
2007 #endif
2008
2009                                         set_confused(p_ptr->confused + randint1(8));
2010                                 }
2011                                 else if (b < 90)
2012                                 {
2013                                         set_stun(p_ptr->stun + randint1(8));
2014                                 }
2015                                 else
2016                                 {
2017                                         /* Mana storm */
2018 #ifdef JP
2019 msg_format("%sの力が制御できない氾流となって解放された!", p);
2020 #else
2021                                         msg_print("Your mind unleashes its power in an uncontrollable storm!");
2022 #endif
2023
2024                                         project(PROJECT_WHO_UNCTRL_POWER, 2 + plev / 10, py, px, plev * 2,
2025                                                 GF_MANA, PROJECT_JUMP | PROJECT_KILL | PROJECT_GRID | PROJECT_ITEM, -1);
2026                                         p_ptr->csp = MAX(0, p_ptr->csp - plev * MAX(1, plev / 10));
2027                                 }
2028                           }
2029                           if( use_mind == MIND_MIRROR_MASTER ){
2030                                 if (b < 51)
2031                                 {
2032                                   /* Nothing has happen */
2033                                 }
2034                                 else if (b < 81)
2035                                 {
2036 #ifdef JP
2037 msg_print("鏡の世界の干渉を受けた!");
2038 #else
2039                                         msg_print("Weird visions seem to dance before your eyes...");
2040 #endif
2041                                         teleport_player(10, TELEPORT_PASSIVE);
2042                                 }
2043                                 else if (b < 96)
2044                                 {
2045 #ifdef JP
2046 msg_print("まわりのものがキラキラ輝いている!");
2047 #else
2048                                         msg_print("Your brain is addled!");
2049 #endif
2050
2051                                         set_image(p_ptr->image + 5 + randint1(10));
2052                                 }
2053                                 else
2054                                 {
2055                                         /* Mana storm */
2056 #ifdef JP
2057 msg_format("%sの力が制御できない氾流となって解放された!", p);
2058 #else
2059                                         msg_print("Your mind unleashes its power in an uncontrollable storm!");
2060 #endif
2061
2062                                         project(PROJECT_WHO_UNCTRL_POWER, 2 + plev / 10, py, px, plev * 2,
2063                                                 GF_MANA, PROJECT_JUMP | PROJECT_KILL | PROJECT_GRID | PROJECT_ITEM, -1);
2064                                         p_ptr->csp = MAX(0, p_ptr->csp - plev * MAX(1, plev / 10));
2065                                 }
2066                           }
2067                         }
2068                 }
2069         }
2070         else
2071         {
2072                 sound(SOUND_ZAP);
2073
2074                 switch(use_mind)
2075                 {
2076                 case MIND_MINDCRAFTER:
2077                         /* Cast the spell */
2078                         cast = cast_mindcrafter_spell(n);
2079                         break;
2080                 case MIND_KI:
2081                         /* Cast the spell */
2082                         cast = cast_force_spell(n);
2083                         break;
2084                 case MIND_BERSERKER:
2085                         /* Cast the spell */
2086                         cast = cast_berserk_spell(n);
2087                         break;
2088                 case MIND_MIRROR_MASTER:
2089                         /* Cast the spell */
2090                         if( is_mirror_grid(&cave[py][px]) )on_mirror = TRUE;
2091                         cast = cast_mirror_spell(n);
2092                         break;
2093                 case MIND_NINJUTSU:
2094                         /* Cast the spell */
2095                         cast = cast_ninja_spell(n);
2096                         break;
2097                 default:
2098 #ifdef JP
2099                         msg_format("謎の能力:%d, %d",use_mind, n);
2100 #else
2101                         msg_format("Mystery power:%d, %d",use_mind, n);
2102 #endif
2103                         return;
2104                 }
2105
2106                 if (!cast) return;
2107         }
2108
2109
2110         /* Take a turn */
2111         energy_use = 100;
2112         /* teleport from mirror costs small energy */
2113         if( on_mirror && p_ptr->pclass == CLASS_MIRROR_MASTER )
2114         {
2115           if( n==3 || n==5 || n==7 || n==16 )energy_use = 50;
2116         }
2117
2118         if ((use_mind == MIND_BERSERKER) || (use_mind == MIND_NINJUTSU))
2119         {
2120 #ifdef JP
2121                 take_hit(DAMAGE_USELIFE, mana_cost, "過度の集中", -1);
2122 #else
2123                 take_hit(DAMAGE_USELIFE, mana_cost, "concentrating too hard", -1);
2124 #endif
2125                 /* Redraw hp */
2126                 p_ptr->redraw |= (PR_HP);
2127         }
2128
2129         /* Sufficient mana */
2130         else if (mana_cost <= old_csp)
2131         {
2132                 /* Use some mana */
2133                 p_ptr->csp -= mana_cost;
2134
2135                 /* Limit */
2136                 if (p_ptr->csp < 0) p_ptr->csp = 0;
2137
2138                 if ((use_mind == MIND_MINDCRAFTER) && (n == 13))
2139                 {
2140                         /* No mana left */
2141                         p_ptr->csp = 0;
2142                         p_ptr->csp_frac = 0;
2143                 }
2144         }
2145
2146         /* Over-exert the player */
2147         else
2148         {
2149                 int oops = mana_cost - old_csp;
2150
2151                 /* No mana left */
2152                 if ((p_ptr->csp - mana_cost) < 0) p_ptr->csp_frac = 0;
2153                 p_ptr->csp = MAX(0, p_ptr->csp - mana_cost);
2154
2155                 /* Message */
2156 #ifdef JP
2157 msg_format("%sを集中しすぎて気を失ってしまった!",p);
2158 #else
2159                 msg_print("You faint from the effort!");
2160 #endif
2161
2162
2163                 /* Hack -- Bypass free action */
2164                 (void)set_paralyzed(p_ptr->paralyzed + randint1(5 * oops + 1));
2165
2166                 /* Damage WIS (possibly permanently) */
2167                 if (randint0(100) < 50)
2168                 {
2169                         bool perm = (randint0(100) < 25);
2170
2171                         /* Message */
2172 #ifdef JP
2173 msg_print("自分の精神を攻撃してしまった!");
2174 #else
2175                         msg_print("You have damaged your mind!");
2176 #endif
2177
2178
2179                         /* Reduce constitution */
2180                         (void)dec_stat(A_WIS, 15 + randint1(10), perm);
2181                 }
2182         }
2183
2184         /* Redraw mana */
2185         p_ptr->redraw |= (PR_MANA);
2186
2187         /* Window stuff */
2188         p_ptr->window |= (PW_PLAYER);
2189         p_ptr->window |= (PW_SPELL);
2190 }
2191
2192
2193 /*!
2194  * @brief 現在プレイヤーが使用可能な特殊技能の一覧表示 /
2195  * @return なし
2196  */
2197 void do_cmd_mind_browse(void)
2198 {
2199         int n = 0;
2200         int j, line;
2201         char temp[62*5];
2202         int use_mind = 0;
2203
2204         if (p_ptr->pclass == CLASS_MINDCRAFTER) use_mind = MIND_MINDCRAFTER;
2205         else if (p_ptr->pclass == CLASS_FORCETRAINER) use_mind = MIND_KI;
2206         else if (p_ptr->pclass == CLASS_BERSERKER) use_mind = MIND_BERSERKER;
2207         else if (p_ptr->pclass == CLASS_NINJA) use_mind = MIND_NINJUTSU;
2208         else if (p_ptr->pclass == CLASS_MIRROR_MASTER)
2209           use_mind = MIND_MIRROR_MASTER;
2210
2211         screen_save();
2212
2213         while(1)
2214         {
2215                 /* get power */
2216                 if (!get_mind_power(&n, TRUE))
2217                 {
2218                         screen_load();
2219                         return;
2220                 }
2221
2222                 /* Clear lines, position cursor  (really should use strlen here) */
2223                 Term_erase(12, 21, 255);
2224                 Term_erase(12, 20, 255);
2225                 Term_erase(12, 19, 255);
2226                 Term_erase(12, 18, 255);
2227                 Term_erase(12, 17, 255);
2228                 Term_erase(12, 16, 255);
2229
2230                 roff_to_buf(mind_tips[use_mind][n], 62, temp, sizeof(temp));
2231                 for(j=0, line = 17;temp[j];j+=(1+strlen(&temp[j])))
2232                 {
2233                         prt(&temp[j], line, 15);
2234                         line++;
2235                 }
2236                 switch (use_mind)
2237                 {
2238                 case MIND_MIRROR_MASTER:
2239                 case MIND_NINJUTSU:
2240 #ifdef JP
2241                   prt("何かキーを押して下さい。",0,0);
2242 #else
2243                   prt("Hit any key.",0,0);
2244 #endif
2245                   (void)inkey();
2246                 }
2247         }
2248 }