5 #include "object-hook.h"
8 #include "player-class.h"
9 #include "player-skill.h"
10 #include "player-race.h"
13 #include "objectkind.h"
14 #include "view-mainwindow.h"
17 * @brief 対象のアイテムが矢やクロスボウの矢の材料になるかを返す。/
18 * Hook to determine if an object is contertible in an arrow/bolt
19 * @param o_ptr オブジェクトの構造体の参照ポインタ。
20 * @return 材料にできるならTRUEを返す
22 bool item_tester_hook_convertible(object_type *o_ptr)
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;
30 * @brief 武器匠の「武器」鑑定対象になるかを判定する。/ Hook to specify "weapon"
31 * @param o_ptr オブジェクトの構造体の参照ポインタ。
32 * @return 対象になるならTRUEを返す。
34 bool item_tester_hook_orthodox_melee_weapons(object_type *o_ptr)
46 if (o_ptr->sval != SV_DOKUBARI) return (TRUE);
54 * @brief オブジェクトが右手か左手に装備できる武器かどうかの判定
55 * @param o_ptr 判定するオブジェクトの構造体参照ポインタ
56 * @return 右手か左手の武器として装備できるならばTRUEを返す。
58 bool item_tester_hook_melee_weapon(object_type *o_ptr)
60 /* Check for a usable slot */
61 if ((o_ptr->tval >= TV_DIGGING) && (o_ptr->tval <= TV_SWORD)) return (TRUE);
67 * @brief 武器匠の「矢弾」鑑定対象になるかを判定する。/ Hook to specify "weapon"
68 * @param o_ptr オブジェクトの構造体の参照ポインタ。
69 * @return 対象になるならTRUEを返す。
71 bool item_tester_hook_ammo(object_type *o_ptr)
87 * @brief 修復対象となる壊れた武器かを判定する。 / Hook to specify "broken weapon"
88 * @param o_ptr オブジェクトの構造体の参照ポインタ。
89 * @return 修復対象になるならTRUEを返す。
91 bool item_tester_hook_broken_weapon(object_type *o_ptr)
93 if (o_ptr->tval != TV_SWORD) return FALSE;
97 case SV_BROKEN_DAGGER:
106 * @brief オブジェクトが投射可能な武器かどうかを返す。
107 * @param o_ptr 判定するオブジェクトの構造体参照ポインタ
108 * @return 投射可能な武器ならばTRUE
110 bool item_tester_hook_boomerang(object_type *o_ptr)
112 if ((o_ptr->tval == TV_DIGGING) || (o_ptr->tval == TV_SWORD) || (o_ptr->tval == TV_POLEARM) || (o_ptr->tval == TV_HAFTED)) return (TRUE);
117 * @brief オブジェクトをプレイヤーが食べることができるかを判定する /
118 * Hook to determine if an object is eatable
119 * @param o_ptr 判定したいオブジェクトの構造体参照ポインタ
120 * @return 食べることが可能ならばTRUEを返す
122 bool item_tester_hook_eatable(object_type *o_ptr)
124 if (o_ptr->tval == TV_FOOD) return TRUE;
127 if (PRACE_IS_(p_ptr, RACE_SKELETON))
129 if (o_ptr->tval == TV_SKELETON ||
130 (o_ptr->tval == TV_CORPSE && o_ptr->sval == SV_SKELETON))
136 if (PRACE_IS_(p_ptr, RACE_SKELETON) ||
137 PRACE_IS_(p_ptr, RACE_GOLEM) ||
138 PRACE_IS_(p_ptr, RACE_ZOMBIE) ||
139 PRACE_IS_(p_ptr, RACE_SPECTRE))
141 if (o_ptr->tval == TV_STAFF || o_ptr->tval == TV_WAND)
144 else if (PRACE_IS_(p_ptr, RACE_DEMON) || (mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_DEMON))
146 if (o_ptr->tval == TV_CORPSE &&
147 o_ptr->sval == SV_CORPSE &&
148 my_strchr("pht", r_info[o_ptr->pval].d_char))
156 * @brief オブジェクトがどちらの手にも装備できる武器かどうかの判定
157 * @param o_ptr 判定するオブジェクトの構造体参照ポインタ
158 * @return 左右両方の手で装備できるならばTRUEを返す。
160 bool item_tester_hook_mochikae(object_type *o_ptr)
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);
170 * @brief オブジェクトをプレイヤーが魔道具として発動できるかを判定する /
171 * Hook to determine if an object is activatable
172 * @param o_ptr 判定したいオブジェクトの構造体参照ポインタ
173 * @return 魔道具として発動可能ならばTRUEを返す
175 bool item_tester_hook_activate(object_type *o_ptr)
177 BIT_FLAGS flgs[TR_FLAG_SIZE];
180 if (!object_is_known(o_ptr)) return (FALSE);
181 object_flags(o_ptr, flgs);
183 /* Check activation flag */
184 if (have_flag(flgs, TR_ACTIVATE)) return (TRUE);
190 * @brief オブジェクトを防具として装備できるかの判定 / The "wearable" tester
191 * @param o_ptr 判定するオブジェクトの構造体参照ポインタ
192 * @return オブジェクトが防具として装備できるならTRUEを返す。
194 bool item_tester_hook_wear(object_type *o_ptr)
196 if ((o_ptr->tval == TV_SOFT_ARMOR) && (o_ptr->sval == SV_ABUNAI_MIZUGI))
197 if (p_ptr->psex == SEX_MALE) return FALSE;
199 /* Check for a usable slot */
200 if (wield_slot(o_ptr) >= INVEN_RARM) return (TRUE);
207 * @brief オブジェクトをプレイヤーが簡易使用コマンドで利用できるかを判定する /
208 * Hook to determine if an object is useable
209 * @param o_ptr 判定したいオブジェクトの構造体参照ポインタ
210 * @return 利用可能ならばTRUEを返す
212 bool item_tester_hook_use(object_type *o_ptr)
214 BIT_FLAGS flgs[TR_FLAG_SIZE];
217 if (o_ptr->tval == p_ptr->tval_ammo)
239 if (!object_is_known(o_ptr)) return (FALSE);
241 /* HACK - only items from the equipment can be activated */
242 for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
244 if (&p_ptr->inventory_list[i] == o_ptr)
246 object_flags(o_ptr, flgs);
248 /* Check activation flag */
249 if (have_flag(flgs, TR_ACTIVATE)) return (TRUE);
260 * @brief オブジェクトをプレイヤーが飲むことができるかを判定する /
261 * Hook to determine if an object can be quaffed
262 * @param o_ptr 判定したいオブジェクトの構造体参照ポインタ
263 * @return 飲むことが可能ならばTRUEを返す
265 bool item_tester_hook_quaff(object_type *o_ptr)
267 if (o_ptr->tval == TV_POTION) return TRUE;
269 if (PRACE_IS_(p_ptr, RACE_ANDROID))
271 if (o_ptr->tval == TV_FLASK && o_ptr->sval == SV_FLASK_OIL)
279 * @brief オブジェクトをプレイヤーが読むことができるかを判定する /
280 * Hook to determine if an object is readable
281 * @param o_ptr 判定したいオブジェクトの構造体参照ポインタ
282 * @return 読むことが可能ならばTRUEを返す
284 bool item_tester_hook_readable(object_type *o_ptr)
286 if ((o_ptr->tval == TV_SCROLL) || (o_ptr->tval == TV_PARCHMENT) || (o_ptr->name1 == ART_GHB) || (o_ptr->name1 == ART_POWER)) return (TRUE);
292 * @brief エッセンスの付加可能な武器や矢弾かを返す
293 * @param o_ptr チェックしたいオブジェクトの構造体参照ポインタ
294 * @return エッセンスの付加可能な武器か矢弾ならばTRUEを返す。
296 bool item_tester_hook_melee_ammo(object_type *o_ptr)
311 if (o_ptr->sval != SV_DOKUBARI) return (TRUE);
319 * @brief 呪術領域の武器呪縛の対象にできる武器かどうかを返す。 / An "item_tester_hook" for offer
320 * @param o_ptr オブジェクト構造体の参照ポインタ
321 * @return 呪縛可能な武器ならばTRUEを返す
323 bool item_tester_hook_weapon_except_bow(object_type *o_ptr)
340 * @brief 呪術領域の各処理に使える呪われた装備かどうかを返す。 / An "item_tester_hook" for offer
341 * @param o_ptr オブジェクト構造体の参照ポインタ
342 * @return 使える装備ならばTRUEを返す
344 bool item_tester_hook_cursed(object_type *o_ptr)
346 return (bool)(object_is_cursed(o_ptr));
351 * @brief アイテムが並の価値のアイテムかどうか判定する /
352 * Check if an object is nameless weapon or armour
353 * @param o_ptr 判定するアイテムの情報参照ポインタ
354 * @return 並ならばTRUEを返す
356 bool item_tester_hook_nameless_weapon_armour(object_type *o_ptr)
358 /* Require weapon or armour */
359 if (!object_is_weapon_armour_ammo(o_ptr)) return FALSE;
361 /* Require nameless object if the object is well known */
362 if (object_is_known(o_ptr) && !object_is_nameless(o_ptr))
370 * @brief アイテムが鑑定済みかを判定する /
371 * @param o_ptr 判定するアイテムの情報参照ポインタ
372 * @return 実際に鑑定済みならばTRUEを返す
374 bool item_tester_hook_identify(object_type *o_ptr)
376 return (bool)!object_is_known(o_ptr);
380 * @brief アイテムが鑑定済みの武器防具かを判定する /
381 * @param o_ptr 判定するアイテムの情報参照ポインタ
382 * @return 実際に鑑定済みならばTRUEを返す
384 bool item_tester_hook_identify_weapon_armour(object_type *o_ptr)
386 if (object_is_known(o_ptr))
388 return object_is_weapon_armour_ammo(o_ptr);
392 * @brief アイテムが*鑑定*済みかを判定する /
393 * @param o_ptr 判定するアイテムの情報参照ポインタ
394 * @return 実際に鑑定済みならばTRUEを返す
396 bool item_tester_hook_identify_fully(object_type *o_ptr)
398 return (bool)(!object_is_known(o_ptr) || !(o_ptr->ident & IDENT_MENTAL));
402 * @brief アイテムが*鑑定*済みの武器防具かを判定する /
403 * @param o_ptr 判定するアイテムの情報参照ポインタ
404 * @return 実際に鑑定済みならばTRUEを返す
406 bool item_tester_hook_identify_fully_weapon_armour(object_type *o_ptr)
408 if (!item_tester_hook_identify_fully(o_ptr))
410 return object_is_weapon_armour_ammo(o_ptr);
415 * @brief 魔力充填が可能なアイテムかどうか判定する /
416 * Hook for "get_item()". Determine if something is rechargable.
417 * @param o_ptr 判定するアイテムの情報参照ポインタ
418 * @return 魔力充填が可能ならばTRUEを返す
420 bool item_tester_hook_recharge(object_type *o_ptr)
422 /* Recharge staffs */
423 if (o_ptr->tval == TV_STAFF) return (TRUE);
426 if (o_ptr->tval == TV_WAND) return (TRUE);
428 /* Hack -- Recharge rods */
429 if (o_ptr->tval == TV_ROD) return (TRUE);
435 * @brief オブジェクトがプレイヤーが使用可能な魔道書かどうかを判定する
436 * @param o_ptr 判定したいオブ会ジェクトの構造体参照ポインタ
437 * @return 学習できる魔道書ならばTRUEを返す
439 bool item_tester_learn_spell(object_type *o_ptr)
441 s32b choices = realm_choices2[p_ptr->pclass];
443 if (p_ptr->pclass == CLASS_PRIEST)
445 if (is_good_realm(p_ptr->realm1))
447 choices &= ~(CH_DEATH | CH_DAEMON);
451 choices &= ~(CH_LIFE | CH_CRUSADE);
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);
464 * @brief オブジェクトが高位の魔法書かどうかを判定する
465 * @param o_ptr 判定したいオブジェクトの構造体参照ポインタ
466 * @return オブジェクトが高位の魔法書ならばTRUEを返す
468 bool item_tester_high_level_book(object_type *o_ptr)
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))
492 * @brief オブジェクトがランタンの燃料になるかどうかを判定する
493 * An "item_tester_hook" for refilling lanterns
494 * @param o_ptr 判定したいオブジェクトの構造体参照ポインタ
495 * @return オブジェクトがランタンの燃料になるならばTRUEを返す
497 bool item_tester_refill_lantern(object_type *o_ptr)
499 /* Flasks of oil are okay */
500 if (o_ptr->tval == TV_FLASK) return (TRUE);
502 /* Laterns are okay */
503 if ((o_ptr->tval == TV_LITE) &&
504 (o_ptr->sval == SV_LITE_LANTERN)) return (TRUE);
506 /* Assume not okay */
512 * @brief オブジェクトが薬であるかを返す
513 * @param o_ptr 対象のオブジェクト構造体ポインタ
514 * @return オブジェクトが薬ならばTRUEを返す
516 bool object_is_potion(object_type *o_ptr)
518 return (k_info[o_ptr->k_idx].tval == TV_POTION);
523 * @brief オブジェクトが賞金首の報酬対象になるかを返す
524 * @param o_ptr 対象のオブジェクト構造体ポインタ
525 * @return オブジェクトが報酬対象になるならTRUEを返す
527 bool object_is_shoukinkubi(object_type *o_ptr)
531 /* Require corpse or skeleton */
532 if (o_ptr->tval != TV_CORPSE) return FALSE;
534 /* No wanted monsters in vanilla town */
535 if (vanilla_town) return FALSE;
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;
541 if (o_ptr->pval == MON_TSUCHINOKO) return TRUE;
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;
553 * @brief オブジェクトがプレイヤーの職業に応じた適正武器か否かを返す / Favorite weapons
554 * @param o_ptr 対象のオブジェクト構造体ポインタ
555 * @return オブジェクトが適正武器ならばTRUEを返す
557 bool object_is_favorite(object_type *o_ptr)
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))
568 /* Favorite weapons are varied depend on the class */
569 switch (p_ptr->pclass)
573 BIT_FLAGS flgs[TR_FLAG_SIZE];
574 object_flags_known(o_ptr, flgs);
576 if (!have_flag(flgs, TR_BLESSED) &&
577 !(o_ptr->tval == TV_HAFTED))
583 case CLASS_FORCETRAINER:
585 if (!(s_info[p_ptr->pclass].w_max[o_ptr->tval - TV_WEAPON_BEGIN][o_ptr->sval]))
589 case CLASS_BEASTMASTER:
592 BIT_FLAGS flgs[TR_FLAG_SIZE];
593 object_flags_known(o_ptr, flgs);
595 /* Is it known to be suitable to using while riding? */
596 if (!(have_flag(flgs, TR_RIDING)))
604 if (s_info[p_ptr->pclass].w_max[o_ptr->tval - TV_WEAPON_BEGIN][o_ptr->sval] <= WEAPON_EXP_BEGINNER)
609 /* All weapons are okay for non-special classes */
618 * @brief オブジェクトがレアアイテムかどうかを返す /
619 * Rare weapons/aromors including Blade of Chaos, Dragon armors, etc.
620 * @param o_ptr 対象のオブジェクト構造体ポインタ
621 * @return レアアイテムならばTRUEを返す
623 bool object_is_rare(object_type *o_ptr)
628 if (o_ptr->sval == SV_MACE_OF_DISRUPTION ||
629 o_ptr->sval == SV_WIZSTAFF) return TRUE;
633 if (o_ptr->sval == SV_SCYTHE_OF_SLICING ||
634 o_ptr->sval == SV_DEATH_SCYTHE) return TRUE;
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;
645 if (o_ptr->sval == SV_DRAGON_SHIELD ||
646 o_ptr->sval == SV_MIRROR_SHIELD) return TRUE;
650 if (o_ptr->sval == SV_DRAGON_HELM) return TRUE;
654 if (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE) return TRUE;
658 if (o_ptr->sval == SV_ELVEN_CLOAK ||
659 o_ptr->sval == SV_ETHEREAL_CLOAK ||
660 o_ptr->sval == SV_SHADOW_CLOAK) return TRUE;
664 if (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES) return TRUE;
668 if (o_ptr->sval == SV_KUROSHOUZOKU ||
669 o_ptr->sval == SV_ABUNAI_MIZUGI) return TRUE;
679 /* Any others are not "rare" objects. */
685 * @brief オブジェクトが武器として装備できるかどうかを返す / Check if an object is weapon (including bows and ammo)
686 * @param o_ptr 対象のオブジェクト構造体ポインタ
687 * @return 武器として使えるならばTRUEを返す
689 bool object_is_weapon(object_type *o_ptr)
691 if (TV_WEAPON_BEGIN <= o_ptr->tval && o_ptr->tval <= TV_WEAPON_END) return TRUE;
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を返す
703 bool object_is_weapon_ammo(object_type *o_ptr)
705 if (TV_MISSILE_BEGIN <= o_ptr->tval && o_ptr->tval <= TV_WEAPON_END) return TRUE;
711 * @brief オブジェクトが矢弾として使用できるかどうかを返す / Check if an object is ammo
712 * @param o_ptr 対象のオブジェクト構造体ポインタ
713 * @return 矢弾として使えるならばTRUEを返す
715 bool object_is_ammo(object_type *o_ptr)
717 if (TV_MISSILE_BEGIN <= o_ptr->tval && o_ptr->tval <= TV_MISSILE_END) return TRUE;
723 * @brief オブジェクトが防具として装備できるかどうかを返す / Check if an object is armour
724 * @param o_ptr 対象のオブジェクト構造体ポインタ
725 * @return 矢弾として使えるならばTRUEを返す
727 bool object_is_armour(object_type *o_ptr)
729 if (TV_ARMOR_BEGIN <= o_ptr->tval && o_ptr->tval <= TV_ARMOR_END) return TRUE;
735 * @brief オブジェクトが武器、防具、矢弾として使用できるかを返す / Check if an object is weapon, armour or ammo
736 * @param o_ptr 対象のオブジェクト構造体ポインタ
737 * @return 武器、防具、矢弾として使えるならばTRUEを返す
739 bool object_is_weapon_armour_ammo(object_type *o_ptr)
741 if (object_is_weapon_ammo(o_ptr) || object_is_armour(o_ptr)) return TRUE;
748 * @brief オブジェクトが近接武器として装備できるかを返す / Melee weapons
749 * @param o_ptr 対象のオブジェクト構造体ポインタ
750 * @return 近接武器として使えるならばTRUEを返す
752 bool object_is_melee_weapon(object_type *o_ptr)
754 if (TV_DIGGING <= o_ptr->tval && o_ptr->tval <= TV_SWORD) return TRUE;
761 * @brief オブジェクトが装備可能であるかを返す / Wearable including all weapon, all armour, bow, light source, amulet, and ring
762 * @param o_ptr 対象のオブジェクト構造体ポインタ
763 * @return 装備可能ならばTRUEを返す
765 bool object_is_wearable(object_type *o_ptr)
767 if (TV_WEARABLE_BEGIN <= o_ptr->tval && o_ptr->tval <= TV_WEARABLE_END) return TRUE;
774 * @brief オブジェクトが装備品であるかを返す(object_is_wearableに矢弾を含む) / Equipment including all wearable objects and ammo
775 * @param o_ptr 対象のオブジェクト構造体ポインタ
776 * @return 装備品ならばTRUEを返す
778 bool object_is_equipment(object_type *o_ptr)
780 if (TV_EQUIP_BEGIN <= o_ptr->tval && o_ptr->tval <= TV_EQUIP_END) return TRUE;
787 * @brief オブジェクトが強化不能武器であるかを返す / Poison needle can not be enchanted
788 * @param o_ptr 対象のオブジェクト構造体ポインタ
789 * @return 強化不能ならばTRUEを返す
791 bool object_refuse_enchant_weapon(object_type *o_ptr)
793 if (o_ptr->tval == TV_SWORD && o_ptr->sval == SV_DOKUBARI) return TRUE;
800 * @brief オブジェクトが強化可能武器であるかを返す /
801 * Check if an object is weapon (including bows and ammo) and allows enchantment
802 * @param o_ptr 対象のオブジェクト構造体ポインタ
803 * @return 強化可能ならばTRUEを返す
805 bool object_allow_enchant_weapon(object_type *o_ptr)
807 if (object_is_weapon_ammo(o_ptr) && !object_refuse_enchant_weapon(o_ptr)) return TRUE;
814 * @brief オブジェクトが強化可能な近接武器であるかを返す /
815 * Check if an object is melee weapon and allows enchantment
816 * @param o_ptr 対象のオブジェクト構造体ポインタ
817 * @return 強化可能な近接武器ならばTRUEを返す
819 bool object_allow_enchant_melee_weapon(object_type *o_ptr)
821 if (object_is_melee_weapon(o_ptr) && !object_refuse_enchant_weapon(o_ptr)) return TRUE;
828 * @brief オブジェクトが鍛冶師のエッセンス付加済みかを返す /
829 * Check if an object is made by a smith's special ability
830 * @param o_ptr 対象のオブジェクト構造体ポインタ
831 * @return エッセンス付加済みならばTRUEを返す
833 bool object_is_smith(object_type *o_ptr)
835 if (object_is_weapon_armour_ammo(o_ptr) && o_ptr->xtra3) return TRUE;
841 * @brief オブジェクトがアーティファクトかを返す /
842 * Check if an object is artifact
843 * @param o_ptr 対象のオブジェクト構造体ポインタ
844 * @return アーティファクトならばTRUEを返す
846 bool object_is_artifact(object_type *o_ptr)
848 if (object_is_fixed_artifact(o_ptr) || o_ptr->art_name) return TRUE;
855 * @brief オブジェクトがランダムアーティファクトかを返す /
856 * Check if an object is random artifact
857 * @param o_ptr 対象のオブジェクト構造体ポインタ
858 * @return ランダムアーティファクトならばTRUEを返す
860 bool object_is_random_artifact(object_type *o_ptr)
862 if (object_is_artifact(o_ptr) && !object_is_fixed_artifact(o_ptr)) return TRUE;
868 * @brief オブジェクトが通常のアイテム(アーティファクト、エゴ、鍛冶師エッセンス付加いずれでもない)かを返す /
869 * Check if an object is neither artifact, ego, nor 'smith' object
870 * @param o_ptr 対象のオブジェクト構造体ポインタ
871 * @return 通常のアイテムならばTRUEを返す
873 bool object_is_nameless(object_type *o_ptr)
875 if (!object_is_artifact(o_ptr) && !object_is_ego(o_ptr) && !object_is_smith(o_ptr))
882 * @brief オブジェクトが両手持ち可能な武器かを返す /
883 * Check if an object is melee weapon and allows wielding with two-hands
884 * @param o_ptr 対象のオブジェクト構造体ポインタ
885 * @return 両手持ち可能ならばTRUEを返す
887 bool object_allow_two_hands_wielding(object_type *o_ptr)
889 if (object_is_melee_weapon(o_ptr) && ((o_ptr->weight > 99) || (o_ptr->tval == TV_POLEARM))) return TRUE;
895 * @brief オブジェクトが松明に束ねられるかどうかを判定する
896 * An "item_tester_hook" for refilling torches
897 * @param o_ptr 判定したいオブジェクトの構造体参照ポインタ
898 * @return オブジェクトが松明に束ねられるならばTRUEを返す
900 bool object_can_refill_torch(object_type *o_ptr)
902 /* Torches are okay */
903 if ((o_ptr->tval == TV_LITE) &&
904 (o_ptr->sval == SV_LITE_TORCH)) return (TRUE);
906 /* Assume not okay */
912 * @brief 破壊可能なアイテムかを返す /
913 * Determines whether an object can be destroyed, and makes fake inscription.
914 * @param o_ptr 破壊可能かを確認したいオブジェクトの構造体参照ポインタ
915 * @return オブジェクトが破壊可能ならばTRUEを返す
917 bool can_player_destroy_object(object_type *o_ptr)
919 /* Artifacts cannot be destroyed */
920 if (!object_is_artifact(o_ptr)) return TRUE;
922 /* If object is unidentified, makes fake inscription */
923 if (!object_is_known(o_ptr))
925 byte feel = FEEL_SPECIAL;
927 /* Hack -- Handle icky artifacts */
928 if (object_is_cursed(o_ptr) || object_is_broken(o_ptr)) feel = FEEL_TERRIBLE;
930 /* Hack -- inscribe the artifact */
931 o_ptr->feeling = feel;
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);
941 /* Identified artifact -- Nothing to do */
946 * @brief オブジェクトがクエストの達成目的か否かを返す。
947 * @param o_ptr 特性短縮表記を得たいオブジェクト構造体の参照ポインタ
948 * @return 現在クエスト達成目的のアイテムならばTRUEを返す。
950 bool object_is_quest_target(object_type *o_ptr)
952 if (p_ptr->current_floor_ptr->inside_quest)
954 ARTIFACT_IDX a_idx = quest[p_ptr->current_floor_ptr->inside_quest].k_idx;
957 artifact_type *a_ptr = &a_info[a_idx];
958 if (!(a_ptr->gen_flags & TRG_INSTA_ART))
960 if ((o_ptr->tval == a_ptr->tval) && (o_ptr->sval == a_ptr->sval))
971 * Here is a "hook" used during calls to "get_item()" and
972 * "show_inven()" and "show_equip()", and the choice window routines.
974 bool(*item_tester_hook)(object_type*);
977 * Here is a "pseudo-hook" used during calls to "get_item()" and
978 * "show_inven()" and "show_equip()", and the choice window routines.
980 OBJECT_TYPE_VALUE item_tester_tval;
983 * @brief アイテムがitem_tester_hookグローバル関数ポインタの条件を満たしているかを返す汎用関数
984 * Check an item against the item tester info
985 * @param o_ptr 判定を行いたいオブジェクト構造体参照ポインタ
986 * @return item_tester_hookの参照先、その他いくつかの例外に応じてTRUE/FALSEを返す。
988 bool item_tester_okay(object_type *o_ptr, OBJECT_TYPE_VALUE tval)
990 /* Hack -- allow listing empty slots */
991 // if (item_tester_full) return (TRUE); // TODO:DELETE
993 /* Require an item */
994 if (!o_ptr->k_idx) return (FALSE);
996 /* Hack -- ignore "gold" */
997 if (o_ptr->tval == TV_GOLD)
1000 extern bool show_gold_on_floor;
1002 if (!show_gold_on_floor) return (FALSE);
1005 /* Check the tval */
1008 /* Is it a spellbook? If so, we need a hack -- TY */
1009 if ((tval <= TV_DEATH_BOOK) && (tval >= TV_LIFE_BOOK))
1010 return check_book_realm(o_ptr->tval, o_ptr->sval);
1012 if (tval != o_ptr->tval) return (FALSE);
1015 /* Check the hook */
1016 if (item_tester_hook)
1018 if (!(*item_tester_hook)(o_ptr)) return (FALSE);