OSDN Git Service

[Refactor] #3286 Removed player-redraw-types.h
[hengbandforosx/hengbandosx.git] / src / monster / monster-update.cpp
index 50c8842..2e9fa59 100644 (file)
@@ -6,11 +6,8 @@
 
 #include "monster/monster-update.h"
 #include "core/disturbance.h"
-#include "core/player-redraw-types.h"
-#include "core/player-update-types.h"
 #include "core/window-redrawer.h"
 #include "dungeon/dungeon-flag-types.h"
-#include "dungeon/dungeon.h"
 #include "floor/cave.h"
 #include "floor/geometry.h"
 #include "game-option/birth-options.h"
@@ -18,6 +15,8 @@
 #include "grid/grid.h"
 #include "mind/drs-types.h"
 #include "monster-race/monster-race.h"
+#include "monster-race/race-brightness-flags.h"
+#include "monster-race/race-brightness-mask.h"
 #include "monster-race/race-flags1.h"
 #include "monster-race/race-flags2.h"
 #include "monster-race/race-flags3.h"
 #include "player/player-status-flags.h"
 #include "player/special-defense-types.h"
 #include "status/element-resistance.h"
+#include "system/dungeon-info.h"
 #include "system/floor-type-definition.h"
 #include "system/grid-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 "target/projection-path-calculator.h"
+#include "timed-effect/player-blindness.h"
+#include "timed-effect/player-hallucination.h"
+#include "timed-effect/timed-effects.h"
 #include "util/bit-flags-calculator.h"
 #include "world/world.h"
 
 // Update Monster.
-typedef struct um_type {
-    monster_type *m_ptr;
+struct um_type {
+    MonsterEntity *m_ptr;
     bool do_disturb;
     POSITION fy;
     POSITION fx;
@@ -54,7 +58,7 @@ typedef struct um_type {
     bool easy;
     bool in_darkness;
     bool full;
-} um_type;
+};
 
 /*!
  * @brief 騎乗中のモンスター情報を更新する
@@ -71,9 +75,10 @@ bool update_riding_monster(PlayerType *player_ptr, turn_flags *turn_flags_ptr, M
 {
     auto *m_ptr = &player_ptr->current_floor_ptr->m_list[m_idx];
     auto *g_ptr = &player_ptr->current_floor_ptr->grid_array[ny][nx];
-    monster_type *y_ptr = &player_ptr->current_floor_ptr->m_list[g_ptr->m_idx];
-    if (turn_flags_ptr->is_riding_mon)
+    MonsterEntity *y_ptr = &player_ptr->current_floor_ptr->m_list[g_ptr->m_idx];
+    if (turn_flags_ptr->is_riding_mon) {
         return move_player_effect(player_ptr, ny, nx, MPE_DONT_PICKUP);
+    }
 
     player_ptr->current_floor_ptr->grid_array[oy][ox].m_idx = g_ptr->m_idx;
     if (g_ptr->m_idx) {
@@ -97,15 +102,19 @@ bool update_riding_monster(PlayerType *player_ptr, turn_flags *turn_flags_ptr, M
  * @param player_ptr プレイヤーへの参照ポインタ
  * @param turn_flags_ptr ターン経過処理フラグへの参照ポインタ
  */
-void update_player_type(PlayerType *player_ptr, turn_flags *turn_flags_ptr, monster_race *r_ptr)
+void update_player_type(PlayerType *player_ptr, turn_flags *turn_flags_ptr, MonsterRaceInfo *r_ptr)
 {
+    using Mbt = MonsterBrightnessType;
+    const auto except_has_lite = EnumClassFlagGroup<Mbt>(self_ld_mask).set({ Mbt::HAS_DARK_1, Mbt::HAS_DARK_2 });
+    auto &rfu = RedrawingFlagsUpdater::get_instance();
     if (turn_flags_ptr->do_view) {
-        player_ptr->update |= PU_FLOW;
+        rfu.set_flag(StatusRedrawingFlag::FLOW);
         player_ptr->window_flags |= PW_OVERHEAD | PW_DUNGEON;
     }
 
-    if (turn_flags_ptr->do_move && ((r_ptr->flags7 & (RF7_SELF_LD_MASK | RF7_HAS_DARK_1 | RF7_HAS_DARK_2)) || ((r_ptr->flags7 & (RF7_HAS_LITE_1 | RF7_HAS_LITE_2)) && !player_ptr->phase_out))) {
-        player_ptr->update |= PU_MON_LITE;
+    const auto has_lite = r_ptr->brightness_flags.has_any_of({ Mbt::HAS_LITE_1, Mbt::HAS_LITE_2 });
+    if (turn_flags_ptr->do_move && (r_ptr->brightness_flags.has_any_of(except_has_lite) || (has_lite && !player_ptr->phase_out))) {
+        rfu.set_flag(StatusRedrawingFlag::MONSTER_LITE);
     }
 }
 
@@ -115,32 +124,40 @@ void update_player_type(PlayerType *player_ptr, turn_flags *turn_flags_ptr, mons
  * @param turn_flags_ptr ターン経過処理フラグへの参照ポインタ
  * @param m_ptr モンスターへの参照ポインタ
  */
-void update_monster_race_flags(PlayerType *player_ptr, turn_flags *turn_flags_ptr, monster_type *m_ptr)
+void update_monster_race_flags(PlayerType *player_ptr, turn_flags *turn_flags_ptr, MonsterEntity *m_ptr)
 {
-    auto *r_ptr = &r_info[m_ptr->r_idx];
-    if (!is_original_ap_and_seen(player_ptr, m_ptr))
+    auto *r_ptr = &monraces_info[m_ptr->r_idx];
+    if (!is_original_ap_and_seen(player_ptr, m_ptr)) {
         return;
+    }
 
-    if (turn_flags_ptr->did_open_door)
+    if (turn_flags_ptr->did_open_door) {
         r_ptr->r_behavior_flags.set(MonsterBehaviorType::OPEN_DOOR);
+    }
 
-    if (turn_flags_ptr->did_bash_door)
+    if (turn_flags_ptr->did_bash_door) {
         r_ptr->r_behavior_flags.set(MonsterBehaviorType::BASH_DOOR);
+    }
 
-    if (turn_flags_ptr->did_take_item)
+    if (turn_flags_ptr->did_take_item) {
         r_ptr->r_behavior_flags.set(MonsterBehaviorType::TAKE_ITEM);
+    }
 
-    if (turn_flags_ptr->did_kill_item)
+    if (turn_flags_ptr->did_kill_item) {
         r_ptr->r_behavior_flags.set(MonsterBehaviorType::KILL_ITEM);
+    }
 
-    if (turn_flags_ptr->did_move_body)
+    if (turn_flags_ptr->did_move_body) {
         r_ptr->r_behavior_flags.set(MonsterBehaviorType::MOVE_BODY);
+    }
 
-    if (turn_flags_ptr->did_pass_wall)
-        r_ptr->r_flags2 |= RF2_PASS_WALL;
+    if (turn_flags_ptr->did_pass_wall) {
+        r_ptr->r_feature_flags.set(MonsterFeatureType::PASS_WALL);
+    }
 
-    if (turn_flags_ptr->did_kill_wall)
-        r_ptr->r_flags2 |= RF2_KILL_WALL;
+    if (turn_flags_ptr->did_kill_wall) {
+        r_ptr->r_feature_flags.set(MonsterFeatureType::KILL_WALL);
+    }
 }
 
 /*!
@@ -151,14 +168,16 @@ void update_monster_race_flags(PlayerType *player_ptr, turn_flags *turn_flags_pt
  */
 void update_player_window(PlayerType *player_ptr, old_race_flags *old_race_flags_ptr)
 {
-    monster_race *r_ptr;
-    r_ptr = &r_info[player_ptr->monster_race_idx];
+    MonsterRaceInfo *r_ptr;
+    r_ptr = &monraces_info[player_ptr->monster_race_idx];
     if ((old_race_flags_ptr->old_r_flags1 != r_ptr->r_flags1) || (old_race_flags_ptr->old_r_flags2 != r_ptr->r_flags2) ||
         (old_race_flags_ptr->old_r_flags3 != r_ptr->r_flags3) || (old_race_flags_ptr->old_r_ability_flags != r_ptr->r_ability_flags) ||
-        (old_race_flags_ptr->old_r_flagsr != r_ptr->r_flagsr) || (old_race_flags_ptr->old_r_blows0 != r_ptr->r_blows[0]) ||
+        (old_race_flags_ptr->old_r_resistance_flags != r_ptr->r_resistance_flags) || (old_race_flags_ptr->old_r_blows0 != r_ptr->r_blows[0]) ||
         (old_race_flags_ptr->old_r_blows1 != r_ptr->r_blows[1]) || (old_race_flags_ptr->old_r_blows2 != r_ptr->r_blows[2]) ||
-        (old_race_flags_ptr->old_r_blows3 != r_ptr->r_blows[3]) || (old_race_flags_ptr->old_r_cast_spell != r_ptr->r_cast_spell)) {
-        player_ptr->window_flags |= PW_MONSTER;
+        (old_race_flags_ptr->old_r_blows3 != r_ptr->r_blows[3]) || (old_race_flags_ptr->old_r_cast_spell != r_ptr->r_cast_spell) ||
+        (old_race_flags_ptr->old_r_behavior_flags != r_ptr->r_behavior_flags) || (old_race_flags_ptr->old_r_kind_flags != r_ptr->r_kind_flags) ||
+        (old_race_flags_ptr->old_r_drop_flags != r_ptr->r_drop_flags) || (old_race_flags_ptr->old_r_feature_flags != r_ptr->r_feature_flags)) {
+        player_ptr->window_flags |= PW_MONSTER_LORE;
     }
 }
 
@@ -170,36 +189,41 @@ static um_type *initialize_um_type(PlayerType *player_ptr, um_type *um_ptr, MONS
     um_ptr->fx = um_ptr->m_ptr->fx;
     um_ptr->flag = false;
     um_ptr->easy = false;
-    um_ptr->in_darkness = d_info[player_ptr->dungeon_idx].flags.has(DungeonFeatureType::DARKNESS) && !player_ptr->see_nocto;
+    um_ptr->in_darkness = dungeons_info[player_ptr->dungeon_idx].flags.has(DungeonFeatureType::DARKNESS) && !player_ptr->see_nocto;
     um_ptr->full = full;
     return um_ptr;
 }
 
 static POSITION decide_updated_distance(PlayerType *player_ptr, um_type *um_ptr)
 {
-    if (!um_ptr->full)
+    if (!um_ptr->full) {
         return um_ptr->m_ptr->cdis;
+    }
 
     int dy = (player_ptr->y > um_ptr->fy) ? (player_ptr->y - um_ptr->fy) : (um_ptr->fy - player_ptr->y);
     int dx = (player_ptr->x > um_ptr->fx) ? (player_ptr->x - um_ptr->fx) : (um_ptr->fx - player_ptr->x);
     POSITION distance = (dy > dx) ? (dy + (dx >> 1)) : (dx + (dy >> 1));
-    if (distance > 255)
+    if (distance > 255) {
         distance = 255;
+    }
 
-    if (!distance)
+    if (!distance) {
         distance = 1;
+    }
 
     um_ptr->m_ptr->cdis = distance;
     return distance;
 }
 
-static void update_smart_stupid_flags(monster_race *r_ptr)
+static void update_smart_stupid_flags(MonsterRaceInfo *r_ptr)
 {
-    if (r_ptr->r_behavior_flags.has(MonsterBehaviorType::SMART))
+    if (r_ptr->r_behavior_flags.has(MonsterBehaviorType::SMART)) {
         r_ptr->r_behavior_flags.set(MonsterBehaviorType::SMART);
+    }
 
-    if (r_ptr->r_behavior_flags.has(MonsterBehaviorType::STUPID))
+    if (r_ptr->r_behavior_flags.has(MonsterBehaviorType::STUPID)) {
         r_ptr->r_behavior_flags.set(MonsterBehaviorType::STUPID);
+    }
 }
 
 /*!
@@ -211,16 +235,19 @@ static void update_smart_stupid_flags(monster_race *r_ptr)
  */
 static bool update_weird_telepathy(PlayerType *player_ptr, um_type *um_ptr, MONSTER_IDX m_idx)
 {
-    auto *r_ptr = &r_info[um_ptr->m_ptr->r_idx];
-    if ((r_ptr->flags2 & RF2_WEIRD_MIND) == 0)
+    auto *m_ptr = um_ptr->m_ptr;
+    auto *r_ptr = &monraces_info[m_ptr->r_idx];
+    if ((r_ptr->flags2 & RF2_WEIRD_MIND) == 0) {
         return false;
+    }
 
-    if ((m_idx % 10) != (w_ptr->game_turn % 10))
+    if ((m_idx % 10) != (w_ptr->game_turn % 10)) {
         return true;
+    }
 
     um_ptr->flag = true;
-    um_ptr->m_ptr->mflag.set(MonsterTemporaryFlagType::ESP);
-    if (is_original_ap(um_ptr->m_ptr) && !player_ptr->hallucinated) {
+    m_ptr->mflag.set(MonsterTemporaryFlagType::ESP);
+    if (m_ptr->is_original_ap() && !player_ptr->effects()->hallucination()->is_hallucinated()) {
         r_ptr->r_flags2 |= RF2_WEIRD_MIND;
         update_smart_stupid_flags(r_ptr);
     }
@@ -230,131 +257,154 @@ static bool update_weird_telepathy(PlayerType *player_ptr, um_type *um_ptr, MONS
 
 static void update_telepathy_sight(PlayerType *player_ptr, um_type *um_ptr, MONSTER_IDX m_idx)
 {
-    auto *r_ptr = &r_info[um_ptr->m_ptr->r_idx];
+    auto *m_ptr = um_ptr->m_ptr;
+    auto *r_ptr = &monraces_info[m_ptr->r_idx];
     if (PlayerClass(player_ptr).samurai_stance_is(SamuraiStanceType::MUSOU)) {
         um_ptr->flag = true;
         um_ptr->m_ptr->mflag.set(MonsterTemporaryFlagType::ESP);
-        if (is_original_ap(um_ptr->m_ptr) && !player_ptr->hallucinated)
+        if (um_ptr->m_ptr->is_original_ap() && !player_ptr->effects()->hallucination()->is_hallucinated()) {
             update_smart_stupid_flags(r_ptr);
+        }
 
         return;
     }
 
-    if (!player_ptr->telepathy)
+    if (!player_ptr->telepathy) {
         return;
+    }
 
+    auto is_hallucinated = player_ptr->effects()->hallucination()->is_hallucinated();
     if (r_ptr->flags2 & RF2_EMPTY_MIND) {
-        if (is_original_ap(um_ptr->m_ptr) && !player_ptr->hallucinated)
+        if (m_ptr->is_original_ap() && !is_hallucinated) {
             r_ptr->r_flags2 |= RF2_EMPTY_MIND;
+        }
 
         return;
     }
 
-    if (update_weird_telepathy(player_ptr, um_ptr, m_idx))
+    if (update_weird_telepathy(player_ptr, um_ptr, m_idx)) {
         return;
+    }
 
     um_ptr->flag = true;
-    um_ptr->m_ptr->mflag.set(MonsterTemporaryFlagType::ESP);
-    if (is_original_ap(um_ptr->m_ptr) && !player_ptr->hallucinated)
+    m_ptr->mflag.set(MonsterTemporaryFlagType::ESP);
+    if (m_ptr->is_original_ap() && !is_hallucinated) {
         update_smart_stupid_flags(r_ptr);
+    }
 }
 
 static void update_specific_race_telepathy(PlayerType *player_ptr, um_type *um_ptr)
 {
-    auto *r_ptr = &r_info[um_ptr->m_ptr->r_idx];
+    auto *m_ptr = um_ptr->m_ptr;
+    auto *r_ptr = &monraces_info[m_ptr->r_idx];
+    auto is_hallucinated = player_ptr->effects()->hallucination()->is_hallucinated();
     if ((player_ptr->esp_animal) && r_ptr->kind_flags.has(MonsterKindType::ANIMAL)) {
         um_ptr->flag = true;
-        um_ptr->m_ptr->mflag.set(MonsterTemporaryFlagType::ESP);
-        if (is_original_ap(um_ptr->m_ptr) && !player_ptr->hallucinated)
+        m_ptr->mflag.set(MonsterTemporaryFlagType::ESP);
+        if (m_ptr->is_original_ap() && !is_hallucinated) {
             r_ptr->r_kind_flags.set(MonsterKindType::ANIMAL);
+        }
     }
 
     if ((player_ptr->esp_undead) && r_ptr->kind_flags.has(MonsterKindType::UNDEAD)) {
         um_ptr->flag = true;
-        um_ptr->m_ptr->mflag.set(MonsterTemporaryFlagType::ESP);
-        if (is_original_ap(um_ptr->m_ptr) && !player_ptr->hallucinated)
+        m_ptr->mflag.set(MonsterTemporaryFlagType::ESP);
+        if (m_ptr->is_original_ap() && !is_hallucinated) {
             r_ptr->r_kind_flags.set(MonsterKindType::UNDEAD);
+        }
     }
 
     if ((player_ptr->esp_demon) && r_ptr->kind_flags.has(MonsterKindType::DEMON)) {
         um_ptr->flag = true;
-        um_ptr->m_ptr->mflag.set(MonsterTemporaryFlagType::ESP);
-        if (is_original_ap(um_ptr->m_ptr) && !player_ptr->hallucinated)
+        m_ptr->mflag.set(MonsterTemporaryFlagType::ESP);
+        if (m_ptr->is_original_ap() && !is_hallucinated) {
             r_ptr->r_kind_flags.set(MonsterKindType::DEMON);
+        }
     }
 
     if ((player_ptr->esp_orc) && r_ptr->kind_flags.has(MonsterKindType::ORC)) {
         um_ptr->flag = true;
-        um_ptr->m_ptr->mflag.set(MonsterTemporaryFlagType::ESP);
-        if (is_original_ap(um_ptr->m_ptr) && !player_ptr->hallucinated)
+        m_ptr->mflag.set(MonsterTemporaryFlagType::ESP);
+        if (m_ptr->is_original_ap() && !is_hallucinated) {
             r_ptr->r_kind_flags.set(MonsterKindType::ORC);
+        }
     }
 
     if ((player_ptr->esp_troll) && r_ptr->kind_flags.has(MonsterKindType::TROLL)) {
         um_ptr->flag = true;
-        um_ptr->m_ptr->mflag.set(MonsterTemporaryFlagType::ESP);
-        if (is_original_ap(um_ptr->m_ptr) && !player_ptr->hallucinated)
+        m_ptr->mflag.set(MonsterTemporaryFlagType::ESP);
+        if (m_ptr->is_original_ap() && !is_hallucinated) {
             r_ptr->r_kind_flags.set(MonsterKindType::TROLL);
+        }
     }
 
     if ((player_ptr->esp_giant) && r_ptr->kind_flags.has(MonsterKindType::GIANT)) {
         um_ptr->flag = true;
-        um_ptr->m_ptr->mflag.set(MonsterTemporaryFlagType::ESP);
-        if (is_original_ap(um_ptr->m_ptr) && !player_ptr->hallucinated)
+        m_ptr->mflag.set(MonsterTemporaryFlagType::ESP);
+        if (m_ptr->is_original_ap() && !is_hallucinated) {
             r_ptr->r_kind_flags.set(MonsterKindType::GIANT);
+        }
     }
 
     if ((player_ptr->esp_dragon) && r_ptr->kind_flags.has(MonsterKindType::DRAGON)) {
         um_ptr->flag = true;
-        um_ptr->m_ptr->mflag.set(MonsterTemporaryFlagType::ESP);
-        if (is_original_ap(um_ptr->m_ptr) && !player_ptr->hallucinated)
+        m_ptr->mflag.set(MonsterTemporaryFlagType::ESP);
+        if (m_ptr->is_original_ap() && !is_hallucinated) {
             r_ptr->r_kind_flags.set(MonsterKindType::DRAGON);
+        }
     }
 
     if ((player_ptr->esp_human) && r_ptr->kind_flags.has(MonsterKindType::HUMAN)) {
         um_ptr->flag = true;
-        um_ptr->m_ptr->mflag.set(MonsterTemporaryFlagType::ESP);
-        if (is_original_ap(um_ptr->m_ptr) && !player_ptr->hallucinated)
+        m_ptr->mflag.set(MonsterTemporaryFlagType::ESP);
+        if (m_ptr->is_original_ap() && !is_hallucinated) {
             r_ptr->r_kind_flags.set(MonsterKindType::HUMAN);
+        }
     }
 
     if ((player_ptr->esp_evil) && r_ptr->kind_flags.has(MonsterKindType::EVIL)) {
         um_ptr->flag = true;
-        um_ptr->m_ptr->mflag.set(MonsterTemporaryFlagType::ESP);
-        if (is_original_ap(um_ptr->m_ptr) && !player_ptr->hallucinated)
+        m_ptr->mflag.set(MonsterTemporaryFlagType::ESP);
+        if (m_ptr->is_original_ap() && !is_hallucinated) {
             r_ptr->r_kind_flags.set(MonsterKindType::EVIL);
+        }
     }
 
     if ((player_ptr->esp_good) && r_ptr->kind_flags.has(MonsterKindType::GOOD)) {
         um_ptr->flag = true;
-        um_ptr->m_ptr->mflag.set(MonsterTemporaryFlagType::ESP);
-        if (is_original_ap(um_ptr->m_ptr) && !player_ptr->hallucinated)
+        m_ptr->mflag.set(MonsterTemporaryFlagType::ESP);
+        if (m_ptr->is_original_ap() && !is_hallucinated) {
             r_ptr->r_kind_flags.set(MonsterKindType::GOOD);
+        }
     }
 
-    if ((player_ptr->esp_nonliving) && (r_ptr->kind_flags.has(MonsterKindType::NONLIVING) && r_ptr->kind_flags.has_none_of({ MonsterKindType::DEMON, MonsterKindType::UNDEAD }))) {
+    if ((player_ptr->esp_nonliving) && r_ptr->kind_flags.has(MonsterKindType::NONLIVING) && r_ptr->kind_flags.has_none_of({ MonsterKindType::DEMON, MonsterKindType::UNDEAD })) {
         um_ptr->flag = true;
-        um_ptr->m_ptr->mflag.set(MonsterTemporaryFlagType::ESP);
-        if (is_original_ap(um_ptr->m_ptr) && !player_ptr->hallucinated)
+        m_ptr->mflag.set(MonsterTemporaryFlagType::ESP);
+        if (m_ptr->is_original_ap() && !is_hallucinated) {
             r_ptr->r_kind_flags.set(MonsterKindType::NONLIVING);
+        }
     }
 
     if ((player_ptr->esp_unique) && r_ptr->kind_flags.has(MonsterKindType::UNIQUE)) {
         um_ptr->flag = true;
-        um_ptr->m_ptr->mflag.set(MonsterTemporaryFlagType::ESP);
-        if (is_original_ap(um_ptr->m_ptr) && !player_ptr->hallucinated)
+        m_ptr->mflag.set(MonsterTemporaryFlagType::ESP);
+        if (m_ptr->is_original_ap() && !is_hallucinated) {
             r_ptr->r_kind_flags.set(MonsterKindType::UNIQUE);
+        }
     }
 }
 
 static bool check_cold_blood(PlayerType *player_ptr, um_type *um_ptr, const POSITION distance)
 {
-    if (distance > player_ptr->see_infra)
+    if (distance > player_ptr->see_infra) {
         return false;
+    }
 
-    auto *r_ptr = &r_info[um_ptr->m_ptr->r_idx];
-    if (any_bits(r_ptr->flags2, RF2_COLD_BLOOD) && r_ptr->aura_flags.has_not(MonsterAuraType::FIRE))
+    auto *r_ptr = &monraces_info[um_ptr->m_ptr->r_idx];
+    if (any_bits(r_ptr->flags2, RF2_COLD_BLOOD) && r_ptr->aura_flags.has_not(MonsterAuraType::FIRE)) {
         return false;
+    }
 
     um_ptr->easy = true;
     um_ptr->flag = true;
@@ -363,10 +413,11 @@ static bool check_cold_blood(PlayerType *player_ptr, um_type *um_ptr, const POSI
 
 static bool check_invisible(PlayerType *player_ptr, um_type *um_ptr)
 {
-    if (!player_can_see_bold(player_ptr, um_ptr->fy, um_ptr->fx))
+    if (!player_can_see_bold(player_ptr, um_ptr->fy, um_ptr->fx)) {
         return false;
+    }
 
-    auto *r_ptr = &r_info[um_ptr->m_ptr->r_idx];
+    auto *r_ptr = &monraces_info[um_ptr->m_ptr->r_idx];
     if (r_ptr->flags2 & RF2_INVISIBLE) {
         if (player_ptr->see_inv) {
             um_ptr->easy = true;
@@ -388,20 +439,23 @@ static bool check_invisible(PlayerType *player_ptr, um_type *um_ptr)
 static void decide_sight_invisible_monster(PlayerType *player_ptr, um_type *um_ptr, MONSTER_IDX m_idx)
 {
     POSITION distance = decide_updated_distance(player_ptr, um_ptr);
-    auto *r_ptr = &r_info[um_ptr->m_ptr->r_idx];
+    auto *m_ptr = um_ptr->m_ptr;
+    auto *r_ptr = &monraces_info[m_ptr->r_idx];
 
-    um_ptr->m_ptr->mflag.reset(MonsterTemporaryFlagType::ESP);
+    m_ptr->mflag.reset(MonsterTemporaryFlagType::ESP);
 
-    if (distance > (um_ptr->in_darkness ? MAX_SIGHT / 2 : MAX_SIGHT))
+    if (distance > (um_ptr->in_darkness ? MAX_PLAYER_SIGHT / 2 : MAX_PLAYER_SIGHT)) {
         return;
+    }
 
-    if (!um_ptr->in_darkness || (distance <= MAX_SIGHT / 4)) {
+    if (!um_ptr->in_darkness || (distance <= MAX_PLAYER_SIGHT / 4)) {
         update_telepathy_sight(player_ptr, um_ptr, m_idx);
         update_specific_race_telepathy(player_ptr, um_ptr);
     }
 
-    if (!player_has_los_bold(player_ptr, um_ptr->fy, um_ptr->fx) || player_ptr->blind)
+    if (!player_has_los_bold(player_ptr, um_ptr->fy, um_ptr->fx) || player_ptr->effects()->blindness()->is_blind()) {
         return;
+    }
 
     auto sniper_data = PlayerClass(player_ptr).get_specific_data<sniper_data_type>();
     if (sniper_data && (sniper_data->concent >= CONCENT_RADAR_THRESHOLD)) {
@@ -411,14 +465,17 @@ static void decide_sight_invisible_monster(PlayerType *player_ptr, um_type *um_p
 
     bool do_cold_blood = check_cold_blood(player_ptr, um_ptr, distance);
     bool do_invisible = check_invisible(player_ptr, um_ptr);
-    if (!um_ptr->flag || !is_original_ap(um_ptr->m_ptr) || player_ptr->hallucinated)
+    if (!um_ptr->flag || !m_ptr->is_original_ap() || player_ptr->effects()->hallucination()->is_hallucinated()) {
         return;
+    }
 
-    if (do_invisible)
+    if (do_invisible) {
         r_ptr->r_flags2 |= RF2_INVISIBLE;
+    }
 
-    if (do_cold_blood)
+    if (do_cold_blood) {
         r_ptr->r_flags2 |= RF2_COLD_BLOOD;
+    }
 }
 
 /*!
@@ -431,62 +488,79 @@ static void decide_sight_invisible_monster(PlayerType *player_ptr, um_type *um_p
  */
 static void update_invisible_monster(PlayerType *player_ptr, um_type *um_ptr, MONSTER_IDX m_idx)
 {
-    if (um_ptr->m_ptr->ml)
+    auto *m_ptr = um_ptr->m_ptr;
+    if (m_ptr->ml) {
         return;
+    }
 
-    um_ptr->m_ptr->ml = true;
+    m_ptr->ml = true;
     lite_spot(player_ptr, um_ptr->fy, um_ptr->fx);
 
-    if (player_ptr->health_who == m_idx)
-        player_ptr->redraw |= PR_HEALTH;
+    auto &rfu = RedrawingFlagsUpdater::get_instance();
+    if (player_ptr->health_who == m_idx) {
+        rfu.set_flag(MainWindowRedrawingFlag::HEALTH);
+    }
 
-    if (player_ptr->riding == m_idx)
-        player_ptr->redraw |= PR_UHEALTH;
+    if (player_ptr->riding == m_idx) {
+        rfu.set_flag(MainWindowRedrawingFlag::UHEALTH);
+    }
 
-    if (!player_ptr->hallucinated) {
-        auto *r_ptr = &r_info[um_ptr->m_ptr->r_idx];
-        if ((um_ptr->m_ptr->ap_r_idx == MON_KAGE) && (r_info[MON_KAGE].r_sights < MAX_SHORT))
-            r_info[MON_KAGE].r_sights++;
-        else if (is_original_ap(um_ptr->m_ptr) && (r_ptr->r_sights < MAX_SHORT))
+    if (!player_ptr->effects()->hallucination()->is_hallucinated()) {
+        auto *r_ptr = &monraces_info[m_ptr->r_idx];
+        if ((m_ptr->ap_r_idx == MonsterRaceId::KAGE) && (monraces_info[MonsterRaceId::KAGE].r_sights < MAX_SHORT)) {
+            monraces_info[MonsterRaceId::KAGE].r_sights++;
+        } else if (m_ptr->is_original_ap() && (r_ptr->r_sights < MAX_SHORT)) {
             r_ptr->r_sights++;
+        }
     }
 
-    if (w_ptr->is_loading_now && w_ptr->character_dungeon && !player_ptr->phase_out && r_info[um_ptr->m_ptr->ap_r_idx].flags2 & RF2_ELDRITCH_HORROR)
-        um_ptr->m_ptr->mflag.set(MonsterTemporaryFlagType::SANITY_BLAST);
+    if (w_ptr->is_loading_now && w_ptr->character_dungeon && !player_ptr->phase_out && monraces_info[m_ptr->ap_r_idx].flags2 & RF2_ELDRITCH_HORROR) {
+        m_ptr->mflag.set(MonsterTemporaryFlagType::SANITY_BLAST);
+    }
 
-    if (disturb_near && (projectable(player_ptr, um_ptr->m_ptr->fy, um_ptr->m_ptr->fx, player_ptr->y, player_ptr->x) && projectable(player_ptr, player_ptr->y, player_ptr->x, um_ptr->m_ptr->fy, um_ptr->m_ptr->fx))) {
-        if (disturb_pets || is_hostile(um_ptr->m_ptr))
+    const auto projectable_from_monster = projectable(player_ptr, m_ptr->fy, m_ptr->fx, player_ptr->y, player_ptr->x);
+    const auto projectable_from_player = projectable(player_ptr, player_ptr->y, player_ptr->x, m_ptr->fy, m_ptr->fx);
+    if (disturb_near && projectable_from_monster && projectable_from_player) {
+        if (disturb_pets || m_ptr->is_hostile()) {
             disturb(player_ptr, true, true);
+        }
     }
 }
 
 static void update_visible_monster(PlayerType *player_ptr, um_type *um_ptr, MONSTER_IDX m_idx)
 {
-    if (!um_ptr->m_ptr->ml)
+    if (!um_ptr->m_ptr->ml) {
         return;
+    }
 
     um_ptr->m_ptr->ml = false;
     lite_spot(player_ptr, um_ptr->fy, um_ptr->fx);
 
-    if (player_ptr->health_who == m_idx)
-        player_ptr->redraw |= PR_HEALTH;
+    auto &rfu = RedrawingFlagsUpdater::get_instance();
+    if (player_ptr->health_who == m_idx) {
+        rfu.set_flag(MainWindowRedrawingFlag::HEALTH);
+    }
 
-    if (player_ptr->riding == m_idx)
-        player_ptr->redraw |= PR_UHEALTH;
+    if (player_ptr->riding == m_idx) {
+        rfu.set_flag(MainWindowRedrawingFlag::UHEALTH);
+    }
 
-    if (um_ptr->do_disturb && (disturb_pets || is_hostile(um_ptr->m_ptr)))
+    if (um_ptr->do_disturb && (disturb_pets || um_ptr->m_ptr->is_hostile())) {
         disturb(player_ptr, true, true);
+    }
 }
 
 static bool update_clear_monster(PlayerType *player_ptr, um_type *um_ptr)
 {
-    if (!um_ptr->easy)
+    if (!um_ptr->easy) {
         return false;
+    }
 
     if (um_ptr->m_ptr->mflag.has_not(MonsterTemporaryFlagType::VIEW)) {
         um_ptr->m_ptr->mflag.set(MonsterTemporaryFlagType::VIEW);
-        if (um_ptr->do_disturb && (disturb_pets || is_hostile(um_ptr->m_ptr)))
+        if (um_ptr->do_disturb && (disturb_pets || um_ptr->m_ptr->is_hostile())) {
             disturb(player_ptr, true, true);
+        }
     }
 
     return true;
@@ -502,26 +576,31 @@ void update_monster(PlayerType *player_ptr, MONSTER_IDX m_idx, bool full)
     um_type tmp_um;
     um_type *um_ptr = initialize_um_type(player_ptr, &tmp_um, m_idx, full);
     if (disturb_high) {
-        monster_race *ap_r_ptr = &r_info[um_ptr->m_ptr->ap_r_idx];
-        if (ap_r_ptr->r_tkills && ap_r_ptr->level >= player_ptr->lev)
+        MonsterRaceInfo *ap_r_ptr = &monraces_info[um_ptr->m_ptr->ap_r_idx];
+        if (ap_r_ptr->r_tkills && ap_r_ptr->level >= player_ptr->lev) {
             um_ptr->do_disturb = true;
+        }
     }
 
-    if (um_ptr->m_ptr->mflag2.has(MonsterConstantFlagType::MARK))
+    if (um_ptr->m_ptr->mflag2.has(MonsterConstantFlagType::MARK)) {
         um_ptr->flag = true;
+    }
 
     decide_sight_invisible_monster(player_ptr, um_ptr, m_idx);
-    if (um_ptr->flag)
+    if (um_ptr->flag) {
         update_invisible_monster(player_ptr, um_ptr, m_idx);
-    else
+    } else {
         update_visible_monster(player_ptr, um_ptr, m_idx);
+    }
 
-    if (update_clear_monster(player_ptr, um_ptr) || um_ptr->m_ptr->mflag.has_not(MonsterTemporaryFlagType::VIEW))
+    if (update_clear_monster(player_ptr, um_ptr) || um_ptr->m_ptr->mflag.has_not(MonsterTemporaryFlagType::VIEW)) {
         return;
+    }
 
     um_ptr->m_ptr->mflag.reset(MonsterTemporaryFlagType::VIEW);
-    if (um_ptr->do_disturb && (disturb_pets || is_hostile(um_ptr->m_ptr)))
+    if (um_ptr->do_disturb && (disturb_pets || um_ptr->m_ptr->is_hostile())) {
         disturb(player_ptr, true, true);
+    }
 }
 
 /*!
@@ -535,8 +614,9 @@ void update_monsters(PlayerType *player_ptr, bool full)
     auto *floor_ptr = player_ptr->current_floor_ptr;
     for (MONSTER_IDX i = 1; i < floor_ptr->m_max; i++) {
         auto *m_ptr = &floor_ptr->m_list[i];
-        if (!monster_is_valid(m_ptr))
+        if (!m_ptr->is_valid()) {
             continue;
+        }
 
         update_monster(player_ptr, i, full);
     }
@@ -550,131 +630,160 @@ void update_monsters(PlayerType *player_ptr, bool full)
 void update_smart_learn(PlayerType *player_ptr, MONSTER_IDX m_idx, int what)
 {
     auto *m_ptr = &player_ptr->current_floor_ptr->m_list[m_idx];
-    auto *r_ptr = &r_info[m_ptr->r_idx];
-    if (!smart_learn || (r_ptr->behavior_flags.has(MonsterBehaviorType::STUPID)) || ((r_ptr->behavior_flags.has_not(MonsterBehaviorType::SMART)) && (randint0(100) < 50)))
+    auto *r_ptr = &monraces_info[m_ptr->r_idx];
+    if (!smart_learn || (r_ptr->behavior_flags.has(MonsterBehaviorType::STUPID)) || ((r_ptr->behavior_flags.has_not(MonsterBehaviorType::SMART)) && (randint0(100) < 50))) {
         return;
+    }
 
     switch (what) {
     case DRS_ACID:
-        if (has_resist_acid(player_ptr))
+        if (has_resist_acid(player_ptr)) {
             m_ptr->smart.set(MonsterSmartLearnType::RES_ACID);
+        }
 
-        if (is_oppose_acid(player_ptr))
+        if (is_oppose_acid(player_ptr)) {
             m_ptr->smart.set(MonsterSmartLearnType::OPP_ACID);
+        }
 
-        if (has_immune_acid(player_ptr))
+        if (has_immune_acid(player_ptr)) {
             m_ptr->smart.set(MonsterSmartLearnType::IMM_ACID);
+        }
 
         break;
     case DRS_ELEC:
-        if (has_resist_elec(player_ptr))
+        if (has_resist_elec(player_ptr)) {
             m_ptr->smart.set(MonsterSmartLearnType::RES_ELEC);
+        }
 
-        if (is_oppose_elec(player_ptr))
+        if (is_oppose_elec(player_ptr)) {
             m_ptr->smart.set(MonsterSmartLearnType::OPP_ELEC);
+        }
 
-        if (has_immune_elec(player_ptr))
+        if (has_immune_elec(player_ptr)) {
             m_ptr->smart.set(MonsterSmartLearnType::IMM_ELEC);
+        }
 
         break;
     case DRS_FIRE:
-        if (has_resist_fire(player_ptr))
+        if (has_resist_fire(player_ptr)) {
             m_ptr->smart.set(MonsterSmartLearnType::RES_FIRE);
+        }
 
-        if (is_oppose_fire(player_ptr))
+        if (is_oppose_fire(player_ptr)) {
             m_ptr->smart.set(MonsterSmartLearnType::OPP_FIRE);
+        }
 
-        if (has_immune_fire(player_ptr))
+        if (has_immune_fire(player_ptr)) {
             m_ptr->smart.set(MonsterSmartLearnType::IMM_FIRE);
+        }
 
         break;
     case DRS_COLD:
-        if (has_resist_cold(player_ptr))
+        if (has_resist_cold(player_ptr)) {
             m_ptr->smart.set(MonsterSmartLearnType::RES_COLD);
+        }
 
-        if (is_oppose_cold(player_ptr))
+        if (is_oppose_cold(player_ptr)) {
             m_ptr->smart.set(MonsterSmartLearnType::OPP_COLD);
+        }
 
-        if (has_immune_cold(player_ptr))
+        if (has_immune_cold(player_ptr)) {
             m_ptr->smart.set(MonsterSmartLearnType::IMM_COLD);
+        }
 
         break;
     case DRS_POIS:
-        if (has_resist_pois(player_ptr))
+        if (has_resist_pois(player_ptr)) {
             m_ptr->smart.set(MonsterSmartLearnType::RES_POIS);
+        }
 
-        if (is_oppose_pois(player_ptr))
+        if (is_oppose_pois(player_ptr)) {
             m_ptr->smart.set(MonsterSmartLearnType::OPP_POIS);
+        }
 
         break;
     case DRS_NETH:
-        if (has_resist_neth(player_ptr))
+        if (has_resist_neth(player_ptr)) {
             m_ptr->smart.set(MonsterSmartLearnType::RES_NETH);
+        }
 
         break;
     case DRS_LITE:
-        if (has_resist_lite(player_ptr))
+        if (has_resist_lite(player_ptr)) {
             m_ptr->smart.set(MonsterSmartLearnType::RES_LITE);
+        }
 
         break;
     case DRS_DARK:
-        if (has_resist_dark(player_ptr))
+        if (has_resist_dark(player_ptr) || has_immune_dark(player_ptr)) {
             m_ptr->smart.set(MonsterSmartLearnType::RES_DARK);
+        }
 
         break;
     case DRS_FEAR:
-        if (has_resist_fear(player_ptr))
+        if (has_resist_fear(player_ptr)) {
             m_ptr->smart.set(MonsterSmartLearnType::RES_FEAR);
+        }
 
         break;
     case DRS_CONF:
-        if (has_resist_conf(player_ptr))
+        if (has_resist_conf(player_ptr)) {
             m_ptr->smart.set(MonsterSmartLearnType::RES_CONF);
+        }
 
         break;
     case DRS_CHAOS:
-        if (has_resist_chaos(player_ptr))
+        if (has_resist_chaos(player_ptr)) {
             m_ptr->smart.set(MonsterSmartLearnType::RES_CHAOS);
+        }
 
         break;
     case DRS_DISEN:
-        if (has_resist_disen(player_ptr))
+        if (has_resist_disen(player_ptr)) {
             m_ptr->smart.set(MonsterSmartLearnType::RES_DISEN);
+        }
 
         break;
     case DRS_BLIND:
-        if (has_resist_blind(player_ptr))
+        if (has_resist_blind(player_ptr)) {
             m_ptr->smart.set(MonsterSmartLearnType::RES_BLIND);
+        }
 
         break;
     case DRS_NEXUS:
-        if (has_resist_nexus(player_ptr))
+        if (has_resist_nexus(player_ptr)) {
             m_ptr->smart.set(MonsterSmartLearnType::RES_NEXUS);
+        }
 
         break;
     case DRS_SOUND:
-        if (has_resist_sound(player_ptr))
+        if (has_resist_sound(player_ptr)) {
             m_ptr->smart.set(MonsterSmartLearnType::RES_SOUND);
+        }
 
         break;
     case DRS_SHARD:
-        if (has_resist_shard(player_ptr))
+        if (has_resist_shard(player_ptr)) {
             m_ptr->smart.set(MonsterSmartLearnType::RES_SHARD);
+        }
 
         break;
     case DRS_FREE:
-        if (player_ptr->free_act)
+        if (player_ptr->free_act) {
             m_ptr->smart.set(MonsterSmartLearnType::IMM_FREE);
+        }
 
         break;
     case DRS_MANA:
-        if (!player_ptr->msp)
+        if (!player_ptr->msp) {
             m_ptr->smart.set(MonsterSmartLearnType::IMM_MANA);
+        }
 
         break;
     case DRS_REFLECT:
-        if (has_reflect(player_ptr))
+        if (has_reflect(player_ptr)) {
             m_ptr->smart.set(MonsterSmartLearnType::IMM_REFLECT);
+        }
 
         break;
     default: