From 812268244547474fb1bfb75361ac1b42a0ffd965 Mon Sep 17 00:00:00 2001 From: Hourier <66951241+Hourier@users.noreply.github.com> Date: Sat, 26 Nov 2022 21:08:24 +0900 Subject: [PATCH] =?UTF-8?q?[Refactor]=20#2776=20ItemEntity::tval/sval=20?= =?UTF-8?q?=E3=82=92BaseitemKey::bi=5Fkey=20=E3=81=A8=E3=81=97=E3=81=A6?= =?UTF-8?q?=E5=86=8D=E5=AE=9A=E7=BE=A9=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/action/activation-execution.cpp | 9 +- src/action/open-util.cpp | 8 +- src/artifact/fixed-art-generator.cpp | 6 +- src/artifact/random-art-generator.cpp | 13 +- src/artifact/random-art-misc.cpp | 4 +- src/artifact/random-art-pval-investor.cpp | 9 +- src/artifact/random-art-resistance.cpp | 14 +- src/artifact/random-art-slay.cpp | 17 +- src/autopick/autopick-destroyer.cpp | 19 ++- src/autopick/autopick-entry.cpp | 50 +++--- src/autopick/autopick-finder.cpp | 2 +- src/autopick/autopick-matcher.cpp | 49 +++--- src/cmd-action/cmd-hissatsu.cpp | 3 +- src/cmd-action/cmd-open-close.cpp | 2 +- src/cmd-action/cmd-shoot.cpp | 12 +- src/cmd-action/cmd-spell.cpp | 40 ++--- src/cmd-item/cmd-destroy.cpp | 8 +- src/cmd-item/cmd-eat.cpp | 17 +- src/cmd-item/cmd-equipment.cpp | 6 +- src/cmd-item/cmd-item.cpp | 2 +- src/cmd-item/cmd-magiceat.cpp | 1 - src/cmd-item/cmd-refill.cpp | 12 +- src/combat/attack-accuracy.cpp | 8 +- src/combat/attack-criticality.cpp | 11 +- src/combat/shoot.cpp | 37 +++-- src/combat/slaying.cpp | 2 +- src/effect/effect-item.cpp | 10 +- src/flavor/flavor-describer.cpp | 18 ++- src/flavor/flavor-util.cpp | 4 +- src/flavor/named-item-describer.cpp | 5 +- src/flavor/tval-description-switcher.cpp | 2 +- src/floor/fixed-map-generator.cpp | 2 +- src/floor/floor-events.cpp | 16 +- src/floor/floor-object.cpp | 22 ++- src/floor/object-scanner.cpp | 7 +- src/hpmp/hp-mp-processor.cpp | 2 +- src/hpmp/hp-mp-regenerator.cpp | 5 +- src/inventory/inventory-object.cpp | 7 +- src/inventory/player-inventory.cpp | 4 +- src/inventory/recharge-processor.cpp | 4 +- src/io-dump/random-art-info-dumper.cpp | 2 +- src/knowledge/knowledge-inventory.cpp | 14 +- src/load/old/item-loader-savefile50.cpp | 33 ++-- src/load/old/load-v1-5-0.cpp | 28 ++-- src/market/bounty.cpp | 12 +- src/market/building-craft-fix.cpp | 7 +- src/market/building-craft-weapon.cpp | 2 +- src/market/building-recharger.cpp | 31 ++-- src/mind/mind-mage.cpp | 27 ++-- src/mind/mind-magic-eater.cpp | 16 +- src/mind/mind-mindcrafter.cpp | 2 +- src/mind/mind-ninja.cpp | 2 +- src/mind/mind-sniper.cpp | 6 +- src/monster-attack/monster-eating.cpp | 20 +-- src/monster-floor/monster-object.cpp | 4 +- src/monster-floor/special-death-switcher.cpp | 2 +- src/mspell/mspell-checker.cpp | 6 +- src/mutation/mutation-processor.cpp | 15 +- src/object-activation/activation-breath.cpp | 4 +- src/object-enchant/enchanter-factory.cpp | 2 +- src/object-enchant/object-ego.cpp | 12 +- .../others/apply-magic-amulet.cpp | 14 +- .../others/apply-magic-lite.cpp | 16 +- .../others/apply-magic-others.cpp | 12 +- .../others/apply-magic-ring.cpp | 14 +- .../protector/apply-magic-armor.cpp | 5 +- .../protector/apply-magic-boots.cpp | 2 +- .../protector/apply-magic-cloak.cpp | 2 +- .../protector/apply-magic-gloves.cpp | 2 +- .../protector/apply-magic-helm.cpp | 2 +- .../protector/apply-magic-shield.cpp | 9 +- .../protector/apply-magic-soft-armor.cpp | 15 +- .../weapon/apply-magic-polearm.cpp | 2 +- .../weapon/apply-magic-sword.cpp | 9 +- src/object-hook/hook-armor.cpp | 2 +- src/object-hook/hook-expendable.cpp | 14 +- src/object-hook/hook-magic.cpp | 12 +- src/object-hook/hook-quest.cpp | 4 +- src/object-hook/hook-weapon.cpp | 42 ++--- src/object-use/quaff/quaff-effects.cpp | 4 +- src/object-use/quaff/quaff-execution.cpp | 2 +- .../read/parchment-read-executor.cpp | 2 +- src/object-use/read/read-executor-factory.cpp | 5 +- src/object-use/read/scroll-read-executor.cpp | 2 +- src/object-use/throw-execution.cpp | 13 +- src/object-use/use-execution.cpp | 2 +- src/object-use/zaprod-execution.cpp | 2 +- src/object-use/zapwand-execution.cpp | 5 +- src/object/item-tester-hooker.cpp | 4 +- src/object/lite-processor.cpp | 4 +- src/object/object-broken.cpp | 88 +++-------- src/object/object-info.cpp | 57 +++---- src/object/object-stack.cpp | 18 ++- src/object/object-value.cpp | 4 +- src/perception/identification.cpp | 18 ++- src/perception/simple-perception.cpp | 14 +- src/player-attack/player-attack.cpp | 9 +- src/player-info/equipment-info.cpp | 4 +- src/player/player-move.cpp | 2 +- src/player/player-skill.cpp | 20 +-- src/player/player-status-flags.cpp | 36 +++-- src/player/player-status.cpp | 147 +++++++++++------- src/player/process-death.cpp | 2 +- src/racial/racial-android.cpp | 17 +- src/smith/object-smith.cpp | 7 +- src/smith/smith-info.cpp | 34 ++-- src/specific-object/chest.cpp | 16 +- src/specific-object/monster-ball.cpp | 2 +- src/specific-object/torch.cpp | 9 +- src/spell-kind/magic-item-recharger.cpp | 54 ++++--- src/spell-kind/spells-detection.cpp | 6 +- src/spell-realm/spells-arcane.cpp | 5 +- src/spell-realm/spells-craft.cpp | 2 +- src/spell/spells-object.cpp | 15 +- src/store/home.cpp | 5 +- src/store/purchase-order.cpp | 2 +- src/store/sell-order.cpp | 11 +- src/store/service-checker.cpp | 88 ++++++----- src/store/service-checker.h | 2 +- src/store/store-util.cpp | 31 ++-- src/store/store.cpp | 12 +- src/system/item-entity.cpp | 91 +++++------ src/system/item-entity.h | 5 +- src/util/object-sort.cpp | 8 +- src/view/display-inventory.cpp | 4 +- src/view/display-player-middle.cpp | 8 +- src/view/display-store.cpp | 4 +- src/view/object-describer.cpp | 21 +-- src/view/status-first-page.cpp | 11 +- src/window/display-sub-windows.cpp | 15 +- src/window/main-window-equipments.cpp | 2 +- src/window/main-window-util.cpp | 2 +- src/wizard/items-spoiler.cpp | 2 +- src/wizard/wizard-item-modifier.cpp | 15 +- 134 files changed, 990 insertions(+), 874 deletions(-) diff --git a/src/action/activation-execution.cpp b/src/action/activation-execution.cpp index 97a76dd847..af6e306b86 100644 --- a/src/action/activation-execution.cpp +++ b/src/action/activation-execution.cpp @@ -68,7 +68,8 @@ static void decide_activation_level(ae_type *ae_ptr) return; } - if (((ae_ptr->o_ptr->tval == ItemKindType::RING) || (ae_ptr->o_ptr->tval == ItemKindType::AMULET)) && ae_ptr->o_ptr->is_ego()) { + const auto tval = ae_ptr->o_ptr->bi_key.tval(); + if (((tval == ItemKindType::RING) || (tval == ItemKindType::AMULET)) && ae_ptr->o_ptr->is_ego()) { ae_ptr->lev = egos_info[ae_ptr->o_ptr->ego_idx].level; } } @@ -178,10 +179,10 @@ static bool activate_artifact(PlayerType *player_ptr, ItemEntity *o_ptr) switch (act_ptr->index) { case RandomArtActType::BR_FIRE: - o_ptr->timeout = ((o_ptr->tval == ItemKindType::RING) && (o_ptr->sval == SV_RING_FLAMES)) ? 200 : 250; + o_ptr->timeout = o_ptr->bi_key == BaseitemKey(ItemKindType::RING, SV_RING_FLAMES) ? 200 : 250; return true; case RandomArtActType::BR_COLD: - o_ptr->timeout = ((o_ptr->tval == ItemKindType::RING) && (o_ptr->sval == SV_RING_ICE)) ? 200 : 250; + o_ptr->timeout = o_ptr->bi_key == BaseitemKey(ItemKindType::RING, SV_RING_ICE) ? 200 : 250; return true; case RandomArtActType::TERROR: o_ptr->timeout = 3 * (player_ptr->lev + 10); @@ -196,7 +197,7 @@ static bool activate_artifact(PlayerType *player_ptr, ItemEntity *o_ptr) static bool activate_whistle(PlayerType *player_ptr, ae_type *ae_ptr) { - if (ae_ptr->o_ptr->tval != ItemKindType::WHISTLE) { + if (ae_ptr->o_ptr->bi_key.tval() != ItemKindType::WHISTLE) { return false; } diff --git a/src/action/open-util.cpp b/src/action/open-util.cpp index f4a4781a68..3072426789 100644 --- a/src/action/open-util.cpp +++ b/src/action/open-util.cpp @@ -24,10 +24,10 @@ OBJECT_IDX chest_check(FloorType *floor_ptr, POSITION y, POSITION x, bool trappe { auto *g_ptr = &floor_ptr->grid_array[y][x]; for (const auto this_o_idx : g_ptr->o_idx_list) { - ItemEntity *o_ptr; - o_ptr = &floor_ptr->o_list[this_o_idx]; - if ((o_ptr->tval == ItemKindType::CHEST) && (((!trapped) && (o_ptr->pval)) || /* non empty */ - ((trapped) && (o_ptr->pval > 0)))) { /* trapped only */ + const auto &item = floor_ptr->o_list[this_o_idx]; + const auto is_empty = trapped || (item.pval == 0); + const auto trapped_only = trapped && (item.pval > 0); + if ((item.bi_key.tval() == ItemKindType::CHEST) && (!is_empty || trapped_only)) { return this_o_idx; } } diff --git a/src/artifact/fixed-art-generator.cpp b/src/artifact/fixed-art-generator.cpp index 9361d7f65c..17179bbd3a 100644 --- a/src/artifact/fixed-art-generator.cpp +++ b/src/artifact/fixed-art-generator.cpp @@ -316,11 +316,7 @@ bool make_artifact(PlayerType *player_ptr, ItemEntity *o_ptr) continue; } - if (a_ref.bi_key.tval() != o_ptr->tval) { - continue; - } - - if (a_ref.bi_key.sval() != o_ptr->sval) { + if (a_ref.bi_key != o_ptr->bi_key) { continue; } diff --git a/src/artifact/random-art-generator.cpp b/src/artifact/random-art-generator.cpp index 1a921f23b9..2e606b77b4 100644 --- a/src/artifact/random-art-generator.cpp +++ b/src/artifact/random-art-generator.cpp @@ -43,7 +43,7 @@ static bool weakening_artifact(ItemEntity *o_ptr) { - const auto bi_id = lookup_baseitem_id({ o_ptr->tval, o_ptr->sval }); + const auto bi_id = lookup_baseitem_id(o_ptr->bi_key); auto *k_ptr = &baseitems_info[bi_id]; auto flgs = object_flags(o_ptr); @@ -178,7 +178,8 @@ static bool decide_random_art_cursed(const bool a_scroll, ItemEntity *o_ptr) return true; } - if (((o_ptr->tval == ItemKindType::AMULET) || (o_ptr->tval == ItemKindType::RING)) && o_ptr->is_cursed()) { + const auto tval = o_ptr->bi_key.tval(); + if (((tval == ItemKindType::AMULET) || (tval == ItemKindType::RING)) && o_ptr->is_cursed()) { return true; } @@ -215,7 +216,7 @@ static void invest_powers(PlayerType *player_ptr, ItemEntity *o_ptr, int *powers break; case 3: case 4: - if (one_in_(2) && o_ptr->is_weapon_ammo() && (o_ptr->tval != ItemKindType::BOW)) { + if (one_in_(2) && o_ptr->is_weapon_ammo() && (o_ptr->bi_key.tval() != ItemKindType::BOW)) { if (a_cursed && !one_in_(13)) { break; } @@ -254,7 +255,7 @@ static void strengthen_pval(ItemEntity *o_ptr) { if (o_ptr->art_flags.has(TR_BLOWS)) { o_ptr->pval = randint1(2); - if ((o_ptr->tval == ItemKindType::SWORD) && (o_ptr->sval == SV_HAYABUSA)) { + if (o_ptr->bi_key == BaseitemKey(ItemKindType::SWORD, SV_HAYABUSA)) { o_ptr->pval++; } } else { @@ -323,7 +324,7 @@ static void invest_negative_modified_value(ItemEntity *o_ptr) static void reset_flags_poison_needle(ItemEntity *o_ptr) { - if ((o_ptr->tval != ItemKindType::SWORD) || (o_ptr->sval != SV_POISON_NEEDLE)) { + if (o_ptr->bi_key != BaseitemKey(ItemKindType::SWORD, SV_POISON_NEEDLE)) { return; } @@ -466,7 +467,7 @@ bool become_random_artifact(PlayerType *player_ptr, ItemEntity *o_ptr, bool a_sc } invest_negative_modified_value(o_ptr); - if (((o_ptr->artifact_bias == BIAS_MAGE) || (o_ptr->artifact_bias == BIAS_INT)) && (o_ptr->tval == ItemKindType::GLOVES)) { + if (((o_ptr->artifact_bias == BIAS_MAGE) || (o_ptr->artifact_bias == BIAS_INT)) && (o_ptr->bi_key.tval() == ItemKindType::GLOVES)) { o_ptr->art_flags.set(TR_FREE_ACT); } diff --git a/src/artifact/random-art-misc.cpp b/src/artifact/random-art-misc.cpp index eac1551621..875f082c0f 100644 --- a/src/artifact/random-art-misc.cpp +++ b/src/artifact/random-art-misc.cpp @@ -142,7 +142,9 @@ static void invest_misc_hit_dice(ItemEntity *o_ptr) o_ptr->art_flags.set(TR_SHOW_MODS); HIT_PROB bonus_h = 4 + (HIT_PROB)randint1(11); int bonus_d = 4 + (int)randint1(11); - if ((o_ptr->tval != ItemKindType::SWORD) && (o_ptr->tval != ItemKindType::POLEARM) && (o_ptr->tval != ItemKindType::HAFTED) && (o_ptr->tval != ItemKindType::DIGGING) && (o_ptr->tval != ItemKindType::GLOVES) && (o_ptr->tval != ItemKindType::RING)) { + const auto is_weapon = o_ptr->is_melee_weapon(); + const auto tval = o_ptr->bi_key.tval(); + if (!is_weapon && (tval != ItemKindType::GLOVES) && (tval != ItemKindType::RING)) { bonus_h /= 2; bonus_d /= 2; } diff --git a/src/artifact/random-art-pval-investor.cpp b/src/artifact/random-art-pval-investor.cpp index 46be401afc..592be61148 100644 --- a/src/artifact/random-art-pval-investor.cpp +++ b/src/artifact/random-art-pval-investor.cpp @@ -76,7 +76,7 @@ static bool random_art_bias_charisma(ItemEntity *o_ptr) static bool random_art_bias_magic_mastery(ItemEntity *o_ptr) { - if ((o_ptr->tval != ItemKindType::GLOVES) || o_ptr->art_flags.has(TR_MAGIC_MASTERY)) { + if ((o_ptr->bi_key.tval() != ItemKindType::GLOVES) || o_ptr->art_flags.has(TR_MAGIC_MASTERY)) { return false; } @@ -135,7 +135,10 @@ static bool switch_random_art_bias(ItemEntity *o_ptr) static bool random_art_bias_decrease_mana(ItemEntity *o_ptr) { - if (((o_ptr->artifact_bias != BIAS_MAGE) && (o_ptr->artifact_bias != BIAS_PRIESTLY)) || (o_ptr->tval != ItemKindType::SOFT_ARMOR) || (o_ptr->sval != SV_ROBE) || o_ptr->art_flags.has(TR_DEC_MANA) || !one_in_(3)) { + auto should_decrease = (o_ptr->artifact_bias != BIAS_MAGE) && (o_ptr->artifact_bias != BIAS_PRIESTLY); + should_decrease |= o_ptr->bi_key != BaseitemKey(ItemKindType::SOFT_ARMOR, SV_ROBE); + should_decrease |= o_ptr->art_flags.has(TR_DEC_MANA); + if (should_decrease || !one_in_(3)) { return false; } @@ -249,7 +252,7 @@ void random_plus(ItemEntity *o_ptr) break; case 22: case 23: - if (o_ptr->tval == ItemKindType::BOW) { + if (o_ptr->bi_key.tval() == ItemKindType::BOW) { random_plus(o_ptr); break; } diff --git a/src/artifact/random-art-resistance.cpp b/src/artifact/random-art-resistance.cpp index 622bb90e9b..3c5802df97 100644 --- a/src/artifact/random-art-resistance.cpp +++ b/src/artifact/random-art-resistance.cpp @@ -176,7 +176,7 @@ static void set_bias_pois(ItemEntity *o_ptr) /* 一定確率で再試行する */ static void set_weird_bias_aura_elec(ItemEntity *o_ptr) { - if (o_ptr->tval >= ItemKindType::CLOAK && o_ptr->tval <= ItemKindType::HARD_ARMOR) { + if (o_ptr->can_be_aura_protector()) { o_ptr->art_flags.set(TR_SH_ELEC); } else { random_resistance(o_ptr); @@ -190,7 +190,7 @@ static void set_weird_bias_aura_elec(ItemEntity *o_ptr) /* 一定確率で再試行する */ static void set_weird_bias_aura_fire(ItemEntity *o_ptr) { - if (o_ptr->tval >= ItemKindType::CLOAK && o_ptr->tval <= ItemKindType::HARD_ARMOR) { + if (o_ptr->can_be_aura_protector()) { o_ptr->art_flags.set(TR_SH_FIRE); } else { random_resistance(o_ptr); @@ -204,9 +204,15 @@ static void set_weird_bias_aura_fire(ItemEntity *o_ptr) /* 一定確率で再試行する */ static void set_weird_bias_reflection(ItemEntity *o_ptr) { - if (o_ptr->tval == ItemKindType::SHIELD || o_ptr->tval == ItemKindType::CLOAK || o_ptr->tval == ItemKindType::HELM || o_ptr->tval == ItemKindType::HARD_ARMOR) { + switch (o_ptr->bi_key.tval()) { + case ItemKindType::SHIELD: + case ItemKindType::CLOAK: + case ItemKindType::HELM: + case ItemKindType::HARD_ARMOR: o_ptr->art_flags.set(TR_REFLECT); return; + default: + break; } random_resistance(o_ptr); @@ -215,7 +221,7 @@ static void set_weird_bias_reflection(ItemEntity *o_ptr) /* 一定確率で再試行する */ static void set_weird_bias_aura_cold(ItemEntity *o_ptr) { - if (o_ptr->tval >= ItemKindType::CLOAK && o_ptr->tval <= ItemKindType::HARD_ARMOR) { + if (o_ptr->can_be_aura_protector()) { o_ptr->art_flags.set(TR_SH_COLD); } else { random_resistance(o_ptr); diff --git a/src/artifact/random-art-slay.cpp b/src/artifact/random-art-slay.cpp index 4d340b926a..8fb530fe21 100644 --- a/src/artifact/random-art-slay.cpp +++ b/src/artifact/random-art-slay.cpp @@ -13,7 +13,7 @@ static bool random_art_slay_bow(ItemEntity *o_ptr) { - if (o_ptr->tval != ItemKindType::BOW) { + if (o_ptr->bi_key.tval() != ItemKindType::BOW) { return false; } @@ -173,22 +173,27 @@ static bool switch_random_art_slay(ItemEntity *o_ptr) case BIAS_MAGE: case BIAS_INT: return random_art_brand_magical(o_ptr); - case BIAS_PRIESTLY: - if (((o_ptr->tval == ItemKindType::SWORD) || (o_ptr->tval == ItemKindType::POLEARM)) && o_ptr->art_flags.has_not(TR_BLESSED)) { + case BIAS_PRIESTLY: { + const auto tval = o_ptr->bi_key.tval(); + if (((tval == ItemKindType::SWORD) || (tval == ItemKindType::POLEARM)) && o_ptr->art_flags.has_not(TR_BLESSED)) { o_ptr->art_flags.set(TR_BLESSED); } return false; + } case BIAS_NECROMANTIC: return random_art_slay_vampiric(o_ptr) || random_art_slay_brand_pois(o_ptr); case BIAS_RANGER: return random_art_slay_animal(o_ptr); - case BIAS_ROGUE: - if ((((o_ptr->tval == ItemKindType::SWORD) && (o_ptr->sval == SV_DAGGER)) || ((o_ptr->tval == ItemKindType::POLEARM) && (o_ptr->sval == SV_SPEAR))) && o_ptr->art_flags.has_not(TR_THROW)) { + case BIAS_ROGUE: { + auto is_throwable = o_ptr->bi_key == BaseitemKey(ItemKindType::SWORD, SV_DAGGER); + is_throwable |= o_ptr->bi_key == BaseitemKey(ItemKindType::POLEARM, SV_SPEAR); + if (is_throwable && o_ptr->art_flags.has_not(TR_THROW)) { o_ptr->art_flags.set(TR_THROW); } return random_art_slay_brand_pois(o_ptr); + } case BIAS_POIS: return random_art_slay_brand_pois(o_ptr); case BIAS_ACID: @@ -311,7 +316,7 @@ void random_slay(ItemEntity *o_ptr) break; case 18: case 19: - if (o_ptr->tval != ItemKindType::SWORD) { + if (o_ptr->bi_key.tval() != ItemKindType::SWORD) { random_slay(o_ptr); break; } diff --git a/src/autopick/autopick-destroyer.cpp b/src/autopick/autopick-destroyer.cpp index cf3c2aa642..1fb3a026b4 100644 --- a/src/autopick/autopick-destroyer.cpp +++ b/src/autopick/autopick-destroyer.cpp @@ -46,21 +46,23 @@ static bool is_leave_special_item(PlayerType *player_ptr, ItemEntity *o_ptr) } PlayerClass pc(player_ptr); + const auto &bi_key = o_ptr->bi_key; + const auto tval = bi_key.tval(); if (PlayerRace(player_ptr).equals(PlayerRaceType::BALROG)) { auto r_idx = i2enum(o_ptr->pval); - if (o_ptr->tval == ItemKindType::CORPSE && o_ptr->sval == SV_CORPSE && angband_strchr("pht", monraces_info[r_idx].d_char)) { + if (bi_key == BaseitemKey(ItemKindType::CORPSE, SV_CORPSE) && angband_strchr("pht", monraces_info[r_idx].d_char)) { return false; } } else if (pc.equals(PlayerClassType::ARCHER)) { - if (o_ptr->tval == ItemKindType::SKELETON || (o_ptr->tval == ItemKindType::CORPSE && o_ptr->sval == SV_SKELETON)) { + if ((tval == ItemKindType::SKELETON) || (bi_key == BaseitemKey(ItemKindType::CORPSE, SV_SKELETON))) { return false; } } else if (pc.equals(PlayerClassType::NINJA)) { - if (o_ptr->tval == ItemKindType::LITE && o_ptr->ego_idx == EgoType::LITE_DARKNESS && o_ptr->is_known()) { + if (tval == ItemKindType::LITE && o_ptr->ego_idx == EgoType::LITE_DARKNESS && o_ptr->is_known()) { return false; } } else if (pc.is_tamer()) { - if (o_ptr->tval == ItemKindType::WAND && o_ptr->sval == SV_WAND_HEAL_MONSTER && o_ptr->is_aware()) { + if (bi_key == BaseitemKey(ItemKindType::WAND, SV_WAND_HEAL_MONSTER) && o_ptr->is_aware()) { return false; } } @@ -89,8 +91,9 @@ static bool is_opt_confirm_destroy(PlayerType *player_ptr, ItemEntity *o_ptr) } } + const auto tval = o_ptr->bi_key.tval(); if (leave_chest) { - if ((o_ptr->tval == ItemKindType::CHEST) && o_ptr->pval) { + if ((tval == ItemKindType::CHEST) && o_ptr->pval) { return false; } } @@ -102,13 +105,13 @@ static bool is_opt_confirm_destroy(PlayerType *player_ptr, ItemEntity *o_ptr) } if (leave_corpse) { - if (o_ptr->tval == ItemKindType::CORPSE) { + if (tval == ItemKindType::CORPSE) { return false; } } if (leave_junk) { - if ((o_ptr->tval == ItemKindType::SKELETON) || (o_ptr->tval == ItemKindType::BOTTLE) || (o_ptr->tval == ItemKindType::JUNK) || (o_ptr->tval == ItemKindType::STATUE)) { + if ((tval == ItemKindType::SKELETON) || (tval == ItemKindType::BOTTLE) || (tval == ItemKindType::JUNK) || (tval == ItemKindType::STATUE)) { return false; } } @@ -117,7 +120,7 @@ static bool is_opt_confirm_destroy(PlayerType *player_ptr, ItemEntity *o_ptr) return false; } - if (o_ptr->tval == ItemKindType::GOLD) { + if (tval == ItemKindType::GOLD) { return false; } diff --git a/src/autopick/autopick-entry.cpp b/src/autopick/autopick-entry.cpp index 9cc35fc072..acdef3f913 100644 --- a/src/autopick/autopick-entry.cpp +++ b/src/autopick/autopick-entry.cpp @@ -425,18 +425,19 @@ void autopick_entry_from_object(PlayerType *player_ptr, autopick_type *entry, It } const auto r_idx = i2enum(o_ptr->pval); - if ((o_ptr->tval == ItemKindType::CORPSE || o_ptr->tval == ItemKindType::STATUE) && monraces_info[r_idx].kind_flags.has(MonsterKindType::UNIQUE)) { + const auto &bi_key = o_ptr->bi_key; + const auto tval = bi_key.tval(); + if ((tval == ItemKindType::CORPSE || tval == ItemKindType::STATUE) && monraces_info[r_idx].kind_flags.has(MonsterKindType::UNIQUE)) { ADD_FLG(FLG_UNIQUE); } - if (o_ptr->tval == ItemKindType::CORPSE && angband_strchr("pht", monraces_info[r_idx].d_char)) { + if (tval == ItemKindType::CORPSE && angband_strchr("pht", monraces_info[r_idx].d_char)) { ADD_FLG(FLG_HUMAN); } - const BaseitemKey bi_key(o_ptr->tval, o_ptr->sval); if (o_ptr->is_spell_book() && !check_book_realm(player_ptr, bi_key)) { ADD_FLG(FLG_UNREADABLE); - if (o_ptr->tval != ItemKindType::ARCANE_BOOK) { + if (tval != ItemKindType::ARCANE_BOOK) { name = false; } } @@ -444,60 +445,61 @@ void autopick_entry_from_object(PlayerType *player_ptr, autopick_type *entry, It PlayerClass pc(player_ptr); auto realm_except_class = pc.equals(PlayerClassType::SORCERER) || pc.equals(PlayerClassType::RED_MAGE); - if ((get_realm1_book(player_ptr) == o_ptr->tval) && !realm_except_class) { + if ((get_realm1_book(player_ptr) == tval) && !realm_except_class) { ADD_FLG(FLG_REALM1); name = false; } - if ((get_realm2_book(player_ptr) == o_ptr->tval) && !realm_except_class) { + if ((get_realm2_book(player_ptr) == tval) && !realm_except_class) { ADD_FLG(FLG_REALM2); name = false; } - if (o_ptr->is_spell_book() && (o_ptr->sval == 0)) { + const auto sval = bi_key.sval(); + if (o_ptr->is_spell_book() && (sval == 0)) { ADD_FLG(FLG_FIRST); } - if (o_ptr->is_spell_book() && (o_ptr->sval == 1)) { + if (o_ptr->is_spell_book() && (sval == 1)) { ADD_FLG(FLG_SECOND); } - if (o_ptr->is_spell_book() && (o_ptr->sval == 2)) { + if (o_ptr->is_spell_book() && (sval == 2)) { ADD_FLG(FLG_THIRD); } - if (o_ptr->is_spell_book() && (o_ptr->sval == 3)) { + if (o_ptr->is_spell_book() && (sval == 3)) { ADD_FLG(FLG_FOURTH); } if (o_ptr->is_ammo()) { ADD_FLG(FLG_MISSILES); - } else if (o_ptr->tval == ItemKindType::SCROLL || o_ptr->is_wand_staff() || o_ptr->is_wand_rod()) { + } else if (tval == ItemKindType::SCROLL || o_ptr->is_wand_staff() || o_ptr->is_wand_rod()) { ADD_FLG(FLG_DEVICES); - } else if (o_ptr->tval == ItemKindType::LITE) { + } else if (tval == ItemKindType::LITE) { ADD_FLG(FLG_LIGHTS); - } else if (o_ptr->tval == ItemKindType::SKELETON || o_ptr->tval == ItemKindType::BOTTLE || o_ptr->tval == ItemKindType::JUNK || o_ptr->tval == ItemKindType::STATUE) { + } else if (tval == ItemKindType::SKELETON || tval == ItemKindType::BOTTLE || tval == ItemKindType::JUNK || tval == ItemKindType::STATUE) { ADD_FLG(FLG_JUNKS); - } else if (o_ptr->tval == ItemKindType::CORPSE) { + } else if (tval == ItemKindType::CORPSE) { ADD_FLG(FLG_CORPSES); } else if (o_ptr->is_spell_book()) { ADD_FLG(FLG_SPELLBOOKS); - } else if (o_ptr->tval == ItemKindType::POLEARM || o_ptr->tval == ItemKindType::SWORD || o_ptr->tval == ItemKindType::DIGGING || o_ptr->tval == ItemKindType::HAFTED) { + } else if (tval == ItemKindType::POLEARM || tval == ItemKindType::SWORD || tval == ItemKindType::DIGGING || tval == ItemKindType::HAFTED) { ADD_FLG(FLG_WEAPONS); - } else if (o_ptr->tval == ItemKindType::SHIELD) { + } else if (tval == ItemKindType::SHIELD) { ADD_FLG(FLG_SHIELDS); - } else if (o_ptr->tval == ItemKindType::BOW) { + } else if (tval == ItemKindType::BOW) { ADD_FLG(FLG_BOWS); - } else if (o_ptr->tval == ItemKindType::RING) { + } else if (tval == ItemKindType::RING) { ADD_FLG(FLG_RINGS); - } else if (o_ptr->tval == ItemKindType::AMULET) { + } else if (tval == ItemKindType::AMULET) { ADD_FLG(FLG_AMULETS); - } else if (o_ptr->tval == ItemKindType::DRAG_ARMOR || o_ptr->tval == ItemKindType::HARD_ARMOR || o_ptr->tval == ItemKindType::SOFT_ARMOR) { + } else if (tval == ItemKindType::DRAG_ARMOR || tval == ItemKindType::HARD_ARMOR || tval == ItemKindType::SOFT_ARMOR) { ADD_FLG(FLG_SUITS); - } else if (o_ptr->tval == ItemKindType::CLOAK) { + } else if (tval == ItemKindType::CLOAK) { ADD_FLG(FLG_CLOAKS); - } else if (o_ptr->tval == ItemKindType::HELM) { + } else if (tval == ItemKindType::HELM) { ADD_FLG(FLG_HELMS); - } else if (o_ptr->tval == ItemKindType::GLOVES) { + } else if (tval == ItemKindType::GLOVES) { ADD_FLG(FLG_GLOVES); - } else if (o_ptr->tval == ItemKindType::BOOTS) { + } else if (tval == ItemKindType::BOOTS) { ADD_FLG(FLG_BOOTS); } diff --git a/src/autopick/autopick-finder.cpp b/src/autopick/autopick-finder.cpp index b088d634d5..4aa2810ee3 100644 --- a/src/autopick/autopick-finder.cpp +++ b/src/autopick/autopick-finder.cpp @@ -36,7 +36,7 @@ int find_autopick_list(PlayerType *player_ptr, ItemEntity *o_ptr) { GAME_TEXT o_name[MAX_NLEN]; - if (o_ptr->tval == ItemKindType::GOLD) { + if (o_ptr->bi_key.tval() == ItemKindType::GOLD) { return -1; } diff --git a/src/autopick/autopick-matcher.cpp b/src/autopick/autopick-matcher.cpp index 3d2b6e871a..993061e6fe 100644 --- a/src/autopick/autopick-matcher.cpp +++ b/src/autopick/autopick-matcher.cpp @@ -198,16 +198,19 @@ bool is_autopick_match(PlayerType *player_ptr, ItemEntity *o_ptr, autopick_type return false; } + // @details このタイミングでは、svalは絶対にnulloptにならない、はず. + const auto &bi_key = o_ptr->bi_key; + const auto tval = bi_key.tval(); + const auto sval = bi_key.sval().value(); const auto r_idx = i2enum(o_ptr->pval); - if (IS_FLG(FLG_UNIQUE) && ((o_ptr->tval != ItemKindType::CORPSE && o_ptr->tval != ItemKindType::STATUE) || monraces_info[r_idx].kind_flags.has_not(MonsterKindType::UNIQUE))) { + if (IS_FLG(FLG_UNIQUE) && ((tval != ItemKindType::CORPSE && tval != ItemKindType::STATUE) || monraces_info[r_idx].kind_flags.has_not(MonsterKindType::UNIQUE))) { return false; } - if (IS_FLG(FLG_HUMAN) && (o_ptr->tval != ItemKindType::CORPSE || !angband_strchr("pht", monraces_info[r_idx].d_char))) { + if (IS_FLG(FLG_HUMAN) && (tval != ItemKindType::CORPSE || !angband_strchr("pht", monraces_info[r_idx].d_char))) { return false; } - const BaseitemKey bi_key(o_ptr->tval, o_ptr->sval); if (IS_FLG(FLG_UNREADABLE) && check_book_realm(player_ptr, bi_key)) { return false; } @@ -215,27 +218,27 @@ bool is_autopick_match(PlayerType *player_ptr, ItemEntity *o_ptr, autopick_type PlayerClass pc(player_ptr); auto realm_except_class = pc.equals(PlayerClassType::SORCERER) || pc.equals(PlayerClassType::RED_MAGE); - if (IS_FLG(FLG_REALM1) && ((get_realm1_book(player_ptr) != o_ptr->tval) || realm_except_class)) { + if (IS_FLG(FLG_REALM1) && ((get_realm1_book(player_ptr) != tval) || realm_except_class)) { return false; } - if (IS_FLG(FLG_REALM2) && ((get_realm2_book(player_ptr) != o_ptr->tval) || realm_except_class)) { + if (IS_FLG(FLG_REALM2) && ((get_realm2_book(player_ptr) != tval) || realm_except_class)) { return false; } - if (IS_FLG(FLG_FIRST) && (!o_ptr->is_spell_book() || (o_ptr->sval != 0))) { + if (IS_FLG(FLG_FIRST) && (!o_ptr->is_spell_book() || (sval != 0))) { return false; } - if (IS_FLG(FLG_SECOND) && (!o_ptr->is_spell_book() || (o_ptr->sval != 1))) { + if (IS_FLG(FLG_SECOND) && (!o_ptr->is_spell_book() || (sval != 1))) { return false; } - if (IS_FLG(FLG_THIRD) && (!o_ptr->is_spell_book() || (o_ptr->sval != 2))) { + if (IS_FLG(FLG_THIRD) && (!o_ptr->is_spell_book() || (sval != 2))) { return false; } - if (IS_FLG(FLG_FOURTH) && (!o_ptr->is_spell_book() || (o_ptr->sval != 3))) { + if (IS_FLG(FLG_FOURTH) && (!o_ptr->is_spell_book() || (sval != 3))) { return false; } @@ -256,7 +259,7 @@ bool is_autopick_match(PlayerType *player_ptr, ItemEntity *o_ptr, autopick_type return false; } } else if (IS_FLG(FLG_DEVICES)) { - switch (o_ptr->tval) { + switch (tval) { case ItemKindType::SCROLL: case ItemKindType::STAFF: case ItemKindType::WAND: @@ -266,11 +269,11 @@ bool is_autopick_match(PlayerType *player_ptr, ItemEntity *o_ptr, autopick_type return false; } } else if (IS_FLG(FLG_LIGHTS)) { - if (!(o_ptr->tval == ItemKindType::LITE)) { + if (!(tval == ItemKindType::LITE)) { return false; } } else if (IS_FLG(FLG_JUNKS)) { - switch (o_ptr->tval) { + switch (tval) { case ItemKindType::SKELETON: case ItemKindType::BOTTLE: case ItemKindType::JUNK: @@ -280,7 +283,7 @@ bool is_autopick_match(PlayerType *player_ptr, ItemEntity *o_ptr, autopick_type return false; } } else if (IS_FLG(FLG_CORPSES)) { - if (o_ptr->tval != ItemKindType::CORPSE && o_ptr->tval != ItemKindType::SKELETON) { + if (tval != ItemKindType::CORPSE && tval != ItemKindType::SKELETON) { return false; } } else if (IS_FLG(FLG_SPELLBOOKS)) { @@ -288,43 +291,43 @@ bool is_autopick_match(PlayerType *player_ptr, ItemEntity *o_ptr, autopick_type return false; } } else if (IS_FLG(FLG_HAFTED)) { - if (!(o_ptr->tval == ItemKindType::HAFTED)) { + if (!(tval == ItemKindType::HAFTED)) { return false; } } else if (IS_FLG(FLG_SHIELDS)) { - if (!(o_ptr->tval == ItemKindType::SHIELD)) { + if (!(tval == ItemKindType::SHIELD)) { return false; } } else if (IS_FLG(FLG_BOWS)) { - if (!(o_ptr->tval == ItemKindType::BOW)) { + if (!(tval == ItemKindType::BOW)) { return false; } } else if (IS_FLG(FLG_RINGS)) { - if (!(o_ptr->tval == ItemKindType::RING)) { + if (!(tval == ItemKindType::RING)) { return false; } } else if (IS_FLG(FLG_AMULETS)) { - if (!(o_ptr->tval == ItemKindType::AMULET)) { + if (!(tval == ItemKindType::AMULET)) { return false; } } else if (IS_FLG(FLG_SUITS)) { - if (!(o_ptr->tval == ItemKindType::DRAG_ARMOR || o_ptr->tval == ItemKindType::HARD_ARMOR || o_ptr->tval == ItemKindType::SOFT_ARMOR)) { + if (!(tval == ItemKindType::DRAG_ARMOR || tval == ItemKindType::HARD_ARMOR || tval == ItemKindType::SOFT_ARMOR)) { return false; } } else if (IS_FLG(FLG_CLOAKS)) { - if (!(o_ptr->tval == ItemKindType::CLOAK)) { + if (!(tval == ItemKindType::CLOAK)) { return false; } } else if (IS_FLG(FLG_HELMS)) { - if (!(o_ptr->tval == ItemKindType::CROWN || o_ptr->tval == ItemKindType::HELM)) { + if (!(tval == ItemKindType::CROWN || tval == ItemKindType::HELM)) { return false; } } else if (IS_FLG(FLG_GLOVES)) { - if (!(o_ptr->tval == ItemKindType::GLOVES)) { + if (!(tval == ItemKindType::GLOVES)) { return false; } } else if (IS_FLG(FLG_BOOTS)) { - if (!(o_ptr->tval == ItemKindType::BOOTS)) { + if (!(tval == ItemKindType::BOOTS)) { return false; } } diff --git a/src/cmd-action/cmd-hissatsu.cpp b/src/cmd-action/cmd-hissatsu.cpp index 0f3889a083..233c4b74aa 100644 --- a/src/cmd-action/cmd-hissatsu.cpp +++ b/src/cmd-action/cmd-hissatsu.cpp @@ -390,8 +390,9 @@ void do_cmd_gain_hissatsu(PlayerType *player_ptr) return; } + const auto sval = o_ptr->bi_key.sval().value(); auto gain = false; - for (auto i = o_ptr->sval * 8; i < o_ptr->sval * 8 + 8; i++) { + for (auto i = sval * 8; i < sval * 8 + 8; i++) { if (player_ptr->spell_learned1 & (1UL << i)) { continue; } diff --git a/src/cmd-action/cmd-open-close.cpp b/src/cmd-action/cmd-open-close.cpp index 71300a79de..81cfb7ec00 100644 --- a/src/cmd-action/cmd-open-close.cpp +++ b/src/cmd-action/cmd-open-close.cpp @@ -335,7 +335,7 @@ static bool get_spike(PlayerType *player_ptr, INVENTORY_IDX *ip) continue; } - if (o_ptr->tval == ItemKindType::SPIKE) { + if (o_ptr->bi_key.tval() == ItemKindType::SPIKE) { *ip = i; return true; } diff --git a/src/cmd-action/cmd-shoot.cpp b/src/cmd-action/cmd-shoot.cpp index 23563c1379..21b856d5fd 100644 --- a/src/cmd-action/cmd-shoot.cpp +++ b/src/cmd-action/cmd-shoot.cpp @@ -31,20 +31,22 @@ void do_cmd_fire(PlayerType *player_ptr, SPELL_IDX snipe_type) } player_ptr->is_fired = false; - auto *j_ptr = &player_ptr->inventory_list[INVEN_BOW]; - if (j_ptr->tval == ItemKindType::NONE) { + auto *item_ptr = &player_ptr->inventory_list[INVEN_BOW]; + const auto tval = item_ptr->bi_key.tval(); + if (tval == ItemKindType::NONE) { msg_print(_("射撃用の武器を持っていない。", "You have nothing to fire with.")); flush(); return; } - if (j_ptr->sval == SV_CRIMSON) { + const auto sval = item_ptr->bi_key.sval(); + if (sval == SV_CRIMSON) { msg_print(_("この武器は発動して使うもののようだ。", "It's already activated.")); flush(); return; } - if (j_ptr->sval == SV_HARP) { + if (sval == SV_HARP) { msg_print(_("この武器で射撃はできない。", "It's not for firing.")); flush(); return; @@ -60,7 +62,7 @@ void do_cmd_fire(PlayerType *player_ptr, SPELL_IDX snipe_type) return; } - exe_fire(player_ptr, item, j_ptr, snipe_type); + exe_fire(player_ptr, item, item_ptr, snipe_type); if (!player_ptr->is_fired || !PlayerClass(player_ptr).equals(PlayerClassType::SNIPER)) { return; } diff --git a/src/cmd-action/cmd-spell.cpp b/src/cmd-action/cmd-spell.cpp index 19f4df972f..bbe46d5f2f 100644 --- a/src/cmd-action/cmd-spell.cpp +++ b/src/cmd-action/cmd-spell.cpp @@ -553,7 +553,7 @@ static void confirm_use_force(PlayerType *player_ptr, bool browse_only) static FuncItemTester get_castable_spellbook_tester(PlayerType *player_ptr) { - return FuncItemTester([](auto p_ptr, auto o_ptr) { return check_book_realm(p_ptr, { o_ptr->tval, o_ptr->sval }); }, player_ptr); + return FuncItemTester([](auto p_ptr, auto o_ptr) { return check_book_realm(p_ptr, o_ptr->bi_key); }, player_ptr); } static FuncItemTester get_learnable_spellbook_tester(PlayerType *player_ptr) @@ -579,7 +579,6 @@ static FuncItemTester get_learnable_spellbook_tester(PlayerType *player_ptr) void do_cmd_browse(PlayerType *player_ptr) { OBJECT_IDX item; - OBJECT_SUBTYPE_VALUE sval; int j, line; SPELL_IDX spell = -1; int num = 0; @@ -619,9 +618,9 @@ void do_cmd_browse(PlayerType *player_ptr) } /* Access the item's sval */ - sval = o_ptr->sval; - - short use_realm = tval2realm(o_ptr->tval); + const auto tval = o_ptr->bi_key.tval(); + const auto sval = o_ptr->bi_key.sval().value(); + short use_realm = tval2realm(tval); /* Track the object kind */ object_kind_track(player_ptr, o_ptr->bi_id); @@ -642,7 +641,7 @@ void do_cmd_browse(PlayerType *player_ptr) /* Keep browsing spells. Exit browsing on cancel. */ while (true) { /* Ask for a spell, allow cancel */ - if (!get_spell(player_ptr, &spell, _("読む", "browse"), o_ptr->sval, true, use_realm)) { + if (!get_spell(player_ptr, &spell, _("読む", "browse"), sval, true, use_realm)) { /* If cancelled, leave immediately. */ if (spell == -1) { break; @@ -772,14 +771,16 @@ void do_cmd_study(PlayerType *player_ptr) return; } - const auto sval = o_ptr->sval; - if (o_ptr->tval == get_realm2_book(player_ptr)) { + const auto tval = o_ptr->bi_key.tval(); + const auto sval = o_ptr->bi_key.sval().value(); + if (tval == get_realm2_book(player_ptr)) { increment = 32; - } else if (o_ptr->tval != get_realm1_book(player_ptr)) { + } else if (tval != get_realm1_book(player_ptr)) { if (!get_check(_("本当に魔法の領域を変更しますか?", "Really, change magic realm? "))) { return; } - change_realm2(player_ptr, tval2realm(o_ptr->tval)); + + change_realm2(player_ptr, tval2realm(tval)); increment = 32; } @@ -790,7 +791,7 @@ void do_cmd_study(PlayerType *player_ptr) /* Mage -- Learn a selected spell */ if (mp_ptr->spell_book != ItemKindType::LIFE_BOOK) { /* Ask for a spell, allow cancel */ - if (!get_spell(player_ptr, &spell, _("学ぶ", "study"), sval, false, tval2realm(o_ptr->tval)) && (spell == -1)) { + if (!get_spell(player_ptr, &spell, _("学ぶ", "study"), sval, false, tval2realm(tval)) && (spell == -1)) { return; } } @@ -1006,8 +1007,9 @@ bool do_cmd_cast(PlayerType *player_ptr) return false; } - const auto sval = o_ptr->sval; - if (!is_every_magic && (o_ptr->tval == get_realm2_book(player_ptr))) { + const auto tval = o_ptr->bi_key.tval(); + const auto sval = o_ptr->bi_key.sval().value(); + if (!is_every_magic && (tval == get_realm2_book(player_ptr))) { increment = 32; } @@ -1016,7 +1018,7 @@ bool do_cmd_cast(PlayerType *player_ptr) handle_stuff(player_ptr); if (is_every_magic) { - realm = tval2realm(o_ptr->tval); + realm = tval2realm(tval); } else if (increment) { realm = player_ptr->realm2; } else { @@ -1044,7 +1046,7 @@ bool do_cmd_cast(PlayerType *player_ptr) } #endif - use_realm = tval2realm(o_ptr->tval); + use_realm = tval2realm(tval); if (use_realm == REALM_HEX) { if (SpellHex(player_ptr).is_spelling_specific(spell)) { msg_print(_("その呪文はすでに詠唱中だ。", "You are already casting it.")); @@ -1140,21 +1142,21 @@ bool do_cmd_cast(PlayerType *player_ptr) /* Failure casting may activate some side effect */ exe_spell(player_ptr, realm, spell, SpellProcessType::FAIL); - if ((o_ptr->tval == ItemKindType::CHAOS_BOOK) && (randint1(100) < spell)) { + if ((tval == ItemKindType::CHAOS_BOOK) && (randint1(100) < spell)) { msg_print(_("カオス的な効果を発生した!", "You produce a chaotic effect!")); wild_magic(player_ptr, spell); - } else if ((o_ptr->tval == ItemKindType::DEATH_BOOK) && (randint1(100) < spell)) { + } else if ((tval == ItemKindType::DEATH_BOOK) && (randint1(100) < spell)) { if ((sval == 3) && one_in_(2)) { sanity_blast(player_ptr, 0, true); } else { msg_print(_("痛い!", "It hurts!")); - take_hit(player_ptr, DAMAGE_LOSELIFE, damroll(o_ptr->sval + 1, 6), _("暗黒魔法の逆流", "a miscast Death spell")); + take_hit(player_ptr, DAMAGE_LOSELIFE, damroll(sval + 1, 6), _("暗黒魔法の逆流", "a miscast Death spell")); if ((spell > 15) && one_in_(6) && !player_ptr->hold_exp) { lose_exp(player_ptr, spell * 250); } } - } else if ((o_ptr->tval == ItemKindType::MUSIC_BOOK) && (randint1(200) < spell)) { + } else if ((tval == ItemKindType::MUSIC_BOOK) && (randint1(200) < spell)) { msg_print(_("いやな音が響いた", "An infernal sound echoed.")); aggravate_monsters(player_ptr, 0); } diff --git a/src/cmd-item/cmd-destroy.cpp b/src/cmd-item/cmd-destroy.cpp index eaaaad296c..b240a6bda9 100644 --- a/src/cmd-item/cmd-destroy.cpp +++ b/src/cmd-item/cmd-destroy.cpp @@ -126,15 +126,15 @@ static bool decide_magic_book_exp(PlayerType *player_ptr, destroy_type *destroy_ } PlayerClass pc(player_ptr); + const auto tval = destroy_ptr->o_ptr->bi_key.tval(); if (pc.equals(PlayerClassType::WARRIOR) || pc.equals(PlayerClassType::BERSERKER)) { - return destroy_ptr->q_ptr->tval != ItemKindType::HISSATSU_BOOK; + return tval != ItemKindType::HISSATSU_BOOK; } if (!pc.equals(PlayerClassType::PALADIN)) { return false; } - const auto tval = destroy_ptr->o_ptr->tval; auto is_good_magic_realm = (tval == ItemKindType::LIFE_BOOK) || (tval == ItemKindType::CRUSADE_BOOK); if (is_good_realm(player_ptr->realm1)) { return !is_good_magic_realm; @@ -155,7 +155,7 @@ static void gain_exp_by_destroying_magic_book(PlayerType *player_ptr, destroy_ty tester_exp = 10000; } - if (destroy_ptr->q_ptr->sval < 3) { + if (destroy_ptr->q_ptr->bi_key.sval() < 3) { tester_exp /= 4; } @@ -170,7 +170,7 @@ static void gain_exp_by_destroying_magic_book(PlayerType *player_ptr, destroy_ty static void process_destroy_magic_book(PlayerType *player_ptr, destroy_type *destroy_ptr) { const auto *q_ptr = destroy_ptr->q_ptr; - const BaseitemKey bi_key(q_ptr->tval, q_ptr->sval); + const BaseitemKey &bi_key = q_ptr->bi_key; if (!bi_key.is_high_level_book()) { return; } diff --git a/src/cmd-item/cmd-eat.cpp b/src/cmd-item/cmd-eat.cpp index a7ddf900ca..aa941752e7 100644 --- a/src/cmd-item/cmd-eat.cpp +++ b/src/cmd-item/cmd-eat.cpp @@ -157,7 +157,7 @@ static bool exe_eat_charge_of_magic_device(PlayerType *player_ptr, ItemEntity *o return false; } - const auto is_staff = o_ptr->tval == ItemKindType::STAFF; + const auto is_staff = o_ptr->bi_key.tval() == ItemKindType::STAFF; if (is_staff && (inventory < 0) && (o_ptr->number > 1)) { msg_print(_("まずは杖を拾わなければ。", "You must first pick up the staffs.")); return true; @@ -232,7 +232,8 @@ void exe_eat_food(PlayerType *player_ptr, INVENTORY_IDX item) int lev = baseitems_info[o_ptr->bi_id].level; /* Identity not known yet */ - int ident = exe_eat_food_type_object(player_ptr, { o_ptr->tval, o_ptr->sval }); + const auto &bi_key = o_ptr->bi_key; + const auto ident = exe_eat_food_type_object(player_ptr, bi_key); /* * Store what may have to be updated for the inventory (including @@ -251,7 +252,8 @@ void exe_eat_food(PlayerType *player_ptr, INVENTORY_IDX item) } /* We have tried it */ - if (o_ptr->tval == ItemKindType::FOOD) { + const auto tval = bi_key.tval(); + if (tval == ItemKindType::FOOD) { object_tried(o_ptr); } @@ -273,7 +275,7 @@ void exe_eat_food(PlayerType *player_ptr, INVENTORY_IDX item) /* Balrogs change humanoid corpses to energy */ const auto corpse_r_idx = i2enum(o_ptr->pval); - if (food_type == PlayerRaceFoodType::CORPSE && (o_ptr->tval == ItemKindType::CORPSE && o_ptr->sval == SV_CORPSE && angband_strchr("pht", monraces_info[corpse_r_idx].d_char))) { + if (food_type == PlayerRaceFoodType::CORPSE && (bi_key == BaseitemKey(ItemKindType::CORPSE, SV_CORPSE) && angband_strchr("pht", monraces_info[corpse_r_idx].d_char))) { GAME_TEXT o_name[MAX_NLEN]; describe_flavor(player_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); msg_format(_("%sは燃え上り灰になった。精力を吸収した気がする。", "%^s is burnt to ashes. You absorb its vitality!"), o_name); @@ -285,12 +287,13 @@ void exe_eat_food(PlayerType *player_ptr, INVENTORY_IDX item) } if (PlayerRace(player_ptr).equals(PlayerRaceType::SKELETON)) { - if (!((o_ptr->sval == SV_FOOD_WAYBREAD) || (o_ptr->sval < SV_FOOD_BISCUIT))) { + const auto sval = bi_key.sval(); + if ((sval != SV_FOOD_WAYBREAD) && (sval >= SV_FOOD_BISCUIT)) { ItemEntity forge; auto *q_ptr = &forge; msg_print(_("食べ物がアゴを素通りして落ちた!", "The food falls through your jaws!")); - q_ptr->prep(lookup_baseitem_id({ o_ptr->tval, o_ptr->sval })); + q_ptr->prep(lookup_baseitem_id(bi_key)); /* Drop the object from heaven */ (void)drop_near(player_ptr, q_ptr, -1, player_ptr->y, player_ptr->x); @@ -312,7 +315,7 @@ void exe_eat_food(PlayerType *player_ptr, INVENTORY_IDX item) msg_print(_("生者の食物はあなたにとってほとんど栄養にならない。", "The food of mortals is poor sustenance for you.")); set_food(player_ptr, player_ptr->food + ((o_ptr->pval) / 20)); } else { - if (o_ptr->tval == ItemKindType::FOOD && o_ptr->sval == SV_FOOD_WAYBREAD) { + if (bi_key == BaseitemKey(ItemKindType::FOOD, SV_FOOD_WAYBREAD)) { /* Waybread is always fully satisfying. */ set_food(player_ptr, std::max(player_ptr->food, PY_FOOD_MAX - 1)); } else { diff --git a/src/cmd-item/cmd-equipment.cpp b/src/cmd-item/cmd-equipment.cpp index 70ba3d786c..f758b7da1a 100644 --- a/src/cmd-item/cmd-equipment.cpp +++ b/src/cmd-item/cmd-equipment.cpp @@ -147,8 +147,8 @@ void do_cmd_wield(PlayerType *player_ptr) const auto o_ptr_mh = &player_ptr->inventory_list[INVEN_MAIN_HAND]; const auto o_ptr_sh = &player_ptr->inventory_list[INVEN_SUB_HAND]; - - switch (o_ptr->tval) { + const auto tval = o_ptr->bi_key.tval(); + switch (tval) { case ItemKindType::CAPTURE: case ItemKindType::SHIELD: case ItemKindType::CARD: @@ -165,7 +165,7 @@ void do_cmd_wield(PlayerType *player_ptr) } else if (has_melee_weapon(player_ptr, INVEN_SUB_HAND)) { slot = INVEN_MAIN_HAND; } else if (o_ptr_mh->bi_id && o_ptr_sh->bi_id && - ((o_ptr->tval == ItemKindType::CAPTURE) || (!o_ptr_mh->is_melee_weapon() && !o_ptr_sh->is_melee_weapon()))) { + ((tval == ItemKindType::CAPTURE) || (!o_ptr_mh->is_melee_weapon() && !o_ptr_sh->is_melee_weapon()))) { q = _("どちらの手に装備しますか?", "Equip which hand? "); s = _("おっと。", "Oops."); if (!choose_object(player_ptr, &slot, q, s, (USE_EQUIP), FuncItemTester(&ItemEntity::is_wieldable_in_etheir_hand))) { diff --git a/src/cmd-item/cmd-item.cpp b/src/cmd-item/cmd-item.cpp index 4817132108..71d47fdb69 100644 --- a/src/cmd-item/cmd-item.cpp +++ b/src/cmd-item/cmd-item.cpp @@ -254,7 +254,7 @@ void do_cmd_use(PlayerType *player_ptr) return; } - switch (o_ptr->tval) { + switch (o_ptr->bi_key.tval()) { case ItemKindType::SPIKE: do_cmd_spike(player_ptr); break; diff --git a/src/cmd-item/cmd-magiceat.cpp b/src/cmd-item/cmd-magiceat.cpp index 26361cc674..5795715aa8 100644 --- a/src/cmd-item/cmd-magiceat.cpp +++ b/src/cmd-item/cmd-magiceat.cpp @@ -84,7 +84,6 @@ #include "view/display-messages.h" #include #include -#include static std::optional check_magic_eater_spell_repeat(magic_eater_data_type *magic_eater_data) { diff --git a/src/cmd-item/cmd-refill.cpp b/src/cmd-item/cmd-refill.cpp index 2c3b4ec3fe..0cc65f657e 100644 --- a/src/cmd-item/cmd-refill.cpp +++ b/src/cmd-item/cmd-refill.cpp @@ -106,16 +106,14 @@ static void do_cmd_refill_torch(PlayerType *player_ptr) */ void do_cmd_refill(PlayerType *player_ptr) { - ItemEntity *o_ptr; - o_ptr = &player_ptr->inventory_list[INVEN_LITE]; - PlayerClass(player_ptr).break_samurai_stance({ SamuraiStanceType::MUSOU }); - - if (o_ptr->tval != ItemKindType::LITE) { + const auto *o_ptr = &player_ptr->inventory_list[INVEN_LITE]; + const auto &bi_key = o_ptr->bi_key; + if (bi_key.tval() != ItemKindType::LITE) { msg_print(_("光源を装備していない。", "You are not wielding a light.")); - } else if (o_ptr->sval == SV_LITE_LANTERN) { + } else if (bi_key.sval() == SV_LITE_LANTERN) { do_cmd_refill_lamp(player_ptr); - } else if (o_ptr->sval == SV_LITE_TORCH) { + } else if (bi_key.sval() == SV_LITE_TORCH) { do_cmd_refill_torch(player_ptr); } else { msg_print(_("この光源は寿命を延ばせない。", "Your light cannot be refilled.")); diff --git a/src/combat/attack-accuracy.cpp b/src/combat/attack-accuracy.cpp index 61214b70bb..91b6fdb330 100644 --- a/src/combat/attack-accuracy.cpp +++ b/src/combat/attack-accuracy.cpp @@ -125,9 +125,9 @@ bool check_hit_from_monster_to_monster(int power, DEPTH level, ARMOUR_CLASS ac, static bool decide_attack_hit(PlayerType *player_ptr, player_attack_type *pa_ptr, int chance) { bool success_hit = false; - auto *o_ptr = &player_ptr->inventory_list[INVEN_MAIN_HAND + pa_ptr->hand]; + auto *o_ptr = &player_ptr->inventory_list[enum2i(INVEN_MAIN_HAND) + pa_ptr->hand]; auto *r_ptr = &monraces_info[pa_ptr->m_ptr->r_idx]; - if (((o_ptr->tval == ItemKindType::SWORD) && (o_ptr->sval == SV_POISON_NEEDLE)) || (pa_ptr->mode == HISSATSU_KYUSHO)) { + if ((o_ptr->bi_key == BaseitemKey(ItemKindType::SWORD, SV_POISON_NEEDLE)) || (pa_ptr->mode == HISSATSU_KYUSHO)) { int n = 1; if (can_attack_with_main_hand(player_ptr) && can_attack_with_sub_hand(player_ptr)) { @@ -161,7 +161,7 @@ static bool decide_attack_hit(PlayerType *player_ptr, player_attack_type *pa_ptr */ bool process_attack_hit(PlayerType *player_ptr, player_attack_type *pa_ptr, int chance) { - auto *o_ptr = &player_ptr->inventory_list[INVEN_MAIN_HAND + pa_ptr->hand]; + auto *o_ptr = &player_ptr->inventory_list[enum2i(INVEN_MAIN_HAND) + pa_ptr->hand]; if (decide_attack_hit(player_ptr, pa_ptr, chance)) { return true; } @@ -169,7 +169,7 @@ bool process_attack_hit(PlayerType *player_ptr, player_attack_type *pa_ptr, int pa_ptr->backstab = false; /* Clumsy! */ pa_ptr->surprise_attack = false; /* Clumsy! */ - if ((o_ptr->tval == ItemKindType::POLEARM) && (o_ptr->sval == SV_DEATH_SCYTHE) && one_in_(3)) { + if ((o_ptr->bi_key == BaseitemKey(ItemKindType::POLEARM, SV_DEATH_SCYTHE)) && one_in_(3)) { process_death_scythe_reflection(player_ptr, pa_ptr); } else { sound(SOUND_MISS); diff --git a/src/combat/attack-criticality.cpp b/src/combat/attack-criticality.cpp index efc98a22c6..c3d03bafeb 100644 --- a/src/combat/attack-criticality.cpp +++ b/src/combat/attack-criticality.cpp @@ -123,9 +123,9 @@ static void ninja_critical(PlayerType *player_ptr, player_attack_type *pa_ptr) */ void critical_attack(PlayerType *player_ptr, player_attack_type *pa_ptr) { - auto *o_ptr = &player_ptr->inventory_list[INVEN_MAIN_HAND + pa_ptr->hand]; + auto *o_ptr = &player_ptr->inventory_list[enum2i(INVEN_MAIN_HAND) + pa_ptr->hand]; auto *r_ptr = &monraces_info[pa_ptr->m_ptr->r_idx]; - if (((o_ptr->tval == ItemKindType::SWORD) && (o_ptr->sval == SV_POISON_NEEDLE)) || (pa_ptr->mode == HISSATSU_KYUSHO)) { + if ((o_ptr->bi_key == BaseitemKey(ItemKindType::SWORD, SV_POISON_NEEDLE)) || (pa_ptr->mode == HISSATSU_KYUSHO)) { if ((randint1(randint1(r_ptr->level / 7) + 5) == 1) && r_ptr->kind_flags.has_not(MonsterKindType::UNIQUE) && !(r_ptr->flags7 & RF7_UNIQUE2)) { pa_ptr->attack_damage = pa_ptr->m_ptr->hp + 1; msg_format(_("%sの急所を突き刺した!", "You hit %s on a fatal spot!"), pa_ptr->m_name); @@ -136,7 +136,12 @@ void critical_attack(PlayerType *player_ptr, player_attack_type *pa_ptr) return; } - bool is_ninja_hit = PlayerClass(player_ptr).equals(PlayerClassType::NINJA) && has_melee_weapon(player_ptr, INVEN_MAIN_HAND + pa_ptr->hand) && !player_ptr->is_icky_wield[pa_ptr->hand] && ((player_ptr->cur_lite <= 0) || one_in_(7)); + if (!PlayerClass(player_ptr).equals(PlayerClassType::NINJA)) { + return; + } + + const auto has_weapon = has_melee_weapon(player_ptr, enum2i(INVEN_MAIN_HAND) + pa_ptr->hand); + const auto is_ninja_hit = has_weapon && !player_ptr->is_icky_wield[pa_ptr->hand] && ((player_ptr->cur_lite <= 0) || one_in_(7)); if (is_ninja_hit) { ninja_critical(player_ptr, pa_ptr); } diff --git a/src/combat/shoot.cpp b/src/combat/shoot.cpp index 1257963c1f..50c82ce9fb 100644 --- a/src/combat/shoot.cpp +++ b/src/combat/shoot.cpp @@ -165,7 +165,7 @@ static MULTIPLY calc_shot_damage_with_slay( flags = bow_flags | arrow_flags; /* Some "weapons" and "ammo" do extra damage */ - switch (arrow_ptr->tval) { + switch (arrow_ptr->bi_key.tval()) { case ItemKindType::SHOT: case ItemKindType::ARROW: case ItemKindType::BOLT: { @@ -524,10 +524,12 @@ void exe_fire(PlayerType *player_ptr, INVENTORY_IDX item, ItemEntity *j_ptr, SPE auto tdam_base = damroll(o_ptr->dd, o_ptr->ds) + o_ptr->to_d + j_ptr->to_d; /* Actually "fire" the object */ + const auto tval = j_ptr->bi_key.tval(); + const auto sval = j_ptr->bi_key.sval().value(); auto bonus = (player_ptr->to_h_b + o_ptr->to_h + j_ptr->to_h); int chance; - auto weapon_exp = player_ptr->weapon_exp[j_ptr->tval][j_ptr->sval]; - if ((j_ptr->sval == SV_LIGHT_XBOW) || (j_ptr->sval == SV_HEAVY_XBOW)) { + auto weapon_exp = player_ptr->weapon_exp[tval][sval]; + if ((sval == SV_LIGHT_XBOW) || (sval == SV_HEAVY_XBOW)) { chance = (player_ptr->skill_thb + (weapon_exp / 400 + bonus) * BTH_PLUS_ADJ); } else { chance = (player_ptr->skill_thb + ((weapon_exp - (PlayerSkill::weapon_exp_at(PlayerSkillRank::MASTER) / 2)) / 200 + bonus) * BTH_PLUS_ADJ); @@ -552,7 +554,7 @@ void exe_fire(PlayerType *player_ptr, INVENTORY_IDX item, ItemEntity *j_ptr, SPE /* Base range */ tdis = 13 + tmul / 80; - if ((j_ptr->sval == SV_LIGHT_XBOW) || (j_ptr->sval == SV_HEAVY_XBOW)) { + if ((sval == SV_LIGHT_XBOW) || (sval == SV_HEAVY_XBOW)) { tdis -= (5 - (sniper_concent + 1) / 2); } @@ -789,7 +791,9 @@ void exe_fire(PlayerType *player_ptr, INVENTORY_IDX item, ItemEntity *j_ptr, SPE } if (snipe_type == SP_NEEDLE) { - if ((randint1(randint1(r_ptr->level / (3 + sniper_concent)) + (8 - sniper_concent)) == 1) && r_ptr->kind_flags.has_not(MonsterKindType::UNIQUE) && none_bits(r_ptr->flags7, RF7_UNIQUE2)) { + const auto is_unique = r_ptr->kind_flags.has(MonsterKindType::UNIQUE); + const auto fatality = randint1(r_ptr->level / (3 + sniper_concent)) + (8 - sniper_concent); + if ((randint1(fatality) == 1) && !is_unique && none_bits(r_ptr->flags7, RF7_UNIQUE2)) { GAME_TEXT m_name[MAX_NLEN]; /* Get "the monster" or "it" */ @@ -1064,16 +1068,16 @@ bool test_hit_fire(PlayerType *player_ptr, int chance, MonsterEntity *m_ptr, int */ int critical_shot(PlayerType *player_ptr, WEIGHT weight, int plus_ammo, int plus_bow, int dam) { - int i, k; auto *j_ptr = &player_ptr->inventory_list[INVEN_BOW]; /* Extract "shot" power */ - i = player_ptr->to_h_b + plus_ammo; - + auto i = player_ptr->to_h_b + plus_ammo; + const auto tval = j_ptr->bi_key.tval(); + const auto sval = j_ptr->bi_key.sval().value(); if (player_ptr->tval_ammo == ItemKindType::BOLT) { - i = (player_ptr->skill_thb + (player_ptr->weapon_exp[j_ptr->tval][j_ptr->sval] / 400 + i) * BTH_PLUS_ADJ); + i = (player_ptr->skill_thb + (player_ptr->weapon_exp[tval][sval] / 400 + i) * BTH_PLUS_ADJ); } else { - i = (player_ptr->skill_thb + ((player_ptr->weapon_exp[j_ptr->tval][j_ptr->sval] - (PlayerSkill::weapon_exp_at(PlayerSkillRank::MASTER) / 2)) / 200 + i) * BTH_PLUS_ADJ); + i = (player_ptr->skill_thb + ((player_ptr->weapon_exp[tval][sval] - (PlayerSkill::weapon_exp_at(PlayerSkillRank::MASTER) / 2)) / 200 + i) * BTH_PLUS_ADJ); } PlayerClass pc(player_ptr); @@ -1091,8 +1095,7 @@ int critical_shot(PlayerType *player_ptr, WEIGHT weight, int plus_ammo, int plus /* Critical hit */ if (randint1(10000) <= i) { - k = weight * randint1(500); - + const auto k = weight * randint1(500); if (k < 900) { msg_print(_("手ごたえがあった!", "It was a good hit!")); dam += (dam / 2); @@ -1118,16 +1121,16 @@ int critical_shot(PlayerType *player_ptr, WEIGHT weight, int plus_ammo, int plus */ int calc_crit_ratio_shot(PlayerType *player_ptr, int plus_ammo, int plus_bow) { - int i; auto *j_ptr = &player_ptr->inventory_list[INVEN_BOW]; /* Extract "shot" power */ - i = player_ptr->to_h_b + plus_ammo; - + auto i = player_ptr->to_h_b + plus_ammo; + const auto tval = j_ptr->bi_key.tval(); + const auto sval = j_ptr->bi_key.sval().value(); if (player_ptr->tval_ammo == ItemKindType::BOLT) { - i = (player_ptr->skill_thb + (player_ptr->weapon_exp[j_ptr->tval][j_ptr->sval] / 400 + i) * BTH_PLUS_ADJ); + i = (player_ptr->skill_thb + (player_ptr->weapon_exp[tval][sval] / 400 + i) * BTH_PLUS_ADJ); } else { - i = (player_ptr->skill_thb + ((player_ptr->weapon_exp[j_ptr->tval][j_ptr->sval] - (PlayerSkill::weapon_exp_at(PlayerSkillRank::MASTER) / 2)) / 200 + i) * BTH_PLUS_ADJ); + i = (player_ptr->skill_thb + ((player_ptr->weapon_exp[tval][sval] - (PlayerSkill::weapon_exp_at(PlayerSkillRank::MASTER) / 2)) / 200 + i) * BTH_PLUS_ADJ); } PlayerClass pc(player_ptr); diff --git a/src/combat/slaying.cpp b/src/combat/slaying.cpp index 1ab0e62861..ee7f87d336 100644 --- a/src/combat/slaying.cpp +++ b/src/combat/slaying.cpp @@ -178,7 +178,7 @@ int calc_attack_damage_with_slay(PlayerType *player_ptr, ItemEntity *o_ptr, int } MULTIPLY mult = 10; - switch (o_ptr->tval) { + switch (o_ptr->bi_key.tval()) { case ItemKindType::SHOT: case ItemKindType::ARROW: case ItemKindType::BOLT: diff --git a/src/effect/effect-item.cpp b/src/effect/effect-item.cpp index 415ad2f945..82a9412c67 100644 --- a/src/effect/effect-item.cpp +++ b/src/effect/effect-item.cpp @@ -179,7 +179,7 @@ bool affect_item(PlayerType *player_ptr, MONSTER_IDX who, POSITION r, POSITION y note_kill = _("壊れてしまった!", (plural ? " are destroyed!" : " is destroyed!")); if (flags.has(TR_RES_CHAOS)) { ignore = true; - } else if ((o_ptr->tval == ItemKindType::SCROLL) && (o_ptr->sval == SV_SCROLL_CHAOS)) { + } else if (o_ptr->bi_key == BaseitemKey(ItemKindType::SCROLL, SV_SCROLL_CHAOS)) { ignore = true; } break; @@ -205,9 +205,10 @@ bool affect_item(PlayerType *player_ptr, MONSTER_IDX who, POSITION r, POSITION y } case AttributeType::KILL_TRAP: case AttributeType::KILL_DOOR: { - if (o_ptr->tval != ItemKindType::CHEST) { + if (o_ptr->bi_key.tval() != ItemKindType::CHEST) { break; } + if (o_ptr->pval <= 0) { break; } @@ -222,7 +223,7 @@ bool affect_item(PlayerType *player_ptr, MONSTER_IDX who, POSITION r, POSITION y break; } case AttributeType::ANIM_DEAD: { - if (o_ptr->tval != ItemKindType::CORPSE) { + if (o_ptr->bi_key.tval() != ItemKindType::CORPSE) { break; } @@ -233,7 +234,8 @@ bool affect_item(PlayerType *player_ptr, MONSTER_IDX who, POSITION r, POSITION y for (int i = 0; i < o_ptr->number; i++) { auto corpse_r_idx = i2enum(o_ptr->pval); - if (((o_ptr->sval == SV_CORPSE) && (randint1(100) > 80)) || ((o_ptr->sval == SV_SKELETON) && (randint1(100) > 60))) { + const auto sval = o_ptr->bi_key.sval().value(); + if (((sval == SV_CORPSE) && (randint1(100) > 80)) || ((sval == SV_SKELETON) && (randint1(100) > 60))) { if (!note_kill) { note_kill = _("灰になった。", (plural ? " become dust." : " becomes dust.")); } diff --git a/src/flavor/flavor-describer.cpp b/src/flavor/flavor-describer.cpp index 105162b93b..434393ae5d 100644 --- a/src/flavor/flavor-describer.cpp +++ b/src/flavor/flavor-describer.cpp @@ -119,7 +119,7 @@ static void describe_chest_trap(flavor_type *flavor_ptr) static void describe_chest(flavor_type *flavor_ptr) { - if (flavor_ptr->o_ptr->tval != ItemKindType::CHEST) { + if (flavor_ptr->o_ptr->bi_key.tval() != ItemKindType::CHEST) { return; } @@ -234,7 +234,7 @@ static void describe_bow(PlayerType *player_ptr, flavor_type *flavor_ptr) static void describe_tval(PlayerType *player_ptr, flavor_type *flavor_ptr) { - switch (flavor_ptr->o_ptr->tval) { + switch (flavor_ptr->o_ptr->bi_key.tval()) { case ItemKindType::SHOT: case ItemKindType::BOLT: case ItemKindType::ARROW: @@ -414,7 +414,7 @@ static void describe_charges_staff_wand(flavor_type *flavor_ptr) { flavor_ptr->t = object_desc_chr(flavor_ptr->t, ' '); flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p1); - if ((flavor_ptr->o_ptr->tval == ItemKindType::STAFF) && (flavor_ptr->o_ptr->number > 1)) { + if ((flavor_ptr->o_ptr->bi_key.tval() == ItemKindType::STAFF) && (flavor_ptr->o_ptr->number > 1)) { flavor_ptr->t = object_desc_num(flavor_ptr->t, flavor_ptr->o_ptr->number); flavor_ptr->t = object_desc_str(flavor_ptr->t, "x "); } @@ -510,7 +510,8 @@ static void describe_pval(flavor_type *flavor_ptr) static void describe_lamp_life(flavor_type *flavor_ptr) { - if ((flavor_ptr->o_ptr->tval != ItemKindType::LITE) || (flavor_ptr->o_ptr->is_fixed_artifact() || (flavor_ptr->o_ptr->sval == SV_LITE_FEANOR))) { + const auto &bi_key = flavor_ptr->o_ptr->bi_key; + if ((bi_key.tval() != ItemKindType::LITE) || (flavor_ptr->o_ptr->is_fixed_artifact() || (bi_key.sval() == SV_LITE_FEANOR))) { return; } @@ -530,15 +531,16 @@ static void describe_remaining(flavor_type *flavor_ptr) return; } + const auto tval = flavor_ptr->o_ptr->bi_key.tval(); if (flavor_ptr->o_ptr->is_wand_staff()) { describe_charges_staff_wand(flavor_ptr); - } else if (flavor_ptr->o_ptr->tval == ItemKindType::ROD) { + } else if (tval == ItemKindType::ROD) { describe_charges_rod(flavor_ptr); } describe_pval(flavor_ptr); describe_lamp_life(flavor_ptr); - if (flavor_ptr->o_ptr->timeout && (flavor_ptr->o_ptr->tval != ItemKindType::ROD)) { + if (flavor_ptr->o_ptr->timeout && (tval != ItemKindType::ROD)) { flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(充填中)", " (charging)")); } } @@ -556,7 +558,7 @@ static void decide_item_feeling(flavor_type *flavor_ptr) return; } - const auto tval = flavor_ptr->o_ptr->tval; + const auto tval = flavor_ptr->o_ptr->bi_key.tval(); auto unidentifiable = tval == ItemKindType::RING; unidentifiable |= tval == ItemKindType::AMULET; unidentifiable |= tval == ItemKindType::LITE; @@ -600,7 +602,7 @@ void describe_flavor(PlayerType *player_ptr, char *buf, ItemEntity *o_ptr, BIT_F describe_named_item_tval(flavor_ptr); if (!(mode & OD_DEBUG)) { flavor_ptr->bow_ptr = &player_ptr->inventory_list[INVEN_BOW]; - const auto tval = flavor_ptr->o_ptr->tval; + const auto tval = flavor_ptr->o_ptr->bi_key.tval(); if ((flavor_ptr->bow_ptr->bi_id != 0) && (tval == flavor_ptr->bow_ptr->get_arrow_kind())) { describe_bow_power(player_ptr, flavor_ptr); } else if (PlayerClass(player_ptr).equals(PlayerClassType::NINJA) && (tval == ItemKindType::SPIKE)) { diff --git a/src/flavor/flavor-util.cpp b/src/flavor/flavor-util.cpp index 150d4dd4d8..be95bc0047 100644 --- a/src/flavor/flavor-util.cpp +++ b/src/flavor/flavor-util.cpp @@ -409,7 +409,7 @@ void get_inscription(char *buff, ItemEntity *o_ptr) char *object_desc_count_japanese(char *t, ItemEntity *o_ptr) { t = object_desc_num(t, o_ptr->number); - switch (o_ptr->tval) { + switch (o_ptr->bi_key.tval()) { case ItemKindType::BOLT: case ItemKindType::ARROW: case ItemKindType::POLEARM: @@ -466,7 +466,7 @@ char *object_desc_count_japanese(char *t, ItemEntity *o_ptr) break; } case ItemKindType::FOOD: { - if (o_ptr->sval == SV_FOOD_JERKY) { + if (o_ptr->bi_key.sval().value() == SV_FOOD_JERKY) { t = object_desc_str(t, "切れ"); break; } diff --git a/src/flavor/named-item-describer.cpp b/src/flavor/named-item-describer.cpp index 45632b33fc..eaff95099c 100644 --- a/src/flavor/named-item-describer.cpp +++ b/src/flavor/named-item-describer.cpp @@ -256,7 +256,7 @@ static void describe_artifact_prefix_en(flavor_type *flavor_ptr) } const auto corpse_r_idx = i2enum(flavor_ptr->o_ptr->pval); - auto is_unique_corpse = flavor_ptr->o_ptr->tval == ItemKindType::CORPSE; + auto is_unique_corpse = flavor_ptr->o_ptr->bi_key.tval() == ItemKindType::CORPSE; is_unique_corpse &= monraces_info[corpse_r_idx].kind_flags.has(MonsterKindType::UNIQUE); if ((flavor_ptr->known && flavor_ptr->o_ptr->is_artifact()) || is_unique_corpse) { flavor_ptr->t = object_desc_str(flavor_ptr->t, "The "); @@ -382,7 +382,8 @@ void describe_named_item(PlayerType *player_ptr, flavor_type *flavor_ptr) #endif if (flavor_ptr->o_ptr->is_spell_book()) { // svalは0から数えているので表示用に+1している - flavor_ptr->t = object_desc_str(flavor_ptr->t, format("Lv%d ", flavor_ptr->o_ptr->sval + 1)); + const auto sval = flavor_ptr->o_ptr->bi_key.sval().value(); + flavor_ptr->t = object_desc_str(flavor_ptr->t, format("Lv%d ", sval + 1)); } describe_inscription(flavor_ptr); diff --git a/src/flavor/tval-description-switcher.cpp b/src/flavor/tval-description-switcher.cpp index 394eafc297..40cd5eb50d 100644 --- a/src/flavor/tval-description-switcher.cpp +++ b/src/flavor/tval-description-switcher.cpp @@ -334,7 +334,7 @@ static void describe_book_hex(flavor_type *flavor_ptr) void switch_tval_description(flavor_type *flavor_ptr) { - switch (flavor_ptr->o_ptr->tval) { + switch (flavor_ptr->o_ptr->bi_key.tval()) { case ItemKindType::NONE: flavor_ptr->basenm = _("(なし)", "(Nothing)"); break; diff --git a/src/floor/fixed-map-generator.cpp b/src/floor/fixed-map-generator.cpp index 571d57e92c..ab96dd1281 100644 --- a/src/floor/fixed-map-generator.cpp +++ b/src/floor/fixed-map-generator.cpp @@ -183,7 +183,7 @@ static void parse_qtw_D(PlayerType *player_ptr, qtwg_type *qtwg_ptr, char *s) ItemEntity tmp_object; auto *o_ptr = &tmp_object; o_ptr->prep(object_index); - if (o_ptr->tval == ItemKindType::GOLD) { + if (o_ptr->bi_key.tval() == ItemKindType::GOLD) { coin_type = object_index - OBJ_GOLD_LIST; make_gold(player_ptr, o_ptr); coin_type = 0; diff --git a/src/floor/floor-events.cpp b/src/floor/floor-events.cpp index c6606cd29e..2c97ae81a1 100644 --- a/src/floor/floor-events.cpp +++ b/src/floor/floor-events.cpp @@ -186,35 +186,35 @@ static byte get_dungeon_feeling(PlayerType *player_ptr) } } - if (o_ptr->tval == ItemKindType::DRAG_ARMOR) { + if (o_ptr->bi_key.tval() == ItemKindType::DRAG_ARMOR) { delta += 30 * base; } - if (o_ptr->tval == ItemKindType::SHIELD && o_ptr->sval == SV_DRAGON_SHIELD) { + if (o_ptr->bi_key == BaseitemKey(ItemKindType::SHIELD, SV_DRAGON_SHIELD)) { delta += 5 * base; } - if (o_ptr->tval == ItemKindType::GLOVES && o_ptr->sval == SV_SET_OF_DRAGON_GLOVES) { + if (o_ptr->bi_key == BaseitemKey(ItemKindType::GLOVES, SV_SET_OF_DRAGON_GLOVES)) { delta += 5 * base; } - if (o_ptr->tval == ItemKindType::BOOTS && o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE) { + if (o_ptr->bi_key == BaseitemKey(ItemKindType::BOOTS, SV_PAIR_OF_DRAGON_GREAVE)) { delta += 5 * base; } - if (o_ptr->tval == ItemKindType::HELM && o_ptr->sval == SV_DRAGON_HELM) { + if (o_ptr->bi_key == BaseitemKey(ItemKindType::HELM, SV_DRAGON_HELM)) { delta += 5 * base; } - if (o_ptr->tval == ItemKindType::RING && o_ptr->sval == SV_RING_SPEED && !o_ptr->is_cursed()) { + if (o_ptr->bi_key == BaseitemKey(ItemKindType::RING, SV_RING_SPEED) && !o_ptr->is_cursed()) { delta += 25 * base; } - if (o_ptr->tval == ItemKindType::RING && o_ptr->sval == SV_RING_LORDLY && !o_ptr->is_cursed()) { + if (o_ptr->bi_key == BaseitemKey(ItemKindType::RING, SV_RING_LORDLY) && !o_ptr->is_cursed()) { delta += 15 * base; } - if (o_ptr->tval == ItemKindType::AMULET && o_ptr->sval == SV_AMULET_THE_MAGI && !o_ptr->is_cursed()) { + if (o_ptr->bi_key == BaseitemKey(ItemKindType::AMULET, SV_AMULET_THE_MAGI) && !o_ptr->is_cursed()) { delta += 15 * base; } diff --git a/src/floor/floor-object.cpp b/src/floor/floor-object.cpp index 62145e1d9e..3768db5f5d 100644 --- a/src/floor/floor-object.cpp +++ b/src/floor/floor-object.cpp @@ -100,10 +100,8 @@ static int get_base_floor(FloorType *floor_ptr, BIT_FLAGS mode, std::optionaltval == ItemKindType::SPIKE; - is_ammo |= j_ptr->tval == ItemKindType::SHOT; - is_ammo |= j_ptr->tval == ItemKindType::ARROW; - is_ammo |= j_ptr->tval == ItemKindType::BOLT; + auto is_ammo = j_ptr->is_ammo(); + is_ammo |= j_ptr->bi_key.tval() == ItemKindType::SPIKE; if (is_ammo && !j_ptr->is_fixed_artifact()) { j_ptr->number = damroll(6, 7); } @@ -575,24 +573,24 @@ OBJECT_IDX drop_near(PlayerType *player_ptr, ItemEntity *j_ptr, PERCENTAGE chanc * @param floo_ptr 現在フロアへの参照ポインタ * @param item メッセージの対象にしたいアイテム所持スロット */ -void floor_item_charges(FloorType *floor_ptr, INVENTORY_IDX item) +void floor_item_charges(FloorType *floor_ptr, INVENTORY_IDX inventory) { - auto *o_ptr = &floor_ptr->o_list[item]; - if (!o_ptr->is_wand_staff() || !o_ptr->is_known()) { + const auto &item = floor_ptr->o_list[inventory]; + if (!item.is_wand_staff() || !item.is_known()) { return; } #ifdef JP - if (o_ptr->pval <= 0) { + if (item.pval <= 0) { msg_print("この床上のアイテムは、もう魔力が残っていない。"); } else { - msg_format("この床上のアイテムは、あと %d 回分の魔力が残っている。", o_ptr->pval); + msg_format("この床上のアイテムは、あと %d 回分の魔力が残っている。", item.pval); } #else - if (o_ptr->pval != 1) { - msg_format("There are %d charges remaining.", o_ptr->pval); + if (item.pval != 1) { + msg_format("There are %d charges remaining.", item.pval); } else { - msg_format("There is %d charge remaining.", o_ptr->pval); + msg_format("There is %d charge remaining.", item.pval); } #endif } diff --git a/src/floor/object-scanner.cpp b/src/floor/object-scanner.cpp index c89762ea7a..4d5b1c0b9f 100644 --- a/src/floor/object-scanner.cpp +++ b/src/floor/object-scanner.cpp @@ -122,14 +122,15 @@ COMMAND_CODE show_floor_items(PlayerType *player_ptr, int target_item, POSITION o_ptr = &floor_ptr->o_list[floor_list[i]]; describe_flavor(player_ptr, o_name, o_ptr, 0); out_index[k] = i; - out_color[k] = tval_to_attr[enum2i(o_ptr->tval) & 0x7F]; + const auto tval = o_ptr->bi_key.tval(); + out_color[k] = tval_to_attr[enum2i(tval) & 0x7F]; strcpy(out_desc[k], o_name); l = strlen(out_desc[k]) + 5; if (show_weights) { l += 9; } - if (o_ptr->tval != ItemKindType::GOLD) { + if (tval != ItemKindType::GOLD) { dont_need_to_show_weights = false; } @@ -164,7 +165,7 @@ COMMAND_CODE show_floor_items(PlayerType *player_ptr, int target_item, POSITION put_str(tmp_val, j + 1, col); c_put_str(out_color[j], out_desc[j], j + 1, col + 3); - if (show_weights && (o_ptr->tval != ItemKindType::GOLD)) { + if (show_weights && (o_ptr->bi_key.tval() != ItemKindType::GOLD)) { int wgt = o_ptr->weight * o_ptr->number; sprintf(tmp_val, _("%3d.%1d kg", "%3d.%1d lb"), _(lb_to_kg_integer(wgt), wgt / 10), _(lb_to_kg_fraction(wgt), wgt % 10)); prt(tmp_val, j + 1, wid - 9); diff --git a/src/hpmp/hp-mp-processor.cpp b/src/hpmp/hp-mp-processor.cpp index f9a2a32312..b91e5849f9 100644 --- a/src/hpmp/hp-mp-processor.cpp +++ b/src/hpmp/hp-mp-processor.cpp @@ -150,7 +150,7 @@ void process_player_hp_mp(PlayerType *player_ptr) o_ptr = &player_ptr->inventory_list[INVEN_LITE]; auto flgs = object_flags(o_ptr); - if ((player_ptr->inventory_list[INVEN_LITE].tval != ItemKindType::NONE) && flgs.has_not(TR_DARK_SOURCE) && !has_resist_lite(player_ptr)) { + if ((player_ptr->inventory_list[INVEN_LITE].bi_key.tval() != ItemKindType::NONE) && flgs.has_not(TR_DARK_SOURCE) && !has_resist_lite(player_ptr)) { GAME_TEXT o_name[MAX_NLEN]; char ouch[MAX_NLEN + 40]; describe_flavor(player_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); diff --git a/src/hpmp/hp-mp-regenerator.cpp b/src/hpmp/hp-mp-regenerator.cpp index 1b392189f7..f93692a49a 100644 --- a/src/hpmp/hp-mp-regenerator.cpp +++ b/src/hpmp/hp-mp-regenerator.cpp @@ -212,12 +212,11 @@ void regenerate_captured_monsters(PlayerType *player_ptr) { bool heal = false; for (int i = 0; i < INVEN_TOTAL; i++) { - MonsterRaceInfo *r_ptr; auto *o_ptr = &player_ptr->inventory_list[i]; if (!o_ptr->bi_id) { continue; } - if (o_ptr->tval != ItemKindType::CAPTURE) { + if (o_ptr->bi_key.tval() != ItemKindType::CAPTURE) { continue; } if (!o_ptr->pval) { @@ -226,7 +225,7 @@ void regenerate_captured_monsters(PlayerType *player_ptr) heal = true; const auto r_idx = i2enum(o_ptr->pval); - r_ptr = &monraces_info[r_idx]; + const auto *r_ptr = &monraces_info[r_idx]; if (o_ptr->captured_monster_current_hp < o_ptr->captured_monster_max_hp) { short frac = o_ptr->captured_monster_max_hp / 100; if (!frac) { diff --git a/src/inventory/inventory-object.cpp b/src/inventory/inventory-object.cpp index 7639e7c0d7..70cfee8f74 100644 --- a/src/inventory/inventory-object.cpp +++ b/src/inventory/inventory-object.cpp @@ -65,7 +65,7 @@ void inven_item_increase(PlayerType *player_ptr, INVENTORY_IDX item, ITEM_NUMBER if (!(item == INVEN_MAIN_HAND) && !(item == INVEN_SUB_HAND)) { return; } - if (has_melee_weapon(player_ptr, INVEN_MAIN_HAND + INVEN_SUB_HAND - item)) { + if (has_melee_weapon(player_ptr, enum2i(INVEN_MAIN_HAND + INVEN_SUB_HAND) - item)) { return; } @@ -205,12 +205,13 @@ void combine_pack(PlayerType *player_ptr) int remain = j_ptr->number + o_ptr->number - max_num; object_absorb(j_ptr, o_ptr); o_ptr->number = remain; - if (o_ptr->tval == ItemKindType::ROD) { + const auto tval = o_ptr->bi_key.tval(); + if (tval == ItemKindType::ROD) { o_ptr->pval = o_ptr->pval * remain / old_num; o_ptr->timeout = o_ptr->timeout * remain / old_num; } - if (o_ptr->tval == ItemKindType::WAND) { + if (tval == ItemKindType::WAND) { o_ptr->pval = o_ptr->pval * remain / old_num; } } diff --git a/src/inventory/player-inventory.cpp b/src/inventory/player-inventory.cpp index 3c5314390a..837764e5c9 100644 --- a/src/inventory/player-inventory.cpp +++ b/src/inventory/player-inventory.cpp @@ -96,7 +96,7 @@ void py_pickup_floor(PlayerType *player_ptr, bool pickup) o_ptr = &player_ptr->current_floor_ptr->o_list[this_o_idx]; describe_flavor(player_ptr, o_name, o_ptr, 0); disturb(player_ptr, false, false); - if (o_ptr->tval == ItemKindType::GOLD) { + if (o_ptr->bi_key.tval() == ItemKindType::GOLD) { msg_format(_(" $%ld の価値がある%sを見つけた。", "You have found %ld gold pieces worth of %s."), (long)o_ptr->pval, o_name); sound(SOUND_SELL); player_ptr->au += o_ptr->pval; @@ -267,7 +267,7 @@ void carry(PlayerType *player_ptr, bool pickup) GAME_TEXT o_name[MAX_NLEN]; describe_flavor(player_ptr, o_name, o_ptr, 0); disturb(player_ptr, false, false); - if (o_ptr->tval == ItemKindType::GOLD) { + if (o_ptr->bi_key.tval() == ItemKindType::GOLD) { int value = (long)o_ptr->pval; delete_object_idx(player_ptr, this_o_idx); msg_format(_(" $%ld の価値がある%sを見つけた。", "You collect %ld gold pieces worth of %s."), (long)value, o_name); diff --git a/src/inventory/recharge-processor.cpp b/src/inventory/recharge-processor.cpp index b564b2246c..a5c3b71f19 100644 --- a/src/inventory/recharge-processor.cpp +++ b/src/inventory/recharge-processor.cpp @@ -89,7 +89,7 @@ void recharge_magic_items(PlayerType *player_ptr) continue; } - if ((o_ptr->tval == ItemKindType::ROD) && (o_ptr->timeout)) { + if ((o_ptr->bi_key.tval() == ItemKindType::ROD) && (o_ptr->timeout)) { TIME_EFFECT temp = (o_ptr->timeout + (k_ptr->pval - 1)) / k_ptr->pval; if (temp > o_ptr->number) { temp = (TIME_EFFECT)o_ptr->number; @@ -120,7 +120,7 @@ void recharge_magic_items(PlayerType *player_ptr) continue; } - if ((o_ptr->tval == ItemKindType::ROD) && (o_ptr->timeout)) { + if ((o_ptr->bi_key.tval() == ItemKindType::ROD) && (o_ptr->timeout)) { o_ptr->timeout -= (TIME_EFFECT)o_ptr->number; if (o_ptr->timeout < 0) { o_ptr->timeout = 0; diff --git a/src/io-dump/random-art-info-dumper.cpp b/src/io-dump/random-art-info-dumper.cpp index ec490da790..e41f560500 100644 --- a/src/io-dump/random-art-info-dumper.cpp +++ b/src/io-dump/random-art-info-dumper.cpp @@ -55,7 +55,7 @@ static void spoiler_print_randart(ItemEntity *o_ptr, obj_desc_list *art_ptr) static void spoil_random_artifact_aux(PlayerType *player_ptr, ItemEntity *o_ptr, ItemKindType tval) { obj_desc_list artifact; - if (!o_ptr->is_known() || !o_ptr->art_name || o_ptr->tval != tval) { + if (!o_ptr->is_known() || !o_ptr->art_name || (o_ptr->bi_key.tval() != tval)) { return; } diff --git a/src/knowledge/knowledge-inventory.cpp b/src/knowledge/knowledge-inventory.cpp index d490761e54..4ff22499af 100644 --- a/src/knowledge/knowledge-inventory.cpp +++ b/src/knowledge/knowledge-inventory.cpp @@ -65,8 +65,18 @@ static void print_flag(tr_type tr, const TrFlags &flags, FILE *fff) */ static bool determine_spcial_item_type(ItemEntity *o_ptr, ItemKindType tval) { - bool is_special_item_type = (o_ptr->is_wearable() && o_ptr->is_ego()) || ((tval == ItemKindType::AMULET) && (o_ptr->sval == SV_AMULET_RESISTANCE)) || ((tval == ItemKindType::RING) && (o_ptr->sval == SV_RING_LORDLY)) || ((tval == ItemKindType::SHIELD) && (o_ptr->sval == SV_DRAGON_SHIELD)) || ((tval == ItemKindType::HELM) && (o_ptr->sval == SV_DRAGON_HELM)) || ((tval == ItemKindType::GLOVES) && (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES)) || ((tval == ItemKindType::BOOTS) && (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE)) || o_ptr->is_artifact(); + const auto bi_key = BaseitemKey(tval, o_ptr->bi_key.sval()); + if (!o_ptr->is_wearable() || !o_ptr->is_ego()) { + return false; + } + auto is_special_item_type = bi_key == BaseitemKey(ItemKindType::AMULET, SV_AMULET_RESISTANCE); + is_special_item_type |= bi_key == BaseitemKey(ItemKindType::RING, SV_RING_LORDLY); + is_special_item_type |= bi_key == BaseitemKey(ItemKindType::SHIELD, SV_DRAGON_SHIELD); + is_special_item_type |= bi_key == BaseitemKey(ItemKindType::HELM, SV_DRAGON_HELM); + is_special_item_type |= bi_key == BaseitemKey(ItemKindType::GLOVES, SV_SET_OF_DRAGON_GLOVES); + is_special_item_type |= bi_key == BaseitemKey(ItemKindType::BOOTS, SV_PAIR_OF_DRAGON_GREAVE); + is_special_item_type |= o_ptr->is_artifact(); return is_special_item_type; } @@ -81,7 +91,7 @@ static bool check_item_knowledge(ItemEntity *o_ptr, ItemKindType tval) if (o_ptr->bi_id == 0) { return false; } - if (o_ptr->tval != tval) { + if (o_ptr->bi_key.tval() != tval) { return false; } if (!o_ptr->is_known()) { diff --git a/src/load/old/item-loader-savefile50.cpp b/src/load/old/item-loader-savefile50.cpp index ce4c55ebbf..ea849055bc 100644 --- a/src/load/old/item-loader-savefile50.cpp +++ b/src/load/old/item-loader-savefile50.cpp @@ -34,9 +34,8 @@ void ItemLoader50::rd_item(ItemEntity *o_ptr) o_ptr->bi_id = rd_s16b(); o_ptr->iy = rd_byte(); o_ptr->ix = rd_byte(); - auto *k_ptr = &baseitems_info[o_ptr->bi_id]; - o_ptr->tval = k_ptr->bi_key.tval(); - o_ptr->sval = k_ptr->bi_key.sval().value(); + auto &baseitem = baseitems_info[o_ptr->bi_id]; + 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; o_ptr->number = any_bits(flags, SaveDataItemFlagType::NUMBER) ? rd_byte() : 1; @@ -119,11 +118,12 @@ void ItemLoader50::rd_item(ItemEntity *o_ptr) } // xtra3フィールドが複数目的に共用されていた頃の名残. + const auto tval = o_ptr->bi_key.tval(); if (loading_savefile_version_is_older_than(12)) { uint8_t tmp8s = any_bits(flags, SavedataItemOlderThan12FlagType::XTRA3) ? rd_byte() : 0; - if (o_ptr->tval == ItemKindType::CHEST) { + if (tval == ItemKindType::CHEST) { o_ptr->chest_level = tmp8s; - } else if (o_ptr->tval == ItemKindType::CAPTURE) { + } else if (tval == ItemKindType::CAPTURE) { o_ptr->captured_monster_speed = tmp8s; } } else { @@ -136,7 +136,7 @@ void ItemLoader50::rd_item(ItemEntity *o_ptr) int16_t xtra4 = any_bits(flags, SavedataItemOlderThan13FlagType::XTRA4) ? rd_s16b() : 0; if (o_ptr->is_fuel()) { o_ptr->fuel = static_cast(xtra4); - } else if (o_ptr->tval == ItemKindType::CAPTURE) { + } else if (tval == ItemKindType::CAPTURE) { o_ptr->captured_monster_current_hp = xtra4; } else { o_ptr->smith_hit = static_cast(xtra4 >> 8); @@ -147,8 +147,8 @@ void ItemLoader50::rd_item(ItemEntity *o_ptr) o_ptr->captured_monster_current_hp = any_bits(flags, SaveDataItemFlagType::CAPTURED_MONSTER_CURRENT_HP) ? rd_s16b() : 0; } - if (o_ptr->is_fuel() && (o_ptr->tval == ItemKindType::LITE)) { - const auto fuel_max = o_ptr->sval == SV_LITE_TORCH ? FUEL_TORCH : FUEL_LAMP; + if (o_ptr->is_fuel() && (o_ptr->bi_key.tval() == ItemKindType::LITE)) { + const auto fuel_max = o_ptr->bi_key.sval() == SV_LITE_TORCH ? FUEL_TORCH : FUEL_LAMP; if (o_ptr->fuel < 0 || o_ptr->fuel > fuel_max) { o_ptr->fuel = 0; } @@ -200,42 +200,43 @@ void ItemLoader50::rd_item(ItemEntity *o_ptr) return; } + const auto sval = o_ptr->bi_key.sval(); if (o_ptr->ego_idx == EgoType::LITE_DARKNESS) { - if (o_ptr->tval != ItemKindType::LITE) { + if (tval != ItemKindType::LITE) { o_ptr->art_flags.set(TR_LITE_M1); return; } - if (o_ptr->sval == SV_LITE_TORCH) { + if (sval == SV_LITE_TORCH) { o_ptr->art_flags.set(TR_LITE_M1); - } else if (o_ptr->sval == SV_LITE_LANTERN) { + } else if (sval == SV_LITE_LANTERN) { o_ptr->art_flags.set(TR_LITE_M2); - } else if (o_ptr->sval == SV_LITE_FEANOR) { + } else if (sval == SV_LITE_FEANOR) { o_ptr->art_flags.set(TR_LITE_M3); } return; } - if (o_ptr->tval == ItemKindType::LITE) { + if (tval == ItemKindType::LITE) { if (o_ptr->is_fixed_artifact()) { o_ptr->art_flags.set(TR_LITE_3); return; } - if (o_ptr->sval == SV_LITE_TORCH) { + if (sval == SV_LITE_TORCH) { o_ptr->art_flags.set(TR_LITE_1); o_ptr->art_flags.set(TR_LITE_FUEL); return; } - if (o_ptr->sval == SV_LITE_LANTERN) { + if (sval == SV_LITE_LANTERN) { o_ptr->art_flags.set(TR_LITE_2); o_ptr->art_flags.set(TR_LITE_FUEL); return; } - if (o_ptr->sval == SV_LITE_FEANOR) { + if (sval == SV_LITE_FEANOR) { o_ptr->art_flags.set(TR_LITE_2); return; } diff --git a/src/load/old/load-v1-5-0.cpp b/src/load/old/load-v1-5-0.cpp index aabb9e579c..de93aa4fdc 100644 --- a/src/load/old/load-v1-5-0.cpp +++ b/src/load/old/load-v1-5-0.cpp @@ -71,19 +71,19 @@ void rd_item_old(ItemEntity *o_ptr) o_ptr->iy = rd_byte(); o_ptr->ix = rd_byte(); - /* Type/Subtype */ - o_ptr->tval = i2enum(rd_byte()); - o_ptr->sval = rd_byte(); + const auto tval = i2enum(rd_byte()); + const auto sval = rd_byte(); + o_ptr->bi_key = BaseitemKey(tval, sval); if (h_older_than(0, 4, 4)) { - if (o_ptr->tval == i2enum(100)) { - o_ptr->tval = ItemKindType::GOLD; + if (tval == i2enum(100)) { + o_ptr->bi_key = BaseitemKey(ItemKindType::GOLD, sval); } - if (o_ptr->tval == i2enum(98)) { - o_ptr->tval = ItemKindType::MUSIC_BOOK; + if (tval == i2enum(98)) { + o_ptr->bi_key = BaseitemKey(ItemKindType::MUSIC_BOOK, sval); } - if (o_ptr->tval == i2enum(110)) { - o_ptr->tval = ItemKindType::HISSATSU_BOOK; + if (tval == i2enum(110)) { + o_ptr->bi_key = BaseitemKey(ItemKindType::HISSATSU_BOOK, sval); } } @@ -259,13 +259,13 @@ void rd_item_old(ItemEntity *o_ptr) o_ptr->smith_hit = 0; o_ptr->smith_damage = 0; o_ptr->captured_monster_max_hp = 0; - if (o_ptr->tval == ItemKindType::CHEST) { + if (tval == ItemKindType::CHEST) { o_ptr->chest_level = xtra1; - } else if (o_ptr->tval == ItemKindType::CAPTURE) { + } else if (tval == ItemKindType::CAPTURE) { o_ptr->captured_monster_speed = xtra1; } - if (o_ptr->tval == ItemKindType::CAPTURE) { + if (tval == ItemKindType::CAPTURE) { const auto &r_ref = monraces_info[i2enum(o_ptr->pval)]; if (r_ref.flags1 & RF1_FORCE_MAXHP) { o_ptr->captured_monster_max_hp = maxroll(r_ref.hdice, r_ref.hside); @@ -288,9 +288,9 @@ void rd_item_old(ItemEntity *o_ptr) } auto xtra4 = rd_s16b(); - if (o_ptr->tval == ItemKindType::LITE) { + if (tval == ItemKindType::LITE) { o_ptr->fuel = xtra4; - } else if (o_ptr->tval == ItemKindType::CAPTURE) { + } else if (tval == ItemKindType::CAPTURE) { o_ptr->captured_monster_current_hp = xtra4; } else { o_ptr->smith_hit = static_cast(xtra4 >> 8); diff --git a/src/market/bounty.cpp b/src/market/bounty.cpp index 412cacc9ec..f3d406b57e 100644 --- a/src/market/bounty.cpp +++ b/src/market/bounty.cpp @@ -54,7 +54,7 @@ bool exchange_cash(PlayerType *player_ptr) o_ptr = &player_ptr->inventory_list[i]; const auto r_idx_of_item = static_cast(o_ptr->pval); - if ((o_ptr->tval == ItemKindType::CAPTURE) && (r_idx_of_item == MonsterRaceId::TSUCHINOKO)) { + if ((o_ptr->bi_key.tval() == ItemKindType::CAPTURE) && (r_idx_of_item == MonsterRaceId::TSUCHINOKO)) { char buf[MAX_NLEN + 32]; describe_flavor(player_ptr, o_name, o_ptr, 0); sprintf(buf, _("%s を換金しますか?", "Convert %s into money? "), o_name); @@ -73,7 +73,7 @@ bool exchange_cash(PlayerType *player_ptr) o_ptr = &player_ptr->inventory_list[i]; const auto r_idx_of_item = static_cast(o_ptr->pval); - if ((o_ptr->tval == ItemKindType::CORPSE) && (o_ptr->sval == SV_CORPSE) && (r_idx_of_item == MonsterRaceId::TSUCHINOKO)) { + if (o_ptr->bi_key == BaseitemKey(ItemKindType::CORPSE, SV_CORPSE) && (r_idx_of_item == MonsterRaceId::TSUCHINOKO)) { char buf[MAX_NLEN + 32]; describe_flavor(player_ptr, o_name, o_ptr, 0); sprintf(buf, _("%s を換金しますか?", "Convert %s into money? "), o_name); @@ -92,7 +92,7 @@ bool exchange_cash(PlayerType *player_ptr) o_ptr = &player_ptr->inventory_list[i]; const auto r_idx_of_item = static_cast(o_ptr->pval); - if ((o_ptr->tval == ItemKindType::CORPSE) && (o_ptr->sval == SV_SKELETON) && (r_idx_of_item == MonsterRaceId::TSUCHINOKO)) { + if (o_ptr->bi_key == BaseitemKey(ItemKindType::CORPSE, SV_SKELETON) && (r_idx_of_item == MonsterRaceId::TSUCHINOKO)) { char buf[MAX_NLEN + 32]; describe_flavor(player_ptr, o_name, o_ptr, 0); sprintf(buf, _("%s を換金しますか?", "Convert %s into money? "), o_name); @@ -111,7 +111,7 @@ bool exchange_cash(PlayerType *player_ptr) o_ptr = &player_ptr->inventory_list[i]; const auto r_idx_of_item = static_cast(o_ptr->pval); - if ((o_ptr->tval == ItemKindType::CORPSE) && (o_ptr->sval == SV_CORPSE) && (streq(monraces_info[r_idx_of_item].name.data(), monraces_info[w_ptr->today_mon].name.data()))) { + if (o_ptr->bi_key == BaseitemKey(ItemKindType::CORPSE, SV_CORPSE) && (streq(monraces_info[r_idx_of_item].name.data(), monraces_info[w_ptr->today_mon].name.data()))) { char buf[MAX_NLEN + 32]; describe_flavor(player_ptr, o_name, o_ptr, 0); sprintf(buf, _("%s を換金しますか?", "Convert %s into money? "), o_name); @@ -131,7 +131,7 @@ bool exchange_cash(PlayerType *player_ptr) o_ptr = &player_ptr->inventory_list[i]; const auto r_idx_of_item = static_cast(o_ptr->pval); - if ((o_ptr->tval == ItemKindType::CORPSE) && (o_ptr->sval == SV_SKELETON) && (streq(monraces_info[r_idx_of_item].name.data(), monraces_info[w_ptr->today_mon].name.data()))) { + if (o_ptr->bi_key == BaseitemKey(ItemKindType::CORPSE, SV_SKELETON) && (streq(monraces_info[r_idx_of_item].name.data(), monraces_info[w_ptr->today_mon].name.data()))) { char buf[MAX_NLEN + 32]; describe_flavor(player_ptr, o_name, o_ptr, 0); sprintf(buf, _("%s を換金しますか?", "Convert %s into money? "), o_name); @@ -155,7 +155,7 @@ bool exchange_cash(PlayerType *player_ptr) o_ptr = &player_ptr->inventory_list[i]; const auto r_idx_of_item = static_cast(o_ptr->pval); - if ((o_ptr->tval != ItemKindType::CORPSE) || (r_idx_of_item != r_idx)) { + if ((o_ptr->bi_key.tval() != ItemKindType::CORPSE) || (r_idx_of_item != r_idx)) { continue; } diff --git a/src/market/building-craft-fix.cpp b/src/market/building-craft-fix.cpp index 356cfa3ecb..1f262673f1 100644 --- a/src/market/building-craft-fix.cpp +++ b/src/market/building-craft-fix.cpp @@ -153,7 +153,7 @@ static PRICE repair_broken_weapon_aux(PlayerType *player_ptr, PRICE bcost) } short bi_id; - if (o_ptr->sval == SV_BROKEN_DAGGER) { + if (o_ptr->bi_key.sval() == SV_BROKEN_DAGGER) { auto n = 1; bi_id = 0; for (const auto &k_ref : baseitems_info) { @@ -176,7 +176,7 @@ static PRICE repair_broken_weapon_aux(PlayerType *player_ptr, PRICE bcost) } } } else { - auto tval = (one_in_(5) ? mo_ptr->tval : ItemKindType::SWORD); + auto tval = (one_in_(5) ? mo_ptr->bi_key.tval() : ItemKindType::SWORD); while (true) { bi_id = lookup_baseitem_id({ tval }); const auto &baseitem = baseitems_info[bi_id]; @@ -211,8 +211,7 @@ static PRICE repair_broken_weapon_aux(PlayerType *player_ptr, PRICE bcost) const auto &k_ref = baseitems_info[bi_id]; o_ptr->bi_id = bi_id; o_ptr->weight = k_ref.weight; - o_ptr->tval = k_ref.bi_key.tval(); - o_ptr->sval = k_ref.bi_key.sval().value(); + o_ptr->bi_key = k_ref.bi_key; o_ptr->dd = k_ref.dd; o_ptr->ds = k_ref.ds; diff --git a/src/market/building-craft-weapon.cpp b/src/market/building-craft-weapon.cpp index 04e9b1dbff..5133070d55 100644 --- a/src/market/building-craft-weapon.cpp +++ b/src/market/building-craft-weapon.cpp @@ -135,7 +135,7 @@ static void compare_weapon_aux(PlayerType *player_ptr, ItemEntity *o_ptr, int co int dmg_bonus = o_ptr->to_d + player_ptr->to_d[0]; auto flgs = object_flags(o_ptr); - if ((o_ptr->tval == ItemKindType::SWORD) && (o_ptr->sval == SV_POISON_NEEDLE)) { + if (o_ptr->bi_key == BaseitemKey(ItemKindType::SWORD, SV_POISON_NEEDLE)) { dokubari = true; } diff --git a/src/market/building-recharger.cpp b/src/market/building-recharger.cpp index c8aff0b40f..02d85f5c81 100644 --- a/src/market/building-recharger.cpp +++ b/src/market/building-recharger.cpp @@ -70,24 +70,29 @@ void building_recharge(PlayerType *player_ptr) const auto &baseitem = baseitems_info[o_ptr->bi_id]; const auto lev = baseitem.level; + const auto tval = o_ptr->bi_key.tval(); int price; - if (o_ptr->tval == ItemKindType::ROD) { + switch (tval) { + case ItemKindType::ROD: if (o_ptr->timeout > 0) { price = (lev * 50 * o_ptr->timeout) / baseitem.pval; - } else { - price = 0; - msg_format(_("それは再充填する必要はありません。", "That doesn't need to be recharged.")); - return; + break; } - } else if (o_ptr->tval == ItemKindType::STAFF) { + + price = 0; + msg_format(_("それは再充填する必要はありません。", "That doesn't need to be recharged.")); + return; + case ItemKindType::STAFF: price = (baseitem.cost / 10) * o_ptr->number; price = std::max(10, price); - } else { + break; + default: price = baseitem.cost / 10; price = std::max(10, price); + break; } - if ((o_ptr->tval == ItemKindType::WAND) && (o_ptr->pval / o_ptr->number >= baseitem.pval)) { + if ((tval == ItemKindType::WAND) && (o_ptr->pval / o_ptr->number >= baseitem.pval)) { if (o_ptr->number > 1) { msg_print(_("この魔法棒はもう充分に充填されています。", "These wands are already fully charged.")); } else { @@ -95,7 +100,7 @@ void building_recharge(PlayerType *player_ptr) } return; - } else if ((o_ptr->tval == ItemKindType::STAFF) && o_ptr->pval >= baseitem.pval) { + } else if ((tval == ItemKindType::STAFF) && o_ptr->pval >= baseitem.pval) { if (o_ptr->number > 1) { msg_print(_("この杖はもう充分に充填されています。", "These staffs are already fully charged.")); } else { @@ -115,7 +120,7 @@ void building_recharge(PlayerType *player_ptr) return; } - if (o_ptr->tval == ItemKindType::ROD) { + if (tval == ItemKindType::ROD) { #ifdef JP if (get_check(format("そのロッドを$%d で再充填しますか?", price))) #else @@ -129,7 +134,7 @@ void building_recharge(PlayerType *player_ptr) } } else { int max_charges; - if (o_ptr->tval == ItemKindType::STAFF) { + if (tval == ItemKindType::STAFF) { max_charges = baseitem.pval - o_ptr->pval; } else { max_charges = o_ptr->number * baseitem.pval - o_ptr->pval; @@ -188,7 +193,7 @@ void building_recharge_all(PlayerType *player_ptr) const auto lev = baseitems_info[item.bi_id].level; const auto &baseitem = baseitems_info[item.bi_id]; - switch (item.tval) { + switch (item.bi_key.tval()) { case ItemKindType::ROD: price = (lev * 50 * item.timeout) / baseitem.pval; break; @@ -239,7 +244,7 @@ void building_recharge_all(PlayerType *player_ptr) autopick_alter_item(player_ptr, i, false); } - switch (o_ptr->tval) { + switch (o_ptr->bi_key.tval()) { case ItemKindType::ROD: o_ptr->timeout = 0; break; diff --git a/src/mind/mind-mage.cpp b/src/mind/mind-mage.cpp index b602b5ef75..06d5dade92 100644 --- a/src/mind/mind-mage.cpp +++ b/src/mind/mind-mage.cpp @@ -41,9 +41,10 @@ bool eat_magic(PlayerType *player_ptr, int power) const auto &baseitem = baseitems_info[o_ptr->bi_id]; const auto lev = baseitem.level; + const auto tval = o_ptr->bi_key.tval(); auto recharge_strength = 0; auto is_eating_successful = true; - if (o_ptr->tval == ItemKindType::ROD) { + if (tval == ItemKindType::ROD) { recharge_strength = ((power > lev / 2) ? (power - lev / 2) : 0) / 5; if (one_in_(recharge_strength)) { is_eating_successful = false; @@ -68,7 +69,7 @@ bool eat_magic(PlayerType *player_ptr, int power) player_ptr->csp += lev / 2; o_ptr->pval--; - if ((o_ptr->tval == ItemKindType::STAFF) && (item >= 0) && (o_ptr->number > 1)) { + if ((tval == ItemKindType::STAFF) && (item >= 0) && (o_ptr->number > 1)) { ItemEntity forge; ItemEntity *q_ptr; q_ptr = &forge; @@ -98,7 +99,7 @@ bool eat_magic(PlayerType *player_ptr, int power) if (o_ptr->is_fixed_artifact()) { describe_flavor(player_ptr, o_name, o_ptr, OD_NAME_ONLY); msg_format(_("魔力が逆流した!%sは完全に魔力を失った。", "The recharging backfires - %s is completely drained!"), o_name); - if (o_ptr->tval == ItemKindType::ROD) { + if (tval == ItemKindType::ROD) { o_ptr->timeout = baseitem.pval * o_ptr->number; } else if (o_ptr->is_wand_staff()) { o_ptr->pval = 0; @@ -112,7 +113,7 @@ bool eat_magic(PlayerType *player_ptr, int power) /* Mages recharge objects more safely. */ if (PlayerClass(player_ptr).is_wizard()) { /* 10% chance to blow up one rod, otherwise draining. */ - if (o_ptr->tval == ItemKindType::ROD) { + if (tval == ItemKindType::ROD) { if (one_in_(10)) { fail_type = 2; } else { @@ -120,7 +121,7 @@ bool eat_magic(PlayerType *player_ptr, int power) } } /* 75% chance to blow up one wand, otherwise draining. */ - else if (o_ptr->tval == ItemKindType::WAND) { + else if (tval == ItemKindType::WAND) { if (!one_in_(3)) { fail_type = 2; } else { @@ -128,7 +129,7 @@ bool eat_magic(PlayerType *player_ptr, int power) } } /* 50% chance to blow up one staff, otherwise no effect. */ - else if (o_ptr->tval == ItemKindType::STAFF) { + else if (tval == ItemKindType::STAFF) { if (one_in_(2)) { fail_type = 2; } else { @@ -140,7 +141,7 @@ bool eat_magic(PlayerType *player_ptr, int power) /* All other classes get no special favors. */ else { /* 33% chance to blow up one rod, otherwise draining. */ - if (o_ptr->tval == ItemKindType::ROD) { + if (tval == ItemKindType::ROD) { if (one_in_(3)) { fail_type = 2; } else { @@ -148,7 +149,7 @@ bool eat_magic(PlayerType *player_ptr, int power) } } /* 20% chance of the entire stack, else destroy one wand. */ - else if (o_ptr->tval == ItemKindType::WAND) { + else if (tval == ItemKindType::WAND) { if (one_in_(5)) { fail_type = 3; } else { @@ -156,16 +157,16 @@ bool eat_magic(PlayerType *player_ptr, int power) } } /* Blow up one staff. */ - else if (o_ptr->tval == ItemKindType::STAFF) { + else if (tval == ItemKindType::STAFF) { fail_type = 2; } } if (fail_type == 1) { - if (o_ptr->tval == ItemKindType::ROD) { + if (tval == ItemKindType::ROD) { msg_format(_("ロッドは破損を免れたが、魔力は全て失なわれた。", "You save your rod from destruction, but all charges are lost."), o_name); o_ptr->timeout = baseitem.pval * o_ptr->number; - } else if (o_ptr->tval == ItemKindType::WAND) { + } else if (tval == ItemKindType::WAND) { msg_format(_("%sは破損を免れたが、魔力が全て失われた。", "You save your %s from destruction, but all charges are lost."), o_name); o_ptr->pval = 0; } @@ -175,9 +176,9 @@ bool eat_magic(PlayerType *player_ptr, int power) if (o_ptr->number > 1) { msg_format(_("乱暴な魔法のために%sが一本壊れた!", "Wild magic consumes one of your %s!"), o_name); /* Reduce rod stack maximum timeout, drain wands. */ - if (o_ptr->tval == ItemKindType::ROD) { + if (tval == ItemKindType::ROD) { o_ptr->timeout = std::min(o_ptr->timeout, baseitem.pval * (o_ptr->number - 1)); - } else if (o_ptr->tval == ItemKindType::WAND) { + } else if (tval == ItemKindType::WAND) { o_ptr->pval = o_ptr->pval * (o_ptr->number - 1) / o_ptr->number; } } else { diff --git a/src/mind/mind-magic-eater.cpp b/src/mind/mind-magic-eater.cpp index 6a1fa80919..458c6ec518 100644 --- a/src/mind/mind-magic-eater.cpp +++ b/src/mind/mind-magic-eater.cpp @@ -29,7 +29,8 @@ bool import_magic_device(PlayerType *player_ptr) return false; } - if (o_ptr->tval == ItemKindType::STAFF && o_ptr->sval == SV_STAFF_NOTHING) { + const auto bi_key = o_ptr->bi_key; + if (bi_key == BaseitemKey(ItemKindType::STAFF, SV_STAFF_NOTHING)) { msg_print(_("この杖には発動の為の能力は何も備わっていないようだ。", "This staff doesn't have any magical ability.")); return false; } @@ -45,16 +46,15 @@ bool import_magic_device(PlayerType *player_ptr) } auto magic_eater_data = PlayerClass(player_ptr).get_specific_data(); - auto &target_item = magic_eater_data->get_item_group(o_ptr->tval)[o_ptr->sval]; - - PARAMETER_VALUE pval = o_ptr->pval; - - if (o_ptr->tval == ItemKindType::ROD) { + const auto tval = bi_key.tval(); + auto &target_item = magic_eater_data->get_item_group(tval)[bi_key.sval().value()]; + auto pval = o_ptr->pval; + if (tval == ItemKindType::ROD) { target_item.count = std::min(target_item.count + o_ptr->number, 99); } else { for (auto num = o_ptr->number; num > 0; num--) { int gain_num = pval; - if (o_ptr->tval == ItemKindType::WAND) { + if (tval == ItemKindType::WAND) { gain_num = (pval + num - 1) / num; } if (target_item.count > 0) { @@ -67,7 +67,7 @@ bool import_magic_device(PlayerType *player_ptr) target_item.count = std::min(target_item.count + gain_num, 99); target_item.charge += pval * EATER_CHARGE; target_item.charge = std::min(target_item.charge, target_item.count * EATER_CHARGE); - if (o_ptr->tval == ItemKindType::WAND) { + if (tval == ItemKindType::WAND) { pval -= (pval + num - 1) / num; } } diff --git a/src/mind/mind-mindcrafter.cpp b/src/mind/mind-mindcrafter.cpp index 3adcfb9911..9a350ff9db 100644 --- a/src/mind/mind-mindcrafter.cpp +++ b/src/mind/mind-mindcrafter.cpp @@ -90,7 +90,7 @@ bool psychometry(PlayerType *player_ptr) set_bits(player_ptr->window_flags, PW_INVEN | PW_EQUIP | PW_PLAYER | PW_FLOOR_ITEM_LIST | PW_FOUND_ITEM_LIST); bool okay = false; - switch (o_ptr->tval) { + switch (o_ptr->bi_key.tval()) { case ItemKindType::SHOT: case ItemKindType::ARROW: case ItemKindType::BOLT: diff --git a/src/mind/mind-ninja.cpp b/src/mind/mind-ninja.cpp index bb09b0e235..a0ab022c32 100644 --- a/src/mind/mind-ninja.cpp +++ b/src/mind/mind-ninja.cpp @@ -447,7 +447,7 @@ bool cast_ninja_spell(PlayerType *player_ptr, MindNinjaType spell) OBJECT_IDX slot; for (slot = 0; slot < INVEN_PACK; slot++) { - if (player_ptr->inventory_list[slot].tval == ItemKindType::SPIKE) { + if (player_ptr->inventory_list[slot].bi_key.tval() == ItemKindType::SPIKE) { break; } } diff --git a/src/mind/mind-sniper.cpp b/src/mind/mind-sniper.cpp index 6d69f29320..85a77f4928 100644 --- a/src/mind/mind-sniper.cpp +++ b/src/mind/mind-sniper.cpp @@ -536,14 +536,12 @@ MULTIPLY calc_snipe_damage_with_slay(PlayerType *player_ptr, MULTIPLY mult, Mons static bool cast_sniper_spell(PlayerType *player_ptr, int spell) { auto *o_ptr = &player_ptr->inventory_list[INVEN_BOW]; - SPELL_IDX snipe_type = SP_NONE; - - if (o_ptr->tval != ItemKindType::BOW) { + if (o_ptr->bi_key.tval() != ItemKindType::BOW) { msg_print(_("弓を装備していない!", "You wield no bow!")); return false; } - /* spell code */ + auto snipe_type = SP_NONE; switch (spell) { case 0: /* Concentration */ sound(SOUND_ZAP); diff --git a/src/monster-attack/monster-eating.cpp b/src/monster-attack/monster-eating.cpp index 510e62e989..430aa90f7b 100644 --- a/src/monster-attack/monster-eating.cpp +++ b/src/monster-attack/monster-eating.cpp @@ -117,8 +117,7 @@ static void move_item_to_monster(PlayerType *player_ptr, MonsterAttackPlayer *mo return; } - ItemEntity *j_ptr; - j_ptr = &player_ptr->current_floor_ptr->o_list[o_idx]; + auto *j_ptr = &player_ptr->current_floor_ptr->o_list[o_idx]; j_ptr->copy_from(monap_ptr->o_ptr); j_ptr->number = 1; if (monap_ptr->o_ptr->is_wand_rod()) { @@ -177,7 +176,8 @@ void process_eat_food(PlayerType *player_ptr, MonsterAttackPlayer *monap_ptr) continue; } - if ((monap_ptr->o_ptr->tval != ItemKindType::FOOD) && !((monap_ptr->o_ptr->tval == ItemKindType::CORPSE) && (monap_ptr->o_ptr->sval))) { + const auto tval = monap_ptr->o_ptr->bi_key.tval(); + if ((tval != ItemKindType::FOOD) && !((tval == ItemKindType::CORPSE) && (monap_ptr->o_ptr->bi_key.sval() != 0))) { continue; } @@ -227,10 +227,10 @@ bool process_un_power(PlayerType *player_ptr, MonsterAttackPlayer *monap_ptr) return false; } - bool is_magic_mastery = has_magic_mastery(player_ptr) != 0; - BaseitemInfo *kind_ptr = &baseitems_info[monap_ptr->o_ptr->bi_id]; - PARAMETER_VALUE pval = kind_ptr->pval; - DEPTH level = monap_ptr->rlev; + const auto is_magic_mastery = has_magic_mastery(player_ptr) != 0; + const auto &baseitem = baseitems_info[monap_ptr->o_ptr->bi_id]; + const auto pval = baseitem.pval; + const auto level = monap_ptr->rlev; auto drain = is_magic_mastery ? std::min(pval, pval * level / 400 + pval * randint1(level) / 400) : pval; drain = std::min(drain, monap_ptr->o_ptr->pval); if (drain <= 0) { @@ -243,9 +243,9 @@ bool process_un_power(PlayerType *player_ptr, MonsterAttackPlayer *monap_ptr) } monap_ptr->obvious = true; - int recovery = drain * kind_ptr->level; - - if (monap_ptr->o_ptr->tval == ItemKindType::STAFF) { + auto recovery = drain * baseitem.level; + const auto tval = monap_ptr->o_ptr->bi_key.tval(); + if (tval == ItemKindType::STAFF) { recovery *= monap_ptr->o_ptr->number; } diff --git a/src/monster-floor/monster-object.cpp b/src/monster-floor/monster-object.cpp index a03fd855b1..4b8775ce8b 100644 --- a/src/monster-floor/monster-object.cpp +++ b/src/monster-floor/monster-object.cpp @@ -195,8 +195,8 @@ void update_object_by_monster_movement(PlayerType *player_ptr, turn_flags *turn_ auto *o_ptr = &player_ptr->current_floor_ptr->o_list[this_o_idx]; if (turn_flags_ptr->do_take) { - /* Skip gold, corpse and statue */ - if (o_ptr->tval == ItemKindType::GOLD || (o_ptr->tval == ItemKindType::CORPSE) || (o_ptr->tval == ItemKindType::STATUE)) { + const auto tval = o_ptr->bi_key.tval(); + if (tval == ItemKindType::GOLD || (tval == ItemKindType::CORPSE) || (tval == ItemKindType::STATUE)) { continue; } } diff --git a/src/monster-floor/special-death-switcher.cpp b/src/monster-floor/special-death-switcher.cpp index 3df90fdce5..c23bf503fa 100644 --- a/src/monster-floor/special-death-switcher.cpp +++ b/src/monster-floor/special-death-switcher.cpp @@ -324,7 +324,7 @@ static bool make_equipment(PlayerType *player_ptr, ItemEntity *q_ptr, const BIT_ return true; } - return q_ptr->is_wearable() && (q_ptr->tval != ItemKindType::CARD); + return q_ptr->is_wearable() && (q_ptr->bi_key.tval() != ItemKindType::CARD); } /* diff --git a/src/mspell/mspell-checker.cpp b/src/mspell/mspell-checker.cpp index 0daccf73d9..49d9c799e0 100644 --- a/src/mspell/mspell-checker.cpp +++ b/src/mspell/mspell-checker.cpp @@ -119,9 +119,9 @@ bool raise_possible(PlayerType *player_ptr, MonsterEntity *m_ptr) g_ptr = &floor_ptr->grid_array[yy][xx]; for (const auto this_o_idx : g_ptr->o_idx_list) { - auto *o_ptr = &floor_ptr->o_list[this_o_idx]; - if (o_ptr->tval == ItemKindType::CORPSE) { - auto corpse_r_idx = i2enum(o_ptr->pval); + const auto &item = floor_ptr->o_list[this_o_idx]; + if (item.bi_key.tval() == ItemKindType::CORPSE) { + auto corpse_r_idx = i2enum(item.pval); if (!monster_has_hostile_align(player_ptr, m_ptr, 0, 0, &monraces_info[corpse_r_idx])) { return true; } diff --git a/src/mutation/mutation-processor.cpp b/src/mutation/mutation-processor.cpp index 50ece12acf..df8ae414bc 100644 --- a/src/mutation/mutation-processor.cpp +++ b/src/mutation/mutation-processor.cpp @@ -271,8 +271,6 @@ void process_world_aux_mutation(PlayerType *player_ptr) } if (player_ptr->muta.has(PlayerMutationType::EAT_LIGHT) && one_in_(3000)) { - ItemEntity *o_ptr; - msg_print(_("影につつまれた。", "A shadow passes over you.")); msg_print(nullptr); @@ -280,14 +278,13 @@ void process_world_aux_mutation(PlayerType *player_ptr) hp_player(player_ptr, 10); } - o_ptr = &player_ptr->inventory_list[INVEN_LITE]; - - if (o_ptr->tval == ItemKindType::LITE) { - if (!o_ptr->is_fixed_artifact() && (o_ptr->fuel > 0)) { - hp_player(player_ptr, o_ptr->fuel / 20); - o_ptr->fuel /= 2; + auto &item = player_ptr->inventory_list[INVEN_LITE]; + if (item.bi_key.tval() == ItemKindType::LITE) { + if (!item.is_fixed_artifact() && (item.fuel > 0)) { + hp_player(player_ptr, item.fuel / 20); + item.fuel /= 2; msg_print(_("光源からエネルギーを吸収した!", "You absorb energy from your light!")); - notice_lite_change(player_ptr, o_ptr); + notice_lite_change(player_ptr, &item); } } diff --git a/src/object-activation/activation-breath.cpp b/src/object-activation/activation-breath.cpp index 4bef7ecb33..03bb38f38e 100644 --- a/src/object-activation/activation-breath.cpp +++ b/src/object-activation/activation-breath.cpp @@ -68,7 +68,7 @@ bool activate_breath_fire(PlayerType *player_ptr, ItemEntity *o_ptr) } fire_breath(player_ptr, AttributeType::FIRE, dir, 200, 2); - if ((o_ptr->tval == ItemKindType::RING) && (o_ptr->sval == SV_RING_FLAMES)) { + if (o_ptr->bi_key == BaseitemKey(ItemKindType::RING, SV_RING_FLAMES)) { (void)set_oppose_fire(player_ptr, randint1(20) + 20, false); } @@ -83,7 +83,7 @@ bool activate_breath_cold(PlayerType *player_ptr, ItemEntity *o_ptr) } fire_breath(player_ptr, AttributeType::COLD, dir, 200, 2); - if ((o_ptr->tval == ItemKindType::RING) && (o_ptr->sval == SV_RING_ICE)) { + if (o_ptr->bi_key == BaseitemKey(ItemKindType::RING, SV_RING_ICE)) { (void)set_oppose_cold(player_ptr, randint1(20) + 20, false); } diff --git a/src/object-enchant/enchanter-factory.cpp b/src/object-enchant/enchanter-factory.cpp index 76585e3631..062d1b7467 100644 --- a/src/object-enchant/enchanter-factory.cpp +++ b/src/object-enchant/enchanter-factory.cpp @@ -30,7 +30,7 @@ std::unique_ptr EnchanterFactory::create_enchanter(PlayerType *player_ptr, ItemEntity *o_ptr, int lev, int power) { - switch (o_ptr->tval) { + switch (o_ptr->bi_key.tval()) { case ItemKindType::SHOT: case ItemKindType::ARROW: case ItemKindType::BOLT: diff --git a/src/object-enchant/object-ego.cpp b/src/object-enchant/object-ego.cpp index 77e8b943de..5e1e047df6 100644 --- a/src/object-enchant/object-ego.cpp +++ b/src/object-enchant/object-ego.cpp @@ -171,8 +171,8 @@ static void ego_interpret_extra_abilities(ItemEntity *o_ptr, ego_item_type *e_pt auto n = xtra.tr_flags.size(); if (n > 0) { - auto f = xtra.tr_flags[randint0(n)]; - auto except = (f == TR_VORPAL && o_ptr->tval != ItemKindType::SWORD); + const auto f = xtra.tr_flags[randint0(n)]; + const auto except = (f == TR_VORPAL) && (o_ptr->bi_key.tval() != ItemKindType::SWORD); if (!except) { o_ptr->art_flags.set(f); } @@ -238,9 +238,11 @@ void ego_invest_extra_attack(ItemEntity *o_ptr, ego_item_type *e_ptr, DEPTH lev) if (o_ptr->pval > 3) { o_ptr->pval = 3; } - if ((o_ptr->tval == ItemKindType::SWORD) && (o_ptr->sval == SV_HAYABUSA)) { + + if (o_ptr->bi_key == BaseitemKey(ItemKindType::SWORD, SV_HAYABUSA)) { o_ptr->pval += randint1(2); } + return; } @@ -343,7 +345,7 @@ void apply_ego(ItemEntity *o_ptr, DEPTH lev) if (e_ptr->max_pval) { if (o_ptr->ego_idx == EgoType::BAT) { o_ptr->pval = randint1(e_ptr->max_pval); - if (o_ptr->sval == SV_ELVEN_CLOAK) { + if (o_ptr->bi_key.sval() == SV_ELVEN_CLOAK) { o_ptr->pval += randint1(2); } } else { @@ -363,7 +365,7 @@ void apply_ego(ItemEntity *o_ptr, DEPTH lev) o_ptr->pval = randint1(o_ptr->pval); } - if ((o_ptr->tval == ItemKindType::SWORD) && (o_ptr->sval == SV_HAYABUSA) && (o_ptr->pval > 2) && (o_ptr->ego_idx != EgoType::ATTACKS)) { + if ((o_ptr->bi_key == BaseitemKey(ItemKindType::SWORD, SV_HAYABUSA)) && (o_ptr->pval > 2) && (o_ptr->ego_idx != EgoType::ATTACKS)) { o_ptr->pval = 2; } } diff --git a/src/object-enchant/others/apply-magic-amulet.cpp b/src/object-enchant/others/apply-magic-amulet.cpp index c415cee353..9de9a30f4d 100644 --- a/src/object-enchant/others/apply-magic-amulet.cpp +++ b/src/object-enchant/others/apply-magic-amulet.cpp @@ -68,7 +68,12 @@ void AmuletEnchanter::apply_magic() void AmuletEnchanter::sval_enchant() { - switch (this->o_ptr->sval) { + const auto sval = this->o_ptr->bi_key.sval(); + if (!sval.has_value()) { + return; + } + + switch (sval.value()) { case SV_AMULET_INTELLIGENCE: case SV_AMULET_WISDOM: case SV_AMULET_CHARISMA: @@ -259,7 +264,12 @@ void AmuletEnchanter::give_ego_index() void AmuletEnchanter::give_high_ego_index() { - switch (this->o_ptr->sval) { + const auto sval = this->o_ptr->bi_key.sval(); + if (!sval.has_value()) { + return; + } + + switch (sval.value()) { case SV_AMULET_TELEPORT: if (m_bonus(10, this->level) > 9) { this->o_ptr->ego_idx = EgoType::AMU_D_DOOR; diff --git a/src/object-enchant/others/apply-magic-lite.cpp b/src/object-enchant/others/apply-magic-lite.cpp index e1eeb2d0e9..dde0655dd7 100644 --- a/src/object-enchant/others/apply-magic-lite.cpp +++ b/src/object-enchant/others/apply-magic-lite.cpp @@ -11,7 +11,12 @@ LiteEnchanter::LiteEnchanter(PlayerType *player_ptr, ItemEntity *o_ptr, int powe , o_ptr(o_ptr) , power(power) { - switch (o_ptr->sval) { + const auto sval = this->o_ptr->bi_key.sval(); + if (!sval.has_value()) { + return; + } + + switch (sval.value()) { case SV_LITE_TORCH: if (o_ptr->pval > 0) { o_ptr->fuel = randint1(o_ptr->pval); @@ -58,7 +63,7 @@ void LiteEnchanter::give_ego_index() this->o_ptr->ego_idx = get_random_ego(INVEN_LITE, true); switch (this->o_ptr->ego_idx) { case EgoType::LITE_LONG: - if (this->o_ptr->sval == SV_LITE_FEANOR) { + if (this->o_ptr->bi_key.sval() == SV_LITE_FEANOR) { okay_flag = false; } @@ -88,7 +93,12 @@ void LiteEnchanter::give_cursed() void LiteEnchanter::add_dark_flag() { - switch (this->o_ptr->sval) { + const auto sval = this->o_ptr->bi_key.sval(); + if (!sval.has_value()) { + return; + } + + switch (sval.value()) { case SV_LITE_TORCH: this->o_ptr->art_flags.set(TR_LITE_M1); return; diff --git a/src/object-enchant/others/apply-magic-others.cpp b/src/object-enchant/others/apply-magic-others.cpp index abd7c4bd83..8b13a60d0b 100644 --- a/src/object-enchant/others/apply-magic-others.cpp +++ b/src/object-enchant/others/apply-magic-others.cpp @@ -49,7 +49,8 @@ OtherItemsEnchanter::OtherItemsEnchanter(PlayerType *player_ptr, ItemEntity *o_p */ void OtherItemsEnchanter::apply_magic() { - switch (this->o_ptr->tval) { + const auto tval = this->o_ptr->bi_key.tval(); + switch (tval) { case ItemKindType::FLASK: this->o_ptr->fuel = this->o_ptr->pval; this->o_ptr->pval = 0; @@ -149,7 +150,12 @@ void OtherItemsEnchanter::generate_corpse() r_idx = get_mon_num(this->player_ptr, 0, floor_ptr->dun_level, 0); auto &r_ref = monraces_info[r_idx]; auto check = (floor_ptr->dun_level < r_ref.level) ? (r_ref.level - floor_ptr->dun_level) : 0; - if ((r_ref.rarity == 0) || (match.find(o_ptr->sval) != match.end() && r_ref.drop_flags.has_not(match.at(o_ptr->sval))) || (randint0(check) > 0)) { + const auto sval = this->o_ptr->bi_key.sval(); + if (!sval.has_value()) { + continue; + } + + if ((r_ref.rarity == 0) || (match.find(sval.value()) != match.end() && r_ref.drop_flags.has_not(match.at(sval.value()))) || (randint0(check) > 0)) { continue; } @@ -199,7 +205,7 @@ void OtherItemsEnchanter::generate_chest() } this->o_ptr->pval = randint1(obj_level); - if (this->o_ptr->sval == SV_CHEST_KANDUME) { + if (this->o_ptr->bi_key.sval() == SV_CHEST_KANDUME) { this->o_ptr->pval = 6; } diff --git a/src/object-enchant/others/apply-magic-ring.cpp b/src/object-enchant/others/apply-magic-ring.cpp index 778fe9d914..40ff63cd4b 100644 --- a/src/object-enchant/others/apply-magic-ring.cpp +++ b/src/object-enchant/others/apply-magic-ring.cpp @@ -67,7 +67,12 @@ void RingEnchanter::apply_magic() void RingEnchanter::sval_enchant() { - switch (this->o_ptr->sval) { + const auto sval = this->o_ptr->bi_key.sval(); + if (!sval.has_value()) { + return; + } + + switch (sval.value()) { case SV_RING_ATTACKS: this->o_ptr->pval = (PARAMETER_VALUE)m_bonus(2, this->level); if (one_in_(15)) { @@ -400,7 +405,12 @@ void RingEnchanter::give_ego_index() void RingEnchanter::give_high_ego_index() { - switch (this->o_ptr->sval) { + const auto sval = this->o_ptr->bi_key.sval(); + if (!sval.has_value()) { + return; + } + + switch (sval.value()) { case SV_RING_SPEED: if (!one_in_(3)) { break; diff --git a/src/object-enchant/protector/apply-magic-armor.cpp b/src/object-enchant/protector/apply-magic-armor.cpp index 6047b0bcfc..7404a46cfd 100644 --- a/src/object-enchant/protector/apply-magic-armor.cpp +++ b/src/object-enchant/protector/apply-magic-armor.cpp @@ -40,15 +40,16 @@ void ArmorEnchanter::give_ego_index() while (true) { auto valid = true; this->o_ptr->ego_idx = get_random_ego(INVEN_BODY, true); + const auto tval = this->o_ptr->bi_key.tval(); switch (this->o_ptr->ego_idx) { case EgoType::DWARVEN: - if (this->o_ptr->tval != ItemKindType::HARD_ARMOR) { + if (tval != ItemKindType::HARD_ARMOR) { valid = false; } break; case EgoType::DRUID: - if (this->o_ptr->tval != ItemKindType::SOFT_ARMOR) { + if (tval != ItemKindType::SOFT_ARMOR) { valid = false; } diff --git a/src/object-enchant/protector/apply-magic-boots.cpp b/src/object-enchant/protector/apply-magic-boots.cpp index f871c5e2d4..4b325527c4 100644 --- a/src/object-enchant/protector/apply-magic-boots.cpp +++ b/src/object-enchant/protector/apply-magic-boots.cpp @@ -31,7 +31,7 @@ BootsEnchanter::BootsEnchanter(PlayerType *player_ptr, ItemEntity *o_ptr, DEPTH */ void BootsEnchanter::apply_magic() { - if (this->o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE) { + if (this->o_ptr->bi_key.sval() == SV_PAIR_OF_DRAGON_GREAVE) { dragon_resist(this->o_ptr); if (!one_in_(3)) { return; diff --git a/src/object-enchant/protector/apply-magic-cloak.cpp b/src/object-enchant/protector/apply-magic-cloak.cpp index 45d42e032b..ff90936a8a 100644 --- a/src/object-enchant/protector/apply-magic-cloak.cpp +++ b/src/object-enchant/protector/apply-magic-cloak.cpp @@ -29,7 +29,7 @@ CloakEnchanter::CloakEnchanter(PlayerType *player_ptr, ItemEntity *o_ptr, DEPTH */ void CloakEnchanter::apply_magic() { - if (this->o_ptr->sval == SV_ELVEN_CLOAK) { + if (this->o_ptr->bi_key.sval() == SV_ELVEN_CLOAK) { this->o_ptr->pval = randint1(4); } diff --git a/src/object-enchant/protector/apply-magic-gloves.cpp b/src/object-enchant/protector/apply-magic-gloves.cpp index 70f238676b..21db829be5 100644 --- a/src/object-enchant/protector/apply-magic-gloves.cpp +++ b/src/object-enchant/protector/apply-magic-gloves.cpp @@ -31,7 +31,7 @@ GlovesEnchanter::GlovesEnchanter(PlayerType *player_ptr, ItemEntity *o_ptr, DEPT */ void GlovesEnchanter::apply_magic() { - if (this->o_ptr->sval == SV_SET_OF_DRAGON_GLOVES) { + if (this->o_ptr->bi_key.sval() == SV_SET_OF_DRAGON_GLOVES) { dragon_resist(this->o_ptr); if (!one_in_(3)) { return; diff --git a/src/object-enchant/protector/apply-magic-helm.cpp b/src/object-enchant/protector/apply-magic-helm.cpp index 12a1dcebe9..ffab38e0a6 100644 --- a/src/object-enchant/protector/apply-magic-helm.cpp +++ b/src/object-enchant/protector/apply-magic-helm.cpp @@ -28,7 +28,7 @@ HelmEnchanter::HelmEnchanter(PlayerType *player_ptr, ItemEntity *o_ptr, DEPTH le void HelmEnchanter::apply_magic() { - if (this->o_ptr->sval == SV_DRAGON_HELM) { + if (this->o_ptr->bi_key.sval() == SV_DRAGON_HELM) { dragon_resist(this->o_ptr); if (!one_in_(3)) { return; diff --git a/src/object-enchant/protector/apply-magic-shield.cpp b/src/object-enchant/protector/apply-magic-shield.cpp index b5e901974a..5aafd42486 100644 --- a/src/object-enchant/protector/apply-magic-shield.cpp +++ b/src/object-enchant/protector/apply-magic-shield.cpp @@ -31,7 +31,7 @@ ShieldEnchanter::ShieldEnchanter(PlayerType *player_ptr, ItemEntity *o_ptr, DEPT */ void ShieldEnchanter::apply_magic() { - if (this->o_ptr->sval == SV_DRAGON_SHIELD) { + if (this->o_ptr->bi_key.sval() == SV_DRAGON_SHIELD) { dragon_resist(this->o_ptr); if (!one_in_(3)) { return; @@ -56,10 +56,11 @@ void ShieldEnchanter::apply_magic() */ void ShieldEnchanter::give_ego_index() { + const auto sval = this->o_ptr->bi_key.sval(); while (true) { this->o_ptr->ego_idx = get_random_ego(INVEN_SUB_HAND, true); - auto is_metal = this->o_ptr->sval == SV_SMALL_METAL_SHIELD; - is_metal |= this->o_ptr->sval == SV_LARGE_METAL_SHIELD; + auto is_metal = sval == SV_SMALL_METAL_SHIELD; + is_metal |= sval == SV_LARGE_METAL_SHIELD; if (!is_metal && (this->o_ptr->ego_idx == EgoType::S_DWARVEN)) { continue; } @@ -69,7 +70,7 @@ void ShieldEnchanter::give_ego_index() switch (this->o_ptr->ego_idx) { case EgoType::REFLECTION: - if (this->o_ptr->sval == SV_MIRROR_SHIELD) { + if (sval == SV_MIRROR_SHIELD) { this->o_ptr->ego_idx = EgoType::NONE; } diff --git a/src/object-enchant/protector/apply-magic-soft-armor.cpp b/src/object-enchant/protector/apply-magic-soft-armor.cpp index fe97ed976f..50d93d9796 100644 --- a/src/object-enchant/protector/apply-magic-soft-armor.cpp +++ b/src/object-enchant/protector/apply-magic-soft-armor.cpp @@ -47,7 +47,12 @@ void SoftArmorEnchanter::apply_magic() void SoftArmorEnchanter::sval_enchant() { - switch (this->o_ptr->sval) { + const auto sval = this->o_ptr->bi_key.sval(); + if (!sval.has_value()) { + return; + } + + switch (sval.value()) { case SV_KUROSHOUZOKU: this->o_ptr->pval = randint1(4); return; @@ -76,7 +81,8 @@ void SoftArmorEnchanter::sval_enchant() */ void SoftArmorEnchanter::give_high_ego_index() { - if ((this->o_ptr->sval != SV_ROBE) || (randint0(100) >= 15)) { + const auto sval = this->o_ptr->bi_key.sval(); + if ((sval != SV_ROBE) || (randint0(100) >= 15)) { return; } @@ -87,8 +93,9 @@ void SoftArmorEnchanter::give_high_ego_index() return; } - this->o_ptr->bi_id = lookup_baseitem_id({ ItemKindType::SOFT_ARMOR, SV_TWILIGHT_ROBE }); - this->o_ptr->sval = SV_TWILIGHT_ROBE; + const BaseitemKey key(ItemKindType::SOFT_ARMOR, SV_TWILIGHT_ROBE); + this->o_ptr->bi_id = lookup_baseitem_id(key); + this->o_ptr->bi_key = key; this->o_ptr->ac = 0; this->o_ptr->to_a = 0; return; diff --git a/src/object-enchant/weapon/apply-magic-polearm.cpp b/src/object-enchant/weapon/apply-magic-polearm.cpp index 9ca19db15a..7627641c81 100644 --- a/src/object-enchant/weapon/apply-magic-polearm.cpp +++ b/src/object-enchant/weapon/apply-magic-polearm.cpp @@ -32,7 +32,7 @@ void PolearmEnchanter::apply_magic() void PolearmEnchanter::decide_skip() { AbstractWeaponEnchanter::decide_skip(); - this->should_skip |= this->o_ptr->sval == SV_DEATH_SCYTHE; + this->should_skip |= this->o_ptr->bi_key.sval() == SV_DEATH_SCYTHE; } void PolearmEnchanter::give_ego_index() diff --git a/src/object-enchant/weapon/apply-magic-sword.cpp b/src/object-enchant/weapon/apply-magic-sword.cpp index 3861a77344..efc78a8e94 100644 --- a/src/object-enchant/weapon/apply-magic-sword.cpp +++ b/src/object-enchant/weapon/apply-magic-sword.cpp @@ -27,7 +27,8 @@ SwordEnchanter::SwordEnchanter(PlayerType *player_ptr, ItemEntity *o_ptr, DEPTH void SwordEnchanter::decide_skip() { AbstractWeaponEnchanter::decide_skip(); - this->should_skip |= this->o_ptr->sval == SV_POISON_NEEDLE; + const auto sval = this->o_ptr->bi_key.sval(); + this->should_skip |= sval == SV_POISON_NEEDLE; } void SwordEnchanter::apply_magic() @@ -38,7 +39,8 @@ void SwordEnchanter::apply_magic() } this->give_killing_bonus(); - if (this->o_ptr->sval == SV_DIAMOND_EDGE) { + const auto sval = this->o_ptr->bi_key.sval(); + if (sval == SV_DIAMOND_EDGE) { return; } @@ -72,10 +74,11 @@ void SwordEnchanter::give_cursed() } auto n = 0; + const auto sval = this->o_ptr->bi_key.sval(); while (true) { this->o_ptr->ego_idx = get_random_ego(INVEN_MAIN_HAND, false); const auto *e_ptr = &egos_info[this->o_ptr->ego_idx]; - if ((this->o_ptr->sval != SV_HAYABUSA) || (e_ptr->max_pval >= 0)) { + if ((sval != SV_HAYABUSA) || (e_ptr->max_pval >= 0)) { return; } diff --git a/src/object-hook/hook-armor.cpp b/src/object-hook/hook-armor.cpp index b968bff02a..aad32dc664 100644 --- a/src/object-hook/hook-armor.cpp +++ b/src/object-hook/hook-armor.cpp @@ -13,7 +13,7 @@ */ bool item_tester_hook_wear(PlayerType *player_ptr, const ItemEntity *o_ptr) { - if ((o_ptr->tval == ItemKindType::SOFT_ARMOR) && (o_ptr->sval == SV_ABUNAI_MIZUGI)) { + if (o_ptr->bi_key == BaseitemKey(ItemKindType::SOFT_ARMOR, SV_ABUNAI_MIZUGI)) { if (player_ptr->psex == SEX_MALE) { return false; } diff --git a/src/object-hook/hook-expendable.cpp b/src/object-hook/hook-expendable.cpp index c5d12b8caa..2425b46530 100644 --- a/src/object-hook/hook-expendable.cpp +++ b/src/object-hook/hook-expendable.cpp @@ -25,7 +25,8 @@ */ bool item_tester_hook_eatable(PlayerType *player_ptr, const ItemEntity *o_ptr) { - if (o_ptr->tval == ItemKindType::FOOD) { + const auto tval = o_ptr->bi_key.tval(); + if (tval == ItemKindType::FOOD) { return true; } @@ -36,7 +37,7 @@ bool item_tester_hook_eatable(PlayerType *player_ptr, const ItemEntity *o_ptr) } } else if (food_type == PlayerRaceFoodType::CORPSE) { auto corpse_r_idx = i2enum(o_ptr->pval); - if (o_ptr->tval == ItemKindType::CORPSE && o_ptr->sval == SV_CORPSE && angband_strchr("pht", monraces_info[corpse_r_idx].d_char)) { + if ((o_ptr->bi_key == BaseitemKey(ItemKindType::CORPSE, SV_CORPSE)) && angband_strchr("pht", monraces_info[corpse_r_idx].d_char)) { return true; } } @@ -52,15 +53,12 @@ bool item_tester_hook_eatable(PlayerType *player_ptr, const ItemEntity *o_ptr) */ bool item_tester_hook_quaff(PlayerType *player_ptr, const ItemEntity *o_ptr) { - if (o_ptr->tval == ItemKindType::POTION) { + const auto &bi_key = o_ptr->bi_key; + if (bi_key.tval() == ItemKindType::POTION) { return true; } - if (PlayerRace(player_ptr).food() == PlayerRaceFoodType::OIL && o_ptr->tval == ItemKindType::FLASK && o_ptr->sval == SV_FLASK_OIL) { - return true; - } - - return false; + return (PlayerRace(player_ptr).food() == PlayerRaceFoodType::OIL) && (bi_key == BaseitemKey(ItemKindType::FLASK, SV_FLASK_OIL)); } /*! diff --git a/src/object-hook/hook-magic.cpp b/src/object-hook/hook-magic.cpp index 9b4967fc63..8cc7e55e42 100644 --- a/src/object-hook/hook-magic.cpp +++ b/src/object-hook/hook-magic.cpp @@ -21,11 +21,12 @@ */ bool item_tester_hook_use(PlayerType *player_ptr, const ItemEntity *o_ptr) { - if (o_ptr->tval == player_ptr->tval_ammo) { + const auto tval = o_ptr->bi_key.tval(); + if (tval == player_ptr->tval_ammo) { return true; } - switch (o_ptr->tval) { + switch (tval) { case ItemKindType::SPIKE: case ItemKindType::STAFF: case ItemKindType::WAND: @@ -73,13 +74,14 @@ bool item_tester_learn_spell(PlayerType *player_ptr, const ItemEntity *o_ptr) } } - if ((o_ptr->tval == ItemKindType::MUSIC_BOOK) && pc.equals(PlayerClassType::BARD)) { + const auto tval = o_ptr->bi_key.tval(); + if ((tval == ItemKindType::MUSIC_BOOK) && pc.equals(PlayerClassType::BARD)) { return true; } - if (!is_magic(tval2realm(o_ptr->tval))) { + if (!is_magic(tval2realm(tval))) { return false; } - return (get_realm1_book(player_ptr) == o_ptr->tval) || (get_realm2_book(player_ptr) == o_ptr->tval) || (choices & (0x0001U << (tval2realm(o_ptr->tval) - 1))); + return (get_realm1_book(player_ptr) == tval) || (get_realm2_book(player_ptr) == tval) || (choices & (0x0001U << (tval2realm(tval) - 1))); } diff --git a/src/object-hook/hook-quest.cpp b/src/object-hook/hook-quest.cpp index e0573b27da..642bb05e5e 100644 --- a/src/object-hook/hook-quest.cpp +++ b/src/object-hook/hook-quest.cpp @@ -21,7 +21,7 @@ */ bool object_is_bounty(PlayerType *player_ptr, ItemEntity *o_ptr) { - if (o_ptr->tval != ItemKindType::CORPSE) { + if (o_ptr->bi_key.tval() != ItemKindType::CORPSE) { return false; } @@ -63,5 +63,5 @@ bool object_is_quest_target(QuestId quest_idx, ItemEntity *o_ptr) return false; } - return (o_ptr->tval == a_ref.bi_key.tval()) && (o_ptr->sval == a_ref.bi_key.sval()); + return o_ptr->bi_key == a_ref.bi_key; } diff --git a/src/object-hook/hook-weapon.cpp b/src/object-hook/hook-weapon.cpp index 29dac097a9..c59cb2fb40 100644 --- a/src/object-hook/hook-weapon.cpp +++ b/src/object-hook/hook-weapon.cpp @@ -21,53 +21,29 @@ bool object_is_favorite(PlayerType *player_ptr, const ItemEntity *o_ptr) } /* Favorite weapons are varied depend on the class */ + const auto tval = o_ptr->bi_key.tval(); + const auto sval = o_ptr->bi_key.sval().value(); switch (player_ptr->pclass) { case PlayerClassType::PRIEST: { - auto flgs = object_flags_known(o_ptr); - - if (flgs.has_not(TR_BLESSED) && !(o_ptr->tval == ItemKindType::HAFTED)) { - return false; - } - break; + const auto flgs = object_flags_known(o_ptr); + return flgs.has(TR_BLESSED) || (tval == ItemKindType::HAFTED); } - case PlayerClassType::MONK: case PlayerClassType::FORCETRAINER: /* Icky to wield? */ - if (player_ptr->weapon_exp_max[o_ptr->tval][o_ptr->sval] == PlayerSkill::weapon_exp_at(PlayerSkillRank::UNSKILLED)) { - return false; - } - break; - + return player_ptr->weapon_exp_max[tval][sval] != PlayerSkill::weapon_exp_at(PlayerSkillRank::UNSKILLED); case PlayerClassType::BEASTMASTER: case PlayerClassType::CAVALRY: { - auto flgs = object_flags_known(o_ptr); - /* Is it known to be suitable to using while riding? */ - if (flgs.has_not(TR_RIDING)) { - return false; - } - - break; + auto flgs = object_flags_known(o_ptr); + return flgs.has(TR_RIDING); } - case PlayerClassType::SORCERER: - if (player_ptr->weapon_exp_max[o_ptr->tval][o_ptr->sval] < PlayerSkill::weapon_exp_at(PlayerSkillRank::MASTER)) { - return false; - } - break; - + return player_ptr->weapon_exp_max[tval][sval] >= PlayerSkill::weapon_exp_at(PlayerSkillRank::MASTER); case PlayerClassType::NINJA: /* Icky to wield? */ - if (player_ptr->weapon_exp_max[o_ptr->tval][o_ptr->sval] <= PlayerSkill::weapon_exp_at(PlayerSkillRank::BEGINNER)) { - return false; - } - break; - + return player_ptr->weapon_exp_max[tval][sval] > PlayerSkill::weapon_exp_at(PlayerSkillRank::BEGINNER); default: - /* All weapons are okay for non-special classes */ return true; } - - return true; } diff --git a/src/object-use/quaff/quaff-effects.cpp b/src/object-use/quaff/quaff-effects.cpp index 354477dbd6..f02ac4893c 100644 --- a/src/object-use/quaff/quaff-effects.cpp +++ b/src/object-use/quaff/quaff-effects.cpp @@ -50,11 +50,11 @@ QuaffEffects::QuaffEffects(PlayerType *player_ptr) bool QuaffEffects::influence(const ItemEntity &o_ref) { - if (o_ref.tval != ItemKindType::POTION) { + if (o_ref.bi_key.tval() != ItemKindType::POTION) { return false; } - switch (o_ref.sval) { + switch (o_ref.bi_key.sval().value()) { case SV_POTION_WATER: msg_print(_("口の中がさっぱりした。", "That was refreshing.")); msg_print(_("のどの渇きが少しおさまった。", "You feel less thirsty.")); diff --git a/src/object-use/quaff/quaff-execution.cpp b/src/object-use/quaff/quaff-execution.cpp index 6757fa0434..3376e744c2 100644 --- a/src/object-use/quaff/quaff-execution.cpp +++ b/src/object-use/quaff/quaff-execution.cpp @@ -127,7 +127,7 @@ void ObjectQuaffEntity::moisten(const ItemEntity &o_ref) set_food(this->player_ptr, std::min(this->player_ptr->food + o_ref.pval + std::max(0, o_ref.pval * 10) + 2000, PY_FOOD_MAX - 1)); return; case PlayerRaceFoodType::OIL: - if (o_ref.tval != ItemKindType::FLASK) { + if (o_ref.bi_key.tval() != ItemKindType::FLASK) { set_food(this->player_ptr, this->player_ptr->food + ((o_ref.pval) / 20)); return; } diff --git a/src/object-use/read/parchment-read-executor.cpp b/src/object-use/read/parchment-read-executor.cpp index a02da50044..9047120b21 100644 --- a/src/object-use/read/parchment-read-executor.cpp +++ b/src/object-use/read/parchment-read-executor.cpp @@ -31,7 +31,7 @@ bool ParchmentReadExecutor::read() GAME_TEXT o_name[MAX_NLEN]{}; char buf[1024]{}; screen_save(); - auto q = format("book-%d_jp.txt", this->o_ptr->sval); + auto q = format("book-%d_jp.txt", this->o_ptr->bi_key.sval()); describe_flavor(this->player_ptr, o_name, this->o_ptr, OD_NAME_ONLY); (void)path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, q); (void)show_file(this->player_ptr, true, buf, o_name, 0, 0); diff --git a/src/object-use/read/read-executor-factory.cpp b/src/object-use/read/read-executor-factory.cpp index eac4db8503..49d212d819 100644 --- a/src/object-use/read/read-executor-factory.cpp +++ b/src/object-use/read/read-executor-factory.cpp @@ -9,7 +9,8 @@ std::unique_ptr ReadExecutorFactory::create(PlayerType *player_ptr, ItemEntity *o_ptr, bool known) { - if (o_ptr->tval == ItemKindType::SCROLL) { + const auto tval = o_ptr->bi_key.tval(); + if (tval == ItemKindType::SCROLL) { return std::make_unique(player_ptr, o_ptr, known); } @@ -21,7 +22,7 @@ std::unique_ptr ReadExecutorFactory::create(PlayerType *player return std::make_unique(); } - if (o_ptr->tval == ItemKindType::PARCHMENT) { + if (tval == ItemKindType::PARCHMENT) { return std::make_unique(player_ptr, o_ptr); } diff --git a/src/object-use/read/scroll-read-executor.cpp b/src/object-use/read/scroll-read-executor.cpp index c86455459e..f6fbfb1243 100644 --- a/src/object-use/read/scroll-read-executor.cpp +++ b/src/object-use/read/scroll-read-executor.cpp @@ -59,7 +59,7 @@ bool ScrollReadExecutor::is_identified() const bool ScrollReadExecutor::read() { auto used_up = true; - switch (this->o_ptr->sval) { + switch (this->o_ptr->bi_key.sval().value()) { case SV_SCROLL_DARKNESS: if (!has_resist_blind(this->player_ptr) && !has_resist_dark(this->player_ptr)) { (void)BadStatusSetter(this->player_ptr).mod_blindness(3 + randint1(5)); diff --git a/src/object-use/throw-execution.cpp b/src/object-use/throw-execution.cpp index 968619efb9..c530cdfa88 100644 --- a/src/object-use/throw-execution.cpp +++ b/src/object-use/throw-execution.cpp @@ -91,7 +91,8 @@ bool ObjectThrowEntity::check_can_throw() return false; } - if (this->player_ptr->current_floor_ptr->inside_arena && !this->boomerang && (this->o_ptr->tval != ItemKindType::SPIKE)) { + const auto is_spike = this->o_ptr->bi_key.tval() == ItemKindType::SPIKE; + if (this->player_ptr->current_floor_ptr->inside_arena && !this->boomerang && !is_spike) { msg_print(_("アリーナではアイテムを使えない!", "You're in the arena now. This is hand-to-hand!")); msg_print(nullptr); return false; @@ -181,7 +182,10 @@ void ObjectThrowEntity::set_class_specific_throw_params() this->y = this->player_ptr->y; this->x = this->player_ptr->x; handle_stuff(this->player_ptr); - this->shuriken = pc.equals(PlayerClassType::NINJA) && ((this->q_ptr->tval == ItemKindType::SPIKE) || ((this->obj_flags.has(TR_THROW)) && (this->q_ptr->tval == ItemKindType::SWORD))); + const auto tval = this->q_ptr->bi_key.tval(); + const auto is_spike = tval == ItemKindType::SPIKE; + const auto is_sword = tval == ItemKindType::SWORD; + this->shuriken = pc.equals(PlayerClassType::NINJA) && (is_spike || ((this->obj_flags.has(TR_THROW)) && is_sword)); } void ObjectThrowEntity::set_racial_chance() @@ -223,7 +227,7 @@ void ObjectThrowEntity::exe_throw() void ObjectThrowEntity::display_figurine_throw() { - if ((this->q_ptr->tval != ItemKindType::FIGURINE) || this->player_ptr->current_floor_ptr->inside_arena) { + if ((this->q_ptr->bi_key.tval() != ItemKindType::FIGURINE) || this->player_ptr->current_floor_ptr->inside_arena) { return; } @@ -388,7 +392,8 @@ bool ObjectThrowEntity::check_racial_target_bold() } this->hit_wall = true; - return (this->q_ptr->tval == ItemKindType::FIGURINE) || this->q_ptr->is_potion() || (floor_ptr->grid_array[this->ny[this->cur_dis]][this->nx[this->cur_dis]].m_idx == 0); + const auto is_figurine = this->q_ptr->bi_key.tval() == ItemKindType::FIGURINE; + return is_figurine || this->q_ptr->is_potion() || (floor_ptr->grid_array[this->ny[this->cur_dis]][this->nx[this->cur_dis]].m_idx == 0); } void ObjectThrowEntity::check_racial_target_seen() diff --git a/src/object-use/use-execution.cpp b/src/object-use/use-execution.cpp index 93dedb27a3..39a9446a8f 100644 --- a/src/object-use/use-execution.cpp +++ b/src/object-use/use-execution.cpp @@ -97,7 +97,7 @@ void ObjectUseEntity::execute() } sound(SOUND_ZAP); - auto ident = staff_effect(this->player_ptr, o_ptr->sval, &use_charge, false, false, o_ptr->is_aware()); + auto ident = staff_effect(this->player_ptr, o_ptr->bi_key.sval().value(), &use_charge, false, false, o_ptr->is_aware()); if (!(o_ptr->is_aware())) { chg_virtue(this->player_ptr, V_PATIENCE, -1); chg_virtue(this->player_ptr, V_CHANCE, 1); diff --git a/src/object-use/zaprod-execution.cpp b/src/object-use/zaprod-execution.cpp index cda7c80b69..3a596eb005 100644 --- a/src/object-use/zaprod-execution.cpp +++ b/src/object-use/zaprod-execution.cpp @@ -122,7 +122,7 @@ void ObjectZapRodEntity::execute(INVENTORY_IDX item) } sound(SOUND_ZAP); - auto ident = rod_effect(this->player_ptr, o_ptr->sval, dir, &use_charge, false); + auto ident = rod_effect(this->player_ptr, o_ptr->bi_key.sval().value(), dir, &use_charge, false); if (use_charge) { o_ptr->timeout += k_ptr->pval; } diff --git a/src/object-use/zapwand-execution.cpp b/src/object-use/zapwand-execution.cpp index 682ecfda9a..3c1bb37dc5 100644 --- a/src/object-use/zapwand-execution.cpp +++ b/src/object-use/zapwand-execution.cpp @@ -46,7 +46,8 @@ void ObjectZapWandEntity::execute(INVENTORY_IDX item) return; } - if (o_ptr->is_aware() && (o_ptr->sval == SV_WAND_HEAL_MONSTER || o_ptr->sval == SV_WAND_HASTE_MONSTER)) { + const auto sval = o_ptr->bi_key.sval(); + if (o_ptr->is_aware() && (sval == SV_WAND_HEAL_MONSTER || sval == SV_WAND_HASTE_MONSTER)) { target_pet = true; } @@ -100,7 +101,7 @@ void ObjectZapWandEntity::execute(INVENTORY_IDX item) } sound(SOUND_ZAP); - auto ident = wand_effect(this->player_ptr, o_ptr->sval, dir, false, false); + auto ident = wand_effect(this->player_ptr, sval.value(), dir, false, false); /* * Temporarily remove the flags for updating the inventory so diff --git a/src/object/item-tester-hooker.cpp b/src/object/item-tester-hooker.cpp index 189257a5cd..6cad47d0b5 100644 --- a/src/object/item-tester-hooker.cpp +++ b/src/object/item-tester-hooker.cpp @@ -76,7 +76,7 @@ bool ItemTester::okay(const ItemEntity *o_ptr) const return false; } - if (o_ptr->tval == ItemKindType::GOLD) { + if (o_ptr->bi_key.tval() == ItemKindType::GOLD) { if (!show_gold_on_floor) { return false; } @@ -87,7 +87,7 @@ bool ItemTester::okay(const ItemEntity *o_ptr) const bool TvalItemTester::okay_impl(const ItemEntity *o_ptr) const { - return this->tval == o_ptr->tval; + return this->tval == o_ptr->bi_key.tval(); } bool FuncItemTester::okay_impl(const ItemEntity *o_ptr) const diff --git a/src/object/lite-processor.cpp b/src/object/lite-processor.cpp index 7723918f79..c56b6c83c2 100644 --- a/src/object/lite-processor.cpp +++ b/src/object/lite-processor.cpp @@ -21,11 +21,11 @@ void reduce_lite_life(PlayerType *player_ptr) { auto *o_ptr = &player_ptr->inventory_list[INVEN_LITE]; - if (o_ptr->tval != ItemKindType::LITE) { + if (o_ptr->bi_key.tval() != ItemKindType::LITE) { return; } - if (o_ptr->is_fixed_artifact() || (o_ptr->sval == SV_LITE_FEANOR) || (o_ptr->fuel <= 0)) { + if (o_ptr->is_fixed_artifact() || (o_ptr->bi_key.sval() == SV_LITE_FEANOR) || (o_ptr->fuel <= 0)) { return; } diff --git a/src/object/object-broken.cpp b/src/object/object-broken.cpp index fa64f58413..7c9545d7fc 100644 --- a/src/object/object-broken.cpp +++ b/src/object/object-broken.cpp @@ -53,9 +53,7 @@ BreakerCold::BreakerCold() */ bool BreakerAcid::hates(ItemEntity *o_ptr) const { - /* Analyze the type */ - switch (o_ptr->tval) { - /* Wearable items */ + switch (o_ptr->bi_key.tval()) { case ItemKindType::ARROW: case ItemKindType::BOLT: case ItemKindType::BOW: @@ -70,33 +68,17 @@ bool BreakerAcid::hates(ItemEntity *o_ptr) const case ItemKindType::CLOAK: case ItemKindType::SOFT_ARMOR: case ItemKindType::HARD_ARMOR: - case ItemKindType::DRAG_ARMOR: { - return true; - } - - /* Staffs/Scrolls are wood/paper */ + case ItemKindType::DRAG_ARMOR: case ItemKindType::STAFF: - case ItemKindType::SCROLL: { - return true; - } - - /* Ouch */ - case ItemKindType::CHEST: { - return true; - } - - /* Junk is useless */ + case ItemKindType::SCROLL: + case ItemKindType::CHEST: case ItemKindType::SKELETON: case ItemKindType::BOTTLE: - case ItemKindType::JUNK: { + case ItemKindType::JUNK: return true; - } - default: - break; + return false; } - - return false; } /*! @@ -107,17 +89,13 @@ bool BreakerAcid::hates(ItemEntity *o_ptr) const */ bool BreakerElec::hates(ItemEntity *o_ptr) const { - switch (o_ptr->tval) { + switch (o_ptr->bi_key.tval()) { case ItemKindType::RING: - case ItemKindType::WAND: { + case ItemKindType::WAND: return true; - } - default: - break; + return false; } - - return false; } /*! @@ -131,9 +109,7 @@ bool BreakerElec::hates(ItemEntity *o_ptr) const */ bool BreakerFire::hates(ItemEntity *o_ptr) const { - /* Analyze the type */ - switch (o_ptr->tval) { - /* Wearable */ + switch (o_ptr->bi_key.tval()) { case ItemKindType::LITE: case ItemKindType::ARROW: case ItemKindType::BOW: @@ -142,11 +118,7 @@ bool BreakerFire::hates(ItemEntity *o_ptr) const case ItemKindType::BOOTS: case ItemKindType::GLOVES: case ItemKindType::CLOAK: - case ItemKindType::SOFT_ARMOR: { - return true; - } - - /* Books */ + case ItemKindType::SOFT_ARMOR: case ItemKindType::LIFE_BOOK: case ItemKindType::SORCERY_BOOK: case ItemKindType::NATURE_BOOK: @@ -159,26 +131,14 @@ bool BreakerFire::hates(ItemEntity *o_ptr) const case ItemKindType::CRUSADE_BOOK: case ItemKindType::MUSIC_BOOK: case ItemKindType::HISSATSU_BOOK: - case ItemKindType::HEX_BOOK: { - return true; - } - - /* Chests */ - case ItemKindType::CHEST: { - return true; - } - - /* Staffs/Scrolls burn */ + case ItemKindType::HEX_BOOK: + case ItemKindType::CHEST: case ItemKindType::STAFF: - case ItemKindType::SCROLL: { + case ItemKindType::SCROLL: return true; - } - default: - break; + return false; } - - return false; } /*! @@ -189,18 +149,14 @@ bool BreakerFire::hates(ItemEntity *o_ptr) const */ bool BreakerCold::hates(ItemEntity *o_ptr) const { - switch (o_ptr->tval) { + switch (o_ptr->bi_key.tval()) { case ItemKindType::POTION: case ItemKindType::FLASK: - case ItemKindType::BOTTLE: { + case ItemKindType::BOTTLE: return true; - } - default: - break; + return false; } - - return false; } /*! @@ -215,11 +171,9 @@ bool ObjectBreaker::can_destroy(ItemEntity *o_ptr) const if (!this->hates(o_ptr)) { return false; } + auto flgs = object_flags(o_ptr); - if (flgs.has(this->ignore_flg)) { - return false; - } - return true; + return flgs.has_not(this->ignore_flg); } /*! @@ -425,7 +379,7 @@ PERCENTAGE breakage_chance(PlayerType *player_ptr, ItemEntity *o_ptr, bool has_a /* Examine the item type */ PERCENTAGE archer_bonus = (has_archer_bonus ? (PERCENTAGE)(player_ptr->lev - 1) / 7 + 4 : 0); - switch (o_ptr->tval) { + switch (o_ptr->bi_key.tval()) { /* Always break */ case ItemKindType::FLASK: case ItemKindType::POTION: diff --git a/src/object/object-info.cpp b/src/object/object-info.cpp index 1474908890..ed450752b5 100644 --- a/src/object/object-info.cpp +++ b/src/object/object-info.cpp @@ -82,12 +82,12 @@ static concptr item_activation_aux(ItemEntity *o_ptr) case RandomArtActType::NONE: break; case RandomArtActType::BR_FIRE: - if ((o_ptr->tval == ItemKindType::RING) && (o_ptr->sval == SV_RING_FLAMES)) { + if (o_ptr->bi_key == BaseitemKey(ItemKindType::RING, SV_RING_FLAMES)) { desc = _("火炎のブレス (200) と火への耐性", "breathe fire (200) and resist fire"); } break; case RandomArtActType::BR_COLD: - if ((o_ptr->tval == ItemKindType::RING) && (o_ptr->sval == SV_RING_ICE)) { + if (o_ptr->bi_key == BaseitemKey(ItemKindType::RING, SV_RING_ICE)) { desc = _("冷気のブレス (200) と冷気への耐性", "breathe cold (200) and resist cold"); } break; @@ -143,10 +143,10 @@ static concptr item_activation_aux(ItemEntity *o_ptr) /* Activations that have special timeout */ switch (act_ptr->index) { case RandomArtActType::BR_FIRE: - sprintf(timeout, _("%d ターン毎", "every %d turns"), ((o_ptr->tval == ItemKindType::RING) && (o_ptr->sval == SV_RING_FLAMES)) ? 200 : 250); + sprintf(timeout, _("%d ターン毎", "every %d turns"), o_ptr->bi_key == BaseitemKey(ItemKindType::RING, SV_RING_FLAMES) ? 200 : 250); break; case RandomArtActType::BR_COLD: - sprintf(timeout, _("%d ターン毎", "every %d turns"), ((o_ptr->tval == ItemKindType::RING) && (o_ptr->sval == SV_RING_ICE)) ? 200 : 250); + sprintf(timeout, _("%d ターン毎", "every %d turns"), o_ptr->bi_key == BaseitemKey(ItemKindType::RING, SV_RING_ICE) ? 200 : 250); break; case RandomArtActType::TERROR: strcpy(timeout, _("3*(レベル+10) ターン毎", "every 3 * (level+10) turns")); @@ -187,11 +187,12 @@ concptr activation_explanation(ItemEntity *o_ptr) return item_activation_aux(o_ptr); } - if (o_ptr->tval == ItemKindType::WHISTLE) { + const auto tval = o_ptr->bi_key.tval(); + if (tval == ItemKindType::WHISTLE) { return _("ペット呼び寄せ : 100+d100ターン毎", "call pet every 100+d100 turns"); } - if (o_ptr->tval == ItemKindType::CAPTURE) { + if (tval == ItemKindType::CAPTURE) { return _("モンスターを捕える、又は解放する。", "captures or releases a monster."); } @@ -218,71 +219,61 @@ char index_to_label(int i) */ int16_t wield_slot(PlayerType *player_ptr, const ItemEntity *o_ptr) { - switch (o_ptr->tval) { + switch (o_ptr->bi_key.tval()) { case ItemKindType::DIGGING: case ItemKindType::HAFTED: case ItemKindType::POLEARM: - case ItemKindType::SWORD: { + case ItemKindType::SWORD: if (!player_ptr->inventory_list[INVEN_MAIN_HAND].bi_id) { return INVEN_MAIN_HAND; } + if (player_ptr->inventory_list[INVEN_SUB_HAND].bi_id) { return INVEN_MAIN_HAND; } + return INVEN_SUB_HAND; - } case ItemKindType::CAPTURE: case ItemKindType::CARD: - case ItemKindType::SHIELD: { + case ItemKindType::SHIELD: if (!player_ptr->inventory_list[INVEN_SUB_HAND].bi_id) { return INVEN_SUB_HAND; } + if (player_ptr->inventory_list[INVEN_MAIN_HAND].bi_id) { return INVEN_SUB_HAND; } + return INVEN_MAIN_HAND; - } - case ItemKindType::BOW: { + case ItemKindType::BOW: return INVEN_BOW; - } - case ItemKindType::RING: { + case ItemKindType::RING: if (!player_ptr->inventory_list[INVEN_MAIN_RING].bi_id) { return INVEN_MAIN_RING; } return INVEN_SUB_RING; - } case ItemKindType::AMULET: - case ItemKindType::WHISTLE: { + case ItemKindType::WHISTLE: return INVEN_NECK; - } - case ItemKindType::LITE: { + case ItemKindType::LITE: return INVEN_LITE; - } case ItemKindType::DRAG_ARMOR: case ItemKindType::HARD_ARMOR: - case ItemKindType::SOFT_ARMOR: { + case ItemKindType::SOFT_ARMOR: return INVEN_BODY; - } - case ItemKindType::CLOAK: { + case ItemKindType::CLOAK: return INVEN_OUTER; - } case ItemKindType::CROWN: - case ItemKindType::HELM: { + case ItemKindType::HELM: return INVEN_HEAD; - } - case ItemKindType::GLOVES: { + case ItemKindType::GLOVES: return INVEN_ARMS; - } - case ItemKindType::BOOTS: { + case ItemKindType::BOOTS: return INVEN_FEET; - } - default: - break; + return -1; } - - return -1; } /*! diff --git a/src/object/object-stack.cpp b/src/object/object-stack.cpp index 0a102bc51f..e1c28ed7e7 100644 --- a/src/object/object-stack.cpp +++ b/src/object/object-stack.cpp @@ -40,7 +40,7 @@ void distribute_charges(ItemEntity *o_ptr, ItemEntity *q_ptr, int amt) o_ptr->pval -= q_ptr->pval; } - if ((o_ptr->tval != ItemKindType::ROD) || !o_ptr->timeout) { + if ((o_ptr->bi_key.tval() != ItemKindType::ROD) || !o_ptr->timeout) { return; } @@ -86,19 +86,19 @@ int object_similar_part(const ItemEntity *o_ptr, const ItemEntity *j_ptr) return 0; } - switch (o_ptr->tval) { + switch (o_ptr->bi_key.tval()) { case ItemKindType::CHEST: case ItemKindType::CARD: case ItemKindType::CAPTURE: { return 0; } case ItemKindType::STATUE: { - if ((o_ptr->sval != SV_PHOTO) || (j_ptr->sval != SV_PHOTO)) { - return 0; - } - if (o_ptr->pval != j_ptr->pval) { + const auto o_sval = o_ptr->bi_key.sval(); + const auto j_sval = j_ptr->bi_key.sval(); + if ((o_sval != SV_PHOTO) || (j_sval != SV_PHOTO) || (o_ptr->pval != j_ptr->pval)) { return 0; } + break; } case ItemKindType::FIGURINE: @@ -286,12 +286,14 @@ void object_absorb(ItemEntity *o_ptr, ItemEntity *j_ptr) if (o_ptr->discount < j_ptr->discount) { o_ptr->discount = j_ptr->discount; } - if (o_ptr->tval == ItemKindType::ROD) { + + const auto tval = o_ptr->bi_key.tval(); + if (tval == ItemKindType::ROD) { o_ptr->pval += j_ptr->pval * (j_ptr->number - diff) / j_ptr->number; o_ptr->timeout += j_ptr->timeout * (j_ptr->number - diff) / j_ptr->number; } - if (o_ptr->tval == ItemKindType::WAND) { + if (tval == ItemKindType::WAND) { o_ptr->pval += j_ptr->pval * (j_ptr->number - diff) / j_ptr->number; } } diff --git a/src/object/object-value.cpp b/src/object/object-value.cpp index 9442470b41..b4254d26f8 100644 --- a/src/object/object-value.cpp +++ b/src/object/object-value.cpp @@ -69,7 +69,7 @@ PRICE object_value_real(const ItemEntity *o_ptr) } /* Analyze pval bonus for normal object */ - switch (o_ptr->tval) { + switch (o_ptr->bi_key.tval()) { case ItemKindType::SHOT: case ItemKindType::ARROW: case ItemKindType::BOLT: @@ -142,7 +142,7 @@ PRICE object_value_real(const ItemEntity *o_ptr) break; } - switch (o_ptr->tval) { + switch (o_ptr->bi_key.tval()) { case ItemKindType::WAND: { /* Pay extra for charges, depending on standard number of * charges. Handle new-style wands correctly. -LM- diff --git a/src/perception/identification.cpp b/src/perception/identification.cpp index 2ed09b71d4..949ce760aa 100644 --- a/src/perception/identification.cpp +++ b/src/perception/identification.cpp @@ -63,7 +63,8 @@ bool screen_object(PlayerType *player_ptr, ItemEntity *o_ptr, BIT_FLAGS mode) info[i++] = _("...ただし装備していなければならない。", "...if it is being worn."); } - if (o_ptr->tval == ItemKindType::FIGURINE) { + const auto &bi_key = o_ptr->bi_key; + if (bi_key.tval() == ItemKindType::FIGURINE) { info[i++] = _("それは投げた時ペットに変化する。", "It will transform into a pet when thrown."); } @@ -71,11 +72,11 @@ bool screen_object(PlayerType *player_ptr, ItemEntity *o_ptr, BIT_FLAGS mode) info[i++] = _("それを装備した者は吸血鬼になる。", "It makes you turn into a vampire permanently."); } - if ((o_ptr->tval == ItemKindType::SWORD) && (o_ptr->sval == SV_POISON_NEEDLE)) { + if (bi_key == BaseitemKey(ItemKindType::SWORD, SV_POISON_NEEDLE)) { info[i++] = _("それは相手を一撃で倒すことがある。", "It will attempt to instantly kill a monster."); } - if ((o_ptr->tval == ItemKindType::POLEARM) && (o_ptr->sval == SV_DEATH_SCYTHE)) { + if (bi_key == BaseitemKey(ItemKindType::POLEARM, SV_DEATH_SCYTHE)) { info[i++] = _("それは自分自身に攻撃が返ってくることがある。", "It causes you to strike yourself sometimes."); info[i++] = _("それは無敵のバリアを切り裂く。", "It always penetrates invulnerability barriers."); } @@ -104,7 +105,7 @@ bool screen_object(PlayerType *player_ptr, ItemEntity *o_ptr, BIT_FLAGS mode) info[i++] = _("それは物を強く投げることを可能にする。", "It provides great strength when you throw an item."); } - if (o_ptr->tval == ItemKindType::STATUE) { + if (bi_key.tval() == ItemKindType::STATUE) { auto statue_r_idx = i2enum(o_ptr->pval); auto *r_ptr = &monraces_info[statue_r_idx]; if (statue_r_idx == MonsterRaceId::BULLGATES) { @@ -727,9 +728,10 @@ bool screen_object(PlayerType *player_ptr, ItemEntity *o_ptr, BIT_FLAGS mode) } if (mode & SCROBJ_FAKE_OBJECT) { - switch (o_ptr->tval) { + const auto sval = o_ptr->bi_key.sval().value(); + switch (o_ptr->bi_key.tval()) { case ItemKindType::RING: - switch (o_ptr->sval) { + switch (sval) { case SV_RING_LORDLY: info[i++] = _("それは幾つかのランダムな耐性を授ける。", "It provides some random resistances."); break; @@ -741,7 +743,7 @@ bool screen_object(PlayerType *player_ptr, ItemEntity *o_ptr, BIT_FLAGS mode) break; case ItemKindType::AMULET: - switch (o_ptr->sval) { + switch (sval) { case SV_AMULET_RESISTANCE: info[i++] = _("それは毒への耐性を授ける事がある。", "It may provides resistance to poison."); info[i++] = _("それはランダムな耐性を授ける事がある。", "It may provide a random resistances."); @@ -801,7 +803,7 @@ bool screen_object(PlayerType *player_ptr, ItemEntity *o_ptr, BIT_FLAGS mode) prt("", k, 13); } - if ((o_ptr->tval == ItemKindType::STATUE) && (o_ptr->sval == SV_PHOTO)) { + if (bi_key == BaseitemKey(ItemKindType::STATUE, SV_PHOTO)) { auto statue_r_idx = i2enum(o_ptr->pval); auto *r_ptr = &monraces_info[statue_r_idx]; int namelen = strlen(r_ptr->name.data()); diff --git a/src/perception/simple-perception.cpp b/src/perception/simple-perception.cpp index 19b7043b58..457ad1f3fb 100644 --- a/src/perception/simple-perception.cpp +++ b/src/perception/simple-perception.cpp @@ -272,15 +272,14 @@ void sense_inventory1(PlayerType *player_ptr) } for (INVENTORY_IDX i = 0; i < INVEN_TOTAL; i++) { - bool okay = false; - o_ptr = &player_ptr->inventory_list[i]; if (!o_ptr->bi_id) { continue; } - switch (o_ptr->tval) { + auto okay = false; + switch (o_ptr->bi_key.tval()) { case ItemKindType::SHOT: case ItemKindType::ARROW: case ItemKindType::BOLT: @@ -298,11 +297,9 @@ void sense_inventory1(PlayerType *player_ptr) case ItemKindType::SOFT_ARMOR: case ItemKindType::HARD_ARMOR: case ItemKindType::DRAG_ARMOR: - case ItemKindType::CARD: { + case ItemKindType::CARD: okay = true; break; - } - default: break; } @@ -409,7 +406,7 @@ void sense_inventory2(PlayerType *player_ptr) continue; } - switch (o_ptr->tval) { + switch (o_ptr->bi_key.tval()) { case ItemKindType::RING: case ItemKindType::AMULET: case ItemKindType::LITE: @@ -465,7 +462,8 @@ item_feel_type pseudo_value_check_heavy(ItemEntity *o_ptr) return FEEL_BROKEN; } - if ((o_ptr->tval == ItemKindType::RING) || (o_ptr->tval == ItemKindType::AMULET)) { + const auto tval = o_ptr->bi_key.tval(); + if ((tval == ItemKindType::RING) || (tval == ItemKindType::AMULET)) { return FEEL_AVERAGE; } diff --git a/src/player-attack/player-attack.cpp b/src/player-attack/player-attack.cpp index 79146ddb29..d287f8d593 100644 --- a/src/player-attack/player-attack.cpp +++ b/src/player-attack/player-attack.cpp @@ -178,7 +178,7 @@ static void calc_num_blow(PlayerType *player_ptr, player_attack_type *pa_ptr) } auto *o_ptr = &player_ptr->inventory_list[enum2i(INVEN_MAIN_HAND) + pa_ptr->hand]; - if ((o_ptr->tval == ItemKindType::SWORD) && (o_ptr->sval == SV_POISON_NEEDLE)) { + if (o_ptr->bi_key == BaseitemKey(ItemKindType::SWORD, SV_POISON_NEEDLE)) { pa_ptr->num_blow = 1; } } @@ -345,7 +345,7 @@ static void process_weapon_attack(PlayerType *player_ptr, player_attack_type *pa } auto do_impact = does_weapon_has_flag(player_ptr->impact, pa_ptr); - if ((!(o_ptr->tval == ItemKindType::SWORD) || !(o_ptr->sval == SV_POISON_NEEDLE)) && !(pa_ptr->mode == HISSATSU_KYUSHO)) { + if ((o_ptr->bi_key != BaseitemKey(ItemKindType::SWORD, SV_POISON_NEEDLE)) && !(pa_ptr->mode == HISSATSU_KYUSHO)) { pa_ptr->attack_damage = critical_norm(player_ptr, o_ptr->weight, o_ptr->to_h, pa_ptr->attack_damage, player_ptr->to_h[pa_ptr->hand], pa_ptr->mode, do_impact); } @@ -503,8 +503,9 @@ static void apply_actual_attack( apply_damage_negative_effect(pa_ptr, is_zantetsu_nullified, is_ej_nullified); mineuchi(player_ptr, pa_ptr); - pa_ptr->attack_damage = mon_damage_mod(player_ptr, pa_ptr->m_ptr, pa_ptr->attack_damage, - ((o_ptr->tval == ItemKindType::POLEARM) && (o_ptr->sval == SV_DEATH_SCYTHE)) || (PlayerClass(player_ptr).equals(PlayerClassType::BERSERKER) && one_in_(2))); + const auto is_death_scythe = o_ptr->bi_key == BaseitemKey(ItemKindType::POLEARM, SV_DEATH_SCYTHE); + const auto is_berserker = PlayerClass(player_ptr).equals(PlayerClassType::BERSERKER); + pa_ptr->attack_damage = mon_damage_mod(player_ptr, pa_ptr->m_ptr, pa_ptr->attack_damage, is_death_scythe || (is_berserker && one_in_(2))); critical_attack(player_ptr, pa_ptr); msg_format_wizard(player_ptr, CHEAT_MONSTER, _("%dのダメージを与えた。(残りHP %d/%d(%d))", "You do %d damage. (left HP %d/%d(%d))"), pa_ptr->attack_damage, pa_ptr->m_ptr->hp - pa_ptr->attack_damage, pa_ptr->m_ptr->maxhp, pa_ptr->m_ptr->max_maxhp); diff --git a/src/player-info/equipment-info.cpp b/src/player-info/equipment-info.cpp index 5c610ebd85..86f93df41d 100644 --- a/src/player-info/equipment-info.cpp +++ b/src/player-info/equipment-info.cpp @@ -63,11 +63,11 @@ bool heavy_armor(PlayerType *player_ptr) } WEIGHT monk_arm_wgt = 0; - if (player_ptr->inventory_list[INVEN_MAIN_HAND].tval > ItemKindType::SWORD) { + if (player_ptr->inventory_list[INVEN_MAIN_HAND].bi_key.tval() > ItemKindType::SWORD) { monk_arm_wgt += player_ptr->inventory_list[INVEN_MAIN_HAND].weight; } - if (player_ptr->inventory_list[INVEN_SUB_HAND].tval > ItemKindType::SWORD) { + if (player_ptr->inventory_list[INVEN_SUB_HAND].bi_key.tval() > ItemKindType::SWORD) { monk_arm_wgt += player_ptr->inventory_list[INVEN_SUB_HAND].weight; } diff --git a/src/player/player-move.cpp b/src/player/player-move.cpp index df26260281..1edc8ed397 100644 --- a/src/player/player-move.cpp +++ b/src/player/player-move.cpp @@ -87,7 +87,7 @@ static void discover_hidden_things(PlayerType *player_ptr, POSITION y, POSITION for (const auto this_o_idx : g_ptr->o_idx_list) { ItemEntity *o_ptr; o_ptr = &floor_ptr->o_list[this_o_idx]; - if (o_ptr->tval != ItemKindType::CHEST) { + if (o_ptr->bi_key.tval() != ItemKindType::CHEST) { continue; } diff --git a/src/player/player-skill.cpp b/src/player/player-skill.cpp index 06efddca8b..df6a175c4a 100644 --- a/src/player/player-skill.cpp +++ b/src/player/player-skill.cpp @@ -241,12 +241,12 @@ void PlayerSkill::gain_melee_weapon_exp(const ItemEntity *o_ptr) { const GainAmountList gain_amount_list{ { 80, 10, 1, (one_in_(2) ? 1 : 0) } }; constexpr GainAmountList others_gain_amount_list{ { 8, 1, 0, 0 } }; - - for (auto sval = 0U; sval < this->player_ptr->weapon_exp[o_ptr->tval].size(); ++sval) { - auto &now_exp = this->player_ptr->weapon_exp[o_ptr->tval][sval]; - if (now_exp < this->player_ptr->weapon_exp_max[o_ptr->tval][sval]) { + const auto tval = o_ptr->bi_key.tval(); + for (auto sval = 0U; sval < this->player_ptr->weapon_exp[tval].size(); ++sval) { + auto &now_exp = this->player_ptr->weapon_exp[tval][sval]; + if (now_exp < this->player_ptr->weapon_exp_max[tval][sval]) { gain_attack_skill_exp(this->player_ptr, now_exp, - (static_cast(sval) == o_ptr->sval) ? gain_amount_list : others_gain_amount_list); + (static_cast(sval) == o_ptr->bi_key.sval()) ? gain_amount_list : others_gain_amount_list); } } } @@ -255,12 +255,12 @@ void PlayerSkill::gain_range_weapon_exp(const ItemEntity *o_ptr) { constexpr GainAmountList gain_amount_list{ { 80, 25, 10, 2 } }; constexpr GainAmountList others_gain_amount_list{ { 8, 2, 0, 0 } }; - - for (auto sval = 0U; sval < this->player_ptr->weapon_exp[o_ptr->tval].size(); ++sval) { - auto &now_exp = this->player_ptr->weapon_exp[o_ptr->tval][sval]; - if (now_exp < this->player_ptr->weapon_exp_max[o_ptr->tval][sval]) { + const auto tval = o_ptr->bi_key.tval(); + for (auto sval = 0U; sval < this->player_ptr->weapon_exp[tval].size(); ++sval) { + auto &now_exp = this->player_ptr->weapon_exp[tval][sval]; + if (now_exp < this->player_ptr->weapon_exp_max[tval][sval]) { gain_attack_skill_exp(this->player_ptr, now_exp, - (static_cast(sval) == o_ptr->sval) ? gain_amount_list : others_gain_amount_list); + (static_cast(sval) == o_ptr->bi_key.sval()) ? gain_amount_list : others_gain_amount_list); } } } diff --git a/src/player/player-status-flags.cpp b/src/player/player-status-flags.cpp index 571a0dd981..9de0875fa4 100644 --- a/src/player/player-status-flags.cpp +++ b/src/player/player-status-flags.cpp @@ -729,10 +729,12 @@ void check_no_flowed(PlayerType *player_ptr) } for (int i = 0; i < INVEN_PACK; i++) { - if ((player_ptr->inventory_list[i].tval == ItemKindType::NATURE_BOOK) && (player_ptr->inventory_list[i].sval == 2)) { + const auto &bi_key = player_ptr->inventory_list[i].bi_key; + if (bi_key == BaseitemKey(ItemKindType::NATURE_BOOK, 2)) { has_sw = true; } - if ((player_ptr->inventory_list[i].tval == ItemKindType::CRAFT_BOOK) && (player_ptr->inventory_list[i].sval == 2)) { + + if (bi_key == BaseitemKey(ItemKindType::CRAFT_BOOK, 2)) { has_kabe = true; } } @@ -740,10 +742,10 @@ void check_no_flowed(PlayerType *player_ptr) for (const auto this_o_idx : player_ptr->current_floor_ptr->grid_array[player_ptr->y][player_ptr->x].o_idx_list) { o_ptr = &player_ptr->current_floor_ptr->o_list[this_o_idx]; - if ((o_ptr->tval == ItemKindType::NATURE_BOOK) && (o_ptr->sval == 2)) { + if (o_ptr->bi_key == BaseitemKey(ItemKindType::NATURE_BOOK, 2)) { has_sw = true; } - if ((o_ptr->tval == ItemKindType::CRAFT_BOOK) && (o_ptr->sval == 2)) { + if (o_ptr->bi_key == BaseitemKey(ItemKindType::CRAFT_BOOK, 2)) { has_kabe = true; } } @@ -1730,17 +1732,18 @@ bool is_wielding_icky_weapon(PlayerType *player_ptr, int i) auto *o_ptr = &player_ptr->inventory_list[INVEN_MAIN_HAND + i]; auto flgs = object_flags(o_ptr); - auto has_no_weapon = (o_ptr->tval == ItemKindType::NONE) || (o_ptr->tval == ItemKindType::SHIELD); + const auto tval = o_ptr->bi_key.tval(); + const auto has_no_weapon = (tval == ItemKindType::NONE) || (tval == ItemKindType::SHIELD); PlayerClass pc(player_ptr); if (pc.equals(PlayerClassType::PRIEST)) { auto is_suitable_weapon = flgs.has(TR_BLESSED); - is_suitable_weapon |= (o_ptr->tval != ItemKindType::SWORD) && (o_ptr->tval != ItemKindType::POLEARM); + is_suitable_weapon |= (tval != ItemKindType::SWORD) && (tval != ItemKindType::POLEARM); return !has_no_weapon && !is_suitable_weapon; } if (pc.equals(PlayerClassType::SORCERER)) { - auto is_suitable_weapon = o_ptr->tval == ItemKindType::HAFTED; - is_suitable_weapon &= (o_ptr->sval == SV_WIZSTAFF) || (o_ptr->sval == SV_NAMAKE_HAMMER); + auto is_suitable_weapon = o_ptr->bi_key == BaseitemKey(ItemKindType::HAFTED, SV_WIZSTAFF); + is_suitable_weapon |= o_ptr->bi_key == BaseitemKey(ItemKindType::HAFTED, SV_NAMAKE_HAMMER); return !has_no_weapon && !is_suitable_weapon; } @@ -1756,8 +1759,9 @@ bool is_wielding_icky_riding_weapon(PlayerType *player_ptr, int i) { auto *o_ptr = &player_ptr->inventory_list[INVEN_MAIN_HAND + i]; auto flgs = object_flags(o_ptr); - auto has_no_weapon = (o_ptr->tval == ItemKindType::NONE) || (o_ptr->tval == ItemKindType::SHIELD); - auto is_suitable = o_ptr->is_lance() || flgs.has(TR_RIDING); + const auto tval = o_ptr->bi_key.tval(); + const auto has_no_weapon = (tval == ItemKindType::NONE) || (tval == ItemKindType::SHIELD); + const auto is_suitable = o_ptr->is_lance() || flgs.has(TR_RIDING); return (player_ptr->riding > 0) && !has_no_weapon && !is_suitable; } @@ -1767,11 +1771,12 @@ bool has_not_ninja_weapon(PlayerType *player_ptr, int i) return false; } - auto tval = player_ptr->inventory_list[INVEN_MAIN_HAND + i].tval; - auto sval = player_ptr->inventory_list[INVEN_MAIN_HAND + i].sval; + const auto &item = player_ptr->inventory_list[INVEN_MAIN_HAND + i]; + const auto tval = item.bi_key.tval(); + const auto sval = item.bi_key.sval().value(); return PlayerClass(player_ptr).equals(PlayerClassType::NINJA) && !((player_ptr->weapon_exp_max[tval][sval] > PlayerSkill::weapon_exp_at(PlayerSkillRank::BEGINNER)) && - (player_ptr->inventory_list[INVEN_SUB_HAND - i].tval != ItemKindType::SHIELD)); + (player_ptr->inventory_list[INVEN_SUB_HAND - i].bi_key.tval() != ItemKindType::SHIELD)); } bool has_not_monk_weapon(PlayerType *player_ptr, int i) @@ -1780,8 +1785,9 @@ bool has_not_monk_weapon(PlayerType *player_ptr, int i) return false; } - auto tval = player_ptr->inventory_list[INVEN_MAIN_HAND + i].tval; - auto sval = player_ptr->inventory_list[INVEN_MAIN_HAND + i].sval; + const auto &item = player_ptr->inventory_list[INVEN_MAIN_HAND + i]; + const auto tval = item.bi_key.tval(); + const auto sval = item.bi_key.sval().value(); PlayerClass pc(player_ptr); return pc.is_martial_arts_pro() && (player_ptr->weapon_exp_max[tval][sval] == PlayerSkill::weapon_exp_at(PlayerSkillRank::UNSKILLED)); } diff --git a/src/player/player-status.cpp b/src/player/player-status.cpp index cc22bdec02..fab0c299ac 100644 --- a/src/player/player-status.cpp +++ b/src/player/player-status.cpp @@ -385,7 +385,19 @@ static void update_bonuses(PlayerType *player_ptr) set_bits(player_ptr->update, PU_MONSTERS); } - if ((player_ptr->esp_animal != old_esp_animal) || (player_ptr->esp_undead != old_esp_undead) || (player_ptr->esp_demon != old_esp_demon) || (player_ptr->esp_orc != old_esp_orc) || (player_ptr->esp_troll != old_esp_troll) || (player_ptr->esp_giant != old_esp_giant) || (player_ptr->esp_dragon != old_esp_dragon) || (player_ptr->esp_human != old_esp_human) || (player_ptr->esp_evil != old_esp_evil) || (player_ptr->esp_good != old_esp_good) || (player_ptr->esp_nonliving != old_esp_nonliving) || (player_ptr->esp_unique != old_esp_unique)) { + auto is_esp_updated = player_ptr->esp_animal != old_esp_animal; + is_esp_updated |= player_ptr->esp_undead != old_esp_undead; + is_esp_updated |= player_ptr->esp_demon != old_esp_demon; + is_esp_updated |= player_ptr->esp_orc != old_esp_orc; + is_esp_updated |= player_ptr->esp_troll != old_esp_troll; + is_esp_updated |= player_ptr->esp_giant != old_esp_giant; + is_esp_updated |= player_ptr->esp_dragon != old_esp_dragon; + is_esp_updated |= player_ptr->esp_human != old_esp_human; + is_esp_updated |= player_ptr->esp_evil != old_esp_evil; + is_esp_updated |= player_ptr->esp_good != old_esp_good; + is_esp_updated |= player_ptr->esp_nonliving != old_esp_nonliving; + is_esp_updated |= player_ptr->esp_unique != old_esp_unique; + if (is_esp_updated) { set_bits(player_ptr->update, PU_MONSTERS); } @@ -818,10 +830,15 @@ static void update_max_mana(PlayerType *player_ptr) if (any_bits(mp_ptr->spell_xtra, extra_magic_glove_reduce_mana)) { player_ptr->cumber_glove = false; - ItemEntity *o_ptr; - o_ptr = &player_ptr->inventory_list[INVEN_ARMS]; + auto *o_ptr = &player_ptr->inventory_list[INVEN_ARMS]; auto flgs = object_flags(o_ptr); - if (o_ptr->bi_id && flgs.has_not(TR_FREE_ACT) && flgs.has_not(TR_DEC_MANA) && flgs.has_not(TR_EASY_SPELL) && !((flgs.has(TR_MAGIC_MASTERY)) && (o_ptr->pval > 0)) && !((flgs.has(TR_DEX)) && (o_ptr->pval > 0))) { + auto should_mp_decrease = o_ptr->bi_id != 0; + should_mp_decrease &= flgs.has_not(TR_FREE_ACT); + should_mp_decrease &= flgs.has_not(TR_DEC_MANA); + should_mp_decrease &= flgs.has_not(TR_EASY_SPELL); + should_mp_decrease &= flgs.has_not(TR_MAGIC_MASTERY) || (o_ptr->pval <= 0); + should_mp_decrease &= flgs.has_not(TR_DEX) || (o_ptr->pval <= 0); + if (should_mp_decrease) { player_ptr->cumber_glove = true; msp = (3 * msp) / 4; } @@ -829,13 +846,19 @@ static void update_max_mana(PlayerType *player_ptr) player_ptr->cumber_armor = false; - int cur_wgt = 0; - if (player_ptr->inventory_list[INVEN_MAIN_HAND].tval > ItemKindType::SWORD) { - cur_wgt += player_ptr->inventory_list[INVEN_MAIN_HAND].weight; + auto cur_wgt = 0; + const auto &item_main_hand = player_ptr->inventory_list[INVEN_MAIN_HAND]; + const auto tval_main = item_main_hand.bi_key.tval(); + if (tval_main > ItemKindType::SWORD) { + cur_wgt += item_main_hand.weight; } - if (player_ptr->inventory_list[INVEN_SUB_HAND].tval > ItemKindType::SWORD) { - cur_wgt += player_ptr->inventory_list[INVEN_SUB_HAND].weight; + + const auto &item_sub_hand = player_ptr->inventory_list[INVEN_SUB_HAND]; + const auto tval_sub = item_sub_hand.bi_key.tval(); + if (item_sub_hand.bi_key.tval() > ItemKindType::SWORD) { + cur_wgt += item_sub_hand.weight; } + cur_wgt += player_ptr->inventory_list[INVEN_BODY].weight; cur_wgt += player_ptr->inventory_list[INVEN_HEAD].weight; cur_wgt += player_ptr->inventory_list[INVEN_OUTER].weight; @@ -849,63 +872,67 @@ static void update_max_mana(PlayerType *player_ptr) case PlayerClassType::MONK: case PlayerClassType::FORCETRAINER: case PlayerClassType::SORCERER: - case PlayerClassType::ELEMENTALIST: { - if (player_ptr->inventory_list[INVEN_MAIN_HAND].tval <= ItemKindType::SWORD) { - cur_wgt += player_ptr->inventory_list[INVEN_MAIN_HAND].weight; + case PlayerClassType::ELEMENTALIST: + if (tval_main <= ItemKindType::SWORD) { + cur_wgt += item_main_hand.weight; } - if (player_ptr->inventory_list[INVEN_SUB_HAND].tval <= ItemKindType::SWORD) { - cur_wgt += player_ptr->inventory_list[INVEN_SUB_HAND].weight; + + if (tval_sub <= ItemKindType::SWORD) { + cur_wgt += item_sub_hand.weight; } + break; - } case PlayerClassType::PRIEST: case PlayerClassType::BARD: - case PlayerClassType::TOURIST: { - if (player_ptr->inventory_list[INVEN_MAIN_HAND].tval <= ItemKindType::SWORD) { - cur_wgt += player_ptr->inventory_list[INVEN_MAIN_HAND].weight * 2 / 3; + case PlayerClassType::TOURIST: + if (tval_main <= ItemKindType::SWORD) { + cur_wgt += item_main_hand.weight * 2 / 3; } - if (player_ptr->inventory_list[INVEN_SUB_HAND].tval <= ItemKindType::SWORD) { - cur_wgt += player_ptr->inventory_list[INVEN_SUB_HAND].weight * 2 / 3; + + if (tval_sub <= ItemKindType::SWORD) { + cur_wgt += item_sub_hand.weight * 2 / 3; } + break; - } case PlayerClassType::MINDCRAFTER: case PlayerClassType::BEASTMASTER: - case PlayerClassType::MIRROR_MASTER: { - if (player_ptr->inventory_list[INVEN_MAIN_HAND].tval <= ItemKindType::SWORD) { - cur_wgt += player_ptr->inventory_list[INVEN_MAIN_HAND].weight / 2; + case PlayerClassType::MIRROR_MASTER: + if (tval_main <= ItemKindType::SWORD) { + cur_wgt += item_main_hand.weight / 2; } - if (player_ptr->inventory_list[INVEN_SUB_HAND].tval <= ItemKindType::SWORD) { - cur_wgt += player_ptr->inventory_list[INVEN_SUB_HAND].weight / 2; + + if (tval_sub <= ItemKindType::SWORD) { + cur_wgt += item_sub_hand.weight / 2; } + break; - } case PlayerClassType::ROGUE: case PlayerClassType::RANGER: case PlayerClassType::RED_MAGE: - case PlayerClassType::WARRIOR_MAGE: { - if (player_ptr->inventory_list[INVEN_MAIN_HAND].tval <= ItemKindType::SWORD) { - cur_wgt += player_ptr->inventory_list[INVEN_MAIN_HAND].weight / 3; + case PlayerClassType::WARRIOR_MAGE: + if (tval_main <= ItemKindType::SWORD) { + cur_wgt += item_main_hand.weight / 3; } - if (player_ptr->inventory_list[INVEN_SUB_HAND].tval <= ItemKindType::SWORD) { - cur_wgt += player_ptr->inventory_list[INVEN_SUB_HAND].weight / 3; + + if (tval_sub <= ItemKindType::SWORD) { + cur_wgt += item_sub_hand.weight / 3; } + break; - } case PlayerClassType::PALADIN: - case PlayerClassType::CHAOS_WARRIOR: { - if (player_ptr->inventory_list[INVEN_MAIN_HAND].tval <= ItemKindType::SWORD) { - cur_wgt += player_ptr->inventory_list[INVEN_MAIN_HAND].weight / 5; + case PlayerClassType::CHAOS_WARRIOR: + if (tval_main <= ItemKindType::SWORD) { + cur_wgt += item_main_hand.weight / 5; } - if (player_ptr->inventory_list[INVEN_SUB_HAND].tval <= ItemKindType::SWORD) { - cur_wgt += player_ptr->inventory_list[INVEN_SUB_HAND].weight / 5; + + if (tval_sub <= ItemKindType::SWORD) { + cur_wgt += item_sub_hand.weight / 5; } + break; - } - default: { + default: break; } - } int max_wgt = mp_ptr->spell_weight; if ((cur_wgt - max_wgt) > 0) { @@ -1565,7 +1592,7 @@ static int16_t calc_num_blow(PlayerType *player_ptr, int i) num_blow -= 1; } - if ((o_ptr->tval == ItemKindType::SWORD) && (o_ptr->sval == SV_POISON_NEEDLE)) { + if (o_ptr->bi_key == BaseitemKey(ItemKindType::SWORD, SV_POISON_NEEDLE)) { num_blow = 1; } @@ -1883,7 +1910,9 @@ static ARMOUR_CLASS calc_to_ac(PlayerType *player_ptr, bool is_real_value) } if (pc.equals(PlayerClassType::NINJA)) { - if ((!player_ptr->inventory_list[INVEN_MAIN_HAND].bi_id || can_attack_with_main_hand(player_ptr)) && (!player_ptr->inventory_list[INVEN_SUB_HAND].bi_id || can_attack_with_sub_hand(player_ptr))) { + const auto bi_id_main = player_ptr->inventory_list[INVEN_MAIN_HAND].bi_id; + const auto bi_id_sub = player_ptr->inventory_list[INVEN_SUB_HAND].bi_id; + if (((bi_id_main == 0) || can_attack_with_main_hand(player_ptr)) && ((bi_id_sub == 0) || can_attack_with_sub_hand(player_ptr))) { ac += player_ptr->lev / 2 + 5; } } @@ -1930,7 +1959,7 @@ int16_t calc_double_weapon_penalty(PlayerType *player_ptr, INVENTORY_IDX slot) penalty = std::min(0, penalty); } - if (player_ptr->inventory_list[slot].tval == ItemKindType::POLEARM) { + if (player_ptr->inventory_list[slot].bi_key.tval() == ItemKindType::POLEARM) { penalty += 10; } } @@ -2105,7 +2134,8 @@ static short calc_to_damage(PlayerType *player_ptr, INVENTORY_IDX slot, bool is_ auto player_stun = player_ptr->effects()->stun(); damage -= player_stun->get_damage_penalty(); PlayerClass pc(player_ptr); - if (pc.equals(PlayerClassType::PRIEST) && (flgs.has_not(TR_BLESSED)) && ((o_ptr->tval == ItemKindType::SWORD) || (o_ptr->tval == ItemKindType::POLEARM))) { + const auto tval = o_ptr->bi_key.tval(); + if (pc.equals(PlayerClassType::PRIEST) && (flgs.has_not(TR_BLESSED)) && ((tval == ItemKindType::SWORD) || (tval == ItemKindType::POLEARM))) { damage -= 2; } else if (pc.equals(PlayerClassType::BERSERKER)) { damage += player_ptr->lev / 6; @@ -2113,7 +2143,9 @@ static short calc_to_damage(PlayerType *player_ptr, INVENTORY_IDX slot, bool is_ damage += player_ptr->lev / 6; } } else if (pc.equals(PlayerClassType::SORCERER)) { - if (!((o_ptr->tval == ItemKindType::HAFTED) && ((o_ptr->sval == SV_WIZSTAFF) || (o_ptr->sval == SV_NAMAKE_HAMMER)))) { + auto is_suitable = o_ptr->bi_key == BaseitemKey(ItemKindType::HAFTED, SV_WIZSTAFF); + is_suitable |= o_ptr->bi_key == BaseitemKey(ItemKindType::HAFTED, SV_NAMAKE_HAMMER); + if (!is_suitable) { damage -= 200; } else { damage -= 10; @@ -2142,7 +2174,8 @@ static short calc_to_damage(PlayerType *player_ptr, INVENTORY_IDX slot, bool is_ for (int i = INVEN_MAIN_HAND; i < INVEN_TOTAL; i++) { int bonus_to_d = 0; o_ptr = &player_ptr->inventory_list[i]; - if (!o_ptr->bi_id || o_ptr->tval == ItemKindType::CAPTURE || (i == INVEN_MAIN_HAND && has_melee_weapon(player_ptr, i)) || (i == INVEN_SUB_HAND && has_melee_weapon(player_ptr, i)) || i == INVEN_BOW) { + const auto has_melee = has_melee_weapon(player_ptr, i); + if ((o_ptr->bi_id == 0) || (o_ptr->bi_key.tval() == ItemKindType::CAPTURE) || ((i == INVEN_MAIN_HAND) && has_melee) || ((i == INVEN_SUB_HAND) && has_melee) || (i == INVEN_BOW)) { continue; } @@ -2297,7 +2330,9 @@ static short calc_to_hit(PlayerType *player_ptr, INVENTORY_IDX slot, bool is_rea auto flgs = object_flags(o_ptr); /* Traind bonuses */ - hit += (player_ptr->weapon_exp[o_ptr->tval][o_ptr->sval] - PlayerSkill::weapon_exp_at(PlayerSkillRank::BEGINNER)) / 200; + const auto tval = o_ptr->bi_key.tval(); + const auto sval = o_ptr->bi_key.sval().value(); + hit += (player_ptr->weapon_exp[tval][sval] - PlayerSkill::weapon_exp_at(PlayerSkillRank::BEGINNER)) / 200; /* Weight penalty */ if (calc_weapon_weight_limit(player_ptr) < o_ptr->weight / 10) { @@ -2334,7 +2369,7 @@ static short calc_to_hit(PlayerType *player_ptr, INVENTORY_IDX slot, bool is_rea } /* Class penalties */ - if (pc.equals(PlayerClassType::PRIEST) && (flgs.has_not(TR_BLESSED)) && ((o_ptr->tval == ItemKindType::SWORD) || (o_ptr->tval == ItemKindType::POLEARM))) { + if (pc.equals(PlayerClassType::PRIEST) && (flgs.has_not(TR_BLESSED)) && ((tval == ItemKindType::SWORD) || (tval == ItemKindType::POLEARM))) { hit -= 2; } else if (pc.equals(PlayerClassType::BERSERKER)) { hit += player_ptr->lev / 5; @@ -2342,7 +2377,9 @@ static short calc_to_hit(PlayerType *player_ptr, INVENTORY_IDX slot, bool is_rea hit += player_ptr->lev / 5; } } else if (pc.equals(PlayerClassType::SORCERER)) { - if (!((o_ptr->tval == ItemKindType::HAFTED) && ((o_ptr->sval == SV_WIZSTAFF) || (o_ptr->sval == SV_NAMAKE_HAMMER)))) { + auto is_suitable = o_ptr->bi_key == BaseitemKey(ItemKindType::HAFTED, SV_WIZSTAFF); + is_suitable |= o_ptr->bi_key == BaseitemKey(ItemKindType::HAFTED, SV_NAMAKE_HAMMER); + if (!is_suitable) { hit -= 200; } else { hit -= 30; @@ -2375,7 +2412,8 @@ static short calc_to_hit(PlayerType *player_ptr, INVENTORY_IDX slot, bool is_rea auto *o_ptr = &player_ptr->inventory_list[i]; /* Ignore empty hands, handed weapons, bows and capture balls */ - if (!o_ptr->bi_id || o_ptr->tval == ItemKindType::CAPTURE || (i == INVEN_MAIN_HAND && has_melee_weapon(player_ptr, i)) || (i == INVEN_SUB_HAND && has_melee_weapon(player_ptr, i)) || i == INVEN_BOW) { + const auto has_melee = has_melee_weapon(player_ptr, i); + if (!o_ptr->bi_id || o_ptr->bi_key.tval() == ItemKindType::CAPTURE || (i == INVEN_MAIN_HAND && has_melee) || (i == INVEN_SUB_HAND && has_melee) || i == INVEN_BOW) { continue; } @@ -2511,7 +2549,8 @@ static int16_t calc_to_hit_bow(PlayerType *player_ptr, bool is_real_value) for (int i = INVEN_MAIN_HAND; i < INVEN_TOTAL; i++) { int bonus_to_h; o_ptr = &player_ptr->inventory_list[i]; - if (!o_ptr->bi_id || o_ptr->tval == ItemKindType::CAPTURE || (i == INVEN_MAIN_HAND && has_melee_weapon(player_ptr, i)) || (i == INVEN_SUB_HAND && has_melee_weapon(player_ptr, i)) || i == INVEN_BOW) { + const auto has_melee = has_melee_weapon(player_ptr, i); + if ((o_ptr->bi_id == 0) || (o_ptr->bi_key.tval() == ItemKindType::CAPTURE) || ((i == INVEN_MAIN_HAND) && has_melee) || ((i == INVEN_SUB_HAND) && has_melee) || i == INVEN_BOW) { continue; } @@ -2742,7 +2781,7 @@ bool player_has_no_spellbooks(PlayerType *player_ptr) ItemEntity *o_ptr; for (int i = 0; i < INVEN_PACK; i++) { o_ptr = &player_ptr->inventory_list[i]; - if (o_ptr->bi_id && check_book_realm(player_ptr, { o_ptr->tval, o_ptr->sval })) { + if (o_ptr->bi_id && check_book_realm(player_ptr, o_ptr->bi_key)) { return false; } } @@ -2750,7 +2789,7 @@ bool player_has_no_spellbooks(PlayerType *player_ptr) auto *floor_ptr = player_ptr->current_floor_ptr; for (const auto this_o_idx : floor_ptr->grid_array[player_ptr->y][player_ptr->x].o_idx_list) { o_ptr = &floor_ptr->o_list[this_o_idx]; - if (o_ptr->bi_id && o_ptr->marked.has(OmType::FOUND) && check_book_realm(player_ptr, { o_ptr->tval, o_ptr->sval })) { + if (o_ptr->bi_id && o_ptr->marked.has(OmType::FOUND) && check_book_realm(player_ptr, o_ptr->bi_key)) { return false; } } diff --git a/src/player/process-death.cpp b/src/player/process-death.cpp index 1200e2edf5..e2f97c49c0 100644 --- a/src/player/process-death.cpp +++ b/src/player/process-death.cpp @@ -341,7 +341,7 @@ static void show_dead_home_items(PlayerType *player_ptr) sprintf(tmp_val, "%c) ", I2A(j)); prt(tmp_val, j + 2, 4); describe_flavor(player_ptr, o_name, o_ptr, 0); - c_put_str(tval_to_attr[enum2i(o_ptr->tval)], o_name, j + 2, 7); + c_put_str(tval_to_attr[enum2i(o_ptr->bi_key.tval())], o_name, j + 2, 7); } prt(format(_("我が家に置いてあったアイテム ( %d ページ): -続く-", "Your home contains (page %d): -more-"), k + 1), 0, 0); diff --git a/src/racial/racial-android.cpp b/src/racial/racial-android.cpp index f4b5c76482..a6200c8302 100644 --- a/src/racial/racial-android.cpp +++ b/src/racial/racial-android.cpp @@ -118,17 +118,28 @@ void calc_android_exp(PlayerType *player_ptr) if (value <= 0) { continue; } - if ((o_ptr->tval == ItemKindType::SOFT_ARMOR) && (o_ptr->sval == SV_ABUNAI_MIZUGI) && (player_ptr->ppersonality != PERSONALITY_SEXY)) { + + const auto &bi_key = o_ptr->bi_key; + if ((bi_key == BaseitemKey(ItemKindType::SOFT_ARMOR, SV_ABUNAI_MIZUGI)) && (player_ptr->ppersonality != PERSONALITY_SEXY)) { value /= 32; } + if (value > 5000000L) { value = 5000000L; } - if ((o_ptr->tval == ItemKindType::DRAG_ARMOR) || (o_ptr->tval == ItemKindType::CARD)) { + + const auto tval = o_ptr->bi_key.tval(); + if ((tval == ItemKindType::DRAG_ARMOR) || (tval == ItemKindType::CARD)) { level /= 2; } - if (o_ptr->is_artifact() || o_ptr->is_ego() || (o_ptr->tval == ItemKindType::DRAG_ARMOR) || ((o_ptr->tval == ItemKindType::HELM) && (o_ptr->sval == SV_DRAGON_HELM)) || ((o_ptr->tval == ItemKindType::SHIELD) && (o_ptr->sval == SV_DRAGON_SHIELD)) || ((o_ptr->tval == ItemKindType::GLOVES) && (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES)) || ((o_ptr->tval == ItemKindType::BOOTS) && (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE)) || ((o_ptr->tval == ItemKindType::SWORD) && (o_ptr->sval == SV_DIAMOND_EDGE))) { + auto is_dragon_protector = tval == ItemKindType::DRAG_ARMOR; + is_dragon_protector |= bi_key == BaseitemKey(ItemKindType::HELM, SV_DRAGON_HELM); + is_dragon_protector |= bi_key == BaseitemKey(ItemKindType::SHIELD, SV_DRAGON_SHIELD); + is_dragon_protector |= bi_key == BaseitemKey(ItemKindType::GLOVES, SV_SET_OF_DRAGON_GLOVES); + is_dragon_protector |= bi_key == BaseitemKey(ItemKindType::BOOTS, SV_PAIR_OF_DRAGON_GREAVE); + const auto is_diamond_edge = bi_key == BaseitemKey(ItemKindType::SWORD, SV_DIAMOND_EDGE); + if (o_ptr->is_artifact() || o_ptr->is_ego() || is_dragon_protector || is_diamond_edge) { if (level > 65) { level = 35 + (level - 65) / 5; } else if (level > 35) { diff --git a/src/smith/object-smith.cpp b/src/smith/object-smith.cpp index 9f30255303..e5a7a9c5bd 100644 --- a/src/smith/object-smith.cpp +++ b/src/smith/object-smith.cpp @@ -336,7 +336,7 @@ Smith::DrainEssenceResult Smith::drain_essence(ItemEntity *o_ptr) } // マイナス効果のあるアイテムから抽出する時のペナルティを計算 - int dec = 4; + auto dec = 4; if (o_ptr->curse_flags.has_any_of({ CurseTraitType::CURSED, CurseTraitType::HEAVY_CURSE, CurseTraitType::PERMA_CURSE })) { dec--; } @@ -352,16 +352,15 @@ Smith::DrainEssenceResult Smith::drain_essence(ItemEntity *o_ptr) // アイテムをエッセンス抽出後の状態にする const ItemEntity old_o = *o_ptr; o_ptr->prep(o_ptr->bi_id); - o_ptr->iy = old_o.iy; o_ptr->ix = old_o.ix; o_ptr->marked = old_o.marked; o_ptr->number = old_o.number; o_ptr->discount = old_o.discount; - - if (o_ptr->tval == ItemKindType::DRAG_ARMOR) { + if (o_ptr->bi_key.tval() == ItemKindType::DRAG_ARMOR) { o_ptr->timeout = old_o.timeout; } + o_ptr->ident |= (IDENT_FULL_KNOWN); object_aware(player_ptr, o_ptr); object_known(o_ptr); diff --git a/src/smith/smith-info.cpp b/src/smith/smith-info.cpp index 448148d458..b6e26ae399 100644 --- a/src/smith/smith-info.cpp +++ b/src/smith/smith-info.cpp @@ -7,7 +7,8 @@ #include "system/item-entity.h" #include "system/player-type-definition.h" -ISmithInfo::ISmithInfo(SmithEffectType effect, concptr name, SmithCategoryType category, std::vector need_essences, int consumption) +ISmithInfo::ISmithInfo(SmithEffectType effect, concptr name, SmithCategoryType category, + std::vector need_essences, int consumption) : effect(effect) , name(name) , category(category) @@ -21,7 +22,8 @@ TrFlags ISmithInfo::tr_flags() const return {}; } -BasicSmithInfo::BasicSmithInfo(SmithEffectType effect, concptr name, SmithCategoryType category, std::vector need_essences, int consumption, TrFlags add_flags) +BasicSmithInfo::BasicSmithInfo(SmithEffectType effect, concptr name, SmithCategoryType category, + std::vector need_essences, int consumption, TrFlags add_flags) : ISmithInfo(effect, name, category, std::move(need_essences), consumption) , add_flags(add_flags) { @@ -64,18 +66,23 @@ bool BasicSmithInfo::can_give_smith_effect(const ItemEntity *o_ptr) const bool BasicSmithInfo::can_give_smith_effect_impl(const ItemEntity *o_ptr) const { + const auto tval = o_ptr->bi_key.tval(); if (this->effect == SmithEffectType::XTRA_MIGHT || this->effect == SmithEffectType::XTRA_SHOTS) { - return o_ptr->tval == ItemKindType::BOW; + return tval == ItemKindType::BOW; } + if (this->effect == SmithEffectType::VORPAL) { - return (o_ptr->tval == ItemKindType::SWORD) && (o_ptr->sval != SV_POISON_NEEDLE); + return (tval == ItemKindType::SWORD) && (o_ptr->bi_key.sval() != SV_POISON_NEEDLE); } + if (this->effect == SmithEffectType::EASY_2WEAPON) { - return (o_ptr->tval == ItemKindType::GLOVES); + return (tval == ItemKindType::GLOVES); } + if (this->category == SmithCategoryType::WEAPON_ATTR && o_ptr->is_ammo()) { return this->add_flags.has_any_of({ TR_BRAND_ACID, TR_BRAND_ELEC, TR_BRAND_FIRE, TR_BRAND_COLD, TR_BRAND_POIS }); } + if (this->category == SmithCategoryType::WEAPON_ATTR || this->category == SmithCategoryType::SLAYING) { return o_ptr->is_melee_ammo(); } @@ -83,7 +90,8 @@ bool BasicSmithInfo::can_give_smith_effect_impl(const ItemEntity *o_ptr) const return o_ptr->is_weapon_armour_ammo() && o_ptr->is_wearable(); } -ActivationSmithInfo::ActivationSmithInfo(SmithEffectType effect, concptr name, SmithCategoryType category, std::vector need_essences, int consumption, RandomArtActType act_idx) +ActivationSmithInfo::ActivationSmithInfo(SmithEffectType effect, concptr name, SmithCategoryType category, + std::vector need_essences, int consumption, RandomArtActType act_idx) : ISmithInfo(effect, name, category, std::move(need_essences), consumption) , act_idx(act_idx) { @@ -110,7 +118,8 @@ bool ActivationSmithInfo::can_give_smith_effect(const ItemEntity *o_ptr) const return o_ptr->is_weapon_armour_ammo() && o_ptr->is_wearable(); } -EnchantWeaponSmithInfo::EnchantWeaponSmithInfo(SmithEffectType effect, concptr name, SmithCategoryType category, std::vector need_essences, int consumption) +EnchantWeaponSmithInfo::EnchantWeaponSmithInfo(SmithEffectType effect, concptr name, SmithCategoryType category, + std::vector need_essences, int consumption) : ISmithInfo(effect, name, category, std::move(need_essences), consumption) { } @@ -137,7 +146,8 @@ bool EnchantWeaponSmithInfo::can_give_smith_effect(const ItemEntity *o_ptr) cons return o_ptr->allow_enchant_weapon(); } -EnchantArmourSmithInfo::EnchantArmourSmithInfo(SmithEffectType effect, concptr name, SmithCategoryType category, std::vector need_essences, int consumption) +EnchantArmourSmithInfo::EnchantArmourSmithInfo(SmithEffectType effect, concptr name, SmithCategoryType category, + std::vector need_essences, int consumption) : ISmithInfo(effect, name, category, std::move(need_essences), consumption) { } @@ -159,7 +169,8 @@ bool EnchantArmourSmithInfo::can_give_smith_effect(const ItemEntity *o_ptr) cons return o_ptr->is_protector(); } -SustainSmithInfo::SustainSmithInfo(SmithEffectType effect, concptr name, SmithCategoryType category, std::vector need_essences, int consumption) +SustainSmithInfo::SustainSmithInfo(SmithEffectType effect, concptr name, SmithCategoryType category, + std::vector need_essences, int consumption) : ISmithInfo(effect, name, category, std::move(need_essences), consumption) { } @@ -179,7 +190,8 @@ bool SustainSmithInfo::can_give_smith_effect(const ItemEntity *o_ptr) const return o_ptr->is_weapon_armour_ammo(); } -SlayingGlovesSmithInfo::SlayingGlovesSmithInfo(SmithEffectType effect, concptr name, SmithCategoryType category, std::vector need_essences, int consumption) +SlayingGlovesSmithInfo::SlayingGlovesSmithInfo(SmithEffectType effect, concptr name, SmithCategoryType category, + std::vector need_essences, int consumption) : BasicSmithInfo(effect, name, category, std::move(need_essences), consumption, {}) { } @@ -216,5 +228,5 @@ void SlayingGlovesSmithInfo::erase_essence(ItemEntity *o_ptr) const bool SlayingGlovesSmithInfo::can_give_smith_effect_impl(const ItemEntity *o_ptr) const { - return o_ptr->tval == ItemKindType::GLOVES; + return o_ptr->bi_key.tval() == ItemKindType::GLOVES; } diff --git a/src/specific-object/chest.cpp b/src/specific-object/chest.cpp index 722314ff5d..fe220aacfb 100644 --- a/src/specific-object/chest.cpp +++ b/src/specific-object/chest.cpp @@ -56,24 +56,18 @@ Chest::Chest(PlayerType *player_ptr) */ void Chest::chest_death(bool scatter, POSITION y, POSITION x, OBJECT_IDX o_idx) { - int number; - - bool small; BIT_FLAGS mode = AM_GOOD | AM_FORBID_CHEST; - - ItemEntity forge; - ItemEntity *q_ptr; - auto *floor_ptr = this->player_ptr->current_floor_ptr; auto *o_ptr = &floor_ptr->o_list[o_idx]; /* Small chests often hold "gold" */ - small = (o_ptr->sval < SV_CHEST_MIN_LARGE); + const auto sval = o_ptr->bi_key.sval().value(); + auto small = sval < SV_CHEST_MIN_LARGE; /* Determine how much to drop (see above) */ - number = (o_ptr->sval % SV_CHEST_MIN_LARGE) * 2; + auto number = (sval % SV_CHEST_MIN_LARGE) * 2; - if (o_ptr->sval == SV_CHEST_KANDUME) { + if (sval == SV_CHEST_KANDUME) { number = 5; small = false; mode |= AM_GREAT; @@ -89,6 +83,8 @@ void Chest::chest_death(bool scatter, POSITION y, POSITION x, OBJECT_IDX o_idx) } /* Drop some objects (non-chests) */ + ItemEntity forge; + ItemEntity *q_ptr; for (; number > 0; --number) { q_ptr = &forge; q_ptr->wipe(); diff --git a/src/specific-object/monster-ball.cpp b/src/specific-object/monster-ball.cpp index 2c5bf561b0..be156c3a2a 100644 --- a/src/specific-object/monster-ball.cpp +++ b/src/specific-object/monster-ball.cpp @@ -186,7 +186,7 @@ static void check_monster_ball_use(PlayerType *player_ptr, ae_type *ae_ptr) bool exe_monster_capture(PlayerType *player_ptr, ae_type *ae_ptr) { - if (ae_ptr->o_ptr->tval != ItemKindType::CAPTURE) { + if (ae_ptr->o_ptr->bi_key.tval() != ItemKindType::CAPTURE) { return false; } diff --git a/src/specific-object/torch.cpp b/src/specific-object/torch.cpp index e7025917ef..aa5d0bffe7 100644 --- a/src/specific-object/torch.cpp +++ b/src/specific-object/torch.cpp @@ -27,7 +27,7 @@ */ bool is_active_torch(ItemEntity *o_ptr) { - return (o_ptr->tval == ItemKindType::LITE) && (o_ptr->sval == SV_LITE_TORCH) && (o_ptr->fuel > 0); + return (o_ptr->bi_key == BaseitemKey(ItemKindType::LITE, SV_LITE_TORCH)) && (o_ptr->fuel > 0); } /*! @@ -103,12 +103,13 @@ void update_lite_radius(PlayerType *player_ptr) } if (flgs.has_not(TR_DARK_SOURCE)) { - if (o_ptr->tval == ItemKindType::LITE) { - if ((o_ptr->sval == SV_LITE_TORCH) && !(o_ptr->fuel > 0)) { + if (o_ptr->bi_key.tval() == ItemKindType::LITE) { + const auto sval = o_ptr->bi_key.sval(); + if ((sval == SV_LITE_TORCH) && (o_ptr->fuel <= 0)) { continue; } - if ((o_ptr->sval == SV_LITE_LANTERN) && !(o_ptr->fuel > 0)) { + if ((sval == SV_LITE_LANTERN) && (o_ptr->fuel <= 0)) { continue; } } diff --git a/src/spell-kind/magic-item-recharger.cpp b/src/spell-kind/magic-item-recharger.cpp index 2e0de93d04..9b484c3b67 100644 --- a/src/spell-kind/magic-item-recharger.cpp +++ b/src/spell-kind/magic-item-recharger.cpp @@ -63,8 +63,9 @@ bool recharge(PlayerType *player_ptr, int power) TIME_EFFECT recharge_amount; int recharge_strength; - bool is_recharge_successful = true; - if (o_ptr->tval == ItemKindType::ROD) { + auto is_recharge_successful = true; + const auto tval = o_ptr->bi_key.tval(); + if (tval == ItemKindType::ROD) { recharge_strength = ((power > lev / 2) ? (power - lev / 2) : 0) / 5; if (one_in_(recharge_strength)) { is_recharge_successful = false; @@ -77,7 +78,7 @@ bool recharge(PlayerType *player_ptr, int power) } } } else { - if ((o_ptr->tval == ItemKindType::WAND) && (o_ptr->number > 1)) { + if ((tval == ItemKindType::WAND) && (o_ptr->number > 1)) { recharge_strength = (100 + power - lev - (8 * o_ptr->pval / o_ptr->number)) / 15; } else { recharge_strength = (100 + power - lev - (8 * o_ptr->pval)) / 15; @@ -91,7 +92,7 @@ bool recharge(PlayerType *player_ptr, int power) is_recharge_successful = false; } else { recharge_amount = randint1(1 + baseitem.pval / 2); - if ((o_ptr->tval == ItemKindType::WAND) && (o_ptr->number > 1)) { + if ((tval == ItemKindType::WAND) && (o_ptr->number > 1)) { recharge_amount += (randint1(recharge_amount * (o_ptr->number - 1))) / 2; if (recharge_amount < 1) { recharge_amount = 1; @@ -101,7 +102,7 @@ bool recharge(PlayerType *player_ptr, int power) } } - if ((o_ptr->tval == ItemKindType::STAFF) && (o_ptr->number > 1)) { + if ((tval == ItemKindType::STAFF) && (o_ptr->number > 1)) { recharge_amount /= (TIME_EFFECT)o_ptr->number; if (recharge_amount < 1) { recharge_amount = 1; @@ -118,12 +119,11 @@ bool recharge(PlayerType *player_ptr, int power) return update_player(player_ptr); } - byte fail_type = 1; GAME_TEXT o_name[MAX_NLEN]; if (o_ptr->is_fixed_artifact()) { describe_flavor(player_ptr, o_name, o_ptr, OD_NAME_ONLY); msg_format(_("魔力が逆流した!%sは完全に魔力を失った。", "The recharging backfires - %s is completely drained!"), o_name); - if ((o_ptr->tval == ItemKindType::ROD) && (o_ptr->timeout < 10000)) { + if ((tval == ItemKindType::ROD) && (o_ptr->timeout < 10000)) { o_ptr->timeout = (o_ptr->timeout + 100) * 2; } else if (o_ptr->is_wand_staff()) { o_ptr->pval = 0; @@ -132,10 +132,10 @@ bool recharge(PlayerType *player_ptr, int power) } describe_flavor(player_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); - + auto fail_type = 1; if (PlayerClass(player_ptr).is_wizard()) { /* 10% chance to blow up one rod, otherwise draining. */ - if (o_ptr->tval == ItemKindType::ROD) { + if (tval == ItemKindType::ROD) { if (one_in_(10)) { fail_type = 2; } else { @@ -143,7 +143,7 @@ bool recharge(PlayerType *player_ptr, int power) } } /* 75% chance to blow up one wand, otherwise draining. */ - else if (o_ptr->tval == ItemKindType::WAND) { + else if (tval == ItemKindType::WAND) { if (!one_in_(3)) { fail_type = 2; } else { @@ -151,7 +151,7 @@ bool recharge(PlayerType *player_ptr, int power) } } /* 50% chance to blow up one staff, otherwise no effect. */ - else if (o_ptr->tval == ItemKindType::STAFF) { + else if (tval == ItemKindType::STAFF) { if (one_in_(2)) { fail_type = 2; } else { @@ -160,7 +160,7 @@ bool recharge(PlayerType *player_ptr, int power) } } else { /* 33% chance to blow up one rod, otherwise draining. */ - if (o_ptr->tval == ItemKindType::ROD) { + if (tval == ItemKindType::ROD) { if (one_in_(3)) { fail_type = 2; } else { @@ -168,7 +168,7 @@ bool recharge(PlayerType *player_ptr, int power) } } /* 20% chance of the entire stack, else destroy one wand. */ - else if (o_ptr->tval == ItemKindType::WAND) { + else if (tval == ItemKindType::WAND) { if (one_in_(5)) { fail_type = 3; } else { @@ -176,42 +176,45 @@ bool recharge(PlayerType *player_ptr, int power) } } /* Blow up one staff. */ - else if (o_ptr->tval == ItemKindType::STAFF) { + else if (tval == ItemKindType::STAFF) { fail_type = 2; } } - if (fail_type == 1) { - if (o_ptr->tval == ItemKindType::ROD) { + switch (fail_type) { + case 0: + break; + case 1: + if (tval == ItemKindType::ROD) { msg_print(_("魔力が逆噴射して、ロッドからさらに魔力を吸い取ってしまった!", "The recharge backfires, draining the rod further!")); if (o_ptr->timeout < 10000) { o_ptr->timeout = (o_ptr->timeout + 100) * 2; } - } else if (o_ptr->tval == ItemKindType::WAND) { + } else if (tval == ItemKindType::WAND) { msg_format(_("%sは破損を免れたが、魔力が全て失われた。", "You save your %s from destruction, but all charges are lost."), o_name); o_ptr->pval = 0; } - } - if (fail_type == 2) { + break; + case 2: if (o_ptr->number > 1) { msg_format(_("乱暴な魔法のために%sが一本壊れた!", "Wild magic consumes one of your %s!"), o_name); } else { msg_format(_("乱暴な魔法のために%sが壊れた!", "Wild magic consumes your %s!"), o_name); } - if (o_ptr->tval == ItemKindType::ROD) { + if (tval == ItemKindType::ROD) { o_ptr->timeout = (o_ptr->number - 1) * baseitem.pval; } - if (o_ptr->tval == ItemKindType::WAND) { + + if (tval == ItemKindType::WAND) { o_ptr->pval = 0; } vary_item(player_ptr, item, -1); - } - - if (fail_type == 3) { + break; + case 3: if (o_ptr->number > 1) { msg_format(_("乱暴な魔法のために%sが全て壊れた!", "Wild magic consumes all your %s!"), o_name); } else { @@ -219,6 +222,9 @@ bool recharge(PlayerType *player_ptr, int power) } vary_item(player_ptr, item, -999); + break; + default: + throw std::logic_error("Invalid fail type!"); } return update_player(player_ptr); diff --git a/src/spell-kind/spells-detection.cpp b/src/spell-kind/spells-detection.cpp index 5fb811f801..1b80ca5422 100644 --- a/src/spell-kind/spells-detection.cpp +++ b/src/spell-kind/spells-detection.cpp @@ -199,7 +199,7 @@ bool detect_objects_gold(PlayerType *player_ptr, POSITION range) continue; } - if (o_ptr->tval == ItemKindType::GOLD) { + if (o_ptr->bi_key.tval() == ItemKindType::GOLD) { o_ptr->marked.set(OmType::FOUND); lite_spot(player_ptr, y, x); detect = true; @@ -251,7 +251,7 @@ bool detect_objects_normal(PlayerType *player_ptr, POSITION range) continue; } - if (o_ptr->tval != ItemKindType::GOLD) { + if (o_ptr->bi_key.tval() != ItemKindType::GOLD) { o_ptr->marked.set(OmType::FOUND); lite_spot(player_ptr, y, x); detect = true; @@ -317,7 +317,7 @@ bool detect_objects_magic(PlayerType *player_ptr, POSITION range) auto has_bonus = o_ptr->to_a > 0; has_bonus |= o_ptr->to_h + o_ptr->to_d > 0; - if (o_ptr->is_artifact() || o_ptr->is_ego() || is_object_magically(o_ptr->tval) || o_ptr->is_spell_book() || has_bonus) { + if (o_ptr->is_artifact() || o_ptr->is_ego() || is_object_magically(o_ptr->bi_key.tval()) || o_ptr->is_spell_book() || has_bonus) { o_ptr->marked.set(OmType::FOUND); lite_spot(player_ptr, y, x); detect = true; diff --git a/src/spell-realm/spells-arcane.cpp b/src/spell-realm/spells-arcane.cpp index b9421ad5e0..ad4a2e561a 100644 --- a/src/spell-realm/spells-arcane.cpp +++ b/src/spell-realm/spells-arcane.cpp @@ -15,9 +15,10 @@ void phlogiston(PlayerType *player_ptr) { short max_flog = 0; auto *o_ptr = &player_ptr->inventory_list[INVEN_LITE]; - if ((o_ptr->tval == ItemKindType::LITE) && (o_ptr->sval == SV_LITE_LANTERN)) { + const auto &bi_key = o_ptr->bi_key; + if (bi_key == BaseitemKey(ItemKindType::LITE, SV_LITE_LANTERN)) { max_flog = FUEL_LAMP; - } else if ((o_ptr->tval == ItemKindType::LITE) && (o_ptr->sval == SV_LITE_TORCH)) { + } else if (bi_key == BaseitemKey(ItemKindType::LITE, SV_LITE_TORCH)) { max_flog = FUEL_TORCH; } else { msg_print(_("燃素を消費するアイテムを装備していません。", "You are not wielding anything which uses phlogiston.")); diff --git a/src/spell-realm/spells-craft.cpp b/src/spell-realm/spells-craft.cpp index 278ab8b4dd..3380d27723 100644 --- a/src/spell-realm/spells-craft.cpp +++ b/src/spell-realm/spells-craft.cpp @@ -283,7 +283,7 @@ bool pulish_shield(PlayerType *player_ptr) auto is_pulish_successful = (o_ptr->bi_id > 0) && !o_ptr->is_artifact() && !o_ptr->is_ego(); is_pulish_successful &= !o_ptr->is_cursed(); - is_pulish_successful &= (o_ptr->sval != SV_MIRROR_SHIELD); + is_pulish_successful &= (o_ptr->bi_key.sval() != SV_MIRROR_SHIELD); if (is_pulish_successful) { #ifdef JP msg_format("%sは輝いた!", o_name); diff --git a/src/spell/spells-object.cpp b/src/spell/spells-object.cpp index f602b008ee..48edafdafc 100644 --- a/src/spell/spells-object.cpp +++ b/src/spell/spells-object.cpp @@ -342,7 +342,7 @@ void brand_bolts(PlayerType *player_ptr) auto *o_ptr = &player_ptr->inventory_list[i]; /* Skip non-bolts */ - if (o_ptr->tval != ItemKindType::BOLT) { + if (o_ptr->bi_key.tval() != ItemKindType::BOLT) { continue; } @@ -423,7 +423,7 @@ bool enchant_equipment(PlayerType *player_ptr, ItemEntity *o_ptr, int n, int efl int prob = o_ptr->number * 100; /* Missiles are easy to enchant */ - if ((o_ptr->tval == ItemKindType::BOLT) || (o_ptr->tval == ItemKindType::ARROW) || (o_ptr->tval == ItemKindType::SHOT)) { + if (o_ptr->is_ammo()) { prob = prob / 20; } @@ -603,9 +603,10 @@ void brand_weapon(PlayerType *player_ptr, int brand_type) return; } - auto special_weapon = (o_ptr->tval == ItemKindType::SWORD) && (o_ptr->sval == SV_POISON_NEEDLE); - special_weapon |= (o_ptr->tval == ItemKindType::POLEARM) && (o_ptr->sval == SV_DEATH_SCYTHE); - special_weapon |= (o_ptr->tval == ItemKindType::SWORD) && (o_ptr->sval == SV_DIAMOND_EDGE); + const auto &bi_key = o_ptr->bi_key; + auto special_weapon = bi_key == BaseitemKey(ItemKindType::SWORD, SV_POISON_NEEDLE); + special_weapon |= bi_key == BaseitemKey(ItemKindType::POLEARM, SV_DEATH_SCYTHE); + special_weapon |= bi_key == BaseitemKey(ItemKindType::SWORD, SV_DIAMOND_EDGE); const auto is_normal_item = o_ptr->bi_id && !o_ptr->is_artifact() && !o_ptr->is_ego() && !o_ptr->is_cursed() && !special_weapon; if (!is_normal_item) { if (flush_failure) { @@ -624,13 +625,13 @@ void brand_weapon(PlayerType *player_ptr, int brand_type) concptr act = nullptr; switch (brand_type) { case 17: - if (o_ptr->tval == ItemKindType::SWORD) { + if (o_ptr->bi_key.tval() == ItemKindType::SWORD) { act = _("は鋭さを増した!", "becomes very sharp!"); o_ptr->ego_idx = EgoType::SHARPNESS; o_ptr->pval = (PARAMETER_VALUE)m_bonus(5, player_ptr->current_floor_ptr->dun_level) + 1; - if ((o_ptr->sval == SV_HAYABUSA) && (o_ptr->pval > 2)) { + if ((o_ptr->bi_key.sval() == SV_HAYABUSA) && (o_ptr->pval > 2)) { o_ptr->pval = 2; } } else { diff --git a/src/store/home.cpp b/src/store/home.cpp index 79d9bcee9d..f8f43d0df2 100644 --- a/src/store/home.cpp +++ b/src/store/home.cpp @@ -126,10 +126,11 @@ static void sweep_reorder_store_item(ItemEntity *o_ptr, const int i, bool *combi ITEM_NUMBER remain = j_ptr->number + o_ptr->number - max_num; object_absorb(j_ptr, o_ptr); o_ptr->number = remain; - if (o_ptr->tval == ItemKindType::ROD) { + const auto tval = o_ptr->bi_key.tval(); + if (tval == ItemKindType::ROD) { o_ptr->pval = o_ptr->pval * remain / old_num; o_ptr->timeout = o_ptr->timeout * remain / old_num; - } else if (o_ptr->tval == ItemKindType::WAND) { + } else if (tval == ItemKindType::WAND) { o_ptr->pval = o_ptr->pval * remain / old_num; } diff --git a/src/store/purchase-order.cpp b/src/store/purchase-order.cpp index 3d33b760dd..2250214e34 100644 --- a/src/store/purchase-order.cpp +++ b/src/store/purchase-order.cpp @@ -282,7 +282,7 @@ void store_purchase(PlayerType *player_ptr, StoreSaleType store_num) if (store_num == StoreSaleType::BLACK) { chg_virtue(player_ptr, V_JUSTICE, -1); } - if ((o_ptr->tval == ItemKindType::BOTTLE) && (store_num != StoreSaleType::HOME)) { + if ((o_ptr->bi_key.tval() == ItemKindType::BOTTLE) && (store_num != StoreSaleType::HOME)) { chg_virtue(player_ptr, V_NATURE, -1); } diff --git a/src/store/sell-order.cpp b/src/store/sell-order.cpp index 3ad49fa05b..20f33897a0 100644 --- a/src/store/sell-order.cpp +++ b/src/store/sell-order.cpp @@ -91,9 +91,9 @@ void store_sell(PlayerType *player_ptr, StoreSaleType store_num) } OBJECT_IDX item; - ItemEntity *o_ptr; - o_ptr = choose_object(player_ptr, &item, q, s_none, USE_EQUIP | USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT, FuncItemTester(store_will_buy, player_ptr, store_num)); - if (!o_ptr) { + const auto options = USE_EQUIP | USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT; + auto *o_ptr = choose_object(player_ptr, &item, q, s_none, options, FuncItemTester(store_will_buy, player_ptr, store_num)); + if (o_ptr == nullptr) { return; } @@ -147,7 +147,8 @@ void store_sell(PlayerType *player_ptr, StoreSaleType store_num) chg_virtue(player_ptr, V_JUSTICE, -1); } - if ((o_ptr->tval == ItemKindType::BOTTLE) && (store_num != StoreSaleType::HOME)) { + const auto tval = o_ptr->bi_key.tval(); + if ((tval == ItemKindType::BOTTLE) && (store_num != StoreSaleType::HOME)) { chg_virtue(player_ptr, V_NATURE, 1); } @@ -173,7 +174,7 @@ void store_sell(PlayerType *player_ptr, StoreSaleType store_num) exe_write_diary(player_ptr, DIARY_SELL, 0, o_name); } - if (!((o_ptr->tval == ItemKindType::FIGURINE) && (value > 0))) { + if (!((tval == ItemKindType::FIGURINE) && (value > 0))) { purchase_analyze(player_ptr, price, value, dummy); } diff --git a/src/store/service-checker.cpp b/src/store/service-checker.cpp index 167c60ccf7..9048965ff0 100644 --- a/src/store/service-checker.cpp +++ b/src/store/service-checker.cpp @@ -18,22 +18,23 @@ /*! * @brief オブジェクトが祝福されているかの判定を返す / - * @param o_ptr 判定したいオブジェクト構造体の参照ポインタ + * @param item_ptr 判定したいオブジェクト構造体の参照ポインタ * @return アイテムが祝福されたアイテムならばTRUEを返す */ -static bool is_blessed_item(const ItemEntity *o_ptr) +static bool is_blessed_item(const ItemEntity *item_ptr) { - auto flgs = object_flags(o_ptr); + auto flgs = object_flags(item_ptr); return flgs.has(TR_BLESSED); } -static bool check_store_general(const ItemEntity *o_ptr) +static bool check_store_general(const ItemEntity &item) { - switch (o_ptr->tval) { + const auto &bi_key = item.bi_key; + switch (bi_key.tval()) { case ItemKindType::ROD: - return (o_ptr->sval == SV_ROD_PESTICIDE); + return (bi_key.sval() == SV_ROD_PESTICIDE); case ItemKindType::POTION: - return (o_ptr->sval == SV_POTION_WATER); + return (bi_key.sval() == SV_POTION_WATER); case ItemKindType::WHISTLE: case ItemKindType::FOOD: case ItemKindType::LITE: @@ -55,9 +56,9 @@ static bool check_store_general(const ItemEntity *o_ptr) } } -static bool check_store_armoury(const ItemEntity *o_ptr) +static bool check_store_armoury(const ItemEntity &item) { - switch (o_ptr->tval) { + switch (item.bi_key.tval()) { case ItemKindType::BOOTS: case ItemKindType::GLOVES: case ItemKindType::CROWN: @@ -73,9 +74,9 @@ static bool check_store_armoury(const ItemEntity *o_ptr) } } -static bool check_store_weapon(const ItemEntity *o_ptr) +static bool check_store_weapon(const ItemEntity &item) { - switch (o_ptr->tval) { + switch (item.bi_key.tval()) { case ItemKindType::SHOT: case ItemKindType::BOLT: case ItemKindType::ARROW: @@ -86,15 +87,15 @@ static bool check_store_weapon(const ItemEntity *o_ptr) case ItemKindType::HISSATSU_BOOK: return true; case ItemKindType::HAFTED: - return o_ptr->sval != SV_WIZSTAFF; + return item.bi_key.sval() != SV_WIZSTAFF; default: return false; } } -static bool check_store_temple(const ItemEntity *o_ptr) +static bool check_store_temple(const ItemEntity &item) { - switch (o_ptr->tval) { + switch (item.bi_key.tval()) { case ItemKindType::LIFE_BOOK: case ItemKindType::CRUSADE_BOOK: case ItemKindType::SCROLL: @@ -103,7 +104,7 @@ static bool check_store_temple(const ItemEntity *o_ptr) return true; case ItemKindType::FIGURINE: case ItemKindType::STATUE: { - auto *r_ptr = &monraces_info[i2enum(o_ptr->pval)]; + auto *r_ptr = &monraces_info[i2enum(item.pval)]; if (r_ptr->kind_flags.has_not(MonsterKindType::EVIL)) { if ((r_ptr->kind_flags.has(MonsterKindType::GOOD)) || (r_ptr->kind_flags.has(MonsterKindType::ANIMAL)) || (angband_strchr("?!", r_ptr->d_char) != nullptr)) { return true; @@ -113,7 +114,7 @@ static bool check_store_temple(const ItemEntity *o_ptr) [[fallthrough]]; case ItemKindType::POLEARM: case ItemKindType::SWORD: - if (is_blessed_item(o_ptr)) { + if (is_blessed_item(&item)) { return true; } @@ -123,9 +124,9 @@ static bool check_store_temple(const ItemEntity *o_ptr) } } -static bool check_store_alchemist(const ItemEntity *o_ptr) +static bool check_store_alchemist(const ItemEntity &item) { - switch (o_ptr->tval) { + switch (item.bi_key.tval()) { case ItemKindType::SCROLL: case ItemKindType::POTION: return true; @@ -134,9 +135,9 @@ static bool check_store_alchemist(const ItemEntity *o_ptr) } } -static bool check_store_magic(const ItemEntity *o_ptr) +static bool check_store_magic(const ItemEntity &item) { - switch (o_ptr->tval) { + switch (item.bi_key.tval()) { case ItemKindType::SORCERY_BOOK: case ItemKindType::NATURE_BOOK: case ItemKindType::CHAOS_BOOK: @@ -157,15 +158,15 @@ static bool check_store_magic(const ItemEntity *o_ptr) case ItemKindType::FIGURINE: return true; case ItemKindType::HAFTED: - return o_ptr->sval == SV_WIZSTAFF; + return item.bi_key.sval() == SV_WIZSTAFF; default: return false; } } -static bool check_store_book(const ItemEntity *o_ptr) +static bool check_store_book(const ItemEntity &item) { - switch (o_ptr->tval) { + switch (item.bi_key.tval()) { case ItemKindType::SORCERY_BOOK: case ItemKindType::NATURE_BOOK: case ItemKindType::CHAOS_BOOK: @@ -184,23 +185,23 @@ static bool check_store_book(const ItemEntity *o_ptr) } } -static bool switch_store_check(const ItemEntity *o_ptr, StoreSaleType store_num) +static bool switch_store_check(const ItemEntity &item, StoreSaleType store_num) { switch (store_num) { case StoreSaleType::GENERAL: - return check_store_general(o_ptr); + return check_store_general(item); case StoreSaleType::ARMOURY: - return check_store_armoury(o_ptr); + return check_store_armoury(item); case StoreSaleType::WEAPON: - return check_store_weapon(o_ptr); + return check_store_weapon(item); case StoreSaleType::TEMPLE: - return check_store_temple(o_ptr); + return check_store_temple(item); case StoreSaleType::ALCHEMIST: - return check_store_alchemist(o_ptr); + return check_store_alchemist(item); case StoreSaleType::MAGIC: - return check_store_magic(o_ptr); + return check_store_magic(item); case StoreSaleType::BOOK: - return check_store_book(o_ptr); + return check_store_book(item); default: return true; } @@ -221,7 +222,7 @@ bool store_will_buy(PlayerType *, const ItemEntity *o_ptr, StoreSaleType store_n return true; } - if (!switch_store_check(o_ptr, store_num)) { + if (!switch_store_check(*o_ptr, store_num)) { return false; } @@ -246,7 +247,7 @@ static int mass_lite_produce(const PRICE cost) return size; } -static int mass_scroll_produce(ItemEntity *o_ptr, const PRICE cost) +static int mass_scroll_produce(const ItemEntity &item, const PRICE cost) { int size = 1; if (cost <= 60L) { @@ -257,11 +258,12 @@ static int mass_scroll_produce(ItemEntity *o_ptr, const PRICE cost) size += damroll(1, 5); } - if (o_ptr->sval == SV_SCROLL_STAR_IDENTIFY) { + const auto sval = item.bi_key.sval(); + if (sval == SV_SCROLL_STAR_IDENTIFY) { size += damroll(3, 5); } - if (o_ptr->sval == SV_SCROLL_STAR_REMOVE_CURSE) { + if (sval == SV_SCROLL_STAR_REMOVE_CURSE) { size += damroll(1, 4); } @@ -282,10 +284,10 @@ static int mass_book_produce(const PRICE cost) return size; } -static int mass_equipment_produce(ItemEntity *o_ptr, const PRICE cost) +static int mass_equipment_produce(const ItemEntity &item, const PRICE cost) { int size = 1; - if (o_ptr->is_artifact() || o_ptr->is_ego()) { + if (item.is_artifact() || item.is_ego()) { return size; } @@ -348,16 +350,16 @@ static int mass_magic_produce(const PRICE cost, StoreSaleType store_num) return size; } -static int switch_mass_production(ItemEntity *o_ptr, const PRICE cost, StoreSaleType store_num) +static int switch_mass_production(const ItemEntity &item, const PRICE cost, StoreSaleType store_num) { - switch (o_ptr->tval) { + switch (item.bi_key.tval()) { case ItemKindType::FOOD: case ItemKindType::FLASK: case ItemKindType::LITE: return mass_lite_produce(cost); case ItemKindType::POTION: case ItemKindType::SCROLL: - return mass_scroll_produce(o_ptr, cost); + return mass_scroll_produce(item, cost); case ItemKindType::LIFE_BOOK: case ItemKindType::SORCERY_BOOK: case ItemKindType::NATURE_BOOK: @@ -385,7 +387,7 @@ static int switch_mass_production(ItemEntity *o_ptr, const PRICE cost, StoreSale case ItemKindType::HAFTED: case ItemKindType::DIGGING: case ItemKindType::BOW: - return mass_equipment_produce(o_ptr, cost); + return mass_equipment_produce(item, cost); case ItemKindType::SPIKE: case ItemKindType::SHOT: case ItemKindType::ARROW: @@ -440,10 +442,10 @@ static byte decide_discount_rate(const PRICE cost) * Some objects can be sold at a "discount" (in small piles) * */ -void mass_produce(PlayerType *, ItemEntity *o_ptr, StoreSaleType store_num) +void mass_produce(ItemEntity *o_ptr, StoreSaleType store_num) { const auto cost = o_ptr->get_price(); - int size = switch_mass_production(o_ptr, cost, store_num); + int size = switch_mass_production(*o_ptr, cost, store_num); auto discount = decide_discount_rate(cost); if (o_ptr->art_name) { discount = 0; diff --git a/src/store/service-checker.h b/src/store/service-checker.h index cc9167186e..80ac86849e 100644 --- a/src/store/service-checker.h +++ b/src/store/service-checker.h @@ -4,4 +4,4 @@ enum class StoreSaleType; class ItemEntity; class PlayerType; bool store_will_buy(PlayerType *, const ItemEntity *o_ptr, StoreSaleType store_num); -void mass_produce(PlayerType *, ItemEntity *o_ptr, StoreSaleType store_num); +void mass_produce(ItemEntity *o_ptr, StoreSaleType store_num); diff --git a/src/store/store-util.cpp b/src/store/store-util.cpp index d4828dbade..d36b78bf08 100644 --- a/src/store/store-util.cpp +++ b/src/store/store-util.cpp @@ -176,15 +176,16 @@ bool store_object_similar(ItemEntity *o_ptr, ItemEntity *j_ptr) return false; } - if (o_ptr->tval == ItemKindType::CHEST) { + const auto tval = o_ptr->bi_key.tval(); + if (tval == ItemKindType::CHEST) { return false; } - if (o_ptr->tval == ItemKindType::STATUE) { + if (tval == ItemKindType::STATUE) { return false; } - if (o_ptr->tval == ItemKindType::CAPTURE) { + if (tval == ItemKindType::CAPTURE) { return false; } @@ -208,7 +209,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->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 / baseitems_info[o_ptr->bi_id].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; @@ -254,22 +255,29 @@ int store_carry(ItemEntity *o_ptr) return -1; } + const auto o_tval = o_ptr->bi_key.tval(); + const auto o_sval = o_ptr->bi_key.sval(); for (slot = 0; slot < st_ptr->stock_num; slot++) { - ItemEntity *j_ptr; - j_ptr = &st_ptr->stock[slot]; - if (o_ptr->tval > j_ptr->tval) { + const auto *j_ptr = &st_ptr->stock[slot]; + const auto j_tval = j_ptr->bi_key.tval(); + const auto j_sval = j_ptr->bi_key.sval(); + if (o_tval > j_tval) { break; } - if (o_ptr->tval < j_ptr->tval) { + + if (o_tval < j_tval) { continue; } - if (o_ptr->sval < j_ptr->sval) { + + if (o_sval < j_sval) { break; } - if (o_ptr->sval > j_ptr->sval) { + + if (o_sval > j_sval) { continue; } - if (o_ptr->tval == ItemKindType::ROD) { + + if (o_tval == ItemKindType::ROD) { if (o_ptr->pval < j_ptr->pval) { break; } @@ -282,6 +290,7 @@ int store_carry(ItemEntity *o_ptr) if (value > j_value) { break; } + if (value < j_value) { continue; } diff --git a/src/store/store.cpp b/src/store/store.cpp index effdbd63ce..d221d83261 100644 --- a/src/store/store.cpp +++ b/src/store/store.cpp @@ -355,19 +355,21 @@ static void store_create(PlayerType *player_ptr, short fix_k_idx, StoreSaleType q_ptr->pval = pval; } - if (q_ptr->tval == ItemKindType::LITE) { - if (q_ptr->sval == SV_LITE_TORCH) { + const auto tval = q_ptr->bi_key.tval(); + const auto sval = q_ptr->bi_key.sval(); + if (tval == ItemKindType::LITE) { + if (sval == SV_LITE_TORCH) { q_ptr->fuel = FUEL_TORCH / 2; } - if (q_ptr->sval == SV_LITE_LANTERN) { + if (sval == SV_LITE_LANTERN) { q_ptr->fuel = FUEL_LAMP / 2; } } object_known(q_ptr); q_ptr->ident |= IDENT_STORE; - if (q_ptr->tval == ItemKindType::CHEST) { + if (tval == ItemKindType::CHEST) { continue; } @@ -381,7 +383,7 @@ static void store_create(PlayerType *player_ptr, short fix_k_idx, StoreSaleType } } - mass_produce(player_ptr, q_ptr, store_num); + mass_produce(q_ptr, store_num); (void)store_carry(q_ptr); break; } diff --git a/src/system/item-entity.cpp b/src/system/item-entity.cpp index 6ad74382c1..ce50d89e60 100644 --- a/src/system/item-entity.cpp +++ b/src/system/item-entity.cpp @@ -27,7 +27,8 @@ #include "util/string-processor.h" ItemEntity::ItemEntity() - : fixed_artifact_idx(FixedArtifactId::NONE) + : bi_key(BaseitemKey(ItemKindType::NONE)) + , fixed_artifact_idx(FixedArtifactId::NONE) { } @@ -62,8 +63,7 @@ void ItemEntity::prep(short new_bi_id) this->wipe(); this->stack_idx = old_stack_idx; this->bi_id = new_bi_id; - this->tval = baseitem.bi_key.tval(); - this->sval = baseitem.bi_key.sval().value(); + this->bi_key = baseitem.bi_key; this->pval = baseitem.pval; this->number = 1; this->weight = baseitem.weight; @@ -113,7 +113,7 @@ void ItemEntity::prep(short new_bi_id) */ bool ItemEntity::is_weapon() const { - return BaseitemKey(this->tval).is_weapon(); + return this->bi_key.is_weapon(); } /*! @@ -140,7 +140,7 @@ bool ItemEntity::is_weapon_armour_ammo() const */ bool ItemEntity::is_melee_weapon() const { - return BaseitemKey(this->tval).is_melee_weapon(); + return this->bi_key.is_melee_weapon(); } /*! @@ -149,7 +149,7 @@ bool ItemEntity::is_melee_weapon() const */ bool ItemEntity::is_melee_ammo() const { - return BaseitemKey(this->tval, this->sval).is_melee_ammo(); + return this->bi_key.is_melee_ammo(); } /*! @@ -158,7 +158,7 @@ bool ItemEntity::is_melee_ammo() const */ bool ItemEntity::is_wearable() const { - return BaseitemKey(this->tval).is_wearable(); + return this->bi_key.is_wearable(); } /*! @@ -167,7 +167,7 @@ bool ItemEntity::is_wearable() const */ bool ItemEntity::is_equipment() const { - return BaseitemKey(this->tval).is_equipement(); + return this->bi_key.is_equipement(); } /*! @@ -176,7 +176,7 @@ bool ItemEntity::is_equipment() const */ bool ItemEntity::is_orthodox_melee_weapons() const { - return BaseitemKey(this->tval, this->sval).is_orthodox_melee_weapon(); + return this->bi_key.is_orthodox_melee_weapon(); } /*! @@ -185,7 +185,7 @@ bool ItemEntity::is_orthodox_melee_weapons() const */ bool ItemEntity::is_broken_weapon() const { - return BaseitemKey(this->tval, this->sval).is_broken_weapon(); + return this->bi_key.is_broken_weapon(); } /*! @@ -194,7 +194,7 @@ bool ItemEntity::is_broken_weapon() const */ bool ItemEntity::is_throwable() const { - return BaseitemKey(this->tval).is_throwable(); + return this->bi_key.is_throwable(); } /*! @@ -203,7 +203,7 @@ bool ItemEntity::is_throwable() const */ bool ItemEntity::is_wieldable_in_etheir_hand() const { - return BaseitemKey(this->tval).is_wieldable_in_etheir_hand(); + return this->bi_key.is_wieldable_in_etheir_hand(); } /*! @@ -212,7 +212,7 @@ bool ItemEntity::is_wieldable_in_etheir_hand() const */ bool ItemEntity::refuse_enchant_weapon() const { - return BaseitemKey(this->tval, this->sval) == BaseitemKey(ItemKindType::SWORD, SV_POISON_NEEDLE); + return this->bi_key == BaseitemKey(ItemKindType::SWORD, SV_POISON_NEEDLE); } /*! @@ -242,7 +242,7 @@ bool ItemEntity::allow_enchant_melee_weapon() const */ bool ItemEntity::allow_two_hands_wielding() const { - return this->is_melee_weapon() && ((this->weight > 99) || (this->tval == ItemKindType::POLEARM)); + return this->is_melee_weapon() && ((this->weight > 99) || (this->bi_key.tval() == ItemKindType::POLEARM)); } /*! @@ -251,7 +251,7 @@ bool ItemEntity::allow_two_hands_wielding() const */ bool ItemEntity::is_ammo() const { - return BaseitemKey(this->tval).is_ammo(); + return this->bi_key.is_ammo(); } /*! @@ -261,16 +261,16 @@ bool ItemEntity::is_ammo() const */ bool ItemEntity::is_convertible() const { - auto is_convertible = (this->tval == ItemKindType::JUNK) || (this->tval == ItemKindType::SKELETON); - is_convertible |= BaseitemKey(this->tval, this->sval) == BaseitemKey(ItemKindType::CORPSE, SV_SKELETON); + const auto tval = this->bi_key.tval(); + auto is_convertible = (tval == ItemKindType::JUNK) || (tval == ItemKindType::SKELETON); + is_convertible |= this->bi_key == BaseitemKey(ItemKindType::CORPSE, SV_SKELETON); return is_convertible; } bool ItemEntity::is_lance() const { - const BaseitemKey bi_key(this->tval, this->sval); - auto is_lance = bi_key == BaseitemKey(ItemKindType::POLEARM, SV_LANCE); - is_lance |= bi_key == BaseitemKey(ItemKindType::POLEARM, SV_HEAVY_LANCE); + auto is_lance = this->bi_key == BaseitemKey(ItemKindType::POLEARM, SV_LANCE); + is_lance |= this->bi_key == BaseitemKey(ItemKindType::POLEARM, SV_HEAVY_LANCE); return is_lance; } @@ -280,7 +280,7 @@ bool ItemEntity::is_lance() const */ bool ItemEntity::is_protector() const { - return BaseitemKey(this->tval).is_protector(); + return this->bi_key.is_protector(); } /*! @@ -289,7 +289,7 @@ bool ItemEntity::is_protector() const */ bool ItemEntity::can_be_aura_protector() const { - return BaseitemKey(this->tval).can_be_aura_protector(); + return this->bi_key.can_be_aura_protector(); } /*! @@ -299,7 +299,7 @@ bool ItemEntity::can_be_aura_protector() const */ bool ItemEntity::is_rare() const { - return BaseitemKey(this->tval, this->sval).is_rare(); + return this->bi_key.is_rare(); } /*! @@ -420,7 +420,7 @@ bool ItemEntity::is_tried() const */ bool ItemEntity::is_potion() const { - return this->tval == ItemKindType::POTION; + return this->bi_key.tval() == ItemKindType::POTION; } /*! @@ -430,8 +430,9 @@ bool ItemEntity::is_potion() const */ bool ItemEntity::is_readable() const { - auto can_read = this->tval == ItemKindType::SCROLL; - can_read |= this->tval == ItemKindType::PARCHMENT; + const auto tval = this->bi_key.tval(); + auto can_read = tval == ItemKindType::SCROLL; + can_read |= tval == ItemKindType::PARCHMENT; can_read |= this->is_specific_artifact(FixedArtifactId::GHB); can_read |= this->is_specific_artifact(FixedArtifactId::POWER); return can_read; @@ -444,7 +445,8 @@ bool ItemEntity::is_readable() const */ bool ItemEntity::can_refill_lantern() const { - return (this->tval == ItemKindType::FLASK) || (BaseitemKey(this->tval, this->sval) == BaseitemKey(ItemKindType::LITE, SV_LITE_LANTERN)); + const auto tval = this->bi_key.tval(); + return (tval == ItemKindType::FLASK) || (this->bi_key == BaseitemKey(ItemKindType::LITE, SV_LITE_LANTERN)); } /*! @@ -454,7 +456,7 @@ bool ItemEntity::can_refill_lantern() const */ bool ItemEntity::can_refill_torch() const { - return BaseitemKey(this->tval, this->sval) == BaseitemKey(ItemKindType::LITE, SV_LITE_TORCH); + return this->bi_key == BaseitemKey(ItemKindType::LITE, SV_LITE_TORCH); } /*! @@ -463,7 +465,7 @@ bool ItemEntity::can_refill_torch() const */ bool ItemEntity::can_recharge() const { - return BaseitemKey(this->tval).can_recharge(); + return this->bi_key.can_recharge(); } /*! @@ -472,7 +474,7 @@ bool ItemEntity::can_recharge() const */ bool ItemEntity::is_offerable() const { - if (BaseitemKey(this->tval, this->sval) != BaseitemKey(ItemKindType::CORPSE, SV_CORPSE)) { + if (this->bi_key != BaseitemKey(ItemKindType::CORPSE, SV_CORPSE)) { return false; } @@ -500,10 +502,9 @@ bool ItemEntity::is_activatable() const */ bool ItemEntity::is_fuel() const { - const BaseitemKey bi_key(this->tval, this->sval); - auto is_fuel = bi_key == BaseitemKey(ItemKindType::LITE, SV_LITE_TORCH); - is_fuel |= bi_key == BaseitemKey(ItemKindType::LITE, SV_LITE_LANTERN); - is_fuel |= bi_key == BaseitemKey(ItemKindType::FLASK, SV_FLASK_OIL); + auto is_fuel = this->bi_key == BaseitemKey(ItemKindType::LITE, SV_LITE_TORCH); + is_fuel |= this->bi_key == BaseitemKey(ItemKindType::LITE, SV_LITE_LANTERN); + is_fuel |= this->bi_key == BaseitemKey(ItemKindType::FLASK, SV_FLASK_OIL); return is_fuel; } @@ -513,7 +514,7 @@ bool ItemEntity::is_fuel() const */ bool ItemEntity::is_spell_book() const { - return BaseitemKey(this->tval).is_spell_book(); + return this->bi_key.is_spell_book(); } /*! @@ -621,7 +622,7 @@ TERM_COLOR ItemEntity::get_color() const } auto has_attr = this->bi_id == 0; - has_attr |= BaseitemKey(this->tval, this->sval) != BaseitemKey(ItemKindType::CORPSE, SV_CORPSE); + has_attr |= this->bi_key != BaseitemKey(ItemKindType::CORPSE, SV_CORPSE); has_attr |= baseitem.x_attr != TERM_DARK; if (has_attr) { return baseitem.x_attr; @@ -682,7 +683,7 @@ int ItemEntity::get_baseitem_price() const return baseitems_info[this->bi_id].cost; } - switch (this->tval) { + switch (this->bi_key.tval()) { case ItemKindType::FOOD: return 5; case ItemKindType::POTION: @@ -746,40 +747,40 @@ bool ItemEntity::is_specific_artifact(FixedArtifactId id) const bool ItemEntity::has_unidentified_name() const { - return BaseitemKey(this->tval).has_unidentified_name(); + return this->bi_key.has_unidentified_name(); } ItemKindType ItemEntity::get_arrow_kind() const { - return BaseitemKey(this->tval, this->sval).get_arrow_kind(); + return this->bi_key.get_arrow_kind(); } bool ItemEntity::is_wand_rod() const { - return BaseitemKey(this->tval).is_wand_rod(); + return this->bi_key.is_wand_rod(); } bool ItemEntity::is_wand_staff() const { - return BaseitemKey(this->tval).is_wand_staff(); + return this->bi_key.is_wand_staff(); } short ItemEntity::get_bow_energy() const { - return BaseitemKey(this->tval, this->sval).get_bow_energy(); + return this->bi_key.get_bow_energy(); } int ItemEntity::get_arrow_magnification() const { - return BaseitemKey(this->tval, this->sval).get_arrow_magnification(); + return this->bi_key.get_arrow_magnification(); } bool ItemEntity::is_aiming_rod() const { - return BaseitemKey(this->tval, this->sval).is_aiming_rod(); + return this->bi_key.is_aiming_rod(); } bool ItemEntity::is_lite_requiring_fuel() const { - return BaseitemKey(this->tval, this->sval).is_lite_requiring_fuel(); + return this->bi_key.is_lite_requiring_fuel(); } diff --git a/src/system/item-entity.h b/src/system/item-entity.h index 7f24515b4a..1aa5493e15 100644 --- a/src/system/item-entity.h +++ b/src/system/item-entity.h @@ -12,6 +12,7 @@ #include "object-enchant/trc-types.h" #include "object/object-mark-types.h" #include "system/angband.h" +#include "system/baseitem-info.h" #include "system/system-variables.h" #include "util/flag-group.h" #include @@ -28,9 +29,7 @@ class ItemEntity { POSITION iy{}; /*!< Y-position on map, or zero */ POSITION ix{}; /*!< X-position on map, or zero */ IDX stack_idx{}; /*!< このアイテムを含むアイテムリスト内の位置(降順) */ - ItemKindType tval{}; /*!< Item type (from kind) */ - - OBJECT_SUBTYPE_VALUE sval{}; /*!< Item sub-type (from kind) */ + BaseitemKey bi_key; PARAMETER_VALUE pval{}; /*!< Item extra-parameter */ byte discount{}; /*!< ゲーム中の値引き率 (0~100) / Discount (if any) */ ITEM_NUMBER number{}; /*!< Number of items */ diff --git a/src/util/object-sort.cpp b/src/util/object-sort.cpp index e9055eb7d3..cc5c6c0621 100644 --- a/src/util/object-sort.cpp +++ b/src/util/object-sort.cpp @@ -45,8 +45,8 @@ bool object_sort_comp(PlayerType *player_ptr, ItemEntity *o_ptr, int32_t o_value return true; } - const auto o_tval = o_ptr->tval; - const auto j_tval = j_ptr->tval; + const auto o_tval = o_ptr->bi_key.tval(); + const auto j_tval = j_ptr->bi_key.tval(); if ((o_tval == get_realm1_book(player_ptr)) && (j_tval != get_realm1_book(player_ptr))) { return true; } @@ -79,8 +79,8 @@ bool object_sort_comp(PlayerType *player_ptr, ItemEntity *o_ptr, int32_t o_value return true; } - const auto o_sval = o_ptr->sval; - const auto j_sval = j_ptr->sval; + const auto o_sval = o_ptr->bi_key.sval(); + const auto j_sval = j_ptr->bi_key.sval(); if (o_sval < j_sval) { return true; } diff --git a/src/view/display-inventory.cpp b/src/view/display-inventory.cpp index 8f1c074a0a..c0eb9736b4 100644 --- a/src/view/display-inventory.cpp +++ b/src/view/display-inventory.cpp @@ -59,7 +59,7 @@ COMMAND_CODE show_inventory(PlayerType *player_ptr, int target_item, BIT_FLAGS m describe_flavor(player_ptr, o_name, o_ptr, 0); out_index[k] = i; - out_color[k] = tval_to_attr[enum2i(o_ptr->tval) % 128]; + out_color[k] = tval_to_attr[enum2i(o_ptr->bi_key.tval()) % 128]; if (o_ptr->timeout) { out_color[k] = TERM_L_DARK; } @@ -177,7 +177,7 @@ void display_inventory(PlayerType *player_ptr, const ItemTester &item_tester) term_putstr(0, i, cur_col, TERM_WHITE, tmp_val); describe_flavor(player_ptr, o_name, o_ptr, 0); n = strlen(o_name); - attr = tval_to_attr[enum2i(o_ptr->tval) % 128]; + attr = tval_to_attr[enum2i(o_ptr->bi_key.tval()) % 128]; if (o_ptr->timeout) { attr = TERM_L_DARK; } diff --git a/src/view/display-player-middle.cpp b/src/view/display-player-middle.cpp index ad6526e8ad..0a4769968a 100644 --- a/src/view/display-player-middle.cpp +++ b/src/view/display-player-middle.cpp @@ -107,10 +107,12 @@ static void display_hit_damage(PlayerType *player_ptr) show_todam += o_ptr->to_d; } - if ((o_ptr->sval == SV_LIGHT_XBOW) || (o_ptr->sval == SV_HEAVY_XBOW)) { - show_tohit += player_ptr->weapon_exp[o_ptr->tval][o_ptr->sval] / 400; + const auto tval = o_ptr->bi_key.tval(); + const auto sval = o_ptr->bi_key.sval().value(); + if ((sval == SV_LIGHT_XBOW) || (sval == SV_HEAVY_XBOW)) { + show_tohit += player_ptr->weapon_exp[tval][sval] / 400; } else { - show_tohit += (player_ptr->weapon_exp[o_ptr->tval][o_ptr->sval] - (PlayerSkill::weapon_exp_at(PlayerSkillRank::MASTER) / 2)) / 200; + show_tohit += (player_ptr->weapon_exp[tval][sval] - (PlayerSkill::weapon_exp_at(PlayerSkillRank::MASTER) / 2)) / 200; } show_tohit += player_ptr->skill_thb / BTH_PLUS_ADJ; diff --git a/src/view/display-store.cpp b/src/view/display-store.cpp index 51688aa1b1..b574462d8c 100644 --- a/src/view/display-store.cpp +++ b/src/view/display-store.cpp @@ -75,7 +75,7 @@ void display_entry(PlayerType *player_ptr, int pos, StoreSaleType store_num) GAME_TEXT o_name[MAX_NLEN]; describe_flavor(player_ptr, o_name, o_ptr, 0); o_name[maxwid] = '\0'; - c_put_str(tval_to_attr[enum2i(o_ptr->tval)], o_name, i + 6, cur_col); + c_put_str(tval_to_attr[enum2i(o_ptr->bi_key.tval())], o_name, i + 6, cur_col); if (show_weights) { WEIGHT wgt = o_ptr->weight; sprintf(out_val, _("%3d.%1d kg", "%3d.%d lb"), _(lb_to_kg_integer(wgt), wgt / 10), _(lb_to_kg_fraction(wgt), wgt % 10)); @@ -93,7 +93,7 @@ void display_entry(PlayerType *player_ptr, int pos, StoreSaleType store_num) GAME_TEXT o_name[MAX_NLEN]; describe_flavor(player_ptr, o_name, o_ptr, 0); o_name[maxwid] = '\0'; - c_put_str(tval_to_attr[enum2i(o_ptr->tval)], o_name, i + 6, cur_col); + c_put_str(tval_to_attr[enum2i(o_ptr->bi_key.tval())], o_name, i + 6, cur_col); if (show_weights) { int wgt = o_ptr->weight; diff --git a/src/view/object-describer.cpp b/src/view/object-describer.cpp index eb221ee8d7..17688338b2 100644 --- a/src/view/object-describer.cpp +++ b/src/view/object-describer.cpp @@ -70,11 +70,6 @@ void inven_item_describe(PlayerType *player_ptr, short item) */ void display_koff(PlayerType *player_ptr, short bi_id) { - ItemEntity forge; - ItemEntity *q_ptr; - int sval; - int16_t use_realm; - GAME_TEXT o_name[MAX_NLEN]; for (int y = 0; y < game_term->hgt; y++) { term_erase(0, y, 255); } @@ -82,14 +77,15 @@ void display_koff(PlayerType *player_ptr, short bi_id) if (!bi_id) { return; } - q_ptr = &forge; - q_ptr->prep(bi_id); - describe_flavor(player_ptr, o_name, q_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY | OD_STORE)); + ItemEntity item; + item.prep(bi_id); + GAME_TEXT o_name[MAX_NLEN]; + describe_flavor(player_ptr, o_name, &item, (OD_OMIT_PREFIX | OD_NAME_ONLY | OD_STORE)); term_putstr(0, 0, -1, TERM_WHITE, o_name); - sval = q_ptr->sval; - use_realm = tval2realm(q_ptr->tval); + const auto sval = item.bi_key.sval().value(); + const short use_realm = tval2realm(item.bi_key.tval()); if (player_ptr->realm1 || player_ptr->realm2) { if ((use_realm != player_ptr->realm1) && (use_realm != player_ptr->realm2)) { @@ -108,9 +104,8 @@ void display_koff(PlayerType *player_ptr, short bi_id) } } - int num = 0; - SPELL_IDX spells[64]; - + auto num = 0; + int spells[64]{}; for (int spell = 0; spell < 32; spell++) { if (fake_spell_flags[sval] & (1UL << spell)) { spells[num++] = spell; diff --git a/src/view/status-first-page.cpp b/src/view/status-first-page.cpp index b9df4e1d55..fcbc732057 100644 --- a/src/view/status-first-page.cpp +++ b/src/view/status-first-page.cpp @@ -101,7 +101,7 @@ static bool calc_weapon_damage_limit(PlayerType *player_ptr, int hand, int *dama } damage[hand] += *basedam; - if ((o_ptr->tval == ItemKindType::SWORD) && (o_ptr->sval == SV_POISON_NEEDLE)) { + if (o_ptr->bi_key == BaseitemKey(ItemKindType::SWORD, SV_POISON_NEEDLE)) { damage[hand] = 1; } if (damage[hand] < 0) { @@ -127,7 +127,7 @@ static bool calc_weapon_one_hand(ItemEntity *o_ptr, int hand, int *damage, int * *basedam = 0; damage[hand] += *basedam; - if ((o_ptr->tval == ItemKindType::SWORD) && (o_ptr->sval == SV_POISON_NEEDLE)) { + if (o_ptr->bi_key == BaseitemKey(ItemKindType::SWORD, SV_POISON_NEEDLE)) { damage[hand] = 1; } @@ -288,10 +288,11 @@ static void calc_two_hands(PlayerType *player_ptr, int *damage, int *to_h) } to_h[i] = 0; - bool poison_needle = false; - if ((o_ptr->tval == ItemKindType::SWORD) && (o_ptr->sval == SV_POISON_NEEDLE)) { + auto poison_needle = false; + if (o_ptr->bi_key == BaseitemKey(ItemKindType::SWORD, SV_POISON_NEEDLE)) { poison_needle = true; } + if (o_ptr->is_known()) { damage[i] += o_ptr->to_d * 100; to_h[i] += o_ptr->to_h; @@ -304,7 +305,7 @@ static void calc_two_hands(PlayerType *player_ptr, int *damage, int *to_h) basedam = calc_expect_crit(player_ptr, o_ptr->weight, to_h[i], basedam, player_ptr->dis_to_h[i], poison_needle, impact); basedam = strengthen_basedam(player_ptr, o_ptr, basedam, flgs); damage[i] += basedam; - if ((o_ptr->tval == ItemKindType::SWORD) && (o_ptr->sval == SV_POISON_NEEDLE)) { + if (o_ptr->bi_key == BaseitemKey(ItemKindType::SWORD, SV_POISON_NEEDLE)) { damage[i] = 1; } if (damage[i] < 0) { diff --git a/src/window/display-sub-windows.cpp b/src/window/display-sub-windows.cpp index 0e98cac917..c64eb5f267 100644 --- a/src/window/display-sub-windows.cpp +++ b/src/window/display-sub-windows.cpp @@ -275,7 +275,7 @@ static void display_equipment(PlayerType *player_ptr, const ItemTester &item_tes attr = TERM_WHITE; } else { describe_flavor(player_ptr, o_name, o_ptr, 0); - attr = tval_to_attr[enum2i(o_ptr->tval) % 128]; + attr = tval_to_attr[enum2i(o_ptr->bi_key.tval()) % 128]; } int n = strlen(o_name); @@ -617,10 +617,9 @@ static void display_floor_item_list(PlayerType *player_ptr, const int y, const i // (y,x) のアイテムを1行に1個ずつ書く。 TERM_LEN term_y = 1; for (const auto o_idx : g_ptr->o_idx_list) { - ItemEntity *const o_ptr = &floor_ptr->o_list[o_idx]; - - // 未発見アイテムおよび金は対象外。 - if (o_ptr->marked.has_not(OmType::FOUND) || o_ptr->tval == ItemKindType::GOLD) { + auto *const o_ptr = &floor_ptr->o_list[o_idx]; + const auto tval = o_ptr->bi_key.tval(); + if (o_ptr->marked.has_not(OmType::FOUND) || tval == ItemKindType::GOLD) { continue; } @@ -636,7 +635,7 @@ static void display_floor_item_list(PlayerType *player_ptr, const int y, const i term_addstr(-1, TERM_WHITE, _("何か奇妙な物", "something strange")); } else { describe_flavor(player_ptr, line, o_ptr, 0); - TERM_COLOR attr = tval_to_attr[enum2i(o_ptr->tval) % 128]; + TERM_COLOR attr = tval_to_attr[enum2i(tval) % 128]; term_addstr(-1, attr, line); } @@ -695,7 +694,7 @@ static void display_found_item_list(PlayerType *player_ptr) std::vector found_item_list; for (auto &item : floor_ptr->o_list) { auto item_entity_ptr = &item; - if (item_entity_ptr->bi_id > 0 && item_entity_ptr->marked.has(OmType::FOUND) && item_entity_ptr->tval != ItemKindType::GOLD) { + if (item_entity_ptr->bi_id > 0 && item_entity_ptr->marked.has(OmType::FOUND) && item_entity_ptr->bi_key.tval() != ItemKindType::GOLD) { found_item_list.push_back(item_entity_ptr); } } @@ -732,7 +731,7 @@ static void display_found_item_list(PlayerType *player_ptr) char temp[512]; describe_flavor(player_ptr, temp, item, 0); const std::string item_description(temp); - const auto color_code_for_item = tval_to_attr[enum2i(item->tval) % 128]; + const auto color_code_for_item = tval_to_attr[enum2i(item->bi_key.tval()) % 128]; term_addstr(-1, color_code_for_item, item_description.data()); // アイテム座標表示 diff --git a/src/window/main-window-equipments.cpp b/src/window/main-window-equipments.cpp index 0d1a8a3fc8..fc7fd91d76 100644 --- a/src/window/main-window-equipments.cpp +++ b/src/window/main-window-equipments.cpp @@ -52,7 +52,7 @@ COMMAND_CODE show_equipment(PlayerType *player_ptr, int target_item, BIT_FLAGS m out_color[k] = TERM_WHITE; } else { (void)strcpy(out_desc[k], o_name); - out_color[k] = tval_to_attr[enum2i(o_ptr->tval) % 128]; + out_color[k] = tval_to_attr[enum2i(o_ptr->bi_key.tval()) % 128]; } out_index[k] = i; diff --git a/src/window/main-window-util.cpp b/src/window/main-window-util.cpp index 306b433a29..ec3ec09be5 100644 --- a/src/window/main-window-util.cpp +++ b/src/window/main-window-util.cpp @@ -122,7 +122,7 @@ static void display_shortened_item_name(PlayerType *player_ptr, ItemEntity *o_pt { char buf[MAX_NLEN]; describe_flavor(player_ptr, buf, o_ptr, (OD_NO_FLAVOR | OD_OMIT_PREFIX | OD_NAME_ONLY)); - TERM_COLOR attr = tval_to_attr[enum2i(o_ptr->tval) % 128]; + auto attr = tval_to_attr[enum2i(o_ptr->bi_key.tval()) % 128]; if (player_ptr->effects()->hallucination()->is_hallucinated()) { attr = TERM_WHITE; diff --git a/src/wizard/items-spoiler.cpp b/src/wizard/items-spoiler.cpp index ea06756d94..b7bb1827c6 100644 --- a/src/wizard/items-spoiler.cpp +++ b/src/wizard/items-spoiler.cpp @@ -45,7 +45,7 @@ static void kind_info(PlayerType *player_ptr, char *buf, char *dam, char *wgt, c describe_flavor(player_ptr, buf, q_ptr, OD_NAME_ONLY | OD_STORE); strcpy(dam, ""); - switch (q_ptr->tval) { + switch (q_ptr->bi_key.tval()) { case ItemKindType::SHOT: case ItemKindType::BOLT: case ItemKindType::ARROW: diff --git a/src/wizard/wizard-item-modifier.cpp b/src/wizard/wizard-item-modifier.cpp index 25685a892e..9d18920437 100644 --- a/src/wizard/wizard-item-modifier.cpp +++ b/src/wizard/wizard-item-modifier.cpp @@ -245,7 +245,7 @@ void wiz_identify_full_inventory(PlayerType *player_ptr) * @param row 表示列 * @param col 表示行 */ -static void prt_alloc(ItemKindType tval, OBJECT_SUBTYPE_VALUE sval, TERM_LEN row, TERM_LEN col) +static void prt_alloc(const BaseitemKey &bi_key, TERM_LEN row, TERM_LEN col) { uint32_t rarity[BASEITEM_MAX_DEPTH]{}; uint32_t total[BASEITEM_MAX_DEPTH]{}; @@ -267,7 +267,6 @@ static void prt_alloc(ItemKindType tval, OBJECT_SUBTYPE_VALUE sval, TERM_LEN row total[i] += prob / magnificant; total_frac += prob % magnificant; - BaseitemKey bi_key(tval, sval); if (baseitem.bi_key == bi_key) { home = baseitem.level; rarity[i] += prob / magnificant; @@ -338,13 +337,15 @@ static void wiz_display_item(PlayerType *player_ptr, ItemEntity *o_ptr) prt("", i, j - 2); } - prt_alloc(o_ptr->tval, o_ptr->sval, 1, 0); + prt_alloc(o_ptr->bi_key, 1, 0); char buf[256]; describe_flavor(player_ptr, buf, o_ptr, OD_STORE); prt(buf, 2, j); auto line = 4; - prt(format("kind = %-5d level = %-4d tval = %-5d sval = %-5d", o_ptr->bi_id, baseitems_info[o_ptr->bi_id].level, o_ptr->tval, o_ptr->sval), line, j); + const auto &bi_key = o_ptr->bi_key; + const auto item_level = baseitems_info[o_ptr->bi_id].level; + prt(format("kind = %-5d level = %-4d tval = %-5d sval = %-5d", o_ptr->bi_id, item_level, 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); prt(format("fixed_artifact_idx = %-4d ego_idx = %-4d cost = %ld", o_ptr->fixed_artifact_idx, o_ptr->ego_idx, object_value_real(o_ptr)), ++line, j); @@ -463,7 +464,7 @@ static void wiz_statistics(PlayerType *player_ptr, ItemEntity *o_ptr) artifacts_info.at(q_ptr->fixed_artifact_idx).is_generated = false; } - if ((o_ptr->tval != q_ptr->tval) || (o_ptr->sval != q_ptr->sval)) { + if (o_ptr->bi_key != q_ptr->bi_key) { continue; } @@ -656,7 +657,7 @@ static void wiz_quantity_item(ItemEntity *o_ptr) o_ptr->number = (byte)tmp_int; } - if (o_ptr->tval == ItemKindType::ROD) { + if (o_ptr->bi_key.tval() == ItemKindType::ROD) { o_ptr->pval = o_ptr->pval * o_ptr->number / tmp_qnt; } } @@ -741,7 +742,7 @@ static int is_slot_able_to_be_ego(PlayerType *player_ptr, ItemEntity *o_ptr) return slot; } - if ((o_ptr->tval == ItemKindType::SHOT) || (o_ptr->tval == ItemKindType::ARROW) || (o_ptr->tval == ItemKindType::BOLT)) { + if (o_ptr->is_ammo()) { return INVEN_AMMO; }