3 #include "system/angband.h"
4 #include "util/enum-converter.h"
14 enum class QuestId : short{
15 NONE = 0, /* クエストなし */
16 THIEF = 1, /*<! 盗賊の隠れ家 */
17 SEWER = 2, /*<! 下水道 */
18 LOGURUS = 3, /*<! ログルス使い */
19 VAULT = 4, /*<! 宝物庫 */
20 TOWER1 = 5, /*<! 塔クエスト(第1階層)に割り振るクエストID */
21 TOWER2 = 6, /*<! 塔クエスト(第2階層)に割り振るクエストID */
22 TOWER3 = 7, /*<! 塔クエスト(第3階層)に割り振るクエストID */
23 OBERON = 8, /*<! オベロン打倒クエストに割り振るクエストID */
24 SERPENT = 9, /*<! サーペント打倒クエストに割り振るクエストID */
25 SORCERER = 10, /*<! 仙術エネルギー特異点 */
26 CHAOS = 11, /*<! カオスの特異点 */
27 NATURE = 12, /*<! 自然魔術の特異点 */
28 WARG = 14, /*<! ワーグを殲滅せよ */
29 ERIC = 15, /*<! エリックの要塞 */
30 MONSALVAT = 16, /*<! モンサルヴァト城への侵攻 */
31 CITY_SEA = 17, /*<! 海底都市(現在は没) */
32 WATER_CAVE = 18, /*<! 湖の洞窟 */
33 DOOM_1 = 19, /*<! 破滅のクエスト1 */
34 VAPOR = 20, /*<! 謎の瘴気 */
35 DOOM_2 = 21, /*<! 破滅のクエスト2 */
36 ORC_CAMP = 22, /*<! オークのキャンプ */
37 SPAWNING = 23, /*<! 増殖地獄 */
38 MS = 24, /*<! マイクロンフトの興亡 */
39 HAUNTED_HOUCE = 25, /*<! 幽霊屋敷 */
40 KILLING_FIELDS = 26, /*<! 激戦場 */
41 OLD_CASTLE = 27, /*<! 古い城 */
42 ROYAL_CRYPT = 28, /*<! 王家の墓 */
43 MIMIC = 29, /*<! ミミックの財宝 */
44 TENGU = 30, /*<! テングとデスソード */
45 WILLOW = 31, /*<! 柳じじい */
46 DARK_ELF = 32, /*<! ダークエルフの王 */
47 CLONE = 33, /*<! クローン地獄 */
48 DUMP_WITNESS = 34, /*<! もの言えぬ証人 */
49 RANDOM_QUEST1 = 40, /*<! ランダムクエストを割り当てるクエストIDの開始値 */
58 RANDOM_QUEST10 = 49, /*<! ランダムクエストを割り当てるクエストIDの終了値 */
61 constexpr auto MIN_RANDOM_QUEST = enum2i(QuestId::RANDOM_QUEST1);
62 constexpr auto MAX_RANDOM_QUEST = enum2i(QuestId::RANDOM_QUEST10);
64 constexpr uint QUEST_FLAG_SILENT = 0x01; /*!< クエストフラグ: クエスト進行に関する情報表示を抑止する / no messages from completion */
65 constexpr uint QUEST_FLAG_PRESET = 0x02; /*!< クエストフラグ: クエストがダンジョン外で発生する / quest is outside the main dungeon */
66 constexpr uint QUEST_FLAG_ONCE = 0x04; /*!< クエストフラグ: クエストがフロアを出た時点で完了する / quest is marked finished after leaving */
67 constexpr uint QUEST_FLAG_TOWER = 0x08; /*!< クエストフラグ: クエスト:塔の形式で進行する / Tower quest is special */
69 enum class QuestStatusType : short {
70 UNTAKEN = 0, /*!< クエストステータス状態:未発生*/
71 TAKEN = 1, /*!< クエストステータス状態:発生中*/
72 COMPLETED= 2, /*!< クエストステータス状態:達成*/
73 REWARDED = 3, /*!< クエストステータス状態:報酬受け取り前*/
74 FINISHED = 4, /*!< クエストステータス状態:完了*/
75 FAILED = 5, /*!< クエストステータス状態:失敗*/
76 FAILED_DONE = 6, /*!< クエストステータス状態:失敗完了*/
77 STAGE_COMPLETED = 7, /*!< クエストステータス状態:ステージ毎達成*/
80 enum class QuestKindType : short {
81 NONE = 0, /*!< ダミー、クエストではない */
82 KILL_LEVEL = 1, /*!< クエスト目的: 特定のユニークモンスターを倒す */
83 KILL_ANY_LEVEL = 2, /*!< クエスト目的: イベント受託時点でランダムで選ばれた特定のユニークモンスターを倒す */
84 FIND_ARTIFACT = 3, /*!< クエスト目的: 特定のアーティファクトを発見する */
85 FIND_EXIT = 4, /*!< クエスト目的: 脱出する */
86 KILL_NUMBER = 5, /*!< クエスト目的: モンスターを無差別に特定数倒す */
87 KILL_ALL = 6, /*!< クエスト目的: エリア中のすべてのモンスターを全て倒す */
88 RANDOM = 7, /*!< クエスト目的: ランダムクエストとして選ばれたユニーク1体を倒す */
89 TOWER = 8, /*!< クエスト目的: 複数のエリアの全てのモンスターを倒す */
95 * @brief クエスト情報の構造体 / Structure for the "quests".
97 enum class FixedArtifactId : short;
98 enum class MonsterRaceId : int16_t;
102 QuestType() = default;
104 QuestStatusType status{}; /*!< クエストの進行ステータス / Is the quest taken, completed, finished? */
105 QuestKindType type{}; /*!< クエストの種別 / The quest type */
107 std::string name = ""; /*!< クエスト名 / Quest name */
108 DEPTH level = 0; /*!< 処理階層 / Dungeon level */
109 MonsterRaceId r_idx{}; /*!< クエスト対象のモンスターID / Monster race */
111 MONSTER_NUMBER cur_num = 0; /*!< 撃破したモンスターの数 / Number killed */
112 MONSTER_NUMBER max_num = 0; /*!< 求められるモンスターの撃破数 / Number required */
114 FixedArtifactId reward_artifact_idx{}; /*!< クエスト対象のアイテムID / object index */
115 MONSTER_NUMBER num_mon = 0; /*!< QuestKindTypeがKILL_NUMBER時の目標撃破数 number of monsters on level */
117 BIT_FLAGS flags = 0; /*!< クエストに関するフラグビット / quest flags */
118 DUNGEON_IDX dungeon = 0; /*!< クエスト対象のダンジョンID / quest dungeon */
120 PLAYER_LEVEL complev = 0; /*!< クリア時プレイヤーレベル / player level (complete) */
121 REAL_TIME comptime = 0; /*!< クリア時ゲーム時間 / quest clear time*/
123 static bool is_fixed(QuestId quest_idx);
124 bool has_reward() const;
125 ArtifactType &get_reward() const;
128 class QuestList final {
130 using iterator = std::map<QuestId, QuestType>::iterator;
131 using reverse_iterator = std::map<QuestId, QuestType>::reverse_iterator;
132 using const_iterator = std::map<QuestId, QuestType>::const_iterator;
133 using const_reverse_iterator = std::map<QuestId, QuestType>::const_reverse_iterator;
134 static QuestList &get_instance();
135 QuestType &operator[](QuestId id);
136 const QuestType &operator[](QuestId id) const;
138 const_iterator begin() const;
140 const_iterator end() const;
141 reverse_iterator rbegin();
142 const_reverse_iterator rbegin() const;
143 reverse_iterator rend();
144 const_reverse_iterator rend() const;
145 iterator find(QuestId id);
146 const_iterator find(QuestId id) const;
149 QuestList(const QuestList &) = delete;
150 QuestList(QuestList &&) = delete;
151 QuestList &operator=(const QuestList &) = delete;
152 QuestList &operator=(QuestList &&) = delete;
155 bool initialized = false;
156 std::map<QuestId, QuestType> quest_data;
157 QuestList() = default;
158 ~QuestList() = default;
161 extern char quest_text[10][80];
162 extern int quest_text_line;
163 extern QuestId leaving_quest;
168 void determine_random_questor(PlayerType *player_ptr, QuestType *q_ptr);
169 void record_quest_final_status(QuestType *q_ptr, PLAYER_LEVEL lev, QuestStatusType stat);
170 void complete_quest(PlayerType *player_ptr, QuestId quest_num);
171 void check_find_art_quest_completion(PlayerType *player_ptr, ItemEntity *o_ptr);
172 void quest_discovery(QuestId q_idx);
173 void leave_quest_check(PlayerType *player_ptr);
174 void leave_tower_check(PlayerType *player_ptr);
175 void exe_enter_quest(PlayerType *player_ptr, QuestId quest_idx);
176 void do_cmd_quest(PlayerType *player_ptr);
177 bool inside_quest(QuestId id);