OSDN Git Service

[Refactor] #890 escape_monster() からis_acting_monster() を分離した
authorHourier <66951241+Hourier@users.noreply.github.com>
Sun, 31 Jul 2022 08:18:58 +0000 (17:18 +0900)
committerHourier <66951241+Hourier@users.noreply.github.com>
Sun, 31 Jul 2022 08:29:21 +0000 (17:29 +0900)
src/monster-floor/monster-runaway.cpp

index 649d5c0..946e009 100644 (file)
 #include "view/display-messages.h"
 
 /*!
- * @brief HPが1/3未満になった有効的なユニークモンスターの逃走処理を行う
+ * @brief monspeak.txt において、発話ではなく行動のみが描写されているモンスターであるかを調べる
+ * @param r_idx モンスター種族ID
+ * @return 会話内容が行動のみのモンスターか否か
+ */
+static bool is_acting_monster(const MonsterRaceId r_idx)
+{
+    auto is_acting_monster = r_idx == MonsterRaceId::GRIP;
+    is_acting_monster |= r_idx == MonsterRaceId::WOLF;
+    is_acting_monster |= r_idx == MonsterRaceId::FANG;
+    return is_acting_monster;
+}
+
+/*!
+ * @brief HPが1/3未満になった友好的なユニークモンスターの逃走処理を行う
  * @param player_ptr プレイヤーへの参照ポインタ
  * @param is_riding_mon 騎乗状態ならばTRUE
  * @param m_ptr モンスターへの参照ポインタ
  * @param m_name モンスター名称
- * @param see_m モンスターが視界内にいたらTRUE
  */
 static void escape_monster(PlayerType *player_ptr, turn_flags *turn_flags_ptr, monster_type *m_ptr, GAME_TEXT *m_name)
 {
-    auto *r_ptr = &r_info[m_ptr->r_idx];
     if (turn_flags_ptr->is_riding_mon) {
         msg_format(_("%sはあなたの束縛から脱出した。", "%^s succeeded to escape from your restriction!"), m_name);
         if (process_fall_off_horse(player_ptr, -1, false)) {
@@ -50,7 +61,12 @@ static void escape_monster(PlayerType *player_ptr, turn_flags *turn_flags_ptr, m
             MonsterSpeakType::SPEAK_BATTLE,
             MonsterSpeakType::SPEAK_FEAR,
         };
-        if ((r_ptr->speak_flags.has_any_of(flags)) && (m_ptr->r_idx != MonsterRaceId::GRIP) && (m_ptr->r_idx != MonsterRaceId::WOLF) && (m_ptr->r_idx != MonsterRaceId::FANG) && player_has_los_bold(player_ptr, m_ptr->fy, m_ptr->fx) && projectable(player_ptr, m_ptr->fy, m_ptr->fx, player_ptr->y, player_ptr->x)) {
+
+        auto speak = r_info[m_ptr->r_idx].speak_flags.has_any_of(flags);
+        speak &= !is_acting_monster(m_ptr->r_idx);
+        speak &= player_has_los_bold(player_ptr, m_ptr->fy, m_ptr->fx);
+        speak &= projectable(player_ptr, m_ptr->fy, m_ptr->fx, player_ptr->y, player_ptr->x);
+        if (speak) {
             msg_format(_("%^s「ピンチだ!退却させてもらう!」", "%^s says 'It is the pinch! I will retreat'."), m_name);
         }