OSDN Git Service

[Refactor] #3330 PlayerClass にだけ依存する関数get_subtitle_candidates() を移した
authorHourier <66951241+Hourier@users.noreply.github.com>
Sat, 20 May 2023 11:34:54 +0000 (20:34 +0900)
committerHourier <66951241+Hourier@users.noreply.github.com>
Sat, 20 May 2023 12:00:22 +0000 (21:00 +0900)
src/cmd-io/cmd-diary.cpp
src/player-base/player-class.cpp
src/player-base/player-class.h

index 3c6fdb2..500c081 100644 (file)
@@ -1,5 +1,4 @@
 #include "cmd-io/cmd-diary.h"
-#include "cmd-io/diary-subtitle-table.h"
 #include "core/asking-player.h"
 #include "core/show-file.h"
 #include "game-option/play-record-options.h"
 #include "util/int-char-converter.h"
 #include "view/display-messages.h"
 #include "world/world.h"
-#include <span>
 #include <sstream>
 #include <string>
 
 /*!
- * @brief 日記のサブタイトルの候補一覧を取得する
- *
- * 候補一覧の先頭は「最高の肉体を求めて」、末尾は「最高の頭脳を求めて」で
- * あるため、プレイヤーの職業に従い範囲を決定する。
- *
- * @return 候補一覧を参照するstd::spanオブジェクト
- */
-static auto get_subtitle_candidates(PlayerType *player_ptr)
-{
-    std::span<const std::string> candidates(diary_subtitles);
-    const auto max = diary_subtitles.size();
-
-    PlayerClass pc(player_ptr);
-
-    if (pc.is_tough()) {
-        return candidates.subspan(0, max - 1);
-    }
-
-    if (pc.is_wizard()) {
-        return candidates.subspan(1);
-    }
-
-    return candidates.subspan(1, max - 2);
-}
-
-/*!
  * @brief 日記のタイトル表記と内容出力
  * @param player_ptr プレイヤーへの参照ポインタ
  */
 static void display_diary(PlayerType *player_ptr)
 {
-    const auto subtitle_candidates = get_subtitle_candidates(player_ptr);
+    const auto subtitle_candidates = PlayerClass(player_ptr).get_subtitle_candidates();
     const auto choice = Rand_external(subtitle_candidates.size());
     const auto &subtitle = subtitle_candidates[choice];
 #ifdef JP
index 7ce373c..c1650da 100644 (file)
@@ -5,6 +5,7 @@
  * @details PlayerRaceからPlayerClassへの依存はあるが、逆は依存させないこと.
  */
 #include "player-base/player-class.h"
+#include "cmd-io/diary-subtitle-table.h"
 #include "core/player-redraw-types.h"
 #include "inventory/inventory-slot-types.h"
 #include "mind/mind-elementalist.h"
@@ -536,3 +537,26 @@ bool PlayerClass::has_ninja_speed() const
     has_ninja_speed_sub |= can_attack_with_sub_hand(this->player_ptr);
     return has_ninja_speed_main && has_ninja_speed_sub;
 }
+
+/*!
+ * @brief 日記のサブタイトルの候補一覧を取得する
+ *
+ * 候補一覧の先頭は「最高の肉体を求めて」、末尾は「最高の頭脳を求めて」で
+ * あるため、プレイヤーの職業に従い範囲を決定する。
+ *
+ * @return 候補一覧を参照するstd::spanオブジェクト
+ */
+std::span<const std::string> PlayerClass::get_subtitle_candidates() const
+{
+    static const std::span<const std::string> candidates(diary_subtitles);
+    const auto max = diary_subtitles.size();
+    if (this->is_tough()) {
+        return candidates.subspan(0, max - 1);
+    }
+
+    if (this->is_wizard()) {
+        return candidates.subspan(1);
+    }
+
+    return candidates.subspan(1, max - 2);
+}
index b2498c1..f6c57c7 100644 (file)
@@ -1,12 +1,10 @@
 #pragma once
 
-#include "system/angband.h"
-
 #include "object-enchant/tr-flags.h"
 #include "system/player-type-definition.h"
-
 #include <initializer_list>
 #include <memory>
+#include <span>
 #include <variant>
 
 enum class SamuraiStanceType : uint8_t;
@@ -49,6 +47,7 @@ public:
     std::shared_ptr<T> get_specific_data() const;
 
     bool has_ninja_speed() const;
+    std::span<const std::string> get_subtitle_candidates() const;
 
 private:
     PlayerType *player_ptr;