OSDN Git Service

75bf273e9249d4f96dbf93ff1d971122cd45e54e
[hengband/hengband.git] / src / mspell / mspells3.c
1 /*!
2  * @file mspells3.c
3  * @brief 青魔法の処理実装 / Blue magic
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  * 2014 Deskull rearranged comment for Doxygen.\n
11  */
12
13 #include "system/angband.h"
14 #include "core/stuff-handler.h"
15 #include "util/util.h"
16 #include "main/sound-definitions-table.h"
17 #include "floor/floor.h"
18 #include "grid/grid.h"
19 #include "spell/spells-summon.h"
20 #include "player/avatar.h"
21 #include "spell/spells-status.h"
22 #include "cmd-action/cmd-spell.h"
23 #include "player/player-status.h"
24 #include "mspell/monster-spell.h"
25 #include "monster/monster-status.h"
26 #include "spell/spells-type.h"
27 #include "cmd/cmd-basic.h"
28 #include "player/player-effects.h"
29 #include "io/targeting.h"
30 #include "view/display-main-window.h"
31 #include "spell/spells-launcher.h"
32 #include "spell/spells-lite.h"
33 #include "spell/spells-neighbor.h"
34 #include "spell/spells-sight.h"
35 #include "spell/spells-teleport.h"
36 #include "spell/spells3.h"
37 #include "mspell/mspell-type.h"
38 #include "mspell/mspell-damage-calculator.h"
39
40  /*!
41   * @brief モンスター魔法をプレイヤーが使用する場合の換算レベル
42   * @param caster_ptr プレーヤーへの参照ポインタ
43   * @param 換算レベル
44   */
45 PLAYER_LEVEL get_pseudo_monstetr_level(player_type *caster_ptr)
46 {
47         PLAYER_LEVEL monster_level = caster_ptr->lev + 40;
48         return (monster_level * monster_level - 1550) / 130;
49 }
50
51
52  /*!
53   * @brief 青魔法テーブル
54   * @details
55   * level,  smana,  %fail,  manedam,  %manefail,  use_stat, name
56   */
57 const monster_power monster_powers[MAX_MONSPELLS] =
58 {
59 #ifdef JP
60 {  1,   1,  10,    0,  15, A_CON,  "叫ぶ"},
61 { 10,   4,  35,   89,  40, A_INT,  "何か"},
62 { 40,  35,  85,    0,  40, A_INT,  "魔力消去"},
63 { 35,  30,  80,  800,  70, A_STR,  "ロケット"},
64 {  5,   1,  20,   18,  15, A_DEX,  "射撃"},
65 { 10,   4,  35,   89,  40, A_INT,  "何か"},
66 { 10,   4,  35,   89,  40, A_INT,  "何か"},
67 { 10,   4,  35,   89,  40, A_INT,  "何か"},
68 { 20,  15,  55, 1600,  95, A_CON,  "酸のブレス"},
69 { 20,  15,  55, 1600,  95, A_CON,  "電撃のブレス"},
70 { 20,  15,  55, 1600,  95, A_CON,  "炎のブレス"},
71 { 20,  15,  55, 1600,  95, A_CON,  "冷気のブレス"},
72 { 20,  15,  55,  800,  95, A_CON,  "毒のブレス"},
73 { 20,  15,  70,  550,  95, A_CON,  "地獄のブレス"},
74 { 20,  16,  70,  400,  95, A_CON,  "閃光のブレス"},
75 { 20,  16,  70,  400,  95, A_CON,  "暗黒のブレス"},
76 { 20,  20,  70,  450,  95, A_CON,  "混乱のブレス"},
77 { 20,  20,  70,  450,  95, A_CON,  "轟音のブレス"},
78 { 20,  20,  70,  600,  95, A_CON,  "カオスのブレス"},
79 { 20,  16,  70,  500,  95, A_CON,  "劣化のブレス"},
80 { 30,  25,  80,  250,  95, A_CON,  "因果混乱のブレス"},
81 { 35,  18,  80,  150,  95, A_CON,  "時間逆転のブレス"},
82 { 30,  25,  80,  200,  95, A_CON,  "遅鈍のブレス"},
83 { 30,  28,  90,  200,  95, A_CON,  "重力のブレス"},
84 { 20,  15,  70,  500,  95, A_CON,  "破片のブレス"},
85 { 35,  15,  80,  150,  95, A_CON,  "プラズマのブレス"},
86 { 30,  18,  70,  200,  95, A_CON,  "フォースのブレス"},
87 { 30,  28,  80,  250,  95, A_CON,  "魔力のブレス"},
88 { 25,  20,  95,  320,  80, A_INT,  "放射能球"},
89 { 25,  15,  70,  800,  95, A_CON,  "放射性廃棄物のブレス"},
90 { 30,  32,  85,  400,  80, A_INT,  "純ログルス"},
91 { 35,  40,  95,  150,  95, A_CON,  "分解のブレス"},
92 { 18,  13,  55,  630,  80, A_INT,  "アシッド・ボール"},
93 { 14,  10,  45,  316,  60, A_INT,  "サンダー・ボール"},
94 { 20,  14,  60,  720,  80, A_INT,  "ファイア・ボール"},
95 { 15,  11,  50,  320,  60, A_INT,  "アイス・ボール"},
96 {  5,   3,  40,   48,  20, A_INT,  "悪臭雲"},
97 { 25,  18,  70,  350,  80, A_INT,  "地獄球"},
98 { 30,  22,  75,  350,  80, A_INT,  "ウォーター・ボール"},
99 { 44,  45,  85,  550,  95, A_INT,  "魔力の嵐"},
100 { 40,  42,  90,  550,  95, A_INT,  "暗黒の嵐"},
101 { 10,   5,  50,    0,  25, A_INT,  "魔力吸収"},
102 { 25,  10,  60,    0,  30, A_INT,  "精神攻撃"},
103 { 30,  14,  65,    0,  30, A_INT,  "脳攻撃"},
104 {  3,   1,  25,   24,  20, A_INT,  "軽傷"},
105 { 12,   2,  35,   64,  25, A_INT,  "重傷"},
106 { 22,   6,  50,  150,  30, A_INT,  "致命傷"},
107 { 32,  10,  70,  225,  35, A_INT,  "秘孔を突く"},
108 { 13,   7,  40,  178,  40, A_INT,  "アシッド・ボルト"},
109 { 10,   5,  35,  130,  35, A_INT,  "サンダー・ボルト"},
110 { 15,   9,  50,  210,  45, A_INT,  "ファイア・ボルト"},
111 { 12,   6,  35,  162,  40, A_INT,  "アイス・ボルト"},
112 { 40,  42,  90,  550,  95, A_INT,  "スター・バースト"},
113 { 25,  17,  60,  255,  60, A_INT,  "地獄の矢"},
114 { 25,  20,  65,  250,  60, A_INT,  "ウォーター・ボルト"},
115 { 25,  24,  90,  400,  80, A_INT,  "魔力の矢"},
116 { 25,  20,  80,  216,  60, A_INT,  "プラズマ・ボルト"},
117 { 25,  16,  60,  186,  60, A_INT,  "極寒の矢"},
118 {  3,   1,  25,   12,  20, A_INT,  "マジック・ミサイル"},
119 {  5,   3,  35,    0,  20, A_INT,  "恐慌"},
120 { 10,   5,  40,    0,  20, A_INT,  "盲目"},
121 { 10,   5,  40,    0,  20, A_INT,  "パニック・モンスター"},
122 { 10,   5,  40,    0,  20, A_INT,  "スロウ・モンスター"},
123 { 10,   5,  40,    0,  20, A_INT,  "スリープ・モンスター"},
124 { 20,  10,  70,    0,  40, A_INT,  "スピード"},
125 { 45, 120,  95,    0,  60, A_INT,  "破滅の手"},
126 { 20,  15,  70,    0,  20, A_WIS,  "体力回復"},
127 { 45,  65,  80,    0,  60, A_INT,  "無傷の球"},
128 {  5,   1,  30,    0,  20, A_INT,  "ショート・テレポート"},
129 { 15,   8,  40,    0,  30, A_INT,  "テレポート"},
130 { 40, 999,  99,    0,  80, A_INT,  "ザ・ワールド"},
131 {  1,   0,   0,    0,  15, A_INT,  "何か"},
132 { 15,   8,  50,    0,  30, A_INT,  "引きよせる"},
133 { 20,  13,  80,    0,  30, A_INT,  "テレポート・アウェイ"},
134 { 30,  40,  95,    0,  40, A_INT,  "テレポート・レベル"},
135 { 35,  30,  80,  350,  70, A_INT,  "光の剣"},
136 {  5,   1,  20,    0,  15, A_INT,  "暗闇"},
137 {  5,   1,  20,    0,  15, A_DEX,  "トラップ創造"},
138 { 15,   3,  40,    0,  30, A_INT,  "記憶喪失"},
139 { 30,  30,  70,    0,  40, A_INT,  "死者復活"},
140 { 40,  70,  85,    0,  45, A_INT,  "援軍を呼ぶ"},
141 { 45,  90,  90,    0,  50, A_INT,  "サイバーデーモンの召喚"},
142 { 25,  20,  65,    0,  30, A_INT,  "モンスターの召喚"},
143 { 35,  30,  75,    0,  40, A_INT,  "複数のモンスターの召喚"},
144 { 25,  25,  65,    0,  25, A_INT,  "アリの召喚"},
145 { 25,  20,  60,    0,  25, A_INT,  "蜘蛛の召喚"},
146 { 35,  26,  75,    0,  40, A_INT,  "ハウンドの召喚"},
147 { 30,  23,  70,    0,  35, A_INT,  "ヒドラの召喚"},
148 { 40,  50,  85,    0,  40, A_INT,  "天使の召喚"},
149 { 35,  50,  80,    0,  35, A_INT,  "デーモンの召喚"},
150 { 30,  30,  75,    0,  35, A_INT,  "アンデッドの召喚"},
151 { 39,  70,  80,    0,  40, A_INT,  "ドラゴンの召喚"},
152 { 43,  85,  85,    0,  45, A_INT,  "上級アンデッドの召喚"},
153 { 46,  90,  85,    0,  45, A_INT,  "古代ドラゴンの召喚"},
154 { 48, 120,  90,    0,  50, A_INT,  "アンバーの王族の召喚"},
155 { 50, 150,  95,    0,  50, A_INT,  "ユニークモンスターの召喚"},
156 #else
157 {  1,   1,  10,    0,  15, A_CON,  "shriek"},
158 { 10,   4,  35,   89,  40, A_INT,  "something"},
159 { 40,  35,  85,    0,  40, A_INT,  "dispel-magic"},
160 { 35,  30,  80,  800,  70, A_STR,  "rocket"},
161 {  2,   1,  15,   10,  15, A_DEX,  "arrow"},
162 {  5,   2,  20,   18,  20, A_DEX,  "arrows"},
163 { 12,   3,  25,   30,  25, A_DEX,  "missile"},
164 { 16,   4,  30,   42,  30, A_DEX,  "missiles"},
165 { 20,  15,  55, 1600,  95, A_CON,  "breath acid"},
166 { 20,  15,  55, 1600,  95, A_CON,  "breath lightning"},
167 { 20,  15,  55, 1600,  95, A_CON,  "breath fire"},
168 { 20,  15,  55, 1600,  95, A_CON,  "breath cold"},
169 { 20,  15,  55,  800,  95, A_CON,  "breath poison"},
170 { 20,  15,  70,  550,  95, A_CON,  "breath nether"},
171 { 20,  16,  70,  400,  95, A_CON,  "breath light"},
172 { 20,  16,  70,  400,  95, A_CON,  "breath dark"},
173 { 20,  20,  70,  450,  95, A_CON,  "breath confusion"},
174 { 20,  20,  70,  450,  95, A_CON,  "breath sound"},
175 { 20,  20,  70,  600,  95, A_CON,  "breath chaos"},
176 { 20,  16,  70,  500,  95, A_CON,  "breath disenchantment"},
177 { 30,  25,  80,  250,  95, A_CON,  "breath nexus"},
178 { 35,  18,  80,  150,  95, A_CON,  "breath time"},
179 { 30,  25,  80,  200,  95, A_CON,  "breath inertia"},
180 { 30,  28,  90,  200,  95, A_CON,  "breath gravity"},
181 { 20,  15,  70,  500,  95, A_CON,  "breath shards"},
182 { 35,  15,  80,  150,  95, A_CON,  "breath plasma"},
183 { 30,  18,  70,  200,  95, A_CON,  "breath force"},
184 { 30,  28,  80,  250,  95, A_CON,  "breath mana"},
185 { 25,  20,  95,  320,  80, A_INT,  "nuke ball"},
186 { 25,  15,  70,  800,  95, A_CON,  "breath nuke"},
187 { 30,  32,  85,  400,  80, A_INT,  "raw Logrus"},
188 { 35,  40,  95,  150,  95, A_CON,  "breath disintegrate"},
189 { 18,  13,  55,  630,  80, A_INT,  "acid ball"},
190 { 14,  10,  45,  316,  60, A_INT,  "lightning ball"},
191 { 20,  14,  60,  720,  80, A_INT,  "fire ball"},
192 { 15,  11,  50,  320,  60, A_INT,  "frost ball"},
193 {  5,   3,  40,   48,  20, A_INT,  "stinking cloud"},
194 { 25,  18,  70,  350,  80, A_INT,  "nether ball"},
195 { 30,  22,  75,  350,  80, A_INT,  "water ball"},
196 { 44,  45,  85,  550,  95, A_INT,  "mana storm"},
197 { 40,  42,  90,  550,  95, A_INT,  "darkness storm"},
198 { 10,   5,  50,    0,  25, A_INT,  "drain mana"},
199 { 25,  10,  60,    0,  30, A_INT,  "mind blast"},
200 { 30,  14,  65,    0,  30, A_INT,  "brain smash"},
201 {  3,   1,  25,   24,  20, A_INT,  "cause light wounds"},
202 { 12,   2,  35,   64,  25, A_INT,  "cause serious wounds"},
203 { 22,   6,  50,  150,  30, A_INT,  "cause critical wounds"},
204 { 32,  10,  70,  225,  35, A_INT,  "cause mortal wounds"},
205 { 13,   7,  40,  178,  40, A_INT,  "acid bolt"},
206 { 10,   5,  35,  130,  35, A_INT,  "lightning bolt"},
207 { 15,   9,  50,  210,  45, A_INT,  "fire bolt"},
208 { 12,   6,  35,  162,  40, A_INT,  "frost bolt"},
209 { 40,  42,  90,  550,  95, A_INT,  "starburst"},
210 { 25,  17,  60,  255,  60, A_INT,  "nether bolt"},
211 { 25,  20,  65,  250,  60, A_INT,  "water bolt"},
212 { 25,  24,  90,  400,  80, A_INT,  "mana bolt"},
213 { 25,  20,  80,  216,  60, A_INT,  "plasma bolt"},
214 { 25,  16,  60,  186,  60, A_INT,  "ice bolt"},
215 {  3,   1,  25,   12,  20, A_INT,  "magic missile"},
216 {  5,   3,  35,    0,  20, A_INT,  "scare"},
217 { 10,   5,  40,    0,  20, A_INT,  "blind"},
218 { 10,   5,  40,    0,  20, A_INT,  "confuse"},
219 { 10,   5,  40,    0,  20, A_INT,  "slow"},
220 { 10,   5,  40,    0,  20, A_INT,  "sleep"},
221 { 20,  10,  70,    0,  40, A_INT,  "speed"},
222 { 45, 120,  95,    0,  60, A_INT,  "the Hand of Doom"},
223 { 20,  15,  70,    0,  20, A_WIS,  "heal-self"},
224 { 45,  65,  80,    0,  60, A_INT,  "make invulnerable"},
225 {  5,   1,  30,    0,  20, A_INT,  "blink-self"},
226 { 15,   8,  40,    0,  30, A_INT,  "teleport-self"},
227 { 40, 999,  99,    0,  80, A_INT,  "The world"},
228 {  1,   0,   0,    0,  15, A_INT,  "something"},
229 { 15,   8,  50,    0,  30, A_INT,  "teleport to"},
230 { 20,  13,  80,    0,  30, A_INT,  "teleport away"},
231 { 30,  40,  95,    0,  40, A_INT,  "teleport level"},
232 { 35,  30,  80,  350,  70, A_INT,  "psycho-spear"},
233 {  5,   1,  20,    0,  15, A_INT,  "create darkness"},
234 {  5,   1,  20,    0,  15, A_DEX,  "create traps"},
235 { 15,   3,  40,    0,  30, A_INT,  "cause amnesia"},
236 { 30,  30,  70,    0,  40, A_INT,  "raise dead"},
237 { 40,  70,  85,    0,  45, A_INT,  "summon aid"},
238 { 45,  90,  90,    0,  50, A_INT,  "summon Cyberdemons"},
239 { 25,  20,  65,    0,  30, A_INT,  "summon a monster"},
240 { 35,  30,  75,    0,  40, A_INT,  "summon monsters"},
241 { 25,  25,  65,    0,  25, A_INT,  "summon ants"},
242 { 25,  20,  60,    0,  25, A_INT,  "summon spiders"},
243 { 35,  26,  75,    0,  40, A_INT,  "summon hounds"},
244 { 30,  23,  70,    0,  35, A_INT,  "summon hydras"},
245 { 40,  50,  85,    0,  40, A_INT,  "summon an angel"},
246 { 35,  50,  80,    0,  35, A_INT,  "summon a daemon"},
247 { 30,  30,  75,    0,  35, A_INT,  "summon an undead"},
248 { 39,  70,  80,    0,  40, A_INT,  "summon a dragon"},
249 { 43,  85,  85,    0,  45, A_INT,  "summon Greater Undead"},
250 { 46,  90,  85,    0,  45, A_INT,  "summon Ancient Dragon"},
251 { 48, 120,  90,    0,  50, A_INT,  "summon Lords of Amber"},
252 { 50, 150,  95,    0,  50, A_INT,  "summon Unique Monsters"},
253 #endif
254
255 };
256
257
258 /*!
259  * @brief モンスター魔法名テーブル
260  */
261 const concptr monster_powers_short[MAX_MONSPELLS] = {
262 #ifdef JP
263
264         "叫ぶ", "何か", "魔力消去", "ロケット", "射撃", "何か", "何か", "何か",
265         "酸", "電撃", "火炎", "冷気", "毒", "地獄", "閃光", "暗黒",
266         "混乱", "轟音", "カオス", "劣化", "因果混乱", "時間逆転", "遅鈍", "重力",
267         "破片", "プラズマ", "フォース", "魔力", "放射能球", "放射性廃棄物", "純ログルス", "分解",
268
269         "酸", "電撃", "火炎", "冷気", "悪臭雲", "地獄球", "ウォーター", "魔力の嵐",
270         "暗黒の嵐", "魔力吸収", "精神攻撃", "脳攻撃", "軽傷", "重傷", "致命傷", "秘孔を突く",
271         "酸", "電撃", "火炎", "冷気", "スターバースト", "地獄の矢", "ウォーター", "魔力の矢",
272         "プラズマ", "極寒", "マジックミサイル", "恐慌", "盲目", "混乱", "減速", "睡眠",
273
274         "加速", "破滅の手", "体力回復", "無傷の球", "ショートテレポート", "テレポート", "時を止める", "何か",
275         "引きよせる", "テレポートアウェイ", "テレポートレベル", "光の剣", "暗闇", "トラップ創造", "記憶喪失", "死者復活",
276         "援軍", "サイバーデーモン", "モンスター", "複数のモンスター", "蟻", "蜘蛛", "ハウンド", "ヒドラ",
277         "天使", "悪魔", "アンデッド", "ドラゴン", "上級アンデッド", "古代ドラゴン", "アンバーの王族", "ユニーク"
278
279 #else
280
281         "Shriek", "Something", "Dispel-magic", "Rocket", "Arrow", "Arrows", "Missile", "Missiles",
282         "Acid", "Lightning", "Fire", "Cold", "Poison", "Nether", "Light", "Dark",
283         "Confusion", "Sound", "Chaos", "Disenchantment", "Nexus", "Time", "Inertia", "Gravity",
284         "Shards", "Plasma", "Force", "Mana", "Nuke", "Nuke", "Logrus", "Disintergrate",
285
286         "Acid", "Lightning", "Fire", "Frost", "Stinking Cloud", "Nether", "Water", "Mana storm",
287         "Darkness storm", "Drain mana", "Mind blast", "Brain smash", "Cause Light Wound", "Cause Serious Wound", "Cause Critical Wound", "Cause Mortal Wound",
288         "Acid", "Lightning", "Fire", "Frost", "Starburst", "Nether", "Water", "Mana",
289         "Plasm", "Ice", "Magic missile", "Scare", "Blind", "Confuse", "Slow", "Sleep",
290
291         "Speed", "Hand of doom", "Heal-self", "Invulnerable", "Blink", "Teleport", "The world", "Something",
292         "Teleport to", "Teleport away", "Teleport level", "Psycho-spear", "Create darkness", "Create traps", "Amnesia", "Raise dead",
293         "Aid", "Cyberdeamons", "A monster", "Monsters", "Ants", "Spiders", "Hounds", "Hydras",
294         "Angel", "Daemon", "Undead", "Dragon", "Greater Undead", "Ancient Dragon", "Lords of Amber", "Unique monsters"
295
296 #endif
297 };
298
299
300 /*!
301 * @brief 文字列に青魔導師の呪文の攻撃力を加える
302 * @param SPELL_NUM 呪文番号
303 * @param plev プレイヤーレベル
304 * @param msg 表示する文字列
305 * @param tmp 返すメッセージを格納する配列
306 * @return なし
307 */
308 void set_bluemage_damage(player_type *learner_type, monster_spell_type ms_type, PLAYER_LEVEL plev, concptr msg, char* tmp)
309 {
310     int base_damage = monspell_bluemage_damage(learner_type, ms_type, plev, BASE_DAM);
311     int dice_num = monspell_bluemage_damage(learner_type, ms_type, plev, DICE_NUM);
312     int dice_side = monspell_bluemage_damage(learner_type, ms_type, plev, DICE_SIDE);
313     int dice_mult = monspell_bluemage_damage(learner_type, ms_type, plev, DICE_MULT);
314     int dice_div = monspell_bluemage_damage(learner_type, ms_type, plev, DICE_DIV);
315     char dmg_str[80];
316     dice_to_string(base_damage, dice_num, dice_side, dice_mult, dice_div, dmg_str);
317     sprintf(tmp, " %s %s", msg, dmg_str);
318 }
319
320
321 /*!
322  * @brief 受け取ったモンスター魔法のIDに応じて青魔法の効果情報をまとめたフォーマットを返す
323  * @param learner_ptr プレーヤーへの参照ポインタ
324  * @param p 情報を返す文字列参照ポインタ
325  * @param power モンスター魔法のID
326  * @return なし
327  */
328 static void learned_info(player_type *learner_ptr, char *p, int power)
329 {
330         PLAYER_LEVEL plev = get_pseudo_monstetr_level(learner_ptr);
331
332         strcpy(p, "");
333
334         switch (power)
335         {
336                 case MS_SHRIEK:
337                 case MS_XXX1:
338                 case MS_XXX2:
339                 case MS_XXX3:
340                 case MS_XXX4:
341                 case MS_SCARE:
342                 case MS_BLIND:
343                 case MS_CONF:
344                 case MS_SLOW:
345                 case MS_SLEEP:
346                 case MS_HAND_DOOM:
347                 case MS_WORLD:
348                 case MS_SPECIAL:
349                 case MS_TELE_TO:
350                 case MS_TELE_AWAY:
351                 case MS_TELE_LEVEL:
352                 case MS_DARKNESS:
353                 case MS_MAKE_TRAP:
354                 case MS_FORGET:
355                 case MS_S_KIN:
356                 case MS_S_CYBER:
357                 case MS_S_MONSTER:
358                 case MS_S_MONSTERS:
359                 case MS_S_ANT:
360                 case MS_S_SPIDER:
361                 case MS_S_HOUND:
362                 case MS_S_HYDRA:
363                 case MS_S_ANGEL:
364                 case MS_S_DEMON:
365                 case MS_S_UNDEAD:
366                 case MS_S_DRAGON:
367                 case MS_S_HI_UNDEAD:
368                 case MS_S_HI_DRAGON:
369                 case MS_S_AMBERITE:
370                 case MS_S_UNIQUE:
371                         break;
372         case MS_BALL_MANA:
373         case MS_BALL_DARK:
374         case MS_STARBURST: 
375             set_bluemage_damage(learner_ptr, power, plev, KWD_DAM, p); break;
376                 case MS_DISPEL:
377                         break;
378         case MS_ROCKET:
379         case MS_SHOOT:
380         case MS_BR_ACID:
381         case MS_BR_ELEC:
382         case MS_BR_FIRE:
383         case MS_BR_COLD:
384         case MS_BR_POIS:
385         case MS_BR_NUKE: 
386         case MS_BR_NEXUS:
387         case MS_BR_TIME:
388         case MS_BR_GRAVITY:
389         case MS_BR_MANA:
390         case MS_BR_NETHER:
391         case MS_BR_LITE:
392         case MS_BR_DARK:
393         case MS_BR_CONF:
394         case MS_BR_SOUND:
395         case MS_BR_CHAOS:
396         case MS_BR_DISEN:
397         case MS_BR_SHARDS:
398         case MS_BR_PLASMA:
399         case MS_BR_INERTIA:
400         case MS_BR_FORCE:
401         case MS_BR_DISI:
402         case MS_BALL_NUKE:
403         case MS_BALL_CHAOS:
404         case MS_BALL_ACID:
405         case MS_BALL_ELEC:
406         case MS_BALL_FIRE:
407         case MS_BALL_COLD:
408         case MS_BALL_POIS:
409         case MS_BALL_NETHER:
410         case MS_BALL_WATER:
411             set_bluemage_damage(learner_ptr, power, plev, KWD_DAM, p); break;
412         case MS_DRAIN_MANA:
413             set_bluemage_damage(learner_ptr, power, plev, KWD_HEAL, p); break;
414         case MS_MIND_BLAST:
415         case MS_BRAIN_SMASH:
416         case MS_CAUSE_1:
417         case MS_CAUSE_2:
418         case MS_CAUSE_3:
419         case MS_CAUSE_4:
420         case MS_BOLT_ACID:
421         case MS_BOLT_ELEC:
422         case MS_BOLT_FIRE:
423         case MS_BOLT_COLD:
424         case MS_BOLT_NETHER:
425         case MS_BOLT_WATER:
426         case MS_BOLT_MANA:
427         case MS_BOLT_PLASMA:
428         case MS_BOLT_ICE: 
429         case MS_MAGIC_MISSILE: 
430             set_bluemage_damage(learner_ptr, power, plev, KWD_DAM, p); break;
431                 case MS_SPEED:
432                         sprintf(p, " %sd%d+%d", KWD_DURATION, 20+plev, plev);
433                         break;
434         case MS_HEAL:
435             set_bluemage_damage(learner_ptr, power, plev, KWD_HEAL, p); break;
436                 case MS_INVULNER:
437                         sprintf(p, " %sd7+7", KWD_DURATION);
438                         break;
439                 case MS_BLINK:
440                         sprintf(p, " %s10", KWD_SPHERE);
441                         break;
442                 case MS_TELEPORT:
443                         sprintf(p, " %s%d", KWD_SPHERE, plev * 5);
444                         break;
445         case MS_PSY_SPEAR:
446             set_bluemage_damage(learner_ptr, power, plev, KWD_DAM, p); break;
447                         break;
448                 case MS_RAISE_DEAD:
449                         sprintf(p, " %s5", KWD_SPHERE);
450                         break;
451                 default:
452                         break;
453         }
454 }
455
456
457 /*!
458  * @brief 使用可能な青魔法を選択する /
459  * Allow user to choose a imitation.
460  * @param caster_ptr プレーヤーへの参照ポインタ
461  * @param sn 選択したモンスター攻撃ID、キャンセルの場合-1、不正な選択の場合-2を返す
462  * @return 発動可能な魔法を選択した場合TRUE、キャンセル処理か不正な選択が行われた場合FALSEを返す。
463  * @details
464  * If a valid spell is chosen, saves it in '*sn' and returns TRUE\n
465  * If the user hits escape, returns FALSE, and set '*sn' to -1\n
466  * If there are no legal choices, returns FALSE, and sets '*sn' to -2\n
467  *\n
468  * The "prompt" should be "cast", "recite", or "study"\n
469  * The "known" should be TRUE for cast/pray, FALSE for study\n
470  *\n
471  * nb: This function has a (trivial) display bug which will be obvious\n
472  * when you run it. It's probably easy to fix but I haven't tried,\n
473  * sorry.\n
474  */
475 static bool get_learned_power(player_type *caster_ptr, SPELL_IDX *sn)
476 {
477         int             i = 0;
478         int             num = 0;
479         TERM_LEN y = 1;
480         TERM_LEN x = 18;
481         PERCENTAGE minfail = 0;
482         PLAYER_LEVEL plev = caster_ptr->lev;
483         PERCENTAGE chance = 0;
484         int             ask = TRUE, mode = 0;
485         int             spellnum[MAX_MONSPELLS];
486         char            ch;
487         char            choice;
488         char            out_val[160];
489         char            comment[80];
490         BIT_FLAGS f4 = 0L, f5 = 0L, f6 = 0L;
491         concptr p = _("魔法", "magic");
492         COMMAND_CODE code;
493         monster_power   spell;
494         bool            flag, redraw;
495         int menu_line = (use_menu ? 1 : 0);
496
497         /* Assume cancelled */
498         *sn = (-1);
499
500         flag = FALSE;
501         redraw = FALSE;
502
503         /* Get the spell, if available */
504         
505         if (repeat_pull(&code))
506         {
507                 *sn = (SPELL_IDX)code;
508                 return TRUE;
509         }
510
511         if (use_menu)
512         {
513                 screen_save();
514
515                 while(!mode)
516                 {
517                         prt(format(_(" %s ボルト", " %s bolt"), (menu_line == 1) ? _("》", "> ") : "  "), 2, 14);
518                         prt(format(_(" %s ボール", " %s ball"), (menu_line == 2) ? _("》", "> ") : "  "), 3, 14);
519                         prt(format(_(" %s ブレス", " %s breath"), (menu_line == 3) ? _("》", "> ") : "  "), 4, 14);
520                         prt(format(_(" %s 召喚", " %s sommoning"), (menu_line == 4) ? _("》", "> ") : "  "), 5, 14);
521                         prt(format(_(" %s その他", " %s others"), (menu_line == 5) ? _("》", "> ") : "  "), 6, 14);
522                         prt(_("どの種類の魔法を使いますか?", "use which type of magic? "), 0, 0);
523
524                         choice = inkey();
525                         switch(choice)
526                         {
527                         case ESCAPE:
528                         case 'z':
529                         case 'Z':
530                                 screen_load();
531                                 return FALSE;
532                         case '2':
533                         case 'j':
534                         case 'J':
535                                 menu_line++;
536                                 break;
537                         case '8':
538                         case 'k':
539                         case 'K':
540                                 menu_line+= 4;
541                                 break;
542                         case '\r':
543                         case 'x':
544                         case 'X':
545                                 mode = menu_line;
546                                 break;
547                         }
548                         if (menu_line > 5) menu_line -= 5;
549                 }
550                 screen_load();
551         }
552         else
553         {
554         sprintf(comment, _("[A]ボルト, [B]ボール, [C]ブレス, [D]召喚, [E]その他:", "[A] bolt, [B] ball, [C] breath, [D] summoning, [E] others:"));
555         while (TRUE)
556         {
557                 if (!get_com(comment, &ch, TRUE))
558                 {
559                         return FALSE;
560                 }
561                 if (ch == 'A' || ch == 'a')
562                 {
563                         mode = 1;
564                         break;
565                 }
566                 if (ch == 'B' || ch == 'b')
567                 {
568                         mode = 2;
569                         break;
570                 }
571                 if (ch == 'C' || ch == 'c')
572                 {
573                         mode = 3;
574                         break;
575                 }
576                 if (ch == 'D' || ch == 'd')
577                 {
578                         mode = 4;
579                         break;
580                 }
581                 if (ch == 'E' || ch == 'e')
582                 {
583                         mode = 5;
584                         break;
585                 }
586         }
587         }
588
589         set_rf_masks(&f4, &f5, &f6, mode);
590
591         for (i = 0, num = 0; i < 32; i++)
592         {
593                 if ((0x00000001 << i) & f4) spellnum[num++] = i;
594         }
595         for (; i < 64; i++)
596         {
597                 if ((0x00000001 << (i - 32)) & f5) spellnum[num++] = i;
598         }
599         for (; i < 96; i++)
600         {
601                 if ((0x00000001 << (i - 64)) & f6) spellnum[num++] = i;
602         }
603         for (i = 0; i < num; i++)
604         {
605                 if (caster_ptr->magic_num2[spellnum[i]])
606                 {
607                         if (use_menu) menu_line = i+1;
608                         break;
609                 }
610         }
611         if (i == num)
612         {
613                 msg_print(_("その種類の魔法は覚えていない!", "You don't know any spell of this type."));
614                 return FALSE;
615         }
616
617         /* Build a prompt (accept all spells) */
618         (void)strnfmt(out_val, 78, _("(%c-%c, '*'で一覧, ESC) どの%sを唱えますか?", "(%c-%c, *=List, ESC=exit) Use which %s? "),
619                 I2A(0), I2A(num - 1), p);
620
621         if (use_menu) screen_save();
622
623         choice= (always_show_list || use_menu) ? ESCAPE:1 ;
624         while (!flag)
625         {
626                 if(choice==ESCAPE) choice = ' '; 
627                 else if( !get_com(out_val, &choice, TRUE) )break; 
628
629                 if (use_menu && choice != ' ')
630                 {
631                         switch(choice)
632                         {
633                                 case '0':
634                                 {
635                                         screen_load();
636                                         return FALSE;
637                                 }
638
639                                 case '8':
640                                 case 'k':
641                                 case 'K':
642                                 {
643                                         do
644                                         {
645                                                 menu_line += (num-1);
646                                                 if (menu_line > num) menu_line -= num;
647                                         } while(!caster_ptr->magic_num2[spellnum[menu_line-1]]);
648                                         break;
649                                 }
650
651                                 case '2':
652                                 case 'j':
653                                 case 'J':
654                                 {
655                                         do
656                                         {
657                                                 menu_line++;
658                                                 if (menu_line > num) menu_line -= num;
659                                         } while(!caster_ptr->magic_num2[spellnum[menu_line-1]]);
660                                         break;
661                                 }
662
663                                 case '6':
664                                 case 'l':
665                                 case 'L':
666                                 {
667                                         menu_line=num;
668                                         while(!caster_ptr->magic_num2[spellnum[menu_line-1]]) menu_line--;
669                                         break;
670                                 }
671
672                                 case '4':
673                                 case 'h':
674                                 case 'H':
675                                 {
676                                         menu_line=1;
677                                         while(!caster_ptr->magic_num2[spellnum[menu_line-1]]) menu_line++;
678                                         break;
679                                 }
680
681                                 case 'x':
682                                 case 'X':
683                                 case '\r':
684                                 {
685                                         i = menu_line - 1;
686                                         ask = FALSE;
687                                         break;
688                                 }
689                         }
690                 }
691                 /* Request redraw */
692                 if ((choice == ' ') || (choice == '*') || (choice == '?') || (use_menu && ask))
693                 {
694                         /* Show the list */
695                         if (!redraw || use_menu)
696                         {
697                                 char psi_desc[80];
698                                 redraw = TRUE;
699                                 if (!use_menu) screen_save();
700
701                                 /* Display a list of spells */
702                                 prt("", y, x);
703                                 put_str(_("名前", "Name"), y, x + 5);
704                                 put_str(_("MP 失率 効果", "SP Fail Info"), y, x + 33);
705
706
707                                 /* Dump the spells */
708                                 for (i = 0; i < num; i++)
709                                 {
710                                         int need_mana;
711
712                                         prt("", y + i + 1, x);
713                                         if (!caster_ptr->magic_num2[spellnum[i]]) continue;
714
715                                         /* Access the spell */
716                                         spell = monster_powers[spellnum[i]];
717
718                                         chance = spell.fail;
719
720                                         /* Reduce failure rate by "effective" level adjustment */
721                                         if (plev > spell.level) chance -= 3 * (plev - spell.level);
722                                         else chance += (spell.level - plev);
723
724                                         /* Reduce failure rate by INT/WIS adjustment */
725                                         chance -= 3 * (adj_mag_stat[caster_ptr->stat_ind[A_INT]] - 1);
726
727                                         chance = mod_spell_chance_1(caster_ptr, chance);
728
729                                         need_mana = mod_need_mana(caster_ptr, monster_powers[spellnum[i]].smana, 0, REALM_NONE);
730
731                                         /* Not enough mana to cast */
732                                         if (need_mana > caster_ptr->csp)
733                                         {
734                                                 chance += 5 * (need_mana - caster_ptr->csp);
735                                         }
736
737                                         /* Extract the minimum failure rate */
738                                         minfail = adj_mag_fail[caster_ptr->stat_ind[A_INT]];
739
740                                         /* Minimum failure rate */
741                                         if (chance < minfail) chance = minfail;
742
743                                         /* Stunning makes spells harder */
744                                         if (caster_ptr->stun > 50) chance += 25;
745                                         else if (caster_ptr->stun) chance += 15;
746
747                                         /* Always a 5 percent chance of working */
748                                         if (chance > 95) chance = 95;
749
750                                         chance = mod_spell_chance_2(caster_ptr, chance);
751
752                                         /* Get info */
753                                         learned_info(caster_ptr, comment, spellnum[i]);
754
755                                         if (use_menu)
756                                         {
757                                                 if (i == (menu_line-1)) strcpy(psi_desc, _("  》", "  > "));
758                                                 else strcpy(psi_desc, "    ");
759                                         }
760                                         else sprintf(psi_desc, "  %c)", I2A(i));
761
762                                         /* Dump the spell --(-- */
763                                         strcat(psi_desc, format(" %-26s %3d %3d%%%s",
764                                                 spell.name, need_mana,
765                                                 chance, comment));
766                                         prt(psi_desc, y + i + 1, x);
767                                 }
768
769                                 /* Clear the bottom line */
770                                 if (y < 22) prt("", y + i + 1, x);
771                         }
772
773                         /* Hide the list */
774                         else
775                         {
776                                 /* Hide list */
777                                 redraw = FALSE;
778                                 screen_load();
779                         }
780
781                         /* Redo asking */
782                         continue;
783                 }
784
785                 if (!use_menu)
786                 {
787                         /* Note verify */
788                         ask = isupper(choice);
789
790                         /* Lowercase */
791                         if (ask) choice = (char)tolower(choice);
792
793                         /* Extract request */
794                         i = (islower(choice) ? A2I(choice) : -1);
795                 }
796
797                 /* Totally Illegal */
798                 if ((i < 0) || (i >= num) || !caster_ptr->magic_num2[spellnum[i]])
799                 {
800                         bell();
801                         continue;
802                 }
803
804                 /* Save the spell index */
805                 spell = monster_powers[spellnum[i]];
806
807                 /* Verify it */
808                 if (ask)
809                 {
810                         char tmp_val[160];
811
812                         /* Prompt */
813                         (void) strnfmt(tmp_val, 78, _("%sの魔法を唱えますか?", "Use %s? "), monster_powers[spellnum[i]].name);
814
815                         /* Belay that order */
816                         if (!get_check(tmp_val)) continue;
817                 }
818
819                 /* Stop the loop */
820                 flag = TRUE;
821         }
822
823         if (redraw) screen_load();
824
825         caster_ptr->window |= (PW_SPELL);
826         handle_stuff(caster_ptr);
827
828         /* Abort if needed */
829         if (!flag) return FALSE;
830
831         /* Save the choice */
832         (*sn) = spellnum[i];
833
834         repeat_push((COMMAND_CODE)spellnum[i]);
835
836         /* Success */
837         return TRUE;
838 }
839
840
841 /*!
842  * @brief 青魔法の発動 /
843  * do_cmd_cast calls this function if the player's class is 'blue-mage'.
844  * @param spell 発動するモンスター攻撃のID
845  * @param success TRUEは成功時、FALSEは失敗時の処理を行う
846  * @return 処理を実行したらTRUE、キャンセルした場合FALSEを返す。
847  */
848 static bool cast_learned_spell(player_type *caster_ptr, int spell, bool success)
849 {
850         DIRECTION dir;
851         PLAYER_LEVEL plev = get_pseudo_monstetr_level(caster_ptr);
852         PLAYER_LEVEL summon_lev = caster_ptr->lev * 2 / 3 + randint1(caster_ptr->lev/2);
853         HIT_POINT damage = 0;
854         bool pet = success;
855         bool no_trump = FALSE;
856         BIT_FLAGS p_mode, u_mode = 0L, g_mode;
857
858         if (pet)
859         {
860                 p_mode = PM_FORCE_PET;
861                 g_mode = 0;
862         }
863         else
864         {
865                 p_mode = PM_NO_PET;
866                 g_mode = PM_ALLOW_GROUP;
867         }
868
869         if (!success || (randint1(50+plev) < plev/10)) u_mode = PM_ALLOW_UNIQUE;
870
871         /* spell code */
872         floor_type *floor_ptr = caster_ptr->current_floor_ptr;
873         switch (spell)
874         {
875         case MS_SHRIEK:
876         msg_print(_("かん高い金切り声をあげた。", "You make a high pitched shriek."));
877                 aggravate_monsters(caster_ptr, 0);
878                 break;
879         case MS_XXX1:
880                 break;
881         case MS_DISPEL:
882         {
883                 MONSTER_IDX m_idx;
884
885                 if (!target_set(caster_ptr, TARGET_KILL)) return FALSE;
886                 m_idx = floor_ptr->grid_array[target_row][target_col].m_idx;
887                 if (!m_idx) break;
888                 if (!player_has_los_bold(caster_ptr, target_row, target_col)) break;
889                 if (!projectable(caster_ptr, caster_ptr->y, caster_ptr->x, target_row, target_col)) break;
890                 dispel_monster_status(caster_ptr, m_idx);
891                 break;
892         }
893         case MS_ROCKET:
894                 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
895                 
896         msg_print(_("ロケットを発射した。", "You fire a rocket."));
897         damage = monspell_bluemage_damage(caster_ptr, (MS_ROCKET), plev, DAM_ROLL);
898                 fire_rocket(caster_ptr, GF_ROCKET, dir, damage, 2);
899                 break;
900         case MS_SHOOT:
901         {
902                 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
903                 
904         msg_print(_("矢を放った。", "You fire an arrow."));
905         damage = monspell_bluemage_damage(caster_ptr, (MS_SHOOT), plev, DAM_ROLL);
906                 fire_bolt(caster_ptr, GF_ARROW, dir, damage);
907                 break;
908         }
909         case MS_XXX2:
910                 break;
911         case MS_XXX3:
912                 break;
913         case MS_XXX4:
914                 break;
915         case MS_BR_ACID:
916                 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
917
918         msg_print(_("酸のブレスを吐いた。", "You breathe acid."));
919         damage = monspell_bluemage_damage(caster_ptr, (MS_BR_ACID), plev, DAM_ROLL);
920                 fire_breath(caster_ptr, GF_ACID, dir, damage, (plev > 40 ? 3 : 2));
921                 break;
922         case MS_BR_ELEC:
923                 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
924
925         msg_print(_("稲妻のブレスを吐いた。", "You breathe lightning."));
926         damage = monspell_bluemage_damage(caster_ptr, (MS_BR_ELEC), plev, DAM_ROLL);
927                 fire_breath(caster_ptr, GF_ELEC, dir, damage, (plev > 40 ? 3 : 2));
928                 break;
929         case MS_BR_FIRE:
930                 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
931
932         msg_print(_("火炎のブレスを吐いた。", "You breathe fire."));
933         damage = monspell_bluemage_damage(caster_ptr, (MS_BR_FIRE), plev, DAM_ROLL);
934                 fire_breath(caster_ptr, GF_FIRE, dir, damage, (plev > 40 ? 3 : 2));
935                 break;
936         case MS_BR_COLD:
937         if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
938
939         msg_print(_("冷気のブレスを吐いた。", "You breathe frost."));
940         damage = monspell_bluemage_damage(caster_ptr, (MS_BR_COLD), plev, DAM_ROLL);
941                 fire_breath(caster_ptr, GF_COLD, dir, damage, (plev > 40 ? 3 : 2));
942                 break;
943         case MS_BR_POIS:
944         if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
945
946         msg_print(_("ガスのブレスを吐いた。", "You breathe gas."));
947         damage = monspell_bluemage_damage(caster_ptr, (MS_BR_POIS), plev, DAM_ROLL);
948                 fire_breath(caster_ptr, GF_POIS, dir, damage, (plev > 40 ? 3 : 2));
949                 break;
950         case MS_BR_NETHER:
951         if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
952
953         msg_print(_("地獄のブレスを吐いた。", "You breathe nether."));
954         damage = monspell_bluemage_damage(caster_ptr, (MS_BR_NETHER), plev, DAM_ROLL);
955                 fire_breath(caster_ptr, GF_NETHER, dir, damage, (plev > 40 ? 3 : 2));
956                 break;
957         case MS_BR_LITE:
958                 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
959
960         msg_print(_("閃光のブレスを吐いた。", "You breathe light."));
961         damage = monspell_bluemage_damage(caster_ptr, (MS_BR_LITE), plev, DAM_ROLL);
962                 fire_breath(caster_ptr, GF_LITE, dir, damage, (plev > 40 ? 3 : 2));
963                 break;
964         case MS_BR_DARK:
965                 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
966
967         msg_print(_("暗黒のブレスを吐いた。", "You breathe darkness."));
968         damage = monspell_bluemage_damage(caster_ptr, (MS_BR_DARK), plev, DAM_ROLL);
969                 fire_breath(caster_ptr, GF_DARK, dir, damage, (plev > 40 ? 3 : 2));
970                 break;
971         case MS_BR_CONF:
972                 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
973
974         msg_print(_("混乱のブレスを吐いた。", "You breathe confusion."));
975         damage = monspell_bluemage_damage(caster_ptr, (MS_BR_CONF), plev, DAM_ROLL);
976                 fire_breath(caster_ptr, GF_CONFUSION, dir, damage, (plev > 40 ? 3 : 2));
977                 break;
978         case MS_BR_SOUND:
979                 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
980
981         msg_print(_("轟音のブレスを吐いた。", "You breathe sound."));
982         damage = monspell_bluemage_damage(caster_ptr, (MS_BR_SOUND), plev, DAM_ROLL);
983                 fire_breath(caster_ptr, GF_SOUND, dir, damage, (plev > 40 ? 3 : 2));
984                 break;
985         case MS_BR_CHAOS:
986                 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
987
988         msg_print(_("カオスのブレスを吐いた。", "You breathe chaos."));
989         damage = monspell_bluemage_damage(caster_ptr, (MS_BR_CHAOS), plev, DAM_ROLL);
990                 fire_breath(caster_ptr, GF_CHAOS, dir, damage, (plev > 40 ? 3 : 2));
991                 break;
992         case MS_BR_DISEN:
993                 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
994
995         msg_print(_("劣化のブレスを吐いた。", "You breathe disenchantment."));
996         damage = monspell_bluemage_damage(caster_ptr, (MS_BR_DISEN), plev, DAM_ROLL);
997                 fire_breath(caster_ptr, GF_DISENCHANT, dir, damage, (plev > 40 ? 3 : 2));
998                 break;
999         case MS_BR_NEXUS:
1000                 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1001
1002         msg_print(_("因果混乱のブレスを吐いた。", "You breathe nexus."));
1003         damage = monspell_bluemage_damage(caster_ptr, (MS_BR_NEXUS), plev, DAM_ROLL);
1004                 fire_breath(caster_ptr, GF_NEXUS, dir, damage, (plev > 40 ? 3 : 2));
1005                 break;
1006         case MS_BR_TIME:
1007                 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1008
1009         msg_print(_("時間逆転のブレスを吐いた。", "You breathe time."));
1010         damage = monspell_bluemage_damage(caster_ptr, (MS_BR_TIME), plev, DAM_ROLL);
1011                 fire_breath(caster_ptr, GF_TIME, dir, damage, (plev > 40 ? 3 : 2));
1012                 break;
1013         case MS_BR_INERTIA:
1014                 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1015
1016         msg_print(_("遅鈍のブレスを吐いた。", "You breathe inertia."));
1017         damage = monspell_bluemage_damage(caster_ptr, (MS_BR_INERTIA), plev, DAM_ROLL);
1018                 fire_breath(caster_ptr, GF_INERTIAL, dir, damage, (plev > 40 ? 3 : 2));
1019                 break;
1020         case MS_BR_GRAVITY:
1021                 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1022
1023         msg_print(_("重力のブレスを吐いた。", "You breathe gravity."));
1024         damage = monspell_bluemage_damage(caster_ptr, (MS_BR_GRAVITY), plev, DAM_ROLL);
1025                 fire_breath(caster_ptr, GF_GRAVITY, dir, damage, (plev > 40 ? 3 : 2));
1026                 break;
1027         case MS_BR_SHARDS:
1028         if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1029
1030         msg_print(_("破片のブレスを吐いた。", "You breathe shards."));
1031         damage = monspell_bluemage_damage(caster_ptr, (MS_BR_SHARDS), plev, DAM_ROLL);
1032                 fire_breath(caster_ptr, GF_SHARDS, dir, damage, (plev > 40 ? 3 : 2));
1033                 break;
1034         case MS_BR_PLASMA:
1035         if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1036
1037         msg_print(_("プラズマのブレスを吐いた。", "You breathe plasma."));
1038         damage = monspell_bluemage_damage(caster_ptr, (MS_BR_PLASMA), plev, DAM_ROLL);
1039                 fire_breath(caster_ptr, GF_PLASMA, dir, damage, (plev > 40 ? 3 : 2));
1040                 break;
1041         case MS_BR_FORCE:
1042         if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1043
1044         msg_print(_("フォースのブレスを吐いた。", "You breathe force."));
1045         damage = monspell_bluemage_damage(caster_ptr, (MS_BR_FORCE), plev, DAM_ROLL);
1046                 fire_breath(caster_ptr, GF_FORCE, dir, damage, (plev > 40 ? 3 : 2));
1047                 break;
1048         case MS_BR_MANA:
1049                 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1050
1051         msg_print(_("魔力のブレスを吐いた。", "You breathe mana."));
1052         damage = monspell_bluemage_damage(caster_ptr, (MS_BR_MANA), plev, DAM_ROLL);
1053                 fire_breath(caster_ptr, GF_MANA, dir, damage, (plev > 40 ? 3 : 2));
1054                 break;
1055         case MS_BALL_NUKE:
1056                 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1057
1058         msg_print(_("放射能球を放った。", "You cast a ball of radiation."));
1059         damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_NUKE), plev, DAM_ROLL);
1060                 fire_ball(caster_ptr, GF_NUKE, dir, damage, 2);
1061                 break;
1062         case MS_BR_NUKE:
1063                 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1064
1065         msg_print(_("放射性廃棄物のブレスを吐いた。", "You breathe toxic waste."));
1066         damage = monspell_bluemage_damage(caster_ptr, (MS_BR_NUKE), plev, DAM_ROLL);
1067                 fire_breath(caster_ptr, GF_NUKE, dir, damage, (plev > 40 ? 3 : 2));
1068                 break;
1069         case MS_BALL_CHAOS:
1070                 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1071
1072         msg_print(_("純ログルスを放った。", "You invoke a raw Logrus."));
1073         damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_CHAOS), plev, DAM_ROLL);
1074                 fire_ball(caster_ptr, GF_CHAOS, dir, damage, 4);
1075                 break;
1076         case MS_BR_DISI:
1077                 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1078
1079         msg_print(_("分解のブレスを吐いた。", "You breathe disintegration."));
1080         damage = monspell_bluemage_damage(caster_ptr, (MS_BR_DISI), plev, DAM_ROLL);
1081                 fire_breath(caster_ptr, GF_DISINTEGRATE, dir, damage, (plev > 40 ? 3 : 2));
1082                 break;
1083         case MS_BALL_ACID:
1084                 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1085
1086         msg_print(_("アシッド・ボールの呪文を唱えた。", "You cast an acid ball."));
1087         damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_ACID), plev, DAM_ROLL);
1088                 fire_ball(caster_ptr, GF_ACID, dir, damage, 2);
1089                 break;
1090         case MS_BALL_ELEC:
1091         if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1092
1093         msg_print(_("サンダー・ボールの呪文を唱えた。", "You cast a lightning ball."));
1094         damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_ELEC), plev, DAM_ROLL);
1095                 fire_ball(caster_ptr, GF_ELEC, dir, damage, 2);
1096                 break;
1097         case MS_BALL_FIRE:
1098                 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1099
1100         msg_print(_("ファイア・ボールの呪文を唱えた。", "You cast a fire ball."));
1101         damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_FIRE), plev, DAM_ROLL);
1102                 fire_ball(caster_ptr, GF_FIRE, dir, damage, 2);
1103                 break;
1104         case MS_BALL_COLD:
1105         if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1106
1107         msg_print(_("アイス・ボールの呪文を唱えた。", "You cast a frost ball."));
1108         damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_COLD), plev, DAM_ROLL);
1109                 fire_ball(caster_ptr, GF_COLD, dir, damage, 2);
1110                 break;
1111         case MS_BALL_POIS:
1112                 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1113
1114         msg_print(_("悪臭雲の呪文を唱えた。", "You cast a stinking cloud."));
1115         damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_POIS), plev, DAM_ROLL);
1116                 fire_ball(caster_ptr, GF_POIS, dir, damage, 2);
1117                 break;
1118         case MS_BALL_NETHER:
1119         if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1120
1121         msg_print(_("地獄球の呪文を唱えた。", "You cast a nether ball."));
1122         damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_NETHER), plev, DAM_ROLL);
1123                 fire_ball(caster_ptr, GF_NETHER, dir, damage, 2);
1124                 break;
1125         case MS_BALL_WATER:
1126                 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1127
1128         msg_print(_("流れるような身振りをした。", "You gesture fluidly."));
1129         damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_WATER), plev, DAM_ROLL);
1130                 fire_ball(caster_ptr, GF_WATER, dir, damage, 4);
1131                 break;
1132         case MS_BALL_MANA:
1133         if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1134
1135         msg_print(_("魔力の嵐の呪文を念じた。", "You invoke a mana storm."));
1136         damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_MANA), plev, DAM_ROLL);
1137                 fire_ball(caster_ptr, GF_MANA, dir, damage, 4);
1138                 break;
1139         case MS_BALL_DARK:
1140                 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1141
1142         msg_print(_("暗黒の嵐の呪文を念じた。", "You invoke a darkness storm."));
1143         damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_DARK), plev, DAM_ROLL);
1144                 fire_ball(caster_ptr, GF_DARK, dir, damage, 4);
1145                 break;
1146         case MS_DRAIN_MANA:
1147                 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1148
1149         damage = monspell_bluemage_damage(caster_ptr, (MS_DRAIN_MANA), plev, DAM_ROLL);
1150         fire_ball_hide(caster_ptr, GF_DRAIN_MANA, dir, damage, 0);
1151                 break;
1152         case MS_MIND_BLAST:
1153                 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1154
1155         damage = monspell_bluemage_damage(caster_ptr, (MS_MIND_BLAST), plev, DAM_ROLL);
1156                 fire_ball_hide(caster_ptr, GF_MIND_BLAST, dir, damage, 0);
1157                 break;
1158         case MS_BRAIN_SMASH:
1159         if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1160
1161         damage = monspell_bluemage_damage(caster_ptr, (MS_BRAIN_SMASH), plev, DAM_ROLL);
1162                 fire_ball_hide(caster_ptr, GF_BRAIN_SMASH, dir, damage, 0);
1163                 break;
1164         case MS_CAUSE_1:
1165                 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1166
1167         damage = monspell_bluemage_damage(caster_ptr, (MS_CAUSE_1), plev, DAM_ROLL);
1168                 fire_ball_hide(caster_ptr, GF_CAUSE_1, dir, damage, 0);
1169                 break;
1170         case MS_CAUSE_2:
1171                 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1172
1173         damage = monspell_bluemage_damage(caster_ptr, (MS_CAUSE_2), plev, DAM_ROLL);
1174                 fire_ball_hide(caster_ptr, GF_CAUSE_2, dir, damage, 0);
1175                 break;
1176         case MS_CAUSE_3:
1177                 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1178
1179         damage = monspell_bluemage_damage(caster_ptr, (MS_CAUSE_3), plev, DAM_ROLL);
1180                 fire_ball_hide(caster_ptr, GF_CAUSE_3, dir, damage, 0);
1181                 break;
1182         case MS_CAUSE_4:
1183                 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1184
1185         damage = monspell_bluemage_damage(caster_ptr, (MS_CAUSE_4), plev, DAM_ROLL);
1186                 fire_ball_hide(caster_ptr, GF_CAUSE_4, dir, damage, 0);
1187                 break;
1188         case MS_BOLT_ACID:
1189                 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1190
1191         msg_print(_("アシッド・ボルトの呪文を唱えた。", "You cast an acid bolt."));
1192         damage = monspell_bluemage_damage(caster_ptr, (MS_BOLT_ACID), plev, DAM_ROLL);
1193         fire_bolt(caster_ptr, GF_ACID, dir, damage);
1194                 break;
1195         case MS_BOLT_ELEC:
1196                 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1197
1198         msg_print(_("サンダー・ボルトの呪文を唱えた。", "You cast a lightning bolt."));
1199         damage = monspell_bluemage_damage(caster_ptr, (MS_BOLT_ELEC), plev, DAM_ROLL);
1200                 fire_bolt(caster_ptr, GF_ELEC, dir, damage);
1201                 break;
1202         case MS_BOLT_FIRE:
1203                 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1204
1205         msg_print(_("ファイア・ボルトの呪文を唱えた。", "You cast a fire bolt."));
1206         damage = monspell_bluemage_damage(caster_ptr, (MS_BOLT_FIRE), plev, DAM_ROLL);
1207                 fire_bolt(caster_ptr, GF_FIRE, dir, damage);
1208                 break;
1209         case MS_BOLT_COLD:
1210                 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1211
1212         msg_print(_("アイス・ボルトの呪文を唱えた。", "You cast a frost bolt."));
1213         damage = monspell_bluemage_damage(caster_ptr, (MS_BOLT_COLD), plev, DAM_ROLL);
1214                 fire_bolt(caster_ptr, GF_COLD, dir, damage);
1215                 break;
1216         case MS_STARBURST:
1217                 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1218
1219         msg_print(_("スターバーストの呪文を念じた。", "You invoke a starburst."));
1220         damage = monspell_bluemage_damage(caster_ptr, (MS_STARBURST), plev, DAM_ROLL);
1221                 fire_ball(caster_ptr, GF_LITE, dir, damage, 4);
1222                 break;
1223         case MS_BOLT_NETHER:
1224                 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1225
1226         msg_print(_("地獄の矢の呪文を唱えた。", "You cast a nether bolt."));
1227         damage = monspell_bluemage_damage(caster_ptr, (MS_BOLT_NETHER), plev, DAM_ROLL);
1228                 fire_bolt(caster_ptr, GF_NETHER, dir, damage);
1229                 break;
1230         case MS_BOLT_WATER:
1231                 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1232
1233         msg_print(_("ウォーター・ボルトの呪文を唱えた。", "You cast a water bolt."));
1234         damage = monspell_bluemage_damage(caster_ptr, (MS_BOLT_WATER), plev, DAM_ROLL);
1235                 fire_bolt(caster_ptr, GF_WATER, dir, damage);
1236                 break;
1237         case MS_BOLT_MANA:
1238                 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1239
1240         msg_print(_("魔力の矢の呪文を唱えた。", "You cast a mana bolt."));
1241         damage = monspell_bluemage_damage(caster_ptr, (MS_BOLT_MANA), plev, DAM_ROLL);
1242                 fire_bolt(caster_ptr, GF_MANA, dir, damage);
1243                 break;
1244         case MS_BOLT_PLASMA:
1245                 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1246
1247         msg_print(_("プラズマ・ボルトの呪文を唱えた。", "You cast a plasma bolt."));
1248         damage = monspell_bluemage_damage(caster_ptr, (MS_BOLT_PLASMA), plev, DAM_ROLL);
1249                 fire_bolt(caster_ptr, GF_PLASMA, dir, damage);
1250                 break;
1251         case MS_BOLT_ICE:
1252                 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1253
1254         msg_print(_("極寒の矢の呪文を唱えた。", "You cast a ice bolt."));
1255         damage = monspell_bluemage_damage(caster_ptr, (MS_BOLT_ICE), plev, DAM_ROLL);
1256                 fire_bolt(caster_ptr, GF_ICE, dir, damage);
1257                 break;
1258         case MS_MAGIC_MISSILE:
1259                 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1260
1261         msg_print(_("マジック・ミサイルの呪文を唱えた。", "You cast a magic missile."));
1262         damage = monspell_bluemage_damage(caster_ptr, (MS_MAGIC_MISSILE), plev, DAM_ROLL);
1263                 fire_bolt(caster_ptr, GF_MISSILE, dir, damage);
1264                 break;
1265         case MS_SCARE:
1266                 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1267
1268         msg_print(_("恐ろしげな幻覚を作り出した。", "You cast a fearful illusion."));
1269                 fear_monster(caster_ptr, dir, plev+10);
1270                 break;
1271         case MS_BLIND:
1272                 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1273                 confuse_monster(caster_ptr, dir, plev * 2);
1274                 break;
1275         case MS_CONF:
1276                 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1277
1278         msg_print(_("誘惑的な幻覚をつくり出した。", "You cast a mesmerizing illusion."));
1279                 confuse_monster(caster_ptr, dir, plev * 2);
1280                 break;
1281         case MS_SLOW:
1282                 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1283                 slow_monster(caster_ptr, dir, plev);
1284                 break;
1285         case MS_SLEEP:
1286                 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1287                 sleep_monster(caster_ptr, dir, plev);
1288                 break;
1289         case MS_SPEED:
1290                 (void)set_fast(caster_ptr, randint1(20 + plev) + plev, FALSE);
1291                 break;
1292         case MS_HAND_DOOM:
1293         {
1294                 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1295
1296         msg_print(_("<破滅の手>を放った!", "You invoke the Hand of Doom!"));
1297                 fire_ball_hide(caster_ptr, GF_HAND_DOOM, dir, plev * 3, 0);
1298                 break;
1299         }
1300         case MS_HEAL:
1301         msg_print(_("自分の傷に念を集中した。", "You concentrate on your wounds!"));
1302                 (void)hp_player(caster_ptr, plev*4);
1303                 (void)set_stun(caster_ptr, 0);
1304                 (void)set_cut(caster_ptr,0);
1305                 break;
1306         case MS_INVULNER:
1307         msg_print(_("無傷の球の呪文を唱えた。", "You cast a Globe of Invulnerability."));
1308                 (void)set_invuln(caster_ptr, randint1(4) + 4, FALSE);
1309                 break;
1310         case MS_BLINK:
1311                 teleport_player(caster_ptr, 10, TELEPORT_SPONTANEOUS);
1312                 break;
1313         case MS_TELEPORT:
1314                 teleport_player(caster_ptr, plev * 5, TELEPORT_SPONTANEOUS);
1315                 break;
1316         case MS_WORLD:
1317                 (void)time_walk(caster_ptr);
1318                 break;
1319         case MS_SPECIAL:
1320                 break;
1321         case MS_TELE_TO:
1322         {
1323                 monster_type *m_ptr;
1324                 monster_race *r_ptr;
1325                 GAME_TEXT m_name[MAX_NLEN];
1326
1327                 if (!target_set(caster_ptr, TARGET_KILL)) return FALSE;
1328                 if (!floor_ptr->grid_array[target_row][target_col].m_idx) break;
1329                 if (!player_has_los_bold(caster_ptr, target_row, target_col)) break;
1330                 if (!projectable(caster_ptr, caster_ptr->y, caster_ptr->x, target_row, target_col)) break;
1331                 m_ptr = &floor_ptr->m_list[floor_ptr->grid_array[target_row][target_col].m_idx];
1332                 r_ptr = &r_info[m_ptr->r_idx];
1333                 monster_desc(caster_ptr, m_name, m_ptr, 0);
1334                 if (r_ptr->flagsr & RFR_RES_TELE)
1335                 {
1336                         if ((r_ptr->flags1 & (RF1_UNIQUE)) || (r_ptr->flagsr & RFR_RES_ALL))
1337                         {
1338                                 if (is_original_ap_and_seen(caster_ptr, m_ptr)) r_ptr->r_flagsr |= RFR_RES_TELE;
1339                 msg_format(_("%sには効果がなかった!", "%s is unaffected!"), m_name);
1340                                 break;
1341                         }
1342                         else if (r_ptr->level > randint1(100))
1343                         {
1344                                 if (is_original_ap_and_seen(caster_ptr, m_ptr)) r_ptr->r_flagsr |= RFR_RES_TELE;
1345                 msg_format(_("%sには耐性がある!", "%s resists!"), m_name);
1346                                 break;
1347                         }
1348                 }
1349
1350         msg_format(_("%sを引き戻した。", "You command %s to return."), m_name);
1351                 teleport_monster_to(caster_ptr, floor_ptr->grid_array[target_row][target_col].m_idx, caster_ptr->y, caster_ptr->x, 100, TELEPORT_PASSIVE);
1352                 break;
1353         }
1354         case MS_TELE_AWAY:
1355                 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1356
1357                 (void)fire_beam(caster_ptr, GF_AWAY_ALL, dir, 100);
1358                 break;
1359
1360         case MS_TELE_LEVEL:
1361                 return teleport_level_other(caster_ptr);
1362                 break;
1363
1364         case MS_PSY_SPEAR:
1365                 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1366
1367         msg_print(_("光の剣を放った。", "You throw a psycho-spear."));
1368         damage = monspell_bluemage_damage(caster_ptr, (MS_PSY_SPEAR), plev, DAM_ROLL);
1369                 (void)fire_beam(caster_ptr, GF_PSY_SPEAR, dir, damage);
1370                 break;
1371         case MS_DARKNESS:
1372
1373         msg_print(_("暗闇の中で手を振った。", "You gesture in shadow."));
1374                 (void)unlite_area(caster_ptr, 10, 3);
1375                 break;
1376         case MS_MAKE_TRAP:
1377                 if (!target_set(caster_ptr, TARGET_KILL)) return FALSE;
1378
1379         msg_print(_("呪文を唱えて邪悪に微笑んだ。", "You cast a spell and cackle evilly."));
1380                 trap_creation(caster_ptr, target_row, target_col);
1381                 break;
1382         case MS_FORGET:
1383         msg_print(_("しかし何も起きなかった。", "Nothing happen."));
1384                 break;
1385     case MS_RAISE_DEAD:
1386         msg_print(_("死者復活の呪文を唱えた。", "You animate the dead."));
1387                 (void)animate_dead(caster_ptr, 0, caster_ptr->y, caster_ptr->x);
1388                 break;
1389         case MS_S_KIN:
1390         {
1391         msg_print(_("援軍を召喚した。", "You summon one of your kin."));
1392                 for (int k = 0;k < 1; k++)
1393                 {
1394                         if (summon_kin_player(caster_ptr, summon_lev, caster_ptr->y, caster_ptr->x, (pet ? PM_FORCE_PET : 0L)))
1395                         {
1396                                 if (!pet) msg_print(_("召喚された仲間は怒っている!", "The summoned companion is angry!"));
1397                         }
1398                         else
1399                         {
1400                                 no_trump = TRUE;
1401                         }
1402                 }
1403
1404                 break;
1405         }
1406         case MS_S_CYBER:
1407         {
1408         msg_print(_("サイバーデーモンを召喚した!", "You summon a Cyberdemon!"));
1409                 for (int k = 0; k < 1; k++)
1410                 {
1411                         if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_CYBER, p_mode))
1412                         {
1413                                 if (!pet)
1414                                         msg_print(_("召喚されたサイバーデーモンは怒っている!", "The summoned Cyberdemon are angry!"));
1415                         }
1416                         else
1417                         {
1418                                 no_trump = TRUE;
1419                         }
1420                 }
1421                 break;
1422         }
1423         case MS_S_MONSTER:
1424         {
1425         msg_print(_("仲間を召喚した。", "You summon help."));
1426                 for (int k = 0; k < 1; k++)
1427                 {
1428                         if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, 0, p_mode))
1429                         {
1430                                 if (!pet)
1431                                         msg_print(_("召喚されたモンスターは怒っている!", "The summoned monster is angry!"));
1432                         }
1433                         else
1434                         {
1435                                 no_trump = TRUE;
1436                         }
1437                 }
1438                 
1439                 break;
1440         }
1441         case MS_S_MONSTERS:
1442         {
1443         msg_print(_("モンスターを召喚した!", "You summon monsters!"));
1444                 for (int k = 0; k < plev / 15 + 2; k++)
1445                 {
1446                         if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, 0, (p_mode | u_mode)))
1447                         {
1448                                 if (!pet)
1449                                         msg_print(_("召喚されたモンスターは怒っている!", "The summoned monsters are angry!"));
1450                         }
1451                         else
1452                         {
1453                                 no_trump = TRUE;
1454                         }
1455                 }
1456                 
1457                 break;
1458         }
1459         case MS_S_ANT:
1460         {
1461         msg_print(_("アリを召喚した。", "You summon ants."));
1462                 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_ANT, (PM_ALLOW_GROUP | p_mode)))
1463                 {
1464                         if (!pet)
1465                                 msg_print(_("召喚されたアリは怒っている!", "The summoned ants are angry!"));
1466                 }
1467                 else
1468                 {
1469                         no_trump = TRUE;
1470                 }
1471                 break;
1472         }
1473         case MS_S_SPIDER:
1474         {
1475         msg_print(_("蜘蛛を召喚した。", "You summon spiders."));
1476                 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_SPIDER, (PM_ALLOW_GROUP | p_mode)))
1477                 {
1478                         if (!pet)
1479                                 msg_print(_("召喚された蜘蛛は怒っている!", "Summoned spiders are angry!"));
1480                 }
1481                 else
1482                 {
1483                         no_trump = TRUE;
1484                 }
1485
1486                 break;
1487         }
1488         case MS_S_HOUND:
1489         {
1490         msg_print(_("ハウンドを召喚した。", "You summon hounds."));
1491                 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_HOUND, (PM_ALLOW_GROUP | p_mode)))
1492                 {
1493                         if (!pet)
1494                                 msg_print(_("召喚されたハウンドは怒っている!", "Summoned hounds are angry!"));
1495                 }
1496                 else
1497                 {
1498                         no_trump = TRUE;
1499                 }
1500
1501                 break;
1502         }
1503         case MS_S_HYDRA:
1504         {
1505         msg_print(_("ヒドラを召喚した。", "You summon a hydras."));
1506                 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_HYDRA, (g_mode | p_mode)))
1507                 {
1508                         if (!pet)
1509                                 msg_print(_("召喚されたヒドラは怒っている!", "Summoned hydras are angry!"));
1510                 }
1511                 else
1512                 {
1513                         no_trump = TRUE;
1514                 }
1515
1516                 break;
1517         }
1518         case MS_S_ANGEL:
1519         {
1520         msg_print(_("天使を召喚した!", "You summon an angel!"));
1521                 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_ANGEL, (g_mode | p_mode)))
1522                 {
1523                         if (!pet)
1524                                 msg_print(_("召喚された天使は怒っている!", "The summoned angel is angry!"));
1525                 }
1526                 else
1527                 {
1528                         no_trump = TRUE;
1529                 }
1530                 break;
1531         }
1532         case MS_S_DEMON:
1533         {
1534         msg_print(_("混沌の宮廷から悪魔を召喚した!", "You summon a demon from the Courts of Chaos!"));
1535                 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_DEMON, (g_mode | p_mode)))
1536                 {
1537                         if (!pet)
1538                                 msg_print(_("召喚されたデーモンは怒っている!", "The summoned demon is angry!"));
1539                 }
1540                 else
1541                 {
1542                         no_trump = TRUE;
1543                 }
1544                 break;
1545         }
1546         case MS_S_UNDEAD:
1547         {
1548         msg_print(_("アンデッドの強敵を召喚した!", "You summon an undead adversary!"));
1549                 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_UNDEAD, (g_mode | p_mode)))
1550                 {
1551                         if (!pet)
1552                                 msg_print(_("召喚されたアンデッドは怒っている!", "The summoned undead is angry!"));
1553                 }
1554                 else
1555                 {
1556                         no_trump = TRUE;
1557                 }
1558                 break;
1559         }
1560         case MS_S_DRAGON:
1561         {
1562         msg_print(_("ドラゴンを召喚した!", "You summon a dragon!"));
1563                 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_DRAGON, (g_mode | p_mode)))
1564                 {
1565                         if (!pet)
1566                                 msg_print(_("召喚されたドラゴンは怒っている!", "The summoned dragon is angry!"));
1567                 }
1568                 else
1569                 {
1570                         no_trump = TRUE;
1571                 }
1572                                 break;
1573         }
1574         case MS_S_HI_UNDEAD:
1575         {
1576         msg_print(_("強力なアンデッドを召喚した!", "You summon a greater undead!"));
1577                 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_HI_UNDEAD, (g_mode | p_mode | u_mode)))
1578                 {
1579                         if (!pet)
1580                                 msg_print(_("召喚された上級アンデッドは怒っている!", "The summoned greater undead is angry!"));
1581                 }
1582                 else
1583                 {
1584                         no_trump = TRUE;
1585                 }
1586                 break;
1587         }
1588         case MS_S_HI_DRAGON:
1589         {
1590                 msg_print(_("古代ドラゴンを召喚した!", "You summon an ancient dragon!"));
1591                 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_HI_DRAGON, (g_mode | p_mode | u_mode)))
1592                 {
1593                         if (!pet)
1594                                 msg_print(_("召喚された古代ドラゴンは怒っている!", "The summoned ancient dragon is angry!"));
1595                 }
1596                 else
1597                 {
1598                         no_trump = TRUE;
1599                 }
1600                 break;
1601         }
1602         case MS_S_AMBERITE:
1603         {
1604         msg_print(_("アンバーの王族を召喚した!", "You summon a Lord of Amber!"));
1605                 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_AMBERITES, (g_mode | p_mode | u_mode)))
1606                 {
1607                         if (!pet)
1608                                 msg_print(_("召喚されたアンバーの王族は怒っている!", "The summoned Lord of Amber is angry!"));
1609                 }
1610                 else
1611                 {
1612                         no_trump = TRUE;
1613                 }
1614                 break;
1615         }
1616         case MS_S_UNIQUE:
1617         {
1618                 int k, count = 0;
1619                 msg_print(_("特別な強敵を召喚した!", "You summon a special opponent!"));
1620                 for (k = 0; k < 1; k++)
1621                 {
1622                         if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_UNIQUE, (g_mode | p_mode | PM_ALLOW_UNIQUE)))
1623                         {
1624                                 count++;
1625                                 if (!pet)
1626                                         msg_print(_("召喚されたユニーク・モンスターは怒っている!", "The summoned special opponent is angry!"));
1627                         }
1628                 }
1629
1630                 for (k = count; k < 1; k++)
1631                 {
1632                         if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_HI_UNDEAD, (g_mode | p_mode | PM_ALLOW_UNIQUE)))
1633                         {
1634                                 count++;
1635                                 if (!pet)
1636                                         msg_print(_("召喚された上級アンデッドは怒っている!", "The summoned greater undead is angry!"));
1637                         }
1638                 }
1639
1640                 if (!count)
1641                 {
1642                         no_trump = TRUE;
1643                 }
1644
1645                 break;
1646         }
1647         default:
1648                 msg_print("hoge?");
1649         }
1650
1651         if (no_trump)
1652     {
1653         msg_print(_("何も現れなかった。", "No one appeared."));
1654         }
1655
1656         return TRUE;
1657 }
1658
1659
1660 /*!
1661  * @brief 青魔法コマンドのメインルーチン /
1662  * do_cmd_cast calls this function if the player's class is 'Blue-Mage'.
1663  * @return 処理を実行したらTRUE、キャンセルした場合FALSEを返す。
1664  */
1665 bool do_cmd_cast_learned(player_type *caster_ptr)
1666 {
1667         SPELL_IDX n = 0;
1668         PERCENTAGE chance;
1669         PERCENTAGE minfail = 0;
1670         PLAYER_LEVEL plev = caster_ptr->lev;
1671         monster_power spell;
1672         bool cast;
1673         MANA_POINT need_mana;
1674
1675         if (cmd_limit_confused(caster_ptr)) return FALSE;
1676
1677         if (!get_learned_power(caster_ptr, &n)) return FALSE;
1678
1679         spell = monster_powers[n];
1680
1681         need_mana = mod_need_mana(caster_ptr, spell.smana, 0, REALM_NONE);
1682
1683         /* Verify "dangerous" spells */
1684         if (need_mana > caster_ptr->csp)
1685         {
1686                 /* Warning */
1687                 msg_print(_("MPが足りません。", "You do not have enough mana to use this power."));
1688
1689                 if (!over_exert) return FALSE;
1690
1691                 /* Verify */
1692                 if (!get_check(_("それでも挑戦しますか? ", "Attempt it anyway? "))) return FALSE;
1693         }
1694
1695         /* Spell failure chance */
1696         chance = spell.fail;
1697
1698         /* Reduce failure rate by "effective" level adjustment */
1699         if (plev > spell.level) chance -= 3 * (plev - spell.level);
1700         else chance += (spell.level - plev);
1701
1702         /* Reduce failure rate by INT/WIS adjustment */
1703         chance -= 3 * (adj_mag_stat[caster_ptr->stat_ind[A_INT]] - 1);
1704
1705         chance = mod_spell_chance_1(caster_ptr, chance);
1706
1707         /* Not enough mana to cast */
1708         if (need_mana > caster_ptr->csp)
1709         {
1710                 chance += 5 * (need_mana - caster_ptr->csp);
1711         }
1712
1713         /* Extract the minimum failure rate */
1714         minfail = adj_mag_fail[caster_ptr->stat_ind[A_INT]];
1715
1716         /* Minimum failure rate */
1717         if (chance < minfail) chance = minfail;
1718
1719         /* Stunning makes spells harder */
1720         if (caster_ptr->stun > 50) chance += 25;
1721         else if (caster_ptr->stun) chance += 15;
1722
1723         /* Always a 5 percent chance of working */
1724         if (chance > 95) chance = 95;
1725
1726         chance = mod_spell_chance_2(caster_ptr, chance);
1727
1728         /* Failed spell */
1729         if (randint0(100) < chance)
1730         {
1731                 if (flush_failure) flush();
1732                 msg_print(_("魔法をうまく唱えられなかった。", "You failed to concentrate hard enough!"));
1733
1734                 sound(SOUND_FAIL);
1735
1736                 if (n >= MS_S_KIN)
1737                         cast = cast_learned_spell(caster_ptr, n, FALSE);
1738         }
1739         else
1740         {
1741                 sound(SOUND_ZAP);
1742                 cast = cast_learned_spell(caster_ptr, n, TRUE);
1743                 if (!cast) return FALSE;
1744         }
1745
1746         /* Sufficient mana */
1747         if (need_mana <= caster_ptr->csp)
1748         {
1749                 /* Use some mana */
1750                 caster_ptr->csp -= need_mana;
1751         }
1752         else
1753         {
1754                 int oops = need_mana;
1755
1756                 /* No mana left */
1757                 caster_ptr->csp = 0;
1758                 caster_ptr->csp_frac = 0;
1759
1760                 msg_print(_("精神を集中しすぎて気を失ってしまった!", "You faint from the effort!"));
1761
1762                 /* Hack -- Bypass free action */
1763                 (void)set_paralyzed(caster_ptr, caster_ptr->paralyzed + randint1(5 * oops + 1));
1764
1765                 chg_virtue(caster_ptr, V_KNOWLEDGE, -10);
1766
1767                 /* Damage CON (possibly permanently) */
1768                 if (randint0(100) < 50)
1769                 {
1770                         bool perm = (randint0(100) < 25);
1771
1772                         msg_print(_("体を悪くしてしまった!", "You have damaged your health!"));
1773
1774                         /* Reduce constitution */
1775                         (void)dec_stat(caster_ptr, A_CON, 15 + randint1(10), perm);
1776                 }
1777         }
1778
1779         take_turn(caster_ptr, 100);
1780
1781         caster_ptr->redraw |= (PR_MANA);
1782         caster_ptr->window |= (PW_PLAYER | PW_SPELL);
1783
1784         return TRUE;
1785 }
1786
1787
1788 /*!
1789  * @brief 青魔法のラーニング判定と成功した場合のラーニング処理
1790  * @param monspell ラーニングを試みるモンスター攻撃のID
1791  * @return なし
1792  */
1793 void learn_spell(player_type *learner_ptr, int monspell)
1794 {
1795         if (learner_ptr->action != ACTION_LEARN) return;
1796         if (monspell < 0) return;
1797         if (learner_ptr->magic_num2[monspell]) return;
1798         if (learner_ptr->confused || learner_ptr->blind || learner_ptr->image || learner_ptr->stun || learner_ptr->paralyzed) return;
1799         if (randint1(learner_ptr->lev + 70) > monster_powers[monspell].level + 40)
1800         {
1801                 learner_ptr->magic_num2[monspell] = 1;
1802                 msg_format(_("%sを学習した!", "You have learned %s!"), monster_powers[monspell].name);
1803                 gain_exp(learner_ptr, monster_powers[monspell].level * monster_powers[monspell].smana);
1804
1805                 sound(SOUND_STUDY);
1806
1807                 learner_ptr->new_mane = TRUE;
1808                 learner_ptr->redraw |= (PR_STATE);
1809         }
1810 }
1811
1812
1813 /*!
1814  * todo f4, f5, f6を構造体にまとめ直す
1815  * @brief モンスター特殊能力のフラグ配列から特定条件の魔法だけを抜き出す処理
1816  * Extract monster spells mask for the given mode
1817  * @param f4 モンスター特殊能力の4番目のフラグ配列
1818  * @param f5 モンスター特殊能力の5番目のフラグ配列
1819  * @param f6 モンスター特殊能力の6番目のフラグ配列
1820  * @param mode 抜き出したい条件
1821  * @return なし
1822  */
1823 /*
1824  */
1825 void set_rf_masks(BIT_FLAGS *f4, BIT_FLAGS *f5, BIT_FLAGS *f6, BIT_FLAGS mode)
1826 {
1827         switch (mode)
1828         {
1829                 case MONSPELL_TYPE_BOLT:
1830                         *f4 = ((RF4_BOLT_MASK | RF4_BEAM_MASK) & ~(RF4_ROCKET));
1831                         *f5 = RF5_BOLT_MASK | RF5_BEAM_MASK;
1832                         *f6 = RF6_BOLT_MASK | RF6_BEAM_MASK;
1833                         break;
1834
1835                 case MONSPELL_TYPE_BALL:
1836                         *f4 = (RF4_BALL_MASK & ~(RF4_BREATH_MASK));
1837                         *f5 = (RF5_BALL_MASK & ~(RF5_BREATH_MASK));
1838                         *f6 = (RF6_BALL_MASK & ~(RF6_BREATH_MASK));
1839                         break;
1840
1841                 case MONSPELL_TYPE_BREATH:
1842                         *f4 = RF4_BREATH_MASK;
1843                         *f5 = RF5_BREATH_MASK;
1844                         *f6 = RF6_BREATH_MASK;
1845                         break;
1846
1847                 case MONSPELL_TYPE_SUMMON:
1848                         *f4 = RF4_SUMMON_MASK;
1849                         *f5 = RF5_SUMMON_MASK;
1850                         *f6 = RF6_SUMMON_MASK;
1851                         break;
1852
1853                 case MONSPELL_TYPE_OTHER:
1854                         *f4 = RF4_ATTACK_MASK & ~(RF4_BOLT_MASK | RF4_BEAM_MASK | RF4_BALL_MASK | RF4_INDIRECT_MASK);
1855                         *f5 = RF5_ATTACK_MASK & ~(RF5_BOLT_MASK | RF5_BEAM_MASK | RF5_BALL_MASK | RF5_INDIRECT_MASK);
1856                         *f6 = RF6_ATTACK_MASK & ~(RF6_BOLT_MASK | RF6_BEAM_MASK | RF6_BALL_MASK | RF6_INDIRECT_MASK);
1857                         break;
1858         }
1859 }