enum class PlayerStunRank {
NONE = 0,
- NORMAL = 1,
- HARD = 2,
- UNCONSCIOUS = 3,
+ SLIGHT = 1,
+ NORMAL = 2,
+ HARD = 3,
+ UNCONSCIOUS = 4,
+ KNOCKED = 5,
};
PlayerStunRank PlayerStun::get_rank(short value)
{
- if (value > 100) {
+ if (value > 200) {
+ return PlayerStunRank::KNOCKED;
+ }
+
+ if (value > 150) {
return PlayerStunRank::UNCONSCIOUS;
}
- if (value > 50) {
+ if (value > 100) {
return PlayerStunRank::HARD;
}
- if (value > 0) {
+ if (value > 50) {
return PlayerStunRank::NORMAL;
}
+ if (value > 0) {
+ return PlayerStunRank::SLIGHT;
+ }
+
return PlayerStunRank::NONE;
}
switch (stun_rank) {
case PlayerStunRank::NONE:
return "";
+ case PlayerStunRank::SLIGHT:
+ return _("意識が少しもうろうとしてきた。", "You have been slightly stunned.");
case PlayerStunRank::NORMAL:
return _("意識がもうろうとしてきた。", "You have been stunned.");
case PlayerStunRank::HARD:
return _("意識がひどくもうろうとしてきた。", "You have been heavily stunned.");
case PlayerStunRank::UNCONSCIOUS:
- return _("頭がクラクラして意識が遠のいてきた。", "You have been knocked out.");
+ return _("頭がクラクラして意識が遠のいてきた。", "You have been unconcious.");
+ case PlayerStunRank::KNOCKED:
+ return _("あなたはぶっ倒れた!", "You are knocked out!!");
default:
throw("Invalid StunRank was specified!");
}
case 0:
return 0;
case 1:
- return randint1(5);
+ return randint1(10);
case 2:
- return randint1(5) + 10;
+ return randint1(10) + 10;
case 3:
return randint1(10) + 20;
case 4:
- return randint1(15) + 30;
+ return randint1(10) + 30;
case 5:
- return randint1(20) + 40;
+ return randint1(10) + 40;
case 6:
- return 80;
- default:
- return 150;
+ return randint1(10) + 50;
+ case 7:
+ return randint1(10) + 60;
+ default: // 8 or more.
+ return randint1(10) + 70;
}
}
/*!
* @brief モンスター打撃の朦朧蓄積ランクを返す.
- * @param total 痛恨の一撃でない場合の最大ダメージ (ダイスXdY に対し、X*Y)
+ * @param total 痛恨の一撃でない場合の最大ダメージ
* @param dam プレイヤーに与えた実際のダメージ
* @return 朦朧蓄積ランク
+ * @details
+ * totalは、ダイスXdY に対し、X*Y
+ * damageは、痛恨 かつ AC < 125 ならばtotalを超える可能性あり
*/
int PlayerStun::get_accumulation_rank(int total, int damage)
{
- if (damage < total * 19 / 20) {
- return 0;
- }
-
- if ((damage < 20) && (damage <= randint0(100))) {
+ auto is_no_stun = damage < total * 19 / 20;
+ is_no_stun |= damage <= 20;
+ if (is_no_stun) {
return 0;
}
- auto max = 0;
- if ((damage >= total) && (damage >= 40)) {
- max++;
+ if (damage > 256) {
+ return 8;
}
- if (damage >= 20) {
- while (randint0(100) < 2) {
- max++;
- }
+ if (damage > 111) {
+ return 7;
}
- if (damage > 45) {
- return (6 + max);
+ if (damage > 96) {
+ return 6;
}
- if (damage > 33) {
- return (5 + max);
+ if (damage > 81) {
+ return 5;
}
- if (damage > 25) {
- return (4 + max);
+ if (damage > 66) {
+ return 4;
}
- if (damage > 18) {
- return (3 + max);
+ if (damage > 51) {
+ return 3;
}
- if (damage > 11) {
- return (2 + max);
+ if (damage > 36) {
+ return 2;
}
- return (1 + max);
+ // damage > 21.
+ return 1;
}
short PlayerStun::current() const
* @brief 朦朧ランクに応じて魔法系の失率を上げる.
* @return 失率
* @details
- * æ\84\8fè\98ä¸\8dæ\98\8eç\9eならばそもそも動けないのでこのメソッドを通らない.
+ * æ\98\8få\80\92ならばそもそも動けないのでこのメソッドを通らない.
* しかし今後の拡張を考慮して100%としておく.
*/
int PlayerStun::get_magic_chance_penalty() const
switch (this->get_rank()) {
case PlayerStunRank::NONE:
return 0;
+ case PlayerStunRank::SLIGHT:
+ return 10;
case PlayerStunRank::NORMAL:
- return 15;
+ return 20;
case PlayerStunRank::HARD:
- return 25;
+ return 30;
case PlayerStunRank::UNCONSCIOUS:
+ return 50;
+ case PlayerStunRank::KNOCKED:
return 100;
default:
throw("Invalid stun rank is specified!");
{
switch (this->get_rank()) {
case PlayerStunRank::NONE:
- return 0;
+ case PlayerStunRank::SLIGHT:
case PlayerStunRank::NORMAL:
return 0;
case PlayerStunRank::HARD:
- return 0;
+ return 5;
case PlayerStunRank::UNCONSCIOUS:
+ return 10;
+ case PlayerStunRank::KNOCKED:
return 100;
default:
throw("Invalid stun rank is specified!");
switch (this->get_rank()) {
case PlayerStunRank::NONE:
return 0;
- case PlayerStunRank::NORMAL:
+ case PlayerStunRank::SLIGHT:
return 5;
+ case PlayerStunRank::NORMAL:
+ return 10;
case PlayerStunRank::HARD:
return 20;
case PlayerStunRank::UNCONSCIOUS:
+ return 40;
+ case PlayerStunRank::KNOCKED:
return 100;
default:
throw("Invalid stun rank is specified!");
}
}
+/*!
+ * @brief プレイヤーが朦朧しているかを返す
+ * @return 朦朧状態ならばtrue、頭がハッキリしているならばfalse
+ */
bool PlayerStun::is_stunned() const
{
return this->get_rank() > PlayerStunRank::NONE;
/*!
* @brief プレイヤーが朦朧で行動不能かを返す
- * @todo 新朦朧仕様に基づき、メソッド名をis_faint() に変更予定
+ * @return 昏倒状態ならばtrue、それ以外ならばfalse
*/
-bool PlayerStun::is_unconscious() const
+bool PlayerStun::is_knocked_out() const
{
- return this->get_rank() > PlayerStunRank::UNCONSCIOUS;
+ return this->get_rank() == PlayerStunRank::KNOCKED;
}
std::tuple<term_color_type, std::string_view> PlayerStun::get_expr() const
switch (this->get_rank()) {
case PlayerStunRank::NONE: // dummy.
return std::make_tuple(TERM_WHITE, " ");
+ case PlayerStunRank::SLIGHT:
+ return std::make_tuple(TERM_WHITE, _("やや朦朧 ", "Slight stun "));
case PlayerStunRank::NORMAL:
- return std::make_tuple(TERM_ORANGE, _("朦朧 ", "Stun "));
+ return std::make_tuple(TERM_YELLOW, _("朦朧 ", "Stun "));
case PlayerStunRank::HARD:
return std::make_tuple(TERM_ORANGE, _("ひどく朦朧 ", "Heavy stun "));
case PlayerStunRank::UNCONSCIOUS:
- return std::make_tuple(TERM_RED, _("意識不明瞭 ", "Knocked out "));
+ return std::make_tuple(TERM_RED, _("意識不明瞭 ", "Unconcious "));
+ case PlayerStunRank::KNOCKED:
+ return std::make_tuple(TERM_VIOLET, _("昏倒 ", "Knocked out "));
default:
throw("Invalid stun rank is specified!");
}