From: Habu Date: Sat, 1 May 2021 21:31:12 +0000 (+0900) Subject: [Refactor] ObjectIndexListクラスの導入 X-Git-Tag: vmacos3.0.0-alpha52~203^2^2~4 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=45f78ac930436e5b47d248ef5f3e0d851604d541;p=hengbandforosx%2Fhengbandosx.git [Refactor] ObjectIndexListクラスの導入 床上/モンスター所持のアイテムリスト処理のコードを管理 しやすくするため、std::list を直接メンバに持たせるのではなく アイテムリスト管理クラス ObjectIndexList を持たせる。 --- diff --git a/Hengband/Hengband/Hengband.vcxproj b/Hengband/Hengband/Hengband.vcxproj index 3b08974e0..2d9a755b2 100644 --- a/Hengband/Hengband/Hengband.vcxproj +++ b/Hengband/Hengband/Hengband.vcxproj @@ -272,6 +272,7 @@ + @@ -948,6 +949,7 @@ + diff --git a/Hengband/Hengband/Hengband.vcxproj.filters b/Hengband/Hengband/Hengband.vcxproj.filters index cb80056ae..007d7e403 100644 --- a/Hengband/Hengband/Hengband.vcxproj.filters +++ b/Hengband/Hengband/Hengband.vcxproj.filters @@ -2286,6 +2286,9 @@ system + + object + @@ -4920,6 +4923,9 @@ dungeon + + object + diff --git a/src/Makefile.am b/src/Makefile.am index 53a32790f..4e3f7610d 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -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 \ diff --git a/src/combat/shoot.cpp b/src/combat/shoot.cpp index 2f4c86751..d1cc33755 100644 --- a/src/combat/shoot.cpp +++ b/src/combat/shoot.cpp @@ -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); diff --git a/src/floor/fixed-map-generator.cpp b/src/floor/fixed-map-generator.cpp index c6423a625..0640c3c69 100644 --- a/src/floor/fixed-map-generator.cpp +++ b/src/floor/fixed-map-generator.cpp @@ -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) diff --git a/src/floor/floor-object.cpp b/src/floor/floor-object.cpp index 7af0fcd1e..cfcecd3ba 100644 --- a/src/floor/floor-object.cpp +++ b/src/floor/floor-object.cpp @@ -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 への参照 + * @return o_idxを含む ObjectIndexList への参照 */ -std::list &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; } diff --git a/src/floor/floor-object.h b/src/floor/floor-object.h index 7d9a75288..d72dea68e 100644 --- a/src/floor/floor-object.h +++ b/src/floor/floor-object.h @@ -3,7 +3,7 @@ #include "object/tval-types.h" #include "system/angband.h" -#include +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 &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); diff --git a/src/floor/floor-util.cpp b/src/floor/floor-util.cpp index 4b4ad3704..f374434cb 100644 --- a/src/floor/floor-util.cpp +++ b/src/floor/floor-util.cpp @@ -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; diff --git a/src/grid/grid.h b/src/grid/grid.h index 4756d1f53..441750b63 100644 --- a/src/grid/grid.h +++ b/src/grid/grid.h @@ -14,10 +14,10 @@ * included in all such copies. */ -#include "spell/spells-util.h" #include "system/angband.h" -#include +#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 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 diff --git a/src/grid/object-placer.cpp b/src/grid/object-placer.cpp index 667005e22..a9c20c13d 100644 --- a/src/grid/object-placer.cpp +++ b/src/grid/object-placer.cpp @@ -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); diff --git a/src/inventory/floor-item-getter.cpp b/src/inventory/floor-item-getter.cpp index dbe8183f9..a70131e96 100644 --- a/src/inventory/floor-item-getter.cpp +++ b/src/inventory/floor-item-getter.cpp @@ -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); diff --git a/src/load/floor-loader.cpp b/src/load/floor-loader.cpp index 8eb880172..3317072f3 100644 --- a/src/load/floor-loader.cpp +++ b/src/load/floor-loader.cpp @@ -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); diff --git a/src/load/load-v1-5-0.cpp b/src/load/load-v1-5-0.cpp index e61e01d7b..2c898b651 100644 --- a/src/load/load-v1-5-0.cpp +++ b/src/load/load-v1-5-0.cpp @@ -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); diff --git a/src/monster-attack/monster-eating.cpp b/src/monster-attack/monster-eating.cpp index 54c403389..44e0a5262 100644 --- a/src/monster-attack/monster-eating.cpp +++ b/src/monster-attack/monster-eating.cpp @@ -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); } /*! diff --git a/src/monster-floor/monster-object.cpp b/src/monster-floor/monster-object.cpp index f2e78a9fb..41805b7fb 100644 --- a/src/monster-floor/monster-object.cpp +++ b/src/monster-floor/monster-object.cpp @@ -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 index 000000000..6dffde072 --- /dev/null +++ b/src/object/object-index-list.cpp @@ -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 index 000000000..dfd17d666 --- /dev/null +++ b/src/object/object-index-list.h @@ -0,0 +1,78 @@ +#pragma once + +#include "system/angband.h" + +#include + +/** + * @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 o_idx_list_; +}; diff --git a/src/spell-kind/spells-fetcher.cpp b/src/spell-kind/spells-fetcher.cpp index 7d30b0c44..288b07903 100644 --- a/src/spell-kind/spells-fetcher.cpp +++ b/src/spell-kind/spells-fetcher.cpp @@ -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; diff --git a/src/system/monster-type-definition.h b/src/system/monster-type-definition.h index 709d434fc..18c0c86d7 100644 --- a/src/system/monster-type-definition.h +++ b/src/system/monster-type-definition.h @@ -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 - /*! * @brief Monster information, for a specific monster. * @Note @@ -40,7 +39,7 @@ typedef struct monster_type { EnumClassFlagGroup mflag{}; /*!< モンスター個体に与えられた特殊フラグ1 (セーブ不要) / Extra monster flags */ EnumClassFlagGroup mflag2{}; /*!< モンスター個体に与えられた特殊フラグ2 (セーブ必要) / Extra monster flags */ bool ml{}; /*!< モンスターがプレイヤーにとって視認できるか(処理のためのテンポラリ変数) Monster is "visible" */ - std::list 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 */ diff --git a/src/target/target-describer.cpp b/src/target/target-describer.cpp index 41eea2d0c..28d2fe81f 100644 --- a/src/target/target-describer.cpp +++ b/src/target/target-describer.cpp @@ -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(); } }