OSDN Git Service

[Refactor] セーブデータのバージョンを19に
authorSlimebreath6078 <slimebreath6078@yahoo.co.jp>
Sun, 3 Apr 2022 14:16:51 +0000 (23:16 +0900)
committerSlimebreath6078 <slimebreath6078@yahoo.co.jp>
Sat, 9 Apr 2022 13:49:15 +0000 (22:49 +0900)
src/load/lore-loader.cpp
src/load/savedata-old-flag-types.h
src/save/monster-writer.cpp
src/system/angband-version.h

index 935def8..10c97a1 100644 (file)
 #include "util/bit-flags-calculator.h"
 #include "util/enum-converter.h"
 
+static void migrate_old_feature_flags(monster_race *r_ptr, BIT_FLAGS old_flags)
+{
+    if (any_bits(old_flags, enum2i(SavedataLoreOlderThan19FlagType::RF2_PASS_WALL))) {
+        r_ptr->r_feature_flags.set(MonsterFeatureType::PASS_WALL);
+    }
+    if (any_bits(old_flags, enum2i(SavedataLoreOlderThan19FlagType::RF2_KILL_WALL))) {
+        r_ptr->r_feature_flags.set(MonsterFeatureType::KILL_WALL);
+    }
+}
+
 static void migrate_old_aura_flags(monster_race *r_ptr)
 {
-    if (loading_savefile_version_is_older_than(10)) {
-        if (any_bits(r_ptr->r_flags2, SavedataLoreOlderThan10FlagType::AURA_FIRE_OLD)) {
-            r_ptr->r_aura_flags.set(MonsterAuraType::FIRE);
-        }
+    if (any_bits(r_ptr->r_flags2, SavedataLoreOlderThan10FlagType::AURA_FIRE_OLD)) {
+        r_ptr->r_aura_flags.set(MonsterAuraType::FIRE);
+    }
 
-        if (any_bits(r_ptr->r_flags3, SavedataLoreOlderThan10FlagType::AURA_COLD_OLD)) {
-            r_ptr->r_aura_flags.set(MonsterAuraType::COLD);
-        }
+    if (any_bits(r_ptr->r_flags3, SavedataLoreOlderThan10FlagType::AURA_COLD_OLD)) {
+        r_ptr->r_aura_flags.set(MonsterAuraType::COLD);
+    }
 
-        if (any_bits(r_ptr->r_flags2, SavedataLoreOlderThan10FlagType::AURA_ELEC_OLD)) {
-            r_ptr->r_aura_flags.set(MonsterAuraType::ELEC);
-        }
+    if (any_bits(r_ptr->r_flags2, SavedataLoreOlderThan10FlagType::AURA_ELEC_OLD)) {
+        r_ptr->r_aura_flags.set(MonsterAuraType::ELEC);
     }
 }
 
@@ -248,6 +256,15 @@ static void rd_r_behavior_flags(monster_race *r_ptr)
     rd_FlagGroup(r_ptr->r_behavior_flags, rd_byte);
 }
 
+static void rd_r_feature_flags(monster_race *r_ptr)
+{
+    if (loading_savefile_version_is_older_than(19)) {
+        migrate_old_feature_flags(r_ptr, r_ptr->r_flags2);
+        return;
+    }
+    rd_FlagGroup(r_ptr->r_feature_flags, rd_byte);
+}
+
 /*!
  * @brief モンスターの思い出を読み込む / Read the monster lore
  * @param r_ptr 読み込み先モンスター種族情報へのポインタ
@@ -296,6 +313,7 @@ static void rd_lore(monster_race *r_ptr, const MonsterRaceId r_idx)
     rd_r_behavior_flags(r_ptr);
     rd_r_kind_flags(r_ptr);
     rd_r_drop_flags(r_ptr);
+    rd_r_feature_flags(r_ptr);
     r_ptr->max_num = rd_byte();
     r_ptr->floor_id = rd_s16b();
 
@@ -315,6 +333,7 @@ static void rd_lore(monster_race *r_ptr, const MonsterRaceId r_idx)
     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;
+    r_ptr->r_feature_flags &= r_ptr->feature_flags;
 }
 
 void load_lore(void)
index 747b977..76951b8 100644 (file)
@@ -66,6 +66,11 @@ enum class SavedataLoreOlderThan18FlagType {
     RF1_DROP_GREAT = 0x20000000, /*!< モンスター特性: 必ず高級品をドロップする / Drop great items */
 };
 
+enum class SavedataLoreOlderThan19FlagType {
+    RF2_PASS_WALL = 0x00040000, /*!< モンスター特性: 壁を抜けることができる / Monster can pass walls */
+    RF2_KILL_WALL = 0x00080000, /*!< モンスター特性: 壁を破壊して進む / Monster can destroy walls */
+};
+
 enum class OldQuestId15 {
     CITY_SEA = 17,
 };
index d348095..70cae2c 100644 (file)
@@ -214,6 +214,7 @@ void wr_lore(MonsterRaceId r_idx)
     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_FlagGroup(r_ptr->r_feature_flags, wr_byte);
 
     wr_byte((byte)r_ptr->max_num);
     wr_s16b(r_ptr->floor_id);
index 0ad7659..a219d33 100644 (file)
@@ -28,7 +28,7 @@ constexpr std::string_view ROOT_VARIANT_NAME("Hengband");
 /*!
  * @brief セーブファイルのバージョン(3.0.0から導入)
  */
-constexpr uint32_t SAVEFILE_VERSION = 18;
+constexpr uint32_t SAVEFILE_VERSION = 19;
 
 /*!
  * @brief バージョンが開発版が安定版かを返す(廃止予定)