OSDN Git Service

[Feature] #553 新しい朦朧仕様を実装した
authorHourier <66951241+Hourier@users.noreply.github.com>
Wed, 29 Sep 2021 10:58:56 +0000 (19:58 +0900)
committerHourier <66951241+Hourier@users.noreply.github.com>
Thu, 30 Sep 2021 12:56:38 +0000 (21:56 +0900)
src/core/player-processor.cpp
src/timed-effect/player-stun.cpp
src/timed-effect/player-stun.h

index be1bcc5..2121bd0 100644 (file)
@@ -278,12 +278,12 @@ void process_player(player_type *player_ptr)
         PlayerEnergy energy(player_ptr);
         energy.reset_player_turn();
         auto effects = player_ptr->effects();
-        auto is_unconscious = effects->stun()->is_unconscious();
+        auto is_knocked_out = effects->stun()->is_knocked_out();
         if (player_ptr->phase_out) {
             move_cursor_relative(player_ptr->y, player_ptr->x);
             command_cmd = SPECIAL_KEY_BUILDING;
             process_command(player_ptr);
-        } else if ((player_ptr->paralyzed || is_unconscious) && !cheat_immortal) {
+        } else if ((player_ptr->paralyzed || is_knocked_out) && !cheat_immortal) {
             energy.set_player_turn_energy(100);
         } else if (player_ptr->action == ACTION_REST) {
             if (player_ptr->resting > 0) {
index 607f87e..7e15666 100644 (file)
@@ -3,25 +3,35 @@
 
 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;
 }
 
@@ -30,12 +40,16 @@ std::string_view PlayerStun::get_stun_mes(PlayerStunRank stun_rank)
     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!");
     }
@@ -47,70 +61,71 @@ short PlayerStun::get_accumulation(int rank)
     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
@@ -127,7 +142,7 @@ PlayerStunRank PlayerStun::get_rank() const
  * @brief 朦朧ランクに応じて魔法系の失率を上げる.
  * @return 失率
  * @details
- * æ\84\8fè­\98ä¸\8dæ\98\8eç\9e­ならばそもそも動けないのでこのメソッドを通らない.
+ * æ\98\8få\80\92ならばそもそも動けないのでこのメソッドを通らない.
  * しかし今後の拡張を考慮して100%としておく.
  */
 int PlayerStun::get_magic_chance_penalty() const
@@ -135,11 +150,15 @@ 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!");
@@ -157,12 +176,14 @@ int PlayerStun::get_item_chance_penalty() const
 {
     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!");
@@ -182,17 +203,25 @@ short PlayerStun::get_damage_penalty() const
     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;
@@ -200,11 +229,11 @@ bool PlayerStun::is_stunned() const
 
 /*!
  * @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
@@ -212,12 +241,16 @@ 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!");
     }
index 5601d4b..ecba967 100644 (file)
@@ -21,7 +21,7 @@ public:
     int get_item_chance_penalty() const;
     short get_damage_penalty() const;
     bool is_stunned() const;
-    bool is_unconscious() const;
+    bool is_knocked_out() const;
     std::tuple<term_color_type, std::string_view> get_expr() const;
     void set(short value);
     void reset();