OSDN Git Service

[Refactor] #3650 Grid::get_feat_mimic() から地形特性を得ていた箇所をget_terrain_mimic() に置換した
[hengbandforosx/hengbandosx.git] / src / effect / effect-feature.cpp
index 10a9807..d5c6cb3 100644 (file)
@@ -1,7 +1,5 @@
-#include "effect/effect-feature.h"
-#include "core/player-update-types.h"
+#include "effect/effect-feature.h"
 #include "dungeon/dungeon-flag-types.h"
-#include "dungeon/dungeon.h"
 #include "effect/effect-characteristics.h"
 #include "effect/effect-processor.h" // 暫定、後で消す.
 #include "floor/cave.h"
 #include "monster/monster-update.h"
 #include "player/special-defense-types.h"
 #include "room/door-definition.h"
+#include "spell-class/spells-mirror-master.h"
+#include "system/angband-system.h"
+#include "system/dungeon-info.h"
 #include "system/floor-type-definition.h"
 #include "system/grid-type-definition.h"
 #include "system/player-type-definition.h"
+#include "system/redrawing-flags-updater.h"
+#include "system/terrain-type-definition.h"
+#include "timed-effect/player-blindness.h"
+#include "timed-effect/timed-effects.h"
 #include "util/bit-flags-calculator.h"
 #include "view/display-messages.h"
 #include "world/world.h"
  * Line 2 -- forbid monsters
  * Line 3 -- forbid the player
  */
-static bool cave_naked_bold(PlayerType *player_ptr, POSITION y, POSITION x)
+static bool cave_naked_bold(PlayerType *player_ptr, const Pos2D &pos)
 {
-    floor_type *floor_ptr = player_ptr->current_floor_ptr;
-    return cave_clean_bold(floor_ptr, y, x) && (floor_ptr->grid_array[y][x].m_idx == 0) && !player_bold(player_ptr, y, x);
+    auto *floor_ptr = player_ptr->current_floor_ptr;
+    return cave_clean_bold(floor_ptr, pos.y, pos.x) && (floor_ptr->get_grid(pos).m_idx == 0) && !player_ptr->is_located_at(pos);
 }
 
 /*!
@@ -62,19 +67,20 @@ static bool cave_naked_bold(PlayerType *player_ptr, POSITION y, POSITION x)
  * Perhaps we should affect doors?
  * </pre>
  */
-bool affect_feature(PlayerType *player_ptr, MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_POINT dam, AttributeType typ)
+bool affect_feature(PlayerType *player_ptr, MONSTER_IDX who, POSITION r, POSITION y, POSITION x, int dam, AttributeType typ)
 {
-    floor_type *floor_ptr = player_ptr->current_floor_ptr;
-    grid_type *g_ptr = &floor_ptr->grid_array[y][x];
-    feature_type *f_ptr = &f_info[g_ptr->feat];
+    const Pos2D pos(y, x);
+    auto &floor = *player_ptr->current_floor_ptr;
+    auto &grid = floor.get_grid(pos);
+    const auto &terrain = grid.get_terrain();
 
-    bool obvious = false;
-    bool known = player_has_los_bold(player_ptr, y, x);
+    auto obvious = false;
+    auto known = grid.has_los();
 
     who = who ? who : 0;
     dam = (dam + r) / (r + 1);
 
-    if (f_ptr->flags.has(FloorFeatureType::TREE)) {
+    if (terrain.flags.has(TerrainCharacteristics::TREE)) {
         concptr message;
         switch (typ) {
         case AttributeType::POIS:
@@ -123,8 +129,9 @@ bool affect_feature(PlayerType *player_ptr, MONSTER_IDX who, POSITION r, POSITIO
             cave_set_feat(player_ptr, y, x, one_in_(3) ? feat_brake : feat_grass);
 
             /* Observe */
-            if (g_ptr->is_mark())
+            if (grid.is_mark()) {
                 obvious = true;
+            }
         }
     }
 
@@ -164,137 +171,153 @@ bool affect_feature(PlayerType *player_ptr, MONSTER_IDX who, POSITION r, POSITIO
         break;
     }
     case AttributeType::KILL_TRAP: {
-        if (is_hidden_door(player_ptr, g_ptr)) {
+        if (is_hidden_door(player_ptr, grid)) {
             disclose_grid(player_ptr, y, x);
             if (known) {
                 obvious = true;
             }
         }
 
-        if (is_trap(player_ptr, g_ptr->feat)) {
+        if (is_trap(player_ptr, grid.feat)) {
             if (known) {
                 msg_print(_("まばゆい閃光が走った!", "There is a bright flash of light!"));
                 obvious = true;
             }
 
-            cave_alter_feat(player_ptr, y, x, FloorFeatureType::DISARM);
+            cave_alter_feat(player_ptr, y, x, TerrainCharacteristics::DISARM);
         }
 
-        if (is_closed_door(player_ptr, g_ptr->feat) && f_ptr->power && f_ptr->flags.has(FloorFeatureType::OPEN)) {
-            FEAT_IDX old_feat = g_ptr->feat;
-            cave_alter_feat(player_ptr, y, x, FloorFeatureType::DISARM);
-            if (known && (old_feat != g_ptr->feat)) {
+        if (is_closed_door(player_ptr, grid.feat) && terrain.power && terrain.flags.has(TerrainCharacteristics::OPEN)) {
+            FEAT_IDX old_feat = grid.feat;
+            cave_alter_feat(player_ptr, y, x, TerrainCharacteristics::DISARM);
+            if (known && (old_feat != grid.feat)) {
                 msg_print(_("カチッと音がした!", "Click!"));
                 obvious = true;
             }
         }
 
-        if (player_ptr->blind || !player_has_los_bold(player_ptr, y, x))
+        if (player_ptr->effects()->blindness()->is_blind() || !grid.has_los()) {
             break;
+        }
 
-        g_ptr->info &= ~(CAVE_UNSAFE);
+        grid.info &= ~(CAVE_UNSAFE);
         lite_spot(player_ptr, y, x);
         obvious = true;
         break;
     }
     case AttributeType::KILL_DOOR: {
-        if (is_trap(player_ptr, g_ptr->feat) || f_ptr->flags.has(FloorFeatureType::DOOR)) {
+        if (is_trap(player_ptr, grid.feat) || terrain.flags.has(TerrainCharacteristics::DOOR)) {
             if (known) {
                 msg_print(_("まばゆい閃光が走った!", "There is a bright flash of light!"));
                 obvious = true;
             }
 
-            cave_alter_feat(player_ptr, y, x, FloorFeatureType::TUNNEL);
+            cave_alter_feat(player_ptr, y, x, TerrainCharacteristics::TUNNEL);
         }
 
-        if (player_ptr->blind || !player_has_los_bold(player_ptr, y, x))
+        if (player_ptr->effects()->blindness()->is_blind() || !grid.has_los()) {
             break;
+        }
 
-        g_ptr->info &= ~(CAVE_UNSAFE);
+        grid.info &= ~(CAVE_UNSAFE);
         lite_spot(player_ptr, y, x);
         obvious = true;
         break;
     }
     case AttributeType::JAM_DOOR: {
-        if (f_ptr->flags.has_not(FloorFeatureType::SPIKE))
+        if (terrain.flags.has_not(TerrainCharacteristics::SPIKE)) {
             break;
+        }
 
-        int16_t old_mimic = g_ptr->mimic;
-        feature_type *mimic_f_ptr = &f_info[g_ptr->get_feat_mimic()];
+        int16_t old_mimic = grid.mimic;
+        const auto &terrain_mimic = grid.get_terrain_mimic();
 
-        cave_alter_feat(player_ptr, y, x, FloorFeatureType::SPIKE);
-        g_ptr->mimic = old_mimic;
+        cave_alter_feat(player_ptr, y, x, TerrainCharacteristics::SPIKE);
+        grid.mimic = old_mimic;
 
         note_spot(player_ptr, y, x);
         lite_spot(player_ptr, y, x);
 
-        if (!known || mimic_f_ptr->flags.has_not(FloorFeatureType::OPEN))
+        if (!known || terrain_mimic.flags.has_not(TerrainCharacteristics::OPEN)) {
             break;
+        }
 
-        msg_format(_("%sに何かがつっかえて開かなくなった。", "The %s seems stuck."), mimic_f_ptr->name.c_str());
+        msg_format(_("%sに何かがつっかえて開かなくなった。", "The %s seems stuck."), terrain_mimic.name.data());
         obvious = true;
         break;
     }
     case AttributeType::KILL_WALL: {
-        if (f_ptr->flags.has_not(FloorFeatureType::HURT_ROCK))
+        if (terrain.flags.has_not(TerrainCharacteristics::HURT_ROCK)) {
             break;
+        }
 
-        if (known && g_ptr->is_mark()) {
-            msg_format(_("%sが溶けて泥になった!", "The %s turns into mud!"), f_info[g_ptr->get_feat_mimic()].name.c_str());
+        if (known && grid.is_mark()) {
+            msg_format(_("%sが溶けて泥になった!", "The %s turns into mud!"), grid.get_terrain_mimic().name.data());
             obvious = true;
         }
 
-        cave_alter_feat(player_ptr, y, x, FloorFeatureType::HURT_ROCK);
-        player_ptr->update |= (PU_FLOW);
+        cave_alter_feat(player_ptr, y, x, TerrainCharacteristics::HURT_ROCK);
+        RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::FLOW);
         break;
     }
     case AttributeType::MAKE_DOOR: {
-        if (!cave_naked_bold(player_ptr, y, x))
+        if (!cave_naked_bold(player_ptr, pos)) {
             break;
-        if (player_bold(player_ptr, y, x))
+        }
+        if (player_ptr->is_located_at(pos)) {
             break;
+        }
         cave_set_feat(player_ptr, y, x, feat_door[DOOR_DOOR].closed);
-        if (g_ptr->is_mark())
+        if (grid.is_mark()) {
             obvious = true;
+        }
         break;
     }
     case AttributeType::MAKE_TRAP: {
-        place_trap(player_ptr, y, x);
+        place_trap(&floor, y, x);
         break;
     }
     case AttributeType::MAKE_TREE: {
-        if (!cave_naked_bold(player_ptr, y, x))
+        if (!cave_naked_bold(player_ptr, pos)) {
             break;
-        if (player_bold(player_ptr, y, x))
+        }
+        if (player_ptr->is_located_at(pos)) {
             break;
+        }
         cave_set_feat(player_ptr, y, x, feat_tree);
-        if (g_ptr->is_mark())
+        if (grid.is_mark()) {
             obvious = true;
+        }
         break;
     }
     case AttributeType::MAKE_RUNE_PROTECTION: {
-        if (!cave_naked_bold(player_ptr, y, x))
+        if (!cave_naked_bold(player_ptr, pos)) {
             break;
-        g_ptr->info |= CAVE_OBJECT;
-        g_ptr->mimic = feat_rune_protection;
+        }
+        grid.info |= CAVE_OBJECT;
+        grid.mimic = feat_rune_protection;
         note_spot(player_ptr, y, x);
         lite_spot(player_ptr, y, x);
         break;
     }
     case AttributeType::STONE_WALL: {
-        if (!cave_naked_bold(player_ptr, y, x))
+        if (!cave_naked_bold(player_ptr, pos)) {
             break;
-        if (player_bold(player_ptr, y, x))
+        }
+        if (player_ptr->is_located_at(pos)) {
             break;
+        }
         cave_set_feat(player_ptr, y, x, feat_granite);
         break;
     }
     case AttributeType::LAVA_FLOW: {
-        if (f_ptr->flags.has(FloorFeatureType::PERMANENT))
+        if (terrain.flags.has(TerrainCharacteristics::PERMANENT)) {
             break;
+        }
         if (dam == 1) {
-            if (f_ptr->flags.has_not(FloorFeatureType::FLOOR))
+            if (terrain.flags.has_not(TerrainCharacteristics::FLOOR)) {
                 break;
+            }
             cave_set_feat(player_ptr, y, x, feat_shallow_lava);
         } else if (dam) {
             cave_set_feat(player_ptr, y, x, feat_deep_lava);
@@ -303,11 +326,13 @@ bool affect_feature(PlayerType *player_ptr, MONSTER_IDX who, POSITION r, POSITIO
         break;
     }
     case AttributeType::WATER_FLOW: {
-        if (f_ptr->flags.has(FloorFeatureType::PERMANENT))
+        if (terrain.flags.has(TerrainCharacteristics::PERMANENT)) {
             break;
+        }
         if (dam == 1) {
-            if (f_ptr->flags.has_not(FloorFeatureType::FLOOR))
+            if (terrain.flags.has_not(TerrainCharacteristics::FLOOR)) {
                 break;
+            }
             cave_set_feat(player_ptr, y, x, feat_shallow_water);
         } else if (dam) {
             cave_set_feat(player_ptr, y, x, feat_deep_water);
@@ -317,20 +342,23 @@ bool affect_feature(PlayerType *player_ptr, MONSTER_IDX who, POSITION r, POSITIO
     }
     case AttributeType::LITE_WEAK:
     case AttributeType::LITE: {
-        if (d_info[player_ptr->dungeon_idx].flags.has(DungeonFeatureType::DARKNESS))
+        if (floor.get_dungeon_definition().flags.has(DungeonFeatureType::DARKNESS)) {
             break;
+        }
 
-        g_ptr->info |= (CAVE_GLOW);
+        grid.info |= (CAVE_GLOW);
         note_spot(player_ptr, y, x);
         lite_spot(player_ptr, y, x);
         update_local_illumination(player_ptr, y, x);
 
-        if (player_can_see_bold(player_ptr, y, x))
+        if (player_can_see_bold(player_ptr, y, x)) {
             obvious = true;
-        if (g_ptr->m_idx)
-            update_monster(player_ptr, g_ptr->m_idx, false);
+        }
+        if (grid.m_idx) {
+            update_monster(player_ptr, grid.m_idx, false);
+        }
 
-        if (player_bold(player_ptr, y, x)) {
+        if (player_ptr->is_located_at(pos)) {
             set_superstealth(player_ptr, false);
         }
 
@@ -339,35 +367,36 @@ bool affect_feature(PlayerType *player_ptr, MONSTER_IDX who, POSITION r, POSITIO
     case AttributeType::DARK_WEAK:
     case AttributeType::DARK:
     case AttributeType::ABYSS: {
-        bool do_dark = !player_ptr->phase_out && !g_ptr->is_mirror();
-        if (!do_dark)
+        auto do_dark = !AngbandSystem::get_instance().is_phase_out() && !grid.is_mirror();
+        if (!do_dark) {
             break;
+        }
 
-        if ((floor_ptr->dun_level > 0) || !is_daytime()) {
+        if ((floor.dun_level > 0) || !is_daytime()) {
             for (int j = 0; j < 9; j++) {
-                int by = y + ddy_ddd[j];
-                int bx = x + ddx_ddd[j];
-
-                if (!in_bounds2(floor_ptr, by, bx))
+                const Pos2D pos_neighbor(y + ddy_ddd[j], x + ddx_ddd[j]);
+                if (!in_bounds2(&floor, pos_neighbor.y, pos_neighbor.x)) {
                     continue;
+                }
 
-                grid_type *cc_ptr = &floor_ptr->grid_array[by][bx];
-                if (f_info[cc_ptr->get_feat_mimic()].flags.has(FloorFeatureType::GLOW)) {
+                const auto &grid_neighbor = floor.get_grid(pos_neighbor);
+                if (grid_neighbor.get_terrain_mimic().flags.has(TerrainCharacteristics::GLOW)) {
                     do_dark = false;
                     break;
                 }
             }
 
-            if (!do_dark)
+            if (!do_dark) {
                 break;
+            }
         }
 
-        g_ptr->info &= ~(CAVE_GLOW);
+        grid.info &= ~(CAVE_GLOW);
 
         /* Hack -- Forget "boring" grids */
-        if (f_ptr->flags.has_not(FloorFeatureType::REMEMBER) || has_element_resist(player_ptr, ElementRealmType::DARKNESS, 1)) {
+        if (terrain.flags.has_not(TerrainCharacteristics::REMEMBER) || has_element_resist(player_ptr, ElementRealmType::DARKNESS, 1)) {
             /* Forget */
-            g_ptr->info &= ~(CAVE_MARK);
+            grid.info &= ~(CAVE_MARK);
             note_spot(player_ptr, y, x);
         }
 
@@ -375,65 +404,71 @@ bool affect_feature(PlayerType *player_ptr, MONSTER_IDX who, POSITION r, POSITIO
 
         update_local_illumination(player_ptr, y, x);
 
-        if (player_can_see_bold(player_ptr, y, x))
+        if (player_can_see_bold(player_ptr, y, x)) {
             obvious = true;
-        if (g_ptr->m_idx)
-            update_monster(player_ptr, g_ptr->m_idx, false);
+        }
+        if (grid.m_idx) {
+            update_monster(player_ptr, grid.m_idx, false);
+        }
 
         break;
     }
     case AttributeType::SHARDS:
     case AttributeType::ROCKET: {
-        if (g_ptr->is_mirror()) {
+        if (grid.is_mirror()) {
             msg_print(_("鏡が割れた!", "The mirror was shattered!"));
             sound(SOUND_GLASS);
-            remove_mirror(player_ptr, y, x);
+            SpellsMirrorMaster(player_ptr).remove_mirror(y, x);
             project(player_ptr, 0, 2, y, x, player_ptr->lev / 2 + 5, AttributeType::SHARDS,
                 (PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL | PROJECT_JUMP | PROJECT_NO_HANGEKI));
         }
 
-        if (f_ptr->flags.has_not(FloorFeatureType::GLASS) || f_ptr->flags.has(FloorFeatureType::PERMANENT) || (dam < 50))
+        if (terrain.flags.has_not(TerrainCharacteristics::GLASS) || terrain.flags.has(TerrainCharacteristics::PERMANENT) || (dam < 50)) {
             break;
+        }
 
-        if (known && (g_ptr->is_mark())) {
-            msg_format(_("%sが割れた!", "The %s crumbled!"), f_info[g_ptr->get_feat_mimic()].name.c_str());
+        if (known && (grid.is_mark())) {
+            msg_format(_("%sが割れた!", "The %s crumbled!"), grid.get_terrain_mimic().name.data());
             sound(SOUND_GLASS);
         }
 
-        cave_alter_feat(player_ptr, y, x, FloorFeatureType::HURT_ROCK);
-        player_ptr->update |= (PU_FLOW);
+        cave_alter_feat(player_ptr, y, x, TerrainCharacteristics::HURT_ROCK);
+        RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::FLOW);
         break;
     }
     case AttributeType::SOUND: {
-        if (g_ptr->is_mirror() && player_ptr->lev < 40) {
+        if (grid.is_mirror() && player_ptr->lev < 40) {
             msg_print(_("鏡が割れた!", "The mirror was shattered!"));
             sound(SOUND_GLASS);
-            remove_mirror(player_ptr, y, x);
+            SpellsMirrorMaster(player_ptr).remove_mirror(y, x);
             project(player_ptr, 0, 2, y, x, player_ptr->lev / 2 + 5, AttributeType::SHARDS,
                 (PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL | PROJECT_JUMP | PROJECT_NO_HANGEKI));
         }
 
-        if (f_ptr->flags.has_not(FloorFeatureType::GLASS) || f_ptr->flags.has(FloorFeatureType::PERMANENT) || (dam < 200))
+        if (terrain.flags.has_not(TerrainCharacteristics::GLASS) || terrain.flags.has(TerrainCharacteristics::PERMANENT) || (dam < 200)) {
             break;
+        }
 
-        if (known && (g_ptr->is_mark())) {
-            msg_format(_("%sが割れた!", "The %s crumbled!"), f_info[g_ptr->get_feat_mimic()].name.c_str());
+        if (known && (grid.is_mark())) {
+            msg_format(_("%sが割れた!", "The %s crumbled!"), grid.get_terrain_mimic().name.data());
             sound(SOUND_GLASS);
         }
 
-        cave_alter_feat(player_ptr, y, x, FloorFeatureType::HURT_ROCK);
-        player_ptr->update |= (PU_FLOW);
+        cave_alter_feat(player_ptr, y, x, TerrainCharacteristics::HURT_ROCK);
+        RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::FLOW);
         break;
     }
     case AttributeType::DISINTEGRATE: {
-        if (g_ptr->is_mirror() || g_ptr->is_rune_protection() || g_ptr->is_rune_explosion())
-            remove_mirror(player_ptr, y, x);
+        if (grid.is_mirror() || grid.is_rune_protection() || grid.is_rune_explosion()) {
+            SpellsMirrorMaster(player_ptr).remove_mirror(y, x);
+        }
 
-        if (f_ptr->flags.has_not(FloorFeatureType::HURT_DISI) || f_ptr->flags.has(FloorFeatureType::PERMANENT))
+        if (terrain.flags.has_not(TerrainCharacteristics::HURT_DISI) || terrain.flags.has(TerrainCharacteristics::PERMANENT)) {
             break;
+        }
 
-        cave_alter_feat(player_ptr, y, x, FloorFeatureType::HURT_DISI);
-        player_ptr->update |= (PU_FLOW);
+        cave_alter_feat(player_ptr, y, x, TerrainCharacteristics::HURT_DISI);
+        RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::FLOW);
         break;
     }
     default:
@@ -441,5 +476,5 @@ bool affect_feature(PlayerType *player_ptr, MONSTER_IDX who, POSITION r, POSITIO
     }
 
     lite_spot(player_ptr, y, x);
-    return (obvious);
+    return obvious;
 }