OSDN Git Service

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