From 5f169ed4c39e7a53203059b111e407465d4902a7 Mon Sep 17 00:00:00 2001 From: Hourier <66951241+Hourier@users.noreply.github.com> Date: Fri, 15 Oct 2021 22:04:33 +0900 Subject: [PATCH] =?utf8?q?[Refactor]=20#1787=20=E3=83=A2=E3=83=B3=E3=82=B9?= =?utf8?q?=E3=82=BF=E3=83=BC=E3=81=AE=E6=80=9D=E3=81=84=E5=87=BA=E8=AA=AD?= =?utf8?q?=E3=81=BF=E8=BE=BC=E3=81=BF=E5=87=A6=E7=90=86=E3=82=92=E7=8F=BE?= =?utf8?q?=E8=A1=8C=E3=81=AE=E3=82=AA=E3=83=BC=E3=83=A9=E3=83=95=E3=83=A9?= =?utf8?q?=E3=82=B0=E3=81=AB=E5=90=88=E3=82=8F=E3=81=9B=E3=81=9F=20(WIP?= =?utf8?q?=E8=A7=A3=E6=B6=88)?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- src/hpmp/hp-mp-processor.cpp | 4 ++- src/load/lore-loader.cpp | 46 ++++++++++++++++++++++++++++------ src/melee/monster-attack-monster.cpp | 4 +-- src/monster-race/monster-race-hook.cpp | 2 +- src/player/player-damage.cpp | 2 +- src/save/monster-writer.cpp | 1 + src/system/angband-version.h | 2 +- src/view/display-lore.cpp | 9 ++++--- 8 files changed, 52 insertions(+), 18 deletions(-) diff --git a/src/hpmp/hp-mp-processor.cpp b/src/hpmp/hp-mp-processor.cpp index 3e61713f1..d964fcd05 100644 --- a/src/hpmp/hp-mp-processor.cpp +++ b/src/hpmp/hp-mp-processor.cpp @@ -222,6 +222,7 @@ void process_player_hp_mp(player_type *player_ptr) msg_print(_("熱い!", "It's hot!")); take_hit(player_ptr, DAMAGE_NOESCAPE, damage, _("炎のオーラ", "Fire aura")); } + if (auras.has(MonsterAuraType::ELEC) && !has_immune_elec(player_ptr)) { damage = r_info[player_ptr->current_floor_ptr->m_list[player_ptr->riding].r_idx].level / 2; if (race.tr_flags().has(TR_VUL_ELEC)) @@ -233,7 +234,8 @@ void process_player_hp_mp(player_type *player_ptr) msg_print(_("痛い!", "It hurts!")); take_hit(player_ptr, DAMAGE_NOESCAPE, damage, _("電気のオーラ", "Elec aura")); } - if ((r_info[player_ptr->current_floor_ptr->m_list[player_ptr->riding].r_idx].flags3 & RF3_XX10) && !has_immune_cold(player_ptr)) { + + if (auras.has(MonsterAuraType::COLD) && !has_immune_cold(player_ptr)) { damage = r_info[player_ptr->current_floor_ptr->m_list[player_ptr->riding].r_idx].level / 2; if (race.tr_flags().has(TR_VUL_COLD)) damage += damage / 3; diff --git a/src/load/lore-loader.cpp b/src/load/lore-loader.cpp index 954c61116..672b1ce89 100644 --- a/src/load/lore-loader.cpp +++ b/src/load/lore-loader.cpp @@ -1,10 +1,41 @@ #include "load/lore-loader.h" #include "game-option/runtime-arguments.h" -#include "monster-race/monster-race.h" +#include "load/angband-version-comparer.h" #include "load/load-util.h" #include "load/load-v1-5-0.h" -#include "load/angband-version-comparer.h" +#include "monster-race/monster-race.h" +#include "monster-race/race-flags2.h" +#include "monster-race/race-flags3.h" #include "system/monster-race-definition.h" +#include "util/bit-flags-calculator.h" + +static void rd_r_flags2(monster_race *r_ptr) +{ + r_ptr->r_flags2 = rd_u32b(); + if (loading_savefile_version_is_older_than(10)) { + if (any_bits(r_ptr->r_flags2, RF2_XX14)) { + r_ptr->r_aura_flags.set(MonsterAuraType::FIRE); + } + + if (any_bits(r_ptr->r_flags3, RF3_XX10)) { + r_ptr->r_aura_flags.set(MonsterAuraType::COLD); + } + + if (any_bits(r_ptr->r_flags2, RF2_XX15)) { + r_ptr->r_aura_flags.set(MonsterAuraType::ELEC); + } + } +} + +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); +} /*! * @brief モンスターの思い出を読み込む / Read the monster lore @@ -46,13 +77,12 @@ void rd_lore(monster_race *r_ptr, MONRACE_IDX r_idx) r_ptr->r_blows[3] = rd_byte(); r_ptr->r_flags1 = rd_u32b(); - r_ptr->r_flags2 = rd_u32b(); + rd_r_flags2(r_ptr); r_ptr->r_flags3 = rd_u32b(); if (loading_savefile_version_is_older_than(3)) { - uint32_t f4, f5, f6; - f4 = rd_u32b(); - f5 = rd_u32b(); - f6 = rd_u32b(); + uint32_t f4 = rd_u32b(); + uint32_t f5 = rd_u32b(); + uint32_t f6 = rd_u32b(); if (h_older_than(1, 5, 0, 3)) set_old_lore(r_ptr, f4, r_idx); else @@ -66,8 +96,8 @@ void rd_lore(monster_race *r_ptr, MONRACE_IDX r_idx) rd_FlagGroup(r_ptr->r_ability_flags, rd_byte); } + rd_r_aura_flags(r_ptr); r_ptr->max_num = rd_byte(); - r_ptr->floor_id = rd_s16b(); if (!loading_savefile_version_is_older_than(4)) { diff --git a/src/melee/monster-attack-monster.cpp b/src/melee/monster-attack-monster.cpp index 77ee29150..292d4148d 100644 --- a/src/melee/monster-attack-monster.cpp +++ b/src/melee/monster-attack-monster.cpp @@ -101,7 +101,7 @@ static void aura_cold_by_melee(player_type *player_ptr, mam_type *mam_ptr) { monster_race *r_ptr = &r_info[mam_ptr->m_ptr->r_idx]; monster_race *tr_ptr = &r_info[mam_ptr->t_ptr->r_idx]; - if (((tr_ptr->flags3 & RF3_XX10) == 0) || (mam_ptr->m_ptr->r_idx == 0)) + if (tr_ptr->aura_flags.has_not(MonsterAuraType::COLD) || (mam_ptr->m_ptr->r_idx == 0)) return; if (((r_ptr->flagsr & RFR_EFF_IM_COLD_MASK) != 0) && is_original_ap_and_seen(player_ptr, mam_ptr->m_ptr)) { @@ -113,7 +113,7 @@ static void aura_cold_by_melee(player_type *player_ptr, mam_type *mam_ptr) msg_format(_("%^sは突然寒くなった!", "%^s is suddenly very cold!"), mam_ptr->m_name); if (mam_ptr->m_ptr->ml && is_original_ap_and_seen(player_ptr, mam_ptr->t_ptr)) - tr_ptr->r_flags3 |= RF3_XX10; + tr_ptr->aura_flags.set(MonsterAuraType::COLD); project(player_ptr, mam_ptr->t_idx, 0, mam_ptr->m_ptr->fy, mam_ptr->m_ptr->fx, damroll(1 + ((tr_ptr->level) / 26), 1 + ((tr_ptr->level) / 17)), GF_COLD, PROJECT_KILL | PROJECT_STOP | PROJECT_AIMED); diff --git a/src/monster-race/monster-race-hook.cpp b/src/monster-race/monster-race-hook.cpp index 950b9d62d..b6e9af253 100644 --- a/src/monster-race/monster-race-hook.cpp +++ b/src/monster-race/monster-race-hook.cpp @@ -291,7 +291,7 @@ bool mon_hook_lava(player_type *player_ptr, MONRACE_IDX r_idx) if (!mon_hook_dungeon(player_ptr, r_idx)) return false; - return (any_bits(r_ptr->flagsr, RFR_EFF_IM_FIRE_MASK) || any_bits(r_ptr->flags7, RF7_CAN_FLY)) && none_bits(r_ptr->flags3, RF3_XX10); + return (any_bits(r_ptr->flagsr, RFR_EFF_IM_FIRE_MASK) || any_bits(r_ptr->flags7, RF7_CAN_FLY)) && r_ptr->aura_flags.has_not(MonsterAuraType::COLD); } /*! diff --git a/src/player/player-damage.cpp b/src/player/player-damage.cpp index b38f6bc2e..c910d9bad 100644 --- a/src/player/player-damage.cpp +++ b/src/player/player-damage.cpp @@ -583,7 +583,7 @@ 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_flags3), RF3_XX10, + 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!")); diff --git a/src/save/monster-writer.cpp b/src/save/monster-writer.cpp index a56c81838..25436f6ab 100644 --- a/src/save/monster-writer.cpp +++ b/src/save/monster-writer.cpp @@ -183,6 +183,7 @@ void wr_lore(MONRACE_IDX r_idx) wr_u32b(r_ptr->r_flags3); wr_u32b(r_ptr->r_flagsr); wr_FlagGroup(r_ptr->r_ability_flags, wr_byte); + wr_FlagGroup(r_ptr->r_aura_flags, wr_byte); wr_byte((byte)r_ptr->max_num); wr_s16b(r_ptr->floor_id); diff --git a/src/system/angband-version.h b/src/system/angband-version.h index 7233c1345..121c62118 100644 --- a/src/system/angband-version.h +++ b/src/system/angband-version.h @@ -22,7 +22,7 @@ /*! * @brief セーブファイルのバージョン(3.0.0から導入) */ -constexpr uint32_t SAVEFILE_VERSION = 9; +constexpr uint32_t SAVEFILE_VERSION = 10; /*! * @brief バージョンが開発版が安定版かを返す(廃止予定) diff --git a/src/view/display-lore.cpp b/src/view/display-lore.cpp index 02e2eb870..2517067a8 100644 --- a/src/view/display-lore.cpp +++ b/src/view/display-lore.cpp @@ -457,18 +457,19 @@ void display_monster_aura(lore_type *lore_ptr) { auto has_fire_aura = lore_ptr->aura_flags.has(MonsterAuraType::FIRE); auto has_elec_aura = lore_ptr->aura_flags.has(MonsterAuraType::ELEC); - if (has_fire_aura && has_elec_aura && (lore_ptr->flags3 & RF3_XX10)) + auto has_cold_aura = lore_ptr->aura_flags.has(MonsterAuraType::COLD); + if (has_fire_aura && has_elec_aura && has_cold_aura) hook_c_roff( TERM_VIOLET, format(_("%^sは炎と氷とスパークに包まれている。", "%^s is surrounded by flames, ice and electricity. "), Who::who(lore_ptr->msex))); else if (has_fire_aura && has_elec_aura) hook_c_roff(TERM_L_RED, format(_("%^sは炎とスパークに包まれている。", "%^s is surrounded by flames and electricity. "), Who::who(lore_ptr->msex))); - else if (has_fire_aura && (lore_ptr->flags3 & RF3_XX10)) + else if (has_fire_aura && has_cold_aura) hook_c_roff(TERM_BLUE, format(_("%^sは炎と氷に包まれている。", "%^s is surrounded by flames and ice. "), Who::who(lore_ptr->msex))); - else if ((lore_ptr->flags3 & RF3_XX10) && has_elec_aura) + else if (has_cold_aura && has_elec_aura) hook_c_roff(TERM_L_GREEN, format(_("%^sは氷とスパークに包まれている。", "%^s is surrounded by ice and electricity. "), Who::who(lore_ptr->msex))); else if (has_fire_aura) hook_c_roff(TERM_RED, format(_("%^sは炎に包まれている。", "%^s is surrounded by flames. "), Who::who(lore_ptr->msex))); - else if (lore_ptr->flags3 & RF3_XX10) + else if (has_cold_aura) hook_c_roff(TERM_BLUE, format(_("%^sは氷に包まれている。", "%^s is surrounded by ice. "), Who::who(lore_ptr->msex))); else if (has_elec_aura) hook_c_roff(TERM_L_BLUE, format(_("%^sはスパークに包まれている。", "%^s is surrounded by electricity. "), Who::who(lore_ptr->msex))); -- 2.11.0