static bool object_easy_know(int i)
{
auto *k_ptr = &baseitems_info[i];
- switch (k_ptr->tval) {
+ switch (k_ptr->bi_key.tval()) {
case ItemKindType::LIFE_BOOK:
case ItemKindType::SORCERY_BOOK:
case ItemKindType::NATURE_BOOK:
{
std::vector<std::reference_wrapper<IDX>> flavor_idx_ref_list;
for (const auto &k_ref : baseitems_info) {
- if (k_ref.tval != tval) {
+ if (k_ref.bi_key.tval() != tval) {
continue;
}
#include "system/baseitem-info-definition.h"
#include "term/gameterm.h"
#include "util/bit-flags-calculator.h"
+#include "util/enum-converter.h"
#include "util/string-processor.h"
#include "view/display-messages.h"
return PARSE_ERROR_TOO_FEW_ARGUMENTS;
}
- info_set_value(k_ptr->tval, tokens[1]);
- info_set_value(k_ptr->sval, tokens[2]);
+ constexpr auto base = 10;
+ const auto tval = i2enum<ItemKindType>(std::stoi(tokens[1], nullptr, base));
+ const auto sval = std::stoi(tokens[2], nullptr, base);
+ k_ptr->bi_key = { tval, sval };
info_set_value(k_ptr->pval, tokens[3]);
} else if (tokens[0] == "W") {
// W:level:weight:cost
return 1;
}
- int j = (int)strtol(zz[0], nullptr, 0);
+ const auto tval = i2enum<ItemKindType>(strtol(zz[0], nullptr, 0));
TERM_COLOR n1 = (TERM_COLOR)strtol(zz[1], nullptr, 0);
auto n2 = static_cast<char>(strtol(zz[2], nullptr, 0));
for (auto &k_ref : baseitems_info) {
- if ((k_ref.idx > 0) && (enum2i(k_ref.tval) == j)) {
+ if ((k_ref.idx > 0) && (k_ref.bi_key.tval() == tval)) {
if (n1) {
k_ref.d_attr = n1;
}
for (auto tval : { ItemKindType::SWORD, ItemKindType::POLEARM, ItemKindType::HAFTED, ItemKindType::DIGGING, ItemKindType::BOW }) {
for (int num = 0; num < 64; num++) {
+ BaseitemKey bi_key(tval, num);
for (const auto &k_ref : baseitems_info) {
- if ((k_ref.tval != tval) || (k_ref.sval != num)) {
+ if (k_ref.bi_key != bi_key) {
continue;
}
- if ((k_ref.tval == ItemKindType::BOW) && (k_ref.sval == SV_CRIMSON || k_ref.sval == SV_HARP)) {
+
+ const auto sval = k_ref.bi_key.sval();
+ if ((k_ref.bi_key.tval() == ItemKindType::BOW) && (sval == SV_CRIMSON || sval == SV_HARP)) {
continue;
}
}
}
+ const auto tval = k_ref.bi_key.tval();
if (group_tval == ItemKindType::LIFE_BOOK) {
- if (ItemKindType::LIFE_BOOK <= k_ref.tval && k_ref.tval <= ItemKindType::HEX_BOOK) {
+ if (ItemKindType::LIFE_BOOK <= tval && tval <= ItemKindType::HEX_BOOK) {
object_idx[object_cnt++] = k_ref.idx;
} else {
continue;
}
- } else if (k_ref.tval == group_tval) {
+ } else if (tval == group_tval) {
object_idx[object_cnt++] = k_ref.idx;
} else {
continue;
o_ptr->iy = rd_byte();
o_ptr->ix = rd_byte();
auto *k_ptr = &baseitems_info[o_ptr->k_idx];
- o_ptr->tval = k_ptr->tval;
- o_ptr->sval = k_ptr->sval;
+ o_ptr->tval = k_ptr->bi_key.tval();
+ o_ptr->sval = k_ptr->bi_key.sval().value();
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;
int n = 1;
k_idx = 0;
for (const auto &k_ref : baseitems_info) {
- if (k_ref.tval != ItemKindType::SWORD) {
+ if (k_ref.bi_key.tval() != ItemKindType::SWORD) {
continue;
}
- if ((k_ref.sval == SV_BROKEN_DAGGER) || (k_ref.sval == SV_BROKEN_SWORD) || (k_ref.sval == SV_POISON_NEEDLE)) {
+
+ const auto sval = k_ref.bi_key.sval();
+ if ((sval == SV_BROKEN_DAGGER) || (sval == SV_BROKEN_SWORD) || (sval == SV_POISON_NEEDLE)) {
continue;
}
+
if (k_ref.weight > 99) {
continue;
}
} else {
auto tval = (one_in_(5) ? mo_ptr->tval : ItemKindType::SWORD);
while (true) {
- BaseitemInfo *ck_ptr;
k_idx = lookup_baseitem_id({ tval });
- ck_ptr = &baseitems_info[k_idx];
-
+ const auto &bi_ref = baseitems_info[k_idx];
+ const auto sval = bi_ref.bi_key.sval();
if (tval == ItemKindType::SWORD) {
- if ((ck_ptr->sval == SV_BROKEN_DAGGER) || (ck_ptr->sval == SV_BROKEN_SWORD) || (ck_ptr->sval == SV_DIAMOND_EDGE) || (ck_ptr->sval == SV_POISON_NEEDLE)) {
+ if ((sval == SV_BROKEN_DAGGER) || (sval == SV_BROKEN_SWORD) || (sval == SV_DIAMOND_EDGE) || (sval == SV_POISON_NEEDLE)) {
continue;
}
}
+
if (tval == ItemKindType::POLEARM) {
- if ((ck_ptr->sval == SV_DEATH_SCYTHE) || (ck_ptr->sval == SV_TSURIZAO)) {
+ if ((sval == SV_DEATH_SCYTHE) || (sval == SV_TSURIZAO)) {
continue;
}
}
+
if (tval == ItemKindType::HAFTED) {
- if ((ck_ptr->sval == SV_GROND) || (ck_ptr->sval == SV_WIZSTAFF) || (ck_ptr->sval == SV_NAMAKE_HAMMER)) {
+ if ((sval == SV_GROND) || (sval == SV_WIZSTAFF) || (sval == SV_NAMAKE_HAMMER)) {
continue;
}
}
k_ptr = &baseitems_info[k_idx];
o_ptr->k_idx = k_idx;
o_ptr->weight = k_ptr->weight;
- o_ptr->tval = k_ptr->tval;
- o_ptr->sval = k_ptr->sval;
+ o_ptr->tval = k_ptr->bi_key.tval();
+ o_ptr->sval = k_ptr->bi_key.sval().value();
o_ptr->dd = k_ptr->dd;
o_ptr->ds = k_ptr->ds;
int dam = 0;
bool angry = false;
auto *k_ptr = &baseitems_info[k_idx];
- switch (k_ptr->sval) {
+ switch (k_ptr->bi_key.sval().value()) {
case SV_POTION_SALT_WATER:
case SV_POTION_SLIME_MOLD:
case SV_POTION_LOSE_MEMORIES:
#include <sstream>
#include <vector>
-/*
- * Special "sval" limit -- first "good" magic/prayer book
- */
+// @brief 3冊目の魔法書からは上質アイテムとして扱う.
static const int SV_BOOK_MIN_GOOD = 2;
/*!
*/
bool kind_is_cloak(KIND_OBJECT_IDX k_idx)
{
- return baseitems_info[k_idx].tval == ItemKindType::CLOAK;
+ return baseitems_info[k_idx].bi_key.tval() == ItemKindType::CLOAK;
}
/*!
*/
bool kind_is_polearm(KIND_OBJECT_IDX k_idx)
{
- return baseitems_info[k_idx].tval == ItemKindType::POLEARM;
+ return baseitems_info[k_idx].bi_key.tval() == ItemKindType::POLEARM;
}
/*!
bool kind_is_sword(KIND_OBJECT_IDX k_idx)
{
auto *k_ptr = &baseitems_info[k_idx];
- return (k_ptr->tval == ItemKindType::SWORD) && (k_ptr->sval > 2);
+ return (k_ptr->bi_key.tval() == ItemKindType::SWORD) && (k_ptr->bi_key.sval() > 2);
}
/*!
bool kind_is_book(KIND_OBJECT_IDX k_idx)
{
auto *k_ptr = &baseitems_info[k_idx];
- return (k_ptr->tval >= ItemKindType::LIFE_BOOK) && (k_ptr->tval <= ItemKindType::CRUSADE_BOOK);
+ return (k_ptr->bi_key.tval() >= ItemKindType::LIFE_BOOK) && (k_ptr->bi_key.tval() <= ItemKindType::CRUSADE_BOOK);
}
/*!
bool kind_is_good_book(KIND_OBJECT_IDX k_idx)
{
auto *k_ptr = &baseitems_info[k_idx];
- return (k_ptr->tval >= ItemKindType::LIFE_BOOK) && (k_ptr->tval <= ItemKindType::CRUSADE_BOOK) && (k_ptr->tval != ItemKindType::ARCANE_BOOK) && (k_ptr->sval > 1);
+ return (k_ptr->bi_key.tval() >= ItemKindType::LIFE_BOOK) && (k_ptr->bi_key.tval() <= ItemKindType::CRUSADE_BOOK) && (k_ptr->bi_key.tval() != ItemKindType::ARCANE_BOOK) && (k_ptr->bi_key.sval() > 1);
}
/*!
*/
bool kind_is_armor(KIND_OBJECT_IDX k_idx)
{
- return baseitems_info[k_idx].tval == ItemKindType::HARD_ARMOR;
+ return baseitems_info[k_idx].bi_key.tval() == ItemKindType::HARD_ARMOR;
}
/*!
*/
bool kind_is_hafted(KIND_OBJECT_IDX k_idx)
{
- return baseitems_info[k_idx].tval == ItemKindType::HAFTED;
+ return baseitems_info[k_idx].bi_key.tval() == ItemKindType::HAFTED;
}
/*!
*/
bool kind_is_potion(KIND_OBJECT_IDX k_idx)
{
- return baseitems_info[k_idx].tval == ItemKindType::POTION;
+ return baseitems_info[k_idx].bi_key.tval() == ItemKindType::POTION;
}
/*!
*/
bool kind_is_boots(KIND_OBJECT_IDX k_idx)
{
- return baseitems_info[k_idx].tval == ItemKindType::BOOTS;
+ return baseitems_info[k_idx].bi_key.tval() == ItemKindType::BOOTS;
}
/*!
*/
bool kind_is_amulet(KIND_OBJECT_IDX k_idx)
{
- return baseitems_info[k_idx].tval == ItemKindType::AMULET;
+ return baseitems_info[k_idx].bi_key.tval() == ItemKindType::AMULET;
}
/*!
bool kind_is_good(KIND_OBJECT_IDX k_idx)
{
auto *k_ptr = &baseitems_info[k_idx];
- switch (k_ptr->tval) {
+ switch (k_ptr->bi_key.tval()) {
/* Armor -- Good unless damaged */
case ItemKindType::HARD_ARMOR:
case ItemKindType::SOFT_ARMOR:
case ItemKindType::MUSIC_BOOK:
case ItemKindType::HISSATSU_BOOK:
case ItemKindType::HEX_BOOK:
- return k_ptr->sval >= SV_BOOK_MIN_GOOD;
+ return k_ptr->bi_key.sval() >= SV_BOOK_MIN_GOOD;
/* Rings -- Rings of Speed are good */
case ItemKindType::RING:
- return (k_ptr->sval == SV_RING_SPEED) || (k_ptr->sval == SV_RING_LORDLY);
+ return (k_ptr->bi_key.sval() == SV_RING_SPEED) || (k_ptr->bi_key.sval() == SV_RING_LORDLY);
/* Amulets -- Amulets of the Magi and Resistance are good */
case ItemKindType::AMULET:
- return (k_ptr->sval == SV_AMULET_THE_MAGI) || (k_ptr->sval == SV_AMULET_RESISTANCE);
+ return (k_ptr->bi_key.sval() == SV_AMULET_THE_MAGI) || (k_ptr->bi_key.sval() == SV_AMULET_RESISTANCE);
default:
return false;
}
{
static std::map<ItemKindType, std::vector<int>> cache;
for (const auto &baseitem : baseitems_info) {
- const auto tval = baseitem.tval;
+ const auto &bi_key = baseitem.bi_key;
+ const auto tval = bi_key.tval();
if (tval == ItemKindType::NONE) {
continue;
}
- cache[tval].push_back(baseitem.sval);
+ cache[tval].push_back(bi_key.sval().value());
}
return cache;
}
/*
- * @brief tvalとsvalに対応する、BaseitenDefinitions のIDを返すためのキャッシュを生成する
+ * @brief tvalとbi_key.svalに対応する、BaseitenDefinitions のIDを返すためのキャッシュを生成する
* @return tvalと(実在する)svalの組み合わせをキーに、ベースアイテムIDを値とした辞書
*/
static const std::map<BaseitemKey, short> &create_baseitem_index_chache()
{
static std::map<BaseitemKey, short> cache;
for (const auto &baseitem : baseitems_info) {
- const auto tval = baseitem.tval;
- if (tval == ItemKindType::NONE) {
+ const auto &bi_key = baseitem.bi_key;
+ if (bi_key.tval() == ItemKindType::NONE) {
continue;
}
- const BaseitemKey key(tval, baseitem.sval);
- cache[key] = baseitem.idx;
+ cache[bi_key] = baseitem.idx;
}
return cache;
/*!
* @brief tvalとsvalに対応するベースアイテムのIDを検索する
- * @param tval 検索したいベースアイテムのtval
- * @param sval 検索したいベースアイテムのsval (nulloptの可能性はない)
+ * @param key 検索したいベースアイテムの、tval/svalのペア (svalがnulloptの可能性はない)
* @return tvalとsvalに対応するベースアイテムが存在すればそのID、存在しなければ0
* @details 存在しないことはリファクタリング成果により考えにくく、自作の不存在例外を投げればいいはず.
* 但し呼び出し側全部の処理を保証するのが面倒なので旧処理のままとする.
continue;
}
- if (a_ref.bi_key.tval() != baseitems_info[k_idx].tval) {
- continue;
- }
-
- if (a_ref.bi_key.sval() != baseitems_info[k_idx].sval) {
+ if (a_ref.bi_key != baseitems_info[k_idx].bi_key) {
continue;
}
return this->subtype_value;
}
+BaseitemInfo::BaseitemInfo()
+ : bi_key(ItemKindType::NONE)
+{
+}
+
std::vector<BaseitemInfo> baseitems_info;
enum class RandomArtActType : short;
class BaseitemInfo {
public:
- BaseitemInfo() = default;
+ BaseitemInfo();
KIND_OBJECT_IDX idx{};
std::string name; /*!< ベースアイテム名 */
std::string text; /*!< 解説テキスト */
std::string flavor_name; /*!< 未確定名 */
- ItemKindType tval{}; /*!< ベースアイテム種別の大項目値 Object type */
- OBJECT_SUBTYPE_VALUE sval{}; /*!< ベースアイテム種別の小項目値 Object sub type */
+ BaseitemKey bi_key;
PARAMETER_VALUE pval{}; /*!< ベースアイテムのpval(能力修正共通値) Object extra info */
wipe();
this->stack_idx = old_stack_idx;
this->k_idx = ko_idx;
- this->tval = k_ptr->tval;
- this->sval = k_ptr->sval;
+ this->tval = k_ptr->bi_key.tval();
+ this->sval = k_ptr->bi_key.sval().value();
this->pval = k_ptr->pval;
this->number = 1;
this->weight = k_ptr->weight;
*/
bool ObjectType::is_potion() const
{
- return baseitems_info[this->k_idx].tval == ItemKindType::POTION;
+ return baseitems_info[this->k_idx].bi_key.tval() == ItemKindType::POTION;
}
/*!
std::vector<KIND_OBJECT_IDX> whats;
for (auto tval : tval_list) {
for (const auto &k_ref : baseitems_info) {
- if ((k_ref.tval == tval) && k_ref.gen_flags.has_not(ItemGenerationTraitType::INSTA_ART)) {
+ if ((k_ref.bi_key.tval() == tval) && k_ref.gen_flags.has_not(ItemGenerationTraitType::INSTA_ART)) {
whats.push_back(k_ref.idx);
}
}
total[i] += prob / (CHANCE_BASEITEM_LEVEL_BOOST * K_MAX_DEPTH);
total_frac += prob % (CHANCE_BASEITEM_LEVEL_BOOST * K_MAX_DEPTH);
- if ((k_ptr->tval == tval) && (k_ptr->sval == sval)) {
+ BaseitemKey bi_key(tval, sval);
+ if (k_ptr->bi_key == bi_key) {
home = k_ptr->level;
rarity[i] += prob / (CHANCE_BASEITEM_LEVEL_BOOST * K_MAX_DEPTH);
}
FixedArtifactId a_idx = FixedArtifactId::NONE;
if (k_ptr->gen_flags.has(ItemGenerationTraitType::INSTA_ART)) {
for (const auto &[a_idx_loop, a_ref_loop] : artifacts_info) {
- if (a_idx_loop == FixedArtifactId::NONE || a_ref_loop.bi_key.tval() != k_ptr->tval || a_ref_loop.bi_key.sval() != k_ptr->sval) {
+ if (a_idx_loop == FixedArtifactId::NONE || a_ref_loop.bi_key != k_ptr->bi_key) {
continue;
}
break;
}
- if (k_ref.idx == 0 || k_ref.tval != tval) {
+ if (k_ref.idx == 0 || k_ref.bi_key.tval() != tval) {
continue;
}
const auto &baseitem = baseitems_info[bi_id];
if (baseitem.gen_flags.has(ItemGenerationTraitType::INSTA_ART)) {
for (const auto &[a_idx, a_ref] : artifacts_info) {
- if ((a_idx == FixedArtifactId::NONE) || (a_ref.bi_key.tval() != baseitem.tval) || (a_ref.bi_key.sval() != baseitem.sval)) {
+ if ((a_idx == FixedArtifactId::NONE) || (a_ref.bi_key != baseitem.bi_key)) {
continue;
}
break;
}
- KIND_OBJECT_IDX k_idx = entry.index;
- auto *k_ptr = &baseitems_info[k_idx];
-
- if ((mode & AM_FORBID_CHEST) && (k_ptr->tval == ItemKindType::CHEST)) {
+ const auto &k_ref = baseitems_info[entry.index];
+ if ((mode & AM_FORBID_CHEST) && (k_ref.bi_key.tval() == ItemKindType::CHEST)) {
continue;
}