OSDN Git Service

[Refactor]QUEST_IDXを廃止
authorSlimebreath6078 <slimebreath6078@yahoo.co.jp>
Sun, 6 Feb 2022 02:41:01 +0000 (11:41 +0900)
committerSlimebreath6078 <slimebreath6078@yahoo.co.jp>
Sat, 12 Feb 2022 07:38:29 +0000 (16:38 +0900)
以下の処理をした
・QUEST_IDXをenum classに
・それに伴う条件分岐の変更やキャストの追加など

67 files changed:
src/action/mutation-execution.cpp
src/birth/game-play-initializer.cpp
src/cmd-action/cmd-move.cpp
src/cmd-io/cmd-dump.cpp
src/core/game-play.cpp
src/dungeon/dungeon-processor.cpp
src/dungeon/quest-completion-checker.cpp
src/dungeon/quest-completion-checker.h
src/dungeon/quest.cpp
src/dungeon/quest.h
src/effect/effect-monster-charm.cpp
src/floor/fixed-map-generator.cpp
src/floor/floor-changer.cpp
src/floor/floor-events.cpp
src/floor/floor-generator.cpp
src/floor/floor-leaver.cpp
src/floor/floor-util.cpp
src/floor/object-allocator.cpp
src/floor/pattern-walk.cpp
src/grid/feature-generator.cpp
src/grid/stair.cpp
src/grid/trap.cpp
src/info-reader/fixed-map-parser.cpp
src/info-reader/general-parser.cpp
src/io-dump/character-dump.cpp
src/io/input-key-processor.cpp
src/io/input-key-requester.cpp
src/io/write-diary.cpp
src/knowledge/knowledge-quests.cpp
src/knowledge/knowledge-quests.h
src/load/floor-loader.cpp
src/load/load-zangband.cpp
src/load/load-zangband.h
src/load/old/load-v1-5-0.cpp
src/load/old/load-v1-7-0.cpp
src/load/player-info-loader.cpp
src/load/quest-loader.cpp
src/main-win/main-win-music.cpp
src/main/scene-table-floor.cpp
src/market/building-quest.cpp
src/melee/melee-spell-util.cpp
src/monster-floor/one-monster-placer.cpp
src/monster-race/monster-race-hook.cpp
src/monster/monster-util.cpp
src/mspell/mspell-attack.cpp
src/object-hook/hook-quest.cpp
src/object-hook/hook-quest.h
src/player/player-damage.cpp
src/player/player-move.cpp
src/save/player-writer.cpp
src/save/save.cpp
src/spell-kind/earthquake.cpp
src/spell-kind/spells-floor.cpp
src/spell-kind/spells-genocide.cpp
src/spell-kind/spells-grid.cpp
src/spell-kind/spells-teleport.cpp
src/spell-kind/spells-world.cpp
src/spell-realm/spells-chaos.cpp
src/system/floor-type-definition.h
src/target/target-describer.cpp
src/util/sort.cpp
src/view/display-player.cpp
src/window/main-window-left-frame.cpp
src/wizard/wizard-game-modifier.cpp
src/wizard/wizard-special-process.cpp
src/world/world-movement-processor.cpp
src/world/world-turn-processor.cpp

index 1860d54..aefe51a 100644 (file)
@@ -247,7 +247,7 @@ bool exe_mutation_power(PlayerType *player_ptr, PlayerMutationType power)
         m_ptr = &player_ptr->current_floor_ptr->m_list[g_ptr->m_idx];
         monster_race *r_ptr;
         r_ptr = &r_info[m_ptr->r_idx];
-        if ((r_ptr->flags3 & RF3_EVIL) && !(r_ptr->flags1 & RF1_QUESTOR) && !(r_ptr->flags1 & RF1_UNIQUE) && !player_ptr->current_floor_ptr->inside_arena && !player_ptr->current_floor_ptr->quest_number && (r_ptr->level < randint1(player_ptr->lev + 50)) && m_ptr->mflag2.has_not(MonsterConstantFlagType::NOGENO)) {
+        if ((r_ptr->flags3 & RF3_EVIL) && !(r_ptr->flags1 & RF1_QUESTOR) && !(r_ptr->flags1 & RF1_UNIQUE) && !player_ptr->current_floor_ptr->inside_arena && !inside_quest(player_ptr->current_floor_ptr->quest_number) && (r_ptr->level < randint1(player_ptr->lev + 50)) && m_ptr->mflag2.has_not(MonsterConstantFlagType::NOGENO)) {
             if (record_named_pet && is_pet(m_ptr) && m_ptr->nickname) {
                 GAME_TEXT m_name[MAX_NLEN];
                 monster_desc(player_ptr, m_name, m_ptr, MD_INDEF_VISIBLE);
index 0abe846..92f9989 100644 (file)
@@ -141,7 +141,7 @@ void player_wipe_without_name(PlayerType *player_ptr)
     player_ptr->max_plv = player_ptr->lev = 1;
     player_ptr->arena_number = 0;
     player_ptr->current_floor_ptr->inside_arena = false;
-    player_ptr->current_floor_ptr->quest_number = 0;
+    player_ptr->current_floor_ptr->quest_number = QuestId::NONE;
 
     player_ptr->exit_bldg = true;
     player_ptr->today_mon = 0;
@@ -180,9 +180,9 @@ void init_dungeon_quests(PlayerType *player_ptr)
     int number_of_quests = MAX_RANDOM_QUEST - MIN_RANDOM_QUEST + 1;
     init_flags = INIT_ASSIGN;
     floor_type *floor_ptr = player_ptr->current_floor_ptr;
-    floor_ptr->quest_number = MIN_RANDOM_QUEST;
+    floor_ptr->quest_number = i2enum<QuestId>(MIN_RANDOM_QUEST);
     parse_fixed_map(player_ptr, "q_info.txt", 0, 0, 0, 0);
-    floor_ptr->quest_number = 0;
+    floor_ptr->quest_number = QuestId::NONE;
     for (int i = MIN_RANDOM_QUEST + number_of_quests - 1; i >= MIN_RANDOM_QUEST; i--) {
         quest_type *q_ptr = &quest[i];
         monster_race *quest_r_ptr;
@@ -194,14 +194,14 @@ void init_dungeon_quests(PlayerType *player_ptr)
     }
 
     init_flags = INIT_ASSIGN;
-    floor_ptr->quest_number = QUEST_OBERON;
+    floor_ptr->quest_number = QuestId::OBERON;
     parse_fixed_map(player_ptr, "q_info.txt", 0, 0, 0, 0);
-    quest[QUEST_OBERON].status = QuestStatusType::TAKEN;
+    quest[enum2i(QuestId::OBERON)].status = QuestStatusType::TAKEN;
 
-    floor_ptr->quest_number = QUEST_SERPENT;
+    floor_ptr->quest_number = QuestId::SERPENT;
     parse_fixed_map(player_ptr, "q_info.txt", 0, 0, 0, 0);
-    quest[QUEST_SERPENT].status = QuestStatusType::TAKEN;
-    floor_ptr->quest_number = 0;
+    quest[enum2i(QuestId::SERPENT)].status = QuestStatusType::TAKEN;
+    floor_ptr->quest_number = QuestId::NONE;
 }
 
 /*!
index c260545..548fcea 100644 (file)
@@ -53,8 +53,8 @@
  */
 static bool confirm_leave_level(PlayerType *player_ptr, bool down_stair)
 {
-    quest_type *q_ptr = &quest[player_ptr->current_floor_ptr->quest_number];
-    if (confirm_quest && player_ptr->current_floor_ptr->quest_number && (q_ptr->type == QuestKindType::RANDOM || (q_ptr->flags & QUEST_FLAG_ONCE && q_ptr->status != QuestStatusType::COMPLETED) || (q_ptr->flags & QUEST_FLAG_TOWER && ((q_ptr->status != QuestStatusType::STAGE_COMPLETED) || (down_stair && (quest[QUEST_TOWER1].status != QuestStatusType::COMPLETED)))))) {
+    quest_type *q_ptr = &quest[enum2i(player_ptr->current_floor_ptr->quest_number)];
+    if (confirm_quest && inside_quest(player_ptr->current_floor_ptr->quest_number) && (q_ptr->type == QuestKindType::RANDOM || (q_ptr->flags & QUEST_FLAG_ONCE && q_ptr->status != QuestStatusType::COMPLETED) || (q_ptr->flags & QUEST_FLAG_TOWER && ((q_ptr->status != QuestStatusType::STAGE_COMPLETED) || (down_stair && (quest[enum2i(QuestId::TOWER1)].status != QuestStatusType::COMPLETED)))))) {
         msg_print(_("この階を一度去ると二度と戻って来られません。", "You can't come back here once you leave this floor."));
         return get_check(_("本当にこの階を去りますか?", "Really leave this floor? "));
     }
@@ -90,17 +90,17 @@ void do_cmd_go_up(PlayerType *player_ptr)
         sound(SOUND_STAIRWAY);
 
         leave_quest_check(player_ptr);
-        player_ptr->current_floor_ptr->quest_number = g_ptr->special;
-        if (quest[player_ptr->current_floor_ptr->quest_number].status == QuestStatusType::UNTAKEN) {
-            if (quest[player_ptr->current_floor_ptr->quest_number].type != QuestKindType::RANDOM) {
+        player_ptr->current_floor_ptr->quest_number = i2enum<QuestId>(g_ptr->special);
+        if (quest[enum2i(player_ptr->current_floor_ptr->quest_number)].status == QuestStatusType::UNTAKEN) {
+            if (quest[enum2i(player_ptr->current_floor_ptr->quest_number)].type != QuestKindType::RANDOM) {
                 init_flags = INIT_ASSIGN;
                 parse_fixed_map(player_ptr, "q_info.txt", 0, 0, 0, 0);
             }
 
-            quest[player_ptr->current_floor_ptr->quest_number].status = QuestStatusType::TAKEN;
+            quest[enum2i(player_ptr->current_floor_ptr->quest_number)].status = QuestStatusType::TAKEN;
         }
 
-        if (!player_ptr->current_floor_ptr->quest_number) {
+        if (!inside_quest(player_ptr->current_floor_ptr->quest_number)) {
             player_ptr->current_floor_ptr->dun_level = 0;
             player_ptr->word_recall = 0;
         }
@@ -125,14 +125,14 @@ void do_cmd_go_up(PlayerType *player_ptr)
     if (autosave_l)
         do_cmd_save_game(player_ptr, true);
 
-    if (player_ptr->current_floor_ptr->quest_number && quest[player_ptr->current_floor_ptr->quest_number].type == QuestKindType::RANDOM) {
+    if (inside_quest(player_ptr->current_floor_ptr->quest_number) && quest[enum2i(player_ptr->current_floor_ptr->quest_number)].type == QuestKindType::RANDOM) {
         leave_quest_check(player_ptr);
-        player_ptr->current_floor_ptr->quest_number = 0;
+        player_ptr->current_floor_ptr->quest_number = QuestId::NONE;
     }
 
-    if (player_ptr->current_floor_ptr->quest_number && quest[player_ptr->current_floor_ptr->quest_number].type != QuestKindType::RANDOM) {
+    if (inside_quest(player_ptr->current_floor_ptr->quest_number) && quest[enum2i(player_ptr->current_floor_ptr->quest_number)].type != QuestKindType::RANDOM) {
         leave_quest_check(player_ptr);
-        player_ptr->current_floor_ptr->quest_number = g_ptr->special;
+        player_ptr->current_floor_ptr->quest_number = i2enum<QuestId>(g_ptr->special);
         player_ptr->current_floor_ptr->dun_level = 0;
         up_num = 0;
     } else {
@@ -207,17 +207,17 @@ void do_cmd_go_down(PlayerType *player_ptr)
 
         leave_quest_check(player_ptr);
         leave_tower_check(player_ptr);
-        player_ptr->current_floor_ptr->quest_number = g_ptr->special;
-        if (quest[player_ptr->current_floor_ptr->quest_number].status == QuestStatusType::UNTAKEN) {
-            if (quest[player_ptr->current_floor_ptr->quest_number].type != QuestKindType::RANDOM) {
+        player_ptr->current_floor_ptr->quest_number = i2enum<QuestId>(g_ptr->special);
+        if (quest[enum2i(player_ptr->current_floor_ptr->quest_number)].status == QuestStatusType::UNTAKEN) {
+            if (quest[enum2i(player_ptr->current_floor_ptr->quest_number)].type != QuestKindType::RANDOM) {
                 init_flags = INIT_ASSIGN;
                 parse_fixed_map(player_ptr, "q_info.txt", 0, 0, 0, 0);
             }
 
-            quest[player_ptr->current_floor_ptr->quest_number].status = QuestStatusType::TAKEN;
+            quest[enum2i(player_ptr->current_floor_ptr->quest_number)].status = QuestStatusType::TAKEN;
         }
 
-        if (!player_ptr->current_floor_ptr->quest_number) {
+        if (!inside_quest(player_ptr->current_floor_ptr->quest_number)) {
             player_ptr->current_floor_ptr->dun_level = 0;
             player_ptr->word_recall = 0;
         }
index a37f9a3..fd3c26d 100644 (file)
@@ -208,7 +208,7 @@ void do_cmd_feeling(PlayerType *player_ptr)
     if (player_ptr->wild_mode)
         return;
 
-    if (player_ptr->current_floor_ptr->quest_number && !random_quest_number(player_ptr, player_ptr->current_floor_ptr->dun_level)) {
+    if (inside_quest(player_ptr->current_floor_ptr->quest_number) && !inside_quest(random_quest_number(player_ptr, player_ptr->current_floor_ptr->dun_level))) {
         msg_print(_("典型的なクエストのダンジョンのようだ。", "Looks like a typical quest level."));
         return;
     }
index 7026355..fe6c1c9 100644 (file)
@@ -169,7 +169,7 @@ static void init_world_floor_info(PlayerType *player_ptr)
     w_ptr->character_dungeon = false;
     floor_type *floor_ptr = player_ptr->current_floor_ptr;
     floor_ptr->dun_level = 0;
-    floor_ptr->quest_number = 0;
+    floor_ptr->quest_number = QuestId::NONE;
     floor_ptr->inside_arena = false;
     player_ptr->phase_out = false;
     write_level = true;
@@ -222,7 +222,7 @@ static void reset_world_info(PlayerType *player_ptr)
 static void generate_wilderness(PlayerType *player_ptr)
 {
     floor_type *floor_ptr = player_ptr->current_floor_ptr;
-    if ((floor_ptr->dun_level == 0) && floor_ptr->quest_number)
+    if ((floor_ptr->dun_level == 0) && inside_quest(floor_ptr->quest_number))
         return;
 
     parse_fixed_map(player_ptr, "w_info.txt", 0, 0, w_ptr->max_wild_y, w_ptr->max_wild_x);
index 89fb6df..be2d8c5 100644 (file)
@@ -39,6 +39,7 @@
 #include "system/monster-race-definition.h"
 #include "system/player-type-definition.h"
 #include "target/target-checker.h"
+#include "util/bit-flags-calculator.h"
 #include "view/display-messages.h"
 #include "world/world-turn-processor.h"
 #include "world/world.h"
@@ -77,15 +78,15 @@ void process_dungeon(PlayerType *player_ptr, bool load_game)
 
     disturb(player_ptr, true, true);
     auto quest_num = quest_number(player_ptr, floor_ptr->dun_level);
-    if (quest_num > 0) {
-        r_info[quest[quest_num].r_idx].flags1 |= RF1_QUESTOR;
+    if (inside_quest(quest_num)) {
+        r_info[quest[enum2i(quest_num)].r_idx].flags1 |= RF1_QUESTOR;
     }
 
     if (player_ptr->max_plv < player_ptr->lev) {
         player_ptr->max_plv = player_ptr->lev;
     }
 
-    if ((max_dlv[player_ptr->dungeon_idx] < floor_ptr->dun_level) && !floor_ptr->quest_number) {
+    if ((max_dlv[player_ptr->dungeon_idx] < floor_ptr->dun_level) && !inside_quest(floor_ptr->quest_number)) {
         max_dlv[player_ptr->dungeon_idx] = floor_ptr->dun_level;
         if (record_maxdepth)
             exe_write_diary(player_ptr, DIARY_MAXDEAPTH, floor_ptr->dun_level, nullptr);
@@ -108,8 +109,8 @@ void process_dungeon(PlayerType *player_ptr, bool load_game)
     handle_stuff(player_ptr);
     term_fresh();
 
-    if ((quest_num > 0)
-        && (quest_type::is_fixed(quest_num) && !((quest_num == QUEST_OBERON) || (quest_num == QUEST_SERPENT) || !(quest[quest_num].flags & QUEST_FLAG_PRESET))))
+    if (inside_quest(quest_num) 
+        && (quest_type::is_fixed(quest_num) && !((quest_num == QuestId::OBERON) || (quest_num == QuestId::SERPENT) || !(quest[enum2i(quest_num)].flags & QUEST_FLAG_PRESET))))
         do_cmd_feeling(player_ptr);
 
     if (player_ptr->phase_out) {
@@ -128,7 +129,7 @@ void process_dungeon(PlayerType *player_ptr, bool load_game)
     if (!player_ptr->playing || player_ptr->is_dead)
         return;
 
-    if (!floor_ptr->quest_number && (player_ptr->dungeon_idx == DUNGEON_ANGBAND)) {
+    if (!inside_quest(floor_ptr->quest_number) && (player_ptr->dungeon_idx == DUNGEON_ANGBAND)) {
         quest_discovery(random_quest_number(player_ptr, floor_ptr->dun_level));
         floor_ptr->quest_number = random_quest_number(player_ptr, floor_ptr->dun_level);
     }
@@ -217,8 +218,8 @@ void process_dungeon(PlayerType *player_ptr, bool load_game)
             wild_regen--;
     }
 
-    if ((quest_num > 0) && !(r_info[quest[quest_num].r_idx].flags1 & RF1_UNIQUE)) {
-        r_info[quest[quest_num].r_idx].flags1 &= ~RF1_QUESTOR;
+    if ((inside_quest(quest_num)) && none_bits(r_info[quest[enum2i(quest_num)].r_idx].flags1, RF1_UNIQUE)) {
+        r_info[quest[enum2i(quest_num)].r_idx].flags1 &= ~RF1_QUESTOR;
     }
 
     if (player_ptr->playing && !player_ptr->is_dead) {
index a06267d..adeced5 100644 (file)
@@ -38,8 +38,8 @@ void QuestCompletionChecker::complete()
     this->set_quest_idx();
     auto create_stairs = false;
     auto reward = false;
-    if ((this->quest_idx > 0) && (quest[this->quest_idx].status == QuestStatusType::TAKEN)) {
-        this->q_ptr = &quest[this->quest_idx];
+    if (inside_quest(this->quest_idx) && (quest[enum2i(this->quest_idx)].status == QuestStatusType::TAKEN)) {
+        this->q_ptr = &quest[enum2i(this->quest_idx)];
         auto [tmp_create_stairs, tmp_reward] = this->switch_completion();
         create_stairs = tmp_create_stairs;
         reward = tmp_reward;
@@ -57,7 +57,7 @@ void QuestCompletionChecker::set_quest_idx()
 {
     auto *floor_ptr = this->player_ptr->current_floor_ptr;
     this->quest_idx = floor_ptr->quest_number;
-    if (this->quest_idx > 0) {
+    if (inside_quest(this->quest_idx)) {
         return;
     }
 
@@ -93,7 +93,7 @@ void QuestCompletionChecker::set_quest_idx()
         }
     }
 
-    this->quest_idx = i;
+    this->quest_idx = i2enum<QuestId>(i);
 }
 
 std::tuple<bool, bool> QuestCompletionChecker::switch_completion()
@@ -156,10 +156,10 @@ std::tuple<bool, bool> QuestCompletionChecker::complete_random()
     auto create_stairs = false;
     if (none_bits(this->q_ptr->flags, QUEST_FLAG_PRESET)) {
         create_stairs = true;
-        this->player_ptr->current_floor_ptr->quest_number = 0;
+        this->player_ptr->current_floor_ptr->quest_number = QuestId::NONE;
     }
 
-    if ((this->quest_idx == QUEST_OBERON) || (this->quest_idx == QUEST_SERPENT)) {
+    if ((this->quest_idx == QuestId::OBERON) || (this->quest_idx == QuestId::SERPENT)) {
         this->q_ptr->status = QuestStatusType::FINISHED;
     }
 
@@ -192,11 +192,11 @@ void QuestCompletionChecker::complete_tower()
     }
 
     this->q_ptr->status = QuestStatusType::STAGE_COMPLETED;
-    auto is_tower_completed = quest[QUEST_TOWER1].status == QuestStatusType::STAGE_COMPLETED;
-    is_tower_completed &= quest[QUEST_TOWER2].status == QuestStatusType::STAGE_COMPLETED;
-    is_tower_completed &= quest[QUEST_TOWER3].status == QuestStatusType::STAGE_COMPLETED;
+    auto is_tower_completed = quest[enum2i(QuestId::TOWER1)].status == QuestStatusType::STAGE_COMPLETED;
+    is_tower_completed &= quest[enum2i(QuestId::TOWER2)].status == QuestStatusType::STAGE_COMPLETED;
+    is_tower_completed &= quest[enum2i(QuestId::TOWER3)].status == QuestStatusType::STAGE_COMPLETED;
     if (is_tower_completed) {
-        complete_quest(this->player_ptr, QUEST_TOWER1);
+        complete_quest(this->player_ptr, QuestId::TOWER1);
     }
 }
 
index f05a1c0..16e0165 100644 (file)
@@ -1,5 +1,6 @@
 #pragma once
 
+#include "dungeon/quest.h"
 #include "system/angband.h"
 #include "util/point-2d.h"
 #include <tuple>
@@ -18,7 +19,7 @@ public:
 private:
     PlayerType *player_ptr;
     monster_type *m_ptr;
-    short quest_idx;
+    QuestId quest_idx;
     quest_type *q_ptr = nullptr;
 
     void set_quest_idx();
index b3b12d0..ad85609 100644 (file)
 #include "world/world.h"
 
 std::vector<quest_type> quest; /*!< Quest info */
-QUEST_IDX max_q_idx; /*!< Maximum number of quests */
+int16_t max_q_idx; /*!< Maximum number of quests */
 char quest_text[10][80]; /*!< Quest text */
 int quest_text_line; /*!< Current line of the quest text */
-int leaving_quest = 0;
+QuestId leaving_quest = QuestId::NONE;
 
 /*!
  * @brief クエスト突入時のメッセージテーブル / Array of places to find an inscription
@@ -58,9 +58,9 @@ static concptr find_quest[] = {
  * @param quest_idx クエストID
  * @return 固定クエストならばTRUEを返す
  */
-bool quest_type::is_fixed(short quest_idx)
+bool quest_type::is_fixed(QuestId quest_idx)
 {
-    return ((quest_idx) < MIN_RANDOM_QUEST) || ((quest_idx) > MAX_RANDOM_QUEST);
+    return (enum2i(quest_idx) < MIN_RANDOM_QUEST) || (enum2i(quest_idx) > MAX_RANDOM_QUEST);
 }
 
 /*!
@@ -128,18 +128,18 @@ void record_quest_final_status(quest_type *q_ptr, PLAYER_LEVEL lev, QuestStatusT
  * @param player_ptr プレイヤーへの参照ポインタ
  * @param quest_num 達成状態にしたいクエストのID
  */
-void complete_quest(PlayerType *player_ptr, QUEST_IDX quest_num)
+void complete_quest(PlayerType *player_ptr, QuestId quest_num)
 {
-    quest_type *const q_ptr = &quest[quest_num];
+    quest_type *const q_ptr = &quest[enum2i(quest_num)];
 
     switch (q_ptr->type) {
     case QuestKindType::RANDOM:
         if (record_rand_quest)
-            exe_write_diary(player_ptr, DIARY_RAND_QUEST_C, quest_num, nullptr);
+            exe_write_diary(player_ptr, DIARY_RAND_QUEST_C, enum2i(quest_num), nullptr);
         break;
     default:
         if (record_fix_quest)
-            exe_write_diary(player_ptr, DIARY_FIX_QUEST_C, quest_num, nullptr);
+            exe_write_diary(player_ptr, DIARY_FIX_QUEST_C, enum2i(quest_num), nullptr);
         break;
     }
 
@@ -162,9 +162,9 @@ void complete_quest(PlayerType *player_ptr, QUEST_IDX quest_num)
 void check_find_art_quest_completion(PlayerType *player_ptr, ObjectType *o_ptr)
 {
     /* Check if completed a quest */
-    for (QUEST_IDX i = 0; i < max_q_idx; i++) {
+    for (int16_t i = 0; i < max_q_idx; i++) {
         if ((quest[i].type == QuestKindType::FIND_ARTIFACT) && (quest[i].status == QuestStatusType::TAKEN) && (quest[i].k_idx == o_ptr->name1)) {
-            complete_quest(player_ptr, i);
+            complete_quest(player_ptr, i2enum<QuestId>(i));
         }
     }
 }
@@ -173,13 +173,13 @@ void check_find_art_quest_completion(PlayerType *player_ptr, ObjectType *o_ptr)
  * @brief クエストの導入メッセージを表示する / Discover quest
  * @param q_idx 開始されたクエストのID
  */
-void quest_discovery(QUEST_IDX q_idx)
+void quest_discovery(QuestId q_idx)
 {
-    quest_type *q_ptr = &quest[q_idx];
+    quest_type *q_ptr = &quest[enum2i(q_idx)];
     monster_race *r_ptr = &r_info[q_ptr->r_idx];
     MONSTER_NUMBER q_num = q_ptr->max_num;
 
-    if (!q_idx)
+    if (!inside_quest(q_idx))
         return;
 
     GAME_TEXT name[MAX_NLEN];
@@ -215,18 +215,18 @@ void quest_discovery(QUEST_IDX q_idx)
  * @param level 検索対象になる階
  * @return クエストIDを返す。該当がない場合0を返す。
  */
-QUEST_IDX quest_number(PlayerType *player_ptr, DEPTH level)
+QuestId quest_number(PlayerType *player_ptr, DEPTH level)
 {
     floor_type *floor_ptr = player_ptr->current_floor_ptr;
-    if (floor_ptr->quest_number)
+    if (inside_quest(floor_ptr->quest_number))
         return (floor_ptr->quest_number);
 
-    for (QUEST_IDX i = 0; i < max_q_idx; i++) {
+    for (int16_t i = 0; i < max_q_idx; i++) {
         if (quest[i].status != QuestStatusType::TAKEN)
             continue;
 
         if ((quest[i].type == QuestKindType::KILL_LEVEL) && !(quest[i].flags & QUEST_FLAG_PRESET) && (quest[i].level == level) && (quest[i].dungeon == player_ptr->dungeon_idx))
-            return i;
+            return i2enum<QuestId>(i);
     }
 
     return random_quest_number(player_ptr, level);
@@ -238,18 +238,18 @@ QUEST_IDX quest_number(PlayerType *player_ptr, DEPTH level)
  * @param level 検索対象になる階
  * @return クエストIDを返す。該当がない場合0を返す。
  */
-QUEST_IDX random_quest_number(PlayerType *player_ptr, DEPTH level)
+QuestId random_quest_number(PlayerType *player_ptr, DEPTH level)
 {
     if (player_ptr->dungeon_idx != DUNGEON_ANGBAND)
-        return 0;
+        return QuestId::NONE;
 
-    for (QUEST_IDX i = MIN_RANDOM_QUEST; i < MAX_RANDOM_QUEST + 1; i++) {
+    for (int16_t i = MIN_RANDOM_QUEST; i < MAX_RANDOM_QUEST + 1; i++) {
         if ((quest[i].type == QuestKindType::RANDOM) && (quest[i].status == QuestStatusType::TAKEN) && (quest[i].level == level) && (quest[i].dungeon == DUNGEON_ANGBAND)) {
-            return i;
+            return i2enum<QuestId>(i);
         }
     }
 
-    return 0;
+    return QuestId::NONE;
 }
 
 /*!
@@ -259,10 +259,10 @@ QUEST_IDX random_quest_number(PlayerType *player_ptr, DEPTH level)
 void leave_quest_check(PlayerType *player_ptr)
 {
     leaving_quest = player_ptr->current_floor_ptr->quest_number;
-    if (!leaving_quest)
+    if (!inside_quest(leaving_quest))
         return;
 
-    quest_type *const q_ptr = &quest[leaving_quest];
+    quest_type *const q_ptr = &quest[enum2i<QuestId>(leaving_quest)];
     bool is_one_time_quest = ((q_ptr->flags & QUEST_FLAG_ONCE) || (q_ptr->type == QuestKindType::RANDOM)) && (q_ptr->status == QuestStatusType::TAKEN);
     if (!is_one_time_quest)
         return;
@@ -272,8 +272,8 @@ void leave_quest_check(PlayerType *player_ptr)
     /* Additional settings */
     switch (q_ptr->type) {
     case QuestKindType::TOWER:
-        quest[QUEST_TOWER1].status = QuestStatusType::FAILED;
-        quest[QUEST_TOWER1].complev = player_ptr->lev;
+        quest[enum2i(QuestId::TOWER1)].status = QuestStatusType::FAILED;
+        quest[enum2i(QuestId::TOWER1)].complev = player_ptr->lev;
         break;
     case QuestKindType::FIND_ARTIFACT:
         a_info[q_ptr->k_idx].gen_flags.reset(ItemGenerationTraitType::QUESTITEM);
@@ -289,12 +289,12 @@ void leave_quest_check(PlayerType *player_ptr)
     /* Record finishing a quest */
     if (q_ptr->type == QuestKindType::RANDOM) {
         if (record_rand_quest)
-            exe_write_diary(player_ptr, DIARY_RAND_QUEST_F, leaving_quest, nullptr);
+            exe_write_diary(player_ptr, DIARY_RAND_QUEST_F, enum2i<QuestId>(leaving_quest), nullptr);
         return;
     }
 
     if (record_fix_quest)
-        exe_write_diary(player_ptr, DIARY_FIX_QUEST_F, leaving_quest, nullptr);
+        exe_write_diary(player_ptr, DIARY_FIX_QUEST_F, enum2i<QuestId>(leaving_quest), nullptr);
 }
 
 /*!
@@ -303,26 +303,26 @@ void leave_quest_check(PlayerType *player_ptr)
 void leave_tower_check(PlayerType *player_ptr)
 {
     leaving_quest = player_ptr->current_floor_ptr->quest_number;
-    bool is_leaving_from_tower = leaving_quest != 0;
-    is_leaving_from_tower &= quest[leaving_quest].type == QuestKindType::TOWER;
-    is_leaving_from_tower &= quest[QUEST_TOWER1].status != QuestStatusType::COMPLETED;
+    bool is_leaving_from_tower = inside_quest(leaving_quest);
+    is_leaving_from_tower &= quest[enum2i<QuestId>(leaving_quest)].type == QuestKindType::TOWER;
+    is_leaving_from_tower &= quest[enum2i(QuestId::TOWER1)].status != QuestStatusType::COMPLETED;
     if (!is_leaving_from_tower)
         return;
-    if (quest[leaving_quest].type != QuestKindType::TOWER)
+    if (quest[enum2i<QuestId>(leaving_quest)].type != QuestKindType::TOWER)
         return;
 
-    quest[QUEST_TOWER1].status = QuestStatusType::FAILED;
-    quest[QUEST_TOWER1].complev = player_ptr->lev;
+    quest[enum2i(QuestId::TOWER1)].status = QuestStatusType::FAILED;
+    quest[enum2i(QuestId::TOWER1)].complev = player_ptr->lev;
     update_playtime();
-    quest[QUEST_TOWER1].comptime = w_ptr->play_time;
+    quest[enum2i(QuestId::TOWER1)].comptime = w_ptr->play_time;
 }
 
 /*!
  * @brief Player enters a new quest
  */
-void exe_enter_quest(PlayerType *player_ptr, QUEST_IDX quest_idx)
+void exe_enter_quest(PlayerType *player_ptr, QuestId quest_idx)
 {
-    if (quest[quest_idx].type != QuestKindType::RANDOM)
+    if (quest[enum2i<QuestId>(quest_idx)].type != QuestKindType::RANDOM)
         player_ptr->current_floor_ptr->dun_level = 1;
     player_ptr->current_floor_ptr->quest_number = quest_idx;
 
@@ -357,7 +357,7 @@ void do_cmd_quest(PlayerType *player_ptr)
     player_ptr->oldpx = 0;
     leave_quest_check(player_ptr);
 
-    exe_enter_quest(player_ptr, player_ptr->current_floor_ptr->grid_array[player_ptr->y][player_ptr->x].special);
+    exe_enter_quest(player_ptr, i2enum<QuestId>(player_ptr->current_floor_ptr->grid_array[player_ptr->y][player_ptr->x].special));
 }
 
 bool inside_quest(QuestId id)
index 8c9b057..1c4e41a 100644 (file)
@@ -2,6 +2,7 @@
 
 #include "system/angband.h"
 
+#include "util/enum-converter.h"
 #include <vector>
 
 // clang-format off
 /*
  * Quest constants
  */
-constexpr short MIN_RANDOM_QUEST = 40; /*<! ランダムクエストを割り当てるクエストIDの開始値 */
-constexpr short MAX_RANDOM_QUEST = 49; /*<! ランダムクエストを割り当てるクエストIDの終了値 */
-constexpr short QUEST_TOWER1     = 5;  /*<! 塔クエスト(第1階層)に割り振るクエストID */
-constexpr short QUEST_TOWER2     = 6;  /*<! 塔クエスト(第2階層)に割り振るクエストID */
-constexpr short QUEST_TOWER3     = 7;  /*<! 塔クエスト(第3階層)に割り振るクエストID */
-constexpr short QUEST_OBERON     = 8;  /*<! オベロン打倒クエストに割り振るクエストID */
-constexpr short QUEST_SERPENT    = 9;  /*<! サーペント打倒クエストに割り振るクエストID */
+enum class QuestId : int16_t{
+       NONE = 0, /* クエストなし */
+       THIEF = 1, /*<! 盗賊の隠れ家 */
+       SEWER = 2, /*<! 下水道 */
+       LOGURUS = 3, /*<! ログルス使い */
+       VAULT = 4, /*<! 宝物庫 */
+       TOWER1 = 5, /*<! 塔クエスト(第1階層)に割り振るクエストID */
+       TOWER2 = 6, /*<! 塔クエスト(第2階層)に割り振るクエストID */
+       TOWER3 = 7, /*<! 塔クエスト(第3階層)に割り振るクエストID */
+       OBERON = 8, /*<! オベロン打倒クエストに割り振るクエストID */
+       SERPENT = 9, /*<! サーペント打倒クエストに割り振るクエストID */
+       SORCERER = 10, /*<! 仙術エネルギー特異点 */
+       CHAOS = 11, /*<! カオスの特異点 */
+       NATURE = 12, /*<! 自然魔術の特異点 */
+       WARG = 14, /*<! ワーグを殲滅せよ */
+       ERIC = 15, /*<! エリックの要塞 */
+       MONSALVAT = 16, /*<! モンサルヴァト城への侵攻 */
+       CITY_SEA = 17, /*<! 海底都市(現在は没) */
+       WATER_CAVE = 18, /*<! 湖の洞窟 */
+       DOOM_1 = 19, /*<! 破滅のクエスト1 */
+       VAPOR = 20, /*<! 謎の瘴気 */
+       DOOM_2 = 21, /*<! 破滅のクエスト2 */
+       ORC_CAMP = 22, /*<! オークのキャンプ */
+       SPAWNING = 23, /*<! 増殖地獄 */
+       MS = 24, /*<! マイクロンフトの興亡 */
+       HAUNTED_HOUCE = 25, /*<! 幽霊屋敷 */
+       KILLING_FIELDS = 26, /*<! 激戦場 */
+       OLD_CASTLE = 27, /*<! 古い城 */
+       ROYAL_CRYPT = 28, /*<! 王家の墓 */
+       MIMIC = 29, /*<! ミミックの財宝 */
+       TENGU = 30, /*<! テングとデスソード */
+       WILLOW = 31, /*<! 柳じじい */
+       DARK_ELF = 32, /*<! ダークエルフの王 */
+       CLONE = 33, /*<! クローン地獄 */
+       DUMP_WITNESS = 34, /*<! もの言えぬ証人 */
+       RANDOM_QUEST1 = 40, /*<! ランダムクエストを割り当てるクエストIDの開始値 */
+       RANDOM_QUEST2 = 41,
+       RANDOM_QUEST3 = 42,
+       RANDOM_QUEST4 = 43,
+       RANDOM_QUEST5 = 44,
+       RANDOM_QUEST6 = 45,
+       RANDOM_QUEST7 = 46,
+       RANDOM_QUEST8 = 47,
+       RANDOM_QUEST9 = 48,
+       RANDOM_QUEST10 = 49, /*<! ランダムクエストを割り当てるクエストIDの終了値 */
+};
+
+constexpr auto MIN_RANDOM_QUEST = enum2i(QuestId::RANDOM_QUEST1);
+constexpr auto MAX_RANDOM_QUEST = enum2i(QuestId::RANDOM_QUEST10);
 
 constexpr uint QUEST_FLAG_SILENT = 0x01; /*!< クエストフラグ: クエスト進行に関する情報表示を抑止する / no messages from completion */
 constexpr uint QUEST_FLAG_PRESET = 0x02; /*!< クエストフラグ: クエストがダンジョン外で発生する / quest is outside the main dungeon */
@@ -74,26 +117,26 @@ public:
     PLAYER_LEVEL complev; /*!< クリア時プレイヤーレベル / player level (complete) */
     REAL_TIME comptime; /*!< クリア時ゲーム時間 /  quest clear time*/
 
-    static bool is_fixed(short quest_idx);
+    static bool is_fixed(QuestId quest_idx);
 };
 
 extern std::vector<quest_type> quest;
-extern QUEST_IDX max_q_idx;
+extern int16_t max_q_idx;
 extern char quest_text[10][80];
 extern int quest_text_line;
-extern int leaving_quest;
+extern QuestId leaving_quest;
 
 class ObjectType;
 class PlayerType;
 void determine_random_questor(PlayerType *player_ptr, quest_type *q_ptr);
 void record_quest_final_status(quest_type *q_ptr, PLAYER_LEVEL lev, QuestStatusType stat);
-void complete_quest(PlayerType *player_ptr, QUEST_IDX quest_num);
+void complete_quest(PlayerType *player_ptr, QuestId quest_num);
 void check_find_art_quest_completion(PlayerType *player_ptr, ObjectType *o_ptr);
-void quest_discovery(QUEST_IDX q_idx);
-QUEST_IDX quest_number(PlayerType *player_ptr, DEPTH level);
-QUEST_IDX random_quest_number(PlayerType *player_ptr, DEPTH level);
+void quest_discovery(QuestId q_idx);
+QuestId quest_number(PlayerType *player_ptr, DEPTH level);
+QuestId random_quest_number(PlayerType *player_ptr, DEPTH level);
 void leave_quest_check(PlayerType *player_ptr);
 void leave_tower_check(PlayerType *player_ptr);
-void exe_enter_quest(PlayerType *player_ptr, QUEST_IDX quest_idx);
+void exe_enter_quest(PlayerType *player_ptr, QuestId quest_idx);
 void do_cmd_quest(PlayerType *player_ptr);
 bool inside_quest(QuestId id);
index 7ec625a..f2329ca 100644 (file)
@@ -401,7 +401,7 @@ static void effect_monster_captured(PlayerType *player_ptr, effect_monster_type
 process_result effect_monster_capture(PlayerType *player_ptr, effect_monster_type *em_ptr)
 {
     floor_type *floor_ptr = player_ptr->current_floor_ptr;
-    if ((floor_ptr->quest_number && (quest[floor_ptr->inside_quest].type == QuestKindType::KILL_ALL) && !is_pet(em_ptr->m_ptr)) || any_bits(em_ptr->r_ptr->flags1, RF1_UNIQUE | RF1_QUESTOR) || any_bits(em_ptr->r_ptr->flags7, RF7_NAZGUL | RF7_UNIQUE2) || em_ptr->m_ptr->parent_m_idx) {
+    if ((inside_quest(floor_ptr->quest_number) && (quest[enum2i(floor_ptr->quest_number)].type == QuestKindType::KILL_ALL) && !is_pet(em_ptr->m_ptr)) || any_bits(em_ptr->r_ptr->flags1, RF1_UNIQUE | RF1_QUESTOR) || any_bits(em_ptr->r_ptr->flags7, RF7_NAZGUL | RF7_UNIQUE2) || em_ptr->m_ptr->parent_m_idx) {
         msg_format(_("%sには効果がなかった。", "%s is unaffected."), em_ptr->m_name);
         em_ptr->skipped = true;
         return PROCESS_CONTINUE;
index 40d42db..7136fe8 100644 (file)
@@ -335,7 +335,7 @@ static bool parse_qtw_P(PlayerType *player_ptr, qtwg_type *qtwg_ptr, char **zz)
     floor_ptr->width = panels_x * SCREEN_WID;
     panel_row_min = floor_ptr->height;
     panel_col_min = floor_ptr->width;
-    if (floor_ptr->quest_number) {
+    if (inside_quest(floor_ptr->quest_number)) {
         POSITION py = atoi(zz[0]);
         POSITION px = atoi(zz[1]);
         player_ptr->y = py;
@@ -363,7 +363,7 @@ static bool parse_qtw_M(qtwg_type *qtwg_ptr, char **zz)
     if (zz[0][0] == 'T') {
         max_towns = static_cast<int16_t>(atoi(zz[1]));
     } else if (zz[0][0] == 'Q') {
-        max_q_idx = (QUEST_IDX)atoi(zz[1]);
+        max_q_idx = (int16_t)atoi(zz[1]);
     } else if (zz[0][0] == 'O') {
         w_ptr->max_o_idx = (OBJECT_IDX)atoi(zz[1]);
     } else if (zz[0][0] == 'M') {
index 0befeef..e2d5387 100644 (file)
@@ -315,7 +315,7 @@ static void update_new_floor_feature(PlayerType *player_ptr, saved_floor_type *s
         return;
 
     grid_type *g_ptr = &player_ptr->current_floor_ptr->grid_array[player_ptr->y][player_ptr->x];
-    if ((player_ptr->change_floor_mode & CFM_UP) && !quest_number(player_ptr, player_ptr->current_floor_ptr->dun_level))
+    if ((player_ptr->change_floor_mode & CFM_UP) && !inside_quest(quest_number(player_ptr, player_ptr->current_floor_ptr->dun_level)))
         g_ptr->feat = (player_ptr->change_floor_mode & CFM_SHAFT) ? feat_state(player_ptr->current_floor_ptr, feat_down_stair, FloorFeatureType::SHAFT) : feat_down_stair;
     else if ((player_ptr->change_floor_mode & CFM_DOWN) && !ironman_downward)
         g_ptr->feat = (player_ptr->change_floor_mode & CFM_SHAFT) ? feat_state(player_ptr->current_floor_ptr, feat_up_stair, FloorFeatureType::SHAFT) : feat_up_stair;
index 22633a7..00a3a07 100644 (file)
@@ -242,8 +242,8 @@ void update_dungeon_feeling(PlayerType *player_ptr)
         return;
 
     auto quest_num = quest_number(player_ptr, floor_ptr->dun_level);
-    if ((quest_num > 0)
-        && (quest_type::is_fixed(quest_num) && !((quest_num == QUEST_OBERON) || (quest_num == QUEST_SERPENT) || !(quest[quest_num].flags & QUEST_FLAG_PRESET))))
+    if (inside_quest(quest_num)
+        && (quest_type::is_fixed(quest_num) && !((quest_num == QuestId::OBERON) || (quest_num == QuestId::SERPENT) || !(quest[enum2i(quest_num)].flags & QUEST_FLAG_PRESET))))
         return;
 
     byte new_feeling = get_dungeon_feeling(player_ptr);
index 4efe104..c044d1a 100644 (file)
@@ -246,12 +246,12 @@ static void generate_fixed_floor(PlayerType *player_ptr)
         for (POSITION x = 0; x < floor_ptr->width; x++)
             place_bold(player_ptr, y, x, GB_SOLID_PERM);
 
-    floor_ptr->base_level = quest[floor_ptr->quest_number].level;
+    floor_ptr->base_level = quest[enum2i(floor_ptr->quest_number)].level;
     floor_ptr->dun_level = floor_ptr->base_level;
     floor_ptr->object_level = floor_ptr->base_level;
     floor_ptr->monster_level = floor_ptr->base_level;
     if (record_stair)
-        exe_write_diary(player_ptr, DIARY_TO_QUEST, floor_ptr->quest_number, nullptr);
+        exe_write_diary(player_ptr, DIARY_TO_QUEST, enum2i(floor_ptr->quest_number), nullptr);
 
     get_mon_num_prep(player_ptr, get_monster_hook(player_ptr), nullptr);
     init_flags = INIT_CREATE_DUNGEON;
@@ -467,7 +467,7 @@ void generate_floor(PlayerType *player_ptr)
             generate_challenge_arena(player_ptr);
         else if (player_ptr->phase_out)
             generate_gambling_arena(player_ptr);
-        else if (floor_ptr->quest_number)
+        else if (inside_quest(floor_ptr->quest_number))
             generate_fixed_floor(player_ptr);
         else if (!floor_ptr->dun_level)
             if (player_ptr->wild_mode)
@@ -489,7 +489,7 @@ void generate_floor(PlayerType *player_ptr)
         // 狂戦士でのプレイに支障をきたしうるので再生成する。
         // 地上、荒野マップ、クエストでは連結性判定は行わない。
         // TODO: 本来はダンジョン生成アルゴリズム自身で連結性を保証するのが理想ではある。
-        const bool check_conn = okay && floor_ptr->dun_level > 0 && floor_ptr->quest_number == 0;
+        const bool check_conn = okay && floor_ptr->dun_level > 0 && !inside_quest(floor_ptr->quest_number);
         if (check_conn && !floor_is_connected(floor_ptr, is_permanent_blocker)) {
             // 一定回数試しても連結にならないなら諦める。
             if (num >= 1000) {
index 11c380c..4630b1b 100644 (file)
@@ -27,9 +27,9 @@
 #include "monster/monster-info.h"
 #include "monster/monster-status.h"
 #include "pet/pet-util.h"
+#include "player-status/player-energy.h"
 #include "player/player-status.h"
 #include "player/special-defense-types.h"
-#include "player-status/player-energy.h"
 #include "save/floor-writer.h"
 #include "system/artifact-type-definition.h"
 #include "system/floor-type-definition.h"
@@ -155,7 +155,7 @@ static void locate_connected_stairs(PlayerType *player_ptr, floor_type *floor_pt
             feature_type *f_ptr = &f_info[g_ptr->feat];
             bool ok = false;
             if (floor_mode & CFM_UP) {
-                if (f_ptr->flags.has_all_of({FloorFeatureType::LESS, FloorFeatureType::STAIRS}) && f_ptr->flags.has_not(FloorFeatureType::SPECIAL)) {
+                if (f_ptr->flags.has_all_of({ FloorFeatureType::LESS, FloorFeatureType::STAIRS }) && f_ptr->flags.has_not(FloorFeatureType::SPECIAL)) {
                     ok = true;
                     if (g_ptr->special && g_ptr->special == sf_ptr->upper_floor_id) {
                         sx = x;
@@ -163,7 +163,7 @@ static void locate_connected_stairs(PlayerType *player_ptr, floor_type *floor_pt
                     }
                 }
             } else if (floor_mode & CFM_DOWN) {
-                if (f_ptr->flags.has_all_of({FloorFeatureType::MORE, FloorFeatureType::STAIRS}) && f_ptr->flags.has_not(FloorFeatureType::SPECIAL)) {
+                if (f_ptr->flags.has_all_of({ FloorFeatureType::MORE, FloorFeatureType::STAIRS }) && f_ptr->flags.has_not(FloorFeatureType::SPECIAL)) {
                     ok = true;
                     if (g_ptr->special && g_ptr->special == sf_ptr->lower_floor_id) {
                         sx = x;
@@ -228,8 +228,8 @@ static void get_out_monster(PlayerType *player_ptr)
         if (tries > 20 * dis * dis)
             dis++;
 
-        if (!in_bounds(floor_ptr, ny, nx) || !is_cave_empty_bold(player_ptr, ny, nx) || floor_ptr->grid_array[ny][nx].is_rune_protection()
-            || floor_ptr->grid_array[ny][nx].is_rune_explosion() || pattern_tile(floor_ptr, ny, nx))
+        if (!in_bounds(floor_ptr, ny, nx) || !is_cave_empty_bold(player_ptr, ny, nx)
+            || floor_ptr->grid_array[ny][nx].is_rune_protection() || floor_ptr->grid_array[ny][nx].is_rune_explosion() || pattern_tile(floor_ptr, ny, nx))
             continue;
 
         m_ptr = &floor_ptr->m_list[m_idx];
@@ -285,11 +285,11 @@ static void set_grid_by_leaving_floor(PlayerType *player_ptr, grid_type **g_ptr)
         return;
 
     *g_ptr = &player_ptr->current_floor_ptr->grid_array[player_ptr->y][player_ptr->x];
-    feature_type *f_ptr =  &f_info[(*g_ptr)->feat];
+    feature_type *f_ptr = &f_info[(*g_ptr)->feat];
     if ((*g_ptr)->special && f_ptr->flags.has_not(FloorFeatureType::SPECIAL) && get_sf_ptr((*g_ptr)->special))
         new_floor_id = (*g_ptr)->special;
 
-    if (f_ptr->flags.has_all_of({FloorFeatureType::STAIRS, FloorFeatureType::SHAFT}))
+    if (f_ptr->flags.has_all_of({ FloorFeatureType::STAIRS, FloorFeatureType::SHAFT }))
         prepare_change_floor_mode(player_ptr, CFM_SHAFT);
 }
 
@@ -349,7 +349,6 @@ static void kill_saved_floors(PlayerType *player_ptr, saved_floor_type *sf_ptr)
         latest_visit_mark = 1;
         return;
     }
-    
     if (player_ptr->change_floor_mode & CFM_NO_RETURN)
         kill_saved_floor(player_ptr, sf_ptr);
 }
@@ -441,7 +440,7 @@ void jump_floor(PlayerType *player_ptr, DUNGEON_IDX dun_idx, DEPTH depth)
     if (record_stair)
         exe_write_diary(player_ptr, DIARY_WIZ_TELE, 0, nullptr);
 
-    player_ptr->current_floor_ptr->quest_number = 0;
+    player_ptr->current_floor_ptr->quest_number = QuestId::NONE;
     PlayerEnergy(player_ptr).reset_player_turn();
     player_ptr->energy_need = 0;
     prepare_change_floor_mode(player_ptr, CFM_FIRST_FLOOR);
index c21171e..d679c3c 100644 (file)
@@ -183,7 +183,7 @@ void scatter(PlayerType *player_ptr, POSITION *yp, POSITION *xp, POSITION y, POS
 concptr map_name(PlayerType *player_ptr)
 {
     floor_type *floor_ptr = player_ptr->current_floor_ptr;
-    if (floor_ptr->quest_number && quest_type::is_fixed(floor_ptr->quest_number) && (quest[floor_ptr->quest_number].flags & QUEST_FLAG_PRESET))
+    if (inside_quest(floor_ptr->quest_number) && quest_type::is_fixed(floor_ptr->quest_number) && (quest[enum2i(floor_ptr->quest_number)].flags & QUEST_FLAG_PRESET))
         return _("クエスト", "Quest");
     else if (player_ptr->wild_mode)
         return _("地上", "Surface");
index fd68576..2a95d22 100644 (file)
@@ -84,9 +84,9 @@ bool alloc_stairs(PlayerType *player_ptr, FEAT_IDX feat, int num, int walls)
         if (floor_ptr->dun_level > d_info[floor_ptr->dungeon_idx].mindepth)
             shaft_num = (randint1(num + 1)) / 2;
     } else if (f_ptr->flags.has(FloorFeatureType::MORE)) {
-        QUEST_IDX q_idx = quest_number(player_ptr, floor_ptr->dun_level);
-        if (floor_ptr->dun_level > 1 && q_idx) {
-            monster_race *r_ptr = &r_info[quest[q_idx].r_idx];
+        QuestId q_idx = quest_number(player_ptr, floor_ptr->dun_level);
+        if (floor_ptr->dun_level > 1 && inside_quest(q_idx)) {
+            monster_race *r_ptr = &r_info[quest[enum2i(q_idx)].r_idx];
             if (!(r_ptr->flags1 & RF1_UNIQUE) || 0 < r_ptr->max_num)
                 return true;
         }
@@ -94,7 +94,7 @@ bool alloc_stairs(PlayerType *player_ptr, FEAT_IDX feat, int num, int walls)
         if (floor_ptr->dun_level >= d_info[floor_ptr->dungeon_idx].maxdepth)
             return true;
 
-        if ((floor_ptr->dun_level < d_info[floor_ptr->dungeon_idx].maxdepth - 1) && !quest_number(player_ptr, floor_ptr->dun_level + 1))
+        if ((floor_ptr->dun_level < d_info[floor_ptr->dungeon_idx].maxdepth - 1) && !inside_quest(quest_number(player_ptr, floor_ptr->dun_level + 1)))
             shaft_num = (randint1(num) + 1) / 2;
     } else
         return false;
index 374b30b..6c7c117 100644 (file)
@@ -84,7 +84,7 @@ void pattern_teleport(PlayerType *player_ptr)
     if (record_stair)
         exe_write_diary(player_ptr, DIARY_PAT_TELE, 0, nullptr);
 
-    player_ptr->current_floor_ptr->quest_number = 0;
+    player_ptr->current_floor_ptr->quest_number = QuestId::NONE;
     PlayerEnergy(player_ptr).reset_player_turn();
 
     /*
index 1916433..47663f5 100644 (file)
@@ -93,7 +93,7 @@ void gen_caverns_and_lakes(PlayerType *player_ptr, dungeon_type *dungeon_ptr, du
         build_cavern(player_ptr);
     }
 
-    if (quest_number(player_ptr, floor_ptr->dun_level))
+    if (inside_quest(quest_number(player_ptr, floor_ptr->dun_level)))
         dd_ptr->destroyed = false;
 }
 
index de07f47..eecda4d 100644 (file)
@@ -35,7 +35,7 @@ void place_random_stairs(PlayerType *player_ptr, POSITION y, POSITION x)
     if (floor_ptr->dun_level >= d_info[player_ptr->dungeon_idx].maxdepth)
         down_stairs = false;
 
-    if (quest_number(player_ptr, floor_ptr->dun_level) && (floor_ptr->dun_level > 1))
+    if (inside_quest(quest_number(player_ptr, floor_ptr->dun_level)) && (floor_ptr->dun_level > 1))
         down_stairs = false;
 
     if (down_stairs && up_stairs) {
index ef53f7e..ff1ffcb 100644 (file)
@@ -175,7 +175,7 @@ FEAT_IDX choose_random_trap(PlayerType *player_ptr)
             break;
 
         /* Hack -- no trap doors on special levels */
-        if (floor_ptr->inside_arena || quest_number(player_ptr, floor_ptr->dun_level))
+        if (floor_ptr->inside_arena || inside_quest(quest_number(player_ptr, floor_ptr->dun_level)))
             continue;
 
         /* Hack -- no trap doors on the deepest level */
index 5f47ea0..04bd7be 100644 (file)
@@ -189,10 +189,10 @@ static concptr parse_fixed_map_expression(PlayerType *player_ptr, char **sp, cha
         sprintf(tmp, "%d", player_ptr->lev);
         v = tmp;
     } else if (streq(b + 1, "QUEST_NUMBER")) {
-        sprintf(tmp, "%d", player_ptr->current_floor_ptr->quest_number);
+        sprintf(tmp, "%d", enum2i(player_ptr->current_floor_ptr->quest_number));
         v = tmp;
     } else if (streq(b + 1, "LEAVING_QUEST")) {
-        sprintf(tmp, "%d", leaving_quest);
+        sprintf(tmp, "%d", enum2i(leaving_quest));
         v = tmp;
     } else if (prefix(b + 1, "QUEST_TYPE")) {
         sprintf(tmp, "%d", enum2i(quest[atoi(b + 11)].type));
index 93f7ffc..e79bb58 100644 (file)
@@ -109,8 +109,8 @@ parse_error_type parse_line_feature(floor_type *floor_ptr, char *buf)
             if (zz[6][1])
                 letter[index].artifact = (ARTIFACT_IDX)atoi(zz[6] + 1);
         } else if (zz[6][0] == '!') {
-            if (floor_ptr->quest_number) {
-                letter[index].artifact = quest[floor_ptr->quest_number].k_idx;
+            if (inside_quest(floor_ptr->quest_number)) {
+                letter[index].artifact = quest[enum2i(floor_ptr->quest_number)].k_idx;
             }
         } else {
             letter[index].artifact = (ARTIFACT_IDX)atoi(zz[6]);
@@ -131,8 +131,8 @@ parse_error_type parse_line_feature(floor_type *floor_ptr, char *buf)
             if (zz[4][1])
                 letter[index].object = (OBJECT_IDX)atoi(zz[4] + 1);
         } else if (zz[4][0] == '!') {
-            if (floor_ptr->quest_number) {
-                ARTIFACT_IDX a_idx = quest[floor_ptr->quest_number].k_idx;
+            if (inside_quest(floor_ptr->quest_number)) {
+                ARTIFACT_IDX a_idx = quest[enum2i(floor_ptr->quest_number)].k_idx;
                 if (a_idx) {
                     artifact_type *a_ptr = &a_info[a_idx];
                     if (a_ptr->gen_flags.has_not(ItemGenerationTraitType::INSTA_ART)) {
index af1a1f6..92d5461 100644 (file)
@@ -112,9 +112,9 @@ static void dump_aux_pet(PlayerType *player_ptr, FILE *fff)
 static void dump_aux_quest(PlayerType *player_ptr, FILE *fff)
 {
     fprintf(fff, _("\n\n  [クエスト情報]\n", "\n\n  [Quest Information]\n"));
-    std::vector<QUEST_IDX> quest_num(max_q_idx);
+    std::vector<int16_t> quest_num(max_q_idx);
 
-    std::iota(quest_num.begin(), quest_num.end(), static_cast<QUEST_IDX>(0));
+    std::iota(quest_num.begin(), quest_num.end(), enum2i(QuestId::NONE));
     int dummy;
     ang_sort(player_ptr, quest_num.data(), &dummy, quest_num.size(), ang_sort_comp_quest_num, ang_sort_swap_quest_num);
 
index cbe0fed..d8ced2b 100644 (file)
@@ -300,7 +300,7 @@ void process_command(PlayerType *player_ptr)
         break;
     }
     case '<': {
-        if (!player_ptr->wild_mode && !floor_ptr->dun_level && !floor_ptr->inside_arena && !floor_ptr->quest_number) {
+        if (!player_ptr->wild_mode && !floor_ptr->dun_level && !floor_ptr->inside_arena && !inside_quest(floor_ptr->quest_number)) {
             if (vanilla_town)
                 break;
 
index 98544d1..de5c215 100644 (file)
@@ -95,7 +95,7 @@ static char inkey_from_menu(PlayerType *player_ptr)
                         menu_name = special_menu_info[hoge].name;
                     break;
                 case MENU_WILD:
-                    if (!floor_ptr->dun_level && !floor_ptr->inside_arena && !floor_ptr->quest_number) {
+                    if (!floor_ptr->dun_level && !floor_ptr->inside_arena && !inside_quest(floor_ptr->quest_number)) {
                         auto can_do_in_wilderness = enum2i(special_menu_info[hoge].jouken_naiyou) > 0;
                         if (player_ptr->wild_mode == can_do_in_wilderness) {
                             menu_name = special_menu_info[hoge].name;
index 6904cb8..27c2ce8 100644 (file)
@@ -72,10 +72,10 @@ static bool open_diary_file(FILE **fff, bool *disable_diary)
  * @param player_ptr プレイヤーへの参照ポインタ
  * @return クエストID
  */
-static QUEST_IDX write_floor(PlayerType *player_ptr, concptr *note_level, char *note_level_buf)
+static QuestId write_floor(PlayerType *player_ptr, concptr *note_level, char *note_level_buf)
 {
     floor_type *floor_ptr = player_ptr->current_floor_ptr;
-    QUEST_IDX q_idx = quest_number(player_ptr, floor_ptr->dun_level);
+    QuestId q_idx = quest_number(player_ptr, floor_ptr->dun_level);
     if (!write_level)
         return q_idx;
 
@@ -83,7 +83,7 @@ static QUEST_IDX write_floor(PlayerType *player_ptr, concptr *note_level, char *
         *note_level = _("アリーナ:", "Arena:");
     else if (!floor_ptr->dun_level)
         *note_level = _("地上:", "Surface:");
-    else if (q_idx && quest_type::is_fixed(q_idx) && !((q_idx == QUEST_OBERON) || (q_idx == QUEST_SERPENT)))
+    else if (inside_quest(q_idx) && quest_type::is_fixed(q_idx) && !((q_idx == QuestId::OBERON) || (q_idx == QuestId::SERPENT)))
         *note_level = _("クエスト:", "Quest:");
     else {
 #ifdef JP
@@ -180,8 +180,8 @@ errr exe_write_diary(PlayerType *player_ptr, int type, int num, concptr note)
         type == DIARY_RAND_QUEST_C ||
         type == DIARY_RAND_QUEST_F ||
         type == DIARY_TO_QUEST) {
-        QUEST_IDX old_quest = player_ptr->current_floor_ptr->quest_number;
-        player_ptr->current_floor_ptr->quest_number = (quest[num].type == QuestKindType::RANDOM) ? 0 : num;
+        QuestId old_quest = player_ptr->current_floor_ptr->quest_number;
+        player_ptr->current_floor_ptr->quest_number = (quest[num].type == QuestKindType::RANDOM) ? QuestId::NONE : i2enum<QuestId>(num);
         init_flags = INIT_NAME_ONLY;
         parse_fixed_map(player_ptr, "q_info.txt", 0, 0, 0, 0);
         player_ptr->current_floor_ptr->quest_number = old_quest;
@@ -193,7 +193,7 @@ errr exe_write_diary(PlayerType *player_ptr, int type, int num, concptr note)
 
     concptr note_level = "";
     char note_level_buf[40];
-    QUEST_IDX q_idx = write_floor(player_ptr, &note_level, note_level_buf);
+    QuestId q_idx = write_floor(player_ptr, &note_level, note_level_buf);
 
     bool do_level = true;
     switch (type) {
@@ -266,7 +266,7 @@ errr exe_write_diary(PlayerType *player_ptr, int type, int num, concptr note)
         break;
     }
     case DIARY_STAIR: {
-        concptr to = q_idx && (quest_type::is_fixed(q_idx) && !((q_idx == QUEST_OBERON) || (q_idx == QUEST_SERPENT)))
+        concptr to = inside_quest(q_idx) && (quest_type::is_fixed(q_idx) && !((q_idx == QuestId::OBERON) || (q_idx == QuestId::SERPENT)))
                          ? _("地上", "the surface")
                      : !(player_ptr->current_floor_ptr->dun_level + num)
                          ? _("地上", "the surface")
index b396253..76d6aeb 100644 (file)
@@ -1,4 +1,4 @@
-/*!
+/*!
  * @brief 既知のクエストを表示する
  * @date 2020/04/23
  * @author Hourier
@@ -54,19 +54,19 @@ static void do_cmd_knowledge_quests_current(PlayerType *player_ptr, FILE *fff)
 
     fprintf(fff, _("《遂行中のクエスト》\n", "< Current Quest >\n"));
 
-    for (QUEST_IDX i = 1; i < max_q_idx; i++) {
+    for (int16_t i = 1; i < max_q_idx; i++) {
         bool is_print = quest[i].status == QuestStatusType::TAKEN;
         is_print |= (quest[i].status == QuestStatusType::STAGE_COMPLETED) && (quest[i].type == QuestKindType::TOWER);
         is_print |= quest[i].status == QuestStatusType::COMPLETED;
         if (!is_print)
             continue;
 
-        QUEST_IDX old_quest = player_ptr->current_floor_ptr->quest_number;
+        QuestId old_quest = player_ptr->current_floor_ptr->quest_number;
         for (int j = 0; j < 10; j++)
             quest_text[j][0] = '\0';
 
         quest_text_line = 0;
-        player_ptr->current_floor_ptr->quest_number = i;
+        player_ptr->current_floor_ptr->quest_number = i2enum<QuestId>(i);
         init_flags = INIT_SHOW_TEXT;
         parse_fixed_map(player_ptr, "q_info.txt", 0, 0, 0, 0);
         player_ptr->current_floor_ptr->quest_number = old_quest;
@@ -177,16 +177,16 @@ static void do_cmd_knowledge_quests_current(PlayerType *player_ptr, FILE *fff)
         fprintf(fff, _("  なし\n", "  Nothing.\n"));
 }
 
-static bool do_cmd_knowledge_quests_aux(PlayerType *player_ptr, FILE *fff, IDX q_idx)
+static bool do_cmd_knowledge_quests_aux(PlayerType *player_ptr, FILE *fff, QuestId q_idx)
 {
     char tmp_str[120];
     char playtime_str[16];
-    quest_type *const q_ptr = &quest[q_idx];
+    quest_type *const q_ptr = &quest[enum2i(q_idx)];
 
     floor_type *floor_ptr = player_ptr->current_floor_ptr;
     auto is_fixed_quest = quest_type::is_fixed(q_idx);
     if (is_fixed_quest) {
-        IDX old_quest = floor_ptr->quest_number;
+        QuestId old_quest = floor_ptr->quest_number;
         floor_ptr->quest_number = q_idx;
         init_flags = INIT_NAME_ONLY;
         parse_fixed_map(player_ptr, "q_info.txt", 0, 0, 0, 0);
@@ -223,13 +223,13 @@ static bool do_cmd_knowledge_quests_aux(PlayerType *player_ptr, FILE *fff, IDX q
  * @param fff セーブファイル (展開済?)
  * @param quest_num[] 受注したことのあるクエスト群
  */
-void do_cmd_knowledge_quests_completed(PlayerType *player_ptr, FILE *fff, QUEST_IDX quest_num[])
+void do_cmd_knowledge_quests_completed(PlayerType *player_ptr, FILE *fff, int16_t quest_num[])
 {
     fprintf(fff, _("《達成したクエスト》\n", "< Completed Quest >\n"));
-    QUEST_IDX total = 0;
-    for (QUEST_IDX i = 1; i < max_q_idx; i++) {
-        QUEST_IDX q_idx = quest_num[i];
-        quest_type *const q_ptr = &quest[q_idx];
+    int16_t total = 0;
+    for (int16_t i = 1; i < max_q_idx; i++) {
+        QuestId q_idx = i2enum<QuestId>(quest_num[i]);
+        quest_type *const q_ptr = &quest[enum2i(q_idx)];
 
         if (q_ptr->status == QuestStatusType::FINISHED && do_cmd_knowledge_quests_aux(player_ptr, fff, q_idx)) {
             ++total;
@@ -246,13 +246,13 @@ void do_cmd_knowledge_quests_completed(PlayerType *player_ptr, FILE *fff, QUEST_
  * @param fff セーブファイル (展開済?)
  * @param quest_num[] 受注したことのあるクエスト群
  */
-void do_cmd_knowledge_quests_failed(PlayerType *player_ptr, FILE *fff, QUEST_IDX quest_num[])
+void do_cmd_knowledge_quests_failed(PlayerType *player_ptr, FILE *fff, int16_t quest_num[])
 {
     fprintf(fff, _("《失敗したクエスト》\n", "< Failed Quest >\n"));
-    QUEST_IDX total = 0;
-    for (QUEST_IDX i = 1; i < max_q_idx; i++) {
-        QUEST_IDX q_idx = quest_num[i];
-        quest_type *const q_ptr = &quest[q_idx];
+    int16_t total = 0;
+    for (int16_t i = 1; i < max_q_idx; i++) {
+        QuestId q_idx = i2enum<QuestId>(quest_num[i]);
+        quest_type *const q_ptr = &quest[enum2i(q_idx)];
 
         if (((q_ptr->status == QuestStatusType::FAILED_DONE) || (q_ptr->status == QuestStatusType::FAILED)) && do_cmd_knowledge_quests_aux(player_ptr, fff, q_idx)) {
             ++total;
@@ -270,8 +270,8 @@ static void do_cmd_knowledge_quests_wiz_random(FILE *fff)
 {
     fprintf(fff, _("《残りのランダムクエスト》\n", "< Remaining Random Quest >\n"));
     GAME_TEXT tmp_str[120];
-    QUEST_IDX total = 0;
-    for (QUEST_IDX i = 1; i < max_q_idx; i++) {
+    int16_t total = 0;
+    for (int16_t i = 1; i < max_q_idx; i++) {
         if (quest[i].flags & QUEST_FLAG_SILENT)
             continue;
 
@@ -297,8 +297,8 @@ void do_cmd_knowledge_quests(PlayerType *player_ptr)
     if (!open_temporary_file(&fff, file_name))
         return;
 
-    std::vector<QUEST_IDX> quest_num(max_q_idx);
-    std::iota(quest_num.begin(), quest_num.end(), static_cast<QUEST_IDX>(0));
+    std::vector<int16_t> quest_num(max_q_idx);
+    std::iota(quest_num.begin(), quest_num.end(), enum2i(QuestId::NONE));
 
     int dummy;
     ang_sort(player_ptr, quest_num.data(), &dummy, quest_num.size(), ang_sort_comp_quest_num, ang_sort_swap_quest_num);
index 5a92013..80410af 100644 (file)
@@ -1,9 +1,10 @@
 #pragma once
 
+#include "dungeon/quest.h"
 #include "system/angband.h"
 
 class PlayerType;
 void do_cmd_checkquest(PlayerType *player_ptr);
-void do_cmd_knowledge_quests_completed(PlayerType *player_ptr, FILE *fff, QUEST_IDX quest_num[]);
-void do_cmd_knowledge_quests_failed(PlayerType *player_ptr, FILE *fff, QUEST_IDX quest_num[]);
+void do_cmd_knowledge_quests_completed(PlayerType *player_ptr, FILE *fff, int16_t quest_num[]);
+void do_cmd_knowledge_quests_failed(PlayerType *player_ptr, FILE *fff, int16_t quest_num[]);
 void do_cmd_knowledge_quests(PlayerType *player_ptr);
index 005558c..be1ba9b 100644 (file)
@@ -145,7 +145,7 @@ errr rd_saved_floor(PlayerType *player_ptr, saved_floor_type *sf_ptr)
                     } else if (g_ptr->feat == OLD_FEAT_BLDG_1) {
                         g_ptr->special = lite_town ? QUEST_OLD_CASTLE : QUEST_ROYAL_CRYPT;
                     }
-                } else if ((g_ptr->feat == OLD_FEAT_QUEST_EXIT) && (floor_ptr->quest_number == OLD_QUEST_WATER_CAVE)) {
+                } else if ((g_ptr->feat == OLD_FEAT_QUEST_EXIT) && (floor_ptr->quest_number == i2enum<QuestId>(OLD_QUEST_WATER_CAVE))) {
                     g_ptr->feat = feat_up_stair;
                     g_ptr->special = 0;
                 }
index daef9c5..ceee73a 100644 (file)
@@ -179,7 +179,7 @@ void set_zangband_visited_towns(PlayerType *player_ptr)
     player_ptr->visit = 1L;
 }
 
-void set_zangband_quest(PlayerType *player_ptr, quest_type *const q_ptr, int loading_quest_index, const QUEST_IDX old_inside_quest)
+void set_zangband_quest(PlayerType *player_ptr, quest_type *const q_ptr, int loading_quest_index, const QuestId old_inside_quest)
 {
     if (q_ptr->flags & QUEST_FLAG_PRESET) {
         q_ptr->dungeon = 0;
@@ -187,7 +187,7 @@ void set_zangband_quest(PlayerType *player_ptr, quest_type *const q_ptr, int loa
     }
 
     init_flags = INIT_ASSIGN;
-    player_ptr->current_floor_ptr->quest_number = (QUEST_IDX)loading_quest_index;
+    player_ptr->current_floor_ptr->quest_number = i2enum<QuestId>(loading_quest_index);
     parse_fixed_map(player_ptr, "q_info.txt", 0, 0, 0, 0);
     player_ptr->current_floor_ptr->quest_number = old_inside_quest;
 }
index 39e7ee9..ce0737e 100644 (file)
@@ -1,5 +1,6 @@
 #pragma once
 
+#include "dungeon/quest.h"
 #include "system/angband.h"
 
 class PlayerType;
@@ -19,7 +20,7 @@ void set_zangband_special_attack(PlayerType *player_ptr);
 void set_zangband_special_defense(PlayerType *player_ptr);
 void set_zangband_action(PlayerType *player_ptr);
 void set_zangband_visited_towns(PlayerType *player_ptr);
-void set_zangband_quest(PlayerType *player_ptr, quest_type *const q_ptr, int loading_quest_index, const QUEST_IDX old_inside_quest);
+void set_zangband_quest(PlayerType *player_ptr, quest_type *const q_ptr, int loading_quest_index, const QuestId old_inside_quest);
 void set_zangband_class(PlayerType *player_ptr);
 void set_zangband_learnt_spells(PlayerType *player_ptr);
 void set_zangband_pet(PlayerType *player_ptr);
index 5a30ce1..f5d89eb 100644 (file)
@@ -669,7 +669,7 @@ errr rd_dungeon_old(PlayerType *player_ptr)
                     } else if (g_ptr->feat == OLD_FEAT_BLDG_1) {
                         g_ptr->special = lite_town ? QUEST_OLD_CASTLE : QUEST_ROYAL_CRYPT;
                     }
-                } else if ((g_ptr->feat == OLD_FEAT_QUEST_EXIT) && (floor_ptr->quest_number == OLD_QUEST_WATER_CAVE)) {
+                } else if ((g_ptr->feat == OLD_FEAT_QUEST_EXIT) && (floor_ptr->quest_number == i2enum<QuestId>(OLD_QUEST_WATER_CAVE))) {
                     g_ptr->feat = feat_up_stair;
                     g_ptr->special = 0;
                 }
index 58a2165..f4e865b 100644 (file)
@@ -29,10 +29,10 @@ void set_exp_frac_old(PlayerType *player_ptr)
 
 void remove_water_cave(PlayerType *player_ptr)
 {
-    if (player_ptr->current_floor_ptr->quest_number != OLD_QUEST_WATER_CAVE)
+    if (player_ptr->current_floor_ptr->quest_number != i2enum<QuestId>(OLD_QUEST_WATER_CAVE))
         return;
 
     player_ptr->dungeon_idx = lite_town ? DUNGEON_ANGBAND : DUNGEON_GALGALS;
     player_ptr->current_floor_ptr->dun_level = 1;
-    player_ptr->current_floor_ptr->quest_number = 0;
+    player_ptr->current_floor_ptr->quest_number = QuestId::NONE;
 }
index b6efbf4..7c8ec97 100644 (file)
@@ -209,7 +209,7 @@ static void set_imitation(PlayerType *player_ptr)
 static void rd_phase_out(PlayerType *player_ptr)
 {
     player_ptr->current_floor_ptr->inside_arena = rd_s16b() != 0;
-    player_ptr->current_floor_ptr->quest_number = rd_s16b();
+    player_ptr->current_floor_ptr->quest_number = i2enum<QuestId>(rd_s16b());
     if (h_older_than(0, 3, 5))
         player_ptr->phase_out = false;
     else {
index 3b6056f..1b8e2b0 100644 (file)
@@ -85,7 +85,7 @@ static void load_quest_details(PlayerType *player_ptr, quest_type *q_ptr, int lo
 
 void analyze_quests(PlayerType *player_ptr, const uint16_t max_quests_load, const byte max_rquests_load)
 {
-    QUEST_IDX old_inside_quest = player_ptr->current_floor_ptr->quest_number;
+    QuestId old_inside_quest = player_ptr->current_floor_ptr->quest_number;
     for (int i = 0; i < max_quests_load; i++) {
         if (check_quest_index(i))
             continue;
index d2b6846..e990494 100644 (file)
@@ -75,7 +75,7 @@ static concptr dungeon_key_at(int index, char *buf)
     return buf;
 }
 
-static inline QUEST_IDX get_quest_count()
+static inline int16_t get_quest_count()
 {
     return max_q_idx;
 }
index e162069..fa1a7f1 100644 (file)
@@ -43,11 +43,11 @@ static bool scene_basic(PlayerType *player_ptr, scene_type *value)
 
 static bool scene_quest(PlayerType *player_ptr, scene_type *value)
 {
-    const QUEST_IDX quest_id = quest_number(player_ptr, player_ptr->current_floor_ptr->dun_level);
-    const bool enable = (quest_id > 0);
+    const QuestId quest_id = quest_number(player_ptr, player_ptr->current_floor_ptr->dun_level);
+    const bool enable = (inside_quest(quest_id));
     if (enable) {
         value->type = TERM_XTRA_MUSIC_QUEST;
-        value->val = quest_id;
+        value->val = enum2i(quest_id);
     }
 
     return enable;
@@ -55,8 +55,8 @@ static bool scene_quest(PlayerType *player_ptr, scene_type *value)
 
 static bool scene_quest_basic(PlayerType *player_ptr, scene_type *value)
 {
-    const QUEST_IDX quest_id = quest_number(player_ptr, player_ptr->current_floor_ptr->dun_level);
-    const bool enable = (quest_id > 0);
+    const QuestId quest_id = quest_number(player_ptr, player_ptr->current_floor_ptr->dun_level);
+    const bool enable = (inside_quest(quest_id));
     if (enable) {
         value->type = TERM_XTRA_MUSIC_BASIC;
         value->val = MUSIC_BASIC_QUEST;
index e094211..4fde3da 100644 (file)
@@ -21,7 +21,7 @@
  * @param questnum クエストのID
  * @param do_init クエストの開始処理か(true)、結果処理か(FALSE)
  */
-static void get_questinfo(PlayerType *player_ptr, IDX questnum, bool do_init)
+static void get_questinfo(PlayerType *player_ptr, QuestId questnum, bool do_init)
 {
     for (int i = 0; i < 10; i++) {
         quest_text[i][0] = '\0';
@@ -30,7 +30,7 @@ static void get_questinfo(PlayerType *player_ptr, IDX questnum, bool do_init)
     quest_text_line = 0;
 
     floor_type *floor_ptr = player_ptr->current_floor_ptr;
-    QUEST_IDX old_quest = floor_ptr->quest_number;
+    QuestId old_quest = floor_ptr->quest_number;
     floor_ptr->quest_number = questnum;
 
     init_flags = INIT_SHOW_TEXT;
@@ -47,14 +47,14 @@ static void get_questinfo(PlayerType *player_ptr, IDX questnum, bool do_init)
  * @param questnum クエストのID
  * @param do_init クエストの開始処理か(true)、結果処理か(FALSE)
  */
-void print_questinfo(PlayerType *player_ptr, IDX questnum, bool do_init)
+void print_questinfo(PlayerType *player_ptr, QuestId questnum, bool do_init)
 {
     get_questinfo(player_ptr, questnum, do_init);
 
     GAME_TEXT tmp_str[80];
-    sprintf(tmp_str, _("クエスト情報 (危険度: %d 階相当)", "Quest Information (Danger level: %d)"), (int)quest[questnum].level);
+    sprintf(tmp_str, _("クエスト情報 (危険度: %d 階相当)", "Quest Information (Danger level: %d)"), (int)quest[enum2i(questnum)].level);
     prt(tmp_str, 5, 0);
-    prt(quest[questnum].name, 7, 0);
+    prt(quest[enum2i(questnum)].name, 7, 0);
 
     for (int i = 0; i < 10; i++) {
         c_put_str(TERM_YELLOW, quest_text[i], i + 8, 0);
@@ -68,15 +68,15 @@ void print_questinfo(PlayerType *player_ptr, IDX questnum, bool do_init)
 void castle_quest(PlayerType *player_ptr)
 {
     clear_bldg(4, 18);
-    QUEST_IDX q_index = player_ptr->current_floor_ptr->grid_array[player_ptr->y][player_ptr->x].special;
+    QuestId q_index = i2enum<QuestId>(player_ptr->current_floor_ptr->grid_array[player_ptr->y][player_ptr->x].special);
 
-    if (!q_index) {
+    if (!inside_quest(q_index)) {
         put_str(_("今のところクエストはありません。", "I don't have a quest for you at the moment."), 8, 0);
         return;
     }
 
     quest_type *q_ptr;
-    q_ptr = &quest[q_index];
+    q_ptr = &quest[enum2i(q_index)];
     if (q_ptr->status == QuestStatusType::COMPLETED) {
         q_ptr->status = QuestStatusType::REWARDED;
         print_questinfo(player_ptr, q_index, false);
index 0872c71..f324efc 100644 (file)
@@ -26,6 +26,6 @@ melee_spell_type *initialize_melee_spell_type(PlayerType *player_ptr, melee_spel
     ms_ptr->see_m = is_seen(player_ptr, ms_ptr->m_ptr);
     ms_ptr->maneable = player_has_los_bold(player_ptr, ms_ptr->m_ptr->fy, ms_ptr->m_ptr->fx);
     ms_ptr->pet = is_pet(ms_ptr->m_ptr);
-    ms_ptr->in_no_magic_dungeon = d_info[player_ptr->dungeon_idx].flags.has(DungeonFeatureType::NO_MAGIC) && floor_ptr->dun_level && (!floor_ptr->quest_number || quest_type::is_fixed(floor_ptr->quest_number));
+    ms_ptr->in_no_magic_dungeon = d_info[player_ptr->dungeon_idx].flags.has(DungeonFeatureType::NO_MAGIC) && floor_ptr->dun_level && (!inside_quest(floor_ptr->quest_number) || quest_type::is_fixed(floor_ptr->quest_number));
     return ms_ptr;
 }
index 098c9c5..b921861 100644 (file)
@@ -144,23 +144,23 @@ static bool check_unique_placeable(PlayerType *player_ptr, MONRACE_IDX r_idx)
 static bool check_quest_placeable(PlayerType *player_ptr, MONRACE_IDX r_idx)
 {
     floor_type *floor_ptr = player_ptr->current_floor_ptr;
-    if (quest_number(player_ptr, floor_ptr->dun_level) == 0)
+    if (!inside_quest(quest_number(player_ptr, floor_ptr->dun_level)))
         return true;
 
-    int hoge = quest_number(player_ptr, floor_ptr->dun_level);
-    if ((quest[hoge].type != QuestKindType::KILL_LEVEL) && (quest[hoge].type != QuestKindType::RANDOM))
+    QuestId hoge = quest_number(player_ptr, floor_ptr->dun_level);
+    if ((quest[enum2i(hoge)].type != QuestKindType::KILL_LEVEL) && (quest[enum2i(hoge)].type != QuestKindType::RANDOM))
         return true;
 
-    if (r_idx != quest[hoge].r_idx)
+    if (r_idx != quest[enum2i(hoge)].r_idx)
         return true;
 
     int number_mon = 0;
     for (int i2 = 0; i2 < floor_ptr->width; ++i2)
         for (int j2 = 0; j2 < floor_ptr->height; j2++)
-            if ((floor_ptr->grid_array[j2][i2].m_idx > 0) && (floor_ptr->m_list[floor_ptr->grid_array[j2][i2].m_idx].r_idx == quest[hoge].r_idx))
+            if ((floor_ptr->grid_array[j2][i2].m_idx > 0) && (floor_ptr->m_list[floor_ptr->grid_array[j2][i2].m_idx].r_idx == quest[enum2i(hoge)].r_idx))
                 number_mon++;
 
-    if (number_mon + quest[hoge].cur_num >= quest[hoge].max_num)
+    if (number_mon + quest[enum2i(hoge)].cur_num >= quest[enum2i(hoge)].max_num)
         return false;
 
     return true;
index c95eaf9..1e8ea18 100644 (file)
@@ -125,7 +125,7 @@ bool mon_hook_quest(PlayerType *player_ptr, MONRACE_IDX r_idx)
  */
 bool mon_hook_dungeon(PlayerType *player_ptr, MONRACE_IDX r_idx)
 {
-    if (!is_in_dungeon(player_ptr) && !player_ptr->current_floor_ptr->quest_number)
+    if (!is_in_dungeon(player_ptr) && !inside_quest(player_ptr->current_floor_ptr->quest_number))
         return true;
 
     monster_race *r_ptr = &r_info[r_idx];
index 3b24b63..dc6e438 100644 (file)
@@ -254,7 +254,7 @@ static bool restrict_monster_to_dungeon(PlayerType *player_ptr, MONRACE_IDX r_id
  */
 monsterrace_hook_type get_monster_hook(PlayerType *player_ptr)
 {
-    if ((player_ptr->current_floor_ptr->dun_level > 0) || (player_ptr->current_floor_ptr->quest_number > 0))
+    if ((player_ptr->current_floor_ptr->dun_level > 0) || (inside_quest(player_ptr->current_floor_ptr->quest_number)))
         return (monsterrace_hook_type)mon_hook_dungeon;
 
     switch (wilderness[player_ptr->wilderness_y][player_ptr->wilderness_x].terrain) {
@@ -351,7 +351,7 @@ static errr do_get_mon_num_prep(PlayerType *player_ptr, const monsterrace_hook_t
                 continue;
 
             // クエスト内でRES_ALLの生成を禁止する (殲滅系クエストの詰み防止)
-            if (player_ptr->current_floor_ptr->quest_number && any_bits(r_ptr->flagsr, RFR_RES_ALL))
+            if (inside_quest(player_ptr->current_floor_ptr->quest_number) && any_bits(r_ptr->flagsr, RFR_RES_ALL))
                 continue;
         }
 
@@ -365,7 +365,7 @@ static errr do_get_mon_num_prep(PlayerType *player_ptr, const monsterrace_hook_t
             //   * フェイズアウト状態でない
             //   * 1階かそれより深いところにいる
             //   * ランダムクエスト中でない
-            const bool in_random_quest = floor_ptr->quest_number && !quest_type::is_fixed(floor_ptr->quest_number);
+            const bool in_random_quest = inside_quest(floor_ptr->quest_number) && !quest_type::is_fixed(floor_ptr->quest_number);
             const bool cond = !player_ptr->phase_out && floor_ptr->dun_level > 0 && !in_random_quest;
 
             if (cond && !restrict_monster_to_dungeon(player_ptr, entry->index)) {
index f3788e9..8e49f2f 100644 (file)
@@ -54,8 +54,8 @@ static void set_no_magic_mask(msa_type *msa_ptr)
 static void check_mspell_stupid(PlayerType *player_ptr, msa_type *msa_ptr)
 {
     floor_type *floor_ptr = player_ptr->current_floor_ptr;
-    msa_ptr->in_no_magic_dungeon = d_info[player_ptr->dungeon_idx].flags.has(DungeonFeatureType::NO_MAGIC) && floor_ptr->dun_level && (!floor_ptr->quest_number || quest_type::is_fixed(floor_ptr->inside_quest));
-    if (!msa_ptr->in_no_magic_dungeon || ((msa_ptr->r_ptr->behavior_flags.has(MonsterBehaviorType::STUPID))))
+    msa_ptr->in_no_magic_dungeon = d_info[player_ptr->dungeon_idx].flags.has(DungeonFeatureType::NO_MAGIC) && floor_ptr->dun_level && (!inside_quest(floor_ptr->quest_number) || quest_type::is_fixed(floor_ptr->quest_number));
+    if (!msa_ptr->in_no_magic_dungeon || (msa_ptr->r_ptr->behavior_flags.has(MonsterBehaviorType::STUPID)))
         return;
 
     msa_ptr->ability_flags &= RF_ABILITY_NOMAGIC_MASK;
index 8ec9c7e..1d94393 100644 (file)
@@ -1,4 +1,4 @@
-#include "object-hook/hook-quest.h"
+#include "object-hook/hook-quest.h"
 #include "cmd-building/cmd-building.h"
 #include "dungeon/quest.h"
 #include "game-option/birth-options.h"
@@ -47,12 +47,12 @@ bool object_is_bounty(PlayerType *player_ptr, ObjectType *o_ptr)
  * @param o_ptr 特性短縮表記を得たいオブジェクト構造体の参照ポインタ
  * @return 現在クエスト達成目的のアイテムならばTRUEを返す。
  */
-bool object_is_quest_target(QUEST_IDX quest_idx, ObjectType *o_ptr)
+bool object_is_quest_target(QuestId quest_idx, ObjectType *o_ptr)
 {
-    if (quest_idx == 0)
+    if (!inside_quest(quest_idx))
         return false;
 
-    ARTIFACT_IDX a_idx = quest[quest_idx].k_idx;
+    ARTIFACT_IDX a_idx = quest[enum2i(quest_idx)].k_idx;
     if (a_idx == 0)
         return false;
 
index 03faace..01787fa 100644 (file)
@@ -1,8 +1,9 @@
 #pragma once
 
+#include "dungeon/quest.h"
 #include "system/angband.h"
 
 class ObjectType;
 class PlayerType;
 bool object_is_bounty(PlayerType *player_ptr, ObjectType *o_ptr);
-bool object_is_quest_target(QUEST_IDX quest_idx, ObjectType *o_ptr);
+bool object_is_quest_target(QuestId quest_idx, ObjectType *o_ptr);
index 6cbad33..f4b1a3f 100644 (file)
@@ -366,7 +366,7 @@ int take_hit(PlayerType *player_ptr, int damage_type, HIT_POINT damage, concptr
             if (record_arena)
                 exe_write_diary(player_ptr, DIARY_ARENA, -1 - player_ptr->arena_number, m_name);
         } else {
-            QUEST_IDX q_idx = quest_number(player_ptr, player_ptr->current_floor_ptr->dun_level);
+            QuestId q_idx = quest_number(player_ptr, player_ptr->current_floor_ptr->dun_level);
             bool seppuku = streq(hit_from, "Seppuku");
             bool winning_seppuku = w_ptr->total_winner && seppuku;
 
@@ -385,9 +385,9 @@ int take_hit(PlayerType *player_ptr, int damage_type, HIT_POINT damage, concptr
                 char dummy[1024];
 #ifdef JP
                 sprintf(dummy, "%s%s%s",
-                    !player_ptr->paralyzed     ? ""
-                        : player_ptr->free_act ? "彫像状態で"
-                                                 : "麻痺状態で",
+                    !player_ptr->paralyzed ? ""
+                    : player_ptr->free_act ? "彫像状態で"
+                                           : "麻痺状態で",
                     player_ptr->hallucinated ? "幻覚に歪んだ" : "", hit_from);
 #else
                 sprintf(dummy, "%s%s", hit_from, !player_ptr->paralyzed ? "" : " while helpless");
@@ -406,7 +406,7 @@ int take_hit(PlayerType *player_ptr, int damage_type, HIT_POINT damage, concptr
                     strcpy(buf, _("アリーナ", "in the Arena"));
                 else if (!is_in_dungeon(player_ptr))
                     strcpy(buf, _("地上", "on the surface"));
-                else if (q_idx && (quest_type::is_fixed(q_idx) && !((q_idx == QUEST_OBERON) || (q_idx == QUEST_SERPENT))))
+                else if (inside_quest(q_idx) && (quest_type::is_fixed(q_idx) && !((q_idx == QuestId::OBERON) || (q_idx == QuestId::SERPENT))))
                     strcpy(buf, _("クエスト", "in a quest"));
                 else
                     sprintf(buf, _("%d階", "level %d"), (int)player_ptr->current_floor_ptr->dun_level);
index e04591c..78fbd9a 100644 (file)
@@ -230,13 +230,13 @@ bool move_player_effect(PlayerType *player_ptr, POSITION ny, POSITION nx, BIT_FL
         energy.reset_player_turn();
         command_new = SPECIAL_KEY_QUEST;
     } else if (f_ptr->flags.has(FloorFeatureType::QUEST_EXIT)) {
-        if (quest[floor_ptr->quest_number].type == QuestKindType::FIND_EXIT)
+        if (quest[enum2i(floor_ptr->quest_number)].type == QuestKindType::FIND_EXIT)
             complete_quest(player_ptr, floor_ptr->quest_number);
 
         leave_quest_check(player_ptr);
-        floor_ptr->quest_number = g_ptr->special;
+        floor_ptr->quest_number = i2enum<QuestId>(g_ptr->special);
         floor_ptr->dun_level = 0;
-        if (!floor_ptr->quest_number)
+        if (!inside_quest(floor_ptr->quest_number))
             player_ptr->word_recall = 0;
         player_ptr->oldpx = 0;
         player_ptr->oldpy = 0;
index 12b07a7..2cfcf65 100644 (file)
@@ -111,7 +111,7 @@ void wr_player(PlayerType *player_ptr)
 
     wr_s16b(player_ptr->arena_number);
     wr_s16b(player_ptr->current_floor_ptr->inside_arena);
-    wr_s16b(player_ptr->current_floor_ptr->quest_number);
+    wr_s16b(enum2i(player_ptr->current_floor_ptr->quest_number));
     wr_s16b(player_ptr->phase_out);
     wr_byte(player_ptr->exit_bldg);
     wr_byte(0); /* Unused */
index ba01507..c1714c4 100644 (file)
@@ -76,7 +76,7 @@ static bool wr_savefile_new(PlayerType *player_ptr, save_type type)
     wr_byte(tmp8u);
     v_stamp = 0L;
     x_stamp = 0L;
+
     wr_u32b(w_ptr->sf_system);
     wr_u32b(w_ptr->sf_when);
     wr_u16b(w_ptr->sf_lives);
@@ -135,7 +135,7 @@ static bool wr_savefile_new(PlayerType *player_ptr, save_type type)
 
         bool is_quest_running = q_ptr->status == QuestStatusType::TAKEN;
         is_quest_running |= q_ptr->status == QuestStatusType::COMPLETED;
-        is_quest_running |= !quest_type::is_fixed(i);
+        is_quest_running |= !quest_type::is_fixed(i2enum<QuestId>(i));
         if (!is_quest_running)
             continue;
 
index 4b2dbdb..aac3561 100644 (file)
@@ -52,7 +52,7 @@
 bool earthquake(PlayerType *player_ptr, POSITION cy, POSITION cx, POSITION r, MONSTER_IDX m_idx)
 {
     floor_type *floor_ptr = player_ptr->current_floor_ptr;
-    if ((floor_ptr->quest_number && quest_type::is_fixed(floor_ptr->quest_number)) || !floor_ptr->dun_level) {
+    if ((inside_quest(floor_ptr->quest_number) && quest_type::is_fixed(floor_ptr->quest_number)) || !floor_ptr->dun_level) {
         return false;
     }
 
index da90ea5..4c2d679 100644 (file)
@@ -248,7 +248,7 @@ bool destroy_area(PlayerType *player_ptr, POSITION y1, POSITION x1, POSITION r,
 {
     /* Prevent destruction of quest levels and town */
     floor_type *floor_ptr = player_ptr->current_floor_ptr;
-    if ((floor_ptr->quest_number && quest_type::is_fixed(floor_ptr->quest_number)) || !floor_ptr->dun_level) {
+    if ((inside_quest(floor_ptr->quest_number) && quest_type::is_fixed(floor_ptr->quest_number)) || !floor_ptr->dun_level) {
         return false;
     }
 
index d14e8c0..45ad9cb 100644 (file)
@@ -53,7 +53,7 @@ bool genocide_aux(PlayerType *player_ptr, MONSTER_IDX m_idx, int power, bool pla
         resist = true;
     else if (m_idx == player_ptr->riding)
         resist = true;
-    else if ((player_ptr->current_floor_ptr->quest_number && !random_quest_number(player_ptr, player_ptr->current_floor_ptr->dun_level)) || player_ptr->current_floor_ptr->inside_arena || player_ptr->phase_out)
+    else if ((inside_quest(player_ptr->current_floor_ptr->quest_number) && !inside_quest(random_quest_number(player_ptr, player_ptr->current_floor_ptr->dun_level))) || player_ptr->current_floor_ptr->inside_arena || player_ptr->phase_out)
         resist = true;
     else if (player_cast && (r_ptr->level > randint0(power)))
         resist = true;
@@ -120,7 +120,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)
 {
     floor_type *floor_ptr = player_ptr->current_floor_ptr;
-    bool is_special_floor = floor_ptr->quest_number && !random_quest_number(player_ptr, floor_ptr->dun_level);
+    bool is_special_floor = inside_quest(floor_ptr->quest_number) && !inside_quest(random_quest_number(player_ptr, floor_ptr->dun_level));
     is_special_floor |= player_ptr->current_floor_ptr->inside_arena;
     is_special_floor |= player_ptr->phase_out;
     if (is_special_floor) {
@@ -160,7 +160,7 @@ bool symbol_genocide(PlayerType *player_ptr, int power, bool player_cast)
 bool mass_genocide(PlayerType *player_ptr, int power, bool player_cast)
 {
     floor_type *floor_ptr = player_ptr->current_floor_ptr;
-    bool is_special_floor = floor_ptr->quest_number && !random_quest_number(player_ptr, floor_ptr->dun_level);
+    bool is_special_floor = inside_quest(floor_ptr->quest_number) && !inside_quest(random_quest_number(player_ptr, floor_ptr->dun_level));
     is_special_floor |= player_ptr->current_floor_ptr->inside_arena;
     is_special_floor |= player_ptr->phase_out;
     if (is_special_floor) {
@@ -195,7 +195,7 @@ bool mass_genocide(PlayerType *player_ptr, int power, bool player_cast)
 bool mass_genocide_undead(PlayerType *player_ptr, int power, bool player_cast)
 {
     floor_type *floor_ptr = player_ptr->current_floor_ptr;
-    bool is_special_floor = floor_ptr->quest_number && !random_quest_number(player_ptr, floor_ptr->dun_level);
+    bool is_special_floor = inside_quest(floor_ptr->quest_number) && !inside_quest(random_quest_number(player_ptr, floor_ptr->dun_level));
     is_special_floor |= player_ptr->current_floor_ptr->inside_arena;
     is_special_floor |= player_ptr->phase_out;
     if (is_special_floor) {
index 13a77c1..004200f 100644 (file)
@@ -69,10 +69,10 @@ void stair_creation(PlayerType *player_ptr)
 
     bool down = true;
     floor_type *floor_ptr = player_ptr->current_floor_ptr;
-    if (quest_number(player_ptr, floor_ptr->dun_level) || (floor_ptr->dun_level >= d_info[player_ptr->dungeon_idx].maxdepth))
+    if (inside_quest(quest_number(player_ptr, floor_ptr->dun_level)) || (floor_ptr->dun_level >= d_info[player_ptr->dungeon_idx].maxdepth))
         down = false;
 
-    if (!floor_ptr->dun_level || (!up && !down) || (floor_ptr->quest_number && quest_type::is_fixed(floor_ptr->quest_number)) || floor_ptr->inside_arena || player_ptr->phase_out) {
+    if (!floor_ptr->dun_level || (!up && !down) || (inside_quest(floor_ptr->quest_number) && quest_type::is_fixed(floor_ptr->quest_number)) || floor_ptr->inside_arena || player_ptr->phase_out) {
         msg_print(_("効果がありません!", "There is no effect!"));
         return;
     }
index 6bd9321..1af19e0 100644 (file)
@@ -9,6 +9,7 @@
 #include "core/asking-player.h"
 #include "core/player-update-types.h"
 #include "core/speed-table.h"
+#include "effect/attribute-types.h"
 #include "effect/effect-characteristics.h"
 #include "floor/cave.h"
 #include "floor/geometry.h"
@@ -32,7 +33,6 @@
 #include "player/player-move.h"
 #include "player/player-status.h"
 #include "spell-kind/spells-launcher.h"
-#include "effect/attribute-types.h"
 #include "system/floor-type-definition.h"
 #include "system/grid-type-definition.h"
 #include "system/monster-race-definition.h"
@@ -157,7 +157,7 @@ bool teleport_away(PlayerType *player_ptr, MONSTER_IDX m_idx, POSITION dis, tele
                 continue;
             if (!cave_monster_teleportable_bold(player_ptr, m_idx, ny, nx, mode))
                 continue;
-            if (!(player_ptr->current_floor_ptr->quest_number || player_ptr->current_floor_ptr->inside_arena))
+            if (!(inside_quest(player_ptr->current_floor_ptr->quest_number) || player_ptr->current_floor_ptr->inside_arena))
                 if (player_ptr->current_floor_ptr->grid_array[ny][nx].is_icky())
                     continue;
 
index 066ea05..44085ff 100644 (file)
@@ -1,4 +1,4 @@
-#include "spell-kind/spells-world.h"
+#include "spell-kind/spells-world.h"
 #include "cmd-io/cmd-save.h"
 #include "core/asking-player.h"
 #include "core/player-redraw-types.h"
@@ -49,9 +49,9 @@
 bool is_teleport_level_ineffective(PlayerType *player_ptr, MONSTER_IDX idx)
 {
     floor_type *floor_ptr = player_ptr->current_floor_ptr;
-    bool is_special_floor = floor_ptr->inside_arena || player_ptr->phase_out || (floor_ptr->quest_number && !random_quest_number(player_ptr, floor_ptr->dun_level));
+    bool is_special_floor = floor_ptr->inside_arena || player_ptr->phase_out || (inside_quest(floor_ptr->quest_number) && !inside_quest(random_quest_number(player_ptr, floor_ptr->dun_level)));
     bool is_invalid_floor = idx <= 0;
-    is_invalid_floor &= quest_number(player_ptr, floor_ptr->dun_level) || (floor_ptr->dun_level >= d_info[player_ptr->dungeon_idx].maxdepth);
+    is_invalid_floor &= inside_quest(quest_number(player_ptr, floor_ptr->dun_level)) || (floor_ptr->dun_level >= d_info[player_ptr->dungeon_idx].maxdepth);
     is_invalid_floor &= player_ptr->current_floor_ptr->dun_level >= 1;
     is_invalid_floor &= ironman_downward;
     return is_special_floor || is_invalid_floor;
@@ -130,7 +130,7 @@ void teleport_level(PlayerType *player_ptr, MONSTER_IDX m_idx)
 
             player_ptr->leaving = true;
         }
-    } else if (quest_number(player_ptr, player_ptr->current_floor_ptr->dun_level)
+    } else if (inside_quest(quest_number(player_ptr, player_ptr->current_floor_ptr->dun_level))
         || (player_ptr->current_floor_ptr->dun_level >= d_info[player_ptr->dungeon_idx].maxdepth)) {
 #ifdef JP
         if (see_m)
@@ -150,7 +150,7 @@ void teleport_level(PlayerType *player_ptr, MONSTER_IDX m_idx)
             prepare_change_floor_mode(player_ptr, CFM_SAVE_FLOORS | CFM_UP | CFM_RAND_PLACE | CFM_RAND_CONNECT);
 
             leave_quest_check(player_ptr);
-            player_ptr->current_floor_ptr->quest_number = 0;
+            player_ptr->current_floor_ptr->quest_number = QuestId::NONE;
             player_ptr->leaving = true;
         }
     } else if (go_up) {
@@ -357,7 +357,7 @@ bool recall_player(PlayerType *player_ptr, TIME_EFFECT turns)
 
     bool is_special_floor = is_in_dungeon(player_ptr);
     is_special_floor &= max_dlv[player_ptr->dungeon_idx] > player_ptr->current_floor_ptr->dun_level;
-    is_special_floor &= !player_ptr->current_floor_ptr->quest_number;
+    is_special_floor &= !inside_quest(player_ptr->current_floor_ptr->quest_number);
     is_special_floor &= !player_ptr->word_recall;
     if (is_special_floor) {
         if (get_check(_("ここは最深到達階より浅い階です。この階に戻って来ますか? ", "Reset recall depth? "))) {
@@ -396,9 +396,9 @@ bool free_level_recall(PlayerType *player_ptr)
 
     DEPTH max_depth = d_info[select_dungeon].maxdepth;
     if (select_dungeon == DUNGEON_ANGBAND) {
-        if (quest[QUEST_OBERON].status != QuestStatusType::FINISHED)
+        if (quest[enum2i(QuestId::OBERON)].status != QuestStatusType::FINISHED)
             max_depth = 98;
-        else if (quest[QUEST_SERPENT].status != QuestStatusType::FINISHED)
+        else if (quest[enum2i(QuestId::SERPENT)].status != QuestStatusType::FINISHED)
             max_depth = 99;
     }
 
@@ -412,7 +412,7 @@ bool free_level_recall(PlayerType *player_ptr)
     player_ptr->recall_dungeon = select_dungeon;
     max_dlv[player_ptr->recall_dungeon]
         = ((amt > d_info[select_dungeon].maxdepth) ? d_info[select_dungeon].maxdepth
-                                                   : ((amt < d_info[select_dungeon].mindepth) ? d_info[select_dungeon].mindepth : amt));
+                                                                                   : ((amt < d_info[select_dungeon].mindepth) ? d_info[select_dungeon].mindepth : amt));
     if (record_maxdepth)
         exe_write_diary(player_ptr, DIARY_TRUMP, select_dungeon, _("トランプタワーで", "at Trump Tower"));
 
index 1f78716..0ac6888 100644 (file)
@@ -65,7 +65,7 @@ void call_the_void(PlayerType *player_ptr)
         return;
     }
 
-    bool is_special_fllor = floor_ptr->quest_number && quest_type::is_fixed(floor_ptr->quest_number);
+    bool is_special_fllor = inside_quest(floor_ptr->quest_number) && quest_type::is_fixed(floor_ptr->quest_number);
     is_special_fllor |= floor_ptr->dun_level > 0;
     if (is_special_fllor) {
         msg_print(_("地面が揺れた。", "The ground trembles."));
@@ -104,7 +104,7 @@ void call_the_void(PlayerType *player_ptr)
 bool vanish_dungeon(PlayerType *player_ptr)
 {
     auto *floor_ptr = player_ptr->current_floor_ptr;
-    bool is_special_floor = floor_ptr->quest_number && quest_type::is_fixed(floor_ptr->quest_number);
+    bool is_special_floor = inside_quest(floor_ptr->quest_number) && quest_type::is_fixed(floor_ptr->quest_number);
     is_special_floor |= floor_ptr->dun_level > 0;
     if (is_special_floor)
         return false;
index 7c7db2b..59a1da4 100644 (file)
@@ -1,5 +1,6 @@
 #pragma once
 
+#include "dungeon/quest.h"
 #include "floor/floor-base-definitions.h"
 #include "floor/sight-definitions.h"
 #include "monster/monster-timed-effect-types.h"
@@ -51,6 +52,6 @@ struct floor_type {
     POSITION redraw_x[REDRAW_MAX];
 
     bool monster_noise;
-    QUEST_IDX quest_number; /* Inside quest level */
+    QuestId quest_number; /* Inside quest level */
     bool inside_arena; /* Is character inside on_defeat_arena_monster? */
 };
index 12d433d..8c5ed21 100644 (file)
@@ -434,12 +434,12 @@ static int16_t sweep_footing_items(PlayerType *player_ptr, eg_type *eg_ptr)
 static concptr decide_target_floor(PlayerType *player_ptr, eg_type *eg_ptr)
 {
     if (eg_ptr->f_ptr->flags.has(FloorFeatureType::QUEST_ENTER)) {
-        QUEST_IDX old_quest = player_ptr->current_floor_ptr->quest_number;
+        QuestId old_quest = player_ptr->current_floor_ptr->quest_number;
         for (int j = 0; j < 10; j++)
             quest_text[j][0] = '\0';
 
         quest_text_line = 0;
-        player_ptr->current_floor_ptr->quest_number = eg_ptr->g_ptr->special;
+        player_ptr->current_floor_ptr->quest_number = i2enum<QuestId>(eg_ptr->g_ptr->special);
         init_flags = INIT_NAME_ONLY;
         parse_fixed_map(player_ptr, "q_info.txt", 0, 0, 0, 0);
         player_ptr->current_floor_ptr->quest_number = old_quest;
index b5cfe42..e0043e7 100644 (file)
@@ -5,10 +5,10 @@
 #include "monster-race/monster-race.h"
 #include "monster-race/race-flags1.h"
 #include "monster/monster-flag-types.h"
+#include "system//monster-race-definition.h"
 #include "system/artifact-type-definition.h"
 #include "system/floor-type-definition.h"
 #include "system/grid-type-definition.h"
-#include "system//monster-race-definition.h"
 #include "system/monster-type-definition.h"
 #include "system/player-type-definition.h"
 
@@ -311,9 +311,9 @@ bool ang_sort_comp_quest_num(PlayerType *player_ptr, vptr u, vptr v, int a, int
     (void)player_ptr;
     (void)v;
 
-    QUEST_IDX *q_num = (QUEST_IDX *)u;
-    quest_type *qa = &quest[q_num[a]];
-    quest_type *qb = &quest[q_num[b]];
+    QuestId *q_num = (QuestId *)u;
+    quest_type *qa = &quest[enum2i(q_num[a])];
+    quest_type *qb = &quest[enum2i(q_num[b])];
     return (qa->comptime != qb->comptime) ? (qa->comptime < qb->comptime) : (qa->level <= qb->level);
 }
 
@@ -323,8 +323,8 @@ void ang_sort_swap_quest_num(PlayerType *player_ptr, vptr u, vptr v, int a, int
     (void)player_ptr;
     (void)v;
 
-    QUEST_IDX *q_num = (QUEST_IDX *)u;
-    QUEST_IDX tmp = q_num[a];
+    QuestId *q_num = (QuestId *)u;
+    QuestId tmp = q_num[a];
     q_num[a] = q_num[b];
     q_num[b] = tmp;
 }
index 8586b4a..e4e4dfc 100644 (file)
@@ -191,15 +191,15 @@ static std::optional<std::string> search_death_cause(PlayerType *player_ptr)
 #endif
     }
 
-    if (floor_ptr->quest_number && quest_type::is_fixed(floor_ptr->quest_number)) {
+    if (inside_quest(floor_ptr->quest_number) && quest_type::is_fixed(floor_ptr->quest_number)) {
         /* Get the quest text */
         /* Bewere that INIT_ASSIGN resets the cur_num. */
         init_flags = INIT_NAME_ONLY;
         parse_fixed_map(player_ptr, "q_info.txt", 0, 0, 0, 0);
 #ifdef JP
-        return std::string(format("…あなたは、クエスト「%s」で%sに殺された。", quest[floor_ptr->quest_number].name, player_ptr->died_from));
+        return std::string(format("…あなたは、クエスト「%s」で%sに殺された。", quest[enum2i(floor_ptr->quest_number)].name, player_ptr->died_from));
 #else
-        return std::string(format("...You were killed by %s in the quest '%s'.", player_ptr->died_from, quest[floor_ptr->quest_number].name));
+        return std::string(format("...You were killed by %s in the quest '%s'.", player_ptr->died_from, quest[enum2i(floor_ptr->quest_number)].name));
 #endif
     }
 
@@ -219,7 +219,7 @@ static std::optional<std::string> search_death_cause(PlayerType *player_ptr)
 static std::optional<std::string> decide_death_in_quest(PlayerType *player_ptr)
 {
     floor_type *floor_ptr = player_ptr->current_floor_ptr;
-    if (!floor_ptr->quest_number || !quest_type::is_fixed(floor_ptr->quest_number))
+    if (!inside_quest(floor_ptr->quest_number) || !quest_type::is_fixed(floor_ptr->quest_number))
         return std::nullopt;
 
     for (int i = 0; i < 10; i++)
@@ -228,7 +228,7 @@ static std::optional<std::string> decide_death_in_quest(PlayerType *player_ptr)
     quest_text_line = 0;
     init_flags = INIT_NAME_ONLY;
     parse_fixed_map(player_ptr, "q_info.txt", 0, 0, 0, 0);
-    return std::string(format(_("…あなたは現在、 クエスト「%s」を遂行中だ。", "...Now, you are in the quest '%s'."), quest[floor_ptr->quest_number].name));
+    return std::string(format(_("…あなたは現在、 クエスト「%s」を遂行中だ。", "...Now, you are in the quest '%s'."), quest[enum2i(floor_ptr->quest_number)].name));
 }
 
 /*!
index 13d89e4..2364596 100644 (file)
@@ -190,7 +190,7 @@ void print_depth(PlayerType *player_ptr)
         return;
     }
 
-    if (floor_ptr->quest_number && !player_ptr->dungeon_idx) {
+    if (inside_quest(floor_ptr->quest_number) && !player_ptr->dungeon_idx) {
         strcpy(depths, _("地上", "Quest"));
         c_prt(attr, format("%7s", depths), row_depth, col_depth);
         return;
index 6a7b2a8..ec5c12c 100644 (file)
@@ -101,7 +101,7 @@ void wizard_game_modifier(PlayerType *player_ptr)
  * @brief 指定したクエストに突入する
  * @param プレイヤーの情報へのポインタ
  */
-void wiz_enter_quest(PlayerTypeplayer_ptr)
+void wiz_enter_quest(PlayerType *player_ptr)
 {
     char ppp[30];
     char tmp_val[5];
@@ -117,11 +117,11 @@ void wiz_enter_quest(PlayerType* player_ptr)
         return;
 
     init_flags = i2enum<init_flags_type>(INIT_SHOW_TEXT | INIT_ASSIGN);
-    player_ptr->current_floor_ptr->quest_number = (QUEST_IDX)tmp_int;
+    player_ptr->current_floor_ptr->quest_number = i2enum<QuestId>(tmp_int);
     parse_fixed_map(player_ptr, "q_info.txt", 0, 0, 0, 0);
     quest[tmp_int].status = QuestStatusType::TAKEN;
     if (quest[tmp_int].dungeon == 0)
-        exe_enter_quest(player_ptr, (QUEST_IDX)tmp_int);
+        exe_enter_quest(player_ptr, i2enum<QuestId>(tmp_int));
 }
 
 /*!
@@ -130,13 +130,13 @@ void wiz_enter_quest(PlayerType* player_ptr)
  */
 void wiz_complete_quest(PlayerType *player_ptr)
 {
-    if (!player_ptr->current_floor_ptr->quest_number) {
+    if (!inside_quest(player_ptr->current_floor_ptr->quest_number)) {
         msg_print("No current quest");
         msg_print(nullptr);
         return;
     }
 
-    if (quest[player_ptr->current_floor_ptr->quest_number].status == QuestStatusType::TAKEN)
+    if (quest[enum2i(player_ptr->current_floor_ptr->quest_number)].status == QuestStatusType::TAKEN)
         complete_quest(player_ptr, player_ptr->current_floor_ptr->quest_number);
 }
 
index 4e8e88e..8f192c5 100644 (file)
@@ -827,8 +827,8 @@ void cheat_death(PlayerType *player_ptr)
     floor_ptr->dun_level = 0;
     floor_ptr->inside_arena = false;
     player_ptr->phase_out = false;
-    leaving_quest = 0;
-    floor_ptr->quest_number = 0;
+    leaving_quest = QuestId::NONE;
+    floor_ptr->quest_number = QuestId::NONE;
     if (player_ptr->dungeon_idx)
         player_ptr->recall_dungeon = player_ptr->dungeon_idx;
     player_ptr->dungeon_idx = 0;
index 4d52904..323f363 100644 (file)
@@ -64,7 +64,7 @@ void execute_recall(PlayerType *player_ptr)
 
     disturb(player_ptr, false, true);
     floor_type *floor_ptr = player_ptr->current_floor_ptr;
-    if (floor_ptr->dun_level || player_ptr->current_floor_ptr->quest_number || player_ptr->enter_dungeon) {
+    if (floor_ptr->dun_level || inside_quest(player_ptr->current_floor_ptr->quest_number) || player_ptr->enter_dungeon) {
         msg_print(_("上に引っ張りあげられる感じがする!", "You feel yourself yanked upwards!"));
         if (player_ptr->dungeon_idx)
             player_ptr->recall_dungeon = player_ptr->dungeon_idx;
@@ -75,7 +75,7 @@ void execute_recall(PlayerType *player_ptr)
         player_ptr->dungeon_idx = 0;
         leave_quest_check(player_ptr);
         leave_tower_check(player_ptr);
-        player_ptr->current_floor_ptr->quest_number = 0;
+        player_ptr->current_floor_ptr->quest_number = QuestId::NONE;
         player_ptr->leaving = true;
         sound(SOUND_TPLEVEL);
         return;
@@ -140,7 +140,7 @@ void execute_floor_reset(PlayerType *player_ptr)
         return;
 
     disturb(player_ptr, false, true);
-    if (!quest_number(player_ptr, floor_ptr->dun_level) && floor_ptr->dun_level) {
+    if (!inside_quest(quest_number(player_ptr, floor_ptr->dun_level)) && floor_ptr->dun_level) {
         msg_print(_("世界が変わった!", "The world changes!"));
 
         /*
index 164d611..51089c2 100644 (file)
@@ -217,7 +217,7 @@ void WorldTurnProcessor::decide_auto_save()
 void WorldTurnProcessor::process_change_daytime_night()
 {
     auto *floor_ptr = this->player_ptr->current_floor_ptr;
-    if (!floor_ptr->dun_level && !floor_ptr->quest_number && !this->player_ptr->phase_out && !floor_ptr->inside_arena) {
+    if (!floor_ptr->dun_level && !inside_quest(floor_ptr->quest_number) && !this->player_ptr->phase_out && !floor_ptr->inside_arena) {
         if (!(w_ptr->game_turn % ((TURNS_PER_TICK * TOWN_DAWN) / 2))) {
             auto dawn = w_ptr->game_turn % (TURNS_PER_TICK * TOWN_DAWN) == 0;
             if (dawn) {
@@ -231,7 +231,7 @@ void WorldTurnProcessor::process_change_daytime_night()
     }
 
     auto is_in_dungeon = vanilla_town;
-    is_in_dungeon |= lite_town && (floor_ptr->quest_number == 0) && !this->player_ptr->phase_out && !floor_ptr->inside_arena;
+    is_in_dungeon |= lite_town && (!inside_quest(floor_ptr->quest_number)) && !this->player_ptr->phase_out && !floor_ptr->inside_arena;
     is_in_dungeon &= floor_ptr->dun_level != 0;
     if (!is_in_dungeon) {
         return;
@@ -302,7 +302,7 @@ void WorldTurnProcessor::decide_alloc_monster()
     auto *floor_ptr = this->player_ptr->current_floor_ptr;
     auto should_alloc = one_in_(d_info[this->player_ptr->dungeon_idx].max_m_alloc_chance);
     should_alloc &= !floor_ptr->inside_arena;
-    should_alloc &= floor_ptr->quest_number == 0;
+    should_alloc &= !inside_quest(floor_ptr->quest_number);
     should_alloc &= !this->player_ptr->phase_out;
     if (should_alloc) {
         (void)alloc_monster(this->player_ptr, MAX_SIGHT + 5, 0, summon_specific);