OSDN Git Service

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