2 * @brief プレイヤーの種族に基づく耐性・能力の判定処理等を行うクラス
5 * @details 本クラス作成時点で責務に対する余裕はかなりあるので、適宜ここへ移してくること.
7 #include "player-base/player-race.h"
8 #include "grid/feature-flag-types.h"
9 #include "grid/feature.h"
10 #include "player-info/mimic-info-table.h"
11 #include "player/race-info-table.h"
12 #include "system/floor-type-definition.h"
13 #include "system/grid-type-definition.h"
14 #include "system/player-type-definition.h"
15 #include "util/bit-flags-calculator.h"
18 * @brief Construct a new Player Race:: Player Race object
20 * @param base_race true の場合、仮に変身している場合でも元の種族について扱う。 false の場合変身している種族について扱う。
23 PlayerRace::PlayerRace(player_type *player_ptr, bool base_race)
24 : player_ptr(player_ptr)
25 , base_race(base_race)
30 * @brief 種族固有の特性フラグを取得する
33 TrFlags PlayerRace::tr_flags() const
37 auto race_ptr = this->get_info();
38 if (race_ptr->infra > 0)
41 for (auto &cond : race_ptr->extra_flags) {
42 if (player_ptr->lev < cond.level)
44 if (cond.pclass != std::nullopt) {
45 if (cond.not_class && player_ptr->pclass == cond.pclass)
47 if (!cond.not_class && player_ptr->pclass != cond.pclass)
58 * @brief プレイヤーの種族情報テーブルへのポインタを取得する
60 * @return プレイヤーの種族情報テーブルへのポインタ
62 const player_race_info *PlayerRace::get_info() const
64 if (this->base_race) {
65 return &race_info[enum2i(this->player_ptr->prace)];
68 switch (this->player_ptr->mimic_form) {
70 case MIMIC_DEMON_LORD:
72 return &mimic_info[this->player_ptr->mimic_form];
73 default: // MIMIC_NONE or undefined
74 return &race_info[enum2i(this->player_ptr->prace)];
80 * @param player_ptr プレイヤー情報への参照ポインタ
83 PlayerRaceLife PlayerRace::life() const
85 return this->get_info()->life;
90 * @param player_ptr プレイヤー情報への参照ポインタ
91 * @param base_race ミミック中も元種族の情報を返すならtrue
94 PlayerRaceFood PlayerRace::food() const
96 return this->get_info()->food;
99 bool PlayerRace::is_mimic_nonliving() const
101 constexpr int nonliving_flag = 1;
102 return any_bits(mimic_info[this->player_ptr->mimic_form].choice, nonliving_flag);
105 bool PlayerRace::can_resist_cut() const
107 auto can_resist_cut = this->player_ptr->prace == PlayerRaceType::GOLEM;
108 can_resist_cut |= this->player_ptr->prace == PlayerRaceType::SKELETON;
109 can_resist_cut |= this->player_ptr->prace == PlayerRaceType::SPECTRE;
110 can_resist_cut |= (this->player_ptr->prace == PlayerRaceType::ZOMBIE) && (this->player_ptr->lev > 11);
111 return can_resist_cut;
114 bool PlayerRace::equals(PlayerRaceType prace) const
116 return (this->player_ptr->mimic_form == MIMIC_NONE) && (this->player_ptr->prace == prace);
123 * ** クラッコンと妖精に加算(+レベル/10)
124 * ** 悪魔変化/吸血鬼変化で加算(+3)
126 * ** マーフォークがFF_WATER地形にいれば加算(+2+レベル/10)
127 * ** そうでなく浮遊を持っていないなら減算(-2)
129 int16_t PlayerRace::speed() const
133 if (PlayerRace(this->player_ptr).equals(PlayerRaceType::KLACKON) || PlayerRace(this->player_ptr).equals(PlayerRaceType::SPRITE))
134 result += (this->player_ptr->lev) / 10;
136 if (PlayerRace(this->player_ptr).equals(PlayerRaceType::MERFOLK)) {
137 floor_type *floor_ptr = this->player_ptr->current_floor_ptr;
138 feature_type *f_ptr = &f_info[floor_ptr->grid_array[this->player_ptr->y][this->player_ptr->x].feat];
139 if (f_ptr->flags.has(FF::WATER)) {
140 result += (2 + this->player_ptr->lev / 10);
141 } else if (!this->player_ptr->levitation) {
146 if (this->player_ptr->mimic_form) {
147 switch (this->player_ptr->mimic_form) {
151 case MIMIC_DEMON_LORD:
167 * * エントはレベル26,41,46到達ごとに加算(+1)
169 int16_t PlayerRace::additional_strength() const
173 if (PlayerRace(this->player_ptr).equals(PlayerRaceType::ENT)) {
174 if (this->player_ptr->lev > 25)
176 if (this->player_ptr->lev > 40)
178 if (this->player_ptr->lev > 45)
186 * @brief 器用さ補正計算 - 種族
190 * * エントはレベル26,41,46到達ごとに減算(-1)
192 int16_t PlayerRace::additional_dexterity() const
196 if (PlayerRace(this->player_ptr).equals(PlayerRaceType::ENT)) {
197 if (this->player_ptr->lev > 25)
199 if (this->player_ptr->lev > 40)
201 if (this->player_ptr->lev > 45)
209 * @brief 耐久力補正計算 - 種族
213 * * エントはレベル26,41,46到達ごとに加算(+1)
215 int16_t PlayerRace::additional_constitution() const
219 if (PlayerRace(this->player_ptr).equals(PlayerRaceType::ENT)) {
220 if (this->player_ptr->lev > 25)
222 if (this->player_ptr->lev > 40)
224 if (this->player_ptr->lev > 45)