OSDN Git Service

Merge pull request #3532 from sikabane-works/release/3.0.0.87-alpha
[hengbandforosx/hengbandosx.git] / src / object-hook / hook-weapon.cpp
1 #include "object-hook/hook-weapon.h"
2 #include "object-enchant/tr-types.h"
3 #include "object-hook/hook-armor.h"
4 #include "object/object-flags.h"
5 #include "object/tval-types.h"
6 #include "player/player-skill.h"
7 #include "sv-definition/sv-weapon-types.h"
8 #include "system/item-entity.h"
9 #include "system/player-type-definition.h"
10 #include "util/bit-flags-calculator.h"
11
12 /*!
13  * @brief オブジェクトがプレイヤーの職業に応じた適正武器か否かを返す / Favorite weapons
14  * @param o_ptr 対象のオブジェクト構造体ポインタ
15  * @return オブジェクトが適正武器ならばTRUEを返す
16  */
17 bool object_is_favorite(PlayerType *player_ptr, const ItemEntity *o_ptr)
18 {
19     if (!o_ptr->is_melee_weapon()) {
20         return false;
21     }
22
23     /* Favorite weapons are varied depend on the class */
24     const auto tval = o_ptr->bi_key.tval();
25     const auto sval = o_ptr->bi_key.sval().value();
26     switch (player_ptr->pclass) {
27     case PlayerClassType::PRIEST: {
28         const auto flags = object_flags_known(o_ptr);
29         return flags.has(TR_BLESSED) || (tval == ItemKindType::HAFTED);
30     }
31     case PlayerClassType::MONK:
32     case PlayerClassType::FORCETRAINER:
33         /* Icky to wield? */
34         return player_ptr->weapon_exp_max[tval][sval] != PlayerSkill::weapon_exp_at(PlayerSkillRank::UNSKILLED);
35     case PlayerClassType::BEASTMASTER:
36     case PlayerClassType::CAVALRY: {
37         /* Is it known to be suitable to using while riding? */
38         auto flags = object_flags_known(o_ptr);
39         return flags.has(TR_RIDING);
40     }
41     case PlayerClassType::SORCERER:
42         return player_ptr->weapon_exp_max[tval][sval] >= PlayerSkill::weapon_exp_at(PlayerSkillRank::MASTER);
43     case PlayerClassType::NINJA:
44         /* Icky to wield? */
45         return player_ptr->weapon_exp_max[tval][sval] > PlayerSkill::weapon_exp_at(PlayerSkillRank::BEGINNER);
46     default:
47         return true;
48     }
49 }