From: Habu Date: Fri, 15 Oct 2021 15:37:43 +0000 (+0900) Subject: [Refactor] PlayerSkill クラスを新設 X-Git-Tag: vmacos3.0.0-alpha52~52^2~2^2~3 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=948e8fe6f2063515e2f59fa3dcf9b8e6f4048c14;p=hengbandforosx%2Fhengbandosx.git [Refactor] PlayerSkill クラスを新設 熟練度関連の処理を集約する PlayerSkill クラスを新設する。 まず手始めに武器熟練度経験値の増加処理を以下のメンバ関数に移設する。 - gain_melee_weapon_exp(): 近接武器の熟練度経験値増加処理 - gain_range_weapon_exp(): 遠隔武器の熟練度経験値増加処理 --- diff --git a/src/combat/shoot.cpp b/src/combat/shoot.cpp index d34b81155..1e3070031 100644 --- a/src/combat/shoot.cpp +++ b/src/combat/shoot.cpp @@ -637,20 +637,7 @@ void exe_fire(player_type *player_ptr, INVENTORY_IDX item, object_type *j_ptr, S } if ((r_ptr->level + 10) > player_ptr->lev) { - auto &now_exp = player_ptr->weapon_exp[j_ptr->tval][j_ptr->sval]; - if (now_exp < s_info[enum2i(player_ptr->pclass)].w_max[j_ptr->tval][j_ptr->sval]) { - SUB_EXP amount = 0; - if (now_exp < WEAPON_EXP_BEGINNER) - amount = 80; - else if (now_exp < WEAPON_EXP_SKILLED) - amount = 25; - else if ((now_exp < WEAPON_EXP_EXPERT) && (player_ptr->lev > 19)) - amount = 10; - else if (player_ptr->lev > 34) - amount = 2; - now_exp += amount; - set_bits(player_ptr->update, PU_BONUS); - } + PlayerSkill(player_ptr).gain_range_weapon_exp(j_ptr); } if (player_ptr->riding) { diff --git a/src/player-attack/player-attack.cpp b/src/player-attack/player-attack.cpp index d854bfa52..e44f55ecf 100644 --- a/src/player-attack/player-attack.cpp +++ b/src/player-attack/player-attack.cpp @@ -139,24 +139,9 @@ static void get_bare_knuckle_exp(player_type *player_ptr, player_attack_type *pa */ static void get_weapon_exp(player_type *player_ptr, player_attack_type *pa_ptr) { - auto tval = player_ptr->inventory_list[INVEN_MAIN_HAND + pa_ptr->hand].tval; - auto sval = player_ptr->inventory_list[INVEN_MAIN_HAND + pa_ptr->hand].sval; - int now_exp = player_ptr->weapon_exp[tval][sval]; - if (now_exp >= s_info[enum2i(player_ptr->pclass)].w_max[tval][sval]) - return; + auto *o_ptr = &player_ptr->inventory_list[INVEN_MAIN_HAND + pa_ptr->hand]; - SUB_EXP amount = 0; - if (now_exp < WEAPON_EXP_BEGINNER) - amount = 80; - else if (now_exp < WEAPON_EXP_SKILLED) - amount = 10; - else if ((now_exp < WEAPON_EXP_EXPERT) && (player_ptr->lev > 19)) - amount = 1; - else if ((player_ptr->lev > 34) && one_in_(2)) - amount = 1; - - player_ptr->weapon_exp[tval][sval] += amount; - player_ptr->update |= (PU_BONUS); + PlayerSkill(player_ptr).gain_melee_weapon_exp(o_ptr); } /*! diff --git a/src/player/player-skill.cpp b/src/player/player-skill.cpp index 19d7c18d8..f6f063ed7 100644 --- a/src/player/player-skill.cpp +++ b/src/player/player-skill.cpp @@ -1,4 +1,8 @@ #include "player/player-skill.h" +#include "core/player-update-types.h" +#include "system/object-type-definition.h" +#include "system/player-type-definition.h" +#include "util/bit-flags-calculator.h" /* * The skill table @@ -10,7 +14,52 @@ std::vector s_info; */ const concptr exp_level_str[5] = #ifdef JP -{ "[初心者]", "[入門者]", "[熟練者]", "[エキスパート]", "[達人]" }; + { "[初心者]", "[入門者]", "[熟練者]", "[エキスパート]", "[達人]" }; #else -{"[Unskilled]", "[Beginner]", "[Skilled]", "[Expert]", "[Master]"}; + { "[Unskilled]", "[Beginner]", "[Skilled]", "[Expert]", "[Master]" }; #endif + +PlayerSkill::PlayerSkill(player_type *player_ptr) + : player_ptr(player_ptr) +{ +} + +void PlayerSkill::gain_melee_weapon_exp(const object_type *o_ptr) +{ + auto now_exp = this->player_ptr->weapon_exp[o_ptr->tval][o_ptr->sval]; + if (now_exp >= s_info[enum2i(this->player_ptr->pclass)].w_max[o_ptr->tval][o_ptr->sval]) + return; + + SUB_EXP amount = 0; + if (now_exp < WEAPON_EXP_BEGINNER) + amount = 80; + else if (now_exp < WEAPON_EXP_SKILLED) + amount = 10; + else if ((now_exp < WEAPON_EXP_EXPERT) && (this->player_ptr->lev > 19)) + amount = 1; + else if ((player_ptr->lev > 34) && one_in_(2)) + amount = 1; + + this->player_ptr->weapon_exp[o_ptr->tval][o_ptr->sval] += amount; + set_bits(this->player_ptr->update, PU_BONUS); +} + +void PlayerSkill::gain_range_weapon_exp(const object_type *o_ptr) +{ + auto now_exp = this->player_ptr->weapon_exp[o_ptr->tval][o_ptr->sval]; + if (now_exp >= s_info[enum2i(this->player_ptr->pclass)].w_max[o_ptr->tval][o_ptr->sval]) + return; + + SUB_EXP amount = 0; + if (now_exp < WEAPON_EXP_BEGINNER) + amount = 80; + else if (now_exp < WEAPON_EXP_SKILLED) + amount = 25; + else if ((now_exp < WEAPON_EXP_EXPERT) && (this->player_ptr->lev > 19)) + amount = 10; + else if (this->player_ptr->lev > 34) + amount = 2; + + this->player_ptr->weapon_exp[o_ptr->tval][o_ptr->sval] += amount; + set_bits(this->player_ptr->update, PU_BONUS); +} diff --git a/src/player/player-skill.h b/src/player/player-skill.h index 424da83b4..f98987a4b 100644 --- a/src/player/player-skill.h +++ b/src/player/player-skill.h @@ -58,3 +58,17 @@ typedef struct skill_table { } skill_table; extern std::vector s_info; + +struct object_type; +struct player_type; + +class PlayerSkill { +public: + PlayerSkill(player_type *player_ptr); + + void gain_melee_weapon_exp(const object_type *o_ptr); + void gain_range_weapon_exp(const object_type *o_ptr); + +private: + player_type *player_ptr; +};