OSDN Git Service

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