OSDN Git Service

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