OSDN Git Service

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