OSDN Git Service

[Refactor] #37353 player-item.c/hにref_item()を追加。
[hengband/hengband.git] / src / object-hook.c
1 
2 #include "angband.h"
3 #include "object-hook.h"
4
5 /*!
6 * @brief 対象のアイテムが矢やクロスボウの矢の材料になるかを返す。/
7 * Hook to determine if an object is contertible in an arrow/bolt
8 * @param o_ptr オブジェクトの構造体の参照ポインタ。
9 * @return 材料にできるならTRUEを返す
10 */
11 bool item_tester_hook_convertible(object_type *o_ptr)
12 {
13         if ((o_ptr->tval == TV_JUNK) || (o_ptr->tval == TV_SKELETON)) return TRUE;
14
15         if ((o_ptr->tval == TV_CORPSE) && (o_ptr->sval == SV_SKELETON)) return TRUE;
16         /* Assume not */
17         return (FALSE);
18 }
19
20 /*!
21 * @brief 武器匠の「武器」鑑定対象になるかを判定する。/ Hook to specify "weapon"
22 * @param o_ptr オブジェクトの構造体の参照ポインタ。
23 * @return 対象になるならTRUEを返す。
24 */
25 bool item_tester_hook_orthodox_melee_weapons(object_type *o_ptr)
26 {
27         switch (o_ptr->tval)
28         {
29         case TV_HAFTED:
30         case TV_POLEARM:
31         case TV_DIGGING:
32         {
33                 return (TRUE);
34         }
35         case TV_SWORD:
36         {
37                 if (o_ptr->sval != SV_DOKUBARI) return (TRUE);
38         }
39         }
40
41         return (FALSE);
42 }
43
44 /*!
45 * @brief オブジェクトが右手か左手に装備できる武器かどうかの判定
46 * @param o_ptr 判定するオブジェクトの構造体参照ポインタ
47 * @return 右手か左手の武器として装備できるならばTRUEを返す。
48 */
49 bool item_tester_hook_melee_weapon(object_type *o_ptr)
50 {
51         /* Check for a usable slot */
52         if ((o_ptr->tval >= TV_DIGGING) && (o_ptr->tval <= TV_SWORD)) return (TRUE);
53
54         /* Assume not wearable */
55         return (FALSE);
56 }
57
58
59 /*!
60 * @brief 武器匠の「矢弾」鑑定対象になるかを判定する。/ Hook to specify "weapon"
61 * @param o_ptr オブジェクトの構造体の参照ポインタ。
62 * @return 対象になるならTRUEを返す。
63 */
64 bool item_tester_hook_ammo(object_type *o_ptr)
65 {
66         switch (o_ptr->tval)
67         {
68         case TV_SHOT:
69         case TV_ARROW:
70         case TV_BOLT:
71         {
72                 return (TRUE);
73         }
74         }
75
76         return (FALSE);
77 }
78
79 /*!
80 * @brief 修復対象となる壊れた武器かを判定する。 / Hook to specify "broken weapon"
81 * @param o_ptr オブジェクトの構造体の参照ポインタ。
82 * @return 修復対象になるならTRUEを返す。
83 */
84 bool item_tester_hook_broken_weapon(object_type *o_ptr)
85 {
86         if (o_ptr->tval != TV_SWORD) return FALSE;
87
88         switch (o_ptr->sval)
89         {
90         case SV_BROKEN_DAGGER:
91         case SV_BROKEN_SWORD:
92                 return TRUE;
93         }
94
95         return FALSE;
96 }
97
98 /*!
99 * @brief オブジェクトが投射可能な武器かどうかを返す。
100 * @param o_ptr 判定するオブジェクトの構造体参照ポインタ
101 * @return 投射可能な武器ならばTRUE
102 */
103 bool item_tester_hook_boomerang(object_type *o_ptr)
104 {
105         if ((o_ptr->tval == TV_DIGGING) || (o_ptr->tval == TV_SWORD) || (o_ptr->tval == TV_POLEARM) || (o_ptr->tval == TV_HAFTED)) return (TRUE);
106
107         /* Assume not */
108         return (FALSE);
109 }
110
111 /*!
112 * @brief オブジェクトをプレイヤーが食べることができるかを判定する /
113 * Hook to determine if an object is eatable
114 * @param o_ptr 判定したいオブジェクトの構造体参照ポインタ
115 * @return 食べることが可能ならばTRUEを返す
116 */
117 bool item_tester_hook_eatable(object_type *o_ptr)
118 {
119         if (o_ptr->tval == TV_FOOD) return TRUE;
120
121 #if 0
122         if (prace_is_(RACE_SKELETON))
123         {
124                 if (o_ptr->tval == TV_SKELETON ||
125                         (o_ptr->tval == TV_CORPSE && o_ptr->sval == SV_SKELETON))
126                         return TRUE;
127         }
128         else
129 #endif
130
131                 if (prace_is_(RACE_SKELETON) ||
132                         prace_is_(RACE_GOLEM) ||
133                         prace_is_(RACE_ZOMBIE) ||
134                         prace_is_(RACE_SPECTRE))
135                 {
136                         if (o_ptr->tval == TV_STAFF || o_ptr->tval == TV_WAND)
137                                 return TRUE;
138                 }
139                 else if (prace_is_(RACE_DEMON) ||
140                         (mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_DEMON))
141                 {
142                         if (o_ptr->tval == TV_CORPSE &&
143                                 o_ptr->sval == SV_CORPSE &&
144                                 my_strchr("pht", r_info[o_ptr->pval].d_char))
145                                 return TRUE;
146                 }
147
148         /* Assume not */
149         return (FALSE);
150 }
151
152 /*!
153 * @brief オブジェクトがどちらの手にも装備できる武器かどうかの判定
154 * @param o_ptr 判定するオブジェクトの構造体参照ポインタ
155 * @return 左右両方の手で装備できるならばTRUEを返す。
156 */
157 bool item_tester_hook_mochikae(object_type *o_ptr)
158 {
159         /* Check for a usable slot */
160         if (((o_ptr->tval >= TV_DIGGING) && (o_ptr->tval <= TV_SWORD)) ||
161                 (o_ptr->tval == TV_SHIELD) || (o_ptr->tval == TV_CAPTURE) ||
162                 (o_ptr->tval == TV_CARD)) return (TRUE);
163
164         /* Assume not wearable */
165         return (FALSE);
166 }
167
168 /*!
169 * @brief オブジェクトをプレイヤーが魔道具として発動できるかを判定する /
170 * Hook to determine if an object is activatable
171 * @param o_ptr 判定したいオブジェクトの構造体参照ポインタ
172 * @return 魔道具として発動可能ならばTRUEを返す
173 */
174 bool item_tester_hook_activate(object_type *o_ptr)
175 {
176         BIT_FLAGS flgs[TR_FLAG_SIZE];
177
178         /* Not known */
179         if (!object_is_known(o_ptr)) return (FALSE);
180
181         /* Extract the flags */
182         object_flags(o_ptr, flgs);
183
184         /* Check activation flag */
185         if (have_flag(flgs, TR_ACTIVATE)) return (TRUE);
186
187         /* Assume not */
188         return (FALSE);
189 }
190
191 /*!
192 * @brief オブジェクトを防具として装備できるかの判定 / The "wearable" tester
193 * @param o_ptr 判定するオブジェクトの構造体参照ポインタ
194 * @return オブジェクトが防具として装備できるならTRUEを返す。
195 */
196 bool item_tester_hook_wear(object_type *o_ptr)
197 {
198         if ((o_ptr->tval == TV_SOFT_ARMOR) && (o_ptr->sval == SV_ABUNAI_MIZUGI))
199                 if (p_ptr->psex == SEX_MALE) return FALSE;
200
201         /* Check for a usable slot */
202         if (wield_slot(o_ptr) >= INVEN_RARM) return (TRUE);
203
204         /* Assume not wearable */
205         return (FALSE);
206 }
207
208
209 /*!
210 * @brief オブジェクトをプレイヤーが簡易使用コマンドで利用できるかを判定する /
211 * Hook to determine if an object is useable
212 * @param o_ptr 判定したいオブジェクトの構造体参照ポインタ
213 * @return 利用可能ならばTRUEを返す
214 */
215 bool item_tester_hook_use(object_type *o_ptr)
216 {
217         BIT_FLAGS flgs[TR_FLAG_SIZE];
218
219         /* Ammo */
220         if (o_ptr->tval == p_ptr->tval_ammo)
221                 return (TRUE);
222
223         /* Useable object */
224         switch (o_ptr->tval)
225         {
226         case TV_SPIKE:
227         case TV_STAFF:
228         case TV_WAND:
229         case TV_ROD:
230         case TV_SCROLL:
231         case TV_POTION:
232         case TV_FOOD:
233         {
234                 return (TRUE);
235         }
236
237         default:
238         {
239                 int i;
240
241                 /* Not known */
242                 if (!object_is_known(o_ptr)) return (FALSE);
243
244                 /* HACK - only items from the equipment can be activated */
245                 for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
246                 {
247                         if (&inventory[i] == o_ptr)
248                         {
249                                 /* Extract the flags */
250                                 object_flags(o_ptr, flgs);
251
252                                 /* Check activation flag */
253                                 if (have_flag(flgs, TR_ACTIVATE)) return (TRUE);
254                         }
255                 }
256         }
257         }
258
259         /* Assume not */
260         return (FALSE);
261 }
262
263
264 /*!
265 * @brief オブジェクトをプレイヤーが飲むことができるかを判定する /
266 * Hook to determine if an object can be quaffed
267 * @param o_ptr 判定したいオブジェクトの構造体参照ポインタ
268 * @return 飲むことが可能ならばTRUEを返す
269 */
270 bool item_tester_hook_quaff(object_type *o_ptr)
271 {
272         if (o_ptr->tval == TV_POTION) return TRUE;
273
274         if (prace_is_(RACE_ANDROID))
275         {
276                 if (o_ptr->tval == TV_FLASK && o_ptr->sval == SV_FLASK_OIL)
277                         return TRUE;
278         }
279         return FALSE;
280 }
281
282
283 /*!
284 * @brief オブジェクトをプレイヤーが読むことができるかを判定する /
285 * Hook to determine if an object is readable
286 * @param o_ptr 判定したいオブジェクトの構造体参照ポインタ
287 * @return 読むことが可能ならばTRUEを返す
288 */
289 bool item_tester_hook_readable(object_type *o_ptr)
290 {
291         if ((o_ptr->tval == TV_SCROLL) || (o_ptr->tval == TV_PARCHMENT) || (o_ptr->name1 == ART_GHB) || (o_ptr->name1 == ART_POWER)) return (TRUE);
292
293         /* Assume not */
294         return (FALSE);
295 }
296
297
298 /*!
299 * @brief エッセンスの付加可能な武器や矢弾かを返す
300 * @param o_ptr チェックしたいオブジェクトの構造体参照ポインタ
301 * @return エッセンスの付加可能な武器か矢弾ならばTRUEを返す。
302 */
303 bool item_tester_hook_melee_ammo(object_type *o_ptr)
304 {
305         switch (o_ptr->tval)
306         {
307         case TV_HAFTED:
308         case TV_POLEARM:
309         case TV_DIGGING:
310         case TV_BOLT:
311         case TV_ARROW:
312         case TV_SHOT:
313         {
314                 return (TRUE);
315         }
316         case TV_SWORD:
317         {
318                 if (o_ptr->sval != SV_DOKUBARI) return (TRUE);
319         }
320         }
321
322         return (FALSE);
323 }
324
325 /*!
326 * @brief 呪術領域の武器呪縛の対象にできる武器かどうかを返す。 / An "item_tester_hook" for offer
327 * @param o_ptr オブジェクト構造体の参照ポインタ
328 * @return 呪縛可能な武器ならばTRUEを返す
329 */
330 bool item_tester_hook_weapon_except_bow(object_type *o_ptr)
331 {
332         switch (o_ptr->tval)
333         {
334         case TV_SWORD:
335         case TV_HAFTED:
336         case TV_POLEARM:
337         case TV_DIGGING:
338         {
339                 return (TRUE);
340         }
341         }
342
343         return (FALSE);
344 }
345
346 /*!
347 * @brief 呪術領域の各処理に使える呪われた装備かどうかを返す。 / An "item_tester_hook" for offer
348 * @param o_ptr オブジェクト構造体の参照ポインタ
349 * @return 使える装備ならばTRUEを返す
350 */
351 bool item_tester_hook_cursed(object_type *o_ptr)
352 {
353         return (bool)(object_is_cursed(o_ptr));
354 }
355
356
357 /*!
358 * @brief アイテムが並の価値のアイテムかどうか判定する /
359 * Check if an object is nameless weapon or armour
360 * @param o_ptr 判定するアイテムの情報参照ポインタ
361 * @return 並ならばTRUEを返す
362 */
363 bool item_tester_hook_nameless_weapon_armour(object_type *o_ptr)
364 {
365         /* Require weapon or armour */
366         if (!object_is_weapon_armour_ammo(o_ptr)) return FALSE;
367
368         /* Require nameless object if the object is well known */
369         if (object_is_known(o_ptr) && !object_is_nameless(o_ptr))
370                 return FALSE;
371
372         return TRUE;
373 }
374
375
376 /*!
377 * @brief アイテムが鑑定済みかを判定する /
378 * @param o_ptr 判定するアイテムの情報参照ポインタ
379 * @return 実際に鑑定済みならばTRUEを返す
380 */
381 bool item_tester_hook_identify(object_type *o_ptr)
382 {
383         return (bool)!object_is_known(o_ptr);
384 }
385
386 /*!
387 * @brief アイテムが鑑定済みの武器防具かを判定する /
388 * @param o_ptr 判定するアイテムの情報参照ポインタ
389 * @return 実際に鑑定済みならばTRUEを返す
390 */
391 bool item_tester_hook_identify_weapon_armour(object_type *o_ptr)
392 {
393         if (object_is_known(o_ptr))
394                 return FALSE;
395         return object_is_weapon_armour_ammo(o_ptr);
396 }
397
398 /*!
399 * @brief アイテムが*鑑定*済みかを判定する /
400 * @param o_ptr 判定するアイテムの情報参照ポインタ
401 * @return 実際に鑑定済みならばTRUEを返す
402 */
403 bool item_tester_hook_identify_fully(object_type *o_ptr)
404 {
405         return (bool)(!object_is_known(o_ptr) || !(o_ptr->ident & IDENT_MENTAL));
406 }
407
408 /*!
409 * @brief アイテムが*鑑定*済みの武器防具かを判定する /
410 * @param o_ptr 判定するアイテムの情報参照ポインタ
411 * @return 実際に鑑定済みならばTRUEを返す
412 */
413 bool item_tester_hook_identify_fully_weapon_armour(object_type *o_ptr)
414 {
415         if (!item_tester_hook_identify_fully(o_ptr))
416                 return FALSE;
417         return object_is_weapon_armour_ammo(o_ptr);
418 }
419
420
421 /*!
422 * @brief 魔力充填が可能なアイテムかどうか判定する /
423 * Hook for "get_item()".  Determine if something is rechargable.
424 * @param o_ptr 判定するアイテムの情報参照ポインタ
425 * @return 魔力充填が可能ならばTRUEを返す
426 */
427 bool item_tester_hook_recharge(object_type *o_ptr)
428 {
429         /* Recharge staffs */
430         if (o_ptr->tval == TV_STAFF) return (TRUE);
431
432         /* Recharge wands */
433         if (o_ptr->tval == TV_WAND) return (TRUE);
434
435         /* Hack -- Recharge rods */
436         if (o_ptr->tval == TV_ROD) return (TRUE);
437
438         return (FALSE);
439 }