備考:"(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)"に置換した
} 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;
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;
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;
}
#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,
BIT_FLAGS flags2;
BIT_FLAGS flags3;
EnumClassFlagGroup<RF_ABILITY> ability_flags;
+ EnumClassFlagGroup<MonsterAuraType> aura_flags;
BIT_FLAGS flags7;
BIT_FLAGS flagsr;
{
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)) {
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);
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);
}
/*!
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 */
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)
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;
*/
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!"));
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)));