OSDN Git Service

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