OSDN Git Service

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