OSDN Git Service

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