OSDN Git Service

[Refactor] #37353 object_is_quest_target() to object-hook.c.
[hengband/hengband.git] / src / object-hook.c
1 
2 #include "angband.h"
3 #include "object-hook.h"
4 #include "artifact.h"
5
6 /*!
7 * @brief 対象のアイテムが矢やクロスボウの矢の材料になるかを返す。/
8 * Hook to determine if an object is contertible in an arrow/bolt
9 * @param o_ptr オブジェクトの構造体の参照ポインタ。
10 * @return 材料にできるならTRUEを返す
11 */
12 bool item_tester_hook_convertible(object_type *o_ptr)
13 {
14         if ((o_ptr->tval == TV_JUNK) || (o_ptr->tval == TV_SKELETON)) return TRUE;
15
16         if ((o_ptr->tval == TV_CORPSE) && (o_ptr->sval == SV_SKELETON)) return TRUE;
17         /* Assume not */
18         return (FALSE);
19 }
20
21 /*!
22 * @brief 武器匠の「武器」鑑定対象になるかを判定する。/ Hook to specify "weapon"
23 * @param o_ptr オブジェクトの構造体の参照ポインタ。
24 * @return 対象になるならTRUEを返す。
25 */
26 bool item_tester_hook_orthodox_melee_weapons(object_type *o_ptr)
27 {
28         switch (o_ptr->tval)
29         {
30         case TV_HAFTED:
31         case TV_POLEARM:
32         case TV_DIGGING:
33         {
34                 return (TRUE);
35         }
36         case TV_SWORD:
37         {
38                 if (o_ptr->sval != SV_DOKUBARI) return (TRUE);
39         }
40         }
41
42         return (FALSE);
43 }
44
45 /*!
46 * @brief オブジェクトが右手か左手に装備できる武器かどうかの判定
47 * @param o_ptr 判定するオブジェクトの構造体参照ポインタ
48 * @return 右手か左手の武器として装備できるならばTRUEを返す。
49 */
50 bool item_tester_hook_melee_weapon(object_type *o_ptr)
51 {
52         /* Check for a usable slot */
53         if ((o_ptr->tval >= TV_DIGGING) && (o_ptr->tval <= TV_SWORD)) return (TRUE);
54
55         /* Assume not wearable */
56         return (FALSE);
57 }
58
59
60 /*!
61 * @brief 武器匠の「矢弾」鑑定対象になるかを判定する。/ Hook to specify "weapon"
62 * @param o_ptr オブジェクトの構造体の参照ポインタ。
63 * @return 対象になるならTRUEを返す。
64 */
65 bool item_tester_hook_ammo(object_type *o_ptr)
66 {
67         switch (o_ptr->tval)
68         {
69         case TV_SHOT:
70         case TV_ARROW:
71         case TV_BOLT:
72         {
73                 return (TRUE);
74         }
75         }
76
77         return (FALSE);
78 }
79
80 /*!
81 * @brief 修復対象となる壊れた武器かを判定する。 / Hook to specify "broken weapon"
82 * @param o_ptr オブジェクトの構造体の参照ポインタ。
83 * @return 修復対象になるならTRUEを返す。
84 */
85 bool item_tester_hook_broken_weapon(object_type *o_ptr)
86 {
87         if (o_ptr->tval != TV_SWORD) return FALSE;
88
89         switch (o_ptr->sval)
90         {
91         case SV_BROKEN_DAGGER:
92         case SV_BROKEN_SWORD:
93                 return TRUE;
94         }
95
96         return FALSE;
97 }
98
99 /*!
100 * @brief オブジェクトが投射可能な武器かどうかを返す。
101 * @param o_ptr 判定するオブジェクトの構造体参照ポインタ
102 * @return 投射可能な武器ならばTRUE
103 */
104 bool item_tester_hook_boomerang(object_type *o_ptr)
105 {
106         if ((o_ptr->tval == TV_DIGGING) || (o_ptr->tval == TV_SWORD) || (o_ptr->tval == TV_POLEARM) || (o_ptr->tval == TV_HAFTED)) return (TRUE);
107
108         /* Assume not */
109         return (FALSE);
110 }
111
112 /*!
113 * @brief オブジェクトをプレイヤーが食べることができるかを判定する /
114 * Hook to determine if an object is eatable
115 * @param o_ptr 判定したいオブジェクトの構造体参照ポインタ
116 * @return 食べることが可能ならばTRUEを返す
117 */
118 bool item_tester_hook_eatable(object_type *o_ptr)
119 {
120         if (o_ptr->tval == TV_FOOD) return TRUE;
121
122 #if 0
123         if (prace_is_(RACE_SKELETON))
124         {
125                 if (o_ptr->tval == TV_SKELETON ||
126                         (o_ptr->tval == TV_CORPSE && o_ptr->sval == SV_SKELETON))
127                         return TRUE;
128         }
129         else
130 #endif
131
132         if (prace_is_(RACE_SKELETON) ||
133                 prace_is_(RACE_GOLEM) ||
134                 prace_is_(RACE_ZOMBIE) ||
135                 prace_is_(RACE_SPECTRE))
136         {
137                 if (o_ptr->tval == TV_STAFF || o_ptr->tval == TV_WAND)
138                         return TRUE;
139         }
140         else if (prace_is_(RACE_DEMON) || (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         object_flags(o_ptr, flgs);
181
182         /* Check activation flag */
183         if (have_flag(flgs, TR_ACTIVATE)) return (TRUE);
184
185         /* Assume not */
186         return (FALSE);
187 }
188
189 /*!
190 * @brief オブジェクトを防具として装備できるかの判定 / The "wearable" tester
191 * @param o_ptr 判定するオブジェクトの構造体参照ポインタ
192 * @return オブジェクトが防具として装備できるならTRUEを返す。
193 */
194 bool item_tester_hook_wear(object_type *o_ptr)
195 {
196         if ((o_ptr->tval == TV_SOFT_ARMOR) && (o_ptr->sval == SV_ABUNAI_MIZUGI))
197                 if (p_ptr->psex == SEX_MALE) return FALSE;
198
199         /* Check for a usable slot */
200         if (wield_slot(o_ptr) >= INVEN_RARM) return (TRUE);
201
202         /* Assume not wearable */
203         return (FALSE);
204 }
205
206
207 /*!
208 * @brief オブジェクトをプレイヤーが簡易使用コマンドで利用できるかを判定する /
209 * Hook to determine if an object is useable
210 * @param o_ptr 判定したいオブジェクトの構造体参照ポインタ
211 * @return 利用可能ならばTRUEを返す
212 */
213 bool item_tester_hook_use(object_type *o_ptr)
214 {
215         BIT_FLAGS flgs[TR_FLAG_SIZE];
216
217         /* Ammo */
218         if (o_ptr->tval == p_ptr->tval_ammo)
219                 return (TRUE);
220
221         /* Useable object */
222         switch (o_ptr->tval)
223         {
224         case TV_SPIKE:
225         case TV_STAFF:
226         case TV_WAND:
227         case TV_ROD:
228         case TV_SCROLL:
229         case TV_POTION:
230         case TV_FOOD:
231         {
232                 return (TRUE);
233         }
234
235         default:
236         {
237                 int i;
238
239                 /* Not known */
240                 if (!object_is_known(o_ptr)) return (FALSE);
241
242                 /* HACK - only items from the equipment can be activated */
243                 for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
244                 {
245                         if (&inventory[i] == o_ptr)
246                         {
247                                 object_flags(o_ptr, flgs);
248
249                                 /* Check activation flag */
250                                 if (have_flag(flgs, TR_ACTIVATE)) return (TRUE);
251                         }
252                 }
253         }
254         }
255
256         /* Assume not */
257         return (FALSE);
258 }
259
260
261 /*!
262 * @brief オブジェクトをプレイヤーが飲むことができるかを判定する /
263 * Hook to determine if an object can be quaffed
264 * @param o_ptr 判定したいオブジェクトの構造体参照ポインタ
265 * @return 飲むことが可能ならばTRUEを返す
266 */
267 bool item_tester_hook_quaff(object_type *o_ptr)
268 {
269         if (o_ptr->tval == TV_POTION) return TRUE;
270
271         if (prace_is_(RACE_ANDROID))
272         {
273                 if (o_ptr->tval == TV_FLASK && o_ptr->sval == SV_FLASK_OIL)
274                         return TRUE;
275         }
276         return FALSE;
277 }
278
279
280 /*!
281 * @brief オブジェクトをプレイヤーが読むことができるかを判定する /
282 * Hook to determine if an object is readable
283 * @param o_ptr 判定したいオブジェクトの構造体参照ポインタ
284 * @return 読むことが可能ならばTRUEを返す
285 */
286 bool item_tester_hook_readable(object_type *o_ptr)
287 {
288         if ((o_ptr->tval == TV_SCROLL) || (o_ptr->tval == TV_PARCHMENT) || (o_ptr->name1 == ART_GHB) || (o_ptr->name1 == ART_POWER)) return (TRUE);
289
290         /* Assume not */
291         return (FALSE);
292 }
293
294
295 /*!
296 * @brief エッセンスの付加可能な武器や矢弾かを返す
297 * @param o_ptr チェックしたいオブジェクトの構造体参照ポインタ
298 * @return エッセンスの付加可能な武器か矢弾ならばTRUEを返す。
299 */
300 bool item_tester_hook_melee_ammo(object_type *o_ptr)
301 {
302         switch (o_ptr->tval)
303         {
304         case TV_HAFTED:
305         case TV_POLEARM:
306         case TV_DIGGING:
307         case TV_BOLT:
308         case TV_ARROW:
309         case TV_SHOT:
310         {
311                 return (TRUE);
312         }
313         case TV_SWORD:
314         {
315                 if (o_ptr->sval != SV_DOKUBARI) return (TRUE);
316         }
317         }
318
319         return (FALSE);
320 }
321
322 /*!
323 * @brief 呪術領域の武器呪縛の対象にできる武器かどうかを返す。 / An "item_tester_hook" for offer
324 * @param o_ptr オブジェクト構造体の参照ポインタ
325 * @return 呪縛可能な武器ならばTRUEを返す
326 */
327 bool item_tester_hook_weapon_except_bow(object_type *o_ptr)
328 {
329         switch (o_ptr->tval)
330         {
331         case TV_SWORD:
332         case TV_HAFTED:
333         case TV_POLEARM:
334         case TV_DIGGING:
335         {
336                 return (TRUE);
337         }
338         }
339
340         return (FALSE);
341 }
342
343 /*!
344 * @brief 呪術領域の各処理に使える呪われた装備かどうかを返す。 / An "item_tester_hook" for offer
345 * @param o_ptr オブジェクト構造体の参照ポインタ
346 * @return 使える装備ならばTRUEを返す
347 */
348 bool item_tester_hook_cursed(object_type *o_ptr)
349 {
350         return (bool)(object_is_cursed(o_ptr));
351 }
352
353
354 /*!
355 * @brief アイテムが並の価値のアイテムかどうか判定する /
356 * Check if an object is nameless weapon or armour
357 * @param o_ptr 判定するアイテムの情報参照ポインタ
358 * @return 並ならばTRUEを返す
359 */
360 bool item_tester_hook_nameless_weapon_armour(object_type *o_ptr)
361 {
362         /* Require weapon or armour */
363         if (!object_is_weapon_armour_ammo(o_ptr)) return FALSE;
364
365         /* Require nameless object if the object is well known */
366         if (object_is_known(o_ptr) && !object_is_nameless(o_ptr))
367                 return FALSE;
368
369         return TRUE;
370 }
371
372
373 /*!
374 * @brief アイテムが鑑定済みかを判定する /
375 * @param o_ptr 判定するアイテムの情報参照ポインタ
376 * @return 実際に鑑定済みならばTRUEを返す
377 */
378 bool item_tester_hook_identify(object_type *o_ptr)
379 {
380         return (bool)!object_is_known(o_ptr);
381 }
382
383 /*!
384 * @brief アイテムが鑑定済みの武器防具かを判定する /
385 * @param o_ptr 判定するアイテムの情報参照ポインタ
386 * @return 実際に鑑定済みならばTRUEを返す
387 */
388 bool item_tester_hook_identify_weapon_armour(object_type *o_ptr)
389 {
390         if (object_is_known(o_ptr))
391                 return FALSE;
392         return object_is_weapon_armour_ammo(o_ptr);
393 }
394
395 /*!
396 * @brief アイテムが*鑑定*済みかを判定する /
397 * @param o_ptr 判定するアイテムの情報参照ポインタ
398 * @return 実際に鑑定済みならばTRUEを返す
399 */
400 bool item_tester_hook_identify_fully(object_type *o_ptr)
401 {
402         return (bool)(!object_is_known(o_ptr) || !(o_ptr->ident & IDENT_MENTAL));
403 }
404
405 /*!
406 * @brief アイテムが*鑑定*済みの武器防具かを判定する /
407 * @param o_ptr 判定するアイテムの情報参照ポインタ
408 * @return 実際に鑑定済みならばTRUEを返す
409 */
410 bool item_tester_hook_identify_fully_weapon_armour(object_type *o_ptr)
411 {
412         if (!item_tester_hook_identify_fully(o_ptr))
413                 return FALSE;
414         return object_is_weapon_armour_ammo(o_ptr);
415 }
416
417
418 /*!
419 * @brief 魔力充填が可能なアイテムかどうか判定する /
420 * Hook for "get_item()".  Determine if something is rechargable.
421 * @param o_ptr 判定するアイテムの情報参照ポインタ
422 * @return 魔力充填が可能ならばTRUEを返す
423 */
424 bool item_tester_hook_recharge(object_type *o_ptr)
425 {
426         /* Recharge staffs */
427         if (o_ptr->tval == TV_STAFF) return (TRUE);
428
429         /* Recharge wands */
430         if (o_ptr->tval == TV_WAND) return (TRUE);
431
432         /* Hack -- Recharge rods */
433         if (o_ptr->tval == TV_ROD) return (TRUE);
434
435         return (FALSE);
436 }
437
438 /*!
439  * @brief オブジェクトがプレイヤーが使用可能な魔道書かどうかを判定する
440  * @param o_ptr 判定したいオブ会ジェクトの構造体参照ポインタ
441  * @return 学習できる魔道書ならばTRUEを返す
442  */
443 bool item_tester_learn_spell(object_type *o_ptr)
444 {
445         s32b choices = realm_choices2[p_ptr->pclass];
446
447         if (p_ptr->pclass == CLASS_PRIEST)
448         {
449                 if (is_good_realm(p_ptr->realm1))
450                 {
451                         choices &= ~(CH_DEATH | CH_DAEMON);
452                 }
453                 else
454                 {
455                         choices &= ~(CH_LIFE | CH_CRUSADE);
456                 }
457         }
458
459         if ((o_ptr->tval < TV_LIFE_BOOK) || (o_ptr->tval > (TV_LIFE_BOOK + MAX_REALM - 1))) return (FALSE);
460         if ((o_ptr->tval == TV_MUSIC_BOOK) && (p_ptr->pclass == CLASS_BARD)) return (TRUE);
461         else if (!is_magic(tval2realm(o_ptr->tval))) return FALSE;
462         if ((REALM1_BOOK == o_ptr->tval) || (REALM2_BOOK == o_ptr->tval)) return (TRUE);
463         if (choices & (0x0001 << (tval2realm(o_ptr->tval) - 1))) return (TRUE);
464         return (FALSE);
465 }
466
467 /*!
468  * @brief オブジェクトが高位の魔法書かどうかを判定する
469  * @param o_ptr 判定したいオブジェクトの構造体参照ポインタ
470  * @return オブジェクトが高位の魔法書ならばTRUEを返す
471  */
472 bool item_tester_high_level_book(object_type *o_ptr)
473 {
474         if ((o_ptr->tval == TV_LIFE_BOOK) ||
475                 (o_ptr->tval == TV_SORCERY_BOOK) ||
476                 (o_ptr->tval == TV_NATURE_BOOK) ||
477                 (o_ptr->tval == TV_CHAOS_BOOK) ||
478                 (o_ptr->tval == TV_DEATH_BOOK) ||
479                 (o_ptr->tval == TV_TRUMP_BOOK) ||
480                 (o_ptr->tval == TV_CRAFT_BOOK) ||
481                 (o_ptr->tval == TV_DAEMON_BOOK) ||
482                 (o_ptr->tval == TV_CRUSADE_BOOK) ||
483                 (o_ptr->tval == TV_MUSIC_BOOK) ||
484                 (o_ptr->tval == TV_HEX_BOOK))
485         {
486                 if (o_ptr->sval > 1)
487                         return TRUE;
488                 else
489                         return FALSE;
490         }
491
492         return FALSE;
493 }
494
495 /*!
496  * @brief オブジェクトがランタンの燃料になるかどうかを判定する
497  * An "item_tester_hook" for refilling lanterns
498  * @param o_ptr 判定したいオブジェクトの構造体参照ポインタ
499  * @return オブジェクトがランタンの燃料になるならばTRUEを返す
500  */
501 bool item_tester_refill_lantern(object_type *o_ptr)
502 {
503         /* Flasks of oil are okay */
504         if (o_ptr->tval == TV_FLASK) return (TRUE);
505
506         /* Laterns are okay */
507         if ((o_ptr->tval == TV_LITE) &&
508                 (o_ptr->sval == SV_LITE_LANTERN)) return (TRUE);
509
510         /* Assume not okay */
511         return (FALSE);
512 }
513
514
515 /*!
516  * @brief オブジェクトが薬であるかを返す
517  * @param o_ptr 対象のオブジェクト構造体ポインタ
518  * @return オブジェクトが薬ならばTRUEを返す
519  */
520 bool object_is_potion(object_type *o_ptr)
521 {
522         return (k_info[o_ptr->k_idx].tval == TV_POTION);
523 }
524
525
526 /*!
527  * @brief オブジェクトが賞金首の報酬対象になるかを返す
528  * @param o_ptr 対象のオブジェクト構造体ポインタ
529  * @return オブジェクトが報酬対象になるならTRUEを返す
530  */
531 bool object_is_shoukinkubi(object_type *o_ptr)
532 {
533         int i;
534
535         /* Require corpse or skeleton */
536         if (o_ptr->tval != TV_CORPSE) return FALSE;
537
538         /* No wanted monsters in vanilla town */
539         if (vanilla_town) return FALSE;
540
541         /* Today's wanted */
542         if (p_ptr->today_mon > 0 && (streq(r_name + r_info[o_ptr->pval].name, r_name + r_info[today_mon].name))) return TRUE;
543
544         /* Tsuchinoko */
545         if (o_ptr->pval == MON_TSUCHINOKO) return TRUE;
546
547         /* Unique monster */
548         for (i = 0; i < MAX_KUBI; i++)
549                 if (o_ptr->pval == current_world_ptr->bounty_r_idx[i]) break;
550         if (i < MAX_KUBI) return TRUE;
551
552         /* Not wanted */
553         return FALSE;
554 }
555
556 /*!
557  * @brief オブジェクトがプレイヤーの職業に応じた適正武器か否かを返す / Favorite weapons
558  * @param o_ptr 対象のオブジェクト構造体ポインタ
559  * @return オブジェクトが適正武器ならばTRUEを返す
560  */
561 bool object_is_favorite(object_type *o_ptr)
562 {
563         /* Only melee weapons match */
564         if (!(o_ptr->tval == TV_POLEARM ||
565                 o_ptr->tval == TV_SWORD ||
566                 o_ptr->tval == TV_DIGGING ||
567                 o_ptr->tval == TV_HAFTED))
568         {
569                 return FALSE;
570         }
571
572         /* Favorite weapons are varied depend on the class */
573         switch (p_ptr->pclass)
574         {
575         case CLASS_PRIEST:
576         {
577                 BIT_FLAGS flgs[TR_FLAG_SIZE];
578                 object_flags_known(o_ptr, flgs);
579
580                 if (!have_flag(flgs, TR_BLESSED) &&
581                         !(o_ptr->tval == TV_HAFTED))
582                         return FALSE;
583                 break;
584         }
585
586         case CLASS_MONK:
587         case CLASS_FORCETRAINER:
588                 /* Icky to wield? */
589                 if (!(s_info[p_ptr->pclass].w_max[o_ptr->tval - TV_WEAPON_BEGIN][o_ptr->sval]))
590                         return FALSE;
591                 break;
592
593         case CLASS_BEASTMASTER:
594         case CLASS_CAVALRY:
595         {
596                 BIT_FLAGS flgs[TR_FLAG_SIZE];
597                 object_flags_known(o_ptr, flgs);
598
599                 /* Is it known to be suitable to using while riding? */
600                 if (!(have_flag(flgs, TR_RIDING)))
601                         return FALSE;
602
603                 break;
604         }
605
606         case CLASS_NINJA:
607                 /* Icky to wield? */
608                 if (s_info[p_ptr->pclass].w_max[o_ptr->tval - TV_WEAPON_BEGIN][o_ptr->sval] <= WEAPON_EXP_BEGINNER)
609                         return FALSE;
610                 break;
611
612         default:
613                 /* All weapons are okay for non-special classes */
614                 return TRUE;
615         }
616
617         return TRUE;
618 }
619
620
621 /*!
622  * @brief オブジェクトがレアアイテムかどうかを返す /
623  * Rare weapons/aromors including Blade of Chaos, Dragon armors, etc.
624  * @param o_ptr 対象のオブジェクト構造体ポインタ
625  * @return レアアイテムならばTRUEを返す
626  */
627 bool object_is_rare(object_type *o_ptr)
628 {
629         switch (o_ptr->tval)
630         {
631         case TV_HAFTED:
632                 if (o_ptr->sval == SV_MACE_OF_DISRUPTION ||
633                         o_ptr->sval == SV_WIZSTAFF) return TRUE;
634                 break;
635
636         case TV_POLEARM:
637                 if (o_ptr->sval == SV_SCYTHE_OF_SLICING ||
638                         o_ptr->sval == SV_DEATH_SCYTHE) return TRUE;
639                 break;
640
641         case TV_SWORD:
642                 if (o_ptr->sval == SV_BLADE_OF_CHAOS ||
643                         o_ptr->sval == SV_DIAMOND_EDGE ||
644                         o_ptr->sval == SV_DOKUBARI ||
645                         o_ptr->sval == SV_HAYABUSA) return TRUE;
646                 break;
647
648         case TV_SHIELD:
649                 if (o_ptr->sval == SV_DRAGON_SHIELD ||
650                         o_ptr->sval == SV_MIRROR_SHIELD) return TRUE;
651                 break;
652
653         case TV_HELM:
654                 if (o_ptr->sval == SV_DRAGON_HELM) return TRUE;
655                 break;
656
657         case TV_BOOTS:
658                 if (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE) return TRUE;
659                 break;
660
661         case TV_CLOAK:
662                 if (o_ptr->sval == SV_ELVEN_CLOAK ||
663                         o_ptr->sval == SV_ETHEREAL_CLOAK ||
664                         o_ptr->sval == SV_SHADOW_CLOAK) return TRUE;
665                 break;
666
667         case TV_GLOVES:
668                 if (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES) return TRUE;
669                 break;
670
671         case TV_SOFT_ARMOR:
672                 if (o_ptr->sval == SV_KUROSHOUZOKU ||
673                         o_ptr->sval == SV_ABUNAI_MIZUGI) return TRUE;
674                 break;
675
676         case TV_DRAG_ARMOR:
677                 return TRUE;
678
679         default:
680                 break;
681         }
682
683         /* Any others are not "rare" objects. */
684         return FALSE;
685 }
686
687
688 /*!
689  * @brief オブジェクトが武器として装備できるかどうかを返す / Check if an object is weapon (including bows and ammo)
690  * @param o_ptr 対象のオブジェクト構造体ポインタ
691  * @return 武器として使えるならばTRUEを返す
692  */
693 bool object_is_weapon(object_type *o_ptr)
694 {
695         if (TV_WEAPON_BEGIN <= o_ptr->tval && o_ptr->tval <= TV_WEAPON_END) return TRUE;
696
697         return FALSE;
698 }
699
700
701 /*!
702  * @brief オブジェクトが武器や矢弾として使用できるかを返す / Check if an object is weapon (including bows and ammo)
703  * Rare weapons/aromors including Blade of Chaos, Dragon armors, etc.
704  * @param o_ptr 対象のオブジェクト構造体ポインタ
705  * @return 武器や矢弾として使えるならばTRUEを返す
706  */
707 bool object_is_weapon_ammo(object_type *o_ptr)
708 {
709         if (TV_MISSILE_BEGIN <= o_ptr->tval && o_ptr->tval <= TV_WEAPON_END) return TRUE;
710
711         return FALSE;
712 }
713
714 /*!
715  * @brief オブジェクトが矢弾として使用できるかどうかを返す / Check if an object is ammo
716  * @param o_ptr 対象のオブジェクト構造体ポインタ
717  * @return 矢弾として使えるならばTRUEを返す
718  */
719 bool object_is_ammo(object_type *o_ptr)
720 {
721         if (TV_MISSILE_BEGIN <= o_ptr->tval && o_ptr->tval <= TV_MISSILE_END) return TRUE;
722
723         return FALSE;
724 }
725
726 /*!
727  * @brief オブジェクトが防具として装備できるかどうかを返す / Check if an object is armour
728  * @param o_ptr 対象のオブジェクト構造体ポインタ
729  * @return 矢弾として使えるならばTRUEを返す
730  */
731 bool object_is_armour(object_type *o_ptr)
732 {
733         if (TV_ARMOR_BEGIN <= o_ptr->tval && o_ptr->tval <= TV_ARMOR_END) return TRUE;
734
735         return FALSE;
736 }
737
738 /*!
739  * @brief オブジェクトが武器、防具、矢弾として使用できるかを返す / Check if an object is weapon, armour or ammo
740  * @param o_ptr 対象のオブジェクト構造体ポインタ
741  * @return 武器、防具、矢弾として使えるならばTRUEを返す
742  */
743 bool object_is_weapon_armour_ammo(object_type *o_ptr)
744 {
745         if (object_is_weapon_ammo(o_ptr) || object_is_armour(o_ptr)) return TRUE;
746
747         return FALSE;
748 }
749
750
751 /*!
752  * @brief オブジェクトが近接武器として装備できるかを返す / Melee weapons
753  * @param o_ptr 対象のオブジェクト構造体ポインタ
754  * @return 近接武器として使えるならばTRUEを返す
755  */
756 bool object_is_melee_weapon(object_type *o_ptr)
757 {
758         if (TV_DIGGING <= o_ptr->tval && o_ptr->tval <= TV_SWORD) return TRUE;
759
760         return FALSE;
761 }
762
763
764 /*!
765  * @brief オブジェクトが装備可能であるかを返す / Wearable including all weapon, all armour, bow, light source, amulet, and ring
766  * @param o_ptr 対象のオブジェクト構造体ポインタ
767  * @return 装備可能ならばTRUEを返す
768  */
769 bool object_is_wearable(object_type *o_ptr)
770 {
771         if (TV_WEARABLE_BEGIN <= o_ptr->tval && o_ptr->tval <= TV_WEARABLE_END) return TRUE;
772
773         return FALSE;
774 }
775
776
777 /*!
778  * @brief オブジェクトが装備品であるかを返す(object_is_wearableに矢弾を含む) / Equipment including all wearable objects and ammo
779  * @param o_ptr 対象のオブジェクト構造体ポインタ
780  * @return 装備品ならばTRUEを返す
781  */
782 bool object_is_equipment(object_type *o_ptr)
783 {
784         if (TV_EQUIP_BEGIN <= o_ptr->tval && o_ptr->tval <= TV_EQUIP_END) return TRUE;
785
786         return FALSE;
787 }
788
789
790 /*!
791  * @brief オブジェクトが強化不能武器であるかを返す / Poison needle can not be enchanted
792  * @param o_ptr 対象のオブジェクト構造体ポインタ
793  * @return 強化不能ならばTRUEを返す
794  */
795 bool object_refuse_enchant_weapon(object_type *o_ptr)
796 {
797         if (o_ptr->tval == TV_SWORD && o_ptr->sval == SV_DOKUBARI) return TRUE;
798
799         return FALSE;
800 }
801
802
803 /*!
804  * @brief オブジェクトが強化可能武器であるかを返す /
805  * Check if an object is weapon (including bows and ammo) and allows enchantment
806  * @param o_ptr 対象のオブジェクト構造体ポインタ
807  * @return 強化可能ならばTRUEを返す
808  */
809 bool object_allow_enchant_weapon(object_type *o_ptr)
810 {
811         if (object_is_weapon_ammo(o_ptr) && !object_refuse_enchant_weapon(o_ptr)) return TRUE;
812
813         return FALSE;
814 }
815
816
817 /*!
818  * @brief オブジェクトが強化可能な近接武器であるかを返す /
819  * Check if an object is melee weapon and allows enchantment
820  * @param o_ptr 対象のオブジェクト構造体ポインタ
821  * @return 強化可能な近接武器ならばTRUEを返す
822  */
823 bool object_allow_enchant_melee_weapon(object_type *o_ptr)
824 {
825         if (object_is_melee_weapon(o_ptr) && !object_refuse_enchant_weapon(o_ptr)) return TRUE;
826
827         return FALSE;
828 }
829
830
831 /*!
832  * @brief オブジェクトが鍛冶師のエッセンス付加済みかを返す /
833  * Check if an object is made by a smith's special ability
834  * @param o_ptr 対象のオブジェクト構造体ポインタ
835  * @return エッセンス付加済みならばTRUEを返す
836  */
837 bool object_is_smith(object_type *o_ptr)
838 {
839         if (object_is_weapon_armour_ammo(o_ptr) && o_ptr->xtra3) return TRUE;
840
841         return FALSE;
842 }
843
844 /*!
845  * @brief オブジェクトがアーティファクトかを返す /
846  * Check if an object is artifact
847  * @param o_ptr 対象のオブジェクト構造体ポインタ
848  * @return アーティファクトならばTRUEを返す
849  */
850 bool object_is_artifact(object_type *o_ptr)
851 {
852         if (object_is_fixed_artifact(o_ptr) || o_ptr->art_name) return TRUE;
853
854         return FALSE;
855 }
856
857
858 /*!
859  * @brief オブジェクトがランダムアーティファクトかを返す /
860  * Check if an object is random artifact
861  * @param o_ptr 対象のオブジェクト構造体ポインタ
862  * @return ランダムアーティファクトならばTRUEを返す
863  */
864 bool object_is_random_artifact(object_type *o_ptr)
865 {
866         if (object_is_artifact(o_ptr) && !object_is_fixed_artifact(o_ptr)) return TRUE;
867
868         return FALSE;
869 }
870
871 /*!
872  * @brief オブジェクトが通常のアイテム(アーティファクト、エゴ、鍛冶師エッセンス付加いずれでもない)かを返す /
873  * Check if an object is neither artifact, ego, nor 'smith' object
874  * @param o_ptr 対象のオブジェクト構造体ポインタ
875  * @return 通常のアイテムならばTRUEを返す
876  */
877 bool object_is_nameless(object_type *o_ptr)
878 {
879         if (!object_is_artifact(o_ptr) && !object_is_ego(o_ptr) && !object_is_smith(o_ptr))
880                 return TRUE;
881
882         return FALSE;
883 }
884
885 /*!
886  * @brief オブジェクトが両手持ち可能な武器かを返す /
887  * Check if an object is melee weapon and allows wielding with two-hands
888  * @param o_ptr 対象のオブジェクト構造体ポインタ
889  * @return 両手持ち可能ならばTRUEを返す
890  */
891 bool object_allow_two_hands_wielding(object_type *o_ptr)
892 {
893         if (object_is_melee_weapon(o_ptr) && ((o_ptr->weight > 99) || (o_ptr->tval == TV_POLEARM))) return TRUE;
894
895         return FALSE;
896 }
897
898 /*!
899  * @brief オブジェクトが松明に束ねられるかどうかを判定する
900  * An "item_tester_hook" for refilling torches
901  * @param o_ptr 判定したいオブジェクトの構造体参照ポインタ
902  * @return オブジェクトが松明に束ねられるならばTRUEを返す
903  */
904 bool object_can_refill_torch(object_type *o_ptr)
905 {
906         /* Torches are okay */
907         if ((o_ptr->tval == TV_LITE) &&
908                 (o_ptr->sval == SV_LITE_TORCH)) return (TRUE);
909
910         /* Assume not okay */
911         return (FALSE);
912 }
913
914
915 /*!
916  * @brief 破壊可能なアイテムかを返す /
917  * Determines whether an object can be destroyed, and makes fake inscription.
918  * @param o_ptr 破壊可能かを確認したいオブジェクトの構造体参照ポインタ
919  * @return オブジェクトが破壊可能ならばTRUEを返す
920  */
921 bool can_player_destroy_object(object_type *o_ptr)
922 {
923         /* Artifacts cannot be destroyed */
924         if (!object_is_artifact(o_ptr)) return TRUE;
925
926         /* If object is unidentified, makes fake inscription */
927         if (!object_is_known(o_ptr))
928         {
929                 byte feel = FEEL_SPECIAL;
930
931                 /* Hack -- Handle icky artifacts */
932                 if (object_is_cursed(o_ptr) || object_is_broken(o_ptr)) feel = FEEL_TERRIBLE;
933
934                 /* Hack -- inscribe the artifact */
935                 o_ptr->feeling = feel;
936
937                 /* We have "felt" it (again) */
938                 o_ptr->ident |= (IDENT_SENSE);
939                 p_ptr->update |= (PU_COMBINE);
940                 p_ptr->window |= (PW_INVEN | PW_EQUIP);
941
942                 return FALSE;
943         }
944
945         /* Identified artifact -- Nothing to do */
946         return FALSE;
947 }
948
949 /*!
950  * @brief オブジェクトがクエストの達成目的か否かを返す。
951  * @param o_ptr 特性短縮表記を得たいオブジェクト構造体の参照ポインタ
952  * @return 現在クエスト達成目的のアイテムならばTRUEを返す。
953  */
954 bool object_is_quest_target(object_type *o_ptr)
955 {
956         if (p_ptr->inside_quest)
957         {
958                 ARTIFACT_IDX a_idx = quest[p_ptr->inside_quest].k_idx;
959                 if (a_idx)
960                 {
961                         artifact_type *a_ptr = &a_info[a_idx];
962                         if (!(a_ptr->gen_flags & TRG_INSTA_ART))
963                         {
964                                 if ((o_ptr->tval == a_ptr->tval) && (o_ptr->sval == a_ptr->sval))
965                                 {
966                                         return TRUE;
967                                 }
968                         }
969                 }
970         }
971         return FALSE;
972 }
973