OSDN Git Service

[Refactor] #2523 PlayerType::blind をPlayerBlindnessの呼び出しに差し替えた
[hengbandforosx/hengbandosx.git] / src / player-base / player-class.cpp
index 76d086b..7bf1370 100644 (file)
@@ -2,6 +2,7 @@
  * @brief プレイヤーの職業クラスに基づく耐性・能力の判定処理等を行うクラス
  * @date 2021/09/08
  * @author Hourier
+ * @details PlayerRaceからPlayerClassへの依存はあるが、逆は依存させないこと.
  */
 #include "player-base/player-class.h"
 #include "core/player-redraw-types.h"
@@ -27,6 +28,8 @@
 #include "status/action-setter.h"
 #include "system/object-type-definition.h"
 #include "system/player-type-definition.h"
+#include "timed-effect/player-blindness.h"
+#include "timed-effect/timed-effects.h"
 #include "util/bit-flags-calculator.h"
 
 PlayerClass::PlayerClass(PlayerType *player_ptr)
@@ -49,39 +52,47 @@ TrFlags PlayerClass::tr_flags() const
 
     switch (this->player_ptr->pclass) {
     case PlayerClassType::WARRIOR: {
-        if (plev > 29)
+        if (plev > 29) {
             flags.set(TR_RES_FEAR);
-        if (plev > 44)
+        }
+        if (plev > 44) {
             flags.set(TR_REGEN);
+        }
 
         break;
     }
     case PlayerClassType::SAMURAI: {
-        if (plev > 29)
+        if (plev > 29) {
             flags.set(TR_RES_FEAR);
+        }
 
         break;
     }
     case PlayerClassType::PALADIN: {
-        if (plev > 39)
+        if (plev > 39) {
             flags.set(TR_RES_FEAR);
+        }
 
         break;
     }
     case PlayerClassType::CHAOS_WARRIOR: {
-        if (plev > 29)
+        if (plev > 29) {
             flags.set(TR_RES_CHAOS);
-        if (plev > 39)
+        }
+        if (plev > 39) {
             flags.set(TR_RES_FEAR);
+        }
 
         break;
     }
     case PlayerClassType::MONK:
     case PlayerClassType::FORCETRAINER: {
-        if ((plev > 9) && !heavy_armor(this->player_ptr))
+        if ((plev > 9) && !heavy_armor(this->player_ptr)) {
             flags.set(TR_SPEED);
-        if ((plev > 24) && !heavy_armor(this->player_ptr))
+        }
+        if ((plev > 24) && !heavy_armor(this->player_ptr)) {
             flags.set(TR_FREE_ACT);
+        }
 
         break;
     }
@@ -89,32 +100,41 @@ TrFlags PlayerClass::tr_flags() const
         if (heavy_armor(this->player_ptr)) {
             flags.set(TR_SPEED);
         } else {
-            if ((!this->player_ptr->inventory_list[INVEN_MAIN_HAND].k_idx || can_attack_with_main_hand(this->player_ptr)) && (!this->player_ptr->inventory_list[INVEN_SUB_HAND].k_idx || can_attack_with_sub_hand(this->player_ptr)))
+            if ((!this->player_ptr->inventory_list[INVEN_MAIN_HAND].k_idx || can_attack_with_main_hand(this->player_ptr)) && (!this->player_ptr->inventory_list[INVEN_SUB_HAND].k_idx || can_attack_with_sub_hand(this->player_ptr))) {
                 flags.set(TR_SPEED);
-            if (plev > 24 && !this->player_ptr->is_icky_wield[0] && !this->player_ptr->is_icky_wield[1])
+            }
+            if (plev > 24 && !this->player_ptr->is_icky_wield[0] && !this->player_ptr->is_icky_wield[1]) {
                 flags.set(TR_FREE_ACT);
+            }
         }
 
         flags.set(TR_SLOW_DIGEST);
         flags.set(TR_RES_FEAR);
-        if (plev > 19)
+        if (plev > 19) {
             flags.set(TR_RES_POIS);
-        if (plev > 24)
+        }
+        if (plev > 24) {
             flags.set(TR_SUST_DEX);
-        if (plev > 29)
+        }
+        if (plev > 29) {
             flags.set(TR_SEE_INVIS);
+        }
 
         break;
     }
     case PlayerClassType::MINDCRAFTER: {
-        if (plev > 9)
+        if (plev > 9) {
             flags.set(TR_RES_FEAR);
-        if (plev > 19)
+        }
+        if (plev > 19) {
             flags.set(TR_SUST_WIS);
-        if (plev > 29)
+        }
+        if (plev > 29) {
             flags.set(TR_RES_CONF);
-        if (plev > 39)
+        }
+        if (plev > 39) {
             flags.set(TR_TELEPATHY);
+        }
 
         break;
     }
@@ -129,50 +149,68 @@ TrFlags PlayerClass::tr_flags() const
         flags.set(TR_REGEN);
         flags.set(TR_FREE_ACT);
         flags.set(TR_SPEED);
-        if (plev > 39)
+        if (plev > 39) {
             flags.set(TR_REFLECT);
+        }
 
         break;
     }
     case PlayerClassType::MIRROR_MASTER: {
-        if (plev > 39)
+        if (plev > 39) {
             flags.set(TR_REFLECT);
+        }
 
         break;
     }
     case PlayerClassType::ELEMENTALIST:
-        if (has_element_resist(this->player_ptr, ElementRealmType::FIRE, 1))
+        if (has_element_resist(this->player_ptr, ElementRealmType::FIRE, 1)) {
             flags.set(TR_RES_FIRE);
-        if (has_element_resist(this->player_ptr, ElementRealmType::FIRE, 30))
+        }
+        if (has_element_resist(this->player_ptr, ElementRealmType::FIRE, 30)) {
             flags.set(TR_IM_FIRE);
-        if (has_element_resist(this->player_ptr, ElementRealmType::ICE, 1))
+        }
+        if (has_element_resist(this->player_ptr, ElementRealmType::ICE, 1)) {
             flags.set(TR_RES_COLD);
-        if (has_element_resist(this->player_ptr, ElementRealmType::ICE, 30))
+        }
+        if (has_element_resist(this->player_ptr, ElementRealmType::ICE, 30)) {
             flags.set(TR_IM_COLD);
-        if (has_element_resist(this->player_ptr, ElementRealmType::SKY, 1))
+        }
+        if (has_element_resist(this->player_ptr, ElementRealmType::SKY, 1)) {
             flags.set(TR_RES_ELEC);
-        if (has_element_resist(this->player_ptr, ElementRealmType::SKY, 30))
+        }
+        if (has_element_resist(this->player_ptr, ElementRealmType::SKY, 30)) {
             flags.set(TR_IM_ELEC);
-        if (has_element_resist(this->player_ptr, ElementRealmType::SEA, 1))
+        }
+        if (has_element_resist(this->player_ptr, ElementRealmType::SEA, 1)) {
             flags.set(TR_RES_ACID);
-        if (has_element_resist(this->player_ptr, ElementRealmType::SEA, 30))
+        }
+        if (has_element_resist(this->player_ptr, ElementRealmType::SEA, 30)) {
             flags.set(TR_IM_ACID);
-        if (has_element_resist(this->player_ptr, ElementRealmType::DARKNESS, 1))
+        }
+        if (has_element_resist(this->player_ptr, ElementRealmType::DARKNESS, 1)) {
             flags.set(TR_RES_DARK);
-        if (has_element_resist(this->player_ptr, ElementRealmType::DARKNESS, 30))
+        }
+        if (has_element_resist(this->player_ptr, ElementRealmType::DARKNESS, 30)) {
             flags.set(TR_RES_NETHER);
-        if (has_element_resist(this->player_ptr, ElementRealmType::CHAOS, 1))
+        }
+        if (has_element_resist(this->player_ptr, ElementRealmType::CHAOS, 1)) {
             flags.set(TR_RES_CONF);
-        if (has_element_resist(this->player_ptr, ElementRealmType::CHAOS, 30))
+        }
+        if (has_element_resist(this->player_ptr, ElementRealmType::CHAOS, 30)) {
             flags.set(TR_RES_CHAOS);
-        if (has_element_resist(this->player_ptr, ElementRealmType::EARTH, 1))
+        }
+        if (has_element_resist(this->player_ptr, ElementRealmType::EARTH, 1)) {
             flags.set(TR_RES_SHARDS);
-        if (has_element_resist(this->player_ptr, ElementRealmType::EARTH, 30))
+        }
+        if (has_element_resist(this->player_ptr, ElementRealmType::EARTH, 30)) {
             flags.set(TR_REFLECT);
-        if (has_element_resist(this->player_ptr, ElementRealmType::DEATH, 1))
+        }
+        if (has_element_resist(this->player_ptr, ElementRealmType::DEATH, 1)) {
             flags.set(TR_RES_POIS);
-        if (has_element_resist(this->player_ptr, ElementRealmType::DEATH, 30))
+        }
+        if (has_element_resist(this->player_ptr, ElementRealmType::DEATH, 30)) {
             flags.set(TR_RES_DISEN);
+        }
         break;
     default:
         break;
@@ -187,7 +225,7 @@ TrFlags PlayerClass::stance_tr_flags() const
 
     switch (this->get_samurai_stance()) {
     case SamuraiStanceType::FUUJIN:
-        if (!this->player_ptr->blind) {
+        if (!this->player_ptr->effects()->blindness()->is_blind()) {
             flags.set(TR_REFLECT);
         }
         break;
@@ -228,13 +266,18 @@ TrFlags PlayerClass::stance_tr_flags() const
 
 bool PlayerClass::has_stun_immunity() const
 {
-    return (this->player_ptr->pclass == PlayerClassType::BERSERKER) && (this->player_ptr->lev > 34);
+    return this->equals(PlayerClassType::BERSERKER) && (this->player_ptr->lev > 34);
+}
+
+bool PlayerClass::has_poison_resistance() const
+{
+    return this->equals(PlayerClassType::NINJA) && (this->player_ptr->lev > 44);
 }
 
 /*!
  * @brief 加速ボーナスのある種族かを返す
  * @return 加速ボーナスのある種族か否か
- * @details 
+ * @details
  * 種族と職業の両方で特性による加速が得られる場合、重複して加速することはない.
  * 代りに経験値補正が軽くなる.
  */
@@ -267,6 +310,50 @@ bool PlayerClass::is_wizard() const
     return is_wizard;
 }
 
+bool PlayerClass::is_tamer() const
+{
+    auto is_tamer = this->equals(PlayerClassType::BEASTMASTER);
+    is_tamer |= this->equals(PlayerClassType::CAVALRY);
+    return is_tamer;
+}
+
+bool PlayerClass::can_browse() const
+{
+    auto can_browse = this->equals(PlayerClassType::MINDCRAFTER);
+    can_browse |= this->equals(PlayerClassType::BERSERKER);
+    can_browse |= this->equals(PlayerClassType::NINJA);
+    can_browse |= this->equals(PlayerClassType::MIRROR_MASTER);
+    return can_browse;
+}
+
+bool PlayerClass::has_listed_magics() const
+{
+    auto has_listed_magics = this->can_browse();
+    has_listed_magics |= this->equals(PlayerClassType::FORCETRAINER);
+    has_listed_magics |= this->equals(PlayerClassType::ELEMENTALIST);
+    return has_listed_magics;
+}
+
+/*!
+ * @brief プレイ日記のタイトルが「最高の肉体を求めて」になり得るクラスを判定する
+ * @return 該当のクラスか否か
+ */
+bool PlayerClass::is_tough() const
+{
+    auto is_tough = this->equals(PlayerClassType::WARRIOR);
+    is_tough |= this->equals(PlayerClassType::MONK);
+    is_tough |= this->equals(PlayerClassType::SAMURAI);
+    is_tough |= this->equals(PlayerClassType::BERSERKER);
+    return is_tough;
+}
+
+bool PlayerClass::is_martial_arts_pro() const
+{
+    auto is_martial_arts_pro = this->equals(PlayerClassType::MONK);
+    is_martial_arts_pro |= this->equals(PlayerClassType::FORCETRAINER);
+    return is_martial_arts_pro;
+}
+
 bool PlayerClass::is_every_magic() const
 {
     auto is_every_magic = this->equals(PlayerClassType::SORCERER);