OSDN Git Service

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