OSDN Git Service

[Refactor] #37353 item_tester_refill_lantern() を object-hook.c へ移動。 / Move item_teste...
[hengband/hengband.git] / src / object-hook.c
index 5298710..9ed8faf 100644 (file)
-\r
-#include "angband.h"\r
-#include "object-hook.h"\r
-\r
-/*!\r
-* @brief \91Î\8fÛ\82Ì\83A\83C\83e\83\80\82ª\96î\82â\83N\83\8d\83X\83{\83E\82Ì\96î\82Ì\8dÞ\97¿\82É\82È\82é\82©\82ð\95Ô\82·\81B/\r
-* Hook to determine if an object is contertible in an arrow/bolt\r
-* @param o_ptr \83I\83u\83W\83F\83N\83g\82Ì\8d\\91¢\91Ì\82Ì\8eQ\8fÆ\83|\83C\83\93\83^\81B\r
-* @return \8dÞ\97¿\82É\82Å\82«\82é\82È\82çTRUE\82ð\95Ô\82·\r
-*/\r
-bool item_tester_hook_convertible(object_type *o_ptr)\r
-{\r
-       if ((o_ptr->tval == TV_JUNK) || (o_ptr->tval == TV_SKELETON)) return TRUE;\r
-\r
-       if ((o_ptr->tval == TV_CORPSE) && (o_ptr->sval == SV_SKELETON)) return TRUE;\r
-       /* Assume not */\r
-       return (FALSE);\r
-}\r
-\r
-/*!\r
-* @brief \95\90\8aí\8f \82Ì\81u\95\90\8aí\81v\8aÓ\92è\91Î\8fÛ\82É\82È\82é\82©\82ð\94»\92è\82·\82é\81B/ Hook to specify "weapon"\r
-* @param o_ptr \83I\83u\83W\83F\83N\83g\82Ì\8d\\91¢\91Ì\82Ì\8eQ\8fÆ\83|\83C\83\93\83^\81B\r
-* @return \91Î\8fÛ\82É\82È\82é\82È\82çTRUE\82ð\95Ô\82·\81B\r
-*/\r
-bool item_tester_hook_orthodox_melee_weapons(object_type *o_ptr)\r
-{\r
-       switch (o_ptr->tval)\r
-       {\r
-       case TV_HAFTED:\r
-       case TV_POLEARM:\r
-       case TV_DIGGING:\r
-       {\r
-               return (TRUE);\r
-       }\r
-       case TV_SWORD:\r
-       {\r
-               if (o_ptr->sval != SV_DOKUBARI) return (TRUE);\r
-       }\r
-       }\r
-\r
-       return (FALSE);\r
-}\r
-\r
-/*!\r
-* @brief \83I\83u\83W\83F\83N\83g\82ª\89E\8eè\82©\8d\8eè\82É\91\95\94õ\82Å\82«\82é\95\90\8aí\82©\82Ç\82¤\82©\82Ì\94»\92è\r
-* @param o_ptr \94»\92è\82·\82é\83I\83u\83W\83F\83N\83g\82Ì\8d\\91¢\91Ì\8eQ\8fÆ\83|\83C\83\93\83^\r
-* @return \89E\8eè\82©\8d\8eè\82Ì\95\90\8aí\82Æ\82µ\82Ä\91\95\94õ\82Å\82«\82é\82È\82ç\82ÎTRUE\82ð\95Ô\82·\81B\r
-*/\r
-bool item_tester_hook_melee_weapon(object_type *o_ptr)\r
-{\r
-       /* Check for a usable slot */\r
-       if ((o_ptr->tval >= TV_DIGGING) && (o_ptr->tval <= TV_SWORD)) return (TRUE);\r
-\r
-       /* Assume not wearable */\r
-       return (FALSE);\r
-}\r
-\r
-\r
-/*!\r
-* @brief \95\90\8aí\8f \82Ì\81u\96î\92e\81v\8aÓ\92è\91Î\8fÛ\82É\82È\82é\82©\82ð\94»\92è\82·\82é\81B/ Hook to specify "weapon"\r
-* @param o_ptr \83I\83u\83W\83F\83N\83g\82Ì\8d\\91¢\91Ì\82Ì\8eQ\8fÆ\83|\83C\83\93\83^\81B\r
-* @return \91Î\8fÛ\82É\82È\82é\82È\82çTRUE\82ð\95Ô\82·\81B\r
-*/\r
-bool item_tester_hook_ammo(object_type *o_ptr)\r
-{\r
-       switch (o_ptr->tval)\r
-       {\r
-       case TV_SHOT:\r
-       case TV_ARROW:\r
-       case TV_BOLT:\r
-       {\r
-               return (TRUE);\r
-       }\r
-       }\r
-\r
-       return (FALSE);\r
-}\r
-\r
-/*!\r
-* @brief \8fC\95\9c\91Î\8fÛ\82Æ\82È\82é\89ó\82ê\82½\95\90\8aí\82©\82ð\94»\92è\82·\82é\81B / Hook to specify "broken weapon"\r
-* @param o_ptr \83I\83u\83W\83F\83N\83g\82Ì\8d\\91¢\91Ì\82Ì\8eQ\8fÆ\83|\83C\83\93\83^\81B\r
-* @return \8fC\95\9c\91Î\8fÛ\82É\82È\82é\82È\82çTRUE\82ð\95Ô\82·\81B\r
-*/\r
-bool item_tester_hook_broken_weapon(object_type *o_ptr)\r
-{\r
-       if (o_ptr->tval != TV_SWORD) return FALSE;\r
-\r
-       switch (o_ptr->sval)\r
-       {\r
-       case SV_BROKEN_DAGGER:\r
-       case SV_BROKEN_SWORD:\r
-               return TRUE;\r
-       }\r
-\r
-       return FALSE;\r
-}\r
-\r
-/*!\r
-* @brief \83I\83u\83W\83F\83N\83g\82ª\93\8a\8eË\89Â\94\\82È\95\90\8aí\82©\82Ç\82¤\82©\82ð\95Ô\82·\81B\r
-* @param o_ptr \94»\92è\82·\82é\83I\83u\83W\83F\83N\83g\82Ì\8d\\91¢\91Ì\8eQ\8fÆ\83|\83C\83\93\83^\r
-* @return \93\8a\8eË\89Â\94\\82È\95\90\8aí\82È\82ç\82ÎTRUE\r
-*/\r
-bool item_tester_hook_boomerang(object_type *o_ptr)\r
-{\r
-       if ((o_ptr->tval == TV_DIGGING) || (o_ptr->tval == TV_SWORD) || (o_ptr->tval == TV_POLEARM) || (o_ptr->tval == TV_HAFTED)) return (TRUE);\r
-\r
-       /* Assume not */\r
-       return (FALSE);\r
-}\r
-\r
-/*!\r
-* @brief \83I\83u\83W\83F\83N\83g\82ð\83v\83\8c\83C\83\84\81[\82ª\90H\82×\82é\82±\82Æ\82ª\82Å\82«\82é\82©\82ð\94»\92è\82·\82é /\r
-* Hook to determine if an object is eatable\r
-* @param o_ptr \94»\92è\82µ\82½\82¢\83I\83u\83W\83F\83N\83g\82Ì\8d\\91¢\91Ì\8eQ\8fÆ\83|\83C\83\93\83^\r
-* @return \90H\82×\82é\82±\82Æ\82ª\89Â\94\\82È\82ç\82ÎTRUE\82ð\95Ô\82·\r
-*/\r
-bool item_tester_hook_eatable(object_type *o_ptr)\r
-{\r
-       if (o_ptr->tval == TV_FOOD) return TRUE;\r
-\r
-#if 0\r
-       if (prace_is_(RACE_SKELETON))\r
-       {\r
-               if (o_ptr->tval == TV_SKELETON ||\r
-                       (o_ptr->tval == TV_CORPSE && o_ptr->sval == SV_SKELETON))\r
-                       return TRUE;\r
-       }\r
-       else\r
-#endif\r
-\r
-               if (prace_is_(RACE_SKELETON) ||\r
-                       prace_is_(RACE_GOLEM) ||\r
-                       prace_is_(RACE_ZOMBIE) ||\r
-                       prace_is_(RACE_SPECTRE))\r
-               {\r
-                       if (o_ptr->tval == TV_STAFF || o_ptr->tval == TV_WAND)\r
-                               return TRUE;\r
-               }\r
-               else if (prace_is_(RACE_DEMON) ||\r
-                       (mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_DEMON))\r
-               {\r
-                       if (o_ptr->tval == TV_CORPSE &&\r
-                               o_ptr->sval == SV_CORPSE &&\r
-                               my_strchr("pht", r_info[o_ptr->pval].d_char))\r
-                               return TRUE;\r
-               }\r
-\r
-       /* Assume not */\r
-       return (FALSE);\r
-}\r
-\r
-/*!\r
-* @brief \83I\83u\83W\83F\83N\83g\82ª\82Ç\82¿\82ç\82Ì\8eè\82É\82à\91\95\94õ\82Å\82«\82é\95\90\8aí\82©\82Ç\82¤\82©\82Ì\94»\92è\r
-* @param o_ptr \94»\92è\82·\82é\83I\83u\83W\83F\83N\83g\82Ì\8d\\91¢\91Ì\8eQ\8fÆ\83|\83C\83\93\83^\r
-* @return \8d\89E\97¼\95û\82Ì\8eè\82Å\91\95\94õ\82Å\82«\82é\82È\82ç\82ÎTRUE\82ð\95Ô\82·\81B\r
-*/\r
-bool item_tester_hook_mochikae(object_type *o_ptr)\r
-{\r
-       /* Check for a usable slot */\r
-       if (((o_ptr->tval >= TV_DIGGING) && (o_ptr->tval <= TV_SWORD)) ||\r
-               (o_ptr->tval == TV_SHIELD) || (o_ptr->tval == TV_CAPTURE) ||\r
-               (o_ptr->tval == TV_CARD)) return (TRUE);\r
-\r
-       /* Assume not wearable */\r
-       return (FALSE);\r
-}\r
-\r
-/*!\r
-* @brief \83I\83u\83W\83F\83N\83g\82ð\83v\83\8c\83C\83\84\81[\82ª\96\82\93¹\8bï\82Æ\82µ\82Ä\94­\93®\82Å\82«\82é\82©\82ð\94»\92è\82·\82é /\r
-* Hook to determine if an object is activatable\r
-* @param o_ptr \94»\92è\82µ\82½\82¢\83I\83u\83W\83F\83N\83g\82Ì\8d\\91¢\91Ì\8eQ\8fÆ\83|\83C\83\93\83^\r
-* @return \96\82\93¹\8bï\82Æ\82µ\82Ä\94­\93®\89Â\94\\82È\82ç\82ÎTRUE\82ð\95Ô\82·\r
-*/\r
-bool item_tester_hook_activate(object_type *o_ptr)\r
-{\r
-       u32b flgs[TR_FLAG_SIZE];\r
-\r
-       /* Not known */\r
-       if (!object_is_known(o_ptr)) return (FALSE);\r
-\r
-       /* Extract the flags */\r
-       object_flags(o_ptr, flgs);\r
-\r
-       /* Check activation flag */\r
-       if (have_flag(flgs, TR_ACTIVATE)) return (TRUE);\r
-\r
-       /* Assume not */\r
-       return (FALSE);\r
-}\r
-\r
-/*!\r
-* @brief \83I\83u\83W\83F\83N\83g\82ð\96h\8bï\82Æ\82µ\82Ä\91\95\94õ\82Å\82«\82é\82©\82Ì\94»\92è / The "wearable" tester\r
-* @param o_ptr \94»\92è\82·\82é\83I\83u\83W\83F\83N\83g\82Ì\8d\\91¢\91Ì\8eQ\8fÆ\83|\83C\83\93\83^\r
-* @return \83I\83u\83W\83F\83N\83g\82ª\96h\8bï\82Æ\82µ\82Ä\91\95\94õ\82Å\82«\82é\82È\82çTRUE\82ð\95Ô\82·\81B\r
-*/\r
-bool item_tester_hook_wear(object_type *o_ptr)\r
-{\r
-       if ((o_ptr->tval == TV_SOFT_ARMOR) && (o_ptr->sval == SV_ABUNAI_MIZUGI))\r
-               if (p_ptr->psex == SEX_MALE) return FALSE;\r
-\r
-       /* Check for a usable slot */\r
-       if (wield_slot(o_ptr) >= INVEN_RARM) return (TRUE);\r
-\r
-       /* Assume not wearable */\r
-       return (FALSE);\r
-}\r
-\r
-\r
-/*!\r
-* @brief \83I\83u\83W\83F\83N\83g\82ð\83v\83\8c\83C\83\84\81[\82ª\8aÈ\88Õ\8eg\97p\83R\83}\83\93\83h\82Å\97\98\97p\82Å\82«\82é\82©\82ð\94»\92è\82·\82é /\r
-* Hook to determine if an object is useable\r
-* @param o_ptr \94»\92è\82µ\82½\82¢\83I\83u\83W\83F\83N\83g\82Ì\8d\\91¢\91Ì\8eQ\8fÆ\83|\83C\83\93\83^\r
-* @return \97\98\97p\89Â\94\\82È\82ç\82ÎTRUE\82ð\95Ô\82·\r
-*/\r
-bool item_tester_hook_use(object_type *o_ptr)\r
-{\r
-       u32b flgs[TR_FLAG_SIZE];\r
-\r
-       /* Ammo */\r
-       if (o_ptr->tval == p_ptr->tval_ammo)\r
-               return (TRUE);\r
-\r
-       /* Useable object */\r
-       switch (o_ptr->tval)\r
-       {\r
-       case TV_SPIKE:\r
-       case TV_STAFF:\r
-       case TV_WAND:\r
-       case TV_ROD:\r
-       case TV_SCROLL:\r
-       case TV_POTION:\r
-       case TV_FOOD:\r
-       {\r
-               return (TRUE);\r
-       }\r
-\r
-       default:\r
-       {\r
-               int i;\r
-\r
-               /* Not known */\r
-               if (!object_is_known(o_ptr)) return (FALSE);\r
-\r
-               /* HACK - only items from the equipment can be activated */\r
-               for (i = INVEN_RARM; i < INVEN_TOTAL; i++)\r
-               {\r
-                       if (&inventory[i] == o_ptr)\r
-                       {\r
-                               /* Extract the flags */\r
-                               object_flags(o_ptr, flgs);\r
-\r
-                               /* Check activation flag */\r
-                               if (have_flag(flgs, TR_ACTIVATE)) return (TRUE);\r
-                       }\r
-               }\r
-       }\r
-       }\r
-\r
-       /* Assume not */\r
-       return (FALSE);\r
-}\r
-\r
-\r
-/*!\r
-* @brief \83I\83u\83W\83F\83N\83g\82ð\83v\83\8c\83C\83\84\81[\82ª\88ù\82Þ\82±\82Æ\82ª\82Å\82«\82é\82©\82ð\94»\92è\82·\82é /\r
-* Hook to determine if an object can be quaffed\r
-* @param o_ptr \94»\92è\82µ\82½\82¢\83I\83u\83W\83F\83N\83g\82Ì\8d\\91¢\91Ì\8eQ\8fÆ\83|\83C\83\93\83^\r
-* @return \88ù\82Þ\82±\82Æ\82ª\89Â\94\\82È\82ç\82ÎTRUE\82ð\95Ô\82·\r
-*/\r
-bool item_tester_hook_quaff(object_type *o_ptr)\r
-{\r
-       if (o_ptr->tval == TV_POTION) return TRUE;\r
-\r
-       if (prace_is_(RACE_ANDROID))\r
-       {\r
-               if (o_ptr->tval == TV_FLASK && o_ptr->sval == SV_FLASK_OIL)\r
-                       return TRUE;\r
-       }\r
-       return FALSE;\r
-}\r
-\r
-\r
-/*!\r
-* @brief \83I\83u\83W\83F\83N\83g\82ð\83v\83\8c\83C\83\84\81[\82ª\93Ç\82Þ\82±\82Æ\82ª\82Å\82«\82é\82©\82ð\94»\92è\82·\82é /\r
-* Hook to determine if an object is readable\r
-* @param o_ptr \94»\92è\82µ\82½\82¢\83I\83u\83W\83F\83N\83g\82Ì\8d\\91¢\91Ì\8eQ\8fÆ\83|\83C\83\93\83^\r
-* @return \93Ç\82Þ\82±\82Æ\82ª\89Â\94\\82È\82ç\82ÎTRUE\82ð\95Ô\82·\r
-*/\r
-bool item_tester_hook_readable(object_type *o_ptr)\r
-{\r
-       if ((o_ptr->tval == TV_SCROLL) || (o_ptr->tval == TV_PARCHMENT) || (o_ptr->name1 == ART_GHB) || (o_ptr->name1 == ART_POWER)) return (TRUE);\r
-\r
-       /* Assume not */\r
-       return (FALSE);\r
-}\r
-\r
-\r
-/*!\r
-* @brief \83G\83b\83Z\83\93\83X\82Ì\95t\89Á\89Â\94\\82È\95\90\8aí\82â\96î\92e\82©\82ð\95Ô\82·\r
-* @param o_ptr \83`\83F\83b\83N\82µ\82½\82¢\83I\83u\83W\83F\83N\83g\82Ì\8d\\91¢\91Ì\8eQ\8fÆ\83|\83C\83\93\83^\r
-* @return \83G\83b\83Z\83\93\83X\82Ì\95t\89Á\89Â\94\\82È\95\90\8aí\82©\96î\92e\82È\82ç\82ÎTRUE\82ð\95Ô\82·\81B\r
-*/\r
-bool item_tester_hook_melee_ammo(object_type *o_ptr)\r
-{\r
-       switch (o_ptr->tval)\r
-       {\r
-       case TV_HAFTED:\r
-       case TV_POLEARM:\r
-       case TV_DIGGING:\r
-       case TV_BOLT:\r
-       case TV_ARROW:\r
-       case TV_SHOT:\r
-       {\r
-               return (TRUE);\r
-       }\r
-       case TV_SWORD:\r
-       {\r
-               if (o_ptr->sval != SV_DOKUBARI) return (TRUE);\r
-       }\r
-       }\r
-\r
-       return (FALSE);\r
-}\r
-\r
-/*!\r
-* @brief \8eô\8fp\97Ì\88æ\82Ì\95\90\8aí\8eô\94\9b\82Ì\91Î\8fÛ\82É\82Å\82«\82é\95\90\8aí\82©\82Ç\82¤\82©\82ð\95Ô\82·\81B / An "item_tester_hook" for offer\r
-* @param o_ptr \83I\83u\83W\83F\83N\83g\8d\\91¢\91Ì\82Ì\8eQ\8fÆ\83|\83C\83\93\83^\r
-* @return \8eô\94\9b\89Â\94\\82È\95\90\8aí\82È\82ç\82ÎTRUE\82ð\95Ô\82·\r
-*/\r
-bool item_tester_hook_weapon_except_bow(object_type *o_ptr)\r
-{\r
-       switch (o_ptr->tval)\r
-       {\r
-       case TV_SWORD:\r
-       case TV_HAFTED:\r
-       case TV_POLEARM:\r
-       case TV_DIGGING:\r
-       {\r
-               return (TRUE);\r
-       }\r
-       }\r
-\r
-       return (FALSE);\r
-}\r
-\r
-/*!\r
-* @brief \8eô\8fp\97Ì\88æ\82Ì\8ae\8f\88\97\9d\82É\8eg\82¦\82é\8eô\82í\82ê\82½\91\95\94õ\82©\82Ç\82¤\82©\82ð\95Ô\82·\81B / An "item_tester_hook" for offer\r
-* @param o_ptr \83I\83u\83W\83F\83N\83g\8d\\91¢\91Ì\82Ì\8eQ\8fÆ\83|\83C\83\93\83^\r
-* @return \8eg\82¦\82é\91\95\94õ\82È\82ç\82ÎTRUE\82ð\95Ô\82·\r
-*/\r
-bool item_tester_hook_cursed(object_type *o_ptr)\r
-{\r
-       return (bool)(object_is_cursed(o_ptr));\r
-}\r
-\r
-\r
-/*!\r
-* @brief \83A\83C\83e\83\80\82ª\95À\82Ì\89¿\92l\82Ì\83A\83C\83e\83\80\82©\82Ç\82¤\82©\94»\92è\82·\82é /\r
-* Check if an object is nameless weapon or armour\r
-* @param o_ptr \94»\92è\82·\82é\83A\83C\83e\83\80\82Ì\8fî\95ñ\8eQ\8fÆ\83|\83C\83\93\83^\r
-* @return \95À\82È\82ç\82ÎTRUE\82ð\95Ô\82·\r
-*/\r
-bool item_tester_hook_nameless_weapon_armour(object_type *o_ptr)\r
-{\r
-       /* Require weapon or armour */\r
-       if (!object_is_weapon_armour_ammo(o_ptr)) return FALSE;\r
-\r
-       /* Require nameless object if the object is well known */\r
-       if (object_is_known(o_ptr) && !object_is_nameless(o_ptr))\r
-               return FALSE;\r
-\r
-       return TRUE;\r
-}\r
-\r
-\r
-/*!\r
-* @brief \83A\83C\83e\83\80\82ª\8aÓ\92è\8dÏ\82Ý\82©\82ð\94»\92è\82·\82é /\r
-* @param o_ptr \94»\92è\82·\82é\83A\83C\83e\83\80\82Ì\8fî\95ñ\8eQ\8fÆ\83|\83C\83\93\83^\r
-* @return \8eÀ\8dÛ\82É\8aÓ\92è\8dÏ\82Ý\82È\82ç\82ÎTRUE\82ð\95Ô\82·\r
-*/\r
-bool item_tester_hook_identify(object_type *o_ptr)\r
-{\r
-       return (bool)!object_is_known(o_ptr);\r
-}\r
-\r
-/*!\r
-* @brief \83A\83C\83e\83\80\82ª\8aÓ\92è\8dÏ\82Ý\82Ì\95\90\8aí\96h\8bï\82©\82ð\94»\92è\82·\82é /\r
-* @param o_ptr \94»\92è\82·\82é\83A\83C\83e\83\80\82Ì\8fî\95ñ\8eQ\8fÆ\83|\83C\83\93\83^\r
-* @return \8eÀ\8dÛ\82É\8aÓ\92è\8dÏ\82Ý\82È\82ç\82ÎTRUE\82ð\95Ô\82·\r
-*/\r
-bool item_tester_hook_identify_weapon_armour(object_type *o_ptr)\r
-{\r
-       if (object_is_known(o_ptr))\r
-               return FALSE;\r
-       return object_is_weapon_armour_ammo(o_ptr);\r
-}\r
-\r
-/*!\r
-* @brief \83A\83C\83e\83\80\82ª*\8aÓ\92è*\8dÏ\82Ý\82©\82ð\94»\92è\82·\82é /\r
-* @param o_ptr \94»\92è\82·\82é\83A\83C\83e\83\80\82Ì\8fî\95ñ\8eQ\8fÆ\83|\83C\83\93\83^\r
-* @return \8eÀ\8dÛ\82É\8aÓ\92è\8dÏ\82Ý\82È\82ç\82ÎTRUE\82ð\95Ô\82·\r
-*/\r
-bool item_tester_hook_identify_fully(object_type *o_ptr)\r
-{\r
-       return (bool)(!object_is_known(o_ptr) || !(o_ptr->ident & IDENT_MENTAL));\r
-}\r
-\r
-/*!\r
-* @brief \83A\83C\83e\83\80\82ª*\8aÓ\92è*\8dÏ\82Ý\82Ì\95\90\8aí\96h\8bï\82©\82ð\94»\92è\82·\82é /\r
-* @param o_ptr \94»\92è\82·\82é\83A\83C\83e\83\80\82Ì\8fî\95ñ\8eQ\8fÆ\83|\83C\83\93\83^\r
-* @return \8eÀ\8dÛ\82É\8aÓ\92è\8dÏ\82Ý\82È\82ç\82ÎTRUE\82ð\95Ô\82·\r
-*/\r
-bool item_tester_hook_identify_fully_weapon_armour(object_type *o_ptr)\r
-{\r
-       if (!item_tester_hook_identify_fully(o_ptr))\r
-               return FALSE;\r
-       return object_is_weapon_armour_ammo(o_ptr);\r
-}\r
-\r
-\r
-/*!\r
-* @brief \96\82\97Í\8f[\93U\82ª\89Â\94\\82È\83A\83C\83e\83\80\82©\82Ç\82¤\82©\94»\92è\82·\82é /\r
-* Hook for "get_item()".  Determine if something is rechargable.\r
-* @param o_ptr \94»\92è\82·\82é\83A\83C\83e\83\80\82Ì\8fî\95ñ\8eQ\8fÆ\83|\83C\83\93\83^\r
-* @return \96\82\97Í\8f[\93U\82ª\89Â\94\\82È\82ç\82ÎTRUE\82ð\95Ô\82·\r
-*/\r
-bool item_tester_hook_recharge(object_type *o_ptr)\r
-{\r
-       /* Recharge staffs */\r
-       if (o_ptr->tval == TV_STAFF) return (TRUE);\r
-\r
-       /* Recharge wands */\r
-       if (o_ptr->tval == TV_WAND) return (TRUE);\r
-\r
-       /* Hack -- Recharge rods */\r
-       if (o_ptr->tval == TV_ROD) return (TRUE);\r
-\r
-       /* Nope */\r
-       return (FALSE);\r
-}\r
+
+#include "angband.h"
+#include "object-hook.h"
+#include "artifact.h"
+
+/*!
+* @brief 対象のアイテムが矢やクロスボウの矢の材料になるかを返す。/
+* Hook to determine if an object is contertible in an arrow/bolt
+* @param o_ptr オブジェクトの構造体の参照ポインタ。
+* @return 材料にできるならTRUEを返す
+*/
+bool item_tester_hook_convertible(object_type *o_ptr)
+{
+       if ((o_ptr->tval == TV_JUNK) || (o_ptr->tval == TV_SKELETON)) return TRUE;
+
+       if ((o_ptr->tval == TV_CORPSE) && (o_ptr->sval == SV_SKELETON)) return TRUE;
+       /* Assume not */
+       return (FALSE);
+}
+
+/*!
+* @brief 武器匠の「武器」鑑定対象になるかを判定する。/ Hook to specify "weapon"
+* @param o_ptr オブジェクトの構造体の参照ポインタ。
+* @return 対象になるならTRUEを返す。
+*/
+bool item_tester_hook_orthodox_melee_weapons(object_type *o_ptr)
+{
+       switch (o_ptr->tval)
+       {
+       case TV_HAFTED:
+       case TV_POLEARM:
+       case TV_DIGGING:
+       {
+               return (TRUE);
+       }
+       case TV_SWORD:
+       {
+               if (o_ptr->sval != SV_DOKUBARI) return (TRUE);
+       }
+       }
+
+       return (FALSE);
+}
+
+/*!
+* @brief オブジェクトが右手か左手に装備できる武器かどうかの判定
+* @param o_ptr 判定するオブジェクトの構造体参照ポインタ
+* @return 右手か左手の武器として装備できるならばTRUEを返す。
+*/
+bool item_tester_hook_melee_weapon(object_type *o_ptr)
+{
+       /* Check for a usable slot */
+       if ((o_ptr->tval >= TV_DIGGING) && (o_ptr->tval <= TV_SWORD)) return (TRUE);
+
+       /* Assume not wearable */
+       return (FALSE);
+}
+
+
+/*!
+* @brief 武器匠の「矢弾」鑑定対象になるかを判定する。/ Hook to specify "weapon"
+* @param o_ptr オブジェクトの構造体の参照ポインタ。
+* @return 対象になるならTRUEを返す。
+*/
+bool item_tester_hook_ammo(object_type *o_ptr)
+{
+       switch (o_ptr->tval)
+       {
+       case TV_SHOT:
+       case TV_ARROW:
+       case TV_BOLT:
+       {
+               return (TRUE);
+       }
+       }
+
+       return (FALSE);
+}
+
+/*!
+* @brief 修復対象となる壊れた武器かを判定する。 / Hook to specify "broken weapon"
+* @param o_ptr オブジェクトの構造体の参照ポインタ。
+* @return 修復対象になるならTRUEを返す。
+*/
+bool item_tester_hook_broken_weapon(object_type *o_ptr)
+{
+       if (o_ptr->tval != TV_SWORD) return FALSE;
+
+       switch (o_ptr->sval)
+       {
+       case SV_BROKEN_DAGGER:
+       case SV_BROKEN_SWORD:
+               return TRUE;
+       }
+
+       return FALSE;
+}
+
+/*!
+* @brief オブジェクトが投射可能な武器かどうかを返す。
+* @param o_ptr 判定するオブジェクトの構造体参照ポインタ
+* @return 投射可能な武器ならばTRUE
+*/
+bool item_tester_hook_boomerang(object_type *o_ptr)
+{
+       if ((o_ptr->tval == TV_DIGGING) || (o_ptr->tval == TV_SWORD) || (o_ptr->tval == TV_POLEARM) || (o_ptr->tval == TV_HAFTED)) return (TRUE);
+
+       /* Assume not */
+       return (FALSE);
+}
+
+/*!
+* @brief オブジェクトをプレイヤーが食べることができるかを判定する /
+* Hook to determine if an object is eatable
+* @param o_ptr 判定したいオブジェクトの構造体参照ポインタ
+* @return 食べることが可能ならばTRUEを返す
+*/
+bool item_tester_hook_eatable(object_type *o_ptr)
+{
+       if (o_ptr->tval == TV_FOOD) return TRUE;
+
+#if 0
+       if (prace_is_(RACE_SKELETON))
+       {
+               if (o_ptr->tval == TV_SKELETON ||
+                       (o_ptr->tval == TV_CORPSE && o_ptr->sval == SV_SKELETON))
+                       return TRUE;
+       }
+       else
+#endif
+
+       if (prace_is_(RACE_SKELETON) ||
+               prace_is_(RACE_GOLEM) ||
+               prace_is_(RACE_ZOMBIE) ||
+               prace_is_(RACE_SPECTRE))
+       {
+               if (o_ptr->tval == TV_STAFF || o_ptr->tval == TV_WAND)
+                       return TRUE;
+       }
+       else if (prace_is_(RACE_DEMON) || (mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_DEMON))
+       {
+               if (o_ptr->tval == TV_CORPSE &&
+                       o_ptr->sval == SV_CORPSE &&
+                       my_strchr("pht", r_info[o_ptr->pval].d_char))
+                       return TRUE;
+       }
+
+       /* Assume not */
+       return (FALSE);
+}
+
+/*!
+* @brief オブジェクトがどちらの手にも装備できる武器かどうかの判定
+* @param o_ptr 判定するオブジェクトの構造体参照ポインタ
+* @return 左右両方の手で装備できるならばTRUEを返す。
+*/
+bool item_tester_hook_mochikae(object_type *o_ptr)
+{
+       /* Check for a usable slot */
+       if (((o_ptr->tval >= TV_DIGGING) && (o_ptr->tval <= TV_SWORD)) ||
+               (o_ptr->tval == TV_SHIELD) || (o_ptr->tval == TV_CAPTURE) ||
+               (o_ptr->tval == TV_CARD)) return (TRUE);
+
+       /* Assume not wearable */
+       return (FALSE);
+}
+
+/*!
+* @brief オブジェクトをプレイヤーが魔道具として発動できるかを判定する /
+* Hook to determine if an object is activatable
+* @param o_ptr 判定したいオブジェクトの構造体参照ポインタ
+* @return 魔道具として発動可能ならばTRUEを返す
+*/
+bool item_tester_hook_activate(object_type *o_ptr)
+{
+       BIT_FLAGS flgs[TR_FLAG_SIZE];
+
+       /* Not known */
+       if (!object_is_known(o_ptr)) return (FALSE);
+       object_flags(o_ptr, flgs);
+
+       /* Check activation flag */
+       if (have_flag(flgs, TR_ACTIVATE)) return (TRUE);
+
+       /* Assume not */
+       return (FALSE);
+}
+
+/*!
+* @brief オブジェクトを防具として装備できるかの判定 / The "wearable" tester
+* @param o_ptr 判定するオブジェクトの構造体参照ポインタ
+* @return オブジェクトが防具として装備できるならTRUEを返す。
+*/
+bool item_tester_hook_wear(object_type *o_ptr)
+{
+       if ((o_ptr->tval == TV_SOFT_ARMOR) && (o_ptr->sval == SV_ABUNAI_MIZUGI))
+               if (p_ptr->psex == SEX_MALE) return FALSE;
+
+       /* Check for a usable slot */
+       if (wield_slot(o_ptr) >= INVEN_RARM) return (TRUE);
+
+       /* Assume not wearable */
+       return (FALSE);
+}
+
+
+/*!
+* @brief オブジェクトをプレイヤーが簡易使用コマンドで利用できるかを判定する /
+* Hook to determine if an object is useable
+* @param o_ptr 判定したいオブジェクトの構造体参照ポインタ
+* @return 利用可能ならばTRUEを返す
+*/
+bool item_tester_hook_use(object_type *o_ptr)
+{
+       BIT_FLAGS flgs[TR_FLAG_SIZE];
+
+       /* Ammo */
+       if (o_ptr->tval == p_ptr->tval_ammo)
+               return (TRUE);
+
+       /* Useable object */
+       switch (o_ptr->tval)
+       {
+       case TV_SPIKE:
+       case TV_STAFF:
+       case TV_WAND:
+       case TV_ROD:
+       case TV_SCROLL:
+       case TV_POTION:
+       case TV_FOOD:
+       {
+               return (TRUE);
+       }
+
+       default:
+       {
+               int i;
+
+               /* Not known */
+               if (!object_is_known(o_ptr)) return (FALSE);
+
+               /* HACK - only items from the equipment can be activated */
+               for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
+               {
+                       if (&inventory[i] == o_ptr)
+                       {
+                               object_flags(o_ptr, flgs);
+
+                               /* Check activation flag */
+                               if (have_flag(flgs, TR_ACTIVATE)) return (TRUE);
+                       }
+               }
+       }
+       }
+
+       /* Assume not */
+       return (FALSE);
+}
+
+
+/*!
+* @brief オブジェクトをプレイヤーが飲むことができるかを判定する /
+* Hook to determine if an object can be quaffed
+* @param o_ptr 判定したいオブジェクトの構造体参照ポインタ
+* @return 飲むことが可能ならばTRUEを返す
+*/
+bool item_tester_hook_quaff(object_type *o_ptr)
+{
+       if (o_ptr->tval == TV_POTION) return TRUE;
+
+       if (prace_is_(RACE_ANDROID))
+       {
+               if (o_ptr->tval == TV_FLASK && o_ptr->sval == SV_FLASK_OIL)
+                       return TRUE;
+       }
+       return FALSE;
+}
+
+
+/*!
+* @brief オブジェクトをプレイヤーが読むことができるかを判定する /
+* Hook to determine if an object is readable
+* @param o_ptr 判定したいオブジェクトの構造体参照ポインタ
+* @return 読むことが可能ならばTRUEを返す
+*/
+bool item_tester_hook_readable(object_type *o_ptr)
+{
+       if ((o_ptr->tval == TV_SCROLL) || (o_ptr->tval == TV_PARCHMENT) || (o_ptr->name1 == ART_GHB) || (o_ptr->name1 == ART_POWER)) return (TRUE);
+
+       /* Assume not */
+       return (FALSE);
+}
+
+
+/*!
+* @brief エッセンスの付加可能な武器や矢弾かを返す
+* @param o_ptr チェックしたいオブジェクトの構造体参照ポインタ
+* @return エッセンスの付加可能な武器か矢弾ならばTRUEを返す。
+*/
+bool item_tester_hook_melee_ammo(object_type *o_ptr)
+{
+       switch (o_ptr->tval)
+       {
+       case TV_HAFTED:
+       case TV_POLEARM:
+       case TV_DIGGING:
+       case TV_BOLT:
+       case TV_ARROW:
+       case TV_SHOT:
+       {
+               return (TRUE);
+       }
+       case TV_SWORD:
+       {
+               if (o_ptr->sval != SV_DOKUBARI) return (TRUE);
+       }
+       }
+
+       return (FALSE);
+}
+
+/*!
+* @brief 呪術領域の武器呪縛の対象にできる武器かどうかを返す。 / An "item_tester_hook" for offer
+* @param o_ptr オブジェクト構造体の参照ポインタ
+* @return 呪縛可能な武器ならばTRUEを返す
+*/
+bool item_tester_hook_weapon_except_bow(object_type *o_ptr)
+{
+       switch (o_ptr->tval)
+       {
+       case TV_SWORD:
+       case TV_HAFTED:
+       case TV_POLEARM:
+       case TV_DIGGING:
+       {
+               return (TRUE);
+       }
+       }
+
+       return (FALSE);
+}
+
+/*!
+* @brief 呪術領域の各処理に使える呪われた装備かどうかを返す。 / An "item_tester_hook" for offer
+* @param o_ptr オブジェクト構造体の参照ポインタ
+* @return 使える装備ならばTRUEを返す
+*/
+bool item_tester_hook_cursed(object_type *o_ptr)
+{
+       return (bool)(object_is_cursed(o_ptr));
+}
+
+
+/*!
+* @brief アイテムが並の価値のアイテムかどうか判定する /
+* Check if an object is nameless weapon or armour
+* @param o_ptr 判定するアイテムの情報参照ポインタ
+* @return 並ならばTRUEを返す
+*/
+bool item_tester_hook_nameless_weapon_armour(object_type *o_ptr)
+{
+       /* Require weapon or armour */
+       if (!object_is_weapon_armour_ammo(o_ptr)) return FALSE;
+
+       /* Require nameless object if the object is well known */
+       if (object_is_known(o_ptr) && !object_is_nameless(o_ptr))
+               return FALSE;
+
+       return TRUE;
+}
+
+
+/*!
+* @brief アイテムが鑑定済みかを判定する /
+* @param o_ptr 判定するアイテムの情報参照ポインタ
+* @return 実際に鑑定済みならばTRUEを返す
+*/
+bool item_tester_hook_identify(object_type *o_ptr)
+{
+       return (bool)!object_is_known(o_ptr);
+}
+
+/*!
+* @brief アイテムが鑑定済みの武器防具かを判定する /
+* @param o_ptr 判定するアイテムの情報参照ポインタ
+* @return 実際に鑑定済みならばTRUEを返す
+*/
+bool item_tester_hook_identify_weapon_armour(object_type *o_ptr)
+{
+       if (object_is_known(o_ptr))
+               return FALSE;
+       return object_is_weapon_armour_ammo(o_ptr);
+}
+
+/*!
+* @brief アイテムが*鑑定*済みかを判定する /
+* @param o_ptr 判定するアイテムの情報参照ポインタ
+* @return 実際に鑑定済みならばTRUEを返す
+*/
+bool item_tester_hook_identify_fully(object_type *o_ptr)
+{
+       return (bool)(!object_is_known(o_ptr) || !(o_ptr->ident & IDENT_MENTAL));
+}
+
+/*!
+* @brief アイテムが*鑑定*済みの武器防具かを判定する /
+* @param o_ptr 判定するアイテムの情報参照ポインタ
+* @return 実際に鑑定済みならばTRUEを返す
+*/
+bool item_tester_hook_identify_fully_weapon_armour(object_type *o_ptr)
+{
+       if (!item_tester_hook_identify_fully(o_ptr))
+               return FALSE;
+       return object_is_weapon_armour_ammo(o_ptr);
+}
+
+
+/*!
+* @brief 魔力充填が可能なアイテムかどうか判定する /
+* Hook for "get_item()".  Determine if something is rechargable.
+* @param o_ptr 判定するアイテムの情報参照ポインタ
+* @return 魔力充填が可能ならばTRUEを返す
+*/
+bool item_tester_hook_recharge(object_type *o_ptr)
+{
+       /* Recharge staffs */
+       if (o_ptr->tval == TV_STAFF) return (TRUE);
+
+       /* Recharge wands */
+       if (o_ptr->tval == TV_WAND) return (TRUE);
+
+       /* Hack -- Recharge rods */
+       if (o_ptr->tval == TV_ROD) return (TRUE);
+
+       return (FALSE);
+}
+
+/*!
+ * @brief オブジェクトがプレイヤーが使用可能な魔道書かどうかを判定する
+ * @param o_ptr 判定したいオブ会ジェクトの構造体参照ポインタ
+ * @return 学習できる魔道書ならばTRUEを返す
+ */
+bool item_tester_learn_spell(object_type *o_ptr)
+{
+       s32b choices = realm_choices2[p_ptr->pclass];
+
+       if (p_ptr->pclass == CLASS_PRIEST)
+       {
+               if (is_good_realm(p_ptr->realm1))
+               {
+                       choices &= ~(CH_DEATH | CH_DAEMON);
+               }
+               else
+               {
+                       choices &= ~(CH_LIFE | CH_CRUSADE);
+               }
+       }
+
+       if ((o_ptr->tval < TV_LIFE_BOOK) || (o_ptr->tval > (TV_LIFE_BOOK + MAX_REALM - 1))) return (FALSE);
+       if ((o_ptr->tval == TV_MUSIC_BOOK) && (p_ptr->pclass == CLASS_BARD)) return (TRUE);
+       else if (!is_magic(tval2realm(o_ptr->tval))) return FALSE;
+       if ((REALM1_BOOK == o_ptr->tval) || (REALM2_BOOK == o_ptr->tval)) return (TRUE);
+       if (choices & (0x0001 << (tval2realm(o_ptr->tval) - 1))) return (TRUE);
+       return (FALSE);
+}
+
+/*!
+ * @brief オブジェクトが高位の魔法書かどうかを判定する
+ * @param o_ptr 判定したいオブジェクトの構造体参照ポインタ
+ * @return オブジェクトが高位の魔法書ならばTRUEを返す
+ */
+bool item_tester_high_level_book(object_type *o_ptr)
+{
+       if ((o_ptr->tval == TV_LIFE_BOOK) ||
+               (o_ptr->tval == TV_SORCERY_BOOK) ||
+               (o_ptr->tval == TV_NATURE_BOOK) ||
+               (o_ptr->tval == TV_CHAOS_BOOK) ||
+               (o_ptr->tval == TV_DEATH_BOOK) ||
+               (o_ptr->tval == TV_TRUMP_BOOK) ||
+               (o_ptr->tval == TV_CRAFT_BOOK) ||
+               (o_ptr->tval == TV_DAEMON_BOOK) ||
+               (o_ptr->tval == TV_CRUSADE_BOOK) ||
+               (o_ptr->tval == TV_MUSIC_BOOK) ||
+               (o_ptr->tval == TV_HEX_BOOK))
+       {
+               if (o_ptr->sval > 1)
+                       return TRUE;
+               else
+                       return FALSE;
+       }
+
+       return FALSE;
+}
+
+/*!
+ * @brief オブジェクトがランタンの燃料になるかどうかを判定する
+ * An "item_tester_hook" for refilling lanterns
+ * @param o_ptr 判定したいオブジェクトの構造体参照ポインタ
+ * @return オブジェクトがランタンの燃料になるならばTRUEを返す
+ */
+bool item_tester_refill_lantern(object_type *o_ptr)
+{
+       /* Flasks of oil are okay */
+       if (o_ptr->tval == TV_FLASK) return (TRUE);
+
+       /* Laterns are okay */
+       if ((o_ptr->tval == TV_LITE) &&
+               (o_ptr->sval == SV_LITE_LANTERN)) return (TRUE);
+
+       /* Assume not okay */
+       return (FALSE);
+}
+