OSDN Git Service

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