OSDN Git Service

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