OSDN Git Service

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