OSDN Git Service

[Refactor] PlayerSkill クラスを新設
authorHabu <habu1010+github@gmail.com>
Fri, 15 Oct 2021 15:37:43 +0000 (00:37 +0900)
committerHabu <habu1010+github@gmail.com>
Fri, 15 Oct 2021 15:37:43 +0000 (00:37 +0900)
熟練度関連の処理を集約する PlayerSkill クラスを新設する。
まず手始めに武器熟練度経験値の増加処理を以下のメンバ関数に移設する。

- gain_melee_weapon_exp(): 近接武器の熟練度経験値増加処理
- gain_range_weapon_exp(): 遠隔武器の熟練度経験値増加処理

src/combat/shoot.cpp
src/player-attack/player-attack.cpp
src/player/player-skill.cpp
src/player/player-skill.h

index d34b811..1e30700 100644 (file)
@@ -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) {
index d854bfa..e44f55e 100644 (file)
@@ -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);
 }
 
 /*!
index 19d7c18..f6f063e 100644 (file)
@@ -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<skill_table> 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);
+}
index 424da83..f98987a 100644 (file)
@@ -58,3 +58,17 @@ typedef struct skill_table {
 } skill_table;
 
 extern std::vector<skill_table> 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;
+};