From: Hourier <66951241+Hourier@users.noreply.github.com> Date: Fri, 15 Oct 2021 12:10:15 +0000 (+0900) Subject: [WIP] [Refactor] #1787 火炎オーラフラグをmonster_type/lore_type::aura_flags に寄せた (このコミットでは全体とし... X-Git-Tag: vmacos3.0.0-alpha52~52^2~4^2~9 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=9b3019e8e7558b1b6fce326d7be11fa5e07aec4b;p=hengbandforosx%2Fhengbandosx.git [WIP] [Refactor] #1787 火炎オーラフラグをmonster_type/lore_type::aura_flags に寄せた (このコミットでは全体として動作しない。注意) 備考:"(r_ptr->flags2 & (RF2_COLD_BLOOD | RF2_XX14)) == RF2_COLD_BLOOD" を"any_bits(r_ptr->flags2, RF2_COLD_BLOOD) && r_ptr->aura_flags.has_not(MonsterAuraType::FIRE)"に置換した --- diff --git a/src/action/movement-execution.cpp b/src/action/movement-execution.cpp index 77494e665..52bad655b 100644 --- a/src/action/movement-execution.cpp +++ b/src/action/movement-execution.cpp @@ -216,7 +216,7 @@ void exe_movement(player_type *player_ptr, DIRECTION dir, bool do_pickup, bool b } else if (f_ptr->flags.has(FF::CAN_SWIM) && (riding_r_ptr->flags7 & RF7_CAN_SWIM)) { /* Allow moving */ } else if (f_ptr->flags.has(FF::WATER) && !(riding_r_ptr->flags7 & RF7_AQUATIC) - && (f_ptr->flags.has(FF::DEEP) || (riding_r_ptr->flags2 & RF2_XX14))) { + && (f_ptr->flags.has(FF::DEEP) || riding_r_ptr->aura_flags.has(MonsterAuraType::FIRE))) { msg_format(_("%sの上に行けない。", "Can't swim."), f_info[g_ptr->get_feat_mimic()].name.c_str()); energy.reset_player_turn(); can_move = false; diff --git a/src/hpmp/hp-mp-processor.cpp b/src/hpmp/hp-mp-processor.cpp index 2eb09180a..13b667a83 100644 --- a/src/hpmp/hp-mp-processor.cpp +++ b/src/hpmp/hp-mp-processor.cpp @@ -210,7 +210,8 @@ void process_player_hp_mp(player_type *player_ptr) if (player_ptr->riding) { HIT_POINT damage; - if ((r_info[player_ptr->current_floor_ptr->m_list[player_ptr->riding].r_idx].flags2 & RF2_XX14) && !has_immune_fire(player_ptr)) { + auto auras = r_info[player_ptr->current_floor_ptr->m_list[player_ptr->riding].r_idx].aura_flags; + if (auras.has(MonsterAuraType::FIRE) && !has_immune_fire(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_FIRE)) damage += damage / 3; diff --git a/src/info-reader/race-reader.cpp b/src/info-reader/race-reader.cpp index 18cf9f61b..ca34e78ba 100644 --- a/src/info-reader/race-reader.cpp +++ b/src/info-reader/race-reader.cpp @@ -40,6 +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)) + return true; + msg_format(_("未知のモンスター・フラグ '%s'。", "Unknown monster flag '%s'."), what.data()); return false; } diff --git a/src/lore/lore-util.h b/src/lore/lore-util.h index eca9672a7..a140b6227 100644 --- a/src/lore/lore-util.h +++ b/src/lore/lore-util.h @@ -1,12 +1,12 @@ #pragma once -#include -#include - #include "system/angband.h" #include "monster-attack/monster-attack-types.h" +#include "monster-race/monster-aura-types.h" #include "monster-race/race-ability-flags.h" #include "util/flag-group.h" +#include +#include enum monster_sex { MSEX_NONE = 0, @@ -30,6 +30,7 @@ typedef struct lore_type { BIT_FLAGS flags2; BIT_FLAGS flags3; EnumClassFlagGroup ability_flags; + EnumClassFlagGroup aura_flags; BIT_FLAGS flags7; BIT_FLAGS flagsr; diff --git a/src/melee/monster-attack-monster.cpp b/src/melee/monster-attack-monster.cpp index 604430b50..b1def568a 100644 --- a/src/melee/monster-attack-monster.cpp +++ b/src/melee/monster-attack-monster.cpp @@ -79,7 +79,7 @@ static void aura_fire_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->flags2 & RF2_XX14) == 0) || (mam_ptr->m_ptr->r_idx == 0)) + if (tr_ptr->aura_flags.has_not(MonsterAuraType::FIRE) || (mam_ptr->m_ptr->r_idx == 0)) return; if (((r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK) != 0) && is_original_ap_and_seen(player_ptr, mam_ptr->m_ptr)) { @@ -91,7 +91,7 @@ static void aura_fire_by_melee(player_type *player_ptr, mam_type *mam_ptr) msg_format(_("%^sは突然熱くなった!", "%^s is suddenly very hot!"), mam_ptr->m_name); if (mam_ptr->m_ptr->ml && is_original_ap_and_seen(player_ptr, mam_ptr->t_ptr)) - tr_ptr->r_flags2 |= RF2_XX14; + tr_ptr->aura_flags.set(MonsterAuraType::FIRE); 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_FIRE, 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 5e9ba3644..950b9d62d 100644 --- a/src/monster-race/monster-race-hook.cpp +++ b/src/monster-race/monster-race-hook.cpp @@ -277,7 +277,7 @@ bool mon_hook_shallow_water(player_type *player_ptr, MONRACE_IDX r_idx) if (!mon_hook_dungeon(player_ptr, r_idx)) return false; - return none_bits(r_ptr->flags2, RF2_XX14); + return r_ptr->aura_flags.has_not(MonsterAuraType::FIRE); } /*! diff --git a/src/monster-race/race-flags3.h b/src/monster-race/race-flags3.h index d246ad944..7df6be3fb 100644 --- a/src/monster-race/race-flags3.h +++ b/src/monster-race/race-flags3.h @@ -11,7 +11,7 @@ enum race_flags3 { RF3_ANIMAL = 0x00000080, /*!< モンスター特性: 動物 / Animal */ RF3_AMBERITE = 0x00000100, /*!< モンスター特性: アンバーの血族 / TY: Amberite */ RF3_GOOD = 0x00000200, /*!< モンスター特性: 善良 / Good */ - RF3_XX10 = 0x00000400, /*!< モンスター特性: 冷気オーラ / Freezes in melee */ + RF3_XX10 = 0x00000400, /*!< 予約領域。元冷気オーラ */ RF3_NONLIVING = 0x00000800, /*!< モンスター特性: 無生物 / TY: Non-Living (?) */ RF3_HURT_LITE = 0x00001000, /*!< モンスター特性: 通常の光(GF_WEAK_LITE)でダメージを受ける / Hurt by lite */ RF3_HURT_ROCK = 0x00002000, /*!< モンスター特性: 岩石溶解(GF_KILL_WALL)でダメージを受ける / Hurt by rock remover */ diff --git a/src/monster/monster-info.cpp b/src/monster/monster-info.cpp index a0885da2c..ade4cfe4c 100644 --- a/src/monster/monster-info.cpp +++ b/src/monster/monster-info.cpp @@ -82,7 +82,7 @@ bool monster_can_cross_terrain(player_type *player_ptr, FEAT_IDX feat, monster_r if (!(r_ptr->flags7 & RF7_AQUATIC)) { if (f_ptr->flags.has(FF::DEEP)) return false; - else if (r_ptr->flags2 & RF2_XX14) + else if (r_ptr->aura_flags.has(MonsterAuraType::FIRE)) return false; } } else if (r_ptr->flags7 & RF7_AQUATIC) diff --git a/src/monster/monster-update.cpp b/src/monster/monster-update.cpp index 7a4d6c2e0..980040f0f 100644 --- a/src/monster/monster-update.cpp +++ b/src/monster/monster-update.cpp @@ -355,7 +355,7 @@ static bool check_cold_blood(player_type *player_ptr, um_type *um_ptr, const POS return false; monster_race *r_ptr = &r_info[um_ptr->m_ptr->r_idx]; - if ((r_ptr->flags2 & (RF2_COLD_BLOOD | RF2_XX14)) == RF2_COLD_BLOOD) + if (any_bits(r_ptr->flags2, RF2_COLD_BLOOD) && r_ptr->aura_flags.has_not(MonsterAuraType::FIRE)) return false; um_ptr->easy = true; diff --git a/src/player/player-damage.cpp b/src/player/player-damage.cpp index c40a77fae..f74f9a293 100644 --- a/src/player/player-damage.cpp +++ b/src/player/player-damage.cpp @@ -581,7 +581,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_flags2), RF2_XX14, + 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, cold_dam, _("突然とても寒くなった!", "You are suddenly very cold!")); diff --git a/src/view/display-lore.cpp b/src/view/display-lore.cpp index 3b752ea01..513ae1dd3 100644 --- a/src/view/display-lore.cpp +++ b/src/view/display-lore.cpp @@ -455,16 +455,17 @@ void display_monster_exp(player_type *player_ptr, lore_type *lore_ptr) void display_monster_aura(lore_type *lore_ptr) { - if ((lore_ptr->flags2 & RF2_XX14) && (lore_ptr->flags2 & RF2_XX15) && (lore_ptr->flags3 & RF3_XX10)) + auto has_fire_aura = lore_ptr->aura_flags.has(MonsterAuraType::FIRE); + if (has_fire_aura && (lore_ptr->flags2 & RF2_XX15) && (lore_ptr->flags3 & RF3_XX10)) hook_c_roff( TERM_VIOLET, format(_("%^sは炎と氷とスパークに包まれている。", "%^s is surrounded by flames, ice and electricity. "), Who::who(lore_ptr->msex))); - else if ((lore_ptr->flags2 & RF2_XX14) && (lore_ptr->flags2 & RF2_XX15)) + else if (has_fire_aura && (lore_ptr->flags2 & RF2_XX15)) hook_c_roff(TERM_L_RED, format(_("%^sは炎とスパークに包まれている。", "%^s is surrounded by flames and electricity. "), Who::who(lore_ptr->msex))); - else if ((lore_ptr->flags2 & RF2_XX14) && (lore_ptr->flags3 & RF3_XX10)) + else if (has_fire_aura && (lore_ptr->flags3 & RF3_XX10)) 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) && (lore_ptr->flags2 & RF2_XX15)) hook_c_roff(TERM_L_GREEN, format(_("%^sは氷とスパークに包まれている。", "%^s is surrounded by ice and electricity. "), Who::who(lore_ptr->msex))); - else if (lore_ptr->flags2 & RF2_XX14) + 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) hook_c_roff(TERM_BLUE, format(_("%^sは氷に包まれている。", "%^s is surrounded by ice. "), Who::who(lore_ptr->msex)));