2 * @brief アイテムが特定種別のものであるかどうかの判定関数群
7 #include "object/object-kind-hook.h"
8 #include "object/object-kind.h"
9 #include "sv-definition/sv-amulet-types.h"
10 #include "sv-definition/sv-other-types.h"
11 #include "sv-definition/sv-ring-types.h"
14 * Special "sval" limit -- first "good" magic/prayer book
16 static const int SV_BOOK_MIN_GOOD = 2;
19 * @brief オブジェクトがクロークかどうかを判定する /
20 * @param k_idx 判定したいオブジェクトのベースアイテムID
21 * @return オブジェクトがクロークならばTRUEを返す
23 bool kind_is_cloak(KIND_OBJECT_IDX k_idx)
25 return k_info[k_idx].tval == TV_CLOAK;
29 * @brief オブジェクトが竿状武器かどうかを判定する /
30 * @param k_idx 判定したいオブジェクトのベースアイテムID
31 * @return オブジェクトが竿状武器ならばTRUEを返す
33 bool kind_is_polearm(KIND_OBJECT_IDX k_idx)
35 return k_info[k_idx].tval == TV_POLEARM;
39 * @brief オブジェクトが剣かどうかを判定する /
40 * @param k_idx 判定したいオブジェクトのベースアイテムID
41 * @return オブジェクトが剣ならばTRUEを返す
43 bool kind_is_sword(KIND_OBJECT_IDX k_idx)
45 object_kind *k_ptr = &k_info[k_idx];
46 return (k_ptr->tval == TV_SWORD) && (k_ptr->sval > 2);
50 * @brief オブジェクトが魔法書かどうかを判定する /
51 * @param k_idx 判定したいオブジェクトのベースアイテムID
52 * @return オブジェクトが魔法書ならばTRUEを返す
54 bool kind_is_book(KIND_OBJECT_IDX k_idx)
56 object_kind *k_ptr = &k_info[k_idx];
57 return (k_ptr->tval >= TV_LIFE_BOOK) && (k_ptr->tval <= TV_CRUSADE_BOOK);
61 * @brief オブジェクトがベースアイテム時点でGOODかどうかを判定する /
62 * @param k_idx 判定したいオブジェクトのベースアイテムID
63 * @return オブジェクトがベースアイテム時点でGOODなアイテムならばTRUEを返す
65 bool kind_is_good_book(KIND_OBJECT_IDX k_idx)
67 object_kind *k_ptr = &k_info[k_idx];
68 return (k_ptr->tval >= TV_LIFE_BOOK) && (k_ptr->tval <= TV_CRUSADE_BOOK) && (k_ptr->tval != TV_ARCANE_BOOK) && (k_ptr->sval > 1);
72 * @brief オブジェクトが鎧かどうかを判定する /
73 * @param k_idx 判定したいオブジェクトのベースアイテムID
74 * @return オブジェクトが鎧ならばTRUEを返す
76 bool kind_is_armor(KIND_OBJECT_IDX k_idx)
78 return k_info[k_idx].tval == TV_HARD_ARMOR;
82 * @brief オブジェクトが打撃武器かどうかを判定する /
83 * @param k_idx 判定したいオブジェクトのベースアイテムID
84 * @return オブジェクトが打撃武器ならばTRUEを返す
86 bool kind_is_hafted(KIND_OBJECT_IDX k_idx)
88 return k_info[k_idx].tval == TV_HAFTED;
92 * @brief オブジェクトが薬かどうかを判定する /
93 * @param k_idx 判定したいオブジェクトのベースアイテムID
94 * @return オブジェクトが薬ならばTRUEを返す
96 bool kind_is_potion(KIND_OBJECT_IDX k_idx)
98 return k_info[k_idx].tval == TV_POTION;
102 * @brief オブジェクトが靴かどうかを判定する /
103 * @param k_idx 判定したいオブジェクトのベースアイテムID
104 * @return オブジェクトが靴ならばTRUEを返す
106 bool kind_is_boots(KIND_OBJECT_IDX k_idx)
108 return k_info[k_idx].tval == TV_BOOTS;
112 * @brief オブジェクトがアミュレットかどうかを判定する /
113 * @param k_idx 判定したいオブジェクトのベースアイテムID
114 * @return オブジェクトがアミュレットならばTRUEを返す
116 bool kind_is_amulet(KIND_OBJECT_IDX k_idx)
118 return k_info[k_idx].tval == TV_AMULET;
122 * @brief ベースアイテムが上質として扱われるかどうかを返す。
123 * Hack -- determine if a template is "good"
124 * @param k_idx 判定したいベースアイテムのID
125 * @return ベースアイテムが上質ならばTRUEを返す。
127 bool kind_is_good(KIND_OBJECT_IDX k_idx)
129 object_kind *k_ptr = &k_info[k_idx];
130 switch (k_ptr->tval) {
131 /* Armor -- Good unless damaged */
141 return k_ptr->to_a >= 0;
143 /* Weapons -- Good unless damaged */
149 return (k_ptr->to_h >= 0) && (k_ptr->to_d >= 0);
151 /* Ammo -- Arrows/Bolts are good */
156 /* Books -- High level books are good (except Arcane books) */
158 case TV_SORCERY_BOOK:
165 case TV_CRUSADE_BOOK:
167 case TV_HISSATSU_BOOK:
169 return k_ptr->sval >= SV_BOOK_MIN_GOOD;
171 /* Rings -- Rings of Speed are good */
173 return (k_ptr->sval == SV_RING_SPEED) || (k_ptr->sval == SV_RING_LORDLY);
175 /* Amulets -- Amulets of the Magi and Resistance are good */
177 return (k_ptr->sval == SV_AMULET_THE_MAGI) || (k_ptr->sval == SV_AMULET_RESISTANCE);
184 * @brief tvalとsvalに対応するベースアイテムのIDを返す。
185 * Find the index of the object_kind with the given tval and sval
186 * @param tval 検索したいベースアイテムのtval
187 * @param sval 検索したいベースアイテムのsval
189 KIND_OBJECT_IDX lookup_kind(tval_type tval, OBJECT_SUBTYPE_VALUE sval)
192 KIND_OBJECT_IDX bk = 0;
193 for (KIND_OBJECT_IDX k = 1; k < max_k_idx; k++) {
194 object_kind *k_ptr = &k_info[k];
195 if (k_ptr->tval != tval)
198 if (k_ptr->sval == sval)
201 if ((sval != SV_ANY) || !one_in_(++num))