OSDN Git Service

[WIP] [Refactor] #1787 火炎オーラフラグをmonster_type/lore_type::aura_flags に寄せた (このコミットでは全体とし...
authorHourier <66951241+Hourier@users.noreply.github.com>
Fri, 15 Oct 2021 12:10:15 +0000 (21:10 +0900)
committerHourier <66951241+Hourier@users.noreply.github.com>
Sat, 16 Oct 2021 02:20:33 +0000 (11:20 +0900)
備考:"(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)"に置換した

src/action/movement-execution.cpp
src/hpmp/hp-mp-processor.cpp
src/info-reader/race-reader.cpp
src/lore/lore-util.h
src/melee/monster-attack-monster.cpp
src/monster-race/monster-race-hook.cpp
src/monster-race/race-flags3.h
src/monster/monster-info.cpp
src/monster/monster-update.cpp
src/player/player-damage.cpp
src/view/display-lore.cpp

index 77494e6..52bad65 100644 (file)
@@ -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;
index 2eb0918..13b667a 100644 (file)
@@ -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;
index 18cf9f6..ca34e78 100644 (file)
@@ -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;
 }
index eca9672..a140b62 100644 (file)
@@ -1,12 +1,12 @@
 #pragma once
 
-#include <string>
-#include <unordered_map>
-
 #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 <string>
+#include <unordered_map>
 
 enum monster_sex {
     MSEX_NONE = 0,
@@ -30,6 +30,7 @@ typedef struct lore_type {
     BIT_FLAGS flags2;
     BIT_FLAGS flags3;
     EnumClassFlagGroup<RF_ABILITY> ability_flags;
+    EnumClassFlagGroup<MonsterAuraType> aura_flags;
 
     BIT_FLAGS flags7;
     BIT_FLAGS flagsr;
index 604430b..b1def56 100644 (file)
@@ -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);
index 5e9ba36..950b9d6 100644 (file)
@@ -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);
 }
 
 /*!
index d246ad9..7df6be3 100644 (file)
@@ -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 */
index a0885da..ade4cfe 100644 (file)
@@ -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)
index 7a4d6c2..980040f 100644 (file)
@@ -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;
index c40a77f..f74f9a2 100644 (file)
@@ -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!"));
index 3b752ea..513ae1d 100644 (file)
@@ -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)));