OSDN Git Service

Merge branch 'master' of git.sourceforge.jp:/gitroot/hengband/hengband
[hengband/hengband.git] / src / obj_kind.c
1 /*!
2  * @file obj_kind.c
3  * @brief ベースアイテムの実装
4  * @date 2014/01/10
5  * @author
6  * 2014 Deskull rearranged comment for Doxygen.
7  */
8
9 #include "angband.h"
10
11 /*!
12  * @brief オブジェクトが薬であるかを返す
13  * @param o_ptr 対象のオブジェクト構造体ポインタ
14  * @return オブジェクトが薬ならばTRUEを返す
15  */
16 bool object_is_potion(object_type *o_ptr)
17 {
18         return (k_info[o_ptr->k_idx].tval == TV_POTION);
19 }
20
21
22 /*!
23  * @brief オブジェクトが賞金首の報酬対象になるかを返す
24  * @param o_ptr 対象のオブジェクト構造体ポインタ
25  * @return オブジェクトが報酬対象になるならTRUEを返す
26  */
27 bool object_is_shoukinkubi(object_type *o_ptr)
28 {
29         int i;
30
31         /* Require corpse or skeleton */
32         if (o_ptr->tval != TV_CORPSE) return FALSE;
33
34         /* No wanted monsters in vanilla town */
35         if (vanilla_town) return FALSE;
36
37         /* Today's wanted */
38         if (p_ptr->today_mon > 0 && (streq(r_name + r_info[o_ptr->pval].name, r_name + r_info[today_mon].name))) return TRUE;
39
40         /* Tsuchinoko */
41         if (o_ptr->pval == MON_TSUCHINOKO) return TRUE;
42
43         /* Unique monster */
44         for (i = 0; i < MAX_KUBI; i++)
45                 if (o_ptr->pval == kubi_r_idx[i]) break;
46         if (i < MAX_KUBI) return TRUE;
47
48         /* Not wanted */
49         return FALSE;
50 }
51
52 /*!
53  * @brief オブジェクトがプレイヤーの職業に応じた適正武器か否かを返す / Favorite weapons
54  * @param o_ptr 対象のオブジェクト構造体ポインタ
55  * @return オブジェクトが適正武器ならばTRUEを返す
56  */
57 bool object_is_favorite(object_type *o_ptr)
58 {
59         /* Only melee weapons match */
60         if (!(o_ptr->tval == TV_POLEARM ||
61               o_ptr->tval == TV_SWORD ||
62               o_ptr->tval == TV_DIGGING ||
63               o_ptr->tval == TV_HAFTED))
64         {
65                 return FALSE;
66         }
67
68         /* Favorite weapons are varied depend on the class */
69         switch (p_ptr->pclass)
70         {
71         case CLASS_PRIEST:
72         {
73                 u32b flgs[TR_FLAG_SIZE];
74                 object_flags_known(o_ptr, flgs);
75
76                 if (!have_flag(flgs, TR_BLESSED) && 
77                     !(o_ptr->tval == TV_HAFTED))
78                         return FALSE;
79                 break;
80         }
81
82         case CLASS_MONK:
83         case CLASS_FORCETRAINER:
84                 /* Icky to wield? */
85                 if (!(s_info[p_ptr->pclass].w_max[o_ptr->tval-TV_WEAPON_BEGIN][o_ptr->sval]))
86                         return FALSE;
87                 break;
88
89         case CLASS_BEASTMASTER:
90         case CLASS_CAVALRY:
91         {
92                 u32b flgs[TR_FLAG_SIZE];
93                 object_flags_known(o_ptr, flgs);
94
95                 /* Is it known to be suitable to using while riding? */
96                 if (!(have_flag(flgs, TR_RIDING)))
97                         return FALSE;
98
99                 break;
100         }
101
102         case CLASS_NINJA:
103                 /* Icky to wield? */
104                 if (s_info[p_ptr->pclass].w_max[o_ptr->tval-TV_WEAPON_BEGIN][o_ptr->sval] <= WEAPON_EXP_BEGINNER)
105                         return FALSE;
106                 break;
107
108         default:
109                 /* All weapons are okay for non-special classes */
110                 return TRUE;
111         }
112
113         return TRUE;
114 }
115
116
117 /*!
118  * @brief オブジェクトがレアアイテムかどうかを返す /
119  * Rare weapons/aromors including Blade of Chaos, Dragon armors, etc.
120  * @param o_ptr 対象のオブジェクト構造体ポインタ
121  * @return レアアイテムならばTRUEを返す
122  */
123 bool object_is_rare(object_type *o_ptr)
124 {
125         switch(o_ptr->tval)
126         {
127         case TV_HAFTED:
128                 if (o_ptr->sval == SV_MACE_OF_DISRUPTION ||
129                     o_ptr->sval == SV_WIZSTAFF) return TRUE;
130                 break;
131
132         case TV_POLEARM:
133                 if (o_ptr->sval == SV_SCYTHE_OF_SLICING ||
134                     o_ptr->sval == SV_DEATH_SCYTHE) return TRUE;
135                 break;
136
137         case TV_SWORD:
138                 if (o_ptr->sval == SV_BLADE_OF_CHAOS ||
139                     o_ptr->sval == SV_DIAMOND_EDGE ||
140                     o_ptr->sval == SV_DOKUBARI ||
141                     o_ptr->sval == SV_HAYABUSA) return TRUE;
142                 break;
143
144         case TV_SHIELD:
145                 if (o_ptr->sval == SV_DRAGON_SHIELD ||
146                     o_ptr->sval == SV_MIRROR_SHIELD) return TRUE;
147                 break;
148
149         case TV_HELM:
150                 if (o_ptr->sval == SV_DRAGON_HELM) return TRUE;
151                 break;
152
153         case TV_BOOTS:
154                 if (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE) return TRUE;
155                 break;
156
157         case TV_CLOAK:
158                 if (o_ptr->sval == SV_ELVEN_CLOAK ||
159                     o_ptr->sval == SV_ETHEREAL_CLOAK ||
160                     o_ptr->sval == SV_SHADOW_CLOAK) return TRUE;
161                 break;
162
163         case TV_GLOVES:
164                 if (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES) return TRUE;
165                 break;
166
167         case TV_SOFT_ARMOR:
168                 if (o_ptr->sval == SV_KUROSHOUZOKU ||
169                     o_ptr->sval == SV_ABUNAI_MIZUGI) return TRUE;
170                 break;
171
172         case TV_DRAG_ARMOR:
173                 return TRUE;
174
175         default:
176                 break;
177         }
178
179         /* Any others are not "rare" objects. */
180         return FALSE;
181 }
182
183
184 /*!
185  * @brief オブジェクトが武器として装備できるかどうかを返す / Check if an object is weapon (including bows and ammo)
186  * @param o_ptr 対象のオブジェクト構造体ポインタ
187  * @return 武器として使えるならばTRUEを返す
188  */
189 bool object_is_weapon(object_type *o_ptr)
190 {
191         if (TV_WEAPON_BEGIN <= o_ptr->tval && o_ptr->tval <= TV_WEAPON_END) return TRUE;
192
193         return FALSE;
194 }
195
196
197 /*!
198  * @brief オブジェクトが武器や矢弾として使用できるかを返す / Check if an object is weapon (including bows and ammo)
199  * Rare weapons/aromors including Blade of Chaos, Dragon armors, etc.
200  * @param o_ptr 対象のオブジェクト構造体ポインタ
201  * @return 武器や矢弾として使えるならばTRUEを返す
202  */
203 bool object_is_weapon_ammo(object_type *o_ptr)
204 {
205         if (TV_MISSILE_BEGIN <= o_ptr->tval && o_ptr->tval <= TV_WEAPON_END) return TRUE;
206
207         return FALSE;
208 }
209
210 /*!
211  * @brief オブジェクトが矢弾として使用できるかどうかを返す / Check if an object is ammo
212  * @param o_ptr 対象のオブジェクト構造体ポインタ
213  * @return 矢弾として使えるならばTRUEを返す
214  */
215 bool object_is_ammo(object_type *o_ptr)
216 {
217         if (TV_MISSILE_BEGIN <= o_ptr->tval && o_ptr->tval <= TV_MISSILE_END) return TRUE;
218
219         return FALSE;
220 }
221
222 /*!
223  * @brief オブジェクトが防具として装備できるかどうかを返す / Check if an object is armour
224  * @param o_ptr 対象のオブジェクト構造体ポインタ
225  * @return 矢弾として使えるならばTRUEを返す
226  */
227 bool object_is_armour(object_type *o_ptr)
228 {
229         if (TV_ARMOR_BEGIN <= o_ptr->tval && o_ptr->tval <= TV_ARMOR_END) return TRUE;
230
231         return FALSE;
232 }
233
234 /*!
235  * @brief オブジェクトが武器、防具、矢弾として使用できるかを返す / Check if an object is weapon, armour or ammo
236  * @param o_ptr 対象のオブジェクト構造体ポインタ
237  * @return 武器、防具、矢弾として使えるならばTRUEを返す
238  */
239 bool object_is_weapon_armour_ammo(object_type *o_ptr)
240 {
241         if (object_is_weapon_ammo(o_ptr) || object_is_armour(o_ptr)) return TRUE;
242
243         return FALSE;
244 }
245
246
247 /*!
248  * @brief オブジェクトが近接武器として装備できるかを返す / Melee weapons
249  * @param o_ptr 対象のオブジェクト構造体ポインタ
250  * @return 近接武器として使えるならばTRUEを返す
251  */
252 bool object_is_melee_weapon(object_type *o_ptr)
253 {
254         if (TV_DIGGING <= o_ptr->tval && o_ptr->tval <= TV_SWORD) return TRUE;
255
256         return FALSE;
257 }
258
259
260 /*!
261  * @brief オブジェクトが装備可能であるかを返す / Wearable including all weapon, all armour, bow, light source, amulet, and ring
262  * @param o_ptr 対象のオブジェクト構造体ポインタ
263  * @return 装備可能ならばTRUEを返す
264  */
265 bool object_is_wearable(object_type *o_ptr)
266 {
267         if (TV_WEARABLE_BEGIN <= o_ptr->tval && o_ptr->tval <= TV_WEARABLE_END) return TRUE;
268
269         return FALSE;
270 }
271
272
273 /*!
274  * @brief オブジェクトが装備品であるかを返す(object_is_wearableに矢弾を含む) / Equipment including all wearable objects and ammo
275  * @param o_ptr 対象のオブジェクト構造体ポインタ
276  * @return 装備品ならばTRUEを返す
277  */
278 bool object_is_equipment(object_type *o_ptr)
279 {
280         if (TV_EQUIP_BEGIN <= o_ptr->tval && o_ptr->tval <= TV_EQUIP_END) return TRUE;
281
282         return FALSE;
283 }
284
285
286 /*!
287  * @brief オブジェクトが強化不能武器であるかを返す / Poison needle can not be enchanted
288  * @param o_ptr 対象のオブジェクト構造体ポインタ
289  * @return 強化不能ならばTRUEを返す
290  */
291 bool object_refuse_enchant_weapon(object_type *o_ptr)
292 {
293         if (o_ptr->tval == TV_SWORD && o_ptr->sval == SV_DOKUBARI) return TRUE;
294
295         return FALSE;
296 }
297
298
299 /*!
300  * @brief オブジェクトが強化可能武器であるかを返す /
301  * Check if an object is weapon (including bows and ammo) and allows enchantment
302  * @param o_ptr 対象のオブジェクト構造体ポインタ
303  * @return 強化可能ならばTRUEを返す
304  */
305 bool object_allow_enchant_weapon(object_type *o_ptr)
306 {
307         if (object_is_weapon_ammo(o_ptr) && !object_refuse_enchant_weapon(o_ptr)) return TRUE;
308
309         return FALSE;
310 }
311
312
313 /*!
314  * @brief オブジェクトが強化可能な近接武器であるかを返す /
315  * Check if an object is melee weapon and allows enchantment
316  * @param o_ptr 対象のオブジェクト構造体ポインタ
317  * @return 強化可能な近接武器ならばTRUEを返す
318  */
319 bool object_allow_enchant_melee_weapon(object_type *o_ptr)
320 {
321         if (object_is_melee_weapon(o_ptr) && !object_refuse_enchant_weapon(o_ptr)) return TRUE;
322
323         return FALSE;
324 }
325
326
327 /*!
328  * @brief オブジェクトが鍛冶師のエッセンス付加済みかを返す /
329  * Check if an object is made by a smith's special ability
330  * @param o_ptr 対象のオブジェクト構造体ポインタ
331  * @return エッセンス付加済みならばTRUEを返す
332  */
333 bool object_is_smith(object_type *o_ptr)
334 {
335         if (object_is_weapon_armour_ammo(o_ptr) && o_ptr->xtra3) return TRUE;
336
337         return FALSE;
338 }
339
340 /*!
341  * @brief オブジェクトがアーティファクトかを返す /
342  * Check if an object is artifact
343  * @param o_ptr 対象のオブジェクト構造体ポインタ
344  * @return アーティファクトならばTRUEを返す
345  */
346 bool object_is_artifact(object_type *o_ptr)
347 {
348         if (object_is_fixed_artifact(o_ptr) || o_ptr->art_name) return TRUE;
349
350         return FALSE;
351 }
352
353
354 /*!
355  * @brief オブジェクトがランダムアーティファクトかを返す /
356  * Check if an object is random artifact
357  * @param o_ptr 対象のオブジェクト構造体ポインタ
358  * @return ランダムアーティファクトならばTRUEを返す
359  */
360 bool object_is_random_artifact(object_type *o_ptr)
361 {
362         if (object_is_artifact(o_ptr) && !object_is_fixed_artifact(o_ptr)) return TRUE;
363
364         return FALSE;
365 }
366
367 /*!
368  * @brief オブジェクトが通常のアイテム(アーティファクト、エゴ、鍛冶師エッセンス付加いずれでもない)かを返す /
369  * Check if an object is neither artifact, ego, nor 'smith' object
370  * @param o_ptr 対象のオブジェクト構造体ポインタ
371  * @return 通常のアイテムならばTRUEを返す
372  */
373 bool object_is_nameless(object_type *o_ptr)
374 {
375         if (!object_is_artifact(o_ptr) && !object_is_ego(o_ptr) && !object_is_smith(o_ptr))
376                 return TRUE;
377
378         return FALSE;
379 }
380
381
382 /*!
383  * @brief オブジェクトが両手持ち可能な武器かを返す /
384  * Check if an object is melee weapon and allows wielding with two-hands
385  * @param o_ptr 対象のオブジェクト構造体ポインタ
386  * @return 両手持ち可能ならばTRUEを返す
387  */
388 bool object_allow_two_hands_wielding(object_type *o_ptr)
389 {
390         if (object_is_melee_weapon(o_ptr) && ((o_ptr->weight > 99) || (o_ptr->tval == TV_POLEARM))) return TRUE;
391
392         return FALSE;
393 }