OSDN Git Service

Merge pull request #3532 from sikabane-works/release/3.0.0.87-alpha
[hengbandforosx/hengbandosx.git] / src / player-status / player-stealth.cpp
1 #include "player-status/player-stealth.h"
2 #include "mind/mind-ninja.h"
3 #include "mutation/mutation-flag-types.h"
4 #include "player-base/player-class.h"
5 #include "player-base/player-race.h"
6 #include "player-info/class-info.h"
7 #include "player-info/equipment-info.h"
8 #include "player-info/mimic-info-table.h"
9 #include "player-info/race-types.h"
10 #include "player/player-personality.h"
11 #include "player/player-skill.h"
12 #include "player/player-status-flags.h"
13 #include "player/player-status.h"
14 #include "player/race-info-table.h"
15 #include "spell-realm/spells-hex.h"
16 #include "system/item-entity.h"
17 #include "system/player-type-definition.h"
18 #include "util/bit-flags-calculator.h"
19 #include "util/enum-converter.h"
20
21 PlayerStealth::PlayerStealth(PlayerType *player_ptr)
22     : PlayerStatusBase(player_ptr)
23 {
24 }
25
26 /*!
27  * @brief 隠密能力計算 - 種族
28  * @return 隠密能力の増分
29  * @details
30  * * 種族による加算
31  */
32 int16_t PlayerStealth::race_bonus()
33 {
34     return PlayerRace(this->player_ptr).get_info()->r_stl;
35 }
36
37 /*!
38  * @brief 隠密能力計算 - 性格
39  * @return 隠密能力の増分
40  * @details
41  * * 性格による加算
42  */
43 int16_t PlayerStealth::personality_bonus()
44 {
45     const player_personality *a_ptr = &personality_info[this->player_ptr->ppersonality];
46     return a_ptr->a_stl;
47 }
48
49 /*!
50  * @brief 隠密能力計算 - 職業(基礎値)
51  * @return 隠密能力の増分
52  * @details
53  * * 職業による加算
54  */
55 int16_t PlayerStealth::class_base_bonus()
56 {
57     const player_class_info *c_ptr = &class_info[enum2i(this->player_ptr->pclass)];
58     return c_ptr->c_stl + (c_ptr->x_stl * this->player_ptr->lev / 10);
59 }
60
61 /*!
62  * @brief 隠密能力計算 - 職業(追加分)
63  * @return 隠密能力の増分
64  * @details
65  * * 忍者がheavy_armorならば減算(-レベル/10)
66  * * 忍者がheavy_armorでなく適正な武器を持っていれば加算(+レベル/10)
67  */
68 int16_t PlayerStealth::class_bonus()
69 {
70     PlayerClass pc(this->player_ptr);
71     if (!pc.equals(PlayerClassType::NINJA)) {
72         return 0;
73     }
74
75     int16_t bonus = 0;
76     if (heavy_armor(this->player_ptr)) {
77         bonus -= (this->player_ptr->lev) / 10;
78     } else if (pc.has_ninja_speed()) {
79         bonus += (this->player_ptr->lev) / 10;
80     }
81
82     return bonus;
83 }
84
85 /*!
86  * @brief 隠密能力計算 - 変異
87  * @return 隠密能力の増分
88  * @details
89  * * 変異MUT3_XTRA_NOISで減算(-3)
90  * * 変異MUT3_MOTIONで加算(+1)
91  */
92 int16_t PlayerStealth::mutation_bonus()
93 {
94     int16_t bonus = 0;
95     const auto &muta = this->player_ptr->muta;
96     if (muta.has(PlayerMutationType::XTRA_NOIS)) {
97         bonus -= 3;
98     }
99
100     if (muta.has(PlayerMutationType::MOTION)) {
101         bonus += 1;
102     }
103
104     return bonus;
105 }
106
107 /*!
108  * @brief 隠密能力計算 - 一時効果
109  * @return 隠密能力の増分
110  * @details
111  * * 呪術を唱えていると減算(-(詠唱数+1))
112  * * 狂戦士化で減算(-7)
113  * * 隠密の歌で加算(+999)
114  */
115 int16_t PlayerStealth::time_effect_bonus()
116 {
117     int16_t bonus = 0;
118     if (this->player_ptr->realm1 == REALM_HEX) {
119         SpellHex spell_hex(this->player_ptr);
120         if (spell_hex.is_spelling_any()) {
121             bonus -= spell_hex.get_casting_num() + 1;
122         }
123     }
124
125     if (is_shero(this->player_ptr)) {
126         bonus -= 7;
127     }
128
129     if (is_time_limit_stealth(this->player_ptr)) {
130         bonus += 999;
131     }
132
133     return bonus;
134 }
135
136 bool PlayerStealth::is_aggravated_s_fairy()
137 {
138     return player_aggravate_state(this->player_ptr) == AGGRAVATE_S_FAIRY;
139 }
140
141 /*!
142  * @brief 隠密能力計算 - 影フェアリー反感時の例外処理
143  * @return 修正後の隠密能力
144  * @details
145  * * セクシーギャルでない影フェアリーがTRC_AGGRAVATE持ちの時、別処理でTRC_AGGRAVATEを無効にする代わりに減算(-3か3未満なら(現在値+2)/2)
146  */
147 int16_t PlayerStealth::set_exception_bonus(int16_t value)
148 {
149     if (this->is_aggravated_s_fairy()) {
150         value = std::min<int16_t>(value - 3, (value + 2) / 2);
151     }
152
153     return value;
154 }
155
156 /*!
157  * @brief 隠密マイナスフラグ判定
158  * @return マイナスフラグの集合体
159  * @details
160  * * TR_STELATHがマイナスの要素に加え、種族影フェアリーかつ反感のとき種族にマイナスフラグを与える
161  */
162 BIT_FLAGS PlayerStealth::get_bad_flags()
163 {
164     auto flags = PlayerStatusBase::get_bad_flags();
165     if (this->is_aggravated_s_fairy()) {
166         set_bits(flags, FLAG_CAUSE_RACE);
167     }
168
169     return flags;
170 }
171
172 /*!
173  * @brief 隠密値の上限と下限の設定
174  * @details
175  * * 初期値1
176  * * 最大30、最低0に補正
177  */
178 void PlayerStealth::set_locals()
179 {
180     this->default_value = 1;
181     this->min_value = 0;
182     this->max_value = 30;
183     this->tr_flag = TR_STEALTH;
184     this->tr_bad_flag = TR_STEALTH;
185 }