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 "player/player-skill.h"
6 #include "sv-definition/sv-weapon-types.h"
7 #include "system/object-type-definition.h"
8 #include "system/player-type-definition.h"
9 #include "util/bit-flags-calculator.h"
12 * @brief オブジェクトがプレイヤーの職業に応じた適正武器か否かを返す / Favorite weapons
13 * @param o_ptr 対象のオブジェクト構造体ポインタ
14 * @return オブジェクトが適正武器ならばTRUEを返す
16 bool object_is_favorite(PlayerType *player_ptr, const ObjectType *o_ptr)
18 /* Only melee weapons match */
19 if (!(o_ptr->tval == ItemKindType::POLEARM || o_ptr->tval == ItemKindType::SWORD || o_ptr->tval == ItemKindType::DIGGING || o_ptr->tval == ItemKindType::HAFTED)) {
23 /* Favorite weapons are varied depend on the class */
24 switch (player_ptr->pclass) {
25 case PlayerClassType::PRIEST: {
26 auto flgs = object_flags_known(o_ptr);
28 if (flgs.has_not(TR_BLESSED) && !(o_ptr->tval == ItemKindType::HAFTED))
33 case PlayerClassType::MONK:
34 case PlayerClassType::FORCETRAINER:
36 if (player_ptr->weapon_exp_max[o_ptr->tval][o_ptr->sval] == PlayerSkill::weapon_exp_at(PlayerSkillRank::UNSKILLED))
40 case PlayerClassType::BEASTMASTER:
41 case PlayerClassType::CAVALRY: {
42 auto flgs = object_flags_known(o_ptr);
44 /* Is it known to be suitable to using while riding? */
45 if (flgs.has_not(TR_RIDING))
51 case PlayerClassType::SORCERER:
52 if (player_ptr->weapon_exp_max[o_ptr->tval][o_ptr->sval] < PlayerSkill::weapon_exp_at(PlayerSkillRank::MASTER))
56 case PlayerClassType::NINJA:
58 if (player_ptr->weapon_exp_max[o_ptr->tval][o_ptr->sval] <= PlayerSkill::weapon_exp_at(PlayerSkillRank::BEGINNER))
63 /* All weapons are okay for non-special classes */