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<MonsterAuraType>::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;
*/
static bool grab_one_spell_flag(monster_race *r_ptr, std::string_view what)
{
- if (EnumClassFlagGroup<RF_ABILITY>::grab_one_flag(r_ptr->ability_flags, r_info_ability_flags, what))
+ if (EnumClassFlagGroup<RF_ABILITY>::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;
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
#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.
* @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);
}
*/
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!"));
}