OSDN Git Service

[Refactor] ObjectIndexListクラスの導入
authorHabu <habu1010+github@gmail.com>
Sat, 1 May 2021 21:31:12 +0000 (06:31 +0900)
committerHabu <habu1010+github@gmail.com>
Sat, 8 May 2021 10:13:05 +0000 (19:13 +0900)
床上/モンスター所持のアイテムリスト処理のコードを管理
しやすくするため、std::list を直接メンバに持たせるのではなく
アイテムリスト管理クラス ObjectIndexList を持たせる。

20 files changed:
Hengband/Hengband/Hengband.vcxproj
Hengband/Hengband/Hengband.vcxproj.filters
src/Makefile.am
src/combat/shoot.cpp
src/floor/fixed-map-generator.cpp
src/floor/floor-object.cpp
src/floor/floor-object.h
src/floor/floor-util.cpp
src/grid/grid.h
src/grid/object-placer.cpp
src/inventory/floor-item-getter.cpp
src/load/floor-loader.cpp
src/load/load-v1-5-0.cpp
src/monster-attack/monster-eating.cpp
src/monster-floor/monster-object.cpp
src/object/object-index-list.cpp [new file with mode: 0644]
src/object/object-index-list.h [new file with mode: 0644]
src/spell-kind/spells-fetcher.cpp
src/system/monster-type-definition.h
src/target/target-describer.cpp

index 3b08974..2d9a755 100644 (file)
     <ClCompile Include="..\..\src\main-win\graphics-win.cpp" />\r
     <ClCompile Include="..\..\src\object-enchant\apply-magic-amulet.cpp" />\r
     <ClCompile Include="..\..\src\object-enchant\apply-magic-ring.cpp" />\r
+    <ClCompile Include="..\..\src\object\object-index-list.cpp" />\r
     <ClCompile Include="..\..\src\player-info\alignment.cpp" />\r
     <ClCompile Include="..\..\src\player-info\equipment-info.cpp" />\r
     <ClCompile Include="..\..\src\player-status\player-energy.cpp" />\r
     <ClInclude Include="..\..\src\main-win\graphics-win.h" />\r
     <ClInclude Include="..\..\src\object-enchant\apply-magic-amulet.h" />\r
     <ClInclude Include="..\..\src\object-enchant\apply-magic-ring.h" />\r
+    <ClInclude Include="..\..\src\object\object-index-list.h" />\r
     <ClInclude Include="..\..\src\player-info\alignment.h" />\r
     <ClInclude Include="..\..\src\player-info\equipment-info.h" />\r
     <ClInclude Include="..\..\src\player-status\player-energy.h" />\r
index cb80056..007d7e4 100644 (file)
     <ClCompile Include="..\..\src\system\object-type-definition.cpp">\r
       <Filter>system</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\src\object\object-index-list.cpp">\r
+      <Filter>object</Filter>\r
+    </ClCompile>\r
   </ItemGroup>\r
   <ItemGroup>\r
     <ClInclude Include="..\..\src\combat\shoot.h">\r
     <ClInclude Include="..\..\src\dungeon\dungeon-flag-mask.h">\r
       <Filter>dungeon</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\src\object\object-index-list.h">\r
+      <Filter>object</Filter>\r
+    </ClInclude>\r
   </ItemGroup>\r
   <ItemGroup>\r
     <None Include="..\..\src\wall.bmp" />\r
index 53a3279..4e3f761 100644 (file)
@@ -543,6 +543,7 @@ hengband_SOURCES = \
        object/item-tester-hooker.cpp object/item-tester-hooker.h \
        object/object-broken.cpp object/object-broken.h \
        object/object-flags.cpp object/object-flags.h \
+       object/object-index-list.cpp object/object-index-list.h \
        object/object-info.cpp object/object-info.h \
        object/object-kind.cpp object/object-kind.h \
        object/object-kind-hook.cpp object/object-kind-hook.h \
index 2f4c867..d1cc337 100644 (file)
@@ -863,7 +863,7 @@ void exe_fire(player_type *shooter_ptr, INVENTORY_IDX item, object_type *j_ptr,
             o_ptr->held_m_idx = m_idx;
 
             /* Carry object */
-            m_ptr->hold_o_idx_list.push_front(o_idx);
+            m_ptr->hold_o_idx_list.add(o_idx);
         } else if (cave_has_flag_bold(shooter_ptr->current_floor_ptr, y, x, FF_PROJECT)) {
             /* Drop (or break) near that location */
             (void)drop_near(shooter_ptr, q_ptr, j, y, x);
index c6423a6..0640c3c 100644 (file)
@@ -70,7 +70,7 @@ static void drop_here(floor_type *floor_ptr, object_type *j_ptr, POSITION y, POS
     o_ptr->ix = x;
     o_ptr->held_m_idx = 0;
     grid_type *g_ptr = &floor_ptr->grid_array[y][x];
-    g_ptr->o_idx_list.push_front(o_idx);
+    g_ptr->o_idx_list.add(o_idx);
 }
 
 static void generate_artifact(player_type *player_ptr, qtwg_type *qtwg_ptr, const ARTIFACT_IDX artifact_index)
index 7af0fcd..cfcecd3 100644 (file)
@@ -281,9 +281,9 @@ void excise_object_idx(floor_type *floor_ptr, OBJECT_IDX o_idx)
  * @brief 指定したOBJECT_IDXを含むリスト(モンスター所持リスト or 床上スタックリスト)への参照を得る
  * @param floo_ptr 現在フロアへの参照ポインタ
  * @param o_idx 参照を得るリストに含まれるOBJECT_IDX
- * @return o_idxを含む std::list<OBJECT_IDX> への参照
+ * @return o_idxを含む ObjectIndexList への参照
  */
-std::list<OBJECT_IDX> &get_o_idx_list_contains(floor_type *floor_ptr, OBJECT_IDX o_idx)
+ObjectIndexList &get_o_idx_list_contains(floor_type *floor_ptr, OBJECT_IDX o_idx)
 {
     object_type *o_ptr = &floor_ptr->o_list[o_idx];
 
@@ -511,7 +511,7 @@ OBJECT_IDX drop_near(player_type *owner_ptr, object_type *j_ptr, PERCENTAGE chan
         j_ptr->iy = by;
         j_ptr->ix = bx;
         j_ptr->held_m_idx = 0;
-        g_ptr->o_idx_list.push_front(o_idx);
+        g_ptr->o_idx_list.add(o_idx);
         done = TRUE;
     }
 
index 7d9a752..d72dea6 100644 (file)
@@ -3,7 +3,7 @@
 #include "object/tval-types.h"
 #include "system/angband.h"
 
-#include <list>
+class ObjectIndexList;
 
 typedef struct floor_type floor_type;
 typedef struct object_type object_type;
@@ -15,7 +15,7 @@ void floor_item_increase(player_type *owner_ptr, INVENTORY_IDX item, ITEM_NUMBER
 void floor_item_optimize(player_type *owner_ptr, INVENTORY_IDX item);
 void delete_object_idx(player_type *owner_ptr, OBJECT_IDX o_idx);
 void excise_object_idx(floor_type *floor_ptr, OBJECT_IDX o_idx);
-std::list<OBJECT_IDX> &get_o_idx_list_contains(floor_type *floor_ptr, OBJECT_IDX o_idx);
+ObjectIndexList &get_o_idx_list_contains(floor_type *floor_ptr, OBJECT_IDX o_idx);
 OBJECT_IDX drop_near(player_type *owner_type, object_type *o_ptr, PERCENTAGE chance, POSITION y, POSITION x);
 void floor_item_charges(floor_type *owner_ptr, INVENTORY_IDX item);
 void floor_item_describe(player_type *player_ptr, INVENTORY_IDX item);
index 4b4ad37..f374434 100644 (file)
@@ -120,7 +120,7 @@ void forget_flow(floor_type *floor_ptr)
  */
 void wipe_o_list(floor_type *floor_ptr)
 {
-    for (int i = 1; i < floor_ptr->o_max; i++) {
+    for (OBJECT_IDX i = 1; i < floor_ptr->o_max; i++) {
         object_type *o_ptr = &floor_ptr->o_list[i];
         if (!object_is_valid(o_ptr))
             continue;
index 4756d1f..441750b 100644 (file)
  * included in all such copies.
  */
 
-#include "spell/spells-util.h"
 #include "system/angband.h"
 
-#include <list>
+#include "spell/spells-util.h"
+#include "object/object-index-list.h"
 
 /*
  * A single "grid" in a Cave
@@ -55,7 +55,7 @@ struct grid_type {
     BIT_FLAGS info{}; /* Hack -- grid flags */
 
     FEAT_IDX feat{}; /* Hack -- feature type */
-    std::list<OBJECT_IDX> o_idx_list; /* Object list in this grid */
+    ObjectIndexList o_idx_list; /* Object list in this grid */
     MONSTER_IDX m_idx{}; /* Monster in this grid */
 
     /*! 地形の特別な情報を保存する / Special grid info
index 667005e..a9c20c1 100644 (file)
@@ -47,7 +47,7 @@ void place_gold(player_type *player_ptr, POSITION y, POSITION x)
 
     o_ptr->iy = y;
     o_ptr->ix = x;
-    g_ptr->o_idx_list.push_front(o_idx);
+    g_ptr->o_idx_list.add(o_idx);
 
     note_spot(player_ptr, y, x);
     lite_spot(player_ptr, y, x);
@@ -95,7 +95,7 @@ void place_object(player_type *owner_ptr, POSITION y, POSITION x, BIT_FLAGS mode
 
     o_ptr->iy = y;
     o_ptr->ix = x;
-    g_ptr->o_idx_list.push_front(o_idx);
+    g_ptr->o_idx_list.add(o_idx);
 
     note_spot(owner_ptr, y, x);
     lite_spot(owner_ptr, y, x);
index dbe8183..a70131e 100644 (file)
@@ -613,19 +613,14 @@ bool get_item_floor(player_type *owner_ptr, COMMAND_CODE *cp, concptr pmt, concp
         case '\n':
         case '\r':
         case '+': {
-            OBJECT_IDX o_idx = 0;
             grid_type *g_ptr = &owner_ptr->current_floor_ptr->grid_array[owner_ptr->y][owner_ptr->x];
             if (command_wrk != (USE_FLOOR))
                 break;
 
-            if (!g_ptr->o_idx_list.empty())
-                o_idx = g_ptr->o_idx_list.front();
-
             if (g_ptr->o_idx_list.size() < 2)
                 break;
 
-            g_ptr->o_idx_list.pop_front();
-            g_ptr->o_idx_list.push_back(o_idx);
+            g_ptr->o_idx_list.rotate();
 
             fis_ptr->floor_num
                 = scan_floor_items(owner_ptr, fis_ptr->floor_list, owner_ptr->y, owner_ptr->x, SCAN_FLOOR_ITEM_TESTER | SCAN_FLOOR_ONLY_MARKED, fis_ptr->tval);
index 8eb8801..3317072 100644 (file)
@@ -195,7 +195,7 @@ errr rd_saved_floor(player_type *player_ptr, saved_floor_type *sf_ptr)
         rd_item(player_ptr, o_ptr);
 
         auto &list = get_o_idx_list_contains(floor_ptr, o_idx);
-        list.push_front(o_idx);
+        list.add(o_idx);
     }
 
     rd_u16b(&limit);
index e61e01d..2c898b6 100644 (file)
@@ -753,7 +753,7 @@ errr rd_dungeon_old(player_type *player_ptr)
         rd_item(player_ptr, o_ptr);
 
         auto &list = get_o_idx_list_contains(floor_ptr, o_idx);
-        list.push_front(o_idx);
+        list.add(o_idx);
     }
 
     rd_u16b(&limit);
index 54c4033..44e0a52 100644 (file)
@@ -114,7 +114,7 @@ static void move_item_to_monster(player_type *target_ptr, monap_type *monap_ptr,
 
     j_ptr->marked = OM_TOUCHED;
     j_ptr->held_m_idx = monap_ptr->m_idx;
-    monap_ptr->m_ptr->hold_o_idx_list.push_front(o_idx);
+    monap_ptr->m_ptr->hold_o_idx_list.add(o_idx);
 }
 
 /*!
index f2e78a9..41805b7 100644 (file)
@@ -127,7 +127,7 @@ static void monster_pickup_object(player_type *target_ptr, turn_flags *turn_flag
         o_ptr->marked &= OM_TOUCHED;
         o_ptr->iy = o_ptr->ix = 0;
         o_ptr->held_m_idx = m_idx;
-        m_ptr->hold_o_idx_list.push_front(this_o_idx);
+        m_ptr->hold_o_idx_list.add(this_o_idx);
         return;
     }
 
diff --git a/src/object/object-index-list.cpp b/src/object/object-index-list.cpp
new file mode 100644 (file)
index 0000000..6dffde0
--- /dev/null
@@ -0,0 +1,20 @@
+#include "object/object-index-list.h"
+
+void ObjectIndexList::add(OBJECT_IDX o_idx)
+{
+    o_idx_list_.push_front(o_idx);
+}
+
+void ObjectIndexList::remove(OBJECT_IDX o_idx)
+{
+    o_idx_list_.remove(o_idx);
+}
+
+void ObjectIndexList::rotate()
+{
+    if (o_idx_list_.size() < 2)
+        return;
+
+    o_idx_list_.push_back(o_idx_list_.front());
+    o_idx_list_.pop_front();
+}
diff --git a/src/object/object-index-list.h b/src/object/object-index-list.h
new file mode 100644 (file)
index 0000000..dfd17d6
--- /dev/null
@@ -0,0 +1,78 @@
+#pragma once
+
+#include "system/angband.h"
+
+#include <list>
+
+/**
+ * @brief アイテムリスト(床上スタック/モンスター所持)を管理するクラス
+ */
+class ObjectIndexList {
+public:
+    /**
+     * @brief デフォルトコンストラクタ
+     */
+    ObjectIndexList() = default;
+
+    /**
+     * @brief アイテムリストにフロア全体のアイテム配列上の指定した要素番号のアイテムを追加する
+     *
+     * @param o_idx 追加するアイテムのフロア全体のアイテム配列上の要素番号
+     */
+    void add(OBJECT_IDX o_idx);
+
+    /**
+     * @brief アイテムリストからフロア全体のアイテム配列上の指定した要素番号のアイテムを削除する
+     *
+     * @param o_idx 削除するアイテムのフロア全体のアイテム配列上の要素番号
+     */
+    void remove(OBJECT_IDX o_idx);
+
+    /**
+     * @brief アイテムリストの先頭のアイテムを最後尾に移動させる
+     */
+    void rotate();
+
+    //
+    // 以下のメソッドは内部で保持している std::list オブジェクトに対して使用できる同名のメソッド
+    //
+    auto empty() const noexcept
+    {
+        return o_idx_list_.empty();
+    }
+    auto size() const noexcept
+    {
+        return o_idx_list_.size();
+    }
+    void clear() noexcept
+    {
+        o_idx_list_.clear();
+    }
+    auto &front() noexcept
+    {
+        return o_idx_list_.front();
+    }
+    void pop_front() noexcept
+    {
+        return o_idx_list_.pop_front();
+    }
+    auto begin() noexcept
+    {
+        return o_idx_list_.begin();
+    }
+    auto end() noexcept
+    {
+        return o_idx_list_.end();
+    }
+    auto begin() const noexcept
+    {
+        return o_idx_list_.begin();
+    }
+    auto end() const noexcept
+    {
+        return o_idx_list_.end();
+    }
+
+private:
+    std::list<OBJECT_IDX> o_idx_list_;
+};
index 7d30b0c..288b079 100644 (file)
@@ -99,7 +99,7 @@ void fetch_item(player_type *caster_ptr, DIRECTION dir, WEIGHT wgt, bool require
 
     OBJECT_IDX i = g_ptr->o_idx_list.front();
     g_ptr->o_idx_list.pop_front();
-    caster_ptr->current_floor_ptr->grid_array[caster_ptr->y][caster_ptr->x].o_idx_list.push_front(i); /* 'move' it */
+    caster_ptr->current_floor_ptr->grid_array[caster_ptr->y][caster_ptr->x].o_idx_list.add(i); /* 'move' it */
 
     o_ptr->iy = caster_ptr->y;
     o_ptr->ix = caster_ptr->x;
index 709d434..18c0c86 100644 (file)
@@ -3,10 +3,9 @@
 #include "monster/monster-flag-types.h"
 #include "monster/monster-timed-effect-types.h"
 #include "monster/smart-learn-types.h"
+#include "object/object-index-list.h"
 #include "util/flag-group.h"
 
-#include <list>
-
 /*!
  * @brief Monster information, for a specific monster.
  * @Note
@@ -40,7 +39,7 @@ typedef struct monster_type {
        EnumClassFlagGroup<MFLAG> mflag{};      /*!< モンスター個体に与えられた特殊フラグ1 (セーブ不要) / Extra monster flags */
        EnumClassFlagGroup<MFLAG2> mflag2{};    /*!< モンスター個体に与えられた特殊フラグ2 (セーブ必要) / Extra monster flags */
        bool ml{};              /*!< モンスターがプレイヤーにとって視認できるか(処理のためのテンポラリ変数) Monster is "visible" */
-       std::list<OBJECT_IDX> hold_o_idx_list{};        /*!< モンスターが所持しているアイテムのリスト / Object list being held (if any) */
+       ObjectIndexList hold_o_idx_list{};      /*!< モンスターが所持しているアイテムのリスト / Object list being held (if any) */
        POSITION target_y{};            /*!< モンスターの攻撃目標対象Y座標 / Can attack !los player */
        POSITION target_x{};            /*!< モンスターの攻撃目標対象X座標 /  Can attack !los player */
        STR_OFFSET nickname{};  /*!< ペットに与えられた名前の保存先文字列オフセット Monster's Nickname */
index 41eea2d..28d2fe8 100644 (file)
@@ -351,14 +351,10 @@ static char describe_footing_many_items(player_type *subject_ptr, eg_type *eg_pt
         if (eg_ptr->query != '\n' && eg_ptr->query != '\r')
             return eg_ptr->query;
 
-        OBJECT_IDX o_idx = 0;
-        if (!eg_ptr->g_ptr->o_idx_list.empty())
-            o_idx = eg_ptr->g_ptr->o_idx_list.front();
         if (eg_ptr->g_ptr->o_idx_list.size() < 2)
             continue;
 
-        eg_ptr->g_ptr->o_idx_list.pop_front();
-        eg_ptr->g_ptr->o_idx_list.push_back(o_idx);
+        eg_ptr->g_ptr->o_idx_list.rotate();
     }
 }