OSDN Git Service

[Refactor] #2610 ARTIFACT_IDX 型エイリアスを廃止した
authorHourier <66951241+Hourier@users.noreply.github.com>
Sat, 10 Sep 2022 05:36:53 +0000 (14:36 +0900)
committerHourier <66951241+Hourier@users.noreply.github.com>
Sun, 11 Sep 2022 06:32:13 +0000 (15:32 +0900)
14 files changed:
src/artifact/random-art-generator.cpp
src/dungeon/quest.cpp
src/dungeon/quest.h
src/flavor/named-item-describer.cpp
src/floor/fixed-map-generator.cpp
src/info-reader/general-parser.cpp
src/knowledge/knowledge-items.cpp
src/knowledge/knowledge-quests.cpp
src/load/quest-loader.cpp
src/object-hook/hook-quest.cpp
src/player-info/alignment.cpp
src/save/save.cpp
src/system/h-type.h
src/wizard/wizard-item-modifier.cpp

index 8d7e2fa..04f7ae9 100644 (file)
@@ -6,6 +6,7 @@
  */
 
 #include "artifact/random-art-generator.h"
+#include "artifact/fixed-art-types.h"
 #include "artifact/random-art-activation.h"
 #include "artifact/random-art-bias-types.h"
 #include "artifact/random-art-characteristics.h"
@@ -430,7 +431,7 @@ static void generate_unnatural_random_artifact(
 bool become_random_artifact(PlayerType *player_ptr, ObjectType *o_ptr, bool a_scroll)
 {
     o_ptr->artifact_bias = 0;
-    o_ptr->fixed_artifact_idx = i2enum<FixedArtifactId>(0);
+    o_ptr->fixed_artifact_idx = FixedArtifactId::NONE;
     o_ptr->ego_idx = EgoType::NONE;
     o_ptr->art_flags |= k_info[o_ptr->k_idx].flags;
 
index 4b7429f..591c0d6 100644 (file)
@@ -278,7 +278,7 @@ void check_find_art_quest_completion(PlayerType *player_ptr, ObjectType *o_ptr)
     for (const auto &[q_idx, q_ref] : quest_list) {
         auto found_artifact = (q_ref.type == QuestKindType::FIND_ARTIFACT);
         found_artifact &= (q_ref.status == QuestStatusType::TAKEN);
-        found_artifact &= (i2enum<FixedArtifactId>(q_ref.k_idx) == o_ptr->fixed_artifact_idx);
+        found_artifact &= (q_ref.reward_artifact_idx == o_ptr->fixed_artifact_idx);
         if (found_artifact) {
             complete_quest(player_ptr, q_idx);
         }
@@ -411,7 +411,7 @@ void leave_quest_check(PlayerType *player_ptr)
         quest_list[QuestId::TOWER1].complev = player_ptr->lev;
         break;
     case QuestKindType::FIND_ARTIFACT:
-        a_info[q_ptr->k_idx].gen_flags.reset(ItemGenerationTraitType::QUESTITEM);
+        a_info[enum2i(q_ptr->reward_artifact_idx)].gen_flags.reset(ItemGenerationTraitType::QUESTITEM);
         break;
     case QuestKindType::RANDOM:
         r_info[q_ptr->r_idx].flags1 &= ~(RF1_QUESTOR);
index 3b68c57..2dfe1a4 100644 (file)
@@ -6,6 +6,7 @@
 #include <map>
 #include <vector>
 
+enum class FixedArtifactId : short;
 enum class MonsterRaceId : int16_t;
 
 // clang-format off
@@ -111,7 +112,7 @@ public:
     MONSTER_NUMBER cur_num; /*!< 撃破したモンスターの数 / Number killed */
     MONSTER_NUMBER max_num; /*!< 求められるモンスターの撃破数 / Number required */
 
-    KIND_OBJECT_IDX k_idx; /*!< クエスト対象のアイテムID / object index */
+    FixedArtifactId reward_artifact_idx; /*!< クエスト対象のアイテムID / object index */
     MONSTER_NUMBER num_mon; /*!< QuestKindTypeがKILL_NUMBER時の目標撃破数 number of monsters on level */
 
     BIT_FLAGS flags; /*!< クエストに関するフラグビット / quest flags */
index 11e835f..2f613f6 100644 (file)
@@ -320,7 +320,7 @@ static void describe_artifact_body_en(flavor_type *flavor_ptr)
     }
 
     if (flavor_ptr->o_ptr->is_fixed_artifact()) {
-        auto *a_ptr = &a_info[flavor_ptr->o_ptr->fixed_artifact_idx];
+        auto *a_ptr = &a_info[enum2i(flavor_ptr->o_ptr->fixed_artifact_idx)];
         flavor_ptr->t = object_desc_chr(flavor_ptr->t, ' ');
         flavor_ptr->t = object_desc_str(flavor_ptr->t, a_ptr->name.c_str());
         return;
index c8b96b9..f29c66f 100644 (file)
@@ -221,7 +221,7 @@ static bool parse_qtw_QQ(quest_type *q_ptr, char **zz, int num)
     q_ptr->max_num = (MONSTER_NUMBER)atoi(zz[5]);
     q_ptr->level = (DEPTH)atoi(zz[6]);
     q_ptr->r_idx = i2enum<MonsterRaceId>(atoi(zz[7]));
-    q_ptr->k_idx = (KIND_OBJECT_IDX)atoi(zz[8]);
+    q_ptr->reward_artifact_idx = i2enum<FixedArtifactId>(atoi(zz[8]));
     q_ptr->dungeon = (DUNGEON_IDX)atoi(zz[9]);
 
     if (num > 10) {
@@ -233,7 +233,7 @@ static bool parse_qtw_QQ(quest_type *q_ptr, char **zz, int num)
         r_ptr->flags1 |= RF1_QUESTOR;
     }
 
-    a_ptr = &a_info[q_ptr->k_idx];
+    a_ptr = &a_info[enum2i(q_ptr->reward_artifact_idx)];
     a_ptr->gen_flags.set(ItemGenerationTraitType::QUESTITEM);
     return true;
 }
@@ -252,24 +252,26 @@ static bool parse_qtw_QR(quest_type *q_ptr, char **zz, int num)
     }
 
     int count = 0;
-    ARTIFACT_IDX idx, reward_idx = 0;
-    for (idx = 2; idx < num; idx++) {
-        ARTIFACT_IDX a_idx = (ARTIFACT_IDX)atoi(zz[idx]);
-        if (a_idx < 1) {
+    FixedArtifactId reward_idx = FixedArtifactId::NONE;
+    for (auto idx = 2; idx < num; idx++) {
+        const auto a_idx = i2enum<FixedArtifactId>(atoi(zz[idx]));
+        if (a_idx == FixedArtifactId::NONE) {
             continue;
         }
-        if (a_info[a_idx].is_generated) {
+
+        if (a_info[enum2i(a_idx)].is_generated) {
             continue;
         }
+
         count++;
         if (one_in_(count)) {
             reward_idx = a_idx;
         }
     }
 
-    if (reward_idx) {
-        q_ptr->k_idx = (KIND_OBJECT_IDX)reward_idx;
-        a_info[reward_idx].gen_flags.set(ItemGenerationTraitType::QUESTITEM);
+    if (reward_idx != FixedArtifactId::NONE) {
+        q_ptr->reward_artifact_idx = reward_idx;
+        a_info[enum2i(reward_idx)].gen_flags.set(ItemGenerationTraitType::QUESTITEM);
     } else {
         q_ptr->type = QuestKindType::KILL_ALL;
     }
index 129bf3b..dc561f9 100644 (file)
@@ -119,7 +119,7 @@ parse_error_type parse_line_feature(floor_type *floor_ptr, char *buf)
         } else if (zz[6][0] == '!') {
             if (inside_quest(floor_ptr->quest_number)) {
                 const auto &quest_list = QuestList::get_instance();
-                letter[index].artifact = i2enum<FixedArtifactId>(quest_list[floor_ptr->quest_number].k_idx);
+                letter[index].artifact = quest_list[floor_ptr->quest_number].reward_artifact_idx;
             }
         } else {
             letter[index].artifact = i2enum<FixedArtifactId>(atoi(zz[6]));
@@ -144,9 +144,9 @@ parse_error_type parse_line_feature(floor_type *floor_ptr, char *buf)
         } else if (zz[4][0] == '!') {
             if (inside_quest(floor_ptr->quest_number)) {
                 const auto &quest_list = QuestList::get_instance();
-                ARTIFACT_IDX a_idx = quest_list[floor_ptr->quest_number].k_idx;
-                if (a_idx) {
-                    auto *a_ptr = &a_info[a_idx];
+                const auto a_idx = quest_list[floor_ptr->quest_number].reward_artifact_idx;
+                if (a_idx != FixedArtifactId::NONE) {
+                    const auto *a_ptr = &a_info[enum2i(a_idx)];
                     if (a_ptr->gen_flags.has_not(ItemGenerationTraitType::INSTA_ART)) {
                         letter[index].object = lookup_kind(a_ptr->tval, a_ptr->sval);
                     }
index d8bb3eb..936958d 100644 (file)
@@ -81,7 +81,7 @@ void do_cmd_knowledge_artifacts(PlayerType *player_ptr)
         }
     }
 
-    for (ARTIFACT_IDX i = 0; i < INVEN_TOTAL; i++) {
+    for (auto i = 0; i < INVEN_TOTAL; i++) {
         auto *o_ptr = &player_ptr->inventory_list[i];
         if (!o_ptr->k_idx) {
             continue;
@@ -109,8 +109,8 @@ void do_cmd_knowledge_artifacts(PlayerType *player_ptr)
         auto *a_ptr = &a_info[enum2i(a_idx)];
         GAME_TEXT base_name[MAX_NLEN];
         strcpy(base_name, _("未知の伝説のアイテム", "Unknown Artifact"));
-        ARTIFACT_IDX z = lookup_kind(a_ptr->tval, a_ptr->sval);
-        if (z) {
+        const auto z = lookup_kind(a_ptr->tval, a_ptr->sval);
+        if (z != 0) {
             ObjectType forge;
             ObjectType *q_ptr;
             q_ptr = &forge;
index c22f4a7..060036e 100644 (file)
@@ -5,6 +5,7 @@
  */
 
 #include "knowledge/knowledge-quests.h"
+#include "artifact/fixed-art-types.h"
 #include "core/show-file.h"
 #include "dungeon/dungeon.h"
 #include "dungeon/quest.h"
@@ -22,6 +23,7 @@
 #include "system/player-type-definition.h"
 #include "term/screen-processor.h"
 #include "util/angband-files.h"
+#include "util/enum-converter.h"
 #include "util/sort.h"
 #include "world/world.h"
 
@@ -98,13 +100,13 @@ static void do_cmd_knowledge_quests_current(PlayerType *player_ptr, FILE *fff)
                     break;
 
                 case QuestKindType::FIND_ARTIFACT:
-                    if (q_ref.k_idx) {
-                        auto *a_ptr = &a_info[q_ref.k_idx];
+                    if (q_ref.reward_artifact_idx != FixedArtifactId::NONE) {
+                        auto *a_ptr = &a_info[enum2i(q_ref.reward_artifact_idx)];
                         ObjectType forge;
                         auto *o_ptr = &forge;
                         KIND_OBJECT_IDX k_idx = lookup_kind(a_ptr->tval, a_ptr->sval);
                         o_ptr->prep(k_idx);
-                        o_ptr->fixed_artifact_idx = i2enum<FixedArtifactId>(q_ref.k_idx);
+                        o_ptr->fixed_artifact_idx = q_ref.reward_artifact_idx;
                         o_ptr->ident = IDENT_STORE;
                         describe_flavor(player_ptr, name, o_ptr, OD_NAME_ONLY);
                     }
index 94516da..bcad92c 100644 (file)
@@ -1,4 +1,5 @@
 #include "load/quest-loader.h"
+#include "artifact/fixed-art-types.h"
 #include "dungeon/quest.h"
 #include "floor/floor-town.h"
 #include "load/angband-version-comparer.h"
@@ -69,9 +70,9 @@ static void load_quest_details(PlayerType *player_ptr, quest_type *q_ptr, const
         auto &quest_list = QuestList::get_instance();
         determine_random_questor(player_ptr, &quest_list[loading_quest_index]);
     }
-    q_ptr->k_idx = rd_s16b();
-    if (q_ptr->k_idx) {
-        a_info[q_ptr->k_idx].gen_flags.set(ItemGenerationTraitType::QUESTITEM);
+    q_ptr->reward_artifact_idx = i2enum<FixedArtifactId>(rd_s16b());
+    if (q_ptr->reward_artifact_idx != FixedArtifactId::NONE) {
+        a_info[enum2i(q_ptr->reward_artifact_idx)].gen_flags.set(ItemGenerationTraitType::QUESTITEM);
     }
 
     q_ptr->flags = rd_byte();
index 725a029..8bde8b9 100644 (file)
@@ -1,4 +1,5 @@
 #include "object-hook/hook-quest.h"
+#include "artifact/fixed-art-types.h"
 #include "cmd-building/cmd-building.h"
 #include "dungeon/quest.h"
 #include "game-option/birth-options.h"
@@ -10,6 +11,7 @@
 #include "system/monster-race-definition.h"
 #include "system/object-type-definition.h"
 #include "system/player-type-definition.h"
+#include "util/enum-converter.h"
 #include "world/world.h"
 
 /*!
@@ -51,12 +53,12 @@ bool object_is_quest_target(QuestId quest_idx, ObjectType *o_ptr)
     }
 
     const auto &quest_list = QuestList::get_instance();
-    auto a_idx = quest_list[quest_idx].k_idx;
-    if (a_idx == 0) {
+    auto a_idx = quest_list[quest_idx].reward_artifact_idx;
+    if (a_idx == FixedArtifactId::NONE) {
         return false;
     }
 
-    auto *a_ptr = &a_info[a_idx];
+    auto *a_ptr = &a_info[enum2i(a_idx)];
     if (a_ptr->gen_flags.has(ItemGenerationTraitType::INSTA_ART)) {
         return false;
     }
index c44cd1b..7e37686 100644 (file)
@@ -91,7 +91,7 @@ void PlayerAlignment::update_alignment()
     }
 
     for (int i = 0; i < 2; i++) {
-        const auto wielding_weapon = this->player_ptr->inventory_list[INVEN_MAIN_HAND + i];
+        const auto &wielding_weapon = this->player_ptr->inventory_list[INVEN_MAIN_HAND + i];
         if (!has_melee_weapon(this->player_ptr, INVEN_MAIN_HAND + i) || (wielding_weapon.fixed_artifact_idx != FixedArtifactId::IRON_BALL)) {
             continue;
         }
index f4da17f..d0a7a64 100644 (file)
@@ -149,7 +149,7 @@ static bool wr_savefile_new(PlayerType *player_ptr, SaveType type)
         wr_s16b((int16_t)q_ref.max_num);
         wr_s16b(enum2i(q_ref.type));
         wr_s16b(enum2i(q_ref.r_idx));
-        wr_s16b(q_ref.k_idx);
+        wr_s16b(enum2i(q_ref.reward_artifact_idx));
         wr_byte((byte)q_ref.flags);
         wr_byte((byte)q_ref.dungeon);
     }
index ba7e1bf..dcc2b19 100644 (file)
@@ -82,7 +82,6 @@ typedef int16_t FLOOR_IDX; /*!< ゲーム中のフロアID型を定義 */
 // typedef int16_t MonsterRaceId; /*!< @todo MonsterRaceIdに差し替えて消滅させる ゲーム中のモンスター種族ID型を定義 */
 typedef int16_t MONSTER_IDX; /*!< @todo MonsterRaceIdに差し替えて消滅させる ゲーム中のモンスター個体ID型を定義 */
 typedef int16_t DUNGEON_IDX; /*!< ゲーム中のダンジョンID型を定義 */
-typedef int16_t ARTIFACT_IDX; /*!< ゲーム中のアーティファクトID型を定義 */
 typedef int16_t EGO_IDX; /*!< アイテムエゴのID型を定義 */
 typedef int16_t QUEST_IDX; /*!< ゲーム中のクエストID型を定義 */
 
index 48e3d33..6247863 100644 (file)
@@ -99,7 +99,7 @@ T clamp_cast(int val)
         static_cast<int>(std::numeric_limits<T>::max())));
 }
 
-void wiz_restore_aware_flag_of_fixed_arfifact(ARTIFACT_IDX a_idx, bool aware = false);
+void wiz_restore_aware_flag_of_fixed_arfifact(FixedArtifactId a_idx, bool aware = false);
 void wiz_modify_item_activation(PlayerType *player_ptr);
 void wiz_identify_full_inventory(PlayerType *player_ptr);
 
@@ -123,10 +123,10 @@ void wizard_item_modifier(PlayerType *player_ptr)
     case '\r':
         break;
     case 'a':
-        wiz_restore_aware_flag_of_fixed_arfifact(command_arg);
+        wiz_restore_aware_flag_of_fixed_arfifact(i2enum<FixedArtifactId>(command_arg));
         break;
     case 'A':
-        wiz_restore_aware_flag_of_fixed_arfifact(command_arg, true);
+        wiz_restore_aware_flag_of_fixed_arfifact(i2enum<FixedArtifactId>(command_arg), true);
         break;
     case 'e':
         if (command_arg <= 0) {
@@ -173,10 +173,12 @@ void wizard_item_modifier(PlayerType *player_ptr)
 /*!
  * @brief 固定アーティファクトの出現フラグをリセットする
  * @param a_idx 指定したアーティファクトID
+ * @details 外からはenum class を受け取るが、この関数内では数値の直指定処理なので即数値型にキャストする.
  */
-void wiz_restore_aware_flag_of_fixed_arfifact(ARTIFACT_IDX a_idx, bool aware)
+void wiz_restore_aware_flag_of_fixed_arfifact(FixedArtifactId a_idx, bool aware)
 {
-    if (a_idx <= 0) {
+    auto int_a_idx = enum2i(a_idx);
+    if (int_a_idx <= 0) {
         char tmp[80] = "";
         sprintf(tmp, "Artifact ID (1-%d): ", static_cast<int>(a_info.size()) - 1);
         char tmp_val[10] = "";
@@ -184,15 +186,15 @@ void wiz_restore_aware_flag_of_fixed_arfifact(ARTIFACT_IDX a_idx, bool aware)
             return;
         }
 
-        a_idx = (ARTIFACT_IDX)atoi(tmp_val);
+        int_a_idx = static_cast<short>(atoi(tmp_val));
     }
 
-    if (a_idx <= 0 || a_idx >= static_cast<ARTIFACT_IDX>(a_info.size())) {
+    if (int_a_idx <= 0 || int_a_idx >= static_cast<short>(a_info.size())) {
         msg_format(_("番号は1から%dの間で指定して下さい。", "ID must be between 1 to %d."), a_info.size() - 1);
         return;
     }
 
-    auto *a_ptr = &a_info[a_idx];
+    auto *a_ptr = &a_info[int_a_idx];
     a_ptr->is_generated = aware;
     msg_print(aware ? "Modified." : "Restored.");
 }