OSDN Git Service

[Refactor] #3627 MonraceList の[]演算子をオーバーロードし、MonsterRaceInfo::kill_unique() を追加し...
authorHourier <66951241+Hourier@users.noreply.github.com>
Sat, 7 Oct 2023 09:52:32 +0000 (18:52 +0900)
committerHourier <66951241+Hourier@users.noreply.github.com>
Sun, 15 Oct 2023 13:33:10 +0000 (22:33 +0900)
WIP、MonsterRaceInfoは将来的に定義のみへ変更する

src/market/bounty.cpp
src/system/monster-race-info.cpp
src/system/monster-race-info.h

index 39b2acd..a02f357 100644 (file)
@@ -327,8 +327,8 @@ void determine_bounty_uniques(PlayerType *player_ptr)
     get_mon_num_prep_bounty(player_ptr);
     const auto &monraces = MonraceList::get_instance();
     auto is_suitable_for_bounty = [&monraces](MonsterRaceId r_idx) {
-        const auto &monrace = monraces_info[r_idx];
-        bool is_suitable = monrace.kind_flags.has(MonsterKindType::UNIQUE);
+        const auto &monrace = monraces[r_idx];
+        auto is_suitable = monrace.kind_flags.has(MonsterKindType::UNIQUE);
         is_suitable &= monrace.drop_flags.has_any_of({ MonsterDropType::DROP_CORPSE, MonsterDropType::DROP_SKELETON });
         is_suitable &= monrace.rarity <= 100;
         is_suitable &= !monraces.can_unify_separate(r_idx);
index 898a17c..ef9c192 100644 (file)
@@ -52,6 +52,20 @@ std::string MonsterRaceInfo::get_died_message() const
     return is_explodable ? _("は爆発して粉々になった。", " explodes into tiny shreds.") : _("を倒した。", " is destroyed.");
 }
 
+/*!
+ * @brief ユニークモンスターの撃破状態を更新する
+ * @todo 状態変更はモンスター「定義」ではないので将来的に別クラスへ分離する
+ */
+void MonsterRaceInfo::kill_unique()
+{
+    this->max_num = 0;
+    this->r_pkills++;
+    this->r_akills++;
+    if (this->r_tkills < MAX_SHORT) {
+        this->r_tkills++;
+    }
+}
+
 const std::map<MonsterRaceId, std::set<MonsterRaceId>> MonraceList::unified_uniques = {
     { MonsterRaceId::BANORLUPART, { MonsterRaceId::BANOR, MonsterRaceId::LUPART } },
 };
@@ -69,6 +83,28 @@ MonraceList &MonraceList::get_instance()
 }
 
 /*!
+ * @bried モンスター定義を種族IDから直接得る
+ * @param モンスター種族ID
+ * @return モンスター定義への参照
+ * @details モンスター実体からモンスター定義を得るためには使用しないこと
+ */
+MonsterRaceInfo &MonraceList::operator[](const MonsterRaceId r_idx)
+{
+    return monraces_info.at(r_idx);
+}
+
+/*!
+ * @bried モンスター定義を種族IDから直接得る
+ * @param モンスター種族ID
+ * @return モンスター定義への参照
+ * @details モンスター実体からモンスター定義を得るためには使用しないこと
+ */
+const MonsterRaceInfo &MonraceList::operator[](const MonsterRaceId r_idx) const
+{
+    return monraces_info.at(r_idx);
+}
+
+/*!
  * @brief 合体/分離ユニーク判定
  * @param r_idx 調査対象のモンスター種族ID
  * @return 合体/分離ユニークか否か
@@ -92,21 +128,11 @@ bool MonraceList::can_unify_separate(const MonsterRaceId r_idx) const
  */
 void MonraceList::kill_unified_unique(const MonsterRaceId r_idx)
 {
-    auto kill_monrace = [](MonsterRaceId r_idx) {
-        auto &monrace = monraces_info[r_idx];
-        monrace.max_num = 0;
-        monrace.r_pkills++;
-        monrace.r_akills++;
-        if (monrace.r_tkills < MAX_SHORT) {
-            monrace.r_tkills++;
-        }
-    };
-
     const auto it_unique = unified_uniques.find(r_idx);
     if (it_unique != unified_uniques.end()) {
-        kill_monrace(it_unique->first);
+        (*this)[it_unique->first].kill_unique();
         for (const auto separate : it_unique->second) {
-            kill_monrace(separate);
+            (*this)[separate].kill_unique();
         }
 
         return;
@@ -115,8 +141,8 @@ void MonraceList::kill_unified_unique(const MonsterRaceId r_idx)
     for (const auto &[unified_unique, separates] : unified_uniques) {
         const auto it_separate = separates.find(r_idx);
         if (it_separate != separates.end()) {
-            kill_monrace(*it_separate);
-            kill_monrace(unified_unique);
+            (*this)[*it_separate].kill_unique();
+            (*this)[unified_unique].kill_unique();
             return;
         }
     }
@@ -137,7 +163,7 @@ bool MonraceList::is_selectable(const MonsterRaceId r_idx) const
         return true;
     }
 
-    return std::all_of(it->second.begin(), it->second.end(), [](const auto x) { return monraces_info[x].cur_num == 0; });
+    return std::all_of(it->second.begin(), it->second.end(), [&](const auto x) { return (*this)[x].cur_num == 0; });
 }
 
 /*!
@@ -146,22 +172,17 @@ bool MonraceList::is_selectable(const MonsterRaceId r_idx) const
 void MonraceList::defeat_separated_uniques()
 {
     for (const auto &[unified_unique, separates] : unified_uniques) {
-        if (monraces_info[unified_unique].max_num > 0) {
+        if ((*this)[unified_unique].max_num > 0) {
             continue;
         }
 
         for (const auto separate : separates) {
-            auto &monrace = monraces_info[separate];
+            auto &monrace = (*this)[separate];
             if (monrace.max_num == 0) {
                 continue;
             }
 
-            monrace.max_num = 0;
-            monrace.r_pkills++;
-            monrace.r_akills++;
-            if (monrace.r_tkills < MAX_SHORT) {
-                monrace.r_tkills++;
-            }
+            monrace.kill_unique();
         }
     }
 }
@@ -179,7 +200,7 @@ bool MonraceList::is_unified(const MonsterRaceId r_idx) const
 bool MonraceList::exists_separates(const MonsterRaceId r_idx) const
 {
     const auto &separates = unified_uniques.at(r_idx);
-    return std::all_of(separates.begin(), separates.end(), [](const auto x) { return monraces_info[x].cur_num > 0; });
+    return std::all_of(separates.begin(), separates.end(), [&](const auto x) { return (*this)[x].cur_num > 0; });
 }
 
 /*!
@@ -218,5 +239,5 @@ bool MonraceList::can_select_separate(const MonsterRaceId r_idx, const int hp, c
         return false;
     }
 
-    return std::all_of(found_separates.begin(), found_separates.end(), [](const auto x) { return monraces_info[x].max_num > 0; });
+    return std::all_of(found_separates.begin(), found_separates.end(), [&](const auto x) { return (*this)[x].max_num > 0; });
 }
index c1dd200..12afd0a 100644 (file)
@@ -142,6 +142,7 @@ public:
     bool has_living_flag() const;
     bool is_explodable() const;
     std::string get_died_message() const;
+    void kill_unique();
 };
 
 class MonraceList {
@@ -150,6 +151,8 @@ public:
     MonraceList(const MonraceList &) = delete;
     MonraceList &operator=(const MonraceList &) = delete;
     MonraceList &operator=(MonraceList &&) = delete;
+    MonsterRaceInfo &operator[](const MonsterRaceId r_idx);
+    const MonsterRaceInfo &operator[](const MonsterRaceId r_idx) const;
 
     static const std::map<MonsterRaceId, std::set<MonsterRaceId>> &get_unified_uniques();
     static MonraceList &get_instance();