OSDN Git Service

[Fix] サブウィンドウでアイテムの絞り込み対象を表示
authorHabu <habu1010+github@gmail.com>
Sat, 28 Aug 2021 10:15:08 +0000 (19:15 +0900)
committerHabu <habu1010+github@gmail.com>
Sat, 28 Aug 2021 10:16:42 +0000 (19:16 +0900)
ItemTester によるリファクタリング以前は、コマンドの対象となるアイテムの
選択記号だけがサブウィンドウに表示されるようになっていた。
グローバル変数の廃止によりこれが機能しなくなっていたので、サブウィンドウ
専用の ItemTester オブジェクトを用意してそれを適宜設定するようにする。
設定には専用のクラス FixItemTesterSetter を使用する。

src/core/window-redrawer.cpp
src/floor/floor-object.cpp
src/window/display-sub-windows.cpp
src/window/display-sub-windows.h

index 76823c9..5ec2ee9 100644 (file)
@@ -236,12 +236,12 @@ void window_stuff(player_type *player_ptr)
 
     if (window_flags & (PW_INVEN)) {
         player_ptr->window_flags &= ~(PW_INVEN);
-        fix_inventory(player_ptr, AllMatchItemTester());
+        fix_inventory(player_ptr);
     }
 
     if (window_flags & (PW_EQUIP)) {
         player_ptr->window_flags &= ~(PW_EQUIP);
-        fix_equip(player_ptr, AllMatchItemTester());
+        fix_equip(player_ptr);
     }
 
     if (window_flags & (PW_SPELL)) {
index eed94d7..70622ce 100644 (file)
@@ -41,6 +41,7 @@
 #include "target/projection-path-calculator.h"
 #include "util/bit-flags-calculator.h"
 #include "view/display-messages.h"
+#include "window/display-sub-windows.h"
 #include "wizard/wizard-messages.h"
 #include "world/world-object.h"
 #include "world/world.h"
@@ -591,6 +592,8 @@ object_type *choose_object(player_type *owner_ptr, OBJECT_IDX *idx, concptr q, c
     if (idx)
         *idx = INVEN_NONE;
 
+    FixItemTesterSetter setter(item_tester);
+
     if (!get_item(owner_ptr, &item, q, s, option, item_tester))
         return NULL;
 
index 4fabf99..6804679 100644 (file)
 #include <sstream>
 #include <string>
 
+/*! サブウィンドウ表示用の ItemTester オブジェクト */
+static std::unique_ptr<ItemTester> fix_item_tester = std::make_unique<AllMatchItemTester>();
+
+FixItemTesterSetter::FixItemTesterSetter(const ItemTester& item_tester)
+{
+    fix_item_tester = item_tester.clone();
+}
+
+FixItemTesterSetter::~FixItemTesterSetter()
+{
+    fix_item_tester = std::make_unique<AllMatchItemTester>();
+}
+
 /*!
  * @brief サブウィンドウに所持品一覧を表示する / Hack -- display inventory in sub-windows
  * @param player_ptr プレーヤーへの参照ポインタ
  */
-void fix_inventory(player_type *player_ptr, const ItemTester &item_tester)
+void fix_inventory(player_type *player_ptr)
 {
     for (int j = 0; j < 8; j++) {
         term_type *old = Term;
@@ -63,7 +76,7 @@ void fix_inventory(player_type *player_ptr, const ItemTester &item_tester)
             continue;
 
         term_activate(angband_term[j]);
-        display_inventory(player_ptr, item_tester);
+        display_inventory(player_ptr, *fix_item_tester);
         term_fresh();
         term_activate(old);
     }
@@ -291,7 +304,7 @@ static void display_equipment(player_type *owner_ptr, const ItemTester& item_tes
  * Hack -- display equipment in sub-windows
  * @param player_ptr プレーヤーへの参照ポインタ
  */
-void fix_equip(player_type *player_ptr, const ItemTester &item_tester)
+void fix_equip(player_type *player_ptr)
 {
     for (int j = 0; j < 8; j++) {
         term_type *old = Term;
@@ -301,7 +314,7 @@ void fix_equip(player_type *player_ptr, const ItemTester &item_tester)
             continue;
 
         term_activate(angband_term[j]);
-        display_equipment(player_ptr, item_tester);
+        display_equipment(player_ptr, *fix_item_tester);
         term_fresh();
         term_activate(old);
     }
index f204f39..b3445b1 100644 (file)
@@ -7,10 +7,10 @@
 typedef struct floor_type floor_type;
 typedef struct player_type player_type;
 class ItemTester;
-void fix_inventory(player_type *player_ptr, const ItemTester &item_tester);
+void fix_inventory(player_type *player_ptr);
 void print_monster_list(floor_type *floor_ptr, const std::vector<MONSTER_IDX> &monster_list, TERM_LEN x, TERM_LEN y, TERM_LEN max_lines);
 void fix_monster_list(player_type *player_ptr);
-void fix_equip(player_type *player_ptr, const ItemTester &item_tester);
+void fix_equip(player_type *player_ptr);
 void fix_player(player_type *player_ptr);
 void fix_message(void);
 void fix_overhead(player_type *player_ptr);
@@ -19,3 +19,24 @@ void fix_monster(player_type *player_ptr);
 void fix_object(player_type *player_ptr);
 void fix_floor_item_list(player_type *player_ptr, const int y, const int x);
 void toggle_inventory_equipment(player_type *owner_ptr);
+
+/*!
+ * @brief サブウィンドウ表示用の ItemTester オブジェクトを設定するクラス
+ *
+ * @details オブジェクトが生存している間コンストラクタで指定した ItemTester オブジェクトにより
+ * アイテム表示が絞り込まれるようになる。
+ * オブジェクトが破棄されるとデストラクタによりサブウィンドウ表示用 ItemTester オブジェクトは
+ * AllMatchItemTester(全てのアイテムを表示)のインスタンスがセットされる。
+ * なお、現状の仕様はアイテム表示の絞り込みとは、アイテムの先頭に表示されるアルファベットの
+ * 選択記号が表示されるか否かの違いであり、アイテムそのものの表示が絞り込まれるわけではない。
+ */
+class FixItemTesterSetter {
+public:
+    explicit FixItemTesterSetter(const ItemTester &item_tester);
+    ~FixItemTesterSetter();
+
+    FixItemTesterSetter(const FixItemTesterSetter &) = delete;
+    FixItemTesterSetter &operator=(const FixItemTesterSetter &) = delete;
+    FixItemTesterSetter(FixItemTesterSetter &&) = delete;
+    FixItemTesterSetter &operator=(FixItemTesterSetter &&) = delete;
+};