OSDN Git Service

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