1 #include "timed-effect/player-cut.h"
2 #include "system/angband-exceptions.h"
3 #include "system/angband.h"
5 PlayerCutRank PlayerCut::get_rank(short value)
8 return PlayerCutRank::MORTAL;
12 return PlayerCutRank::DEEP;
16 return PlayerCutRank::SEVERE;
20 return PlayerCutRank::NASTY;
24 return PlayerCutRank::BAD;
28 return PlayerCutRank::LIGHT;
32 return PlayerCutRank::GRAZING;
35 return PlayerCutRank::NONE;
38 std::string PlayerCut::get_cut_mes(PlayerCutRank stun_rank)
41 case PlayerCutRank::NONE:
43 case PlayerCutRank::GRAZING:
44 return _("かすり傷を負ってしまった。", "You have been given a graze.");
45 case PlayerCutRank::LIGHT:
46 return _("軽い傷を負ってしまった。", "You have been given a light cut.");
47 case PlayerCutRank::BAD:
48 return _("ひどい傷を負ってしまった。", "You have been given a bad cut.");
49 case PlayerCutRank::NASTY:
50 return _("大変な傷を負ってしまった。", "You have been given a nasty cut.");
51 case PlayerCutRank::SEVERE:
52 return _("重大な傷を負ってしまった。", "You have been given a severe cut.");
53 case PlayerCutRank::DEEP:
54 return _("ひどい深手を負ってしまった。", "You have been given a deep gash.");
55 case PlayerCutRank::MORTAL:
56 return _("致命的な傷を負ってしまった。", "You have been given a mortal wound.");
58 THROW_EXCEPTION(std::logic_error, "Invalid CutRank is specified!");
63 * @brief モンスター打撃による切り傷値を返す.
64 * @param total 痛恨の一撃でない場合の最大ダメージ (ダイスXdY に対し、X*Y)
65 * @param dam プレイヤーに与えた実際のダメージ
68 short PlayerCut::get_accumulation(int total, int damage)
70 auto rank = get_accumulation_rank(total, damage);
77 return randint1(5) + 5;
79 return randint1(20) + 20;
81 return randint1(50) + 50;
83 return randint1(100) + 100;
86 default: // 7 or more.
91 short PlayerCut::current() const
96 PlayerCutRank PlayerCut::get_rank() const
98 return this->get_rank(this->cut);
101 bool PlayerCut::is_cut() const
103 return this->cut > 0;
106 std::tuple<term_color_type, std::string> PlayerCut::get_expr() const
108 switch (this->get_rank()) {
109 case PlayerCutRank::NONE: // dummy.
110 return std::make_tuple(TERM_WHITE, "");
111 case PlayerCutRank::GRAZING:
112 return std::make_tuple(TERM_YELLOW, _("かすり傷 ", "Graze "));
113 case PlayerCutRank::LIGHT:
114 return std::make_tuple(TERM_YELLOW, _("軽傷 ", "Light cut "));
115 case PlayerCutRank::BAD:
116 return std::make_tuple(TERM_ORANGE, _("ひどい傷 ", "Bad cut "));
117 case PlayerCutRank::NASTY:
118 return std::make_tuple(TERM_ORANGE, _("大変な傷 ", "Nasty cut "));
119 case PlayerCutRank::SEVERE:
120 return std::make_tuple(TERM_RED, _("重傷 ", "Severe cut "));
121 case PlayerCutRank::DEEP:
122 return std::make_tuple(TERM_RED, _("ひどい深手 ", "Deep gash "));
123 case PlayerCutRank::MORTAL:
124 return std::make_tuple(TERM_L_RED, _("致命傷 ", "Mortal wound"));
126 THROW_EXCEPTION(std::logic_error, "Invalid CutRank is specified!");
130 int PlayerCut::get_damage() const
132 switch (this->get_rank()) {
133 case PlayerCutRank::NONE:
135 case PlayerCutRank::GRAZING:
137 case PlayerCutRank::LIGHT:
139 case PlayerCutRank::BAD:
141 case PlayerCutRank::NASTY:
143 case PlayerCutRank::SEVERE:
145 case PlayerCutRank::DEEP:
147 case PlayerCutRank::MORTAL:
150 THROW_EXCEPTION(std::logic_error, "Invalid CutRank is specified!");
154 void PlayerCut::set(short value)
159 void PlayerCut::reset()
165 * @brief モンスター打撃の切り傷蓄積ランクを返す.
166 * @param total 痛恨の一撃でない場合の最大ダメージ (ダイスXdY に対し、X*Y)
167 * @param dam プレイヤーに与えた実際のダメージ
169 * @details v3.0.0 Alpha40時点では朦朧と異なりv2.2.1までの仕様と同一
171 int PlayerCut::get_accumulation_rank(int total, int damage)
173 if (damage < total * 19 / 20) {
177 if ((damage < 20) && (damage <= randint0(100))) {
182 if ((damage >= total) && (damage >= 40)) {
187 while (randint0(100) < 2) {