OSDN Git Service

[Refactor] #3217 baseitems_info への直接アクセスを、ItemEntity::get_baseitem() に差し替えた
authorHourier <66951241+Hourier@users.noreply.github.com>
Sun, 30 Apr 2023 14:57:41 +0000 (23:57 +0900)
committerHourier <66951241+Hourier@users.noreply.github.com>
Mon, 1 May 2023 09:14:34 +0000 (18:14 +0900)
43 files changed:
src/artifact/artifact-info.cpp
src/artifact/fixed-art-generator.cpp
src/artifact/random-art-generator.cpp
src/autopick/autopick-entry.cpp
src/autopick/autopick-matcher.cpp
src/cmd-item/cmd-eat.cpp
src/cmd-item/cmd-magiceat.cpp
src/core/object-compressor.cpp
src/flavor/flavor-describer.cpp
src/flavor/flavor-util.cpp
src/flavor/named-item-describer.cpp
src/flavor/tval-description-switcher.cpp
src/floor/floor-events.cpp
src/inventory/recharge-processor.cpp
src/load/old/item-loader-savefile50.cpp
src/market/building-craft-fix.cpp
src/market/building-recharger.cpp
src/mind/mind-mage.cpp
src/monster-attack/monster-eating.cpp
src/object-activation/activation-util.cpp
src/object-enchant/item-magic-applier.cpp
src/object-enchant/object-boost.cpp
src/object-enchant/others/apply-magic-amulet.cpp
src/object-enchant/others/apply-magic-others.cpp
src/object-enchant/others/apply-magic-ring.cpp
src/object-use/quaff/quaff-execution.cpp
src/object-use/read/read-execution.cpp
src/object-use/use-execution.cpp
src/object-use/zaprod-execution.cpp
src/object-use/zapwand-execution.cpp
src/object/object-flags.cpp
src/object/object-stack.cpp
src/object/object-value-calc.cpp
src/object/object-value.cpp
src/perception/identification.cpp
src/perception/object-perception.cpp
src/racial/racial-android.cpp
src/spell-kind/magic-item-recharger.cpp
src/store/store-util.cpp
src/system/item-entity.cpp
src/system/item-entity.h
src/wizard/items-spoiler.cpp
src/wizard/wizard-item-modifier.cpp

index 51434d4..4f056b0 100644 (file)
@@ -42,8 +42,11 @@ RandomArtActType activation_index(const ItemEntity *o_ptr)
         }
     }
 
-    if (!o_ptr->is_random_artifact() && baseitems_info[o_ptr->bi_id].flags.has(TR_ACTIVATE)) {
-        return baseitems_info[o_ptr->bi_id].act_idx;
+    if (!o_ptr->is_random_artifact()) {
+        const auto &baseitem = o_ptr->get_baseitem();
+        if (baseitem.flags.has(TR_ACTIVATE)) {
+            return baseitem.act_idx;
+        }
     }
 
     return o_ptr->activation_id;
index 0a00e6d..bced79b 100644 (file)
@@ -400,8 +400,9 @@ bool make_artifact_special(PlayerType *player_ptr, ItemEntity *o_ptr)
          * ベースアイテムの生成階層が足りない場合1/(不足階層*5)を満たさないと除外される。
          */
         const auto bi_id = lookup_baseitem_id(artifact.bi_key);
-        if (baseitems_info[bi_id].level > floor_ptr->object_level) {
-            int d = (baseitems_info[bi_id].level - floor_ptr->object_level) * 5;
+        const auto &baseitem = baseitems_info[bi_id];
+        if (baseitem.level > floor_ptr->object_level) {
+            int d = (baseitem.level - floor_ptr->object_level) * 5;
             if (!one_in_(d)) {
                 continue;
             }
index 8a123fa..38ccb4b 100644 (file)
@@ -44,8 +44,7 @@
 
 static bool weakening_artifact(ItemEntity *o_ptr)
 {
-    const auto bi_id = lookup_baseitem_id(o_ptr->bi_key);
-    const auto &baseitem = baseitems_info[bi_id];
+    const auto &baseitem = o_ptr->get_baseitem();
     auto flags = object_flags(o_ptr);
 
     if (flags.has(TR_KILL_EVIL)) {
@@ -437,7 +436,7 @@ bool become_random_artifact(PlayerType *player_ptr, ItemEntity *o_ptr, bool a_sc
     o_ptr->artifact_bias = 0;
     o_ptr->fixed_artifact_idx = FixedArtifactId::NONE;
     o_ptr->ego_idx = EgoType::NONE;
-    o_ptr->art_flags |= baseitems_info[o_ptr->bi_id].flags;
+    o_ptr->art_flags |= o_ptr->get_baseitem().flags;
 
     bool has_pval = o_ptr->pval != 0;
     decide_warrior_bias(player_ptr, o_ptr, a_scroll);
index 95f5339..3526fc0 100644 (file)
@@ -406,7 +406,7 @@ void autopick_entry_from_object(PlayerType *player_ptr, autopick_type *entry, It
     }
 
     if (o_ptr->is_melee_weapon()) {
-        const auto &baseitem = baseitems_info[o_ptr->bi_id];
+        const auto &baseitem = o_ptr->get_baseitem();
         if ((o_ptr->dd != baseitem.dd) || (o_ptr->ds != baseitem.ds)) {
             ADD_FLG(FLG_BOOSTED);
         }
index 394eca1..a7b2500 100644 (file)
@@ -153,7 +153,7 @@ bool is_autopick_match(PlayerType *player_ptr, ItemEntity *o_ptr, const autopick
             return false;
         }
 
-        const auto &baseitem = baseitems_info[o_ptr->bi_id];
+        const auto &baseitem = o_ptr->get_baseitem();
         if ((o_ptr->dd == baseitem.dd) && (o_ptr->ds == baseitem.ds)) {
             return false;
         }
index cb019a1..f09355c 100644 (file)
@@ -227,9 +227,7 @@ void exe_eat_food(PlayerType *player_ptr, INVENTORY_IDX item)
     sound(SOUND_EAT);
 
     PlayerEnergy(player_ptr).set_player_turn_energy(100);
-
-    /* Object level */
-    int lev = baseitems_info[o_ptr->bi_id].level;
+    const auto lev = o_ptr->get_baseitem().level;
 
     /* Identity not known yet */
     const auto &bi_key = o_ptr->bi_key;
index 6d66c6c..2bd675e 100644 (file)
@@ -308,7 +308,8 @@ static std::optional<BaseitemKey> select_magic_eater(PlayerType *player_ptr, boo
                 }
                 x1 = ((ctr < ITEM_GROUP_SIZE / 2) ? x : x + 40);
                 y1 = ((ctr < ITEM_GROUP_SIZE / 2) ? y + ctr : y + ctr - ITEM_GROUP_SIZE / 2);
-                level = (tval == ItemKindType::ROD ? baseitems_info[bi_id].level * 5 / 6 - 5 : baseitems_info[bi_id].level);
+                const auto &baseitem = baseitems_info[bi_id];
+                level = (tval == ItemKindType::ROD ? baseitem.level * 5 / 6 - 5 : baseitem.level);
                 chance = level * 4 / 5 + 20;
                 chance -= 3 * (adj_mag_stat[player_ptr->stat_index[mp_ptr->spell_stat]] - 1);
                 level /= 2;
@@ -330,16 +331,16 @@ static std::optional<BaseitemKey> select_magic_eater(PlayerType *player_ptr, boo
                 if (bi_id) {
                     if (tval == ItemKindType::ROD) {
                         dummy.append(
-                            format(_(" %-22.22s 充填:%2d/%2d%3d%%", " %-22.22s   (%2d/%2d) %3d%%"), baseitems_info[bi_id].name.data(),
-                                item.charge ? (item.charge - 1) / (EATER_ROD_CHARGE * baseitems_info[bi_id].pval) + 1 : 0,
+                            format(_(" %-22.22s 充填:%2d/%2d%3d%%", " %-22.22s   (%2d/%2d) %3d%%"), baseitem.name.data(),
+                                item.charge ? (item.charge - 1) / (EATER_ROD_CHARGE * baseitem.pval) + 1 : 0,
                                 item.count, chance)
                                 .data());
-                        if (item.charge > baseitems_info[bi_id].pval * (item.count - 1) * EATER_ROD_CHARGE) {
+                        if (item.charge > baseitem.pval * (item.count - 1) * EATER_ROD_CHARGE) {
                             col = TERM_RED;
                         }
                     } else {
                         dummy.append(
-                            format(" %-22.22s    %2d/%2d %3d%%", baseitems_info[bi_id].name.data(), (int16_t)(item.charge / EATER_CHARGE),
+                            format(" %-22.22s    %2d/%2d %3d%%", baseitem.name.data(), (int16_t)(item.charge / EATER_CHARGE),
                                 item.count, chance)
                                 .data());
                         if (item.charge < EATER_CHARGE) {
@@ -545,10 +546,11 @@ bool do_cmd_magic_eater(PlayerType *player_ptr, bool only_browse, bool powerful)
         energy.reset_player_turn();
         return false;
     }
-    auto &baseitem = result.value();
+    auto &bi_key = result.value();
 
-    auto bi_id = lookup_baseitem_id(baseitem);
-    auto level = (baseitem.tval() == ItemKindType::ROD ? baseitems_info[bi_id].level * 5 / 6 - 5 : baseitems_info[bi_id].level);
+    const auto bi_id = lookup_baseitem_id(bi_key);
+    const auto &baseitem = baseitems_info[bi_id];
+    auto level = (bi_key.tval() == ItemKindType::ROD ? baseitem.level * 5 / 6 - 5 : baseitem.level);
     auto chance = level * 4 / 5 + 20;
     chance -= 3 * (adj_mag_stat[player_ptr->stat_index[mp_ptr->spell_stat]] - 1);
     level /= 2;
@@ -581,14 +583,14 @@ bool do_cmd_magic_eater(PlayerType *player_ptr, bool only_browse, bool powerful)
     } else {
         DIRECTION dir = 0;
 
-        switch (baseitem.tval()) {
+        switch (bi_key.tval()) {
         case ItemKindType::ROD: {
-            const auto sval = baseitem.sval();
+            const auto sval = bi_key.sval();
             if (!sval.has_value()) {
                 return false;
             }
 
-            if (baseitem.is_aiming_rod() && !get_aim_dir(player_ptr, &dir)) {
+            if (bi_key.is_aiming_rod() && !get_aim_dir(player_ptr, &dir)) {
                 return false;
             }
 
@@ -600,7 +602,7 @@ bool do_cmd_magic_eater(PlayerType *player_ptr, bool only_browse, bool powerful)
             break;
         }
         case ItemKindType::WAND: {
-            const auto sval = baseitem.sval();
+            const auto sval = bi_key.sval();
             if (!sval.has_value()) {
                 return false;
             }
@@ -613,7 +615,7 @@ bool do_cmd_magic_eater(PlayerType *player_ptr, bool only_browse, bool powerful)
             break;
         }
         default:
-            const auto sval = baseitem.sval();
+            const auto sval = bi_key.sval();
             if (!sval.has_value()) {
                 return false;
             }
@@ -632,18 +634,18 @@ bool do_cmd_magic_eater(PlayerType *player_ptr, bool only_browse, bool powerful)
     }
 
     auto magic_eater_data = PlayerClass(player_ptr).get_specific_data<magic_eater_data_type>();
-    const auto opt_sval = baseitem.sval();
+    const auto opt_sval = bi_key.sval();
     if (!opt_sval.has_value()) {
         return false;
     }
 
-    const auto tval = baseitem.tval();
+    const auto tval = bi_key.tval();
     const auto sval = opt_sval.value();
     auto &item = magic_eater_data->get_item_group(tval)[sval];
 
     energy.set_player_turn_energy(100);
     if (tval == ItemKindType::ROD) {
-        item.charge += baseitems_info[bi_id].pval * EATER_ROD_CHARGE;
+        item.charge += baseitem.pval * EATER_ROD_CHARGE;
     } else {
         item.charge -= EATER_CHARGE;
     }
index 1c9731a..1479602 100644 (file)
@@ -67,7 +67,7 @@ void compact_objects(PlayerType *player_ptr, int size)
         for (OBJECT_IDX i = 1; i < floor_ptr->o_max; i++) {
             o_ptr = &floor_ptr->o_list[i];
 
-            if (!o_ptr->is_valid() || (baseitems_info[o_ptr->bi_id].level > cur_lev)) {
+            if (!o_ptr->is_valid() || (o_ptr->get_baseitem().level > cur_lev)) {
                 continue;
             }
 
index 25d5748..846efd2 100644 (file)
@@ -130,7 +130,7 @@ static bool should_show_slaying_bonus(const ItemEntity &item)
     }
 
     if (item.bi_key.tval() == ItemKindType::RING) {
-        const auto &baseitem = baseitems_info[item.bi_id];
+        const auto &baseitem = item.get_baseitem();
         const auto base_has_no_bonus = (baseitem.to_h == 0) && (baseitem.to_d == 0);
         const auto item_has_bonus = (item.to_h != 0) || (item.to_d != 0);
         if ((base_has_no_bonus && item_has_bonus) || (item.bi_key.sval() == SV_RING_LAW)) {
@@ -345,7 +345,7 @@ static std::string describe_charges_rod(const ItemEntity &item)
         return _("(充填中)", " (charging)");
     }
 
-    const auto timeout_per_one = baseitems_info[item.bi_id].pval;
+    const auto timeout_per_one = item.get_baseitem().pval;
     auto num_of_charging = (item.timeout + (timeout_per_one - 1)) / timeout_per_one;
     if (num_of_charging > item.number) {
         num_of_charging = item.number;
index 224ce48..52efca0 100644 (file)
@@ -71,7 +71,7 @@ std::string get_ability_abbreviation(const ItemEntity &item, bool is_kanji, bool
 {
     auto flags = object_flags(&item);
     if (!all) {
-        const auto &baseitem = baseitems_info[item.bi_id];
+        const auto &baseitem = item.get_baseitem();
         flags.reset(baseitem.flags);
 
         if (item.is_fixed_artifact()) {
index f2492e5..725d5f3 100644 (file)
@@ -34,7 +34,7 @@ static std::string get_fullname_if_set(const ItemEntity &item, const describe_op
 
     const auto fixed_art_id = item.fixed_artifact_idx;
     const auto is_known_artifact = opt.known && item.is_fixed_artifact() && none_bits(opt.mode, OD_BASE_NAME);
-    return is_known_artifact ? ArtifactsInfo::get_instance().get_artifact(fixed_art_id).name : baseitems_info[item.bi_id].name;
+    return is_known_artifact ? ArtifactsInfo::get_instance().get_artifact(fixed_art_id).name : item.get_baseitem().name;
 }
 
 #ifdef JP
@@ -353,11 +353,12 @@ static std::string describe_body(const ItemEntity &item, [[maybe_unused]] const
             ss << modstr;
             break;
 
-        case '%':
+        case '%': {
+            const auto &baseitem = item.get_baseitem();
 #ifdef JP
-            ss << baseitems_info[item.bi_id].name;
+            ss << baseitem.name;
 #else
-            for (auto ib = baseitems_info[item.bi_id].name.begin(), ib_end = baseitems_info[item.bi_id].name.end(); ib != ib_end; ++ib) {
+            for (auto ib = baseitem.name.begin(), ib_end = baseitem.name.end(); ib != ib_end; ++ib) {
                 if (*ib == '~') {
                     pluralize(ss, ib);
                 } else {
@@ -366,6 +367,7 @@ static std::string describe_body(const ItemEntity &item, [[maybe_unused]] const
             }
 #endif
             break;
+        }
 
 #ifndef JP
         case '~':
index c334e80..16d4acc 100644 (file)
@@ -24,7 +24,7 @@
 
 static std::pair<std::string, std::string> describe_monster_ball(const ItemEntity &item, const describe_option_type &opt)
 {
-    const auto &basename = baseitems_info[item.bi_id].name;
+    const auto &basename = item.get_baseitem().name;
     const auto r_idx = i2enum<MonsterRaceId>(item.pval);
     auto *r_ptr = &monraces_info[r_idx];
     if (!opt.known) {
@@ -50,7 +50,7 @@ static std::pair<std::string, std::string> describe_monster_ball(const ItemEntit
 
 static std::pair<std::string, std::string> describe_statue(const ItemEntity &item)
 {
-    const auto &basename = baseitems_info[item.bi_id].name;
+    const auto &basename = item.get_baseitem().name;
     const auto r_idx = i2enum<MonsterRaceId>(item.pval);
     auto *r_ptr = &monraces_info[r_idx];
 #ifdef JP
@@ -96,7 +96,7 @@ static std::pair<std::string, std::string> describe_corpse(const ItemEntity &ite
  */
 static std::string flavor_name_of(const ItemEntity &item, const describe_option_type &opt)
 {
-    const auto &baseitem = baseitems_info[item.bi_id];
+    const auto &baseitem = item.get_baseitem();
     return any_bits(opt.mode, OD_FORCE_FLAVOR)
                ? baseitem.flavor_name
                : baseitems_info[baseitem.flavor].flavor_name;
@@ -104,7 +104,7 @@ static std::string flavor_name_of(const ItemEntity &item, const describe_option_
 
 static std::pair<std::string, std::string> describe_amulet(const ItemEntity &item, const describe_option_type &opt)
 {
-    const auto &baseitem = baseitems_info[item.bi_id];
+    const auto &baseitem = item.get_baseitem();
     if (opt.aware && (item.is_fixed_artifact() || baseitem.gen_flags.has(ItemGenerationTraitType::INSTA_ART))) {
         return { baseitem.name, "" };
     }
@@ -120,7 +120,7 @@ static std::pair<std::string, std::string> describe_amulet(const ItemEntity &ite
 
 static std::pair<std::string, std::string> describe_ring(const ItemEntity &item, const describe_option_type &opt)
 {
-    const auto &baseitem = baseitems_info[item.bi_id];
+    const auto &baseitem = item.get_baseitem();
     if (opt.aware && (item.is_fixed_artifact() || baseitem.gen_flags.has(ItemGenerationTraitType::INSTA_ART))) {
         return { baseitem.name, "" };
     }
@@ -191,7 +191,7 @@ static std::pair<std::string, std::string> describe_potion(const ItemEntity &ite
 
 static std::pair<std::string, std::string> describe_food(const ItemEntity &item, const describe_option_type &opt)
 {
-    const auto &baseitem = baseitems_info[item.bi_id];
+    const auto &baseitem = item.get_baseitem();
     if (baseitem.flavor_name.empty()) {
         return { baseitem.name, "" };
     }
@@ -360,7 +360,7 @@ static std::pair<std::string, std::string> describe_book_hex()
  */
 std::pair<std::string, std::string> switch_tval_description(const ItemEntity &item, const describe_option_type &opt)
 {
-    const auto &basename = baseitems_info[item.bi_id].name;
+    const auto &basename = item.get_baseitem().name;
 
     switch (item.bi_key.tval()) {
     case ItemKindType::NONE:
index dabf24d..055315d 100644 (file)
@@ -217,7 +217,7 @@ static byte get_dungeon_feeling(PlayerType *player_ptr)
             delta += 15 * base;
         }
 
-        const auto &baseitem = baseitems_info[o_ptr->bi_id];
+        const auto &baseitem = o_ptr->get_baseitem();
         if (!o_ptr->is_cursed() && !o_ptr->is_broken() && baseitem.level > floor_ptr->dun_level) {
             delta += (baseitem.level - floor_ptr->dun_level) * base;
         }
index fc3a709..e318bc5 100644 (file)
@@ -83,7 +83,7 @@ void recharge_magic_items(PlayerType *player_ptr)
      */
     for (changed = false, i = 0; i < INVEN_PACK; i++) {
         auto *o_ptr = &player_ptr->inventory_list[i];
-        const auto &baseitem = baseitems_info[o_ptr->bi_id];
+        const auto &baseitem = o_ptr->get_baseitem();
         if (!o_ptr->is_valid()) {
             continue;
         }
index a3cc6fa..e735d24 100644 (file)
@@ -34,7 +34,7 @@ void ItemLoader50::rd_item(ItemEntity *o_ptr)
     o_ptr->bi_id = rd_s16b();
     o_ptr->iy = rd_byte();
     o_ptr->ix = rd_byte();
-    auto &baseitem = baseitems_info[o_ptr->bi_id];
+    auto &baseitem = o_ptr->get_baseitem();
     o_ptr->bi_key = baseitem.bi_key;
     o_ptr->pval = any_bits(flags, SaveDataItemFlagType::PVAL) ? rd_s16b() : 0;
     o_ptr->discount = any_bits(flags, SaveDataItemFlagType::DISCOUNT) ? rd_byte() : 0;
index 2898131..3951639 100644 (file)
@@ -223,10 +223,12 @@ static PRICE repair_broken_weapon_aux(PlayerType *player_ptr, PRICE bcost)
         }
     }
 
-    auto dd_bonus = o_ptr->dd - baseitems_info[o_ptr->bi_id].dd;
-    auto ds_bonus = o_ptr->ds - baseitems_info[o_ptr->bi_id].ds;
-    dd_bonus += mo_ptr->dd - baseitems_info[mo_ptr->bi_id].dd;
-    ds_bonus += mo_ptr->ds - baseitems_info[mo_ptr->bi_id].ds;
+    const auto &baseitem_o = o_ptr->get_baseitem();
+    const auto &baseitem_mo = mo_ptr->get_baseitem();
+    auto dd_bonus = o_ptr->dd - baseitem_o.dd;
+    auto ds_bonus = o_ptr->ds - baseitem_o.ds;
+    dd_bonus += mo_ptr->dd - baseitem_mo.dd;
+    ds_bonus += mo_ptr->ds - baseitem_mo.ds;
 
     const auto &baseitem = baseitems_info[bi_id];
     o_ptr->bi_id = bi_id;
index 6f32652..b268307 100644 (file)
@@ -63,7 +63,7 @@ void building_recharge(PlayerType *player_ptr)
         return;
     }
 
-    const auto &baseitem = baseitems_info[o_ptr->bi_id];
+    const auto &baseitem = o_ptr->get_baseitem();
     const auto lev = baseitem.level;
     const auto tval = o_ptr->bi_key.tval();
     int price;
@@ -186,19 +186,19 @@ void building_recharge_all(PlayerType *player_ptr)
             total_cost += 50;
         }
 
-        const auto lev = baseitems_info[item.bi_id].level;
-        const auto &baseitem = baseitems_info[item.bi_id];
+        const auto &baseitem = item.get_baseitem();
+        const auto lev = baseitem.level;
         switch (item.bi_key.tval()) {
         case ItemKindType::ROD:
             price = (lev * 50 * item.timeout) / baseitem.pval;
             break;
         case ItemKindType::STAFF:
-            price = (baseitems_info[item.bi_id].cost / 10) * item.number;
+            price = (baseitem.cost / 10) * item.number;
             price = std::max(10, price);
             price = (baseitem.pval - item.pval) * price;
             break;
         case ItemKindType::WAND:
-            price = (baseitems_info[item.bi_id].cost / 10);
+            price = (baseitem.cost / 10);
             price = std::max(10, price);
             price = (item.number * baseitem.pval - item.pval) * price;
             break;
@@ -229,7 +229,7 @@ void building_recharge_all(PlayerType *player_ptr)
 
     for (short i = 0; i < INVEN_PACK; i++) {
         auto *o_ptr = &player_ptr->inventory_list[i];
-        const auto &baseitem = baseitems_info[o_ptr->bi_id];
+        const auto &baseitem = o_ptr->get_baseitem();
         if (!o_ptr->can_recharge()) {
             continue;
         }
index 9ee6ed4..04c1e61 100644 (file)
@@ -37,7 +37,7 @@ bool eat_magic(PlayerType *player_ptr, int power)
         return false;
     }
 
-    const auto &baseitem = baseitems_info[o_ptr->bi_id];
+    const auto &baseitem = o_ptr->get_baseitem();
     const auto lev = baseitem.level;
     const auto tval = o_ptr->bi_key.tval();
     auto recharge_strength = 0;
index 2dbd3d2..9dd8dc1 100644 (file)
@@ -228,7 +228,7 @@ bool process_un_power(PlayerType *player_ptr, MonsterAttackPlayer *monap_ptr)
     }
 
     const auto is_magic_mastery = has_magic_mastery(player_ptr) != 0;
-    const auto &baseitem = baseitems_info[monap_ptr->o_ptr->bi_id];
+    const auto &baseitem = monap_ptr->o_ptr->get_baseitem();
     const auto pval = baseitem.pval;
     const auto level = monap_ptr->rlev;
     auto drain = is_magic_mastery ? std::min<short>(pval, pval * level / 400 + pval * randint1(level) / 400) : pval;
index 13067e4..ca1726f 100644 (file)
@@ -7,6 +7,6 @@
 ae_type *initialize_ae_type(PlayerType *player_ptr, ae_type *ae_ptr, const INVENTORY_IDX item)
 {
     ae_ptr->o_ptr = ref_item(player_ptr, item);
-    ae_ptr->lev = baseitems_info[ae_ptr->o_ptr->bi_id].level;
+    ae_ptr->lev = ae_ptr->o_ptr->get_baseitem().level;
     return ae_ptr;
 }
index 2759f02..360cfd4 100644 (file)
@@ -196,8 +196,8 @@ void ItemMagicApplier::apply_cursed()
         return;
     }
 
-    const auto &baseitem = baseitems_info[this->o_ptr->bi_id];
-    if (!baseitems_info[this->o_ptr->bi_id].cost) {
+    const auto &baseitem = this->o_ptr->get_baseitem();
+    if (!baseitem.cost) {
         set_bits(this->o_ptr->ident, IDENT_BROKEN);
     }
 
index e1165e9..d0cf647 100644 (file)
@@ -598,7 +598,7 @@ void one_lordly_high_resistance(ItemEntity *o_ptr)
  */
 void make_weight_ligten(ItemEntity *o_ptr)
 {
-    o_ptr->weight = (2 * baseitems_info[o_ptr->bi_id].weight / 3);
+    o_ptr->weight = (2 * o_ptr->get_baseitem().weight / 3);
 }
 
 /*!
@@ -607,7 +607,7 @@ void make_weight_ligten(ItemEntity *o_ptr)
  */
 void make_weight_heavy(ItemEntity *o_ptr)
 {
-    o_ptr->weight = (4 * baseitems_info[o_ptr->bi_id].weight / 3);
+    o_ptr->weight = (4 * o_ptr->get_baseitem().weight / 3);
 }
 
 /*!
index 0b933b9..290c277 100644 (file)
@@ -157,7 +157,7 @@ void AmuletEnchanter::sval_enchant()
 void AmuletEnchanter::give_ego_index()
 {
     while (!this->o_ptr->is_ego()) {
-        const auto &baseitem = baseitems_info[this->o_ptr->bi_id];
+        const auto &baseitem = this->o_ptr->get_baseitem();
         switch (randint1(21)) {
         case 1:
         case 2:
@@ -351,7 +351,7 @@ void AmuletEnchanter::give_cursed()
     }
 
     while (!this->o_ptr->is_ego()) {
-        const auto &baseitem = baseitems_info[this->o_ptr->bi_id];
+        const auto &baseitem = this->o_ptr->get_baseitem();
         switch (randint1(5)) {
         case 1:
             if (baseitem.flags.has(TR_DRAIN_EXP)) {
index 8cf1729..004de6c 100644 (file)
@@ -60,7 +60,7 @@ void OtherItemsEnchanter::apply_magic()
         this->enchant_wand_staff();
         break;
     case ItemKindType::ROD:
-        this->o_ptr->pval = baseitems_info[this->o_ptr->bi_id].pval;
+        this->o_ptr->pval = this->o_ptr->get_baseitem().pval;
         break;
     case ItemKindType::CAPTURE:
         this->o_ptr->pval = 0;
@@ -91,7 +91,7 @@ void OtherItemsEnchanter::apply_magic()
  */
 void OtherItemsEnchanter::enchant_wand_staff()
 {
-    const auto &baseitem = baseitems_info[this->o_ptr->bi_id];
+    const auto &baseitem = this->o_ptr->get_baseitem();
     this->o_ptr->pval = baseitem.pval / 2 + randint1((baseitem.pval + 1) / 2);
 }
 
@@ -199,7 +199,7 @@ void OtherItemsEnchanter::generate_statue()
  */
 void OtherItemsEnchanter::generate_chest()
 {
-    auto obj_level = baseitems_info[this->o_ptr->bi_id].level;
+    auto obj_level = this->o_ptr->get_baseitem().level;
     if (obj_level <= 0) {
         return;
     }
index d0a1c27..e42327a 100644 (file)
@@ -233,7 +233,7 @@ void RingEnchanter::give_ego_index()
 {
     while (!this->o_ptr->is_ego()) {
         int tmp = m_bonus(10, this->level);
-        const auto &baseitem = baseitems_info[this->o_ptr->bi_id];
+        const auto &baseitem = this->o_ptr->get_baseitem();
         switch (randint1(28)) {
         case 1:
         case 2:
@@ -511,7 +511,7 @@ void RingEnchanter::give_cursed()
     }
 
     while (!this->o_ptr->is_ego()) {
-        const auto &baseitem = baseitems_info[this->o_ptr->bi_id];
+        const auto &baseitem = this->o_ptr->get_baseitem();
         switch (randint1(5)) {
         case 1:
             if (baseitem.flags.has(TR_DRAIN_EXP)) {
index f5b4320..920076d 100644 (file)
@@ -66,7 +66,7 @@ void ObjectQuaffEntity::execute(INVENTORY_IDX item)
     object_tried(&o_ref);
     if (ident && !o_ref.is_aware()) {
         object_aware(this->player_ptr, &o_ref);
-        gain_exp(this->player_ptr, (baseitems_info[o_ref.bi_id].level + (this->player_ptr->lev >> 1)) / this->player_ptr->lev);
+        gain_exp(this->player_ptr, (o_ref.get_baseitem().level + (this->player_ptr->lev >> 1)) / this->player_ptr->lev);
     }
 
     this->player_ptr->window_flags |= (PW_INVENTORY | PW_EQUIPMENT | PW_PLAYER);
index ff36caa..06c6273 100644 (file)
@@ -108,6 +108,6 @@ void ObjectReadEntity::gain_exp_from_item_use(ItemEntity *o_ptr, bool is_identif
     }
 
     object_aware(this->player_ptr, o_ptr);
-    auto lev = baseitems_info[o_ptr->bi_id].level;
+    auto lev = o_ptr->get_baseitem().level;
     gain_exp(this->player_ptr, (lev + (this->player_ptr->lev >> 1)) / this->player_ptr->lev);
 }
index ef68adf..8f8f552 100644 (file)
@@ -59,7 +59,7 @@ void ObjectUseEntity::execute()
         return;
     }
 
-    auto lev = baseitems_info[o_ptr->bi_id].level;
+    auto lev = o_ptr->get_baseitem().level;
     if (lev > 50) {
         lev = 50 + (lev - 50) / 2;
     }
index 6514359..862ca27 100644 (file)
@@ -64,7 +64,7 @@ void ObjectZapRodEntity::execute(INVENTORY_IDX item)
         return;
     }
 
-    auto lev = baseitems_info[o_ptr->bi_id].level;
+    auto lev = o_ptr->get_baseitem().level;
     auto chance = this->player_ptr->skill_dev;
     if (this->player_ptr->effects()->confusion()->is_confused()) {
         chance = chance / 2;
@@ -104,7 +104,7 @@ void ObjectZapRodEntity::execute(INVENTORY_IDX item)
         return;
     }
 
-    const auto &baseitem = baseitems_info[o_ptr->bi_id];
+    const auto &baseitem = o_ptr->get_baseitem();
     if ((o_ptr->number == 1) && (o_ptr->timeout)) {
         if (flush_failure) {
             flush();
index c99301b..f2ae33f 100644 (file)
@@ -63,7 +63,7 @@ void ObjectZapWandEntity::execute(INVENTORY_IDX item)
         return;
     }
 
-    auto lev = baseitems_info[o_ptr->bi_id].level;
+    auto lev = o_ptr->get_baseitem().level;
     if (lev > 50) {
         lev = 50 + (lev - 50) / 2;
     }
index 9badd08..4ce1a94 100644 (file)
@@ -52,7 +52,7 @@ static void modify_ego_lite_flags(const ItemEntity *o_ptr, TrFlags &flags)
  */
 TrFlags object_flags(const ItemEntity *o_ptr)
 {
-    const auto &baseitem = baseitems_info[o_ptr->bi_id];
+    const auto &baseitem = o_ptr->get_baseitem();
     auto flags = baseitem.flags;
 
     if (o_ptr->is_fixed_artifact()) {
@@ -91,7 +91,7 @@ TrFlags object_flags_known(const ItemEntity *o_ptr)
         return flags;
     }
 
-    const auto &baseitem = baseitems_info[o_ptr->bi_id];
+    const auto &baseitem = o_ptr->get_baseitem();
     flags = baseitem.flags;
     if (!o_ptr->is_known()) {
         return flags;
index 171a6a7..6966251 100644 (file)
@@ -129,7 +129,7 @@ int object_similar_part(const ItemEntity *o_ptr, const ItemEntity *j_ptr)
 
         break;
     case ItemKindType::ROD:
-        max_num = std::min(max_num, MAX_SHORT / baseitems_info[o_ptr->bi_id].pval);
+        max_num = std::min(max_num, MAX_SHORT / o_ptr->get_baseitem().pval);
         break;
     case ItemKindType::GLOVES:
         if (o_ptr->is_glove_same_temper(j_ptr)) {
index 189d8d9..0dd21ca 100644 (file)
@@ -22,7 +22,7 @@ PRICE flag_cost(const ItemEntity *o_ptr, int plusses)
 {
     PRICE total = 0;
     auto flags = object_flags(o_ptr);
-    const auto &baseitem = baseitems_info[o_ptr->bi_id];
+    const auto &baseitem = o_ptr->get_baseitem();
     flags.reset(baseitem.flags);
 
     if (o_ptr->is_fixed_artifact()) {
index 1513989..710b0f0 100644 (file)
  */
 PRICE object_value_real(const ItemEntity *o_ptr)
 {
-    const auto &baseitem = baseitems_info[o_ptr->bi_id];
+    const auto &baseitem = o_ptr->get_baseitem();
 
-    if (!baseitems_info[o_ptr->bi_id].cost) {
+    if (!baseitem.cost) {
         return 0;
     }
 
-    PRICE value = baseitems_info[o_ptr->bi_id].cost;
+    PRICE value = baseitem.cost;
     auto flags = object_flags(o_ptr);
     if (o_ptr->is_fixed_artifact()) {
         const auto &artifact = ArtifactsInfo::get_instance().get_artifact(o_ptr->fixed_artifact_idx);
index 76b1109..d44f111 100644 (file)
@@ -42,7 +42,7 @@ bool screen_object(PlayerType *player_ptr, ItemEntity *o_ptr, BIT_FLAGS mode)
     auto flags = object_flags(o_ptr);
 
     const auto &artifacts = ArtifactsInfo::get_instance();
-    const auto item_text = o_ptr->is_fixed_artifact() ? artifacts.get_artifact(o_ptr->fixed_artifact_idx).text.data() : baseitems_info[o_ptr->bi_id].text.data();
+    const auto item_text = o_ptr->is_fixed_artifact() ? artifacts.get_artifact(o_ptr->fixed_artifact_idx).text.data() : o_ptr->get_baseitem().text.data();
     const auto item_text_lines = shape_buffer(item_text, 77 - 15);
 
     int i = 0;
index 436cc98..e08eabe 100644 (file)
@@ -45,8 +45,8 @@ void object_known(ItemEntity *o_ptr)
 void object_aware(PlayerType *player_ptr, const ItemEntity *o_ptr)
 {
     const bool is_already_awared = o_ptr->is_aware();
-
-    baseitems_info[o_ptr->bi_id].aware = true;
+    auto &baseitem = o_ptr->get_baseitem();
+    baseitem.aware = true;
 
     // 以下、playrecordに記録しない場合はreturnする
     if (!record_ident) {
@@ -58,7 +58,7 @@ void object_aware(PlayerType *player_ptr, const ItemEntity *o_ptr)
     }
 
     // アーティファクト専用ベースアイテムは記録しない
-    if (baseitems_info[o_ptr->bi_id].gen_flags.has(ItemGenerationTraitType::INSTA_ART)) {
+    if (baseitem.gen_flags.has(ItemGenerationTraitType::INSTA_ART)) {
         return;
     }
 
@@ -83,5 +83,5 @@ void object_aware(PlayerType *player_ptr, const ItemEntity *o_ptr)
  */
 void object_tried(const ItemEntity *o_ptr)
 {
-    baseitems_info[o_ptr->bi_id].tried = true;
+    o_ptr->get_baseitem().tried = true;
 }
index e589708..e156af8 100644 (file)
@@ -69,7 +69,7 @@ void calc_android_exp(PlayerType *player_ptr)
         ItemEntity forge;
         auto *q_ptr = &forge;
         uint32_t value, exp;
-        DEPTH level = std::max(baseitems_info[o_ptr->bi_id].level - 8, 1);
+        DEPTH level = std::max(o_ptr->get_baseitem().level - 8, 1);
 
         if ((i == INVEN_MAIN_RING) || (i == INVEN_SUB_RING) || (i == INVEN_NECK) || (i == INVEN_LITE)) {
             continue;
index 8aa2787..d3ae1e9 100644 (file)
@@ -58,7 +58,7 @@ bool recharge(PlayerType *player_ptr, int power)
         return false;
     }
 
-    const auto &baseitem = baseitems_info[o_ptr->bi_id];
+    const auto &baseitem = o_ptr->get_baseitem();
     const auto lev = baseitem.level;
 
     TIME_EFFECT recharge_amount;
index e4a740d..ef8ac2d 100644 (file)
@@ -212,7 +212,7 @@ bool store_object_similar(ItemEntity *o_ptr, ItemEntity *j_ptr)
  */
 static void store_object_absorb(ItemEntity *o_ptr, ItemEntity *j_ptr)
 {
-    int max_num = (o_ptr->bi_key.tval() == ItemKindType::ROD) ? std::min(99, MAX_SHORT / baseitems_info[o_ptr->bi_id].pval) : 99;
+    int max_num = (o_ptr->bi_key.tval() == ItemKindType::ROD) ? std::min(99, MAX_SHORT / o_ptr->get_baseitem().pval) : 99;
     int total = o_ptr->number + j_ptr->number;
     int diff = (total > max_num) ? total - max_num : 0;
     o_ptr->number = (total > max_num) ? max_num : total;
index 44b200a..007ddd1 100644 (file)
@@ -78,7 +78,7 @@ void ItemEntity::prep(short new_bi_id)
         this->activation_id = baseitem.act_idx;
     }
 
-    if (baseitems_info[this->bi_id].cost <= 0) {
+    if (this->get_baseitem().cost <= 0) {
         this->ident |= (IDENT_BROKEN);
     }
 
@@ -388,7 +388,7 @@ bool ItemEntity::is_held_by_monster() const
  */
 bool ItemEntity::is_known() const
 {
-    const auto &baseitem = baseitems_info[this->bi_id];
+    const auto &baseitem = this->get_baseitem();
     return any_bits(this->ident, IDENT_KNOWN) || (baseitem.easy_know && baseitem.aware);
 }
 
@@ -403,7 +403,7 @@ bool ItemEntity::is_fully_known() const
  */
 bool ItemEntity::is_aware() const
 {
-    return baseitems_info[this->bi_id].aware;
+    return this->get_baseitem().aware;
 }
 
 /*
@@ -411,7 +411,7 @@ bool ItemEntity::is_aware() const
  */
 bool ItemEntity::is_tried() const
 {
-    return baseitems_info[this->bi_id].tried;
+    return this->get_baseitem().tried;
 }
 
 /*!
@@ -615,7 +615,7 @@ bool ItemEntity::can_pile(const ItemEntity *j_ptr) const
  */
 TERM_COLOR ItemEntity::get_color() const
 {
-    const auto &baseitem = baseitems_info[this->bi_id];
+    const auto &baseitem = this->get_baseitem();
     const auto flavor = baseitem.flavor;
     if (flavor != 0) {
         return baseitems_info[flavor].x_attr;
@@ -639,7 +639,7 @@ TERM_COLOR ItemEntity::get_color() const
  */
 char ItemEntity::get_symbol() const
 {
-    const auto &baseitem = baseitems_info[this->bi_id];
+    const auto &baseitem = this->get_baseitem();
     const auto flavor = baseitem.flavor;
     return flavor ? baseitems_info[flavor].x_char : baseitem.x_char;
 }
@@ -680,7 +680,7 @@ int ItemEntity::get_price() const
 int ItemEntity::get_baseitem_price() const
 {
     if (this->is_aware()) {
-        return baseitems_info[this->bi_id].cost;
+        return this->get_baseitem().cost;
     }
 
     switch (this->bi_key.tval()) {
@@ -805,6 +805,11 @@ bool ItemEntity::is_inscribed() const
     return this->inscription != std::nullopt;
 }
 
+BaseitemInfo &ItemEntity::get_baseitem() const
+{
+    return baseitems_info[this->bi_id];
+}
+
 EgoItemDefinition &ItemEntity::get_ego() const
 {
     return egos_info.at(this->ego_idx);
index de50831..33a6e05 100644 (file)
@@ -23,6 +23,7 @@ enum class SmithEffectType : int16_t;
 enum class RandomArtActType : short;
 
 class EgoItemDefinition;
+class BaseitemInfo;
 class ItemEntity {
 public:
     ItemEntity();
@@ -135,6 +136,7 @@ public:
     bool is_cross_bow() const;
     bool is_inscribed() const;
 
+    BaseitemInfo &get_baseitem() const;
     EgoItemDefinition &get_ego() const;
 
 private:
index 359ed3f..ec8f0ed 100644 (file)
@@ -37,7 +37,7 @@ static void describe_baseitem_info(PlayerType *player_ptr,
     q_ptr->to_a = 0;
     q_ptr->to_h = 0;
     q_ptr->to_d = 0;
-    *level_desc = baseitems_info[q_ptr->bi_id].level;
+    *level_desc = q_ptr->get_baseitem().level;
     *value = q_ptr->get_price();
     if (!name || !damage_desc || !chance_desc || !weight_desc) {
         return;
@@ -74,7 +74,7 @@ static void describe_baseitem_info(PlayerType *player_ptr,
     }
 
     chance_desc->clear();
-    const auto &baseitem = baseitems_info[q_ptr->bi_id];
+    const auto &baseitem = q_ptr->get_baseitem();
     for (auto i = 0U; i < baseitem.alloc_tables.size(); i++) {
         const auto &[level, chance] = baseitem.alloc_tables[i];
         if (chance > 0) {
index 1ec6ec6..e5c3c1a 100644 (file)
@@ -226,7 +226,7 @@ void wiz_identify_full_inventory(PlayerType *player_ptr)
             continue;
         }
 
-        auto &baseitem = baseitems_info[o_ptr->bi_id];
+        auto &baseitem = o_ptr->get_baseitem();
         baseitem.aware = true; //!< @note 記録には残さないためTRUEを立てるのみ
         set_bits(o_ptr->ident, IDENT_KNOWN | IDENT_FULL_KNOWN);
         o_ptr->marked.set(OmType::TOUCHED);
@@ -344,7 +344,7 @@ static void wiz_display_item(PlayerType *player_ptr, ItemEntity *o_ptr)
 
     auto line = 4;
     const auto &bi_key = o_ptr->bi_key;
-    const auto item_level = baseitems_info[o_ptr->bi_id].level;
+    const auto item_level = o_ptr->get_baseitem().level;
     prt(format("kind = %-5d  level = %-4d  tval = %-5d  sval = %-5d", o_ptr->bi_id, item_level, enum2i(bi_key.tval()), bi_key.sval().value()), line, j);
     prt(format("number = %-3d  wgt = %-6d  ac = %-5d    damage = %dd%d", o_ptr->number, o_ptr->weight, o_ptr->ac, o_ptr->dd, o_ptr->ds), ++line, j);
     prt(format("pval = %-5d  toac = %-5d  tohit = %-4d  todam = %-4d", o_ptr->pval, o_ptr->to_a, o_ptr->to_h, o_ptr->to_d), ++line, j);