OSDN Git Service

Merge pull request #1192 from hengband/feature/3.0.0Alpha26
[hengbandforosx/hengbandosx.git] / src / object / object-kind-hook.cpp
1 /*!
2  * @brief アイテムが特定種別のものであるかどうかの判定関数群
3  * @date 2018/12/15
4  * @author deskull
5  */
6
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"
12
13 /*
14  * Special "sval" limit -- first "good" magic/prayer book
15  */
16 static const int SV_BOOK_MIN_GOOD = 2;
17
18 /*!
19  * @brief オブジェクトがクロークかどうかを判定する /
20  * @param k_idx 判定したいオブジェクトのベースアイテムID
21  * @return オブジェクトがクロークならばTRUEを返す
22  */
23 bool kind_is_cloak(KIND_OBJECT_IDX k_idx)
24 {
25     return k_info[k_idx].tval == TV_CLOAK;
26 }
27
28 /*!
29  * @brief オブジェクトが竿状武器かどうかを判定する /
30  * @param k_idx 判定したいオブジェクトのベースアイテムID
31  * @return オブジェクトが竿状武器ならばTRUEを返す
32  */
33 bool kind_is_polearm(KIND_OBJECT_IDX k_idx)
34 {
35     return k_info[k_idx].tval == TV_POLEARM;
36 }
37
38 /*!
39  * @brief オブジェクトが剣かどうかを判定する /
40  * @param k_idx 判定したいオブジェクトのベースアイテムID
41  * @return オブジェクトが剣ならばTRUEを返す
42  */
43 bool kind_is_sword(KIND_OBJECT_IDX k_idx)
44 {
45     object_kind *k_ptr = &k_info[k_idx];
46     return (k_ptr->tval == TV_SWORD) && (k_ptr->sval > 2);
47 }
48
49 /*!
50  * @brief オブジェクトが魔法書かどうかを判定する /
51  * @param k_idx 判定したいオブジェクトのベースアイテムID
52  * @return オブジェクトが魔法書ならばTRUEを返す
53  */
54 bool kind_is_book(KIND_OBJECT_IDX k_idx)
55 {
56     object_kind *k_ptr = &k_info[k_idx];
57     return (k_ptr->tval >= TV_LIFE_BOOK) && (k_ptr->tval <= TV_CRUSADE_BOOK);
58 }
59
60 /*!
61  * @brief オブジェクトがベースアイテム時点でGOODかどうかを判定する /
62  * @param k_idx 判定したいオブジェクトのベースアイテムID
63  * @return オブジェクトがベースアイテム時点でGOODなアイテムならばTRUEを返す
64  */
65 bool kind_is_good_book(KIND_OBJECT_IDX k_idx)
66 {
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);
69 }
70
71 /*!
72  * @brief オブジェクトが鎧かどうかを判定する /
73  * @param k_idx 判定したいオブジェクトのベースアイテムID
74  * @return オブジェクトが鎧ならばTRUEを返す
75  */
76 bool kind_is_armor(KIND_OBJECT_IDX k_idx)
77 {
78     return k_info[k_idx].tval == TV_HARD_ARMOR;
79 }
80
81 /*!
82  * @brief オブジェクトが打撃武器かどうかを判定する /
83  * @param k_idx 判定したいオブジェクトのベースアイテムID
84  * @return オブジェクトが打撃武器ならばTRUEを返す
85  */
86 bool kind_is_hafted(KIND_OBJECT_IDX k_idx)
87 {
88     return k_info[k_idx].tval == TV_HAFTED;
89 }
90
91 /*!
92  * @brief オブジェクトが薬かどうかを判定する /
93  * @param k_idx 判定したいオブジェクトのベースアイテムID
94  * @return オブジェクトが薬ならばTRUEを返す
95  */
96 bool kind_is_potion(KIND_OBJECT_IDX k_idx)
97 {
98     return k_info[k_idx].tval == TV_POTION;
99 }
100
101 /*!
102  * @brief オブジェクトが靴かどうかを判定する /
103  * @param k_idx 判定したいオブジェクトのベースアイテムID
104  * @return オブジェクトが靴ならばTRUEを返す
105  */
106 bool kind_is_boots(KIND_OBJECT_IDX k_idx)
107 {
108     return k_info[k_idx].tval == TV_BOOTS;
109 }
110
111 /*!
112  * @brief オブジェクトがアミュレットかどうかを判定する /
113  * @param k_idx 判定したいオブジェクトのベースアイテムID
114  * @return オブジェクトがアミュレットならばTRUEを返す
115  */
116 bool kind_is_amulet(KIND_OBJECT_IDX k_idx)
117 {
118     return k_info[k_idx].tval == TV_AMULET;
119 }
120
121 /*!
122  * @brief ベースアイテムが上質として扱われるかどうかを返す。
123  * Hack -- determine if a template is "good"
124  * @param k_idx 判定したいベースアイテムのID
125  * @return ベースアイテムが上質ならばTRUEを返す。
126  */
127 bool kind_is_good(KIND_OBJECT_IDX k_idx)
128 {
129     object_kind *k_ptr = &k_info[k_idx];
130     switch (k_ptr->tval) {
131         /* Armor -- Good unless damaged */
132     case TV_HARD_ARMOR:
133     case TV_SOFT_ARMOR:
134     case TV_DRAG_ARMOR:
135     case TV_SHIELD:
136     case TV_CLOAK:
137     case TV_BOOTS:
138     case TV_GLOVES:
139     case TV_HELM:
140     case TV_CROWN:
141         return k_ptr->to_a >= 0;
142
143     /* Weapons -- Good unless damaged */
144     case TV_BOW:
145     case TV_SWORD:
146     case TV_HAFTED:
147     case TV_POLEARM:
148     case TV_DIGGING:
149         return (k_ptr->to_h >= 0) && (k_ptr->to_d >= 0);
150
151     /* Ammo -- Arrows/Bolts are good */
152     case TV_BOLT:
153     case TV_ARROW:
154         return true;
155
156     /* Books -- High level books are good (except Arcane books) */
157     case TV_LIFE_BOOK:
158     case TV_SORCERY_BOOK:
159     case TV_NATURE_BOOK:
160     case TV_CHAOS_BOOK:
161     case TV_DEATH_BOOK:
162     case TV_TRUMP_BOOK:
163     case TV_CRAFT_BOOK:
164     case TV_DEMON_BOOK:
165     case TV_CRUSADE_BOOK:
166     case TV_MUSIC_BOOK:
167     case TV_HISSATSU_BOOK:
168     case TV_HEX_BOOK:
169         return k_ptr->sval >= SV_BOOK_MIN_GOOD;
170
171     /* Rings -- Rings of Speed are good */
172     case TV_RING:
173         return (k_ptr->sval == SV_RING_SPEED) || (k_ptr->sval == SV_RING_LORDLY);
174
175     /* Amulets -- Amulets of the Magi and Resistance are good */
176     case TV_AMULET:
177         return (k_ptr->sval == SV_AMULET_THE_MAGI) || (k_ptr->sval == SV_AMULET_RESISTANCE);
178     default:
179         return false;
180     }
181 }
182
183 /*!
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
188  */
189 KIND_OBJECT_IDX lookup_kind(tval_type tval, OBJECT_SUBTYPE_VALUE sval)
190 {
191     int num = 0;
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)
196             continue;
197
198         if (k_ptr->sval == sval)
199             return k;
200
201         if ((sval != SV_ANY) || !one_in_(++num))
202             continue;
203
204         bk = k;
205     }
206
207     if (sval == SV_ANY)
208         return bk;
209
210     return 0;
211 }