OSDN Git Service

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