From 66507d4854d1abf966f9aa0f5e2dd419d67be366 Mon Sep 17 00:00:00 2001 From: Deskull Date: Wed, 13 Feb 2019 22:25:06 +0900 Subject: [PATCH] =?utf8?q?[Refactor]=20#37353=20obj=5Fkind.c=20=E3=82=92?= =?utf8?q?=20object-hook.c=E3=80=80=E3=81=AB=E7=B5=B1=E5=90=88=E3=80=82=20?= =?utf8?q?/=20Integrate=20obj=5Fkind.c=20to=20object-hook.c.?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- Hengband_vcs2017/Hengband/Hengband.vcxproj | 1 - src/artifact.c | 1 + src/autopick.c | 1 + src/cave.c | 1 + src/cmd-pet.c | 1 + src/cmd4.c | 1 + src/dungeon.c | 1 + src/effects.c | 1 + src/externs.h | 22 -- src/flavor.c | 1 + src/load.c | 1 + src/melee1.c | 1 + src/monster-process.c | 1 + src/obj_kind.c | 393 ----------------------------- src/object-curse.c | 1 + src/object-hook.c | 384 ++++++++++++++++++++++++++++ src/object-hook.h | 21 ++ src/object1.c | 1 + src/player-damage.c | 1 + src/player-status.c | 1 + src/spells1.c | 1 + src/spells2.c | 1 + src/store.c | 1 + src/wizard2.c | 1 + 24 files changed, 424 insertions(+), 416 deletions(-) delete mode 100644 src/obj_kind.c diff --git a/Hengband_vcs2017/Hengband/Hengband.vcxproj b/Hengband_vcs2017/Hengband/Hengband.vcxproj index 77f729440..7a0d81396 100644 --- a/Hengband_vcs2017/Hengband/Hengband.vcxproj +++ b/Hengband_vcs2017/Hengband/Hengband.vcxproj @@ -213,7 +213,6 @@ - diff --git a/src/artifact.c b/src/artifact.c index 1557dc846..5d2fc4f62 100644 --- a/src/artifact.c +++ b/src/artifact.c @@ -15,6 +15,7 @@ #include "avatar.h" #include "cmd-activate.h" #include "object-curse.h" +#include "object-hook.h" #include "artifact.h" static bool has_extreme_damage_rate(object_type *o_ptr); diff --git a/src/autopick.c b/src/autopick.c index 21f72f954..86ce03cdd 100644 --- a/src/autopick.c +++ b/src/autopick.c @@ -14,6 +14,7 @@ #include "angband.h" #include "store.h" #include "player-status.h" +#include "object-hook.h" #define MAX_LINELEN 1024 diff --git a/src/cave.c b/src/cave.c index d16959922..a9af2bab7 100644 --- a/src/cave.c +++ b/src/cave.c @@ -19,6 +19,7 @@ #include "angband.h" #include "world.h" #include "projection.h" +#include "object-hook.h" static byte display_autopick; /*!< 自動拾い状態の設定フラグ */ static int match_autopick; diff --git a/src/cmd-pet.c b/src/cmd-pet.c index 1b3cf7fb2..fe15caf1d 100644 --- a/src/cmd-pet.c +++ b/src/cmd-pet.c @@ -2,6 +2,7 @@ #include "melee.h" #include "sort.h" #include "player-status.h" +#include "object-hook.h" /*! * @brief プレイヤーの騎乗/下馬処理判定 diff --git a/src/cmd4.c b/src/cmd4.c index 652c961c7..dbe51fcd1 100644 --- a/src/cmd4.c +++ b/src/cmd4.c @@ -49,6 +49,7 @@ #include "store.h" #include "artifact.h" #include "avatar.h" +#include "object-hook.h" /* diff --git a/src/dungeon.c b/src/dungeon.c index 6ac342445..b2d46e4f6 100644 --- a/src/dungeon.c +++ b/src/dungeon.c @@ -37,6 +37,7 @@ #include "player-status.h" #include "cmd-spell.h" #include "realm-hex.h" +#include "object-hook.h" static bool load = TRUE; /*!<ロード処理中の分岐フラグ*/ static int wild_regen = 20; /*!<広域マップ移動時の自然回復処理カウンタ(広域マップ1マス毎に20回処理を基本とする)*/ diff --git a/src/effects.c b/src/effects.c index 629437ca0..1107e77d0 100644 --- a/src/effects.c +++ b/src/effects.c @@ -19,6 +19,7 @@ #include "player-status.h" #include "spells-status.h" #include "realm-hex.h" +#include "object-hook.h" /*! * @brief プレイヤーの継続行動を設定する。 diff --git a/src/externs.h b/src/externs.h index 1fa1edac9..5862c1f21 100644 --- a/src/externs.h +++ b/src/externs.h @@ -1375,28 +1375,6 @@ extern void py_pickup_floor(bool pickup); /* variable.c */ extern bool easy_floor; -/* obj_kind.c */ -extern bool object_is_potion(object_type *o_ptr); -extern bool object_is_shoukinkubi(object_type *o_ptr); -extern bool object_is_favorite(object_type *o_ptr); -extern bool object_is_rare(object_type *o_ptr); -extern bool object_is_weapon(object_type *o_ptr); -extern bool object_is_weapon_ammo(object_type *o_ptr); -extern bool object_is_ammo(object_type *o_ptr); -extern bool object_is_armour(object_type *o_ptr); -extern bool object_is_weapon_armour_ammo(object_type *o_ptr); -extern bool object_is_melee_weapon(object_type *o_ptr); -extern bool object_is_wearable(object_type *o_ptr); -extern bool object_is_equipment(object_type *o_ptr); -extern bool object_refuse_enchant_weapon(object_type *o_ptr); -extern bool object_allow_enchant_weapon(object_type *o_ptr); -extern bool object_allow_enchant_melee_weapon(object_type *o_ptr); -extern bool object_is_smith(object_type *o_ptr); -extern bool object_is_artifact(object_type *o_ptr); -extern bool object_is_random_artifact(object_type *o_ptr); -extern bool object_is_nameless(object_type *o_ptr); -extern bool object_allow_two_hands_wielding(object_type *o_ptr); - /* wild.c */ extern void set_floor_and_wall(DUNGEON_IDX type); extern void wilderness_gen(void); diff --git a/src/flavor.c b/src/flavor.c index f0c3fecc4..085186012 100644 --- a/src/flavor.c +++ b/src/flavor.c @@ -13,6 +13,7 @@ #include "angband.h" #include "player-status.h" #include "shoot.h" +#include "object-hook.h" /*! * @brief 最初から簡易な名称が明らかになるベースアイテムの判定。 / Certain items, if aware, are known instantly diff --git a/src/load.c b/src/load.c index fe19e7a62..7a6291ee2 100644 --- a/src/load.c +++ b/src/load.c @@ -49,6 +49,7 @@ #include "artifact.h" #include "avatar.h" #include "spells-status.h" +#include "object-hook.h" /* diff --git a/src/melee1.c b/src/melee1.c index ea282c094..f414abe4b 100644 --- a/src/melee1.c +++ b/src/melee1.c @@ -22,6 +22,7 @@ #include "avatar.h" #include "player-status.h" #include "realm-hex.h" +#include "object-hook.h" diff --git a/src/monster-process.c b/src/monster-process.c index ef776e6df..2d999df2c 100644 --- a/src/monster-process.c +++ b/src/monster-process.c @@ -22,6 +22,7 @@ #include "quest.h" #include "avatar.h" #include "realm-hex.h" +#include "object-hook.h" /*! diff --git a/src/obj_kind.c b/src/obj_kind.c deleted file mode 100644 index 1db11bff9..000000000 --- a/src/obj_kind.c +++ /dev/null @@ -1,393 +0,0 @@ -/*! - * @file obj_kind.c - * @brief ベースアイテムの実装 - * @date 2014/01/10 - * @author - * 2014 Deskull rearranged comment for Doxygen. - */ - -#include "angband.h" - -/*! - * @brief オブジェクトが薬であるかを返す - * @param o_ptr 対象のオブジェクト構造体ポインタ - * @return オブジェクトが薬ならばTRUEを返す - */ -bool object_is_potion(object_type *o_ptr) -{ - return (k_info[o_ptr->k_idx].tval == TV_POTION); -} - - -/*! - * @brief オブジェクトが賞金首の報酬対象になるかを返す - * @param o_ptr 対象のオブジェクト構造体ポインタ - * @return オブジェクトが報酬対象になるならTRUEを返す - */ -bool object_is_shoukinkubi(object_type *o_ptr) -{ - int i; - - /* Require corpse or skeleton */ - if (o_ptr->tval != TV_CORPSE) return FALSE; - - /* No wanted monsters in vanilla town */ - if (vanilla_town) return FALSE; - - /* Today's wanted */ - if (p_ptr->today_mon > 0 && (streq(r_name + r_info[o_ptr->pval].name, r_name + r_info[today_mon].name))) return TRUE; - - /* Tsuchinoko */ - if (o_ptr->pval == MON_TSUCHINOKO) return TRUE; - - /* Unique monster */ - for (i = 0; i < MAX_KUBI; i++) - if (o_ptr->pval == kubi_r_idx[i]) break; - if (i < MAX_KUBI) return TRUE; - - /* Not wanted */ - return FALSE; -} - -/*! - * @brief オブジェクトがプレイヤーの職業に応じた適正武器か否かを返す / Favorite weapons - * @param o_ptr 対象のオブジェクト構造体ポインタ - * @return オブジェクトが適正武器ならばTRUEを返す - */ -bool object_is_favorite(object_type *o_ptr) -{ - /* Only melee weapons match */ - if (!(o_ptr->tval == TV_POLEARM || - o_ptr->tval == TV_SWORD || - o_ptr->tval == TV_DIGGING || - o_ptr->tval == TV_HAFTED)) - { - return FALSE; - } - - /* Favorite weapons are varied depend on the class */ - switch (p_ptr->pclass) - { - case CLASS_PRIEST: - { - BIT_FLAGS flgs[TR_FLAG_SIZE]; - object_flags_known(o_ptr, flgs); - - if (!have_flag(flgs, TR_BLESSED) && - !(o_ptr->tval == TV_HAFTED)) - return FALSE; - break; - } - - case CLASS_MONK: - case CLASS_FORCETRAINER: - /* Icky to wield? */ - if (!(s_info[p_ptr->pclass].w_max[o_ptr->tval-TV_WEAPON_BEGIN][o_ptr->sval])) - return FALSE; - break; - - case CLASS_BEASTMASTER: - case CLASS_CAVALRY: - { - BIT_FLAGS flgs[TR_FLAG_SIZE]; - object_flags_known(o_ptr, flgs); - - /* Is it known to be suitable to using while riding? */ - if (!(have_flag(flgs, TR_RIDING))) - return FALSE; - - break; - } - - case CLASS_NINJA: - /* Icky to wield? */ - if (s_info[p_ptr->pclass].w_max[o_ptr->tval-TV_WEAPON_BEGIN][o_ptr->sval] <= WEAPON_EXP_BEGINNER) - return FALSE; - break; - - default: - /* All weapons are okay for non-special classes */ - return TRUE; - } - - return TRUE; -} - - -/*! - * @brief オブジェクトがレアアイテムかどうかを返す / - * Rare weapons/aromors including Blade of Chaos, Dragon armors, etc. - * @param o_ptr 対象のオブジェクト構造体ポインタ - * @return レアアイテムならばTRUEを返す - */ -bool object_is_rare(object_type *o_ptr) -{ - switch(o_ptr->tval) - { - case TV_HAFTED: - if (o_ptr->sval == SV_MACE_OF_DISRUPTION || - o_ptr->sval == SV_WIZSTAFF) return TRUE; - break; - - case TV_POLEARM: - if (o_ptr->sval == SV_SCYTHE_OF_SLICING || - o_ptr->sval == SV_DEATH_SCYTHE) return TRUE; - break; - - case TV_SWORD: - if (o_ptr->sval == SV_BLADE_OF_CHAOS || - o_ptr->sval == SV_DIAMOND_EDGE || - o_ptr->sval == SV_DOKUBARI || - o_ptr->sval == SV_HAYABUSA) return TRUE; - break; - - case TV_SHIELD: - if (o_ptr->sval == SV_DRAGON_SHIELD || - o_ptr->sval == SV_MIRROR_SHIELD) return TRUE; - break; - - case TV_HELM: - if (o_ptr->sval == SV_DRAGON_HELM) return TRUE; - break; - - case TV_BOOTS: - if (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE) return TRUE; - break; - - case TV_CLOAK: - if (o_ptr->sval == SV_ELVEN_CLOAK || - o_ptr->sval == SV_ETHEREAL_CLOAK || - o_ptr->sval == SV_SHADOW_CLOAK) return TRUE; - break; - - case TV_GLOVES: - if (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES) return TRUE; - break; - - case TV_SOFT_ARMOR: - if (o_ptr->sval == SV_KUROSHOUZOKU || - o_ptr->sval == SV_ABUNAI_MIZUGI) return TRUE; - break; - - case TV_DRAG_ARMOR: - return TRUE; - - default: - break; - } - - /* Any others are not "rare" objects. */ - return FALSE; -} - - -/*! - * @brief オブジェクトが武器として装備できるかどうかを返す / Check if an object is weapon (including bows and ammo) - * @param o_ptr 対象のオブジェクト構造体ポインタ - * @return 武器として使えるならばTRUEを返す - */ -bool object_is_weapon(object_type *o_ptr) -{ - if (TV_WEAPON_BEGIN <= o_ptr->tval && o_ptr->tval <= TV_WEAPON_END) return TRUE; - - return FALSE; -} - - -/*! - * @brief オブジェクトが武器や矢弾として使用できるかを返す / Check if an object is weapon (including bows and ammo) - * Rare weapons/aromors including Blade of Chaos, Dragon armors, etc. - * @param o_ptr 対象のオブジェクト構造体ポインタ - * @return 武器や矢弾として使えるならばTRUEを返す - */ -bool object_is_weapon_ammo(object_type *o_ptr) -{ - if (TV_MISSILE_BEGIN <= o_ptr->tval && o_ptr->tval <= TV_WEAPON_END) return TRUE; - - return FALSE; -} - -/*! - * @brief オブジェクトが矢弾として使用できるかどうかを返す / Check if an object is ammo - * @param o_ptr 対象のオブジェクト構造体ポインタ - * @return 矢弾として使えるならばTRUEを返す - */ -bool object_is_ammo(object_type *o_ptr) -{ - if (TV_MISSILE_BEGIN <= o_ptr->tval && o_ptr->tval <= TV_MISSILE_END) return TRUE; - - return FALSE; -} - -/*! - * @brief オブジェクトが防具として装備できるかどうかを返す / Check if an object is armour - * @param o_ptr 対象のオブジェクト構造体ポインタ - * @return 矢弾として使えるならばTRUEを返す - */ -bool object_is_armour(object_type *o_ptr) -{ - if (TV_ARMOR_BEGIN <= o_ptr->tval && o_ptr->tval <= TV_ARMOR_END) return TRUE; - - return FALSE; -} - -/*! - * @brief オブジェクトが武器、防具、矢弾として使用できるかを返す / Check if an object is weapon, armour or ammo - * @param o_ptr 対象のオブジェクト構造体ポインタ - * @return 武器、防具、矢弾として使えるならばTRUEを返す - */ -bool object_is_weapon_armour_ammo(object_type *o_ptr) -{ - if (object_is_weapon_ammo(o_ptr) || object_is_armour(o_ptr)) return TRUE; - - return FALSE; -} - - -/*! - * @brief オブジェクトが近接武器として装備できるかを返す / Melee weapons - * @param o_ptr 対象のオブジェクト構造体ポインタ - * @return 近接武器として使えるならばTRUEを返す - */ -bool object_is_melee_weapon(object_type *o_ptr) -{ - if (TV_DIGGING <= o_ptr->tval && o_ptr->tval <= TV_SWORD) return TRUE; - - return FALSE; -} - - -/*! - * @brief オブジェクトが装備可能であるかを返す / Wearable including all weapon, all armour, bow, light source, amulet, and ring - * @param o_ptr 対象のオブジェクト構造体ポインタ - * @return 装備可能ならばTRUEを返す - */ -bool object_is_wearable(object_type *o_ptr) -{ - if (TV_WEARABLE_BEGIN <= o_ptr->tval && o_ptr->tval <= TV_WEARABLE_END) return TRUE; - - return FALSE; -} - - -/*! - * @brief オブジェクトが装備品であるかを返す(object_is_wearableに矢弾を含む) / Equipment including all wearable objects and ammo - * @param o_ptr 対象のオブジェクト構造体ポインタ - * @return 装備品ならばTRUEを返す - */ -bool object_is_equipment(object_type *o_ptr) -{ - if (TV_EQUIP_BEGIN <= o_ptr->tval && o_ptr->tval <= TV_EQUIP_END) return TRUE; - - return FALSE; -} - - -/*! - * @brief オブジェクトが強化不能武器であるかを返す / Poison needle can not be enchanted - * @param o_ptr 対象のオブジェクト構造体ポインタ - * @return 強化不能ならばTRUEを返す - */ -bool object_refuse_enchant_weapon(object_type *o_ptr) -{ - if (o_ptr->tval == TV_SWORD && o_ptr->sval == SV_DOKUBARI) return TRUE; - - return FALSE; -} - - -/*! - * @brief オブジェクトが強化可能武器であるかを返す / - * Check if an object is weapon (including bows and ammo) and allows enchantment - * @param o_ptr 対象のオブジェクト構造体ポインタ - * @return 強化可能ならばTRUEを返す - */ -bool object_allow_enchant_weapon(object_type *o_ptr) -{ - if (object_is_weapon_ammo(o_ptr) && !object_refuse_enchant_weapon(o_ptr)) return TRUE; - - return FALSE; -} - - -/*! - * @brief オブジェクトが強化可能な近接武器であるかを返す / - * Check if an object is melee weapon and allows enchantment - * @param o_ptr 対象のオブジェクト構造体ポインタ - * @return 強化可能な近接武器ならばTRUEを返す - */ -bool object_allow_enchant_melee_weapon(object_type *o_ptr) -{ - if (object_is_melee_weapon(o_ptr) && !object_refuse_enchant_weapon(o_ptr)) return TRUE; - - return FALSE; -} - - -/*! - * @brief オブジェクトが鍛冶師のエッセンス付加済みかを返す / - * Check if an object is made by a smith's special ability - * @param o_ptr 対象のオブジェクト構造体ポインタ - * @return エッセンス付加済みならばTRUEを返す - */ -bool object_is_smith(object_type *o_ptr) -{ - if (object_is_weapon_armour_ammo(o_ptr) && o_ptr->xtra3) return TRUE; - - return FALSE; -} - -/*! - * @brief オブジェクトがアーティファクトかを返す / - * Check if an object is artifact - * @param o_ptr 対象のオブジェクト構造体ポインタ - * @return アーティファクトならばTRUEを返す - */ -bool object_is_artifact(object_type *o_ptr) -{ - if (object_is_fixed_artifact(o_ptr) || o_ptr->art_name) return TRUE; - - return FALSE; -} - - -/*! - * @brief オブジェクトがランダムアーティファクトかを返す / - * Check if an object is random artifact - * @param o_ptr 対象のオブジェクト構造体ポインタ - * @return ランダムアーティファクトならばTRUEを返す - */ -bool object_is_random_artifact(object_type *o_ptr) -{ - if (object_is_artifact(o_ptr) && !object_is_fixed_artifact(o_ptr)) return TRUE; - - return FALSE; -} - -/*! - * @brief オブジェクトが通常のアイテム(アーティファクト、エゴ、鍛冶師エッセンス付加いずれでもない)かを返す / - * Check if an object is neither artifact, ego, nor 'smith' object - * @param o_ptr 対象のオブジェクト構造体ポインタ - * @return 通常のアイテムならばTRUEを返す - */ -bool object_is_nameless(object_type *o_ptr) -{ - if (!object_is_artifact(o_ptr) && !object_is_ego(o_ptr) && !object_is_smith(o_ptr)) - return TRUE; - - return FALSE; -} - - -/*! - * @brief オブジェクトが両手持ち可能な武器かを返す / - * Check if an object is melee weapon and allows wielding with two-hands - * @param o_ptr 対象のオブジェクト構造体ポインタ - * @return 両手持ち可能ならばTRUEを返す - */ -bool object_allow_two_hands_wielding(object_type *o_ptr) -{ - if (object_is_melee_weapon(o_ptr) && ((o_ptr->weight > 99) || (o_ptr->tval == TV_POLEARM))) return TRUE; - - return FALSE; -} diff --git a/src/object-curse.c b/src/object-curse.c index 9e28459c2..09a5bb4ac 100644 --- a/src/object-curse.c +++ b/src/object-curse.c @@ -1,4 +1,5 @@ #include "angband.h" +#include "object-hook.h" /*! * @brief アイテムに付加される可能性のある呪いを指定する。 diff --git a/src/object-hook.c b/src/object-hook.c index 9ed8faf31..5f451a4e2 100644 --- a/src/object-hook.c +++ b/src/object-hook.c @@ -511,3 +511,387 @@ bool item_tester_refill_lantern(object_type *o_ptr) return (FALSE); } + +/*! + * @brief オブジェクトが薬であるかを返す + * @param o_ptr 対象のオブジェクト構造体ポインタ + * @return オブジェクトが薬ならばTRUEを返す + */ +bool object_is_potion(object_type *o_ptr) +{ + return (k_info[o_ptr->k_idx].tval == TV_POTION); +} + + +/*! + * @brief オブジェクトが賞金首の報酬対象になるかを返す + * @param o_ptr 対象のオブジェクト構造体ポインタ + * @return オブジェクトが報酬対象になるならTRUEを返す + */ +bool object_is_shoukinkubi(object_type *o_ptr) +{ + int i; + + /* Require corpse or skeleton */ + if (o_ptr->tval != TV_CORPSE) return FALSE; + + /* No wanted monsters in vanilla town */ + if (vanilla_town) return FALSE; + + /* Today's wanted */ + if (p_ptr->today_mon > 0 && (streq(r_name + r_info[o_ptr->pval].name, r_name + r_info[today_mon].name))) return TRUE; + + /* Tsuchinoko */ + if (o_ptr->pval == MON_TSUCHINOKO) return TRUE; + + /* Unique monster */ + for (i = 0; i < MAX_KUBI; i++) + if (o_ptr->pval == kubi_r_idx[i]) break; + if (i < MAX_KUBI) return TRUE; + + /* Not wanted */ + return FALSE; +} + +/*! + * @brief オブジェクトがプレイヤーの職業に応じた適正武器か否かを返す / Favorite weapons + * @param o_ptr 対象のオブジェクト構造体ポインタ + * @return オブジェクトが適正武器ならばTRUEを返す + */ +bool object_is_favorite(object_type *o_ptr) +{ + /* Only melee weapons match */ + if (!(o_ptr->tval == TV_POLEARM || + o_ptr->tval == TV_SWORD || + o_ptr->tval == TV_DIGGING || + o_ptr->tval == TV_HAFTED)) + { + return FALSE; + } + + /* Favorite weapons are varied depend on the class */ + switch (p_ptr->pclass) + { + case CLASS_PRIEST: + { + BIT_FLAGS flgs[TR_FLAG_SIZE]; + object_flags_known(o_ptr, flgs); + + if (!have_flag(flgs, TR_BLESSED) && + !(o_ptr->tval == TV_HAFTED)) + return FALSE; + break; + } + + case CLASS_MONK: + case CLASS_FORCETRAINER: + /* Icky to wield? */ + if (!(s_info[p_ptr->pclass].w_max[o_ptr->tval - TV_WEAPON_BEGIN][o_ptr->sval])) + return FALSE; + break; + + case CLASS_BEASTMASTER: + case CLASS_CAVALRY: + { + BIT_FLAGS flgs[TR_FLAG_SIZE]; + object_flags_known(o_ptr, flgs); + + /* Is it known to be suitable to using while riding? */ + if (!(have_flag(flgs, TR_RIDING))) + return FALSE; + + break; + } + + case CLASS_NINJA: + /* Icky to wield? */ + if (s_info[p_ptr->pclass].w_max[o_ptr->tval - TV_WEAPON_BEGIN][o_ptr->sval] <= WEAPON_EXP_BEGINNER) + return FALSE; + break; + + default: + /* All weapons are okay for non-special classes */ + return TRUE; + } + + return TRUE; +} + + +/*! + * @brief オブジェクトがレアアイテムかどうかを返す / + * Rare weapons/aromors including Blade of Chaos, Dragon armors, etc. + * @param o_ptr 対象のオブジェクト構造体ポインタ + * @return レアアイテムならばTRUEを返す + */ +bool object_is_rare(object_type *o_ptr) +{ + switch (o_ptr->tval) + { + case TV_HAFTED: + if (o_ptr->sval == SV_MACE_OF_DISRUPTION || + o_ptr->sval == SV_WIZSTAFF) return TRUE; + break; + + case TV_POLEARM: + if (o_ptr->sval == SV_SCYTHE_OF_SLICING || + o_ptr->sval == SV_DEATH_SCYTHE) return TRUE; + break; + + case TV_SWORD: + if (o_ptr->sval == SV_BLADE_OF_CHAOS || + o_ptr->sval == SV_DIAMOND_EDGE || + o_ptr->sval == SV_DOKUBARI || + o_ptr->sval == SV_HAYABUSA) return TRUE; + break; + + case TV_SHIELD: + if (o_ptr->sval == SV_DRAGON_SHIELD || + o_ptr->sval == SV_MIRROR_SHIELD) return TRUE; + break; + + case TV_HELM: + if (o_ptr->sval == SV_DRAGON_HELM) return TRUE; + break; + + case TV_BOOTS: + if (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE) return TRUE; + break; + + case TV_CLOAK: + if (o_ptr->sval == SV_ELVEN_CLOAK || + o_ptr->sval == SV_ETHEREAL_CLOAK || + o_ptr->sval == SV_SHADOW_CLOAK) return TRUE; + break; + + case TV_GLOVES: + if (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES) return TRUE; + break; + + case TV_SOFT_ARMOR: + if (o_ptr->sval == SV_KUROSHOUZOKU || + o_ptr->sval == SV_ABUNAI_MIZUGI) return TRUE; + break; + + case TV_DRAG_ARMOR: + return TRUE; + + default: + break; + } + + /* Any others are not "rare" objects. */ + return FALSE; +} + + +/*! + * @brief オブジェクトが武器として装備できるかどうかを返す / Check if an object is weapon (including bows and ammo) + * @param o_ptr 対象のオブジェクト構造体ポインタ + * @return 武器として使えるならばTRUEを返す + */ +bool object_is_weapon(object_type *o_ptr) +{ + if (TV_WEAPON_BEGIN <= o_ptr->tval && o_ptr->tval <= TV_WEAPON_END) return TRUE; + + return FALSE; +} + + +/*! + * @brief オブジェクトが武器や矢弾として使用できるかを返す / Check if an object is weapon (including bows and ammo) + * Rare weapons/aromors including Blade of Chaos, Dragon armors, etc. + * @param o_ptr 対象のオブジェクト構造体ポインタ + * @return 武器や矢弾として使えるならばTRUEを返す + */ +bool object_is_weapon_ammo(object_type *o_ptr) +{ + if (TV_MISSILE_BEGIN <= o_ptr->tval && o_ptr->tval <= TV_WEAPON_END) return TRUE; + + return FALSE; +} + +/*! + * @brief オブジェクトが矢弾として使用できるかどうかを返す / Check if an object is ammo + * @param o_ptr 対象のオブジェクト構造体ポインタ + * @return 矢弾として使えるならばTRUEを返す + */ +bool object_is_ammo(object_type *o_ptr) +{ + if (TV_MISSILE_BEGIN <= o_ptr->tval && o_ptr->tval <= TV_MISSILE_END) return TRUE; + + return FALSE; +} + +/*! + * @brief オブジェクトが防具として装備できるかどうかを返す / Check if an object is armour + * @param o_ptr 対象のオブジェクト構造体ポインタ + * @return 矢弾として使えるならばTRUEを返す + */ +bool object_is_armour(object_type *o_ptr) +{ + if (TV_ARMOR_BEGIN <= o_ptr->tval && o_ptr->tval <= TV_ARMOR_END) return TRUE; + + return FALSE; +} + +/*! + * @brief オブジェクトが武器、防具、矢弾として使用できるかを返す / Check if an object is weapon, armour or ammo + * @param o_ptr 対象のオブジェクト構造体ポインタ + * @return 武器、防具、矢弾として使えるならばTRUEを返す + */ +bool object_is_weapon_armour_ammo(object_type *o_ptr) +{ + if (object_is_weapon_ammo(o_ptr) || object_is_armour(o_ptr)) return TRUE; + + return FALSE; +} + + +/*! + * @brief オブジェクトが近接武器として装備できるかを返す / Melee weapons + * @param o_ptr 対象のオブジェクト構造体ポインタ + * @return 近接武器として使えるならばTRUEを返す + */ +bool object_is_melee_weapon(object_type *o_ptr) +{ + if (TV_DIGGING <= o_ptr->tval && o_ptr->tval <= TV_SWORD) return TRUE; + + return FALSE; +} + + +/*! + * @brief オブジェクトが装備可能であるかを返す / Wearable including all weapon, all armour, bow, light source, amulet, and ring + * @param o_ptr 対象のオブジェクト構造体ポインタ + * @return 装備可能ならばTRUEを返す + */ +bool object_is_wearable(object_type *o_ptr) +{ + if (TV_WEARABLE_BEGIN <= o_ptr->tval && o_ptr->tval <= TV_WEARABLE_END) return TRUE; + + return FALSE; +} + + +/*! + * @brief オブジェクトが装備品であるかを返す(object_is_wearableに矢弾を含む) / Equipment including all wearable objects and ammo + * @param o_ptr 対象のオブジェクト構造体ポインタ + * @return 装備品ならばTRUEを返す + */ +bool object_is_equipment(object_type *o_ptr) +{ + if (TV_EQUIP_BEGIN <= o_ptr->tval && o_ptr->tval <= TV_EQUIP_END) return TRUE; + + return FALSE; +} + + +/*! + * @brief オブジェクトが強化不能武器であるかを返す / Poison needle can not be enchanted + * @param o_ptr 対象のオブジェクト構造体ポインタ + * @return 強化不能ならばTRUEを返す + */ +bool object_refuse_enchant_weapon(object_type *o_ptr) +{ + if (o_ptr->tval == TV_SWORD && o_ptr->sval == SV_DOKUBARI) return TRUE; + + return FALSE; +} + + +/*! + * @brief オブジェクトが強化可能武器であるかを返す / + * Check if an object is weapon (including bows and ammo) and allows enchantment + * @param o_ptr 対象のオブジェクト構造体ポインタ + * @return 強化可能ならばTRUEを返す + */ +bool object_allow_enchant_weapon(object_type *o_ptr) +{ + if (object_is_weapon_ammo(o_ptr) && !object_refuse_enchant_weapon(o_ptr)) return TRUE; + + return FALSE; +} + + +/*! + * @brief オブジェクトが強化可能な近接武器であるかを返す / + * Check if an object is melee weapon and allows enchantment + * @param o_ptr 対象のオブジェクト構造体ポインタ + * @return 強化可能な近接武器ならばTRUEを返す + */ +bool object_allow_enchant_melee_weapon(object_type *o_ptr) +{ + if (object_is_melee_weapon(o_ptr) && !object_refuse_enchant_weapon(o_ptr)) return TRUE; + + return FALSE; +} + + +/*! + * @brief オブジェクトが鍛冶師のエッセンス付加済みかを返す / + * Check if an object is made by a smith's special ability + * @param o_ptr 対象のオブジェクト構造体ポインタ + * @return エッセンス付加済みならばTRUEを返す + */ +bool object_is_smith(object_type *o_ptr) +{ + if (object_is_weapon_armour_ammo(o_ptr) && o_ptr->xtra3) return TRUE; + + return FALSE; +} + +/*! + * @brief オブジェクトがアーティファクトかを返す / + * Check if an object is artifact + * @param o_ptr 対象のオブジェクト構造体ポインタ + * @return アーティファクトならばTRUEを返す + */ +bool object_is_artifact(object_type *o_ptr) +{ + if (object_is_fixed_artifact(o_ptr) || o_ptr->art_name) return TRUE; + + return FALSE; +} + + +/*! + * @brief オブジェクトがランダムアーティファクトかを返す / + * Check if an object is random artifact + * @param o_ptr 対象のオブジェクト構造体ポインタ + * @return ランダムアーティファクトならばTRUEを返す + */ +bool object_is_random_artifact(object_type *o_ptr) +{ + if (object_is_artifact(o_ptr) && !object_is_fixed_artifact(o_ptr)) return TRUE; + + return FALSE; +} + +/*! + * @brief オブジェクトが通常のアイテム(アーティファクト、エゴ、鍛冶師エッセンス付加いずれでもない)かを返す / + * Check if an object is neither artifact, ego, nor 'smith' object + * @param o_ptr 対象のオブジェクト構造体ポインタ + * @return 通常のアイテムならばTRUEを返す + */ +bool object_is_nameless(object_type *o_ptr) +{ + if (!object_is_artifact(o_ptr) && !object_is_ego(o_ptr) && !object_is_smith(o_ptr)) + return TRUE; + + return FALSE; +} + + +/*! + * @brief オブジェクトが両手持ち可能な武器かを返す / + * Check if an object is melee weapon and allows wielding with two-hands + * @param o_ptr 対象のオブジェクト構造体ポインタ + * @return 両手持ち可能ならばTRUEを返す + */ +bool object_allow_two_hands_wielding(object_type *o_ptr) +{ + if (object_is_melee_weapon(o_ptr) && ((o_ptr->weight > 99) || (o_ptr->tval == TV_POLEARM))) return TRUE; + + return FALSE; +} diff --git a/src/object-hook.h b/src/object-hook.h index b67ef3910..9e7ca5091 100644 --- a/src/object-hook.h +++ b/src/object-hook.h @@ -26,3 +26,24 @@ extern bool item_tester_hook_recharge(object_type *o_ptr); extern bool item_tester_learn_spell(object_type *o_ptr); extern bool item_tester_high_level_book(object_type *o_ptr); extern bool item_tester_refill_lantern(object_type *o_ptr); + +extern bool object_is_potion(object_type *o_ptr); +extern bool object_is_shoukinkubi(object_type *o_ptr); +extern bool object_is_favorite(object_type *o_ptr); +extern bool object_is_rare(object_type *o_ptr); +extern bool object_is_weapon(object_type *o_ptr); +extern bool object_is_weapon_ammo(object_type *o_ptr); +extern bool object_is_ammo(object_type *o_ptr); +extern bool object_is_armour(object_type *o_ptr); +extern bool object_is_weapon_armour_ammo(object_type *o_ptr); +extern bool object_is_melee_weapon(object_type *o_ptr); +extern bool object_is_wearable(object_type *o_ptr); +extern bool object_is_equipment(object_type *o_ptr); +extern bool object_refuse_enchant_weapon(object_type *o_ptr); +extern bool object_allow_enchant_weapon(object_type *o_ptr); +extern bool object_allow_enchant_melee_weapon(object_type *o_ptr); +extern bool object_is_smith(object_type *o_ptr); +extern bool object_is_artifact(object_type *o_ptr); +extern bool object_is_random_artifact(object_type *o_ptr); +extern bool object_is_nameless(object_type *o_ptr); +extern bool object_allow_two_hands_wielding(object_type *o_ptr); \ No newline at end of file diff --git a/src/object1.c b/src/object1.c index 6c29b9f12..d824d4c04 100644 --- a/src/object1.c +++ b/src/object1.c @@ -14,6 +14,7 @@ #include "angband.h" #include "artifact.h" #include "cmd-activate.h" +#include "object-hook.h" #if defined(MACINTOSH) || defined(MACH_O_CARBON) #ifdef verify diff --git a/src/player-damage.c b/src/player-damage.c index 5e398bf7c..426b262f6 100644 --- a/src/player-damage.c +++ b/src/player-damage.c @@ -1,6 +1,7 @@ #include "angband.h" #include "player-damage.h" #include "artifact.h" +#include "object-hook.h" /*! diff --git a/src/player-status.c b/src/player-status.c index 59c5e7668..e7cfd7a71 100644 --- a/src/player-status.c +++ b/src/player-status.c @@ -4,6 +4,7 @@ #include "artifact.h" #include "avatar.h" #include "spells-status.h" +#include "object-hook.h" /* Hack, monk armour */ static bool monk_armour_aux; diff --git a/src/spells1.c b/src/spells1.c index 826fc116f..f87bdb017 100644 --- a/src/spells1.c +++ b/src/spells1.c @@ -32,6 +32,7 @@ #include "avatar.h" #include "player-status.h" #include "realm-hex.h" +#include "object-hook.h" static int rakubadam_m; /*!< 振り落とされた際のダメージ量 */ diff --git a/src/spells2.c b/src/spells2.c index 299b5b74c..69f948c45 100644 --- a/src/spells2.c +++ b/src/spells2.c @@ -26,6 +26,7 @@ #include "spells-status.h" #include "realm-hex.h" +#include "object-hook.h" /*! * @brief プレイヤー周辺の地形を感知する diff --git a/src/store.c b/src/store.c index 4d5755bfc..7333c6850 100644 --- a/src/store.c +++ b/src/store.c @@ -19,6 +19,7 @@ #include "cmd-spell.h" #include "rumor.h" #include "player-status.h" +#include "object-hook.h" #define MIN_STOCK 12 diff --git a/src/wizard2.c b/src/wizard2.c index 5fbcbc98c..64786f26c 100644 --- a/src/wizard2.c +++ b/src/wizard2.c @@ -23,6 +23,7 @@ #include "spells-object.h" #include "spells-summon.h" #include "spells-status.h" +#include "object-hook.h" #ifdef ALLOW_WIZARD -- 2.11.0