OSDN Git Service

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