OSDN Git Service

[Feature] セーブデータにその他の思い出フラグを追加
authorSlimebreath6078 <slimebreath6078@yahoo.co.jp>
Sun, 28 Jan 2024 15:08:26 +0000 (00:08 +0900)
committerSlimebreath6078 <slimebreath6078@yahoo.co.jp>
Sat, 3 Feb 2024 09:12:02 +0000 (18:12 +0900)
src/load/lore-loader.cpp
src/load/savedata-old-flag-types.h
src/save/monster-writer.cpp

index 8c7731c..06528e9 100644 (file)
 #include "util/bit-flags-calculator.h"
 #include "util/enum-converter.h"
 
+static void migrate_old_misc_flags(MonsterRaceInfo *r_ptr, BIT_FLAGS old_flags1, BIT_FLAGS old_flags2)
+{
+    constexpr auto SIZE_OF_RF1 = 6;
+    struct flag_list_ver20 {
+        SavedataLoreOlderThan20FlagType old_flag;
+        MonsterMiscType flag;
+    };
+    const std::vector<flag_list_ver20> flag_list = {
+        { SavedataLoreOlderThan20FlagType::RF1_QUESTOR, MonsterMiscType::QUESTOR },
+        { SavedataLoreOlderThan20FlagType::RF1_FORCE_DEPTH, MonsterMiscType::FORCE_DEPTH },
+        { SavedataLoreOlderThan20FlagType::RF1_FORCE_MAXHP, MonsterMiscType::FORCE_MAXHP },
+        { SavedataLoreOlderThan20FlagType::RF1_FRIENDS, MonsterMiscType::HAS_FRIENDS },
+        { SavedataLoreOlderThan20FlagType::RF1_ESCORT, MonsterMiscType::ESCORT },
+        { SavedataLoreOlderThan20FlagType::RF1_ESCORTS, MonsterMiscType::MORE_ESCORT },
+        { SavedataLoreOlderThan20FlagType::RF2_REFLECTING, MonsterMiscType::REFLECTING },
+        { SavedataLoreOlderThan20FlagType::RF2_INVISIBLE, MonsterMiscType::INVISIBLE },
+        { SavedataLoreOlderThan20FlagType::RF2_COLD_BLOOD, MonsterMiscType::COLD_BLOOD },
+        { SavedataLoreOlderThan20FlagType::RF2_EMPTY_MIND, MonsterMiscType::EMPTY_MIND },
+        { SavedataLoreOlderThan20FlagType::RF2_WEIRD_MIND, MonsterMiscType::WEIRD_MIND },
+        { SavedataLoreOlderThan20FlagType::RF2_MULTIPLY, MonsterMiscType::MULTIPLY },
+        { SavedataLoreOlderThan20FlagType::RF2_REGENERATE, MonsterMiscType::REGENERATE },
+        { SavedataLoreOlderThan20FlagType::RF2_POWERFUL, MonsterMiscType::POWERFUL },
+        { SavedataLoreOlderThan20FlagType::RF2_ELDRITCH_HORROR, MonsterMiscType::ELDRITCH_HORROR },
+    };
+
+    if (old_flags1 == 0 && old_flags2 == 0) {
+        return;
+    }
+
+    for (uint16_t i = 0; i < flag_list.size(); i++) {
+        const auto &f = flag_list[i];
+        if (i < SIZE_OF_RF1) {
+            if (any_bits(old_flags1, f.old_flag)) {
+                r_ptr->r_misc_flags.set(f.flag);
+            }
+        } else {
+            if (any_bits(old_flags2, f.old_flag)) {
+                r_ptr->r_misc_flags.set(f.flag);
+            }
+        }
+    }
+}
+
 static void migrate_old_feature_flags(MonsterRaceInfo *r_ptr, BIT_FLAGS old_flags)
 {
     if (any_bits(old_flags, enum2i(SavedataLoreOlderThan19FlagType::RF2_PASS_WALL))) {
@@ -287,6 +330,15 @@ static void rd_r_feature_flags(MonsterRaceInfo *r_ptr)
     rd_FlagGroup(r_ptr->r_feature_flags, rd_byte);
 }
 
+static void rd_r_misc_flags(MonsterRaceInfo *r_ptr)
+{
+    if (loading_savefile_version_is_older_than(20)) {
+        migrate_old_misc_flags(r_ptr, r_ptr->r_flags1, r_ptr->r_flags2);
+        return;
+    }
+    rd_FlagGroup(r_ptr->r_misc_flags, rd_byte);
+}
+
 /*!
  * @brief モンスターの思い出を読み込む / Read the monster lore
  * @param r_ptr 読み込み先モンスター種族情報へのポインタ
@@ -340,6 +392,7 @@ static void rd_lore(MonsterRaceInfo *r_ptr, const MonsterRaceId r_idx)
     if (!loading_savefile_version_is_older_than(20)) {
         rd_FlagGroup(r_ptr->special_flags, rd_byte);
     }
+    rd_r_misc_flags(r_ptr);
     r_ptr->max_num = rd_byte();
     r_ptr->floor_id = rd_s16b();
 
@@ -361,6 +414,7 @@ static void rd_lore(MonsterRaceInfo *r_ptr, const MonsterRaceId r_idx)
     r_ptr->r_kind_flags &= r_ptr->kind_flags;
     r_ptr->r_feature_flags &= r_ptr->feature_flags;
     r_ptr->r_special_flags &= r_ptr->special_flags;
+    r_ptr->r_misc_flags &= r_ptr->misc_flags;
 }
 
 void load_lore(void)
index 923abef..9725d90 100644 (file)
@@ -78,6 +78,24 @@ enum class SavedataLoreOlderThan19FlagType_No_Debuff : uint32_t {
     RF3_NO_SLEEP = 0x80000000, /*!< モンスター特性: 眠らない / Cannot be slept */
 };
 
+enum class SavedataLoreOlderThan20FlagType {
+    RF1_QUESTOR = 0x00000002, /*!< モンスター特性: クエストモンスター / Quest Monster */
+    RF1_FORCE_DEPTH = 0x00000100, /*!< モンスター特性: 指定階未満では生成されない / Start at "correct" depth */
+    RF1_FORCE_MAXHP = 0x00000200, /*!< モンスター特性: 通常生成時必ずHPがダイス最大値になる / Start with max hitpoints */
+    RF1_FRIENDS = 0x00002000, /*!< モンスター特性: 同種の友軍を用意している / Arrive with some friends */
+    RF1_ESCORT = 0x00004000, /*!< モンスター特性: 護衛を用意している/ Arrive with an escort */
+    RF1_ESCORTS = 0x00008000, /*!< モンスター特性: さらに大量の護衛を用意している / Arrive with some escorts */
+    RF2_REFLECTING = 0x00000008, /*!< モンスター特性: 矢やボルト魔法を反射する / Reflects bolts */
+    RF2_INVISIBLE = 0x00000010, /*!< モンスター特性: 透明視力がないと見えない / Monster avoids vision */
+    RF2_COLD_BLOOD = 0x00000020, /*!< モンスター特性: 冷血動物である / Monster avoids infra */
+    RF2_EMPTY_MIND = 0x00000040, /*!< モンスター特性: 知性を持たない(テレパシー回避) / Monster avoids telepathy */
+    RF2_WEIRD_MIND = 0x00000080, /*!< モンスター特性: 異質な知性(テレパシーで感知づらい) / Monster avoids telepathy? */
+    RF2_MULTIPLY = 0x00000100, /*!< モンスター特性: 増殖する / Monster reproduces */
+    RF2_REGENERATE = 0x00000200, /*!< モンスター特性: 急激に回復する / Monster regenerates */
+    RF2_POWERFUL = 0x00001000, /*!< モンスター特性: 強力に魔法をあやつる / Monster has strong breath */
+    RF2_ELDRITCH_HORROR = 0x00002000, /*!< モンスター特性: 狂気を呼び起こす / Sanity-blasting horror    */
+};
+
 enum class OldQuestId15 {
     CITY_SEA = 17,
 };
index 4e84e3a..38f1372 100644 (file)
@@ -215,6 +215,7 @@ void wr_lore(MonsterRaceId r_idx)
     wr_FlagGroup(r_ptr->r_drop_flags, wr_byte);
     wr_FlagGroup(r_ptr->r_feature_flags, wr_byte);
     wr_FlagGroup(r_ptr->r_special_flags, wr_byte);
+    wr_FlagGroup(r_ptr->r_misc_flags, wr_byte);
 
     wr_byte((byte)r_ptr->max_num);
     wr_s16b(r_ptr->floor_id);