OSDN Git Service

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