From b44f4f2c1df0ed8f3b4d91ebee1aa0154576886c Mon Sep 17 00:00:00 2001 From: Hourier <66951241+Hourier@users.noreply.github.com> Date: Fri, 15 Oct 2021 23:46:59 +0900 Subject: [PATCH] =?utf8?q?[Fix/Refactor]=20#1787=20=E4=BB=A5=E4=B8=8B?= =?utf8?q?=E3=81=AE=E4=BA=8B=E8=B1=A1=E7=BE=A4=E3=82=92=E8=A7=A3=E6=B6=88?= =?utf8?q?=E3=81=97=E3=81=9F=20-=20SAVEFILE=E3=83=90=E3=83=BC=E3=82=B8?= =?utf8?q?=E3=83=A7=E3=83=B310=E3=81=AE=E3=83=87=E3=83=BC=E3=82=BF?= =?utf8?q?=E3=81=8C=E6=AD=A3=E5=B8=B8=E3=81=AB=E8=AA=AD=E3=81=BF=E8=BE=BC?= =?utf8?q?=E3=82=81=E3=81=AA=E3=81=84=20-=20r=5Finfo.txt=E3=81=8B=E3=82=89?= =?utf8?q?=E6=AD=A3=E5=B8=B8=E3=81=AB=E3=82=AA=E3=83=BC=E3=83=A9=E6=83=85?= =?utf8?q?=E5=A0=B1=E3=82=92=E8=AA=AD=E3=81=BF=E8=BE=BC=E3=82=81=E3=81=AA?= =?utf8?q?=E3=81=84=20-=20=E3=83=A2=E3=83=B3=E3=82=B9=E3=82=BF=E3=83=BC?= =?utf8?q?=E3=81=8B=E3=82=89=E3=81=AE=E3=82=AA=E3=83=BC=E3=83=A9=E3=83=80?= =?utf8?q?=E3=83=A1=E3=83=BC=E3=82=B8=E3=82=92=E5=8F=97=E3=81=91=E3=81=AA?= =?utf8?q?=E3=81=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- src/info-reader/race-info-tokens-table.cpp | 2 +- src/info-reader/race-info-tokens-table.h | 2 +- src/info-reader/race-reader.cpp | 12 ++++++++---- src/load/lore-loader.cpp | 6 +++--- src/lore/lore-calculator.cpp | 1 + src/player/player-damage.cpp | 28 +++++++++++++--------------- 6 files changed, 27 insertions(+), 24 deletions(-) diff --git a/src/info-reader/race-info-tokens-table.cpp b/src/info-reader/race-info-tokens-table.cpp index 020c8ee23..5ea702d4f 100644 --- a/src/info-reader/race-info-tokens-table.cpp +++ b/src/info-reader/race-info-tokens-table.cpp @@ -397,7 +397,7 @@ const std::unordered_map r_info_flagsr { "RES_TELE", RFR_RES_TELE }, }; -const std::unordered_map r_info_flags_aura = { +const std::unordered_map r_info_aura_flags = { { "AURA_FIRE", MonsterAuraType::FIRE }, { "AURA_COLD", MonsterAuraType::COLD }, { "AURA_ELEC", MonsterAuraType::ELEC }, diff --git a/src/info-reader/race-info-tokens-table.h b/src/info-reader/race-info-tokens-table.h index 3e10149fb..fca4e6d80 100644 --- a/src/info-reader/race-info-tokens-table.h +++ b/src/info-reader/race-info-tokens-table.h @@ -28,5 +28,5 @@ extern const std::unordered_map r_info_flags7; extern const std::unordered_map r_info_flags8; extern const std::unordered_map r_info_flags9; extern const std::unordered_map r_info_flagsr; -extern const std::unordered_map r_info_flags_aura; +extern const std::unordered_map r_info_aura_flags; diff --git a/src/info-reader/race-reader.cpp b/src/info-reader/race-reader.cpp index ca34e78ba..5bdee29e3 100644 --- a/src/info-reader/race-reader.cpp +++ b/src/info-reader/race-reader.cpp @@ -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::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::grab_one_flag(r_ptr->ability_flags, r_info_ability_flags, what)) + if (EnumClassFlagGroup::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 diff --git a/src/load/lore-loader.cpp b/src/load/lore-loader.cpp index 672b1ce89..ca376316b 100644 --- a/src/load/lore-loader.cpp +++ b/src/load/lore-loader.cpp @@ -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) diff --git a/src/lore/lore-calculator.cpp b/src/lore/lore-calculator.cpp index cf846ee84..dac6c312d 100644 --- a/src/lore/lore-calculator.cpp +++ b/src/lore/lore-calculator.cpp @@ -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; } diff --git a/src/player/player-damage.cpp b/src/player/player-damage.cpp index c910d9bad..373f39c54 100644 --- a/src/player/player-damage.cpp +++ b/src/player/player-damage.cpp @@ -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!")); } -- 2.11.0