<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
<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
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 \
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);
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)
* @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];
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;
}
#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;
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);
*/
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;
* 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
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
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);
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);
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);
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);
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);
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);
}
/*!
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;
}
--- /dev/null
+#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();
+}
--- /dev/null
+#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_;
+};
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;
#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
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 */
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();
}
}