OSDN Git Service

Merge pull request #3688 from Hourier/Fix-Compilation-Warnings-Beta
[hengbandforosx/hengbandosx.git] / src / dungeon / quest.h
1 #pragma once
2
3 #include "system/angband.h"
4 #include "util/enum-converter.h"
5 #include <map>
6 #include <string>
7 #include <vector>
8
9 // clang-format off
10
11 /*
12  * Quest constants
13  */
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の開始値 */
50         RANDOM_QUEST2 = 41,
51         RANDOM_QUEST3 = 42,
52         RANDOM_QUEST4 = 43,
53         RANDOM_QUEST5 = 44,
54         RANDOM_QUEST6 = 45,
55         RANDOM_QUEST7 = 46,
56         RANDOM_QUEST8 = 47,
57         RANDOM_QUEST9 = 48,
58         RANDOM_QUEST10 = 49, /*<! ランダムクエストを割り当てるクエストIDの終了値 */
59 };
60
61 constexpr auto MIN_RANDOM_QUEST = enum2i(QuestId::RANDOM_QUEST1);
62 constexpr auto MAX_RANDOM_QUEST = enum2i(QuestId::RANDOM_QUEST10);
63
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 */
68
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, /*!< クエストステータス状態:ステージ毎達成*/
78 };
79
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,          /*!< クエスト目的: 複数のエリアの全てのモンスターを倒す */
90 };
91
92 // clang-format on
93
94 /*!
95  * @brief クエスト情報の構造体 / Structure for the "quests".
96  */
97 enum class FixedArtifactId : short;
98 enum class MonsterRaceId : int16_t;
99 class ArtifactType;
100 class QuestType {
101 public:
102     QuestType() = default;
103
104     QuestStatusType status{}; /*!< クエストの進行ステータス / Is the quest taken, completed, finished? */
105     QuestKindType type{}; /*!< クエストの種別 / The quest type */
106
107     std::string name = ""; /*!< クエスト名 / Quest name */
108     DEPTH level = 0; /*!< 処理階層 / Dungeon level */
109     MonsterRaceId r_idx{}; /*!< クエスト対象のモンスターID / Monster race */
110
111     MONSTER_NUMBER cur_num = 0; /*!< 撃破したモンスターの数 / Number killed */
112     MONSTER_NUMBER max_num = 0; /*!< 求められるモンスターの撃破数 / Number required */
113
114     FixedArtifactId reward_artifact_idx{}; /*!< クエスト対象のアイテムID / object index */
115     MONSTER_NUMBER num_mon = 0; /*!< QuestKindTypeがKILL_NUMBER時の目標撃破数 number of monsters on level */
116
117     BIT_FLAGS flags = 0; /*!< クエストに関するフラグビット / quest flags */
118     DUNGEON_IDX dungeon = 0; /*!< クエスト対象のダンジョンID / quest dungeon */
119
120     PLAYER_LEVEL complev = 0; /*!< クリア時プレイヤーレベル / player level (complete) */
121     REAL_TIME comptime = 0; /*!< クリア時ゲーム時間 /  quest clear time*/
122
123     static bool is_fixed(QuestId quest_idx);
124     bool has_reward() const;
125     ArtifactType &get_reward() const;
126 };
127
128 class QuestList final {
129 public:
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;
137     iterator begin();
138     const_iterator begin() const;
139     iterator end();
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;
147     size_t size() const;
148     void initialize();
149     QuestList(const QuestList &) = delete;
150     QuestList(QuestList &&) = delete;
151     QuestList &operator=(const QuestList &) = delete;
152     QuestList &operator=(QuestList &&) = delete;
153
154 private:
155     bool initialized = false;
156     std::map<QuestId, QuestType> quest_data;
157     QuestList() = default;
158     ~QuestList() = default;
159 };
160
161 extern char quest_text[10][80];
162 extern int quest_text_line;
163 extern QuestId leaving_quest;
164
165 class FloorType;
166 class ItemEntity;
167 class PlayerType;
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);