#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)
{
}
}
+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)) {
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();
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;
}
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,
};