OSDN Git Service

[Refactor] カメレオンの種族選択処理のモンスターの位置情報への依存をなくした
authorSlimebreath6078 <slimebreath6078@yahoo.co.jp>
Sat, 6 Jul 2024 14:07:25 +0000 (23:07 +0900)
committerSlimebreath6078 <slimebreath6078@yahoo.co.jp>
Wed, 10 Jul 2024 08:46:22 +0000 (17:46 +0900)
src/monster-floor/one-monster-placer.cpp
src/monster/monster-list.cpp
src/monster/monster-list.h
src/monster/monster-processor.cpp

index 7342a02..17adb23 100644 (file)
@@ -334,7 +334,7 @@ std::optional<MONSTER_IDX> place_monster_one(PlayerType *player_ptr, MONSTER_IDX
     }
 
     if (r_ptr->misc_flags.has(MonsterMiscType::CHAMELEON)) {
-        choose_chameleon_polymorph(player_ptr, g_ptr->m_idx, summoner_m_idx);
+        choose_chameleon_polymorph(player_ptr, g_ptr->m_idx, *g_ptr, summoner_m_idx);
 
         r_ptr = &m_ptr->get_monrace();
 
index e3c6490..f31f732 100644 (file)
@@ -204,10 +204,11 @@ MonsterRaceId get_mon_num(PlayerType *player_ptr, DEPTH min_level, DEPTH max_lev
  * @brief カメレオンの王の変身対象となるモンスターかどうか判定する / Hack -- the index of the summoning monster
  * @param r_idx モンスター種族ID
  * @param m_idx 変身するモンスターのモンスターID
+ * @param grid カメレオンの足元の地形
  * @param summoner_m_idx モンスターの召喚による場合、召喚者のモンスターID
  * @return 対象にできるならtrueを返す
  */
-static bool monster_hook_chameleon_lord(PlayerType *player_ptr, MonsterRaceId r_idx, MONSTER_IDX m_idx, std::optional<MONSTER_IDX> summoner_m_idx)
+static bool monster_hook_chameleon_lord(PlayerType *player_ptr, MonsterRaceId r_idx, MONSTER_IDX m_idx, const Grid &grid, std::optional<MONSTER_IDX> summoner_m_idx)
 {
     auto *floor_ptr = player_ptr->current_floor_ptr;
     auto *r_ptr = &monraces_info[r_idx];
@@ -229,7 +230,7 @@ static bool monster_hook_chameleon_lord(PlayerType *player_ptr, MonsterRaceId r_
         return false;
     }
 
-    if (!monster_can_cross_terrain(player_ptr, floor_ptr->grid_array[m_ptr->fy][m_ptr->fx].feat, r_ptr, 0)) {
+    if (!monster_can_cross_terrain(player_ptr, grid.feat, r_ptr, 0)) {
         return false;
     }
 
@@ -248,11 +249,12 @@ static bool monster_hook_chameleon_lord(PlayerType *player_ptr, MonsterRaceId r_
  * @brief カメレオンの変身対象となるモンスターかどうか判定する / Hack -- the index of the summoning monster
  * @param r_idx モンスター種族ID
  * @param m_idx 変身するモンスターのモンスターID
+ * @param grid カメレオンの足元の地形
  * @param summoner_m_idx モンスターの召喚による場合、召喚者のモンスターID
  * @return 対象にできるならtrueを返す
  * @todo グローバル変数対策の上 monster_hook.cへ移す。
  */
-static bool monster_hook_chameleon(PlayerType *player_ptr, MonsterRaceId r_idx, MONSTER_IDX m_idx, std::optional<MONSTER_IDX> summoner_m_idx)
+static bool monster_hook_chameleon(PlayerType *player_ptr, MonsterRaceId r_idx, MONSTER_IDX m_idx, const Grid &grid, std::optional<MONSTER_IDX> summoner_m_idx)
 {
     auto *floor_ptr = player_ptr->current_floor_ptr;
     auto *r_ptr = &monraces_info[r_idx];
@@ -273,7 +275,7 @@ static bool monster_hook_chameleon(PlayerType *player_ptr, MonsterRaceId r_idx,
         return false;
     }
 
-    if (!monster_can_cross_terrain(player_ptr, floor_ptr->grid_array[m_ptr->fy][m_ptr->fx].feat, r_ptr, 0)) {
+    if (!monster_can_cross_terrain(player_ptr, grid.feat, r_ptr, 0)) {
         return false;
     }
 
@@ -295,7 +297,7 @@ static bool monster_hook_chameleon(PlayerType *player_ptr, MonsterRaceId r_idx,
     return hook_pf(player_ptr, r_idx);
 }
 
-static std::optional<MonsterRaceId> polymorph_of_chameleon(PlayerType *player_ptr, MONSTER_IDX m_idx, const std::optional<MONSTER_IDX> summoner_m_idx)
+static std::optional<MonsterRaceId> polymorph_of_chameleon(PlayerType *player_ptr, MONSTER_IDX m_idx, const Grid &grid, const std::optional<MONSTER_IDX> summoner_m_idx)
 {
     auto *floor_ptr = player_ptr->current_floor_ptr;
     auto *m_ptr = &floor_ptr->m_list[m_idx];
@@ -306,8 +308,8 @@ static std::optional<MonsterRaceId> polymorph_of_chameleon(PlayerType *player_pt
     }
 
     auto hook_fp = old_unique ? monster_hook_chameleon_lord : monster_hook_chameleon;
-    auto hook = [m_idx, summoner_m_idx, hook_fp](PlayerType *player_ptr, MonsterRaceId r_idx) {
-        return hook_fp(player_ptr, r_idx, m_idx, summoner_m_idx);
+    auto hook = [m_idx, grid, summoner_m_idx, hook_fp](PlayerType *player_ptr, MonsterRaceId r_idx) {
+        return hook_fp(player_ptr, r_idx, m_idx, grid, summoner_m_idx);
     };
     get_mon_num_prep_chameleon(player_ptr, std::move(hook));
 
@@ -338,14 +340,15 @@ static std::optional<MonsterRaceId> polymorph_of_chameleon(PlayerType *player_pt
  * @brief カメレオンの変身処理
  * @param player_ptr プレイヤーへの参照ポインタ
  * @param m_idx 変身処理を受けるモンスター情報のID
+ * @param grid カメレオンの足元の地形
  * @param summoner_m_idx モンスターの召喚による場合、召喚者のモンスターID
  */
-void choose_chameleon_polymorph(PlayerType *player_ptr, MONSTER_IDX m_idx, std::optional<MONSTER_IDX> summoner_m_idx)
+void choose_chameleon_polymorph(PlayerType *player_ptr, MONSTER_IDX m_idx, const Grid &grid, std::optional<MONSTER_IDX> summoner_m_idx)
 {
     auto &floor = *player_ptr->current_floor_ptr;
     auto &monster = floor.m_list[m_idx];
 
-    auto new_monrace_id = polymorph_of_chameleon(player_ptr, m_idx, summoner_m_idx);
+    auto new_monrace_id = polymorph_of_chameleon(player_ptr, m_idx, grid, summoner_m_idx);
     if (!new_monrace_id) {
         return;
     }
index 67283e3..677d6d2 100644 (file)
@@ -7,8 +7,9 @@ enum class MonsterRaceId : int16_t;
 class FloorType;
 class MonsterRaceInfo;
 class PlayerType;
+class Grid;
 MONSTER_IDX m_pop(FloorType *floor_ptr);
 
 MonsterRaceId get_mon_num(PlayerType *player_ptr, DEPTH min_level, DEPTH max_level, BIT_FLAGS mode);
-void choose_chameleon_polymorph(PlayerType *player_ptr, MONSTER_IDX m_idx, std::optional<MONSTER_IDX> summoner_m_idx = std::nullopt);
+void choose_chameleon_polymorph(PlayerType *player_ptr, MONSTER_IDX m_idx, const Grid &grid, std::optional<MONSTER_IDX> summoner_m_idx = std::nullopt);
 int get_monster_crowd_number(FloorType *floor_ptr, MONSTER_IDX m_idx);
index 020c9cf..c7da53b 100644 (file)
@@ -121,7 +121,9 @@ void process_monster(PlayerType *player_ptr, MONSTER_IDX m_idx)
 
     decide_drop_from_monster(player_ptr, m_idx, turn_flags_ptr->is_riding_mon);
     if (m_ptr->mflag2.has(MonsterConstantFlagType::CHAMELEON) && one_in_(13) && !m_ptr->is_asleep()) {
-        choose_chameleon_polymorph(player_ptr, m_idx);
+        const auto &floor = *player_ptr->current_floor_ptr;
+
+        choose_chameleon_polymorph(player_ptr, m_idx, floor.get_grid(Pos2D(m_ptr->fy, m_ptr->fx)));
 
         const auto &new_monrace = m_ptr->get_monrace();
 
@@ -137,7 +139,7 @@ void process_monster(PlayerType *player_ptr, MONSTER_IDX m_idx)
             }
         }
 
-        m_ptr->set_individual_speed(player_ptr->current_floor_ptr->inside_arena);
+        m_ptr->set_individual_speed(floor.inside_arena);
 
         const auto old_maxhp = m_ptr->max_maxhp;
         if (new_monrace.misc_flags.has(MonsterMiscType::FORCE_MAXHP)) {