OSDN Git Service

[Refactor] #2694 object_value() とobject_value_base() をObjectTypeのオブジェクトメソッドとして繰り込んだ
authorHourier <66951241+Hourier@users.noreply.github.com>
Sun, 9 Oct 2022 04:34:49 +0000 (13:34 +0900)
committerHourier <66951241+Hourier@users.noreply.github.com>
Sun, 9 Oct 2022 06:40:09 +0000 (15:40 +0900)
18 files changed:
src/autopick/autopick-destroyer.cpp
src/autopick/autopick-matcher.cpp
src/cmd-item/cmd-destroy.cpp
src/inventory/inventory-object.cpp
src/load/store-loader.cpp
src/object/object-value.cpp
src/object/object-value.h
src/spell-realm/spells-sorcery.cpp
src/store/home.cpp
src/store/pricing.cpp
src/store/sell-order.cpp
src/store/service-checker.cpp
src/store/store-util.cpp
src/store/store.cpp
src/system/object-type-definition.cpp
src/system/object-type-definition.h
src/util/object-sort.cpp
src/wizard/items-spoiler.cpp

index 5f49811..163af23 100644 (file)
@@ -78,7 +78,7 @@ static bool is_opt_confirm_destroy(PlayerType *player_ptr, ObjectType *o_ptr)
     }
 
     if (leave_worth) {
-        if (object_value(o_ptr) > 0) {
+        if (o_ptr->object_value() > 0) {
             return false;
         }
     }
index 01dc7a3..6cfd22d 100644 (file)
@@ -89,7 +89,7 @@ bool is_autopick_match(PlayerType *player_ptr, ObjectType *o_ptr, autopick_type
         }
     }
 
-    if (IS_FLG(FLG_WORTHLESS) && object_value(o_ptr) > 0) {
+    if (IS_FLG(FLG_WORTHLESS) && (o_ptr->object_value() > 0)) {
         return false;
     }
 
index 252d868..33e67cb 100644 (file)
@@ -57,7 +57,7 @@ static destroy_type *initialize_destroy_type(destroy_type *destroy_ptr, ObjectTy
 
 static bool check_destory_item(PlayerType *player_ptr, destroy_type *destroy_ptr)
 {
-    if (destroy_ptr->force || (!confirm_destroy && (object_value(destroy_ptr->o_ptr) <= 0))) {
+    if (destroy_ptr->force || (!confirm_destroy && (destroy_ptr->o_ptr->object_value() <= 0))) {
         return true;
     }
 
index 2fe214a..e81ca28 100644 (file)
@@ -253,7 +253,7 @@ void reorder_pack(PlayerType *player_ptr)
             continue;
         }
 
-        o_value = object_value(o_ptr);
+        o_value = o_ptr->object_value();
         for (j = 0; j < INVEN_PACK; j++) {
             if (object_sort_comp(player_ptr, o_ptr, o_value, &player_ptr->inventory_list[j])) {
                 break;
@@ -335,7 +335,7 @@ int16_t store_item_to_inventory(PlayerType *player_ptr, ObjectType *o_ptr)
 
     i = j;
     if (i < INVEN_PACK) {
-        int32_t o_value = object_value(o_ptr);
+        const auto o_value = o_ptr->object_value();
         for (j = 0; j < INVEN_PACK; j++) {
             if (object_sort_comp(player_ptr, o_ptr, o_value, &player_ptr->inventory_list[j])) {
                 break;
index bab5b49..ad81b92 100644 (file)
@@ -43,7 +43,7 @@ static void home_carry_load(PlayerType *player_ptr, store_type *store_ptr, Objec
         return;
     }
 
-    auto value = object_value(o_ptr);
+    const auto value = o_ptr->object_value();
     int slot;
     for (slot = 0; slot < store_ptr->stock_num; slot++) {
         if (object_sort_comp(player_ptr, o_ptr, value, &store_ptr->stock[slot])) {
index 6031fce..afd29b8 100644 (file)
 #include "util/bit-flags-calculator.h"
 
 /*!
- * @brief 未鑑定なベースアイテムの基本価格を返す /
- * Return the "value" of an "unknown" item Make a guess at the value of non-aware items
- * @param o_ptr 未鑑定価格を確認したいオブジェクトの構造体参照ポインタ
- * @return オブジェクトの未鑑定価格
- */
-static PRICE object_value_base(const ObjectType *o_ptr)
-{
-    if (o_ptr->is_aware()) {
-        return k_info[o_ptr->k_idx].cost;
-    }
-
-    switch (o_ptr->tval) {
-    case ItemKindType::FOOD:
-        return 5;
-    case ItemKindType::POTION:
-        return 20;
-    case ItemKindType::SCROLL:
-        return 20;
-    case ItemKindType::STAFF:
-        return 70;
-    case ItemKindType::WAND:
-        return 50;
-    case ItemKindType::ROD:
-        return 90;
-    case ItemKindType::RING:
-        return 45;
-    case ItemKindType::AMULET:
-        return 45;
-    case ItemKindType::FIGURINE: {
-        auto figure_r_idx = i2enum<MonsterRaceId>(o_ptr->pval);
-        DEPTH level = r_info[figure_r_idx].level;
-        if (level < 20) {
-            return level * 50L;
-        } else if (level < 30) {
-            return 1000 + (level - 20) * 150;
-        } else if (level < 40) {
-            return 2500 + (level - 30) * 350;
-        } else if (level < 50) {
-            return 6000 + (level - 40) * 800;
-        } else {
-            return 14000 + (level - 50) * 2000;
-        }
-    }
-    case ItemKindType::CAPTURE: {
-        auto capture_r_idx = i2enum<MonsterRaceId>(o_ptr->pval);
-        if (!MonsterRace(capture_r_idx).is_valid()) {
-            return 1000;
-        } else {
-            return (r_info[capture_r_idx].level) * 50 + 1000;
-        }
-    }
-
-    default:
-        break;
-    }
-
-    return 0;
-}
-
-/*!
- * @brief オブジェクト価格算出のメインルーチン /
- * Return the price of an item including plusses (and charges)
- * @param o_ptr 判明している現価格を確認したいオブジェクトの構造体参照ポインタ
- * @return オブジェクトの判明している現価格
- * @details
- * This function returns the "value" of the given item (qty one)\n
- *\n
- * Never notice "unknown" bonuses or properties, including "curses",\n
- * since that would give the player information he did not have.\n
- *\n
- * Note that discounted items stay discounted forever, even if\n
- * the discount is "forgotten" by the player via memory loss.\n
- */
-PRICE object_value(const ObjectType *o_ptr)
-{
-    PRICE value;
-
-    if (o_ptr->is_known()) {
-        if (o_ptr->is_broken()) {
-            return 0;
-        }
-        if (o_ptr->is_cursed()) {
-            return 0;
-        }
-
-        value = object_value_real(o_ptr);
-    } else {
-        if ((o_ptr->ident & (IDENT_SENSE)) && o_ptr->is_broken()) {
-            return 0;
-        }
-        if ((o_ptr->ident & (IDENT_SENSE)) && o_ptr->is_cursed()) {
-            return 0;
-        }
-
-        value = object_value_base(o_ptr);
-    }
-
-    if (o_ptr->discount) {
-        value -= (value * o_ptr->discount / 100L);
-    }
-
-    return value;
-}
-
-/*!
  * @brief オブジェクトの真の価格を算出する /
  * Return the value of the flags the object has...
  * @param o_ptr 本価格を確認したいオブジェクトの構造体参照ポインタ
index c32fd7f..c2eca37 100644 (file)
@@ -4,5 +4,4 @@
 
 class ObjectType;
 class PlayerType;
-PRICE object_value(const ObjectType *o_ptr);
 PRICE object_value_real(const ObjectType *o_ptr);
index 359ee13..5272c1f 100644 (file)
@@ -51,7 +51,7 @@ bool alchemy(PlayerType *player_ptr)
     o_ptr->number = old_number;
 
     if (!force) {
-        if (confirm_destroy || (object_value(o_ptr) > 0)) {
+        if (confirm_destroy || (o_ptr->object_value() > 0)) {
             char out_val[MAX_NLEN + 40];
             sprintf(out_val, _("本当に%sを金に変えますか?", "Really turn %s to gold? "), o_name);
             if (!get_check(out_val)) {
index 55eb98b..04a199a 100644 (file)
@@ -67,7 +67,7 @@ int home_carry(PlayerType *player_ptr, ObjectType *o_ptr, StoreSaleType store_nu
         }
     }
 
-    PRICE value = object_value(o_ptr);
+    const auto value = o_ptr->object_value();
     int slot;
     for (slot = 0; slot < st_ptr->stock_num; slot++) {
         if (object_sort_comp(player_ptr, o_ptr, value, &st_ptr->stock[slot])) {
@@ -147,7 +147,7 @@ static void exe_reorder_store_item(PlayerType *player_ptr, bool *flag)
             continue;
         }
 
-        int32_t o_value = object_value(o_ptr);
+        const auto o_value = o_ptr->object_value();
         int j;
         for (j = 0; j < st_ptr->stock_num; j++) {
             if (object_sort_comp(player_ptr, o_ptr, o_value, &st_ptr->stock[j])) {
index b451c1a..70ee5f2 100644 (file)
@@ -33,7 +33,7 @@
  */
 PRICE price_item(PlayerType *player_ptr, ObjectType *o_ptr, int greed, bool flip, StoreSaleType store_num)
 {
-    PRICE price = object_value(o_ptr);
+    auto price = o_ptr->object_value();
     if (price <= 0) {
         return 0L;
     }
index 5778b73..5ae4c1a 100644 (file)
@@ -139,7 +139,7 @@ void store_sell(PlayerType *player_ptr, StoreSaleType store_num)
         auto res = prompt_to_sell(player_ptr, q_ptr, store_num);
         placed = res.has_value();
         if (placed) {
-            PRICE price = res.value();
+            const auto price = res.value();
             store_owner_says_comment(player_ptr, store_num);
 
             sound(SOUND_SELL);
@@ -153,7 +153,7 @@ void store_sell(PlayerType *player_ptr, StoreSaleType store_num)
 
             player_ptr->au += price;
             store_prt_gold(player_ptr);
-            PRICE dummy = object_value(q_ptr) * q_ptr->number;
+            const auto dummy = q_ptr->object_value() * q_ptr->number;
 
             identify_item(player_ptr, o_ptr);
             q_ptr = &forge;
@@ -165,7 +165,7 @@ void store_sell(PlayerType *player_ptr, StoreSaleType store_num)
                 q_ptr->pval = o_ptr->pval * amt / o_ptr->number;
             }
 
-            PRICE value = object_value(q_ptr) * q_ptr->number;
+            const auto value = q_ptr->object_value() * q_ptr->number;
             describe_flavor(player_ptr, o_name, q_ptr, 0);
             msg_format(_("%sを $%ldで売却しました。", "You sold %s for %ld gold."), o_name, static_cast<long>(price));
 
index 6644e01..9d8f6e7 100644 (file)
@@ -225,7 +225,7 @@ bool store_will_buy(PlayerType *, const ObjectType *o_ptr, StoreSaleType store_n
         return false;
     }
 
-    return object_value(o_ptr) > 0;
+    return o_ptr->object_value() > 0;
 }
 
 static int mass_lite_produce(const PRICE cost)
@@ -442,7 +442,7 @@ static byte decide_discount_rate(const PRICE cost)
  */
 void mass_produce(PlayerType *, ObjectType *o_ptr, StoreSaleType store_num)
 {
-    const PRICE cost = object_value(o_ptr);
+    const auto cost = o_ptr->object_value();
     int size = switch_mass_production(o_ptr, cost, store_num);
     auto discount = decide_discount_rate(cost);
     if (o_ptr->art_name) {
index ea742af..9227c05 100644 (file)
@@ -236,7 +236,7 @@ static void store_object_absorb(ObjectType *o_ptr, ObjectType *j_ptr)
  */
 int store_carry(ObjectType *o_ptr)
 {
-    PRICE value = object_value(o_ptr);
+    const auto value = o_ptr->object_value();
     if (value <= 0) {
         return -1;
     }
@@ -282,7 +282,7 @@ int store_carry(ObjectType *o_ptr)
             }
         }
 
-        PRICE j_value = object_value(j_ptr);
+        auto j_value = j_ptr->object_value();
         if (value > j_value) {
             break;
         }
index 0a9fb6a..225d3c3 100644 (file)
@@ -372,11 +372,11 @@ static void store_create(PlayerType *player_ptr, KIND_OBJECT_IDX fix_k_idx, Stor
         }
 
         if (store_num == StoreSaleType::BLACK) {
-            if (black_market_crap(player_ptr, q_ptr) || (object_value(q_ptr) < 10)) {
+            if (black_market_crap(player_ptr, q_ptr) || (q_ptr->object_value() < 10)) {
                 continue;
             }
         } else {
-            if (object_value(q_ptr) <= 0) {
+            if (q_ptr->object_value() <= 0) {
                 continue;
             }
         }
index 81af6b5..8437403 100644 (file)
@@ -15,6 +15,7 @@
 #include "object-enchant/trc-types.h"
 #include "object-enchant/trg-types.h"
 #include "object/object-flags.h"
+#include "object/object-value.h"
 #include "object/tval-types.h"
 #include "smith/object-smith.h"
 #include "sv-definition/sv-armor-types.h"
@@ -675,3 +676,95 @@ char ObjectType::get_symbol() const
     const auto flavor = base_item.flavor;
     return flavor ? k_info[flavor].x_char : base_item.x_char;
 }
+
+/*!
+ * @brief オブジェクト価格算出のメインルーチン
+ * @return オブジェクトの判明している現価格
+ */
+int ObjectType::object_value() const
+{
+    PRICE value;
+    if (this->is_known()) {
+        if (this->is_broken()) {
+            return 0;
+        }
+        if (this->is_cursed()) {
+            return 0;
+        }
+
+        value = object_value_real(this);
+    } else {
+        if ((this->ident & (IDENT_SENSE)) && this->is_broken()) {
+            return 0;
+        }
+        if ((this->ident & (IDENT_SENSE)) && this->is_cursed()) {
+            return 0;
+        }
+
+        value = this->object_value_base();
+    }
+
+    if (this->discount) {
+        value -= (value * this->discount / 100L);
+    }
+
+    return value;
+}
+
+/*!
+ * @brief 未鑑定なベースアイテムの基本価格を返す
+ * @return オブジェクトの未鑑定価格
+ */
+int ObjectType::object_value_base() const
+{
+    if (this->is_aware()) {
+        return k_info[this->k_idx].cost;
+    }
+
+    switch (this->tval) {
+    case ItemKindType::FOOD:
+        return 5;
+    case ItemKindType::POTION:
+        return 20;
+    case ItemKindType::SCROLL:
+        return 20;
+    case ItemKindType::STAFF:
+        return 70;
+    case ItemKindType::WAND:
+        return 50;
+    case ItemKindType::ROD:
+        return 90;
+    case ItemKindType::RING:
+        return 45;
+    case ItemKindType::AMULET:
+        return 45;
+    case ItemKindType::FIGURINE: {
+        auto figure_r_idx = i2enum<MonsterRaceId>(this->pval);
+        DEPTH level = r_info[figure_r_idx].level;
+        if (level < 20) {
+            return level * 50L;
+        } else if (level < 30) {
+            return 1000 + (level - 20) * 150;
+        } else if (level < 40) {
+            return 2500 + (level - 30) * 350;
+        } else if (level < 50) {
+            return 6000 + (level - 40) * 800;
+        } else {
+            return 14000 + (level - 50) * 2000;
+        }
+    }
+    case ItemKindType::CAPTURE: {
+        auto capture_r_idx = i2enum<MonsterRaceId>(this->pval);
+        if (!MonsterRace(capture_r_idx).is_valid()) {
+            return 1000;
+        } else {
+            return (r_info[capture_r_idx].level) * 50 + 1000;
+        }
+    }
+
+    default:
+        break;
+    }
+
+    return 0;
+}
index 677423a..3e3d4f6 100644 (file)
@@ -117,4 +117,8 @@ public:
     bool can_pile(const ObjectType *j_ptr) const;
     TERM_COLOR get_color() const;
     char get_symbol() const;
+    int object_value() const;
+
+private:
+    int object_value_base() const;
 };
index 793895c..55a8ede 100644 (file)
@@ -138,5 +138,5 @@ bool object_sort_comp(PlayerType *player_ptr, ObjectType *o_ptr, int32_t o_value
         break;
     }
 
-    return o_value > object_value(j_ptr);
+    return o_value > j_ptr->object_value();
 }
index 615ca90..7780a1a 100644 (file)
@@ -38,7 +38,7 @@ static void kind_info(PlayerType *player_ptr, char *buf, char *dam, char *wgt, c
     q_ptr->to_h = 0;
     q_ptr->to_d = 0;
     *lev = k_info[q_ptr->k_idx].level;
-    *val = object_value(q_ptr);
+    *val = q_ptr->object_value();
     if (!buf || !dam || !chance || !wgt) {
         return;
     }