OSDN Git Service

[Refactor] store_typeのregularとtableをstd::vector化
authoriks <iks3@users.noreply.github.com>
Mon, 5 Apr 2021 15:24:17 +0000 (00:24 +0900)
committeriks <iks3@users.noreply.github.com>
Tue, 6 Apr 2021 15:21:54 +0000 (00:21 +0900)
src/market/building-initializer.cpp
src/store/store-util.cpp
src/store/store-util.h
src/store/store.cpp

index fc89f7e..7dfad36 100644 (file)
@@ -40,10 +40,7 @@ errr init_towns(void)
             if ((j == STORE_BLACK) || (j == STORE_HOME) || (j == STORE_MUSEUM))
                 continue;
 
-            store_ptr->regular_num = 0;
-            store_ptr->regular_size = STORE_INVEN_MAX;
-            C_MAKE(store_ptr->regular, store_ptr->regular_size + 1, KIND_OBJECT_IDX);
-            for (int k = 0; k < store_ptr->regular_size; k++) {
+            for (int k = 0; k < STORE_INVEN_MAX; k++) {
                 int tv = store_regular_table[j][k].tval;
                 int sv = store_regular_table[j][k].sval;
                 if (tv == 0)
@@ -54,13 +51,10 @@ errr init_towns(void)
                 if (k_idx == 0)
                     continue;
 
-                store_ptr->regular[store_ptr->regular_num++] = k_idx;
+                store_ptr->regular.push_back(k_idx);
             }
 
-            store_ptr->table_num = 0;
-            store_ptr->table_size = STORE_CHOICES;
-            C_MAKE(store_ptr->table, store_ptr->table_size + 1, KIND_OBJECT_IDX);
-            for (int k = 0; k < store_ptr->table_size; k++) {
+            for (int k = 0; k < STORE_CHOICES; k++) {
                 int tv = store_table[j][k].tval;
                 int sv = store_table[j][k].sval;
                 if (tv == 0)
@@ -71,7 +65,7 @@ errr init_towns(void)
                 if (k_idx == 0)
                     continue;
 
-                store_ptr->table[store_ptr->table_num++] = k_idx;
+                store_ptr->table.push_back(k_idx);
             }
         }
     }
index 9124f81..94d9b4a 100644 (file)
@@ -32,9 +32,8 @@ store_type *st_ptr = NULL;
  * Increase, by a given amount, the number of a certain item
  * in a certain store. This can result in zero items.
  * </pre>
- * @todo numは本来ITEM_NUMBER型にしたい。
  */
-void store_item_increase(INVENTORY_IDX item, int num)
+void store_item_increase(INVENTORY_IDX item, ITEM_NUMBER num)
 {
     object_type *o_ptr;
     o_ptr = &st_ptr->stock[item];
@@ -45,7 +44,7 @@ void store_item_increase(INVENTORY_IDX item, int num)
         cnt = 0;
 
     num = cnt - o_ptr->number;
-    o_ptr->number += (ITEM_NUMBER)num;
+    o_ptr->number += num;
 }
 
 /*!
@@ -127,7 +126,7 @@ void store_create(
             k_idx = fix_k_idx;
             level = rand_range(1, STORE_OBJ_LEVEL);
         } else {
-            k_idx = st_ptr->table[randint0(st_ptr->table_num)];
+            k_idx = st_ptr->table[randint0(st_ptr->table.size())];
             level = rand_range(1, STORE_OBJ_LEVEL);
         }
 
index c4f67df..2d6b1e2 100644 (file)
@@ -1,40 +1,44 @@
 #pragma once
 
 #include "system/angband.h"
+#include <vector>
 
-#define STORE_OBJ_LEVEL 5 /* Magic Level for normal stores */
+#define STORE_OBJ_LEVEL 5 //!< 通常店舗の階層レベル / Magic Level for normal stores
 
-#define STORE_GENERAL   0 /*!< 店舗の種類: 雑貨屋 */
-#define STORE_ARMOURY   1 /*!< 店舗の種類: 防具屋 */
-#define STORE_WEAPON    2 /*!< 店舗の種類: 武器屋 */
-#define STORE_TEMPLE    3 /*!< 店舗の種類: 寺院 */
-#define STORE_ALCHEMIST 4 /*!< 店舗の種類: 錬金術の店 */
-#define STORE_MAGIC     5 /*!< 店舗の種類: 魔道具屋 */
-#define STORE_BLACK     6 /*!< 店舗の種類: ブラック・マーケット */
-#define STORE_HOME      7 /*!< 店舗の種類: 我が家 */
-#define STORE_BOOK      8 /*!< 店舗の種類: 書店 */
-#define STORE_MUSEUM    9 /*!< 店舗の種類: 博物館 */
+enum STORE_TYPE_IDX {
+    STORE_GENERAL   = 0, //!< 店舗の種類: 雑貨屋
+    STORE_ARMOURY   = 1, //!< 店舗の種類: 防具屋
+    STORE_WEAPON    = 2, //!< 店舗の種類: 武器屋
+    STORE_TEMPLE    = 3, //!< 店舗の種類: 寺院
+    STORE_ALCHEMIST = 4, //!< 店舗の種類: 錬金術の店
+    STORE_MAGIC     = 5, //!< 店舗の種類: 魔道具屋
+    STORE_BLACK     = 6, //!< 店舗の種類: ブラック・マーケット
+    STORE_HOME      = 7, //!< 店舗の種類: 我が家
+    STORE_BOOK      = 8, //!< 店舗の種類: 書店
+    STORE_MUSEUM    = 9, //!< 店舗の種類: 博物館
+    STORE_MAX       = 10
+};
 
-typedef struct object_type object_type;
-typedef struct store_type {
-       byte type;                                /* Store type */
-       byte owner;                               /* Owner index */
      byte extra;                               /* Unused for now */
-       s16b insult_cur;                  /* Insult counter */
-       s16b good_buy;                    /* Number of "good" buys */
-       s16b bad_buy;                     /* Number of "bad" buys */
-       s32b store_open;                  /* Closed until this turn */
-       s32b last_visit;                  /* Last visited on this turn */
-    s16b regular_num;         /* Table -- Number of entries */
-    s16b regular_size;        /* Table -- Total Size of Array */
-    KIND_OBJECT_IDX *regular; /* Table -- Legal regular item kinds */
-    s16b table_num;           /* Table -- Number of entries */
-       s16b table_size;                  /* Table -- Total Size of Array */
-    KIND_OBJECT_IDX *table;   /* Table -- Legal item kinds */
-       s16b stock_num;                   /* Stock -- Number of entries */
-       s16b stock_size;                  /* Stock -- Total Size of Array */
-       object_type *stock;               /* Stock -- Actual stock items */
-} store_type;
+using store_k_idx = std::vector<KIND_OBJECT_IDX>;
+
+/*!
+ * @brief 店舗の情報構造体
+ */
+struct store_type {
+    byte type{};           //!< Store type
+    byte owner{};          //!< Owner index
+    byte extra{};          //!< Unused for now
+    s16b insult_cur{};     //!< Insult counter
+    s16b good_buy{};       //!< Number of "good" buys
+    s16b bad_buy{};        //!< Number of "bad" buys
+    s32b store_open{};     //!< Closed until this turn
+    s32b last_visit{};     //!< Last visited on this turn
+    store_k_idx regular{}; //!< Table -- Legal regular item kinds
+    store_k_idx table{};   //!< Table -- Legal item kinds
+    s16b stock_num{};      //!< Stock -- Number of entries
+    s16b stock_size{};     //!< Stock -- Total Size of Array
+    object_type *stock{};  //!< Stock -- Actual stock items
+};
 
 extern int cur_store_num;
 extern store_type *st_ptr;
@@ -44,7 +48,7 @@ typedef bool (*store_will_buy_pf)(player_type *, object_type *);
 typedef void (*mass_produce_pf)(player_type *, object_type *);
 void store_delete(void);
 void store_create(player_type *player_ptr, KIND_OBJECT_IDX k_idx, black_market_crap_pf black_market_crap, store_will_buy_pf store_will_buy, mass_produce_pf mass_produce);
-void store_item_increase(INVENTORY_IDX item, int num);
+void store_item_increase(INVENTORY_IDX item, ITEM_NUMBER num);
 void store_item_optimize(INVENTORY_IDX item);
 int store_carry(player_type *player_ptr, object_type *o_ptr);
 bool store_object_similar(object_type *o_ptr, object_type *j_ptr);
index 1d249e6..d5c4b15 100644 (file)
@@ -325,7 +325,7 @@ void store_maintenance(player_type *player_ptr, int town_num, int store_num, int
     if (j >= st_ptr->stock_size)
         j = st_ptr->stock_size - 1;
 
-    for (int k = 0; k < st_ptr->regular_num; k++) {
+    for (size_t k = 0; k < st_ptr->regular.size(); k++) {
         store_create(player_ptr, st_ptr->regular[k], black_market_crap, store_will_buy, mass_produce);
         if (st_ptr->stock_num >= STORE_MAX_KEEP)
             break;