1 #include "timed-effect/player-stun.h"
2 #include "system/angband-exceptions.h"
3 #include "system/angband.h"
5 enum class PlayerStunRank {
14 PlayerStunRank PlayerStun::get_rank(short value)
17 return PlayerStunRank::KNOCKED;
21 return PlayerStunRank::UNCONSCIOUS;
25 return PlayerStunRank::HARD;
29 return PlayerStunRank::NORMAL;
33 return PlayerStunRank::SLIGHT;
36 return PlayerStunRank::NONE;
39 std::string_view PlayerStun::get_stun_mes(PlayerStunRank stun_rank)
42 case PlayerStunRank::NONE:
44 case PlayerStunRank::SLIGHT:
45 return _("意識が少しもうろうとしてきた。", "You have been slightly stunned.");
46 case PlayerStunRank::NORMAL:
47 return _("意識がもうろうとしてきた。", "You have been stunned.");
48 case PlayerStunRank::HARD:
49 return _("意識がひどくもうろうとしてきた。", "You have been heavily stunned.");
50 case PlayerStunRank::UNCONSCIOUS:
51 return _("頭がクラクラして意識が遠のいてきた。", "You have been unconcious.");
52 case PlayerStunRank::KNOCKED:
53 return _("あなたはぶっ倒れた!", "You are knocked out!!");
55 THROW_EXCEPTION(std::logic_error, "Invalid StunRank is specified!");
59 short PlayerStun::get_accumulation(int rank)
67 return randint1(10) + 10;
69 return randint1(10) + 20;
71 return randint1(10) + 30;
73 return randint1(10) + 40;
75 return randint1(10) + 50;
77 return randint1(10) + 60;
78 default: // 8 or more.
79 return randint1(10) + 70;
84 * @brief モンスター打撃の朦朧蓄積ランクを返す.
85 * @param total 痛恨の一撃でない場合の最大ダメージ
86 * @param dam プレイヤーに与えた実際のダメージ
89 * totalは、ダイスXdY に対し、X*Y
90 * damageは、痛恨 かつ AC < 125 ならばtotalを超える可能性あり
92 int PlayerStun::get_accumulation_rank(int total, int damage)
94 auto is_no_stun = damage < total * 19 / 20;
95 is_no_stun |= damage <= 20;
132 short PlayerStun::current() const
137 PlayerStunRank PlayerStun::get_rank() const
139 return this->get_rank(this->stun);
143 * @brief 朦朧ランクに応じて魔法系の失率を上げる.
146 * 昏倒ならばそもそも動けないのでこのメソッドを通らない.
147 * しかし今後の拡張を考慮して100%としておく.
149 int PlayerStun::get_magic_chance_penalty() const
151 switch (this->get_rank()) {
152 case PlayerStunRank::NONE:
154 case PlayerStunRank::SLIGHT:
156 case PlayerStunRank::NORMAL:
158 case PlayerStunRank::HARD:
160 case PlayerStunRank::UNCONSCIOUS:
162 case PlayerStunRank::KNOCKED:
165 THROW_EXCEPTION(std::logic_error, "Invalid StunRank is specified!");
170 * @brief 朦朧ランクに応じてアイテム使用の失率を上げる.
171 * @return リファクタリング中の暫定的な値 (意識不明瞭ならば100%、それ以外は常に0%)
173 * 昏倒ならばそもそも動けないのでこのメソッドを通らない.
174 * しかし今後の拡張を考慮して100%としておく.
176 int PlayerStun::get_item_chance_penalty() const
178 switch (this->get_rank()) {
179 case PlayerStunRank::NONE:
180 case PlayerStunRank::SLIGHT:
181 case PlayerStunRank::NORMAL:
183 case PlayerStunRank::HARD:
185 case PlayerStunRank::UNCONSCIOUS:
187 case PlayerStunRank::KNOCKED:
190 THROW_EXCEPTION(std::logic_error, "Invalid StunRank is specified!");
195 * @brief 朦朧ランクに応じてダメージ量 or 命中率を下げる.
196 * @return 朦朧ならば5、ひどく朦朧ならば20.
198 * 呼び出し元で減算しているのでこのメソッドでは正値.
199 * 意識不明瞭ならばそもそも動けないのでこのメソッドを通らない.
200 * しかし今後の拡張を考慮して100としておく.
202 short PlayerStun::get_damage_penalty() const
204 switch (this->get_rank()) {
205 case PlayerStunRank::NONE:
207 case PlayerStunRank::SLIGHT:
209 case PlayerStunRank::NORMAL:
211 case PlayerStunRank::HARD:
213 case PlayerStunRank::UNCONSCIOUS:
215 case PlayerStunRank::KNOCKED:
218 THROW_EXCEPTION(std::logic_error, "Invalid StunRank is specified!");
223 * @brief プレイヤーが朦朧しているかを返す
224 * @return 朦朧状態ならばtrue、頭がハッキリしているならばfalse
226 bool PlayerStun::is_stunned() const
228 return this->get_rank() > PlayerStunRank::NONE;
232 * @brief プレイヤーが朦朧で行動不能かを返す
233 * @return 昏倒状態ならばtrue、それ以外ならばfalse
235 bool PlayerStun::is_knocked_out() const
237 return this->get_rank() == PlayerStunRank::KNOCKED;
240 std::tuple<term_color_type, std::string_view> PlayerStun::get_expr() const
242 switch (this->get_rank()) {
243 case PlayerStunRank::NONE: // dummy.
244 return std::make_tuple(TERM_WHITE, " ");
245 case PlayerStunRank::SLIGHT:
246 return std::make_tuple(TERM_WHITE, _("やや朦朧 ", "Slight stun "));
247 case PlayerStunRank::NORMAL:
248 return std::make_tuple(TERM_YELLOW, _("朦朧 ", "Stun "));
249 case PlayerStunRank::HARD:
250 return std::make_tuple(TERM_ORANGE, _("ひどく朦朧 ", "Heavy stun "));
251 case PlayerStunRank::UNCONSCIOUS:
252 return std::make_tuple(TERM_RED, _("意識不明瞭 ", "Unconcious "));
253 case PlayerStunRank::KNOCKED:
254 return std::make_tuple(TERM_VIOLET, _("昏倒 ", "Knocked out "));
256 THROW_EXCEPTION(std::logic_error, "Invalid StunRank is specified!");
260 void PlayerStun::set(short value)
265 void PlayerStun::reset()