OSDN Git Service

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