OSDN Git Service

[Refactor] race-flags#.h のインクルードを削除
[hengbandforosx/hengbandosx.git] / src / mspell / mspell-floor.cpp
index 4561034..d18b210 100644 (file)
@@ -1,4 +1,4 @@
-/*!
+/*!
  * @brief フロアの一定範囲に効果を及ぼす (悲鳴、テレポート等)スペルの効果
  * @date 2020/05/16
  * @author Hourier
@@ -7,17 +7,14 @@
 #include "mspell/mspell-floor.h"
 #include "blue-magic/blue-magic-checker.h"
 #include "core/disturbance.h"
-#include "core/player-update-types.h"
 #include "effect/attribute-types.h"
 #include "effect/effect-characteristics.h"
 #include "effect/effect-processor.h"
 #include "mind/drs-types.h"
 #include "monster-race/monster-race.h"
 #include "monster-race/race-ability-flags.h"
+#include "monster-race/race-brightness-mask.h"
 #include "monster-race/race-flags-resistance.h"
-#include "monster-race/race-flags1.h"
-#include "monster-race/race-flags3.h"
-#include "monster-race/race-flags7.h"
 #include "monster-race/race-indice-types.h"
 #include "monster-race/race-resistance-mask.h"
 #include "monster/monster-info.h"
 #include "spell-kind/spells-world.h"
 #include "spell-realm/spells-hex.h"
 #include "system/floor-type-definition.h"
-#include "system/monster-race-definition.h"
-#include "system/monster-type-definition.h"
+#include "system/monster-entity.h"
+#include "system/monster-race-info.h"
 #include "system/player-type-definition.h"
+#include "system/redrawing-flags-updater.h"
+#include "timed-effect/player-blindness.h"
+#include "timed-effect/timed-effects.h"
 #include "util/bit-flags-calculator.h"
 #include "view/display-messages.h"
 
  */
 MonsterSpellResult spell_RF4_SHRIEK(MONSTER_IDX m_idx, PlayerType *player_ptr, MONSTER_IDX t_idx, int target_type)
 {
-    mspell_cast_msg_simple msg(_("%^sがかん高い金切り声をあげた。", "%^s makes a high pitched shriek."),
-        _("%^sが%sに向かって叫んだ。", "%^s shrieks at %s."));
+    mspell_cast_msg_simple msg(_("%s^がかん高い金切り声をあげた。", "%s^ makes a high pitched shriek."),
+        _("%s^が%sに向かって叫んだ。", "%s^ shrieks at %s."));
 
     simple_monspell_message(player_ptr, m_idx, t_idx, msg, target_type);
 
     auto *m_ptr = &player_ptr->current_floor_ptr->m_list[m_idx];
     auto result = MonsterSpellResult::make_valid();
-    if (m_ptr->r_idx == MON_LEE_QIEZI) {
+    if (m_ptr->r_idx == MonsterRaceId::LEE_QIEZI) {
         msg_print(_("しかし、その声は誰の心にも響かなかった…。", "However, that voice didn't touch anyone's heart..."));
         return result;
     }
@@ -86,8 +86,6 @@ MonsterSpellResult spell_RF4_SHRIEK(MONSTER_IDX m_idx, PlayerType *player_ptr, M
 MonsterSpellResult spell_RF6_WORLD(PlayerType *player_ptr, MONSTER_IDX m_idx)
 {
     auto *m_ptr = &player_ptr->current_floor_ptr->m_list[m_idx];
-    GAME_TEXT m_name[MAX_NLEN];
-    monster_name(player_ptr, m_idx, m_name);
     disturb(player_ptr, true, true);
     (void)set_monster_timewalk(player_ptr, randint1(2) + 2, m_ptr->r_idx, true);
 
@@ -106,26 +104,28 @@ MonsterSpellResult spell_RF6_WORLD(PlayerType *player_ptr, MONSTER_IDX m_idx)
 MonsterSpellResult spell_RF6_BLINK(PlayerType *player_ptr, MONSTER_IDX m_idx, int target_type, bool is_quantum_effect)
 {
     const auto res = MonsterSpellResult::make_valid();
+    const auto m_name = monster_name(player_ptr, m_idx);
 
-    GAME_TEXT m_name[MAX_NLEN];
-    monster_name(player_ptr, m_idx, m_name);
-
-    if (target_type == MONSTER_TO_PLAYER)
+    if (target_type == MONSTER_TO_PLAYER) {
         disturb(player_ptr, true, true);
+    }
 
     if (!is_quantum_effect && SpellHex(player_ptr).check_hex_barrier(m_idx, HEX_ANTI_TELE)) {
-        if (see_monster(player_ptr, m_idx))
-            msg_format(_("魔法のバリアが%^sのテレポートを邪魔した。", "Magic barrier obstructs teleporting of %^s."), m_name);
+        if (see_monster(player_ptr, m_idx)) {
+            msg_format(_("魔法のバリアが%s^のテレポートを邪魔した。", "Magic barrier obstructs teleporting of %s^."), m_name.data());
+        }
         return res;
     }
 
-    if (see_monster(player_ptr, m_idx))
-        msg_format(_("%^sが瞬時に消えた。", "%^s blinks away."), m_name);
+    if (see_monster(player_ptr, m_idx)) {
+        msg_format(_("%s^が瞬時に消えた。", "%s^ blinks away."), m_name.data());
+    }
 
     teleport_away(player_ptr, m_idx, 10, TELEPORT_SPONTANEOUS);
 
-    if (target_type == MONSTER_TO_PLAYER)
-        player_ptr->update |= (PU_MONSTERS);
+    if (target_type == MONSTER_TO_PLAYER) {
+        RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::MONSTER_STATUSES);
+    }
 
     return res;
 }
@@ -141,20 +141,21 @@ MonsterSpellResult spell_RF6_BLINK(PlayerType *player_ptr, MONSTER_IDX m_idx, in
 MonsterSpellResult spell_RF6_TPORT(PlayerType *player_ptr, MONSTER_IDX m_idx, int target_type)
 {
     const auto res = MonsterSpellResult::make_valid();
+    const auto m_name = monster_name(player_ptr, m_idx);
 
-    GAME_TEXT m_name[MAX_NLEN];
-    monster_name(player_ptr, m_idx, m_name);
-
-    if (target_type == MONSTER_TO_PLAYER)
+    if (target_type == MONSTER_TO_PLAYER) {
         disturb(player_ptr, true, true);
+    }
     if (SpellHex(player_ptr).check_hex_barrier(m_idx, HEX_ANTI_TELE)) {
-        if (see_monster(player_ptr, m_idx))
-            msg_format(_("魔法のバリアが%^sのテレポートを邪魔した。", "Magic barrier obstructs teleporting of %^s."), m_name);
+        if (see_monster(player_ptr, m_idx)) {
+            msg_format(_("魔法のバリアが%s^のテレポートを邪魔した。", "Magic barrier obstructs teleporting of %s^."), m_name.data());
+        }
         return res;
     }
 
-    if (see_monster(player_ptr, m_idx))
-        msg_format(_("%^sがテレポートした。", "%^s teleports away."), m_name);
+    if (see_monster(player_ptr, m_idx)) {
+        msg_format(_("%s^がテレポートした。", "%s^ teleports away."), m_name.data());
+    }
 
     teleport_away_followable(player_ptr, m_idx);
 
@@ -177,11 +178,11 @@ MonsterSpellResult spell_RF6_TELE_TO(PlayerType *player_ptr, MONSTER_IDX m_idx,
 
     auto *floor_ptr = player_ptr->current_floor_ptr;
     auto *m_ptr = &floor_ptr->m_list[m_idx];
-    monster_type *t_ptr = &floor_ptr->m_list[t_idx];
-    monster_race *tr_ptr = &r_info[t_ptr->r_idx];
+    auto *t_ptr = &floor_ptr->m_list[t_idx];
+    auto *tr_ptr = &t_ptr->get_monrace();
 
-    mspell_cast_msg_simple msg(_("%^sがあなたを引き戻した。", "%^s commands you to return."),
-        _("%^sが%sを引き戻した。", "%^s commands %s to return."));
+    mspell_cast_msg_simple msg(_("%s^があなたを引き戻した。", "%s^ commands you to return."),
+        _("%s^が%sを引き戻した。", "%s^ commands %s to return."));
 
     simple_monspell_message(player_ptr, m_idx, t_idx, msg, target_type);
 
@@ -190,26 +191,28 @@ MonsterSpellResult spell_RF6_TELE_TO(PlayerType *player_ptr, MONSTER_IDX m_idx,
         return res;
     }
 
-    if (target_type != MONSTER_TO_MONSTER)
+    if (target_type != MONSTER_TO_MONSTER) {
         return res;
+    }
 
     bool resists_tele = false;
-    GAME_TEXT t_name[MAX_NLEN];
-    monster_name(player_ptr, t_idx, t_name);
+    const auto t_name = monster_name(player_ptr, t_idx);
 
     if (tr_ptr->resistance_flags.has(MonsterResistanceType::RESIST_TELEPORT)) {
         if (tr_ptr->kind_flags.has(MonsterKindType::UNIQUE) || tr_ptr->resistance_flags.has(MonsterResistanceType::RESIST_ALL)) {
-            if (is_original_ap_and_seen(player_ptr, t_ptr))
+            if (is_original_ap_and_seen(player_ptr, t_ptr)) {
                 tr_ptr->r_resistance_flags.set(MonsterResistanceType::RESIST_TELEPORT);
+            }
             if (see_monster(player_ptr, t_idx)) {
-                msg_format(_("%^sには効果がなかった。", "%^s is unaffected!"), t_name);
+                msg_format(_("%s^には効果がなかった。", "%s^ is unaffected!"), t_name.data());
             }
             resists_tele = true;
         } else if (tr_ptr->level > randint1(100)) {
-            if (is_original_ap_and_seen(player_ptr, t_ptr))
+            if (is_original_ap_and_seen(player_ptr, t_ptr)) {
                 tr_ptr->r_resistance_flags.set(MonsterResistanceType::RESIST_TELEPORT);
+            }
             if (see_monster(player_ptr, t_idx)) {
-                msg_format(_("%^sは耐性を持っている!", "%^s resists!"), t_name);
+                msg_format(_("%s^は耐性を持っている!", "%s^ resists!"), t_name.data());
             }
             resists_tele = true;
         }
@@ -220,10 +223,11 @@ MonsterSpellResult spell_RF6_TELE_TO(PlayerType *player_ptr, MONSTER_IDX m_idx,
         return res;
     }
 
-    if (t_idx == player_ptr->riding)
+    if (t_idx == player_ptr->riding) {
         teleport_player_to(player_ptr, m_ptr->fy, m_ptr->fx, TELEPORT_PASSIVE);
-    else
+    } else {
         teleport_monster_to(player_ptr, t_idx, m_ptr->fy, m_ptr->fx, 100, TELEPORT_PASSIVE);
+    }
     set_monster_csleep(player_ptr, t_idx, 0);
 
     return res;
@@ -244,48 +248,51 @@ MonsterSpellResult spell_RF6_TELE_AWAY(PlayerType *player_ptr, MONSTER_IDX m_idx
     res.learnable = target_type == MONSTER_TO_PLAYER;
 
     auto *floor_ptr = player_ptr->current_floor_ptr;
-    monster_type *t_ptr = &floor_ptr->m_list[t_idx];
-    monster_race *tr_ptr = &r_info[t_ptr->r_idx];
+    MonsterEntity *t_ptr = &floor_ptr->m_list[t_idx];
+    MonsterRaceInfo *tr_ptr = &t_ptr->get_monrace();
 
-    mspell_cast_msg_simple msg(_("%^sにテレポートさせられた。", "%^s teleports you away."),
-        _("%^sは%sをテレポートさせた。", "%^s teleports %s away."));
+    mspell_cast_msg_simple msg(_("%s^にテレポートさせられた。", "%s^ teleports you away."),
+        _("%s^は%sをテレポートさせた。", "%s^ teleports %s away."));
 
     simple_monspell_message(player_ptr, m_idx, t_idx, msg, target_type);
 
     if (target_type == MONSTER_TO_PLAYER) {
-        if (is_echizen(player_ptr))
+        if (is_echizen(player_ptr)) {
             msg_print(_("くっそ~", ""));
-        else if (is_chargeman(player_ptr)) {
-            if (randint0(2) == 0)
+        else if (is_chargeman(player_ptr)) {
+            if (randint0(2) == 0) {
                 msg_print(_("ジュラル星人め!", ""));
-            else
+            } else {
                 msg_print(_("弱い者いじめは止めるんだ!", ""));
+            }
         }
 
         teleport_player_away(m_idx, player_ptr, 100, false);
         return res;
     }
 
-    if (target_type != MONSTER_TO_MONSTER)
+    if (target_type != MONSTER_TO_MONSTER) {
         return res;
+    }
 
     bool resists_tele = false;
-    GAME_TEXT t_name[MAX_NLEN];
-    monster_name(player_ptr, t_idx, t_name);
+    const auto t_name = monster_name(player_ptr, t_idx);
 
     if (tr_ptr->resistance_flags.has(MonsterResistanceType::RESIST_TELEPORT)) {
         if (tr_ptr->kind_flags.has(MonsterKindType::UNIQUE) || tr_ptr->resistance_flags.has(MonsterResistanceType::RESIST_ALL)) {
-            if (is_original_ap_and_seen(player_ptr, t_ptr))
+            if (is_original_ap_and_seen(player_ptr, t_ptr)) {
                 tr_ptr->r_resistance_flags.set(MonsterResistanceType::RESIST_TELEPORT);
+            }
             if (see_monster(player_ptr, t_idx)) {
-                msg_format(_("%^sには効果がなかった。", "%^s is unaffected!"), t_name);
+                msg_format(_("%s^には効果がなかった。", "%s^ is unaffected!"), t_name.data());
             }
             resists_tele = true;
         } else if (tr_ptr->level > randint1(100)) {
-            if (is_original_ap_and_seen(player_ptr, t_ptr))
+            if (is_original_ap_and_seen(player_ptr, t_ptr)) {
                 tr_ptr->r_resistance_flags.set(MonsterResistanceType::RESIST_TELEPORT);
+            }
             if (see_monster(player_ptr, t_idx)) {
-                msg_format(_("%^sは耐性を持っている!", "%^s resists!"), t_name);
+                msg_format(_("%s^は耐性を持っている!", "%s^ resists!"), t_name.data());
             }
             resists_tele = true;
         }
@@ -296,10 +303,11 @@ MonsterSpellResult spell_RF6_TELE_AWAY(PlayerType *player_ptr, MONSTER_IDX m_idx
         return res;
     }
 
-    if (t_idx == player_ptr->riding)
-        teleport_player_away(m_idx, player_ptr, MAX_SIGHT * 2 + 5, false);
-    else
-        teleport_away(player_ptr, t_idx, MAX_SIGHT * 2 + 5, TELEPORT_PASSIVE);
+    if (t_idx == player_ptr->riding) {
+        teleport_player_away(m_idx, player_ptr, MAX_PLAYER_SIGHT * 2 + 5, false);
+    } else {
+        teleport_away(player_ptr, t_idx, MAX_PLAYER_SIGHT * 2 + 5, TELEPORT_PASSIVE);
+    }
     set_monster_csleep(player_ptr, t_idx, 0);
 
     return res;
@@ -319,8 +327,8 @@ MonsterSpellResult spell_RF6_TELE_LEVEL(PlayerType *player_ptr, MONSTER_IDX m_id
     const auto res = MonsterSpellResult::make_valid();
 
     auto *floor_ptr = player_ptr->current_floor_ptr;
-    monster_type *t_ptr = &floor_ptr->m_list[t_idx];
-    monster_race *tr_ptr = &r_info[t_ptr->r_idx];
+    MonsterEntity *t_ptr = &floor_ptr->m_list[t_idx];
+    MonsterRaceInfo *tr_ptr = &t_ptr->get_monrace();
     DEPTH rlev = monster_level_idx(floor_ptr, m_idx);
     bool resist, saving_throw;
 
@@ -328,8 +336,8 @@ MonsterSpellResult spell_RF6_TELE_LEVEL(PlayerType *player_ptr, MONSTER_IDX m_id
         resist = (has_resist_nexus(player_ptr) != 0);
         saving_throw = (randint0(100 + rlev / 2) < player_ptr->skill_sav);
 
-        mspell_cast_msg_bad_status_to_player msg(_("%^sが何か奇妙な言葉をつぶやいた。", "%^s mumbles strangely."),
-            _("%^sがあなたの足を指さした。", "%^s gestures at your feet."), _("しかし効果がなかった!", "You are unaffected!"),
+        mspell_cast_msg_bad_status_to_player msg(_("%s^が何か奇妙な言葉をつぶやいた。", "%s^ mumbles strangely."),
+            _("%s^があなたの足を指さした。", "%s^ gestures at your feet."), _("しかし効果がなかった!", "You are unaffected!"),
             _("しかし効力を跳ね返した!", "You resist the effects!"));
 
         spell_badstatus_message_to_player(player_ptr, m_idx, msg, resist, saving_throw);
@@ -342,14 +350,15 @@ MonsterSpellResult spell_RF6_TELE_LEVEL(PlayerType *player_ptr, MONSTER_IDX m_id
         return res;
     }
 
-    if (target_type != MONSTER_TO_MONSTER)
+    if (target_type != MONSTER_TO_MONSTER) {
         return res;
+    }
 
     resist = tr_ptr->resistance_flags.has_any_of(RFR_EFF_RESIST_NEXUS_MASK) || tr_ptr->resistance_flags.has(MonsterResistanceType::RESIST_TELEPORT);
-    saving_throw = (tr_ptr->flags1 & RF1_QUESTOR) || (tr_ptr->level > randint1((rlev - 10) < 1 ? 1 : (rlev - 10)) + 10);
+    saving_throw = (tr_ptr->misc_flags.has(MonsterMiscType::QUESTOR)) || (tr_ptr->level > randint1((rlev - 10) < 1 ? 1 : (rlev - 10)) + 10);
 
-    mspell_cast_msg_bad_status_to_monster msg(_("%^sが%sの足を指さした。", "%^s gestures at %s's feet."),
-        _("%^sには効果がなかった。", "%^s is unaffected!"), _("%^sは効力を跳ね返した!", "%^s resist the effects!"), "");
+    mspell_cast_msg_bad_status_to_monster msg(_("%s^が%sの足を指さした。", "%s^ gestures at %s's feet."),
+        _("%s^には効果がなかった。", "%s^ is unaffected!"), _("%s^は効力を跳ね返した!", "%s^ resist the effects!"), "");
 
     spell_badstatus_message_to_mons(player_ptr, m_idx, t_idx, msg, resist, saving_throw);
 
@@ -377,41 +386,45 @@ MonsterSpellResult spell_RF6_DARKNESS(PlayerType *player_ptr, POSITION y, POSITI
     concptr msg_done;
     auto *floor_ptr = player_ptr->current_floor_ptr;
     auto *m_ptr = &floor_ptr->m_list[m_idx];
-    monster_type *t_ptr = &floor_ptr->m_list[t_idx];
-    auto *r_ptr = &r_info[m_ptr->r_idx];
+    auto *r_ptr = &m_ptr->get_monrace();
     bool can_use_lite_area = false;
     bool monster_to_monster = target_type == MONSTER_TO_MONSTER;
     bool monster_to_player = target_type == MONSTER_TO_PLAYER;
-    GAME_TEXT t_name[MAX_NLEN];
-    monster_name(player_ptr, t_idx, t_name);
+    const auto t_name = monster_name(player_ptr, t_idx);
 
-    if (PlayerClass(player_ptr).equals(PlayerClassType::NINJA) && r_ptr->kind_flags.has_not(MonsterKindType::UNDEAD) && r_ptr->resistance_flags.has_not(MonsterResistanceType::HURT_LITE) && !(r_ptr->flags7 & RF7_DARK_MASK))
+    const auto is_ninja = PlayerClass(player_ptr).equals(PlayerClassType::NINJA);
+    const auto is_living_monster = r_ptr->kind_flags.has_not(MonsterKindType::UNDEAD);
+    const auto is_not_weak_lite = r_ptr->resistance_flags.has_not(MonsterResistanceType::HURT_LITE);
+    if (is_ninja && is_living_monster && is_not_weak_lite && r_ptr->brightness_flags.has_none_of(dark_mask)) {
         can_use_lite_area = true;
+    }
 
-    if (monster_to_monster && !is_hostile(t_ptr))
+    const auto &t_ref = floor_ptr->m_list[t_idx];
+    if (monster_to_monster && !t_ref.is_hostile()) {
         can_use_lite_area = false;
+    }
 
     auto res = MonsterSpellResult::make_valid();
     res.learnable = monster_to_player && !can_use_lite_area;
 
     if (can_use_lite_area) {
-        msg.blind = _("%^sが何かをつぶやいた。", "%^s mumbles.");
-        msg.to_player = _("%^sが辺りを明るく照らした。", "%^s cast a spell to light up.");
-        msg.to_mons = _("%^sが辺りを明るく照らした。", "%^s cast a spell to light up.");
+        msg.blind = _("%s^が何かをつぶやいた。", "%s^ mumbles.");
+        msg.to_player = _("%s^が辺りを明るく照らした。", "%s^ cast a spell to light up.");
+        msg.to_mons = _("%s^が辺りを明るく照らした。", "%s^ cast a spell to light up.");
 
-        msg_done = _("%^sは白い光に包まれた。", "%^s is surrounded by a white light.");
+        msg_done = _("%s^は白い光に包まれた。", "%s^ is surrounded by a white light.");
     } else {
-        msg.blind = _("%^sが何かをつぶやいた。", "%^s mumbles.");
-        msg.to_player = _("%^sが暗闇の中で手を振った。", "%^s gestures in shadow.");
-        msg.to_mons = _("%^sが暗闇の中で手を振った。", "%^s gestures in shadow.");
+        msg.blind = _("%s^が何かをつぶやいた。", "%s^ mumbles.");
+        msg.to_player = _("%s^が暗闇の中で手を振った。", "%s^ gestures in shadow.");
+        msg.to_mons = _("%s^が暗闇の中で手を振った。", "%s^ gestures in shadow.");
 
-        msg_done = _("%^sは暗闇に包まれた。", "%^s is surrounded by darkness.");
+        msg_done = _("%s^は暗闇に包まれた。", "%s^ is surrounded by darkness.");
     }
 
     monspell_message(player_ptr, m_idx, t_idx, msg, target_type);
 
     if (see_monster(player_ptr, t_idx) && monster_to_monster) {
-        msg_format(msg_done, t_name);
+        msg_format(msg_done, t_name.data());
     }
 
     if (monster_to_player) {
@@ -444,14 +457,14 @@ MonsterSpellResult spell_RF6_DARKNESS(PlayerType *player_ptr, POSITION y, POSITI
  */
 MonsterSpellResult spell_RF6_TRAPS(PlayerType *player_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx)
 {
-    GAME_TEXT m_name[MAX_NLEN];
-    monster_name(player_ptr, m_idx, m_name);
+    const auto m_name = monster_name(player_ptr, m_idx);
     disturb(player_ptr, true, true);
 
-    if (player_ptr->blind)
-        msg_format(_("%^sが何かをつぶやいて邪悪に微笑んだ。", "%^s mumbles, and then cackles evilly."), m_name);
-    else
-        msg_format(_("%^sが呪文を唱えて邪悪に微笑んだ。", "%^s casts a spell and cackles evilly."), m_name);
+    if (player_ptr->effects()->blindness()->is_blind()) {
+        msg_format(_("%s^が何かをつぶやいて邪悪に微笑んだ。", "%s^ mumbles, and then cackles evilly."), m_name.data());
+    } else {
+        msg_format(_("%s^が呪文を唱えて邪悪に微笑んだ。", "%s^ casts a spell and cackles evilly."), m_name.data());
+    }
 
     (void)trap_creation(player_ptr, y, x);
 
@@ -473,8 +486,8 @@ MonsterSpellResult spell_RF6_TRAPS(PlayerType *player_ptr, POSITION y, POSITION
 MonsterSpellResult spell_RF6_RAISE_DEAD(PlayerType *player_ptr, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int target_type)
 {
     auto *m_ptr = &player_ptr->current_floor_ptr->m_list[m_idx];
-    mspell_cast_msg_blind msg(_("%^sが何かをつぶやいた。", "%^s mumbles."),
-        _("%^sが死者復活の呪文を唱えた。", "%^s casts a spell to revive corpses."), _("%^sが死者復活の呪文を唱えた。", "%^s casts a spell to revive corpses."));
+    mspell_cast_msg_blind msg(_("%s^が何かをつぶやいた。", "%s^ mumbles."),
+        _("%s^が死者復活の呪文を唱えた。", "%s^ casts a spell to revive corpses."), _("%s^が死者復活の呪文を唱えた。", "%s^ casts a spell to revive corpses."));
 
     monspell_message(player_ptr, m_idx, t_idx, msg, target_type);