OSDN Git Service

Merge branch 'master' of git.osdn.net:/gitroot/hengband/hengband
[hengband/hengband.git] / src / object / object-kind-hook.c
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  * Hack -- determine if a template is Cloak
21  * @param k_idx 判定したいオブジェクトのベースアイテムID
22  * @return オブジェクトがクロークならばTRUEを返す
23  */
24 bool kind_is_cloak(KIND_OBJECT_IDX k_idx)
25 {
26         object_kind *k_ptr = &k_info[k_idx];
27
28         /* Analyze the item type */
29         if (k_ptr->tval == TV_CLOAK)
30         {
31                 return TRUE;
32         }
33
34         /* Assume not good */
35         return FALSE;
36 }
37
38
39 /*!
40  * @brief オブジェクトが竿状武器かどうかを判定する /
41  * Hack -- determine if a template is Polearm
42  * @param k_idx 判定したいオブジェクトのベースアイテムID
43  * @return オブジェクトが竿状武器ならばTRUEを返す
44  */
45 bool kind_is_polearm(KIND_OBJECT_IDX k_idx)
46 {
47         object_kind *k_ptr = &k_info[k_idx];
48
49         /* Analyze the item type */
50         if (k_ptr->tval == TV_POLEARM)
51         {
52                 return TRUE;
53         }
54
55         /* Assume not good */
56         return FALSE;
57 }
58
59
60 /*!
61  * @brief オブジェクトが剣かどうかを判定する /
62  * Hack -- determine if a template is Sword
63  * @param k_idx 判定したいオブジェクトのベースアイテムID
64  * @return オブジェクトが剣ならばTRUEを返す
65  */
66 bool kind_is_sword(KIND_OBJECT_IDX k_idx)
67 {
68         object_kind *k_ptr = &k_info[k_idx];
69
70         /* Analyze the item type */
71         if ((k_ptr->tval == TV_SWORD) && (k_ptr->sval > 2))
72         {
73                 return TRUE;
74         }
75
76         /* Assume not good */
77         return FALSE;
78 }
79
80
81 /*!
82  * @brief オブジェクトが魔法書かどうかを判定する /
83  * Hack -- determine if a template is Book
84  * @param k_idx 判定したいオブジェクトのベースアイテムID
85  * @return オブジェクトが魔法書ならばTRUEを返す
86  */
87 bool kind_is_book(KIND_OBJECT_IDX k_idx)
88 {
89         object_kind *k_ptr = &k_info[k_idx];
90
91         /* Analyze the item type */
92         if ((k_ptr->tval >= TV_LIFE_BOOK) && (k_ptr->tval <= TV_CRUSADE_BOOK))
93         {
94                 return TRUE;
95         }
96
97         /* Assume not good */
98         return FALSE;
99 }
100
101
102 /*!
103  * @brief オブジェクトがベースアイテム時点でGOODかどうかを判定する /
104  * Hack -- determine if a template is Good book
105  * @param k_idx 判定したいオブジェクトのベースアイテムID
106  * @return オブジェクトがベースアイテム時点でGOODなアイテムならばTRUEを返す
107  */
108 bool kind_is_good_book(KIND_OBJECT_IDX k_idx)
109 {
110         object_kind *k_ptr = &k_info[k_idx];
111
112         /* Analyze the item type */
113         if ((k_ptr->tval >= TV_LIFE_BOOK) && (k_ptr->tval <= TV_CRUSADE_BOOK) && (k_ptr->tval != TV_ARCANE_BOOK) && (k_ptr->sval > 1))
114         {
115                 return TRUE;
116         }
117
118         /* Assume not good */
119         return FALSE;
120 }
121
122
123 /*!
124  * @brief オブジェクトが鎧かどうかを判定する /
125  * Hack -- determine if a template is Armor
126  * @param k_idx 判定したいオブジェクトのベースアイテムID
127  * @return オブジェクトが鎧ならばTRUEを返す
128  */
129 bool kind_is_armor(KIND_OBJECT_IDX k_idx)
130 {
131         object_kind *k_ptr = &k_info[k_idx];
132
133         /* Analyze the item type */
134         if (k_ptr->tval == TV_HARD_ARMOR)
135         {
136                 return TRUE;
137         }
138
139         /* Assume not good */
140         return FALSE;
141 }
142
143
144 /*!
145  * @brief オブジェクトが打撃武器かどうかを判定する /
146  * Hack -- determine if a template is hafted weapon
147  * @param k_idx 判定したいオブジェクトのベースアイテムID
148  * @return オブジェクトが打撃武器ならばTRUEを返す
149  */
150 bool kind_is_hafted(KIND_OBJECT_IDX k_idx)
151 {
152         object_kind *k_ptr = &k_info[k_idx];
153
154         /* Analyze the item type */
155         if (k_ptr->tval == TV_HAFTED)
156         {
157                 return TRUE;
158         }
159
160         /* Assume not good */
161         return FALSE;
162 }
163
164 /*
165  * Hack -- determine if a template is potion
166  */
167 bool kind_is_potion(KIND_OBJECT_IDX k_idx)
168 {
169         return k_info[k_idx].tval == TV_POTION;
170 }
171
172 /*!
173  * @brief ベースアイテムが上質として扱われるかどうかを返す。
174  * Hack -- determine if a template is "good"
175  * @param k_idx 判定したいベースアイテムのID
176  * @return ベースアイテムが上質ならばTRUEを返す。
177  */
178 bool kind_is_good(KIND_OBJECT_IDX k_idx)
179 {
180         object_kind *k_ptr = &k_info[k_idx];
181
182         /* Analyze the item type */
183         switch (k_ptr->tval)
184         {
185                 /* Armor -- Good unless damaged */
186         case TV_HARD_ARMOR:
187         case TV_SOFT_ARMOR:
188         case TV_DRAG_ARMOR:
189         case TV_SHIELD:
190         case TV_CLOAK:
191         case TV_BOOTS:
192         case TV_GLOVES:
193         case TV_HELM:
194         case TV_CROWN:
195         {
196                 if (k_ptr->to_a < 0) return FALSE;
197                 return TRUE;
198         }
199
200         /* Weapons -- Good unless damaged */
201         case TV_BOW:
202         case TV_SWORD:
203         case TV_HAFTED:
204         case TV_POLEARM:
205         case TV_DIGGING:
206         {
207                 if (k_ptr->to_h < 0) return FALSE;
208                 if (k_ptr->to_d < 0) return FALSE;
209                 return TRUE;
210         }
211
212         /* Ammo -- Arrows/Bolts are good */
213         case TV_BOLT:
214         case TV_ARROW:
215         {
216                 return TRUE;
217         }
218
219         /* Books -- High level books are good (except Arcane books) */
220         case TV_LIFE_BOOK:
221         case TV_SORCERY_BOOK:
222         case TV_NATURE_BOOK:
223         case TV_CHAOS_BOOK:
224         case TV_DEATH_BOOK:
225         case TV_TRUMP_BOOK:
226         case TV_CRAFT_BOOK:
227         case TV_DEMON_BOOK:
228         case TV_CRUSADE_BOOK:
229         case TV_MUSIC_BOOK:
230         case TV_HISSATSU_BOOK:
231         case TV_HEX_BOOK:
232         {
233                 if (k_ptr->sval >= SV_BOOK_MIN_GOOD) return TRUE;
234                 return FALSE;
235         }
236
237         /* Rings -- Rings of Speed are good */
238         case TV_RING:
239         {
240                 if (k_ptr->sval == SV_RING_SPEED) return TRUE;
241                 if (k_ptr->sval == SV_RING_LORDLY) return TRUE;
242                 return FALSE;
243         }
244
245         /* Amulets -- Amulets of the Magi and Resistance are good */
246         case TV_AMULET:
247         {
248                 if (k_ptr->sval == SV_AMULET_THE_MAGI) return TRUE;
249                 if (k_ptr->sval == SV_AMULET_RESISTANCE) return TRUE;
250                 return FALSE;
251         }
252         }
253
254         /* Assume not good */
255         return FALSE;
256 }
257
258 /*!
259  * @brief tvalとsvalに対応するベースアイテムのIDを返す。
260  * Find the index of the object_kind with the given tval and sval
261  * @param tval 検索したいベースアイテムのtval
262  * @param sval 検索したいベースアイテムのsval
263  * @return なし
264  */
265 KIND_OBJECT_IDX lookup_kind(tval_type tval, OBJECT_SUBTYPE_VALUE sval)
266 {
267     int num = 0;
268     KIND_OBJECT_IDX bk = 0;
269
270     for (KIND_OBJECT_IDX k = 1; k < max_k_idx; k++) {
271         object_kind *k_ptr = &k_info[k];
272         if (k_ptr->tval != tval)
273             continue;
274         if (k_ptr->sval == sval)
275             return (k);
276         if (sval != SV_ANY)
277             continue;
278         if (!one_in_(++num))
279             continue;
280
281         bk = k;
282     }
283
284     if (sval == SV_ANY) {
285         return bk;
286     }
287
288     return 0;
289 }