OSDN Git Service

[Refactor] #40481 Separated cast_blue_rocket() from cast_learned_spell()
[hengband/hengband.git] / src / blue-magic / blue-magic-caster.c
1 #include "blue-magic/blue-magic-caster.h"
2 #include "blue-magic/blue-magic-util.h"
3 #include "blue-magic/learnt-info.h"
4 #include "core/hp-mp-processor.h"
5 #include "floor/floor.h"
6 #include "grid/grid.h"
7 #include "io/targeting.h"
8 #include "monster-floor/monster-summon.h"
9 #include "monster-floor/place-monster-types.h"
10 #include "monster-race/monster-race.h"
11 #include "monster-race/race-flags-resistance.h"
12 #include "monster-race/race-flags1.h"
13 #include "monster/monster-describer.h"
14 #include "monster/monster-info.h"
15 #include "monster/monster-status.h"
16 #include "mspell/mspell-damage-calculator.h"
17 #include "mspell/mspell-type.h"
18 #include "spell-kind/spells-launcher.h"
19 #include "spell-kind/spells-lite.h"
20 #include "spell-kind/spells-neighbor.h"
21 #include "spell-kind/spells-sight.h"
22 #include "spell-kind/spells-teleport.h"
23 #include "spell-kind/spells-world.h"
24 #include "spell/spell-types.h"
25 #include "spell/spells-status.h"
26 #include "spell/spells-summon.h"
27 #include "status/bad-status-setter.h"
28 #include "status/body-improvement.h"
29 #include "status/buff-setter.h"
30 #include "system/floor-type-definition.h"
31 #include "view/display-messages.h"
32
33 /*!
34  * @brief 青魔法の叫び
35  * @param caster_ptr プレーヤーへの参照ポインタ
36  * @return 常にTRUE
37  */
38 static bool cast_blue_shriek(player_type *caster_ptr)
39 {
40     msg_print(_("かん高い金切り声をあげた。", "You make a high pitched shriek."));
41     aggravate_monsters(caster_ptr, 0);
42     return TRUE;
43 }
44
45 static bool cast_blue_dispel(player_type *caster_ptr)
46 {
47     if (!target_set(caster_ptr, TARGET_KILL))
48         return FALSE;
49
50     MONSTER_IDX m_idx = caster_ptr->current_floor_ptr->grid_array[target_row][target_col].m_idx;
51     if ((m_idx == 0) || !player_has_los_bold(caster_ptr, target_row, target_col)
52         || !projectable(caster_ptr, caster_ptr->y, caster_ptr->x, target_row, target_col))
53         return TRUE;
54
55     dispel_monster_status(caster_ptr, m_idx);
56     return TRUE;
57 }
58
59 static bool cast_blue_rocket(player_type *caster_ptr, blue_magic_type *bm_ptr)
60 {
61     if (!get_aim_dir(caster_ptr, &bm_ptr->dir))
62         return FALSE;
63
64     msg_print(_("ロケットを発射した。", "You fire a rocket."));
65     bm_ptr->damage = monspell_bluemage_damage(caster_ptr, (MS_ROCKET), bm_ptr->plev, DAM_ROLL);
66     fire_rocket(caster_ptr, GF_ROCKET, bm_ptr->dir, bm_ptr->damage, 2);
67     return TRUE;
68 }
69
70 /*!
71  * @brief 青魔法の発動 /
72  * do_cmd_cast calls this function if the player's class is 'blue-mage'.
73  * @param spell 発動するモンスター攻撃のID
74  * @param success TRUEは成功時、FALSEは失敗時の処理を行う
75  * @return 処理を実行したらTRUE、キャンセルした場合FALSEを返す。
76  */
77 bool cast_learned_spell(player_type *caster_ptr, int spell, const bool success)
78 {
79     blue_magic_type tmp_bm;
80     blue_magic_type *bm_ptr = initialize_blue_magic_type(caster_ptr, &tmp_bm, success, get_pseudo_monstetr_level);
81     floor_type *floor_ptr = caster_ptr->current_floor_ptr;
82     switch (spell) {
83     case MS_SHRIEK:
84         (void)cast_blue_shriek(caster_ptr);
85         break;
86     case MS_XXX1:
87     case MS_XXX2:
88     case MS_XXX3:
89     case MS_XXX4:
90         break;
91     case MS_DISPEL:
92         if (!cast_blue_dispel(caster_ptr))
93             return FALSE;
94
95         break;
96     case MS_ROCKET:
97         if (!cast_blue_rocket(caster_ptr, bm_ptr))
98             return FALSE;
99
100         break;
101     case MS_SHOOT: {
102         if (!get_aim_dir(caster_ptr, &bm_ptr->dir))
103             return FALSE;
104
105         msg_print(_("矢を放った。", "You fire an arrow."));
106         bm_ptr->damage = monspell_bluemage_damage(caster_ptr, (MS_SHOOT), bm_ptr->plev, DAM_ROLL);
107         fire_bolt(caster_ptr, GF_ARROW, bm_ptr->dir, bm_ptr->damage);
108         break;
109     }
110     case MS_BR_ACID:
111         if (!get_aim_dir(caster_ptr, &bm_ptr->dir))
112             return FALSE;
113
114         msg_print(_("酸のブレスを吐いた。", "You breathe acid."));
115         bm_ptr->damage = monspell_bluemage_damage(caster_ptr, (MS_BR_ACID), bm_ptr->plev, DAM_ROLL);
116         fire_breath(caster_ptr, GF_ACID, bm_ptr->dir, bm_ptr->damage, (bm_ptr->plev > 40 ? 3 : 2));
117         break;
118     case MS_BR_ELEC:
119         if (!get_aim_dir(caster_ptr, &bm_ptr->dir))
120             return FALSE;
121
122         msg_print(_("稲妻のブレスを吐いた。", "You breathe lightning."));
123         bm_ptr->damage = monspell_bluemage_damage(caster_ptr, (MS_BR_ELEC), bm_ptr->plev, DAM_ROLL);
124         fire_breath(caster_ptr, GF_ELEC, bm_ptr->dir, bm_ptr->damage, (bm_ptr->plev > 40 ? 3 : 2));
125         break;
126     case MS_BR_FIRE:
127         if (!get_aim_dir(caster_ptr, &bm_ptr->dir))
128             return FALSE;
129
130         msg_print(_("火炎のブレスを吐いた。", "You breathe fire."));
131         bm_ptr->damage = monspell_bluemage_damage(caster_ptr, (MS_BR_FIRE), bm_ptr->plev, DAM_ROLL);
132         fire_breath(caster_ptr, GF_FIRE, bm_ptr->dir, bm_ptr->damage, (bm_ptr->plev > 40 ? 3 : 2));
133         break;
134     case MS_BR_COLD:
135         if (!get_aim_dir(caster_ptr, &bm_ptr->dir))
136             return FALSE;
137
138         msg_print(_("冷気のブレスを吐いた。", "You breathe frost."));
139         bm_ptr->damage = monspell_bluemage_damage(caster_ptr, (MS_BR_COLD), bm_ptr->plev, DAM_ROLL);
140         fire_breath(caster_ptr, GF_COLD, bm_ptr->dir, bm_ptr->damage, (bm_ptr->plev > 40 ? 3 : 2));
141         break;
142     case MS_BR_POIS:
143         if (!get_aim_dir(caster_ptr, &bm_ptr->dir))
144             return FALSE;
145
146         msg_print(_("ガスのブレスを吐いた。", "You breathe gas."));
147         bm_ptr->damage = monspell_bluemage_damage(caster_ptr, (MS_BR_POIS), bm_ptr->plev, DAM_ROLL);
148         fire_breath(caster_ptr, GF_POIS, bm_ptr->dir, bm_ptr->damage, (bm_ptr->plev > 40 ? 3 : 2));
149         break;
150     case MS_BR_NETHER:
151         if (!get_aim_dir(caster_ptr, &bm_ptr->dir))
152             return FALSE;
153
154         msg_print(_("地獄のブレスを吐いた。", "You breathe nether."));
155         bm_ptr->damage = monspell_bluemage_damage(caster_ptr, (MS_BR_NETHER), bm_ptr->plev, DAM_ROLL);
156         fire_breath(caster_ptr, GF_NETHER, bm_ptr->dir, bm_ptr->damage, (bm_ptr->plev > 40 ? 3 : 2));
157         break;
158     case MS_BR_LITE:
159         if (!get_aim_dir(caster_ptr, &bm_ptr->dir))
160             return FALSE;
161
162         msg_print(_("閃光のブレスを吐いた。", "You breathe light."));
163         bm_ptr->damage = monspell_bluemage_damage(caster_ptr, (MS_BR_LITE), bm_ptr->plev, DAM_ROLL);
164         fire_breath(caster_ptr, GF_LITE, bm_ptr->dir, bm_ptr->damage, (bm_ptr->plev > 40 ? 3 : 2));
165         break;
166     case MS_BR_DARK:
167         if (!get_aim_dir(caster_ptr, &bm_ptr->dir))
168             return FALSE;
169
170         msg_print(_("暗黒のブレスを吐いた。", "You breathe darkness."));
171         bm_ptr->damage = monspell_bluemage_damage(caster_ptr, (MS_BR_DARK), bm_ptr->plev, DAM_ROLL);
172         fire_breath(caster_ptr, GF_DARK, bm_ptr->dir, bm_ptr->damage, (bm_ptr->plev > 40 ? 3 : 2));
173         break;
174     case MS_BR_CONF:
175         if (!get_aim_dir(caster_ptr, &bm_ptr->dir))
176             return FALSE;
177
178         msg_print(_("混乱のブレスを吐いた。", "You breathe confusion."));
179         bm_ptr->damage = monspell_bluemage_damage(caster_ptr, (MS_BR_CONF), bm_ptr->plev, DAM_ROLL);
180         fire_breath(caster_ptr, GF_CONFUSION, bm_ptr->dir, bm_ptr->damage, (bm_ptr->plev > 40 ? 3 : 2));
181         break;
182     case MS_BR_SOUND:
183         if (!get_aim_dir(caster_ptr, &bm_ptr->dir))
184             return FALSE;
185
186         msg_print(_("轟音のブレスを吐いた。", "You breathe sound."));
187         bm_ptr->damage = monspell_bluemage_damage(caster_ptr, (MS_BR_SOUND), bm_ptr->plev, DAM_ROLL);
188         fire_breath(caster_ptr, GF_SOUND, bm_ptr->dir, bm_ptr->damage, (bm_ptr->plev > 40 ? 3 : 2));
189         break;
190     case MS_BR_CHAOS:
191         if (!get_aim_dir(caster_ptr, &bm_ptr->dir))
192             return FALSE;
193
194         msg_print(_("カオスのブレスを吐いた。", "You breathe chaos."));
195         bm_ptr->damage = monspell_bluemage_damage(caster_ptr, (MS_BR_CHAOS), bm_ptr->plev, DAM_ROLL);
196         fire_breath(caster_ptr, GF_CHAOS, bm_ptr->dir, bm_ptr->damage, (bm_ptr->plev > 40 ? 3 : 2));
197         break;
198     case MS_BR_DISEN:
199         if (!get_aim_dir(caster_ptr, &bm_ptr->dir))
200             return FALSE;
201
202         msg_print(_("劣化のブレスを吐いた。", "You breathe disenchantment."));
203         bm_ptr->damage = monspell_bluemage_damage(caster_ptr, (MS_BR_DISEN), bm_ptr->plev, DAM_ROLL);
204         fire_breath(caster_ptr, GF_DISENCHANT, bm_ptr->dir, bm_ptr->damage, (bm_ptr->plev > 40 ? 3 : 2));
205         break;
206     case MS_BR_NEXUS:
207         if (!get_aim_dir(caster_ptr, &bm_ptr->dir))
208             return FALSE;
209
210         msg_print(_("因果混乱のブレスを吐いた。", "You breathe nexus."));
211         bm_ptr->damage = monspell_bluemage_damage(caster_ptr, (MS_BR_NEXUS), bm_ptr->plev, DAM_ROLL);
212         fire_breath(caster_ptr, GF_NEXUS, bm_ptr->dir, bm_ptr->damage, (bm_ptr->plev > 40 ? 3 : 2));
213         break;
214     case MS_BR_TIME:
215         if (!get_aim_dir(caster_ptr, &bm_ptr->dir))
216             return FALSE;
217
218         msg_print(_("時間逆転のブレスを吐いた。", "You breathe time."));
219         bm_ptr->damage = monspell_bluemage_damage(caster_ptr, (MS_BR_TIME), bm_ptr->plev, DAM_ROLL);
220         fire_breath(caster_ptr, GF_TIME, bm_ptr->dir, bm_ptr->damage, (bm_ptr->plev > 40 ? 3 : 2));
221         break;
222     case MS_BR_INERTIA:
223         if (!get_aim_dir(caster_ptr, &bm_ptr->dir))
224             return FALSE;
225
226         msg_print(_("遅鈍のブレスを吐いた。", "You breathe inertia."));
227         bm_ptr->damage = monspell_bluemage_damage(caster_ptr, (MS_BR_INERTIA), bm_ptr->plev, DAM_ROLL);
228         fire_breath(caster_ptr, GF_INERTIAL, bm_ptr->dir, bm_ptr->damage, (bm_ptr->plev > 40 ? 3 : 2));
229         break;
230     case MS_BR_GRAVITY:
231         if (!get_aim_dir(caster_ptr, &bm_ptr->dir))
232             return FALSE;
233
234         msg_print(_("重力のブレスを吐いた。", "You breathe gravity."));
235         bm_ptr->damage = monspell_bluemage_damage(caster_ptr, (MS_BR_GRAVITY), bm_ptr->plev, DAM_ROLL);
236         fire_breath(caster_ptr, GF_GRAVITY, bm_ptr->dir, bm_ptr->damage, (bm_ptr->plev > 40 ? 3 : 2));
237         break;
238     case MS_BR_SHARDS:
239         if (!get_aim_dir(caster_ptr, &bm_ptr->dir))
240             return FALSE;
241
242         msg_print(_("破片のブレスを吐いた。", "You breathe shards."));
243         bm_ptr->damage = monspell_bluemage_damage(caster_ptr, (MS_BR_SHARDS), bm_ptr->plev, DAM_ROLL);
244         fire_breath(caster_ptr, GF_SHARDS, bm_ptr->dir, bm_ptr->damage, (bm_ptr->plev > 40 ? 3 : 2));
245         break;
246     case MS_BR_PLASMA:
247         if (!get_aim_dir(caster_ptr, &bm_ptr->dir))
248             return FALSE;
249
250         msg_print(_("プラズマのブレスを吐いた。", "You breathe plasma."));
251         bm_ptr->damage = monspell_bluemage_damage(caster_ptr, (MS_BR_PLASMA), bm_ptr->plev, DAM_ROLL);
252         fire_breath(caster_ptr, GF_PLASMA, bm_ptr->dir, bm_ptr->damage, (bm_ptr->plev > 40 ? 3 : 2));
253         break;
254     case MS_BR_FORCE:
255         if (!get_aim_dir(caster_ptr, &bm_ptr->dir))
256             return FALSE;
257
258         msg_print(_("フォースのブレスを吐いた。", "You breathe force."));
259         bm_ptr->damage = monspell_bluemage_damage(caster_ptr, (MS_BR_FORCE), bm_ptr->plev, DAM_ROLL);
260         fire_breath(caster_ptr, GF_FORCE, bm_ptr->dir, bm_ptr->damage, (bm_ptr->plev > 40 ? 3 : 2));
261         break;
262     case MS_BR_MANA:
263         if (!get_aim_dir(caster_ptr, &bm_ptr->dir))
264             return FALSE;
265
266         msg_print(_("魔力のブレスを吐いた。", "You breathe mana."));
267         bm_ptr->damage = monspell_bluemage_damage(caster_ptr, (MS_BR_MANA), bm_ptr->plev, DAM_ROLL);
268         fire_breath(caster_ptr, GF_MANA, bm_ptr->dir, bm_ptr->damage, (bm_ptr->plev > 40 ? 3 : 2));
269         break;
270     case MS_BALL_NUKE:
271         if (!get_aim_dir(caster_ptr, &bm_ptr->dir))
272             return FALSE;
273
274         msg_print(_("放射能球を放った。", "You cast a ball of radiation."));
275         bm_ptr->damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_NUKE), bm_ptr->plev, DAM_ROLL);
276         fire_ball(caster_ptr, GF_NUKE, bm_ptr->dir, bm_ptr->damage, 2);
277         break;
278     case MS_BR_NUKE:
279         if (!get_aim_dir(caster_ptr, &bm_ptr->dir))
280             return FALSE;
281
282         msg_print(_("放射性廃棄物のブレスを吐いた。", "You breathe toxic waste."));
283         bm_ptr->damage = monspell_bluemage_damage(caster_ptr, (MS_BR_NUKE), bm_ptr->plev, DAM_ROLL);
284         fire_breath(caster_ptr, GF_NUKE, bm_ptr->dir, bm_ptr->damage, (bm_ptr->plev > 40 ? 3 : 2));
285         break;
286     case MS_BALL_CHAOS:
287         if (!get_aim_dir(caster_ptr, &bm_ptr->dir))
288             return FALSE;
289
290         msg_print(_("純ログルスを放った。", "You invoke a raw Logrus."));
291         bm_ptr->damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_CHAOS), bm_ptr->plev, DAM_ROLL);
292         fire_ball(caster_ptr, GF_CHAOS, bm_ptr->dir, bm_ptr->damage, 4);
293         break;
294     case MS_BR_DISI:
295         if (!get_aim_dir(caster_ptr, &bm_ptr->dir))
296             return FALSE;
297
298         msg_print(_("分解のブレスを吐いた。", "You breathe disintegration."));
299         bm_ptr->damage = monspell_bluemage_damage(caster_ptr, (MS_BR_DISI), bm_ptr->plev, DAM_ROLL);
300         fire_breath(caster_ptr, GF_DISINTEGRATE, bm_ptr->dir, bm_ptr->damage, (bm_ptr->plev > 40 ? 3 : 2));
301         break;
302     case MS_BALL_ACID:
303         if (!get_aim_dir(caster_ptr, &bm_ptr->dir))
304             return FALSE;
305
306         msg_print(_("アシッド・ボールの呪文を唱えた。", "You cast an acid ball."));
307         bm_ptr->damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_ACID), bm_ptr->plev, DAM_ROLL);
308         fire_ball(caster_ptr, GF_ACID, bm_ptr->dir, bm_ptr->damage, 2);
309         break;
310     case MS_BALL_ELEC:
311         if (!get_aim_dir(caster_ptr, &bm_ptr->dir))
312             return FALSE;
313
314         msg_print(_("サンダー・ボールの呪文を唱えた。", "You cast a lightning ball."));
315         bm_ptr->damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_ELEC), bm_ptr->plev, DAM_ROLL);
316         fire_ball(caster_ptr, GF_ELEC, bm_ptr->dir, bm_ptr->damage, 2);
317         break;
318     case MS_BALL_FIRE:
319         if (!get_aim_dir(caster_ptr, &bm_ptr->dir))
320             return FALSE;
321
322         msg_print(_("ファイア・ボールの呪文を唱えた。", "You cast a fire ball."));
323         bm_ptr->damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_FIRE), bm_ptr->plev, DAM_ROLL);
324         fire_ball(caster_ptr, GF_FIRE, bm_ptr->dir, bm_ptr->damage, 2);
325         break;
326     case MS_BALL_COLD:
327         if (!get_aim_dir(caster_ptr, &bm_ptr->dir))
328             return FALSE;
329
330         msg_print(_("アイス・ボールの呪文を唱えた。", "You cast a frost ball."));
331         bm_ptr->damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_COLD), bm_ptr->plev, DAM_ROLL);
332         fire_ball(caster_ptr, GF_COLD, bm_ptr->dir, bm_ptr->damage, 2);
333         break;
334     case MS_BALL_POIS:
335         if (!get_aim_dir(caster_ptr, &bm_ptr->dir))
336             return FALSE;
337
338         msg_print(_("悪臭雲の呪文を唱えた。", "You cast a stinking cloud."));
339         bm_ptr->damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_POIS), bm_ptr->plev, DAM_ROLL);
340         fire_ball(caster_ptr, GF_POIS, bm_ptr->dir, bm_ptr->damage, 2);
341         break;
342     case MS_BALL_NETHER:
343         if (!get_aim_dir(caster_ptr, &bm_ptr->dir))
344             return FALSE;
345
346         msg_print(_("地獄球の呪文を唱えた。", "You cast a nether ball."));
347         bm_ptr->damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_NETHER), bm_ptr->plev, DAM_ROLL);
348         fire_ball(caster_ptr, GF_NETHER, bm_ptr->dir, bm_ptr->damage, 2);
349         break;
350     case MS_BALL_WATER:
351         if (!get_aim_dir(caster_ptr, &bm_ptr->dir))
352             return FALSE;
353
354         msg_print(_("流れるような身振りをした。", "You gesture fluidly."));
355         bm_ptr->damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_WATER), bm_ptr->plev, DAM_ROLL);
356         fire_ball(caster_ptr, GF_WATER, bm_ptr->dir, bm_ptr->damage, 4);
357         break;
358     case MS_BALL_MANA:
359         if (!get_aim_dir(caster_ptr, &bm_ptr->dir))
360             return FALSE;
361
362         msg_print(_("魔力の嵐の呪文を念じた。", "You invoke a mana storm."));
363         bm_ptr->damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_MANA), bm_ptr->plev, DAM_ROLL);
364         fire_ball(caster_ptr, GF_MANA, bm_ptr->dir, bm_ptr->damage, 4);
365         break;
366     case MS_BALL_DARK:
367         if (!get_aim_dir(caster_ptr, &bm_ptr->dir))
368             return FALSE;
369
370         msg_print(_("暗黒の嵐の呪文を念じた。", "You invoke a darkness storm."));
371         bm_ptr->damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_DARK), bm_ptr->plev, DAM_ROLL);
372         fire_ball(caster_ptr, GF_DARK, bm_ptr->dir, bm_ptr->damage, 4);
373         break;
374     case MS_DRAIN_MANA:
375         if (!get_aim_dir(caster_ptr, &bm_ptr->dir))
376             return FALSE;
377
378         bm_ptr->damage = monspell_bluemage_damage(caster_ptr, (MS_DRAIN_MANA), bm_ptr->plev, DAM_ROLL);
379         fire_ball_hide(caster_ptr, GF_DRAIN_MANA, bm_ptr->dir, bm_ptr->damage, 0);
380         break;
381     case MS_MIND_BLAST:
382         if (!get_aim_dir(caster_ptr, &bm_ptr->dir))
383             return FALSE;
384
385         bm_ptr->damage = monspell_bluemage_damage(caster_ptr, (MS_MIND_BLAST), bm_ptr->plev, DAM_ROLL);
386         fire_ball_hide(caster_ptr, GF_MIND_BLAST, bm_ptr->dir, bm_ptr->damage, 0);
387         break;
388     case MS_BRAIN_SMASH:
389         if (!get_aim_dir(caster_ptr, &bm_ptr->dir))
390             return FALSE;
391
392         bm_ptr->damage = monspell_bluemage_damage(caster_ptr, (MS_BRAIN_SMASH), bm_ptr->plev, DAM_ROLL);
393         fire_ball_hide(caster_ptr, GF_BRAIN_SMASH, bm_ptr->dir, bm_ptr->damage, 0);
394         break;
395     case MS_CAUSE_1:
396         if (!get_aim_dir(caster_ptr, &bm_ptr->dir))
397             return FALSE;
398
399         bm_ptr->damage = monspell_bluemage_damage(caster_ptr, (MS_CAUSE_1), bm_ptr->plev, DAM_ROLL);
400         fire_ball_hide(caster_ptr, GF_CAUSE_1, bm_ptr->dir, bm_ptr->damage, 0);
401         break;
402     case MS_CAUSE_2:
403         if (!get_aim_dir(caster_ptr, &bm_ptr->dir))
404             return FALSE;
405
406         bm_ptr->damage = monspell_bluemage_damage(caster_ptr, (MS_CAUSE_2), bm_ptr->plev, DAM_ROLL);
407         fire_ball_hide(caster_ptr, GF_CAUSE_2, bm_ptr->dir, bm_ptr->damage, 0);
408         break;
409     case MS_CAUSE_3:
410         if (!get_aim_dir(caster_ptr, &bm_ptr->dir))
411             return FALSE;
412
413         bm_ptr->damage = monspell_bluemage_damage(caster_ptr, (MS_CAUSE_3), bm_ptr->plev, DAM_ROLL);
414         fire_ball_hide(caster_ptr, GF_CAUSE_3, bm_ptr->dir, bm_ptr->damage, 0);
415         break;
416     case MS_CAUSE_4:
417         if (!get_aim_dir(caster_ptr, &bm_ptr->dir))
418             return FALSE;
419
420         bm_ptr->damage = monspell_bluemage_damage(caster_ptr, (MS_CAUSE_4), bm_ptr->plev, DAM_ROLL);
421         fire_ball_hide(caster_ptr, GF_CAUSE_4, bm_ptr->dir, bm_ptr->damage, 0);
422         break;
423     case MS_BOLT_ACID:
424         if (!get_aim_dir(caster_ptr, &bm_ptr->dir))
425             return FALSE;
426
427         msg_print(_("アシッド・ボルトの呪文を唱えた。", "You cast an acid bolt."));
428         bm_ptr->damage = monspell_bluemage_damage(caster_ptr, (MS_BOLT_ACID), bm_ptr->plev, DAM_ROLL);
429         fire_bolt(caster_ptr, GF_ACID, bm_ptr->dir, bm_ptr->damage);
430         break;
431     case MS_BOLT_ELEC:
432         if (!get_aim_dir(caster_ptr, &bm_ptr->dir))
433             return FALSE;
434
435         msg_print(_("サンダー・ボルトの呪文を唱えた。", "You cast a lightning bolt."));
436         bm_ptr->damage = monspell_bluemage_damage(caster_ptr, (MS_BOLT_ELEC), bm_ptr->plev, DAM_ROLL);
437         fire_bolt(caster_ptr, GF_ELEC, bm_ptr->dir, bm_ptr->damage);
438         break;
439     case MS_BOLT_FIRE:
440         if (!get_aim_dir(caster_ptr, &bm_ptr->dir))
441             return FALSE;
442
443         msg_print(_("ファイア・ボルトの呪文を唱えた。", "You cast a fire bolt."));
444         bm_ptr->damage = monspell_bluemage_damage(caster_ptr, (MS_BOLT_FIRE), bm_ptr->plev, DAM_ROLL);
445         fire_bolt(caster_ptr, GF_FIRE, bm_ptr->dir, bm_ptr->damage);
446         break;
447     case MS_BOLT_COLD:
448         if (!get_aim_dir(caster_ptr, &bm_ptr->dir))
449             return FALSE;
450
451         msg_print(_("アイス・ボルトの呪文を唱えた。", "You cast a frost bolt."));
452         bm_ptr->damage = monspell_bluemage_damage(caster_ptr, (MS_BOLT_COLD), bm_ptr->plev, DAM_ROLL);
453         fire_bolt(caster_ptr, GF_COLD, bm_ptr->dir, bm_ptr->damage);
454         break;
455     case MS_STARBURST:
456         if (!get_aim_dir(caster_ptr, &bm_ptr->dir))
457             return FALSE;
458
459         msg_print(_("スターバーストの呪文を念じた。", "You invoke a starburst."));
460         bm_ptr->damage = monspell_bluemage_damage(caster_ptr, (MS_STARBURST), bm_ptr->plev, DAM_ROLL);
461         fire_ball(caster_ptr, GF_LITE, bm_ptr->dir, bm_ptr->damage, 4);
462         break;
463     case MS_BOLT_NETHER:
464         if (!get_aim_dir(caster_ptr, &bm_ptr->dir))
465             return FALSE;
466
467         msg_print(_("地獄の矢の呪文を唱えた。", "You cast a nether bolt."));
468         bm_ptr->damage = monspell_bluemage_damage(caster_ptr, (MS_BOLT_NETHER), bm_ptr->plev, DAM_ROLL);
469         fire_bolt(caster_ptr, GF_NETHER, bm_ptr->dir, bm_ptr->damage);
470         break;
471     case MS_BOLT_WATER:
472         if (!get_aim_dir(caster_ptr, &bm_ptr->dir))
473             return FALSE;
474
475         msg_print(_("ウォーター・ボルトの呪文を唱えた。", "You cast a water bolt."));
476         bm_ptr->damage = monspell_bluemage_damage(caster_ptr, (MS_BOLT_WATER), bm_ptr->plev, DAM_ROLL);
477         fire_bolt(caster_ptr, GF_WATER, bm_ptr->dir, bm_ptr->damage);
478         break;
479     case MS_BOLT_MANA:
480         if (!get_aim_dir(caster_ptr, &bm_ptr->dir))
481             return FALSE;
482
483         msg_print(_("魔力の矢の呪文を唱えた。", "You cast a mana bolt."));
484         bm_ptr->damage = monspell_bluemage_damage(caster_ptr, (MS_BOLT_MANA), bm_ptr->plev, DAM_ROLL);
485         fire_bolt(caster_ptr, GF_MANA, bm_ptr->dir, bm_ptr->damage);
486         break;
487     case MS_BOLT_PLASMA:
488         if (!get_aim_dir(caster_ptr, &bm_ptr->dir))
489             return FALSE;
490
491         msg_print(_("プラズマ・ボルトの呪文を唱えた。", "You cast a plasma bolt."));
492         bm_ptr->damage = monspell_bluemage_damage(caster_ptr, (MS_BOLT_PLASMA), bm_ptr->plev, DAM_ROLL);
493         fire_bolt(caster_ptr, GF_PLASMA, bm_ptr->dir, bm_ptr->damage);
494         break;
495     case MS_BOLT_ICE:
496         if (!get_aim_dir(caster_ptr, &bm_ptr->dir))
497             return FALSE;
498
499         msg_print(_("極寒の矢の呪文を唱えた。", "You cast a ice bolt."));
500         bm_ptr->damage = monspell_bluemage_damage(caster_ptr, (MS_BOLT_ICE), bm_ptr->plev, DAM_ROLL);
501         fire_bolt(caster_ptr, GF_ICE, bm_ptr->dir, bm_ptr->damage);
502         break;
503     case MS_MAGIC_MISSILE:
504         if (!get_aim_dir(caster_ptr, &bm_ptr->dir))
505             return FALSE;
506
507         msg_print(_("マジック・ミサイルの呪文を唱えた。", "You cast a magic missile."));
508         bm_ptr->damage = monspell_bluemage_damage(caster_ptr, (MS_MAGIC_MISSILE), bm_ptr->plev, DAM_ROLL);
509         fire_bolt(caster_ptr, GF_MISSILE, bm_ptr->dir, bm_ptr->damage);
510         break;
511     case MS_SCARE:
512         if (!get_aim_dir(caster_ptr, &bm_ptr->dir))
513             return FALSE;
514
515         msg_print(_("恐ろしげな幻覚を作り出した。", "You cast a fearful illusion."));
516         fear_monster(caster_ptr, bm_ptr->dir, bm_ptr->plev + 10);
517         break;
518     case MS_BLIND:
519         if (!get_aim_dir(caster_ptr, &bm_ptr->dir))
520             return FALSE;
521         confuse_monster(caster_ptr, bm_ptr->dir, bm_ptr->plev * 2);
522         break;
523     case MS_CONF:
524         if (!get_aim_dir(caster_ptr, &bm_ptr->dir))
525             return FALSE;
526
527         msg_print(_("誘惑的な幻覚をつくり出した。", "You cast a mesmerizing illusion."));
528         confuse_monster(caster_ptr, bm_ptr->dir, bm_ptr->plev * 2);
529         break;
530     case MS_SLOW:
531         if (!get_aim_dir(caster_ptr, &bm_ptr->dir))
532             return FALSE;
533         slow_monster(caster_ptr, bm_ptr->dir, bm_ptr->plev);
534         break;
535     case MS_SLEEP:
536         if (!get_aim_dir(caster_ptr, &bm_ptr->dir))
537             return FALSE;
538         sleep_monster(caster_ptr, bm_ptr->dir, bm_ptr->plev);
539         break;
540     case MS_SPEED:
541         (void)set_fast(caster_ptr, randint1(20 + bm_ptr->plev) + bm_ptr->plev, FALSE);
542         break;
543     case MS_HAND_DOOM: {
544         if (!get_aim_dir(caster_ptr, &bm_ptr->dir))
545             return FALSE;
546
547         msg_print(_("<破滅の手>を放った!", "You invoke the Hand of Doom!"));
548         fire_ball_hide(caster_ptr, GF_HAND_DOOM, bm_ptr->dir, bm_ptr->plev * 3, 0);
549         break;
550     }
551     case MS_HEAL:
552         msg_print(_("自分の傷に念を集中した。", "You concentrate on your wounds!"));
553         (void)hp_player(caster_ptr, bm_ptr->plev * 4);
554         (void)set_stun(caster_ptr, 0);
555         (void)set_cut(caster_ptr, 0);
556         break;
557     case MS_INVULNER:
558         msg_print(_("無傷の球の呪文を唱えた。", "You cast a Globe of Invulnerability."));
559         (void)set_invuln(caster_ptr, randint1(4) + 4, FALSE);
560         break;
561     case MS_BLINK:
562         teleport_player(caster_ptr, 10, TELEPORT_SPONTANEOUS);
563         break;
564     case MS_TELEPORT:
565         teleport_player(caster_ptr, bm_ptr->plev * 5, TELEPORT_SPONTANEOUS);
566         break;
567     case MS_WORLD:
568         (void)time_walk(caster_ptr);
569         break;
570     case MS_SPECIAL:
571         break;
572     case MS_TELE_TO: {
573         monster_type *m_ptr;
574         monster_race *r_ptr;
575         GAME_TEXT m_name[MAX_NLEN];
576
577         if (!target_set(caster_ptr, TARGET_KILL))
578             return FALSE;
579
580         if (!floor_ptr->grid_array[target_row][target_col].m_idx)
581             break;
582
583         if (!player_has_los_bold(caster_ptr, target_row, target_col))
584             break;
585
586         if (!projectable(caster_ptr, caster_ptr->y, caster_ptr->x, target_row, target_col))
587             break;
588
589         m_ptr = &floor_ptr->m_list[floor_ptr->grid_array[target_row][target_col].m_idx];
590         r_ptr = &r_info[m_ptr->r_idx];
591         monster_desc(caster_ptr, m_name, m_ptr, 0);
592         if (r_ptr->flagsr & RFR_RES_TELE) {
593             if ((r_ptr->flags1 & RF1_UNIQUE) || (r_ptr->flagsr & RFR_RES_ALL)) {
594                 if (is_original_ap_and_seen(caster_ptr, m_ptr))
595                     r_ptr->r_flagsr |= RFR_RES_TELE;
596                 msg_format(_("%sには効果がなかった!", "%s is unaffected!"), m_name);
597                 break;
598             } else if (r_ptr->level > randint1(100)) {
599                 if (is_original_ap_and_seen(caster_ptr, m_ptr))
600                     r_ptr->r_flagsr |= RFR_RES_TELE;
601                 msg_format(_("%sには耐性がある!", "%s resists!"), m_name);
602                 break;
603             }
604         }
605
606         msg_format(_("%sを引き戻した。", "You command %s to return."), m_name);
607         teleport_monster_to(caster_ptr, floor_ptr->grid_array[target_row][target_col].m_idx, caster_ptr->y, caster_ptr->x, 100, TELEPORT_PASSIVE);
608         break;
609     }
610     case MS_TELE_AWAY:
611         if (!get_aim_dir(caster_ptr, &bm_ptr->dir))
612             return FALSE;
613
614         (void)fire_beam(caster_ptr, GF_AWAY_ALL, bm_ptr->dir, 100);
615         break;
616     case MS_TELE_LEVEL:
617         return teleport_level_other(caster_ptr);
618         break;
619     case MS_PSY_SPEAR:
620         if (!get_aim_dir(caster_ptr, &bm_ptr->dir))
621             return FALSE;
622
623         msg_print(_("光の剣を放った。", "You throw a psycho-spear."));
624         bm_ptr->damage = monspell_bluemage_damage(caster_ptr, (MS_PSY_SPEAR), bm_ptr->plev, DAM_ROLL);
625         (void)fire_beam(caster_ptr, GF_PSY_SPEAR, bm_ptr->dir, bm_ptr->damage);
626         break;
627     case MS_DARKNESS:
628
629         msg_print(_("暗闇の中で手を振った。", "You gesture in shadow."));
630         (void)unlite_area(caster_ptr, 10, 3);
631         break;
632     case MS_MAKE_TRAP:
633         if (!target_set(caster_ptr, TARGET_KILL))
634             return FALSE;
635
636         msg_print(_("呪文を唱えて邪悪に微笑んだ。", "You cast a spell and cackle evilly."));
637         trap_creation(caster_ptr, target_row, target_col);
638         break;
639     case MS_FORGET:
640         msg_print(_("しかし何も起きなかった。", "Nothing happen."));
641         break;
642     case MS_RAISE_DEAD:
643         msg_print(_("死者復活の呪文を唱えた。", "You animate the dead."));
644         (void)animate_dead(caster_ptr, 0, caster_ptr->y, caster_ptr->x);
645         break;
646     case MS_S_KIN: {
647         msg_print(_("援軍を召喚した。", "You summon one of your kin."));
648         for (int k = 0; k < 1; k++) {
649             if (summon_kin_player(caster_ptr, bm_ptr->summon_lev, caster_ptr->y, caster_ptr->x, (bm_ptr->pet ? PM_FORCE_PET : 0L))) {
650                 if (!bm_ptr->pet)
651                     msg_print(_("召喚された仲間は怒っている!", "The summoned companion is angry!"));
652             } else {
653                 bm_ptr->no_trump = TRUE;
654             }
655         }
656
657         break;
658     }
659     case MS_S_CYBER: {
660         msg_print(_("サイバーデーモンを召喚した!", "You summon a Cyberdemon!"));
661         for (int k = 0; k < 1; k++) {
662             if (summon_specific(caster_ptr, (bm_ptr->pet ? -1 : 0), caster_ptr->y, caster_ptr->x, bm_ptr->summon_lev, SUMMON_CYBER, bm_ptr->p_mode)) {
663                 if (!bm_ptr->pet)
664                     msg_print(_("召喚されたサイバーデーモンは怒っている!", "The summoned Cyberdemon are angry!"));
665             } else {
666                 bm_ptr->no_trump = TRUE;
667             }
668         }
669         break;
670     }
671     case MS_S_MONSTER: {
672         msg_print(_("仲間を召喚した。", "You summon help."));
673         for (int k = 0; k < 1; k++) {
674             if (summon_specific(caster_ptr, (bm_ptr->pet ? -1 : 0), caster_ptr->y, caster_ptr->x, bm_ptr->summon_lev, 0, bm_ptr->p_mode)) {
675                 if (!bm_ptr->pet)
676                     msg_print(_("召喚されたモンスターは怒っている!", "The summoned monster is angry!"));
677             } else {
678                 bm_ptr->no_trump = TRUE;
679             }
680         }
681
682         break;
683     }
684     case MS_S_MONSTERS: {
685         msg_print(_("モンスターを召喚した!", "You summon monsters!"));
686         for (int k = 0; k < bm_ptr->plev / 15 + 2; k++) {
687             if (summon_specific(caster_ptr, (bm_ptr->pet ? -1 : 0), caster_ptr->y, caster_ptr->x, bm_ptr->summon_lev, 0, (bm_ptr->p_mode | bm_ptr->u_mode))) {
688                 if (!bm_ptr->pet)
689                     msg_print(_("召喚されたモンスターは怒っている!", "The summoned monsters are angry!"));
690             } else {
691                 bm_ptr->no_trump = TRUE;
692             }
693         }
694
695         break;
696     }
697     case MS_S_ANT: {
698         msg_print(_("アリを召喚した。", "You summon ants."));
699         if (summon_specific(
700                 caster_ptr, (bm_ptr->pet ? -1 : 0), caster_ptr->y, caster_ptr->x, bm_ptr->summon_lev, SUMMON_ANT, (PM_ALLOW_GROUP | bm_ptr->p_mode))) {
701             if (!bm_ptr->pet)
702                 msg_print(_("召喚されたアリは怒っている!", "The summoned ants are angry!"));
703         } else {
704             bm_ptr->no_trump = TRUE;
705         }
706
707         break;
708     }
709     case MS_S_SPIDER: {
710         msg_print(_("蜘蛛を召喚した。", "You summon spiders."));
711         if (summon_specific(
712                 caster_ptr, (bm_ptr->pet ? -1 : 0), caster_ptr->y, caster_ptr->x, bm_ptr->summon_lev, SUMMON_SPIDER, (PM_ALLOW_GROUP | bm_ptr->p_mode))) {
713             if (!bm_ptr->pet)
714                 msg_print(_("召喚された蜘蛛は怒っている!", "Summoned spiders are angry!"));
715         } else {
716             bm_ptr->no_trump = TRUE;
717         }
718
719         break;
720     }
721     case MS_S_HOUND: {
722         msg_print(_("ハウンドを召喚した。", "You summon hounds."));
723         if (summon_specific(
724                 caster_ptr, (bm_ptr->pet ? -1 : 0), caster_ptr->y, caster_ptr->x, bm_ptr->summon_lev, SUMMON_HOUND, (PM_ALLOW_GROUP | bm_ptr->p_mode))) {
725             if (!bm_ptr->pet)
726                 msg_print(_("召喚されたハウンドは怒っている!", "Summoned hounds are angry!"));
727         } else {
728             bm_ptr->no_trump = TRUE;
729         }
730
731         break;
732     }
733     case MS_S_HYDRA: {
734         msg_print(_("ヒドラを召喚した。", "You summon a hydras."));
735         if (summon_specific(
736                 caster_ptr, (bm_ptr->pet ? -1 : 0), caster_ptr->y, caster_ptr->x, bm_ptr->summon_lev, SUMMON_HYDRA, (bm_ptr->g_mode | bm_ptr->p_mode))) {
737             if (!bm_ptr->pet)
738                 msg_print(_("召喚されたヒドラは怒っている!", "Summoned hydras are angry!"));
739         } else {
740             bm_ptr->no_trump = TRUE;
741         }
742
743         break;
744     }
745     case MS_S_ANGEL: {
746         msg_print(_("天使を召喚した!", "You summon an angel!"));
747         if (summon_specific(
748                 caster_ptr, (bm_ptr->pet ? -1 : 0), caster_ptr->y, caster_ptr->x, bm_ptr->summon_lev, SUMMON_ANGEL, (bm_ptr->g_mode | bm_ptr->p_mode))) {
749             if (!bm_ptr->pet)
750                 msg_print(_("召喚された天使は怒っている!", "The summoned angel is angry!"));
751         } else {
752             bm_ptr->no_trump = TRUE;
753         }
754
755         break;
756     }
757     case MS_S_DEMON: {
758         msg_print(_("混沌の宮廷から悪魔を召喚した!", "You summon a demon from the Courts of Chaos!"));
759         if (summon_specific(
760                 caster_ptr, (bm_ptr->pet ? -1 : 0), caster_ptr->y, caster_ptr->x, bm_ptr->summon_lev, SUMMON_DEMON, (bm_ptr->g_mode | bm_ptr->p_mode))) {
761             if (!bm_ptr->pet)
762                 msg_print(_("召喚されたデーモンは怒っている!", "The summoned demon is angry!"));
763         } else {
764             bm_ptr->no_trump = TRUE;
765         }
766
767         break;
768     }
769     case MS_S_UNDEAD: {
770         msg_print(_("アンデッドの強敵を召喚した!", "You summon an undead adversary!"));
771         if (summon_specific(
772                 caster_ptr, (bm_ptr->pet ? -1 : 0), caster_ptr->y, caster_ptr->x, bm_ptr->summon_lev, SUMMON_UNDEAD, (bm_ptr->g_mode | bm_ptr->p_mode))) {
773             if (!bm_ptr->pet)
774                 msg_print(_("召喚されたアンデッドは怒っている!", "The summoned undead is angry!"));
775         } else {
776             bm_ptr->no_trump = TRUE;
777         }
778
779         break;
780     }
781     case MS_S_DRAGON: {
782         msg_print(_("ドラゴンを召喚した!", "You summon a dragon!"));
783         if (summon_specific(
784                 caster_ptr, (bm_ptr->pet ? -1 : 0), caster_ptr->y, caster_ptr->x, bm_ptr->summon_lev, SUMMON_DRAGON, (bm_ptr->g_mode | bm_ptr->p_mode))) {
785             if (!bm_ptr->pet)
786                 msg_print(_("召喚されたドラゴンは怒っている!", "The summoned dragon is angry!"));
787         } else {
788             bm_ptr->no_trump = TRUE;
789         }
790
791         break;
792     }
793     case MS_S_HI_UNDEAD: {
794         msg_print(_("強力なアンデッドを召喚した!", "You summon a greater undead!"));
795         if (summon_specific(caster_ptr, (bm_ptr->pet ? -1 : 0), caster_ptr->y, caster_ptr->x, bm_ptr->summon_lev, SUMMON_HI_UNDEAD,
796                 (bm_ptr->g_mode | bm_ptr->p_mode | bm_ptr->u_mode))) {
797             if (!bm_ptr->pet)
798                 msg_print(_("召喚された上級アンデッドは怒っている!", "The summoned greater undead is angry!"));
799         } else {
800             bm_ptr->no_trump = TRUE;
801         }
802
803         break;
804     }
805     case MS_S_HI_DRAGON: {
806         msg_print(_("古代ドラゴンを召喚した!", "You summon an ancient dragon!"));
807         if (summon_specific(caster_ptr, (bm_ptr->pet ? -1 : 0), caster_ptr->y, caster_ptr->x, bm_ptr->summon_lev, SUMMON_HI_DRAGON,
808                 (bm_ptr->g_mode | bm_ptr->p_mode | bm_ptr->u_mode))) {
809             if (!bm_ptr->pet)
810                 msg_print(_("召喚された古代ドラゴンは怒っている!", "The summoned ancient dragon is angry!"));
811         } else {
812             bm_ptr->no_trump = TRUE;
813         }
814
815         break;
816     }
817     case MS_S_AMBERITE: {
818         msg_print(_("アンバーの王族を召喚した!", "You summon a Lord of Amber!"));
819         if (summon_specific(caster_ptr, (bm_ptr->pet ? -1 : 0), caster_ptr->y, caster_ptr->x, bm_ptr->summon_lev, SUMMON_AMBERITES,
820                 (bm_ptr->g_mode | bm_ptr->p_mode | bm_ptr->u_mode))) {
821             if (!bm_ptr->pet)
822                 msg_print(_("召喚されたアンバーの王族は怒っている!", "The summoned Lord of Amber is angry!"));
823         } else {
824             bm_ptr->no_trump = TRUE;
825         }
826
827         break;
828     }
829     case MS_S_UNIQUE: {
830         int k, count = 0;
831         msg_print(_("特別な強敵を召喚した!", "You summon a special opponent!"));
832         for (k = 0; k < 1; k++) {
833             if (summon_specific(caster_ptr, (bm_ptr->pet ? -1 : 0), caster_ptr->y, caster_ptr->x, bm_ptr->summon_lev, SUMMON_UNIQUE,
834                     (bm_ptr->g_mode | bm_ptr->p_mode | PM_ALLOW_UNIQUE))) {
835                 count++;
836                 if (!bm_ptr->pet)
837                     msg_print(_("召喚されたユニーク・モンスターは怒っている!", "The summoned special opponent is angry!"));
838             }
839         }
840
841         for (k = count; k < 1; k++) {
842             if (summon_specific(caster_ptr, (bm_ptr->pet ? -1 : 0), caster_ptr->y, caster_ptr->x, bm_ptr->summon_lev, SUMMON_HI_UNDEAD,
843                     (bm_ptr->g_mode | bm_ptr->p_mode | PM_ALLOW_UNIQUE))) {
844                 count++;
845                 if (!bm_ptr->pet)
846                     msg_print(_("召喚された上級アンデッドは怒っている!", "The summoned greater undead is angry!"));
847             }
848         }
849
850         if (!count)
851             bm_ptr->no_trump = TRUE;
852
853         break;
854     }
855     default:
856         msg_print("hoge?");
857     }
858
859     if (bm_ptr->no_trump)
860         msg_print(_("何も現れなかった。", "No one appeared."));
861
862     return TRUE;
863 }