OSDN Git Service

[Refactor] #38997 teleport_monster_to() にplayer_type * 引数を追加 / Added player_type...
[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 sn 選択したモンスター攻撃ID、キャンセルの場合-1、不正な選択の場合-2を返す
442  * @return 発動可能な魔法を選択した場合TRUE、キャンセル処理か不正な選択が行われた場合FALSEを返す。
443  * @details
444  * If a valid spell is chosen, saves it in '*sn' and returns TRUE\n
445  * If the user hits escape, returns FALSE, and set '*sn' to -1\n
446  * If there are no legal choices, returns FALSE, and sets '*sn' to -2\n
447  *\n
448  * The "prompt" should be "cast", "recite", or "study"\n
449  * The "known" should be TRUE for cast/pray, FALSE for study\n
450  *\n
451  * nb: This function has a (trivial) display bug which will be obvious\n
452  * when you run it. It's probably easy to fix but I haven't tried,\n
453  * sorry.\n
454  */
455 static bool get_learned_power(SPELL_IDX *sn)
456 {
457         int             i = 0;
458         int             num = 0;
459         TERM_LEN y = 1;
460         TERM_LEN x = 18;
461         PERCENTAGE minfail = 0;
462         PLAYER_LEVEL plev = p_ptr->lev;
463         PERCENTAGE chance = 0;
464         int             ask = TRUE, mode = 0;
465         int             spellnum[MAX_MONSPELLS];
466         char            ch;
467         char            choice;
468         char            out_val[160];
469         char            comment[80];
470         BIT_FLAGS f4 = 0L, f5 = 0L, f6 = 0L;
471         concptr p = _("魔法", "magic");
472         COMMAND_CODE code;
473         monster_power   spell;
474         bool            flag, redraw;
475         int menu_line = (use_menu ? 1 : 0);
476
477         /* Assume cancelled */
478         *sn = (-1);
479
480         flag = FALSE;
481         redraw = FALSE;
482
483         /* Get the spell, if available */
484         
485         if (repeat_pull(&code))
486         {
487                 *sn = (SPELL_IDX)code;
488                 return (TRUE);
489         }
490
491         if (use_menu)
492         {
493                 screen_save();
494
495                 while(!mode)
496                 {
497                         prt(format(_(" %s ボルト", " %s bolt"), (menu_line == 1) ? _("》", "> ") : "  "), 2, 14);
498                         prt(format(_(" %s ボール", " %s ball"), (menu_line == 2) ? _("》", "> ") : "  "), 3, 14);
499                         prt(format(_(" %s ブレス", " %s breath"), (menu_line == 3) ? _("》", "> ") : "  "), 4, 14);
500                         prt(format(_(" %s 召喚", " %s sommoning"), (menu_line == 4) ? _("》", "> ") : "  "), 5, 14);
501                         prt(format(_(" %s その他", " %s others"), (menu_line == 5) ? _("》", "> ") : "  "), 6, 14);
502                         prt(_("どの種類の魔法を使いますか?", "use which type of magic? "), 0, 0);
503
504                         choice = inkey();
505                         switch(choice)
506                         {
507                         case ESCAPE:
508                         case 'z':
509                         case 'Z':
510                                 screen_load();
511                                 return FALSE;
512                         case '2':
513                         case 'j':
514                         case 'J':
515                                 menu_line++;
516                                 break;
517                         case '8':
518                         case 'k':
519                         case 'K':
520                                 menu_line+= 4;
521                                 break;
522                         case '\r':
523                         case 'x':
524                         case 'X':
525                                 mode = menu_line;
526                                 break;
527                         }
528                         if (menu_line > 5) menu_line -= 5;
529                 }
530                 screen_load();
531         }
532         else
533         {
534         sprintf(comment, _("[A]ボルト, [B]ボール, [C]ブレス, [D]召喚, [E]その他:", "[A] bolt, [B] ball, [C] breath, [D] summoning, [E] others:"));
535         while (TRUE)
536         {
537                 if (!get_com(comment, &ch, TRUE))
538                 {
539                         return FALSE;
540                 }
541                 if (ch == 'A' || ch == 'a')
542                 {
543                         mode = 1;
544                         break;
545                 }
546                 if (ch == 'B' || ch == 'b')
547                 {
548                         mode = 2;
549                         break;
550                 }
551                 if (ch == 'C' || ch == 'c')
552                 {
553                         mode = 3;
554                         break;
555                 }
556                 if (ch == 'D' || ch == 'd')
557                 {
558                         mode = 4;
559                         break;
560                 }
561                 if (ch == 'E' || ch == 'e')
562                 {
563                         mode = 5;
564                         break;
565                 }
566         }
567         }
568
569         set_rf_masks(&f4, &f5, &f6, mode);
570
571         for (i = 0, num = 0; i < 32; i++)
572         {
573                 if ((0x00000001 << i) & f4) spellnum[num++] = i;
574         }
575         for (; i < 64; i++)
576         {
577                 if ((0x00000001 << (i - 32)) & f5) spellnum[num++] = i;
578         }
579         for (; i < 96; i++)
580         {
581                 if ((0x00000001 << (i - 64)) & f6) spellnum[num++] = i;
582         }
583         for (i = 0; i < num; i++)
584         {
585                 if (p_ptr->magic_num2[spellnum[i]])
586                 {
587                         if (use_menu) menu_line = i+1;
588                         break;
589                 }
590         }
591         if (i == num)
592         {
593                 msg_print(_("その種類の魔法は覚えていない!", "You don't know any spell of this type."));
594                 return (FALSE);
595         }
596
597         /* Build a prompt (accept all spells) */
598         (void)strnfmt(out_val, 78, _("(%c-%c, '*'で一覧, ESC) どの%sを唱えますか?", "(%c-%c, *=List, ESC=exit) Use which %s? "),
599                 I2A(0), I2A(num - 1), p);
600
601         if (use_menu) screen_save();
602
603         choice= (always_show_list || use_menu) ? ESCAPE:1 ;
604         while (!flag)
605         {
606                 if(choice==ESCAPE) choice = ' '; 
607                 else if( !get_com(out_val, &choice, TRUE) )break; 
608
609                 if (use_menu && choice != ' ')
610                 {
611                         switch(choice)
612                         {
613                                 case '0':
614                                 {
615                                         screen_load();
616                                         return (FALSE);
617                                 }
618
619                                 case '8':
620                                 case 'k':
621                                 case 'K':
622                                 {
623                                         do
624                                         {
625                                                 menu_line += (num-1);
626                                                 if (menu_line > num) menu_line -= num;
627                                         } while(!p_ptr->magic_num2[spellnum[menu_line-1]]);
628                                         break;
629                                 }
630
631                                 case '2':
632                                 case 'j':
633                                 case 'J':
634                                 {
635                                         do
636                                         {
637                                                 menu_line++;
638                                                 if (menu_line > num) menu_line -= num;
639                                         } while(!p_ptr->magic_num2[spellnum[menu_line-1]]);
640                                         break;
641                                 }
642
643                                 case '6':
644                                 case 'l':
645                                 case 'L':
646                                 {
647                                         menu_line=num;
648                                         while(!p_ptr->magic_num2[spellnum[menu_line-1]]) menu_line--;
649                                         break;
650                                 }
651
652                                 case '4':
653                                 case 'h':
654                                 case 'H':
655                                 {
656                                         menu_line=1;
657                                         while(!p_ptr->magic_num2[spellnum[menu_line-1]]) menu_line++;
658                                         break;
659                                 }
660
661                                 case 'x':
662                                 case 'X':
663                                 case '\r':
664                                 {
665                                         i = menu_line - 1;
666                                         ask = FALSE;
667                                         break;
668                                 }
669                         }
670                 }
671                 /* Request redraw */
672                 if ((choice == ' ') || (choice == '*') || (choice == '?') || (use_menu && ask))
673                 {
674                         /* Show the list */
675                         if (!redraw || use_menu)
676                         {
677                                 char psi_desc[80];
678                                 redraw = TRUE;
679                                 if (!use_menu) screen_save();
680
681                                 /* Display a list of spells */
682                                 prt("", y, x);
683                                 put_str(_("名前", "Name"), y, x + 5);
684                                 put_str(_("MP 失率 効果", "SP Fail Info"), y, x + 33);
685
686
687                                 /* Dump the spells */
688                                 for (i = 0; i < num; i++)
689                                 {
690                                         int need_mana;
691
692                                         prt("", y + i + 1, x);
693                                         if (!p_ptr->magic_num2[spellnum[i]]) continue;
694
695                                         /* Access the spell */
696                                         spell = monster_powers[spellnum[i]];
697
698                                         chance = spell.fail;
699
700                                         /* Reduce failure rate by "effective" level adjustment */
701                                         if (plev > spell.level) chance -= 3 * (plev - spell.level);
702                                         else chance += (spell.level - plev);
703
704                                         /* Reduce failure rate by INT/WIS adjustment */
705                                         chance -= 3 * (adj_mag_stat[p_ptr->stat_ind[A_INT]] - 1);
706
707                                         chance = mod_spell_chance_1(p_ptr, chance);
708
709                                         need_mana = mod_need_mana(monster_powers[spellnum[i]].smana, 0, REALM_NONE);
710
711                                         /* Not enough mana to cast */
712                                         if (need_mana > p_ptr->csp)
713                                         {
714                                                 chance += 5 * (need_mana - p_ptr->csp);
715                                         }
716
717                                         /* Extract the minimum failure rate */
718                                         minfail = adj_mag_fail[p_ptr->stat_ind[A_INT]];
719
720                                         /* Minimum failure rate */
721                                         if (chance < minfail) chance = minfail;
722
723                                         /* Stunning makes spells harder */
724                                         if (p_ptr->stun > 50) chance += 25;
725                                         else if (p_ptr->stun) chance += 15;
726
727                                         /* Always a 5 percent chance of working */
728                                         if (chance > 95) chance = 95;
729
730                                         chance = mod_spell_chance_2(p_ptr, chance);
731
732                                         /* Get info */
733                                         learned_info(comment, spellnum[i]);
734
735                                         if (use_menu)
736                                         {
737                                                 if (i == (menu_line-1)) strcpy(psi_desc, _("  》", "  > "));
738                                                 else strcpy(psi_desc, "    ");
739                                         }
740                                         else sprintf(psi_desc, "  %c)", I2A(i));
741
742                                         /* Dump the spell --(-- */
743                                         strcat(psi_desc, format(" %-26s %3d %3d%%%s",
744                                                 spell.name, need_mana,
745                                                 chance, comment));
746                                         prt(psi_desc, y + i + 1, x);
747                                 }
748
749                                 /* Clear the bottom line */
750                                 if (y < 22) prt("", y + i + 1, x);
751                         }
752
753                         /* Hide the list */
754                         else
755                         {
756                                 /* Hide list */
757                                 redraw = FALSE;
758                                 screen_load();
759                         }
760
761                         /* Redo asking */
762                         continue;
763                 }
764
765                 if (!use_menu)
766                 {
767                         /* Note verify */
768                         ask = isupper(choice);
769
770                         /* Lowercase */
771                         if (ask) choice = (char)tolower(choice);
772
773                         /* Extract request */
774                         i = (islower(choice) ? A2I(choice) : -1);
775                 }
776
777                 /* Totally Illegal */
778                 if ((i < 0) || (i >= num) || !p_ptr->magic_num2[spellnum[i]])
779                 {
780                         bell();
781                         continue;
782                 }
783
784                 /* Save the spell index */
785                 spell = monster_powers[spellnum[i]];
786
787                 /* Verify it */
788                 if (ask)
789                 {
790                         char tmp_val[160];
791
792                         /* Prompt */
793                         (void) strnfmt(tmp_val, 78, _("%sの魔法を唱えますか?", "Use %s? "), monster_powers[spellnum[i]].name);
794
795                         /* Belay that order */
796                         if (!get_check(tmp_val)) continue;
797                 }
798
799                 /* Stop the loop */
800                 flag = TRUE;
801         }
802         if (redraw) screen_load();
803
804         p_ptr->window |= (PW_SPELL);
805         handle_stuff();
806
807         /* Abort if needed */
808         if (!flag) return (FALSE);
809
810         /* Save the choice */
811         (*sn) = spellnum[i];
812
813         repeat_push((COMMAND_CODE)spellnum[i]);
814
815         /* Success */
816         return (TRUE);
817 }
818
819
820 /*!
821  * @brief 青魔法の発動 /
822  * do_cmd_cast calls this function if the player's class is 'blue-mage'.
823  * @param spell 発動するモンスター攻撃のID
824  * @param success TRUEは成功時、FALSEは失敗時の処理を行う
825  * @return 処理を実行したらTRUE、キャンセルした場合FALSEを返す。
826  */
827 static bool cast_learned_spell(player_type *caster_ptr, int spell, bool success)
828 {
829         DIRECTION dir;
830         PLAYER_LEVEL plev = pseudo_plev();
831         PLAYER_LEVEL summon_lev = caster_ptr->lev * 2 / 3 + randint1(caster_ptr->lev/2);
832         HIT_POINT damage = 0;
833         bool pet = success;
834         bool no_trump = FALSE;
835         BIT_FLAGS p_mode, u_mode = 0L, g_mode;
836
837         if (pet)
838         {
839                 p_mode = PM_FORCE_PET;
840                 g_mode = 0;
841         }
842         else
843         {
844                 p_mode = PM_NO_PET;
845                 g_mode = PM_ALLOW_GROUP;
846         }
847
848         if (!success || (randint1(50+plev) < plev/10)) u_mode = PM_ALLOW_UNIQUE;
849
850         /* spell code */
851         floor_type *floor_ptr = caster_ptr->current_floor_ptr;
852         switch (spell)
853         {
854         case MS_SHRIEK:
855         msg_print(_("かん高い金切り声をあげた。", "You make a high pitched shriek."));
856                 aggravate_monsters(caster_ptr, 0);
857                 break;
858         case MS_XXX1:
859                 break;
860         case MS_DISPEL:
861         {
862                 MONSTER_IDX m_idx;
863
864                 if (!target_set(TARGET_KILL)) return FALSE;
865                 m_idx = floor_ptr->grid_array[target_row][target_col].m_idx;
866                 if (!m_idx) break;
867                 if (!player_has_los_bold(caster_ptr, target_row, target_col)) break;
868                 if (!projectable(floor_ptr, caster_ptr->y, caster_ptr->x, target_row, target_col)) break;
869                 dispel_monster_status(m_idx);
870                 break;
871         }
872         case MS_ROCKET:
873                 if (!get_aim_dir(&dir)) return FALSE;
874                 
875         msg_print(_("ロケットを発射した。", "You fire a rocket."));
876         damage = monspell_bluemage_damage((MS_ROCKET), plev, DAM_ROLL);
877                 fire_rocket(caster_ptr, GF_ROCKET, dir, damage, 2);
878                 break;
879         case MS_SHOOT:
880         {
881                 if (!get_aim_dir(&dir)) return FALSE;
882                 
883         msg_print(_("矢を放った。", "You fire an arrow."));
884         damage = monspell_bluemage_damage((MS_SHOOT), plev, DAM_ROLL);
885                 fire_bolt(caster_ptr, GF_ARROW, dir, damage);
886                 break;
887         }
888         case MS_XXX2:
889                 break;
890         case MS_XXX3:
891                 break;
892         case MS_XXX4:
893                 break;
894         case MS_BR_ACID:
895                 if (!get_aim_dir(&dir)) return FALSE;
896
897         msg_print(_("酸のブレスを吐いた。", "You breathe acid."));
898         damage = monspell_bluemage_damage((MS_BR_ACID), plev, DAM_ROLL);
899                 fire_breath(caster_ptr, GF_ACID, dir, damage, (plev > 40 ? 3 : 2));
900                 break;
901         case MS_BR_ELEC:
902                 if (!get_aim_dir(&dir)) return FALSE;
903
904         msg_print(_("稲妻のブレスを吐いた。", "You breathe lightning."));
905         damage = monspell_bluemage_damage((MS_BR_ELEC), plev, DAM_ROLL);
906                 fire_breath(caster_ptr, GF_ELEC, dir, damage, (plev > 40 ? 3 : 2));
907                 break;
908         case MS_BR_FIRE:
909                 if (!get_aim_dir(&dir)) return FALSE;
910
911         msg_print(_("火炎のブレスを吐いた。", "You breathe fire."));
912         damage = monspell_bluemage_damage((MS_BR_FIRE), plev, DAM_ROLL);
913                 fire_breath(caster_ptr, GF_FIRE, dir, damage, (plev > 40 ? 3 : 2));
914                 break;
915         case MS_BR_COLD:
916         if (!get_aim_dir(&dir)) return FALSE;
917
918         msg_print(_("冷気のブレスを吐いた。", "You breathe frost."));
919         damage = monspell_bluemage_damage((MS_BR_COLD), plev, DAM_ROLL);
920                 fire_breath(caster_ptr, GF_COLD, dir, damage, (plev > 40 ? 3 : 2));
921                 break;
922         case MS_BR_POIS:
923         if (!get_aim_dir(&dir)) return FALSE;
924
925         msg_print(_("ガスのブレスを吐いた。", "You breathe gas."));
926         damage = monspell_bluemage_damage((MS_BR_POIS), plev, DAM_ROLL);
927                 fire_breath(caster_ptr, GF_POIS, dir, damage, (plev > 40 ? 3 : 2));
928                 break;
929         case MS_BR_NETHER:
930         if (!get_aim_dir(&dir)) return FALSE;
931
932         msg_print(_("地獄のブレスを吐いた。", "You breathe nether."));
933         damage = monspell_bluemage_damage((MS_BR_NETHER), plev, DAM_ROLL);
934                 fire_breath(caster_ptr, GF_NETHER, dir, damage, (plev > 40 ? 3 : 2));
935                 break;
936         case MS_BR_LITE:
937                 if (!get_aim_dir(&dir)) return FALSE;
938
939         msg_print(_("閃光のブレスを吐いた。", "You breathe light."));
940         damage = monspell_bluemage_damage((MS_BR_LITE), plev, DAM_ROLL);
941                 fire_breath(caster_ptr, GF_LITE, dir, damage, (plev > 40 ? 3 : 2));
942                 break;
943         case MS_BR_DARK:
944                 if (!get_aim_dir(&dir)) return FALSE;
945
946         msg_print(_("暗黒のブレスを吐いた。", "You breathe darkness."));
947         damage = monspell_bluemage_damage((MS_BR_DARK), plev, DAM_ROLL);
948                 fire_breath(caster_ptr, GF_DARK, dir, damage, (plev > 40 ? 3 : 2));
949                 break;
950         case MS_BR_CONF:
951                 if (!get_aim_dir(&dir)) return FALSE;
952
953         msg_print(_("混乱のブレスを吐いた。", "You breathe confusion."));
954         damage = monspell_bluemage_damage((MS_BR_CONF), plev, DAM_ROLL);
955                 fire_breath(caster_ptr, GF_CONFUSION, dir, damage, (plev > 40 ? 3 : 2));
956                 break;
957         case MS_BR_SOUND:
958                 if (!get_aim_dir(&dir)) return FALSE;
959
960         msg_print(_("轟音のブレスを吐いた。", "You breathe sound."));
961         damage = monspell_bluemage_damage((MS_BR_SOUND), plev, DAM_ROLL);
962                 fire_breath(caster_ptr, GF_SOUND, dir, damage, (plev > 40 ? 3 : 2));
963                 break;
964         case MS_BR_CHAOS:
965                 if (!get_aim_dir(&dir)) return FALSE;
966
967         msg_print(_("カオスのブレスを吐いた。", "You breathe chaos."));
968         damage = monspell_bluemage_damage((MS_BR_CHAOS), plev, DAM_ROLL);
969                 fire_breath(caster_ptr, GF_CHAOS, dir, damage, (plev > 40 ? 3 : 2));
970                 break;
971         case MS_BR_DISEN:
972                 if (!get_aim_dir(&dir)) return FALSE;
973
974         msg_print(_("劣化のブレスを吐いた。", "You breathe disenchantment."));
975         damage = monspell_bluemage_damage((MS_BR_DISEN), plev, DAM_ROLL);
976                 fire_breath(caster_ptr, GF_DISENCHANT, dir, damage, (plev > 40 ? 3 : 2));
977                 break;
978         case MS_BR_NEXUS:
979                 if (!get_aim_dir(&dir)) return FALSE;
980
981         msg_print(_("因果混乱のブレスを吐いた。", "You breathe nexus."));
982         damage = monspell_bluemage_damage((MS_BR_NEXUS), plev, DAM_ROLL);
983                 fire_breath(caster_ptr, GF_NEXUS, dir, damage, (plev > 40 ? 3 : 2));
984                 break;
985         case MS_BR_TIME:
986                 if (!get_aim_dir(&dir)) return FALSE;
987
988         msg_print(_("時間逆転のブレスを吐いた。", "You breathe time."));
989         damage = monspell_bluemage_damage((MS_BR_TIME), plev, DAM_ROLL);
990                 fire_breath(caster_ptr, GF_TIME, dir, damage, (plev > 40 ? 3 : 2));
991                 break;
992         case MS_BR_INERTIA:
993                 if (!get_aim_dir(&dir)) return FALSE;
994
995         msg_print(_("遅鈍のブレスを吐いた。", "You breathe inertia."));
996         damage = monspell_bluemage_damage((MS_BR_INERTIA), plev, DAM_ROLL);
997                 fire_breath(caster_ptr, GF_INERTIAL, dir, damage, (plev > 40 ? 3 : 2));
998                 break;
999         case MS_BR_GRAVITY:
1000                 if (!get_aim_dir(&dir)) return FALSE;
1001
1002         msg_print(_("重力のブレスを吐いた。", "You breathe gravity."));
1003         damage = monspell_bluemage_damage((MS_BR_GRAVITY), plev, DAM_ROLL);
1004                 fire_breath(caster_ptr, GF_GRAVITY, dir, damage, (plev > 40 ? 3 : 2));
1005                 break;
1006         case MS_BR_SHARDS:
1007         if (!get_aim_dir(&dir)) return FALSE;
1008
1009         msg_print(_("破片のブレスを吐いた。", "You breathe shards."));
1010         damage = monspell_bluemage_damage((MS_BR_SHARDS), plev, DAM_ROLL);
1011                 fire_breath(caster_ptr, GF_SHARDS, dir, damage, (plev > 40 ? 3 : 2));
1012                 break;
1013         case MS_BR_PLASMA:
1014         if (!get_aim_dir(&dir)) return FALSE;
1015
1016         msg_print(_("プラズマのブレスを吐いた。", "You breathe plasma."));
1017         damage = monspell_bluemage_damage((MS_BR_PLASMA), plev, DAM_ROLL);
1018                 fire_breath(caster_ptr, GF_PLASMA, dir, damage, (plev > 40 ? 3 : 2));
1019                 break;
1020         case MS_BR_FORCE:
1021         if (!get_aim_dir(&dir)) return FALSE;
1022
1023         msg_print(_("フォースのブレスを吐いた。", "You breathe force."));
1024         damage = monspell_bluemage_damage((MS_BR_FORCE), plev, DAM_ROLL);
1025                 fire_breath(caster_ptr, GF_FORCE, dir, damage, (plev > 40 ? 3 : 2));
1026                 break;
1027         case MS_BR_MANA:
1028                 if (!get_aim_dir(&dir)) return FALSE;
1029
1030         msg_print(_("魔力のブレスを吐いた。", "You breathe mana."));
1031         damage = monspell_bluemage_damage((MS_BR_MANA), plev, DAM_ROLL);
1032                 fire_breath(caster_ptr, GF_MANA, dir, damage, (plev > 40 ? 3 : 2));
1033                 break;
1034         case MS_BALL_NUKE:
1035                 if (!get_aim_dir(&dir)) return FALSE;
1036
1037         msg_print(_("放射能球を放った。", "You cast a ball of radiation."));
1038         damage = monspell_bluemage_damage((MS_BALL_NUKE), plev, DAM_ROLL);
1039                 fire_ball(caster_ptr, GF_NUKE, dir, damage, 2);
1040                 break;
1041         case MS_BR_NUKE:
1042                 if (!get_aim_dir(&dir)) return FALSE;
1043
1044         msg_print(_("放射性廃棄物のブレスを吐いた。", "You breathe toxic waste."));
1045         damage = monspell_bluemage_damage((MS_BR_NUKE), plev, DAM_ROLL);
1046                 fire_breath(caster_ptr, GF_NUKE, dir, damage, (plev > 40 ? 3 : 2));
1047                 break;
1048         case MS_BALL_CHAOS:
1049                 if (!get_aim_dir(&dir)) return FALSE;
1050
1051         msg_print(_("純ログルスを放った。", "You invoke a raw Logrus."));
1052         damage = monspell_bluemage_damage((MS_BALL_CHAOS), plev, DAM_ROLL);
1053                 fire_ball(caster_ptr, GF_CHAOS, dir, damage, 4);
1054                 break;
1055         case MS_BR_DISI:
1056                 if (!get_aim_dir(&dir)) return FALSE;
1057
1058         msg_print(_("分解のブレスを吐いた。", "You breathe disintegration."));
1059         damage = monspell_bluemage_damage((MS_BR_DISI), plev, DAM_ROLL);
1060                 fire_breath(caster_ptr, GF_DISINTEGRATE, dir, damage, (plev > 40 ? 3 : 2));
1061                 break;
1062         case MS_BALL_ACID:
1063                 if (!get_aim_dir(&dir)) return FALSE;
1064
1065         msg_print(_("アシッド・ボールの呪文を唱えた。", "You cast an acid ball."));
1066         damage = monspell_bluemage_damage((MS_BALL_ACID), plev, DAM_ROLL);
1067                 fire_ball(caster_ptr, GF_ACID, dir, damage, 2);
1068                 break;
1069         case MS_BALL_ELEC:
1070         if (!get_aim_dir(&dir)) return FALSE;
1071
1072         msg_print(_("サンダー・ボールの呪文を唱えた。", "You cast a lightning ball."));
1073         damage = monspell_bluemage_damage((MS_BALL_ELEC), plev, DAM_ROLL);
1074                 fire_ball(caster_ptr, GF_ELEC, dir, damage, 2);
1075                 break;
1076         case MS_BALL_FIRE:
1077                 if (!get_aim_dir(&dir)) return FALSE;
1078
1079         msg_print(_("ファイア・ボールの呪文を唱えた。", "You cast a fire ball."));
1080         damage = monspell_bluemage_damage((MS_BALL_FIRE), plev, DAM_ROLL);
1081                 fire_ball(caster_ptr, GF_FIRE, dir, damage, 2);
1082                 break;
1083         case MS_BALL_COLD:
1084         if (!get_aim_dir(&dir)) return FALSE;
1085
1086         msg_print(_("アイス・ボールの呪文を唱えた。", "You cast a frost ball."));
1087         damage = monspell_bluemage_damage((MS_BALL_COLD), plev, DAM_ROLL);
1088                 fire_ball(caster_ptr, GF_COLD, dir, damage, 2);
1089                 break;
1090         case MS_BALL_POIS:
1091                 if (!get_aim_dir(&dir)) return FALSE;
1092
1093         msg_print(_("悪臭雲の呪文を唱えた。", "You cast a stinking cloud."));
1094         damage = monspell_bluemage_damage((MS_BALL_POIS), plev, DAM_ROLL);
1095                 fire_ball(caster_ptr, GF_POIS, dir, damage, 2);
1096                 break;
1097         case MS_BALL_NETHER:
1098         if (!get_aim_dir(&dir)) return FALSE;
1099
1100         msg_print(_("地獄球の呪文を唱えた。", "You cast a nether ball."));
1101         damage = monspell_bluemage_damage((MS_BALL_NETHER), plev, DAM_ROLL);
1102                 fire_ball(caster_ptr, GF_NETHER, dir, damage, 2);
1103                 break;
1104         case MS_BALL_WATER:
1105                 if (!get_aim_dir(&dir)) return FALSE;
1106
1107         msg_print(_("流れるような身振りをした。", "You gesture fluidly."));
1108         damage = monspell_bluemage_damage((MS_BALL_WATER), plev, DAM_ROLL);
1109                 fire_ball(caster_ptr, GF_WATER, dir, damage, 4);
1110                 break;
1111         case MS_BALL_MANA:
1112         if (!get_aim_dir(&dir)) return FALSE;
1113
1114         msg_print(_("魔力の嵐の呪文を念じた。", "You invoke a mana storm."));
1115         damage = monspell_bluemage_damage((MS_BALL_MANA), plev, DAM_ROLL);
1116                 fire_ball(caster_ptr, GF_MANA, dir, damage, 4);
1117                 break;
1118         case MS_BALL_DARK:
1119                 if (!get_aim_dir(&dir)) return FALSE;
1120
1121         msg_print(_("暗黒の嵐の呪文を念じた。", "You invoke a darkness storm."));
1122         damage = monspell_bluemage_damage((MS_BALL_DARK), plev, DAM_ROLL);
1123                 fire_ball(caster_ptr, GF_DARK, dir, damage, 4);
1124                 break;
1125         case MS_DRAIN_MANA:
1126                 if (!get_aim_dir(&dir)) return FALSE;
1127
1128         damage = monspell_bluemage_damage((MS_DRAIN_MANA), plev, DAM_ROLL);
1129         fire_ball_hide(caster_ptr, GF_DRAIN_MANA, dir, damage, 0);
1130                 break;
1131         case MS_MIND_BLAST:
1132                 if (!get_aim_dir(&dir)) return FALSE;
1133
1134         damage = monspell_bluemage_damage((MS_MIND_BLAST), plev, DAM_ROLL);
1135                 fire_ball_hide(caster_ptr, GF_MIND_BLAST, dir, damage, 0);
1136                 break;
1137         case MS_BRAIN_SMASH:
1138         if (!get_aim_dir(&dir)) return FALSE;
1139
1140         damage = monspell_bluemage_damage((MS_BRAIN_SMASH), plev, DAM_ROLL);
1141                 fire_ball_hide(caster_ptr, GF_BRAIN_SMASH, dir, damage, 0);
1142                 break;
1143         case MS_CAUSE_1:
1144                 if (!get_aim_dir(&dir)) return FALSE;
1145
1146         damage = monspell_bluemage_damage((MS_CAUSE_1), plev, DAM_ROLL);
1147                 fire_ball_hide(caster_ptr, GF_CAUSE_1, dir, damage, 0);
1148                 break;
1149         case MS_CAUSE_2:
1150                 if (!get_aim_dir(&dir)) return FALSE;
1151
1152         damage = monspell_bluemage_damage((MS_CAUSE_2), plev, DAM_ROLL);
1153                 fire_ball_hide(caster_ptr, GF_CAUSE_2, dir, damage, 0);
1154                 break;
1155         case MS_CAUSE_3:
1156                 if (!get_aim_dir(&dir)) return FALSE;
1157
1158         damage = monspell_bluemage_damage((MS_CAUSE_3), plev, DAM_ROLL);
1159                 fire_ball_hide(caster_ptr, GF_CAUSE_3, dir, damage, 0);
1160                 break;
1161         case MS_CAUSE_4:
1162                 if (!get_aim_dir(&dir)) return FALSE;
1163
1164         damage = monspell_bluemage_damage((MS_CAUSE_4), plev, DAM_ROLL);
1165                 fire_ball_hide(caster_ptr, GF_CAUSE_4, dir, damage, 0);
1166                 break;
1167         case MS_BOLT_ACID:
1168                 if (!get_aim_dir(&dir)) return FALSE;
1169
1170         msg_print(_("アシッド・ボルトの呪文を唱えた。", "You cast an acid bolt."));
1171         damage = monspell_bluemage_damage((MS_BOLT_ACID), plev, DAM_ROLL);
1172         fire_bolt(caster_ptr, GF_ACID, dir, damage);
1173                 break;
1174         case MS_BOLT_ELEC:
1175                 if (!get_aim_dir(&dir)) return FALSE;
1176
1177         msg_print(_("サンダー・ボルトの呪文を唱えた。", "You cast a lightning bolt."));
1178         damage = monspell_bluemage_damage((MS_BOLT_ELEC), plev, DAM_ROLL);
1179                 fire_bolt(caster_ptr, GF_ELEC, dir, damage);
1180                 break;
1181         case MS_BOLT_FIRE:
1182                 if (!get_aim_dir(&dir)) return FALSE;
1183
1184         msg_print(_("ファイア・ボルトの呪文を唱えた。", "You cast a fire bolt."));
1185         damage = monspell_bluemage_damage((MS_BOLT_FIRE), plev, DAM_ROLL);
1186                 fire_bolt(caster_ptr, GF_FIRE, dir, damage);
1187                 break;
1188         case MS_BOLT_COLD:
1189                 if (!get_aim_dir(&dir)) return FALSE;
1190
1191         msg_print(_("アイス・ボルトの呪文を唱えた。", "You cast a frost bolt."));
1192         damage = monspell_bluemage_damage((MS_BOLT_COLD), plev, DAM_ROLL);
1193                 fire_bolt(caster_ptr, GF_COLD, dir, damage);
1194                 break;
1195         case MS_STARBURST:
1196                 if (!get_aim_dir(&dir)) return FALSE;
1197
1198         msg_print(_("スターバーストの呪文を念じた。", "You invoke a starburst."));
1199         damage = monspell_bluemage_damage((MS_STARBURST), plev, DAM_ROLL);
1200                 fire_ball(caster_ptr, GF_LITE, dir, damage, 4);
1201                 break;
1202         case MS_BOLT_NETHER:
1203                 if (!get_aim_dir(&dir)) return FALSE;
1204
1205         msg_print(_("地獄の矢の呪文を唱えた。", "You cast a nether bolt."));
1206         damage = monspell_bluemage_damage((MS_BOLT_NETHER), plev, DAM_ROLL);
1207                 fire_bolt(caster_ptr, GF_NETHER, dir, damage);
1208                 break;
1209         case MS_BOLT_WATER:
1210                 if (!get_aim_dir(&dir)) return FALSE;
1211
1212         msg_print(_("ウォーター・ボルトの呪文を唱えた。", "You cast a water bolt."));
1213         damage = monspell_bluemage_damage((MS_BOLT_WATER), plev, DAM_ROLL);
1214                 fire_bolt(caster_ptr, GF_WATER, dir, damage);
1215                 break;
1216         case MS_BOLT_MANA:
1217                 if (!get_aim_dir(&dir)) return FALSE;
1218
1219         msg_print(_("魔力の矢の呪文を唱えた。", "You cast a mana bolt."));
1220         damage = monspell_bluemage_damage((MS_BOLT_MANA), plev, DAM_ROLL);
1221                 fire_bolt(caster_ptr, GF_MANA, dir, damage);
1222                 break;
1223         case MS_BOLT_PLASMA:
1224                 if (!get_aim_dir(&dir)) return FALSE;
1225
1226         msg_print(_("プラズマ・ボルトの呪文を唱えた。", "You cast a plasma bolt."));
1227         damage = monspell_bluemage_damage((MS_BOLT_PLASMA), plev, DAM_ROLL);
1228                 fire_bolt(caster_ptr, GF_PLASMA, dir, damage);
1229                 break;
1230         case MS_BOLT_ICE:
1231                 if (!get_aim_dir(&dir)) return FALSE;
1232
1233         msg_print(_("極寒の矢の呪文を唱えた。", "You cast a ice bolt."));
1234         damage = monspell_bluemage_damage((MS_BOLT_ICE), plev, DAM_ROLL);
1235                 fire_bolt(caster_ptr, GF_ICE, dir, damage);
1236                 break;
1237         case MS_MAGIC_MISSILE:
1238                 if (!get_aim_dir(&dir)) return FALSE;
1239
1240         msg_print(_("マジック・ミサイルの呪文を唱えた。", "You cast a magic missile."));
1241         damage = monspell_bluemage_damage((MS_MAGIC_MISSILE), plev, DAM_ROLL);
1242                 fire_bolt(caster_ptr, GF_MISSILE, dir, damage);
1243                 break;
1244         case MS_SCARE:
1245                 if (!get_aim_dir(&dir)) return FALSE;
1246
1247         msg_print(_("恐ろしげな幻覚を作り出した。", "You cast a fearful illusion."));
1248                 fear_monster(dir, plev+10);
1249                 break;
1250         case MS_BLIND:
1251                 if (!get_aim_dir(&dir)) return FALSE;
1252                 confuse_monster(dir, plev * 2);
1253                 break;
1254         case MS_CONF:
1255                 if (!get_aim_dir(&dir)) return FALSE;
1256
1257         msg_print(_("誘惑的な幻覚をつくり出した。", "You cast a mesmerizing illusion."));
1258                 confuse_monster(dir, plev * 2);
1259                 break;
1260         case MS_SLOW:
1261                 if (!get_aim_dir(&dir)) return FALSE;
1262                 slow_monster(dir, plev);
1263                 break;
1264         case MS_SLEEP:
1265                 if (!get_aim_dir(&dir)) return FALSE;
1266                 sleep_monster(dir, plev);
1267                 break;
1268         case MS_SPEED:
1269                 (void)set_fast(caster_ptr, randint1(20 + plev) + plev, FALSE);
1270                 break;
1271         case MS_HAND_DOOM:
1272         {
1273                 if (!get_aim_dir(&dir)) return FALSE;
1274
1275         msg_print(_("<破滅の手>を放った!", "You invoke the Hand of Doom!"));
1276                 fire_ball_hide(caster_ptr, GF_HAND_DOOM, dir, plev * 3, 0);
1277                 break;
1278         }
1279         case MS_HEAL:
1280         msg_print(_("自分の傷に念を集中した。", "You concentrate on your wounds!"));
1281                 (void)hp_player(caster_ptr, plev*4);
1282                 (void)set_stun(caster_ptr, 0);
1283                 (void)set_cut(caster_ptr,0);
1284                 break;
1285         case MS_INVULNER:
1286         msg_print(_("無傷の球の呪文を唱えた。", "You cast a Globe of Invulnerability."));
1287                 (void)set_invuln(caster_ptr, randint1(4) + 4, FALSE);
1288                 break;
1289         case MS_BLINK:
1290                 teleport_player(caster_ptr, 10, 0L);
1291                 break;
1292         case MS_TELEPORT:
1293                 teleport_player(caster_ptr, plev * 5, 0L);
1294                 break;
1295         case MS_WORLD:
1296                 (void)time_walk(caster_ptr);
1297                 break;
1298         case MS_SPECIAL:
1299                 break;
1300         case MS_TELE_TO:
1301         {
1302                 monster_type *m_ptr;
1303                 monster_race *r_ptr;
1304                 GAME_TEXT m_name[MAX_NLEN];
1305
1306                 if (!target_set(TARGET_KILL)) return FALSE;
1307                 if (!floor_ptr->grid_array[target_row][target_col].m_idx) break;
1308                 if (!player_has_los_bold(caster_ptr, target_row, target_col)) break;
1309                 if (!projectable(floor_ptr, caster_ptr->y, caster_ptr->x, target_row, target_col)) break;
1310                 m_ptr = &floor_ptr->m_list[floor_ptr->grid_array[target_row][target_col].m_idx];
1311                 r_ptr = &r_info[m_ptr->r_idx];
1312                 monster_desc(m_name, m_ptr, 0);
1313                 if (r_ptr->flagsr & RFR_RES_TELE)
1314                 {
1315                         if ((r_ptr->flags1 & (RF1_UNIQUE)) || (r_ptr->flagsr & RFR_RES_ALL))
1316                         {
1317                                 if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= RFR_RES_TELE;
1318                 msg_format(_("%sには効果がなかった!", "%s is unaffected!"), m_name);
1319                                 break;
1320                         }
1321                         else if (r_ptr->level > randint1(100))
1322                         {
1323                                 if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= RFR_RES_TELE;
1324                 msg_format(_("%sには耐性がある!", "%s resists!"), m_name);
1325                                 break;
1326                         }
1327                 }
1328
1329         msg_format(_("%sを引き戻した。", "You command %s to return."), m_name);
1330                 teleport_monster_to(caster_ptr, floor_ptr->grid_array[target_row][target_col].m_idx, caster_ptr->y, caster_ptr->x, 100, TELEPORT_PASSIVE);
1331                 break;
1332         }
1333         case MS_TELE_AWAY:
1334                 if (!get_aim_dir(&dir)) return FALSE;
1335
1336                 (void)fire_beam(caster_ptr, GF_AWAY_ALL, dir, 100);
1337                 break;
1338
1339         case MS_TELE_LEVEL:
1340                 return teleport_level_other(caster_ptr);
1341                 break;
1342
1343         case MS_PSY_SPEAR:
1344                 if (!get_aim_dir(&dir)) return FALSE;
1345
1346         msg_print(_("光の剣を放った。", "You throw a psycho-spear."));
1347         damage = monspell_bluemage_damage((MS_PSY_SPEAR), plev, DAM_ROLL);
1348                 (void)fire_beam(caster_ptr, GF_PSY_SPEAR, dir, damage);
1349                 break;
1350         case MS_DARKNESS:
1351
1352         msg_print(_("暗闇の中で手を振った。", "You gesture in shadow."));
1353                 (void)unlite_area(caster_ptr, 10, 3);
1354                 break;
1355         case MS_MAKE_TRAP:
1356                 if (!target_set(TARGET_KILL)) return FALSE;
1357
1358         msg_print(_("呪文を唱えて邪悪に微笑んだ。", "You cast a spell and cackle evilly."));
1359                 trap_creation(caster_ptr, target_row, target_col);
1360                 break;
1361         case MS_FORGET:
1362         msg_print(_("しかし何も起きなかった。", "Nothing happen."));
1363                 break;
1364     case MS_RAISE_DEAD:
1365         msg_print(_("死者復活の呪文を唱えた。", "You cast a animate dead."));
1366                 (void)animate_dead(caster_ptr, 0, caster_ptr->y, caster_ptr->x);
1367                 break;
1368         case MS_S_KIN:
1369         {
1370         msg_print(_("援軍を召喚した。", "You summon minions."));
1371                 for (int k = 0;k < 1; k++)
1372                 {
1373                         if (summon_kin_player(summon_lev, caster_ptr->y, caster_ptr->x, (pet ? PM_FORCE_PET : 0L)))
1374                         {
1375                                 if (!pet) msg_print(_("召喚された仲間は怒っている!", "Summoned fellows are angry!"));
1376                         }
1377                         else
1378                         {
1379                                 no_trump = TRUE;
1380                         }
1381                 }
1382
1383                 break;
1384         }
1385         case MS_S_CYBER:
1386         {
1387         msg_print(_("サイバーデーモンを召喚した!", "You summon a Cyberdemon!"));
1388                 for (int k = 0; k < 1; k++)
1389                 {
1390                         if (summon_specific((pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_CYBER, p_mode))
1391                         {
1392                                 if (!pet)
1393                                         msg_print(_("召喚されたサイバーデーモンは怒っている!", "The summoned Cyberdemon are angry!"));
1394                         }
1395                         else
1396                         {
1397                                 no_trump = TRUE;
1398                         }
1399                 }
1400                 break;
1401         }
1402         case MS_S_MONSTER:
1403         {
1404         msg_print(_("仲間を召喚した。", "You summon help."));
1405                 for (int k = 0; k < 1; k++)
1406                 {
1407                         if (summon_specific((pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, 0, p_mode))
1408                         {
1409                                 if (!pet)
1410                                         msg_print(_("召喚されたモンスターは怒っている!", "The summoned monster is angry!"));
1411                         }
1412                         else
1413                         {
1414                                 no_trump = TRUE;
1415                         }
1416                 }
1417                 
1418                 break;
1419         }
1420         case MS_S_MONSTERS:
1421         {
1422         msg_print(_("モンスターを召喚した!", "You summon monsters!"));
1423                 for (int k = 0; k < plev / 15 + 2; k++)
1424                 {
1425                         if (summon_specific((pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, 0, (p_mode | u_mode)))
1426                         {
1427                                 if (!pet)
1428                                         msg_print(_("召喚されたモンスターは怒っている!", "The summoned monsters are angry!"));
1429                         }
1430                         else
1431                         {
1432                                 no_trump = TRUE;
1433                         }
1434                 }
1435                 
1436                 break;
1437         }
1438         case MS_S_ANT:
1439         {
1440         msg_print(_("アリを召喚した。", "You summon ants."));
1441                 if (summon_specific((pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_ANT, (PM_ALLOW_GROUP | p_mode)))
1442                 {
1443                         if (!pet)
1444                                 msg_print(_("召喚されたアリは怒っている!", "The summoned ants are angry!"));
1445                 }
1446                 else
1447                 {
1448                         no_trump = TRUE;
1449                 }
1450                 break;
1451         }
1452         case MS_S_SPIDER:
1453         {
1454         msg_print(_("蜘蛛を召喚した。", "You summon spiders."));
1455                 if (summon_specific((pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_SPIDER, (PM_ALLOW_GROUP | p_mode)))
1456                 {
1457                         if (!pet)
1458                                 msg_print(_("召喚された蜘蛛は怒っている!", "Summoned spiders are angry!"));
1459                 }
1460                 else
1461                 {
1462                         no_trump = TRUE;
1463                 }
1464
1465                 break;
1466         }
1467         case MS_S_HOUND:
1468         {
1469         msg_print(_("ハウンドを召喚した。", "You summon hounds."));
1470                 if (summon_specific((pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_HOUND, (PM_ALLOW_GROUP | p_mode)))
1471                 {
1472                         if (!pet)
1473                                 msg_print(_("召喚されたハウンドは怒っている!", "Summoned hounds are angry!"));
1474                 }
1475                 else
1476                 {
1477                         no_trump = TRUE;
1478                 }
1479
1480                 break;
1481         }
1482         case MS_S_HYDRA:
1483         {
1484         msg_print(_("ヒドラを召喚した。", "You summon a hydras."));
1485                 if (summon_specific((pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_HYDRA, (g_mode | p_mode)))
1486                 {
1487                         if (!pet)
1488                                 msg_print(_("召喚されたヒドラは怒っている!", "Summoned hydras are angry!"));
1489                 }
1490                 else
1491                 {
1492                         no_trump = TRUE;
1493                 }
1494
1495                 break;
1496         }
1497         case MS_S_ANGEL:
1498         {
1499         msg_print(_("天使を召喚した!", "You summon an angel!"));
1500                 if (summon_specific((pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_ANGEL, (g_mode | p_mode)))
1501                 {
1502                         if (!pet)
1503                                 msg_print(_("召喚された天使は怒っている!", "Summoned angels are angry!"));
1504                 }
1505                 else
1506                 {
1507                         no_trump = TRUE;
1508                 }
1509
1510                 break;
1511         }
1512         case MS_S_DEMON:
1513         {
1514         msg_print(_("混沌の宮廷から悪魔を召喚した!", "You summon a demon from the Courts of Chaos!"));
1515                 if (summon_specific((pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_DEMON, (g_mode | p_mode)))
1516                 {
1517                         if (!pet)
1518                                 msg_print(_("召喚されたデーモンは怒っている!", "Summoned demons are angry!"));
1519                 }
1520                 else
1521                 {
1522                         no_trump = TRUE;
1523                 }
1524
1525                 break;
1526         }
1527         case MS_S_UNDEAD:
1528         {
1529         msg_print(_("アンデッドの強敵を召喚した!", "You summon an undead adversary!"));
1530                 if (summon_specific((pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_UNDEAD, (g_mode | p_mode)))
1531                 {
1532                         if (!pet)
1533                                 msg_print(_("召喚されたアンデッドは怒っている!", "Summoned undeads are angry!"));
1534                 }
1535                 else
1536                 {
1537                         no_trump = TRUE;
1538                 }
1539
1540                 break;
1541         }
1542         case MS_S_DRAGON:
1543         {
1544         msg_print(_("ドラゴンを召喚した!", "You summon a dragon!"));
1545                 if (summon_specific((pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_DRAGON, (g_mode | p_mode)))
1546                 {
1547                         if (!pet)
1548                                 msg_print(_("召喚されたドラゴンは怒っている!", "Summoned dragons are angry!"));
1549                 }
1550                 else
1551                 {
1552                         no_trump = TRUE;
1553                 }
1554                 
1555                 break;
1556         }
1557         case MS_S_HI_UNDEAD:
1558         {
1559         msg_print(_("強力なアンデッドを召喚した!", "You summon a greater undead!"));
1560                 if (summon_specific((pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_HI_UNDEAD, (g_mode | p_mode | u_mode)))
1561                 {
1562                         if (!pet)
1563                                 msg_print(_("召喚された上級アンデッドは怒っている!", "Summoned greater undeads are angry!"));
1564                 }
1565                 else
1566                 {
1567                         no_trump = TRUE;
1568                 }
1569                 
1570                 break;
1571         }
1572         case MS_S_HI_DRAGON:
1573         {
1574                 msg_print(_("古代ドラゴンを召喚した!", "You summon an ancient dragon!"));
1575                 if (summon_specific((pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_HI_DRAGON, (g_mode | p_mode | u_mode)))
1576                 {
1577                         if (!pet)
1578                                 msg_print(_("召喚された古代ドラゴンは怒っている!", "Summoned ancient dragons are angry!"));
1579                 }
1580                 else
1581                 {
1582                         no_trump = TRUE;
1583                 }
1584                 
1585                 break;
1586         }
1587         case MS_S_AMBERITE:
1588         {
1589         msg_print(_("アンバーの王族を召喚した!", "You summon a Lord of Amber!"));
1590                 if (summon_specific((pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_AMBERITES, (g_mode | p_mode | u_mode)))
1591                 {
1592                         if (!pet)
1593                                 msg_print(_("召喚されたアンバーの王族は怒っている!", "Summoned Lords of Amber are angry!"));
1594                 }
1595                 else
1596                 {
1597                         no_trump = TRUE;
1598                 }
1599                 break;
1600         }
1601         case MS_S_UNIQUE:
1602         {
1603                 int k, count = 0;
1604                 msg_print(_("特別な強敵を召喚した!", "You summon a special opponent!"));
1605                 for (k = 0; k < 1; k++)
1606                 {
1607                         if (summon_specific((pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_UNIQUE, (g_mode | p_mode | PM_ALLOW_UNIQUE)))
1608                         {
1609                                 count++;
1610                                 if (!pet)
1611                                         msg_print(_("召喚されたユニーク・モンスターは怒っている!", "Summoned special opponents are angry!"));
1612                         }
1613                 }
1614
1615                 for (k = count; k < 1; k++)
1616                 {
1617                         if (summon_specific((pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_HI_UNDEAD, (g_mode | p_mode | PM_ALLOW_UNIQUE)))
1618                         {
1619                                 count++;
1620                                 if (!pet)
1621                                         msg_print(_("召喚された上級アンデッドは怒っている!", "Summoned greater undeads are angry!"));
1622                         }
1623                 }
1624
1625                 if (!count)
1626                 {
1627                         no_trump = TRUE;
1628                 }
1629
1630                 break;
1631         }
1632         default:
1633                 msg_print("hoge?");
1634         }
1635
1636         if (no_trump)
1637     {
1638         msg_print(_("何も現れなかった。", "No one have appeared."));
1639         }
1640
1641         return TRUE;
1642 }
1643
1644 /*!
1645  * @brief 青魔法コマンドのメインルーチン /
1646  * do_cmd_cast calls this function if the player's class is 'Blue-Mage'.
1647  * @return 処理を実行したらTRUE、キャンセルした場合FALSEを返す。
1648  */
1649 bool do_cmd_cast_learned(player_type *caster_ptr)
1650 {
1651         SPELL_IDX n = 0;
1652         PERCENTAGE chance;
1653         PERCENTAGE minfail = 0;
1654         PLAYER_LEVEL plev = caster_ptr->lev;
1655         monster_power spell;
1656         bool cast;
1657         MANA_POINT need_mana;
1658
1659         if (cmd_limit_confused(caster_ptr)) return FALSE;
1660
1661         if (!get_learned_power(&n)) return FALSE;
1662
1663         spell = monster_powers[n];
1664
1665         need_mana = mod_need_mana(spell.smana, 0, REALM_NONE);
1666
1667         /* Verify "dangerous" spells */
1668         if (need_mana > caster_ptr->csp)
1669         {
1670                 /* Warning */
1671                 msg_print(_("MPが足りません。", "You do not have enough mana to use this power."));
1672
1673                 if (!over_exert) return FALSE;
1674
1675                 /* Verify */
1676                 if (!get_check(_("それでも挑戦しますか? ", "Attempt it anyway? "))) return FALSE;
1677         }
1678
1679         /* Spell failure chance */
1680         chance = spell.fail;
1681
1682         /* Reduce failure rate by "effective" level adjustment */
1683         if (plev > spell.level) chance -= 3 * (plev - spell.level);
1684         else chance += (spell.level - plev);
1685
1686         /* Reduce failure rate by INT/WIS adjustment */
1687         chance -= 3 * (adj_mag_stat[caster_ptr->stat_ind[A_INT]] - 1);
1688
1689         chance = mod_spell_chance_1(caster_ptr, chance);
1690
1691         /* Not enough mana to cast */
1692         if (need_mana > caster_ptr->csp)
1693         {
1694                 chance += 5 * (need_mana - caster_ptr->csp);
1695         }
1696
1697         /* Extract the minimum failure rate */
1698         minfail = adj_mag_fail[caster_ptr->stat_ind[A_INT]];
1699
1700         /* Minimum failure rate */
1701         if (chance < minfail) chance = minfail;
1702
1703         /* Stunning makes spells harder */
1704         if (caster_ptr->stun > 50) chance += 25;
1705         else if (caster_ptr->stun) chance += 15;
1706
1707         /* Always a 5 percent chance of working */
1708         if (chance > 95) chance = 95;
1709
1710         chance = mod_spell_chance_2(caster_ptr, chance);
1711
1712         /* Failed spell */
1713         if (randint0(100) < chance)
1714         {
1715                 if (flush_failure) flush();
1716                 msg_print(_("魔法をうまく唱えられなかった。", "You failed to concentrate hard enough!"));
1717
1718                 sound(SOUND_FAIL);
1719
1720                 if (n >= MS_S_KIN)
1721                         cast = cast_learned_spell(caster_ptr, n, FALSE);
1722         }
1723         else
1724         {
1725                 sound(SOUND_ZAP);
1726                 cast = cast_learned_spell(caster_ptr, n, TRUE);
1727                 if (!cast) return FALSE;
1728         }
1729
1730         /* Sufficient mana */
1731         if (need_mana <= caster_ptr->csp)
1732         {
1733                 /* Use some mana */
1734                 caster_ptr->csp -= need_mana;
1735         }
1736         else
1737         {
1738                 int oops = need_mana;
1739
1740                 /* No mana left */
1741                 caster_ptr->csp = 0;
1742                 caster_ptr->csp_frac = 0;
1743
1744                 msg_print(_("精神を集中しすぎて気を失ってしまった!", "You faint from the effort!"));
1745
1746                 /* Hack -- Bypass free action */
1747                 (void)set_paralyzed(caster_ptr, caster_ptr->paralyzed + randint1(5 * oops + 1));
1748
1749                 chg_virtue(caster_ptr, V_KNOWLEDGE, -10);
1750
1751                 /* Damage CON (possibly permanently) */
1752                 if (randint0(100) < 50)
1753                 {
1754                         bool perm = (randint0(100) < 25);
1755
1756                         msg_print(_("体を悪くしてしまった!", "You have damaged your health!"));
1757
1758                         /* Reduce constitution */
1759                         (void)dec_stat(caster_ptr, A_CON, 15 + randint1(10), perm);
1760                 }
1761         }
1762
1763         take_turn(caster_ptr, 100);
1764
1765         caster_ptr->redraw |= (PR_MANA);
1766         caster_ptr->window |= (PW_PLAYER | PW_SPELL);
1767
1768         return TRUE;
1769 }
1770
1771 /*!
1772  * @brief 青魔法のラーニング判定と成功した場合のラーニング処理
1773  * @param monspell ラーニングを試みるモンスター攻撃のID
1774  * @return なし
1775  */
1776 void learn_spell(player_type *learner_ptr, int monspell)
1777 {
1778         if (learner_ptr->action != ACTION_LEARN) return;
1779         if (monspell < 0) return;
1780         if (learner_ptr->magic_num2[monspell]) return;
1781         if (learner_ptr->confused || learner_ptr->blind || learner_ptr->image || learner_ptr->stun || learner_ptr->paralyzed) return;
1782         if (randint1(learner_ptr->lev + 70) > monster_powers[monspell].level + 40)
1783         {
1784                 learner_ptr->magic_num2[monspell] = 1;
1785                 msg_format(_("%sを学習した!", "You have learned %s!"), monster_powers[monspell].name);
1786                 gain_exp(learner_ptr, monster_powers[monspell].level * monster_powers[monspell].smana);
1787
1788                 sound(SOUND_STUDY);
1789
1790                 learner_ptr->new_mane = TRUE;
1791                 learner_ptr->redraw |= (PR_STATE);
1792         }
1793 }
1794
1795
1796 /*!
1797  * @brief モンスター特殊能力のフラグ配列から特定条件の魔法だけを抜き出す処理
1798  * Extract monster spells mask for the given mode
1799  * @param f4 モンスター特殊能力の4番目のフラグ配列
1800  * @param f5 モンスター特殊能力の5番目のフラグ配列
1801  * @param f6 モンスター特殊能力の6番目のフラグ配列
1802  * @param mode 抜き出したい条件
1803  * @return なし
1804  */
1805 /*
1806  */
1807 void set_rf_masks(BIT_FLAGS *f4, BIT_FLAGS *f5, BIT_FLAGS *f6, BIT_FLAGS mode)
1808 {
1809         switch (mode)
1810         {
1811                 case MONSPELL_TYPE_BOLT:
1812                         *f4 = ((RF4_BOLT_MASK | RF4_BEAM_MASK) & ~(RF4_ROCKET));
1813                         *f5 = RF5_BOLT_MASK | RF5_BEAM_MASK;
1814                         *f6 = RF6_BOLT_MASK | RF6_BEAM_MASK;
1815                         break;
1816
1817                 case MONSPELL_TYPE_BALL:
1818                         *f4 = (RF4_BALL_MASK & ~(RF4_BREATH_MASK));
1819                         *f5 = (RF5_BALL_MASK & ~(RF5_BREATH_MASK));
1820                         *f6 = (RF6_BALL_MASK & ~(RF6_BREATH_MASK));
1821                         break;
1822
1823                 case MONSPELL_TYPE_BREATH:
1824                         *f4 = RF4_BREATH_MASK;
1825                         *f5 = RF5_BREATH_MASK;
1826                         *f6 = RF6_BREATH_MASK;
1827                         break;
1828
1829                 case MONSPELL_TYPE_SUMMON:
1830                         *f4 = RF4_SUMMON_MASK;
1831                         *f5 = RF5_SUMMON_MASK;
1832                         *f6 = RF6_SUMMON_MASK;
1833                         break;
1834
1835                 case MONSPELL_TYPE_OTHER:
1836                         *f4 = RF4_ATTACK_MASK & ~(RF4_BOLT_MASK | RF4_BEAM_MASK | RF4_BALL_MASK | RF4_INDIRECT_MASK);
1837                         *f5 = RF5_ATTACK_MASK & ~(RF5_BOLT_MASK | RF5_BEAM_MASK | RF5_BALL_MASK | RF5_INDIRECT_MASK);
1838                         *f6 = RF6_ATTACK_MASK & ~(RF6_BOLT_MASK | RF6_BEAM_MASK | RF6_BALL_MASK | RF6_INDIRECT_MASK);
1839                         break;
1840         }
1841
1842         return;
1843 }