OSDN Git Service

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