}
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;
}
}
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();
#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"
}
}
- 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);
}
/*!
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);
{
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;
}
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) {
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) {
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) {
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;
#include "system/floor-type-definition.h"
#include "system/dungeon-info.h"
+#include "util/enum-range.h"
bool FloorType::is_in_dungeon() 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;
+}
#include "monster/monster-timed-effect-types.h"
#include "system/angband.h"
#include <array>
+#include <optional>
#include <vector>
/*!
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;
};