OSDN Git Service

[Fix/Refactor] #1787 以下の事象群を解消した
authorHourier <66951241+Hourier@users.noreply.github.com>
Fri, 15 Oct 2021 14:46:59 +0000 (23:46 +0900)
committerHourier <66951241+Hourier@users.noreply.github.com>
Sat, 16 Oct 2021 02:41:48 +0000 (11:41 +0900)
- SAVEFILEバージョン10のデータが正常に読み込めない
- r_info.txtから正常にオーラ情報を読み込めない
- モンスターからのオーラダメージを受けない

src/info-reader/race-info-tokens-table.cpp
src/info-reader/race-info-tokens-table.h
src/info-reader/race-reader.cpp
src/load/lore-loader.cpp
src/lore/lore-calculator.cpp
src/player/player-damage.cpp

index 020c8ee..5ea702d 100644 (file)
@@ -397,7 +397,7 @@ const std::unordered_map<std::string_view, race_flags_resistance> r_info_flagsr
        { "RES_TELE", RFR_RES_TELE },
 };
 
-const std::unordered_map<std::string_view, MonsterAuraType> r_info_flags_aura = {
+const std::unordered_map<std::string_view, MonsterAuraType> r_info_aura_flags = {
     { "AURA_FIRE", MonsterAuraType::FIRE },
     { "AURA_COLD", MonsterAuraType::COLD },
     { "AURA_ELEC", MonsterAuraType::ELEC },
index 3e10149..fca4e6d 100644 (file)
@@ -28,5 +28,5 @@ extern const std::unordered_map<std::string_view, race_flags7> r_info_flags7;
 extern const std::unordered_map<std::string_view, race_flags8> r_info_flags8;
 extern const std::unordered_map<std::string_view, race_flags9> r_info_flags9;
 extern const std::unordered_map<std::string_view, race_flags_resistance> r_info_flagsr;
-extern const std::unordered_map<std::string_view, MonsterAuraType> r_info_flags_aura;
+extern const std::unordered_map<std::string_view, MonsterAuraType> r_info_aura_flags;
 
index ca34e78..5bdee29 100644 (file)
@@ -40,8 +40,9 @@ static bool grab_one_basic_flag(monster_race *r_ptr, std::string_view what)
     if (info_grab_one_flag(r_ptr->flagsr, r_info_flagsr, what))
         return true;
 
-    if (info_grab_one_flag(r_ptr->flagsr, r_info_flags_aura, what))
+    if (EnumClassFlagGroup<MonsterAuraType>::grab_one_flag(r_ptr->aura_flags, r_info_aura_flags, what)) {
         return true;
+    }
 
     msg_format(_("未知のモンスター・フラグ '%s'。", "Unknown monster flag '%s'."), what.data());
     return false;
@@ -56,8 +57,9 @@ static bool grab_one_basic_flag(monster_race *r_ptr, std::string_view what)
  */
 static bool grab_one_spell_flag(monster_race *r_ptr, std::string_view what)
 {
-    if (EnumClassFlagGroup<RF_ABILITY>::grab_one_flag(r_ptr->ability_flags, r_info_ability_flags, what))
+    if (EnumClassFlagGroup<RF_ABILITY>::grab_one_flag(r_ptr->ability_flags, r_info_ability_flags, what)) {
         return true;
+    }
 
     msg_format(_("未知のモンスター・フラグ '%s'。", "Unknown monster flag '%s'."), what.data());
     return false;
@@ -219,11 +221,13 @@ errr parse_r_info(std::string_view buf, angband_header *)
 
         const auto &flags = str_split(tokens[1], '|', true, 10);
         for (const auto &f : flags) {
-            if (f.size() == 0)
+            if (f.size() == 0) {
                 continue;
+            }
 
-            if (!grab_one_basic_flag(r_ptr, f))
+            if (!grab_one_basic_flag(r_ptr, f)) {
                 return PARSE_ERROR_INVALID_FLAG;
+            }
         }
     } else if (tokens[0] == "S") {
         // S:flags
index 672b1ce..ca37631 100644 (file)
@@ -32,9 +32,8 @@ static void rd_r_aura_flags(monster_race *r_ptr)
     if (loading_savefile_version_is_older_than(10)) {
         return;
     }
-
-    uint32_t auras = rd_s32b();
-    migrate_bitflag_to_flaggroup(r_ptr->r_aura_flags, auras, sizeof(uint32_t) * 8 * 0);
+    
+    rd_FlagGroup(r_ptr->r_aura_flags, rd_byte);
 }
 
 /*!
@@ -112,6 +111,7 @@ void rd_lore(monster_race *r_ptr, MONRACE_IDX r_idx)
     r_ptr->r_flags3 &= r_ptr->flags3;
     r_ptr->r_flagsr &= r_ptr->flagsr;
     r_ptr->r_ability_flags &= r_ptr->ability_flags;
+    r_ptr->r_aura_flags &= r_ptr->aura_flags;
 }
 
 errr load_lore(void)
index cf846ee..dac6c31 100644 (file)
@@ -149,5 +149,6 @@ void set_drop_flags(lore_type *lore_ptr)
     lore_ptr->flags2 = lore_ptr->r_ptr->flags2;
     lore_ptr->flags3 = lore_ptr->r_ptr->flags3;
     lore_ptr->ability_flags = lore_ptr->r_ptr->ability_flags;
+    lore_ptr->aura_flags = lore_ptr->r_ptr->aura_flags;
     lore_ptr->flagsr = lore_ptr->r_ptr->flagsr;
 }
index c910d9b..373f39c 100644 (file)
@@ -70,6 +70,8 @@
 #include "view/display-messages.h"
 #include "world/world.h"
 
+typedef HIT_POINT dam_func(player_type *player_ptr, HIT_POINT dam, concptr kb_str, bool aura);
+
 /*!
  * @brief 酸攻撃による装備のAC劣化処理 /
  * Acid has hit the player, attempt to affect some armor.
@@ -554,22 +556,21 @@ int take_hit(player_type *player_ptr, int damage_type, HIT_POINT damage, concptr
  * @param dam_func ダメージ処理を行う関数の参照ポインタ
  * @param message オーラダメージを受けた際のメッセージ
  */
-static void process_aura_damage(monster_type *m_ptr, player_type *player_ptr, bool immune, int flags_offset, int r_flags_offset, uint32_t aura_flag,
-    HIT_POINT (*dam_func)(player_type *player_ptr, HIT_POINT dam, concptr kb_str, bool aura), concptr message)
+static void process_aura_damage(monster_type *m_ptr, player_type *player_ptr, bool immune, MonsterAuraType aura_flag, dam_func *dam_func, concptr message)
 {
-    monster_race *r_ptr = &r_info[m_ptr->r_idx];
-    if (!(atoffset(BIT_FLAGS, r_ptr, flags_offset) & aura_flag) || immune)
+    auto *r_ptr = &r_info[m_ptr->r_idx];
+    if (r_ptr->aura_flags.has_not(aura_flag) || immune) {
         return;
+    }
 
     GAME_TEXT mon_name[MAX_NLEN];
     int aura_damage = damroll(1 + (r_ptr->level / 26), 1 + (r_ptr->level / 17));
-
     monster_desc(player_ptr, mon_name, m_ptr, MD_WRONGDOER_NAME);
     msg_print(message);
-    dam_func(player_ptr, aura_damage, mon_name, true);
-
-    if (is_original_ap_and_seen(player_ptr, m_ptr))
-        atoffset(BIT_FLAGS, r_ptr, r_flags_offset) |= aura_flag;
+    (*dam_func)(player_ptr, aura_damage, mon_name, true);
+    if (is_original_ap_and_seen(player_ptr, m_ptr)) {
+        r_ptr->r_aura_flags.set(aura_flag);
+    }
 
     handle_stuff(player_ptr);
 }
@@ -581,10 +582,7 @@ static void process_aura_damage(monster_type *m_ptr, player_type *player_ptr, bo
  */
 void touch_zap_player(monster_type *m_ptr, player_type *player_ptr)
 {
-    process_aura_damage(m_ptr, player_ptr, (bool)has_immune_fire(player_ptr), offsetof(monster_race, flags2), offsetof(monster_race, r_aura_flags), enum2i(MonsterAuraType::FIRE),
-        fire_dam, _("突然とても熱くなった!", "You are suddenly very hot!"));
-    process_aura_damage(m_ptr, player_ptr, (bool)has_immune_cold(player_ptr), offsetof(monster_race, flags3), offsetof(monster_race, r_aura_flags), enum2i(MonsterAuraType::COLD),
-        cold_dam, _("突然とても寒くなった!", "You are suddenly very cold!"));
-    process_aura_damage(m_ptr, player_ptr, (bool)has_immune_elec(player_ptr), offsetof(monster_race, flags2), offsetof(monster_race, r_aura_flags), enum2i(MonsterAuraType::ELEC),
-        elec_dam, _("電撃をくらった!", "You get zapped!"));
+    process_aura_damage(m_ptr, player_ptr, (bool)has_immune_fire(player_ptr), MonsterAuraType::FIRE, fire_dam, _("突然とても熱くなった!", "You are suddenly very hot!"));
+    process_aura_damage(m_ptr, player_ptr, (bool)has_immune_cold(player_ptr), MonsterAuraType::COLD, cold_dam, _("突然とても寒くなった!", "You are suddenly very cold!"));
+    process_aura_damage(m_ptr, player_ptr, (bool)has_immune_elec(player_ptr), MonsterAuraType::ELEC, elec_dam, _("電撃をくらった!", "You get zapped!"));
 }