return this->get_rank() > StunRank::NONE;
}
+std::tuple<term_color_type, std::string_view> PlayerStun::get_expr() const
+{
+ switch (this->get_rank()) {
+ case StunRank::NONE: // dummy.
+ return std::make_tuple(TERM_WHITE, " ");
+ case StunRank::NORMAL:
+ return std::make_tuple(TERM_ORANGE, _("朦朧 ", "Stun "));
+ case StunRank::HARD:
+ return std::make_tuple(TERM_ORANGE, _("ひどく朦朧 ", "Heavy stun "));
+ case StunRank::UNCONSCIOUS:
+ return std::make_tuple(TERM_RED, _("意識不明瞭 ", "Knocked out "));
+ default:
+ throw("Invalid stun rank is specified!");
+ }
+}
+
void PlayerStun::set(short value)
{
this->stun = value;
#pragma once
+#include "term/term-color-types.h"
#include <string>
+#include <tuple>
enum class StunRank {
NONE = 0,
int decrease_chance() const;
short decrease_damage() const;
bool is_stunned() const;
+ std::tuple<term_color_type, std::string_view> get_expr() const;
void reset();
void set(short value);
/*!
* @brief プレイヤーの朦朧状態を表示する
* @param player_ptr プレイヤーへの参照ポインタ
- * @todo TERM値のenumと文字列はPlayerStunの中へ入れ、ここは可能な限り軽くする.
*/
void print_stun(player_type *player_ptr)
{
- int s = player_ptr->effects()->stun()->current();
- if (s > 100) {
- c_put_str(TERM_RED, _("意識不明瞭 ", "Knocked out "), ROW_STUN, COL_STUN);
+ auto player_stun = player_ptr->effects()->stun();
+ if (!player_stun->is_stunned()) {
+ put_str(" ", ROW_STUN, COL_STUN);
return;
}
- if (s > 50) {
- c_put_str(TERM_ORANGE, _("ひどく朦朧 ", "Heavy stun "), ROW_STUN, COL_STUN);
- return;
- }
-
- if (s) {
- c_put_str(TERM_ORANGE, _("朦朧 ", "Stun "), ROW_STUN, COL_STUN);
- return;
- }
-
- put_str(" ", ROW_STUN, COL_STUN);
+ auto [color, stat] = player_stun->get_expr();
+ c_put_str(color, stat.data(), ROW_STUN, COL_STUN);
}
/*!