OSDN Git Service

[Refactor] #3633 random_quest_number() をFloorType::get_random_quest_id() に繰り込んだ
authorHourier <66951241+Hourier@users.noreply.github.com>
Thu, 28 Sep 2023 09:45:30 +0000 (18:45 +0900)
committerHourier <66951241+Hourier@users.noreply.github.com>
Sat, 30 Sep 2023 11:07:30 +0000 (20:07 +0900)
src/cmd-io/cmd-dump.cpp
src/dungeon/dungeon-processor.cpp
src/dungeon/quest.cpp
src/dungeon/quest.h
src/spell-kind/spells-genocide.cpp
src/spell-kind/spells-world.cpp
src/system/floor-type-definition.cpp
src/system/floor-type-definition.h

index 2416276..9f2a6cc 100644 (file)
@@ -238,7 +238,7 @@ void do_cmd_feeling(PlayerType *player_ptr)
     }
 
     const auto &floor = *player_ptr->current_floor_ptr;
-    if (inside_quest(floor.quest_number) && !inside_quest(random_quest_number(floor, floor.dun_level))) {
+    if (inside_quest(floor.quest_number) && !inside_quest(floor.get_random_quest_id())) {
         msg_print(_("典型的なクエストのダンジョンのようだ。", "Looks like a typical quest level."));
         return;
     }
index 07c2593..c2d1a71 100644 (file)
@@ -178,8 +178,9 @@ void process_dungeon(PlayerType *player_ptr, bool load_game)
     }
 
     if (!inside_quest(floor.quest_number) && (floor.dungeon_idx == DUNGEON_ANGBAND)) {
-        quest_discovery(random_quest_number(floor, floor.dun_level));
-        floor.quest_number = random_quest_number(floor, floor.dun_level);
+        const auto random_quest_id = floor.get_random_quest_id();
+        quest_discovery(random_quest_id);
+        floor.quest_number = random_quest_id;
     }
 
     const auto &dungeon = floor.get_dungeon_definition();
index c8dbf87..056c8f6 100644 (file)
@@ -29,7 +29,7 @@
 #include "player/player-status.h"
 #include "system/artifact-type-definition.h"
 #include "system/dungeon-info.h"
-#include "system/floor-type-definition.h"
+#include "system/floor-type-definition.h" // @todo 相互参照、将来的に削除する.
 #include "system/grid-type-definition.h"
 #include "system/item-entity.h"
 #include "system/monster-race-info.h"
@@ -368,34 +368,7 @@ QuestId quest_number(const FloorType &floor, DEPTH level)
         }
     }
 
-    return random_quest_number(floor, level);
-}
-
-/*!
- * @brief 新しく入ったダンジョンの階層に固定されているランダムクエストを探し出しIDを返す。
- * @param player_ptr プレイヤーへの参照ポインタ
- * @param level 検索対象になる階
- * @return クエストIDを返す。該当がない場合0を返す。
- */
-QuestId random_quest_number(const FloorType &floor, DEPTH level)
-{
-    if (floor.dungeon_idx != DUNGEON_ANGBAND) {
-        return QuestId::NONE;
-    }
-
-    const auto &quest_list = QuestList::get_instance();
-    for (auto q_idx : EnumRange(QuestId::RANDOM_QUEST1, QuestId::RANDOM_QUEST10)) {
-        const auto &quest = quest_list[q_idx];
-        auto is_random_quest = (quest.type == QuestKindType::RANDOM);
-        is_random_quest &= (quest.status == QuestStatusType::TAKEN);
-        is_random_quest &= (quest.level == level);
-        is_random_quest &= (quest.dungeon == DUNGEON_ANGBAND);
-        if (is_random_quest) {
-            return q_idx;
-        }
-    }
-
-    return QuestId::NONE;
+    return floor.get_random_quest_id(level);
 }
 
 /*!
index 2f014f8..605e5d6 100644 (file)
@@ -171,7 +171,6 @@ void complete_quest(PlayerType *player_ptr, QuestId quest_num);
 void check_find_art_quest_completion(PlayerType *player_ptr, ItemEntity *o_ptr);
 void quest_discovery(QuestId q_idx);
 QuestId quest_number(const FloorType &floor, DEPTH level);
-QuestId random_quest_number(const FloorType &floor, DEPTH level);
 void leave_quest_check(PlayerType *player_ptr);
 void leave_tower_check(PlayerType *player_ptr);
 void exe_enter_quest(PlayerType *player_ptr, QuestId quest_idx);
index c7d20ff..cc5f718 100644 (file)
@@ -35,7 +35,7 @@ static bool is_in_special_floor(PlayerType *player_ptr)
 {
     auto &floor = *player_ptr->current_floor_ptr;
     auto is_in_fixed_quest = inside_quest(floor.quest_number);
-    is_in_fixed_quest &= !inside_quest(random_quest_number(floor, floor.dun_level));
+    is_in_fixed_quest &= !inside_quest(floor.get_random_quest_id());
     return is_in_fixed_quest || floor.inside_arena || player_ptr->phase_out;
 }
 
@@ -129,7 +129,7 @@ bool genocide_aux(PlayerType *player_ptr, MONSTER_IDX m_idx, int power, bool pla
 bool symbol_genocide(PlayerType *player_ptr, int power, bool player_cast)
 {
     auto &floor = *player_ptr->current_floor_ptr;
-    bool is_special_floor = inside_quest(floor.quest_number) && !inside_quest(random_quest_number(floor, floor.dun_level));
+    bool is_special_floor = inside_quest(floor.quest_number) && !inside_quest(floor.get_random_quest_id());
     is_special_floor |= floor.inside_arena;
     is_special_floor |= player_ptr->phase_out;
     if (is_special_floor) {
@@ -176,7 +176,7 @@ bool symbol_genocide(PlayerType *player_ptr, int power, bool player_cast)
 bool mass_genocide(PlayerType *player_ptr, int power, bool player_cast)
 {
     auto &floor = *player_ptr->current_floor_ptr;
-    bool is_special_floor = inside_quest(floor.quest_number) && !inside_quest(random_quest_number(floor, floor.dun_level));
+    bool is_special_floor = inside_quest(floor.quest_number) && !inside_quest(floor.get_random_quest_id());
     is_special_floor |= floor.inside_arena;
     is_special_floor |= player_ptr->phase_out;
     if (is_special_floor) {
@@ -213,7 +213,7 @@ bool mass_genocide(PlayerType *player_ptr, int power, bool player_cast)
 bool mass_genocide_undead(PlayerType *player_ptr, int power, bool player_cast)
 {
     auto &floor = *player_ptr->current_floor_ptr;
-    bool is_special_floor = inside_quest(floor.quest_number) && !inside_quest(random_quest_number(floor, floor.dun_level));
+    bool is_special_floor = inside_quest(floor.quest_number) && !inside_quest(floor.get_random_quest_id());
     is_special_floor |= floor.inside_arena;
     is_special_floor |= player_ptr->phase_out;
     if (is_special_floor) {
index 9037208..4f575c8 100644 (file)
@@ -55,7 +55,7 @@ bool is_teleport_level_ineffective(PlayerType *player_ptr, MONSTER_IDX idx)
     const auto &floor = *player_ptr->current_floor_ptr;
     auto is_special_floor = floor.inside_arena;
     is_special_floor |= player_ptr->phase_out;
-    is_special_floor |= inside_quest(floor.quest_number) && !inside_quest(random_quest_number(floor, floor.dun_level));
+    is_special_floor |= inside_quest(floor.quest_number) && !inside_quest(floor.get_random_quest_id());
     auto is_invalid_floor = idx <= 0;
     is_invalid_floor &= inside_quest(quest_number(floor, floor.dun_level)) || (floor.dun_level >= floor.get_dungeon_definition().maxdepth);
     is_invalid_floor &= floor.dun_level >= 1;
index c296621..a3d7dc1 100644 (file)
@@ -1,5 +1,6 @@
 #include "system/floor-type-definition.h"
 #include "system/dungeon-info.h"
+#include "util/enum-range.h"
 
 bool FloorType::is_in_dungeon() const
 {
@@ -20,3 +21,31 @@ dungeon_type &FloorType::get_dungeon_definition() const
 {
     return dungeons_info[this->dungeon_idx];
 }
+
+/*!
+ * @brief 新しく入ったダンジョンの階層に固定されているランダムクエストを探し出しIDを返す。
+ * @param player_ptr プレイヤーへの参照ポインタ
+ * @param level 検索対象になる階
+ * @return クエストIDを返す。該当がない場合0を返す。
+ */
+QuestId FloorType::get_random_quest_id(std::optional<int> level_opt) const
+{
+    if (this->dungeon_idx != DUNGEON_ANGBAND) {
+        return QuestId::NONE;
+    }
+
+    const auto level = level_opt.value_or(this->dun_level);
+    const auto &quest_list = QuestList::get_instance();
+    for (auto q_idx : EnumRange(QuestId::RANDOM_QUEST1, QuestId::RANDOM_QUEST10)) {
+        const auto &quest = quest_list[q_idx];
+        auto is_random_quest = (quest.type == QuestKindType::RANDOM);
+        is_random_quest &= (quest.status == QuestStatusType::TAKEN);
+        is_random_quest &= (quest.level == level);
+        is_random_quest &= (quest.dungeon == DUNGEON_ANGBAND);
+        if (is_random_quest) {
+            return q_idx;
+        }
+    }
+
+    return QuestId::NONE;
+}
index c62e1eb..ab095e0 100644 (file)
@@ -5,6 +5,7 @@
 #include "monster/monster-timed-effect-types.h"
 #include "system/angband.h"
 #include <array>
+#include <optional>
 #include <vector>
 
 /*!
@@ -87,4 +88,5 @@ public:
     void set_dungeon_index(short dungeon_idx_); /*!< @todo 後でenum class にする */
     void reset_dungeon_index();
     dungeon_type &get_dungeon_definition() const;
+    QuestId get_random_quest_id(std::optional<int> level_opt = std::nullopt) const;
 };