OSDN Git Service

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