OSDN Git Service

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