OSDN Git Service

[Refactor] セーブデータのバージョンを18に
authorSlimebreath6078 <slimebreath6078@yahoo.co.jp>
Sat, 12 Mar 2022 08:13:01 +0000 (17:13 +0900)
committerSlimebreath6078 <slimebreath6078@yahoo.co.jp>
Sat, 12 Mar 2022 08:50:43 +0000 (17:50 +0900)
ドロップフラグのリファクタリング前後で互換性を取るため

src/load/lore-loader.cpp
src/load/savedata-old-flag-types.h
src/save/monster-writer.cpp
src/system/angband-version.h

index a0fee5c..935def8 100644 (file)
@@ -12,6 +12,7 @@
 #include "system/angband.h"
 #include "system/monster-race-definition.h"
 #include "util/bit-flags-calculator.h"
+#include "util/enum-converter.h"
 
 static void migrate_old_aura_flags(monster_race *r_ptr)
 {
@@ -71,6 +72,43 @@ static void migrate_old_resistance_flags(monster_race *r_ptr, BIT_FLAGS old_flag
     }
 }
 
+static void migrate_old_drop_flags(monster_race *r_ptr, BIT_FLAGS old_flags1)
+{
+    struct flag_list_ver18 {
+        SavedataLoreOlderThan18FlagType old_flag;
+        MonsterDropType flag;
+    };
+
+    std::vector<flag_list_ver18> flag_list = {
+        { SavedataLoreOlderThan18FlagType::RF1_ONLY_GOLD, MonsterDropType::ONLY_GOLD },
+        { SavedataLoreOlderThan18FlagType::RF1_ONLY_ITEM, MonsterDropType::ONLY_ITEM },
+        { SavedataLoreOlderThan18FlagType::RF1_DROP_GOOD, MonsterDropType::DROP_GOOD },
+        { SavedataLoreOlderThan18FlagType::RF1_DROP_GREAT, MonsterDropType::DROP_GREAT },
+        { SavedataLoreOlderThan18FlagType::RF1_DROP_60, MonsterDropType::DROP_60 },
+        { SavedataLoreOlderThan18FlagType::RF1_DROP_90, MonsterDropType::DROP_90 },
+        { SavedataLoreOlderThan18FlagType::RF1_DROP_1D2, MonsterDropType::DROP_1D2 },
+        { SavedataLoreOlderThan18FlagType::RF1_DROP_2D2, MonsterDropType::DROP_2D2 },
+        { SavedataLoreOlderThan18FlagType::RF1_DROP_3D2, MonsterDropType::DROP_3D2 },
+        { SavedataLoreOlderThan18FlagType::RF1_DROP_4D2, MonsterDropType::DROP_4D2 },
+    };
+
+    for (const auto &l : flag_list) {
+        if (any_bits(old_flags1, enum2i(l.old_flag))) {
+            r_ptr->r_drop_flags.set(l.flag);
+        }
+    }
+}
+
+static void rd_r_drop_flags(monster_race *r_ptr)
+{
+    if (loading_savefile_version_is_older_than(18)) {
+        migrate_old_drop_flags(r_ptr, r_ptr->r_flags1);
+        return;
+    }
+
+    rd_FlagGroup(r_ptr->r_drop_flags, rd_byte);
+}
+
 static void rd_r_ability_flags(monster_race *r_ptr, const MonsterRaceId r_idx)
 {
     if (loading_savefile_version_is_older_than(3)) {
@@ -257,6 +295,7 @@ static void rd_lore(monster_race *r_ptr, const MonsterRaceId r_idx)
     rd_r_aura_flags(r_ptr);
     rd_r_behavior_flags(r_ptr);
     rd_r_kind_flags(r_ptr);
+    rd_r_drop_flags(r_ptr);
     r_ptr->max_num = rd_byte();
     r_ptr->floor_id = rd_s16b();
 
@@ -274,6 +313,7 @@ static void rd_lore(monster_race *r_ptr, const MonsterRaceId r_idx)
     r_ptr->r_ability_flags &= r_ptr->ability_flags;
     r_ptr->r_aura_flags &= r_ptr->aura_flags;
     r_ptr->r_behavior_flags &= r_ptr->behavior_flags;
+    r_ptr->r_drop_flags &= r_ptr->drop_flags;
     r_ptr->r_kind_flags &= r_ptr->kind_flags;
 }
 
index 786031b..747b977 100644 (file)
@@ -53,6 +53,19 @@ enum class SavedataLoreOlderThan14FlagType {
     RFR_RES_TELE = 0x00100000, /* Resist teleportation */
 };
 
+enum class SavedataLoreOlderThan18FlagType {
+    RF1_ONLY_GOLD = 0x00100000, /*!< モンスター特性: 財宝しか落とさない / Drop only gold */
+    RF1_ONLY_ITEM = 0x00200000, /*!< モンスター特性: アイテムしか落とさない / Drop only items */
+    RF1_DROP_60 = 0x00400000, /*!< モンスター特性: 落とすアイテム数60%で+1/ Drop an item/gold (60%) */
+    RF1_DROP_90 = 0x00800000, /*!< モンスター特性: 落とすアイテム数90%で+1 / Drop an item/gold (90%) */
+    RF1_DROP_1D2 = 0x01000000, /*!< モンスター特性: 落とすアイテム数+1d2 / Drop 1d2 items/gold */
+    RF1_DROP_2D2 = 0x02000000, /*!< モンスター特性: 落とすアイテム数+2d2 / Drop 2d2 items/gold */
+    RF1_DROP_3D2 = 0x04000000, /*!< モンスター特性: 落とすアイテム数+3d2 / Drop 3d2 items/gold */
+    RF1_DROP_4D2 = 0x08000000, /*!< モンスター特性: 落とすアイテム数+4d2 / Drop 4d2 items/gold */
+    RF1_DROP_GOOD = 0x10000000, /*!< モンスター特性: 必ず上質品をドロップする / Drop good items */
+    RF1_DROP_GREAT = 0x20000000, /*!< モンスター特性: 必ず高級品をドロップする / Drop great items */
+};
+
 enum class OldQuestId15 {
     CITY_SEA = 17,
 };
index daf6860..d348095 100644 (file)
@@ -213,6 +213,7 @@ void wr_lore(MonsterRaceId r_idx)
     wr_FlagGroup(r_ptr->r_aura_flags, wr_byte);
     wr_FlagGroup(r_ptr->r_behavior_flags, wr_byte);
     wr_FlagGroup(r_ptr->r_kind_flags, wr_byte);
+    wr_FlagGroup(r_ptr->r_drop_flags, wr_byte);
 
     wr_byte((byte)r_ptr->max_num);
     wr_s16b(r_ptr->floor_id);
index 0ef4883..9a44bf5 100644 (file)
@@ -28,7 +28,7 @@ constexpr std::string_view ROOT_VARIANT_NAME("Hengband");
 /*!
  * @brief セーブファイルのバージョン(3.0.0から導入)
  */
-constexpr uint32_t SAVEFILE_VERSION = 17;
+constexpr uint32_t SAVEFILE_VERSION = 18;
 
 /*!
  * @brief バージョンが開発版が安定版かを返す(廃止予定)