* @brief プレイヤーの職業クラスに基づく耐性・能力の判定処理等を行うクラス
* @date 2021/09/08
* @author Hourier
+ * @details PlayerRaceからPlayerClassへの依存はあるが、逆は依存させないこと.
*/
#include "player-base/player-class.h"
#include "core/player-redraw-types.h"
#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)
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;
}
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;
}
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;
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;
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
* 種族と職業の両方で特性による加速が得られる場合、重複して加速することはない.
* 代りに経験値補正が軽くなる.
*/
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);