OSDN Git Service

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