OSDN Git Service

[Refactor] 赤外線視力管理クラス PlayerInfravisionの導入
authordis- <dis.rogue@gmail.com>
Tue, 27 Apr 2021 09:31:36 +0000 (18:31 +0900)
committerdis- <dis.rogue@gmail.com>
Tue, 27 Apr 2021 09:31:36 +0000 (18:31 +0900)
PlayerStatusBaseの派生クラスの実装を進める。
赤外線視力の処理を分離。

Hengband/Hengband/Hengband.vcxproj
Hengband/Hengband/Hengband.vcxproj.filters
src/Makefile.am
src/player-status/player-infravision.cpp [new file with mode: 0644]
src/player-status/player-infravision.h [new file with mode: 0644]
src/player/player-status-flags.cpp
src/player/player-status.cpp

index 64d46d7..cee6806 100644 (file)
     <ClCompile Include="..\..\src\player-status\player-speed.cpp" />\r
     <ClCompile Include="..\..\src\player-status\player-status-base.cpp" />\r
     <ClCompile Include="..\..\src\player-status\player-stealth.cpp" />\r
+    <ClCompile Include="..\..\src\player-status\player-infravision.cpp" />\r
     <ClCompile Include="..\..\src\player-status\player-basic-statistics.cpp" />\r
     <ClCompile Include="..\..\src\player-status\player-strength.cpp" />\r
     <ClCompile Include="..\..\src\player-status\player-intelligence.cpp" />\r
     <ClInclude Include="..\..\src\player-status\player-speed.h" />\r
     <ClInclude Include="..\..\src\player-status\player-status-base.h" />\r
     <ClInclude Include="..\..\src\player-status\player-stealth.h" />\r
+    <ClInclude Include="..\..\src\player-status\player-infravision.h" />\r
     <ClInclude Include="..\..\src\player-status\player-basic-statistics.h" />\r
     <ClInclude Include="..\..\src\player-status\player-strength.h" />\r
     <ClInclude Include="..\..\src\player-status\player-intelligence.h" />\r
index 73c5590..6a40f6c 100644 (file)
     <ClCompile Include="..\..\src\player-status\player-strength.cpp">\r
       <Filter>player-status</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\src\player-status\player-infravision.cpp">\r
+      <Filter>player-status</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\src\player-status\player-intelligence.cpp">\r
       <Filter>player-status</Filter>\r
     </ClCompile>\r
     <ClInclude Include="..\..\src\player-status\player-stealth.h">\r
       <Filter>player-status</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\src\player-status\player-infravision.h">\r
+      <Filter>player-status</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\src\player-status\player-basic-statistics.h">\r
       <Filter>player-status</Filter>\r
     </ClInclude>\r
index 0197dcd..c1184b2 100644 (file)
@@ -636,6 +636,7 @@ hengband_SOURCES = \
        player-status/player-status-base.h \
        player-status/player-speed.h \
        player-status/player-stealth.h \
+       player-status/player-infravision.h \
        player-status/player-basic-statistics.h \
        player-status/player-strength.h \
        player-status/player-intelligence.h \
@@ -646,6 +647,7 @@ hengband_SOURCES = \
        player-status/player-status-base.cpp \
        player-status/player-speed.cpp \
        player-status/player-stealth.cpp \
+       player-status/player-infravision.cpp \
        player-status/player-basic-statistics.cpp \
        player-status/player-strength.cpp \
        player-status/player-intelligence.cpp \
diff --git a/src/player-status/player-infravision.cpp b/src/player-status/player-infravision.cpp
new file mode 100644 (file)
index 0000000..9ced307
--- /dev/null
@@ -0,0 +1,67 @@
+#include "player-status/player-infravision.h"
+#include "mutation/mutation-flag-types.h"
+#include "player/mimic-info-table.h"
+#include "player/player-race-types.h"
+#include "player/race-info-table.h"
+#include "system/player-type-definition.h"
+/*
+ * @brief 赤外線視力 - 初期値、下限、上限
+ */
+void PlayerInfravision::set_locals()
+{
+    this->default_value = 0;
+    this->min_value = 0;
+    this->max_value = 20;
+    this->tr_flag = TR_INFRA;
+    this->tr_bad_flag = TR_INFRA;
+}
+
+/*!
+ * @brief 赤外線視力計算 - 種族
+ * @return 赤外線視力の増分
+ * @details
+ * * 種族による加算
+ */
+s16b PlayerInfravision::race_value()
+{
+    const player_race *tmp_rp_ptr;
+
+    if (this->owner_ptr->mimic_form)
+        tmp_rp_ptr = &mimic_info[this->owner_ptr->mimic_form];
+    else
+        tmp_rp_ptr = &race_info[this->owner_ptr->prace];
+
+    return tmp_rp_ptr->infra;
+}
+
+/*!
+ * @brief 赤外線視力計算 - 変異
+ * @return 赤外線視力の増分
+ * @details
+ * * 変異MUT3_INFRAVISによる加算(+3)
+ */
+s16b PlayerInfravision::mutation_value()
+{
+    s16b result = 0;
+    if (this->owner_ptr->muta.has(MUTA::INFRAVIS)) {
+        result += 3;
+    }
+
+    return result;
+}
+
+/*!
+ * @brief 赤外線視力計算 - 一時効果
+ * @return 赤外線視力の増分
+ * @details
+ * * 魔法効果tim_infraによる加算(+3)
+ */
+s16b PlayerInfravision::time_effect_value()
+{
+    s16b result = 0;
+    if (this->owner_ptr->tim_infra) {
+        result += 3;
+    }
+
+    return result;
+}
diff --git a/src/player-status/player-infravision.h b/src/player-status/player-infravision.h
new file mode 100644 (file)
index 0000000..5bc2344
--- /dev/null
@@ -0,0 +1,14 @@
+#pragma once
+#include "player-status/player-status-base.h"
+
+class PlayerInfravision : public PlayerStatusBase {
+public:
+    using PlayerStatusBase::PlayerStatusBase;
+    PlayerInfravision() = delete;
+
+protected:
+    void set_locals() override;
+    s16b race_value() override;
+    s16b time_effect_value() override;
+    s16b mutation_value() override;
+};
index 560b774..f3c34ad 100644 (file)
@@ -14,6 +14,7 @@
 #include "object-hook/hook-weapon.h"
 #include "object/object-flags.h"
 #include "player-status/player-basic-statistics.h"
+#include "player-status/player-infravision.h"
 #include "player-status/player-speed.h"
 #include "player-status/player-stealth.h"
 #include "player/attack-defense-types.h"
@@ -172,7 +173,7 @@ BIT_FLAGS get_player_flags(player_type *creature_ptr, tr_type tr_flag)
     case TR_SEARCH:
         return 0;
     case TR_INFRA:
-        return has_infra_vision(creature_ptr);
+        return PlayerInfravision(creature_ptr).get_all_flags();
     case TR_TUNNEL:
         return 0;
     case TR_SPEED:
@@ -273,7 +274,7 @@ BIT_FLAGS get_player_flags(player_type *creature_ptr, tr_type tr_flag)
         return has_resist_time(creature_ptr);
     case TR_RES_WATER:
         return has_resist_water(creature_ptr);
-    case TR_RES_CURSE :
+    case TR_RES_CURSE:
         return has_resist_curse(creature_ptr);
 
     case TR_SH_FIRE:
@@ -480,35 +481,6 @@ BIT_FLAGS has_xtra_might(player_type *creature_ptr)
 }
 
 /*!
- * @brief クリーチャーが赤外線視力修正を持っているかを返す。
- * @param creature_ptr 判定対象のクリーチャー参照ポインタ
- * @return 持っていたら所持前提ビットフラグを返す。
- * @details 種族修正は0より大きければTRUEとする。
- */
-BIT_FLAGS has_infra_vision(player_type *creature_ptr)
-{
-    BIT_FLAGS result = 0L;
-    const player_race *tmp_rp_ptr;
-
-    if (creature_ptr->mimic_form)
-        tmp_rp_ptr = &mimic_info[creature_ptr->mimic_form];
-    else
-        tmp_rp_ptr = &race_info[creature_ptr->prace];
-
-    if (tmp_rp_ptr->infra > 0)
-        result |= FLAG_CAUSE_RACE;
-
-    if (creature_ptr->muta.has(MUTA::INFRAVIS))
-        result |= FLAG_CAUSE_MUTATION;
-
-    if (creature_ptr->tim_infra)
-        result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
-
-    result |= check_equipment_flags(creature_ptr, TR_INFRA);
-    return result;
-}
-
-/*!
  * @brief クリーチャーが邪悪感知を持っているかを返す。
  * @param creature_ptr 判定対象のクリーチャー参照ポインタ
  * @return 持っていたら所持前提ビットフラグを返す。
@@ -1597,7 +1569,7 @@ BIT_FLAGS has_resist_dark(player_type *creature_ptr)
     BIT_FLAGS result = 0L;
 
     if (player_race_has_flag(creature_ptr, TR_RES_DARK))
-    result |= FLAG_CAUSE_RACE;
+        result |= FLAG_CAUSE_RACE;
 
     if (creature_ptr->special_defense & KATA_MUSOU) {
         result |= FLAG_CAUSE_BATTLE_FORM;
index 7eea6c3..6b5e068 100644 (file)
@@ -62,6 +62,7 @@
 #include "pet/pet-util.h"
 #include "player-info/avatar.h"
 #include "player-status/player-basic-statistics.h"
+#include "player-status/player-infravision.h"
 #include "player-status/player-speed.h"
 #include "player-status/player-stealth.h"
 #include "player/attack-defense-types.h"
@@ -96,9 +97,9 @@
 #include "sv-definition/sv-lite-types.h"
 #include "sv-definition/sv-weapon-types.h"
 #include "system/floor-type-definition.h"
-#include "system/object-type-definition.h"
 #include "system/monster-race-definition.h"
 #include "system/monster-type-definition.h"
+#include "system/object-type-definition.h"
 #include "system/player-type-definition.h"
 #include "term/screen-processor.h"
 #include "util/bit-flags-calculator.h"
 
 static bool is_martial_arts_mode(player_type *creature_ptr);
 
-static ACTION_SKILL_POWER calc_intra_vision(player_type *creature_ptr);
 static ACTION_SKILL_POWER calc_disarming(player_type *creature_ptr);
 static ACTION_SKILL_POWER calc_device_ability(player_type *creature_ptr);
 static ACTION_SKILL_POWER calc_saving_throw(player_type *creature_ptr);
@@ -427,7 +427,7 @@ static void update_bonuses(player_type *creature_ptr)
     }
 
     creature_ptr->pspeed = PlayerSpeed(creature_ptr).get_value();
-    creature_ptr->see_infra = calc_intra_vision(creature_ptr);
+    creature_ptr->see_infra = PlayerInfravision(creature_ptr).get_value();
     creature_ptr->skill_stl = PlayerStealth(creature_ptr).get_value();
     creature_ptr->skill_dis = calc_disarming(creature_ptr);
     creature_ptr->skill_dev = calc_device_ability(creature_ptr);
@@ -1027,7 +1027,7 @@ static void update_max_mana(player_type *creature_ptr)
         case CLASS_MAGE:
         case CLASS_HIGH_MAGE:
         case CLASS_BLUE_MAGE:
-        case CLASS_ELEMENTALIST:  {
+        case CLASS_ELEMENTALIST: {
             msp -= msp * (cur_wgt - max_wgt) / 600;
             break;
         }
@@ -1175,50 +1175,6 @@ s16b calc_num_fire(player_type *creature_ptr, object_type *o_ptr)
 }
 
 /*!
- * @brief 赤外線視力計算
- * @param creature_ptr 計算するクリーチャーの参照ポインタ
- * @return 赤外線視力
- * @details
- * * 種族による加算
- * * 変異MUT3_INFRAVISによる加算(+3)
- * * 魔法効果tim_infraによる加算(+3)
- * * 装備がTR_INFRAフラグ持ちなら加算(+pval*1)
- */
-static ACTION_SKILL_POWER calc_intra_vision(player_type *creature_ptr)
-{
-    ACTION_SKILL_POWER pow;
-    const player_race *tmp_rp_ptr;
-
-    if (creature_ptr->mimic_form)
-        tmp_rp_ptr = &mimic_info[creature_ptr->mimic_form];
-    else
-        tmp_rp_ptr = &race_info[creature_ptr->prace];
-
-    pow = tmp_rp_ptr->infra;
-
-    if (creature_ptr->muta.has(MUTA::INFRAVIS)) {
-        pow += 3;
-    }
-
-    if (creature_ptr->tim_infra) {
-        pow += 3;
-    }
-
-    for (int i = INVEN_MAIN_HAND; i < INVEN_TOTAL; i++) {
-        object_type *o_ptr;
-        BIT_FLAGS flgs[TR_FLAG_SIZE];
-        o_ptr = &creature_ptr->inventory_list[i];
-        if (!o_ptr->k_idx)
-            continue;
-        object_flags(creature_ptr, o_ptr, flgs);
-        if (has_flag(flgs, TR_INFRA))
-            pow += o_ptr->pval;
-    }
-
-    return pow;
-}
-
-/*!
  * @brief 解除能力計算
  * @param creature_ptr 計算するクリーチャーの参照ポインタ
  * @return 解除能力
@@ -1993,7 +1949,6 @@ s16b calc_double_weapon_penalty(player_type *creature_ptr, INVENTORY_IDX slot)
     return (s16b)penalty;
 }
 
-
 static bool is_riding_two_hands(player_type *creature_ptr)
 {
     if (!creature_ptr->riding) {