#include "monster/monster-describer.h"
#include "monster/monster-description-types.h"
#include "monster/monster-info.h"
+#include "monster/monster-pain-describer.h"
#include "monster/monster-status-setter.h"
#include "monster/monster-status.h"
#include "monster/monster-update.h"
#include "spell-kind/spells-polymorph.h"
#include "spell-kind/spells-teleport.h"
#include "sv-definition/sv-other-types.h"
+#include "system/baseitem-info.h"
#include "system/floor-type-definition.h"
#include "system/grid-type-definition.h"
-#include "system/monster-race-definition.h"
-#include "system/monster-type-definition.h"
-#include "system/object-type-definition.h"
+#include "system/item-entity.h"
+#include "system/monster-entity.h"
+#include "system/monster-race-info.h"
#include "system/player-type-definition.h"
#include "util/bit-flags-calculator.h"
+#include "util/string-processor.h"
#include "view/display-messages.h"
#include <algorithm>
* @param em_ptr モンスター効果構造体への参照ポインタ
* @return 効果が何もないならFALSE、何かあるならTRUE
*/
-static process_result is_affective(PlayerType *player_ptr, effect_monster_type *em_ptr)
+static ProcessResult is_affective(PlayerType *player_ptr, effect_monster_type *em_ptr)
{
if (!em_ptr->g_ptr->m_idx) {
- return PROCESS_FALSE;
+ return ProcessResult::PROCESS_FALSE;
}
if (em_ptr->who && (em_ptr->g_ptr->m_idx == em_ptr->who)) {
- return PROCESS_FALSE;
+ return ProcessResult::PROCESS_FALSE;
}
if (sukekaku && ((em_ptr->m_ptr->r_idx == MonsterRaceId::SUKE) || (em_ptr->m_ptr->r_idx == MonsterRaceId::KAKU))) {
- return PROCESS_FALSE;
+ return ProcessResult::PROCESS_FALSE;
}
if (em_ptr->m_ptr->hp < 0) {
- return PROCESS_FALSE;
+ return ProcessResult::PROCESS_FALSE;
}
if (em_ptr->who || em_ptr->g_ptr->m_idx != player_ptr->riding) {
- return PROCESS_TRUE;
+ return ProcessResult::PROCESS_TRUE;
}
switch (em_ptr->attribute) {
case AttributeType::OLD_HEAL:
case AttributeType::OLD_SPEED:
case AttributeType::STAR_HEAL:
- return PROCESS_TRUE;
+ return ProcessResult::PROCESS_TRUE;
case AttributeType::OLD_SLOW:
case AttributeType::OLD_SLEEP:
case AttributeType::OLD_CLONE:
case AttributeType::OLD_POLY:
case AttributeType::GENOCIDE:
case AttributeType::E_GENOCIDE:
- return PROCESS_CONTINUE;
+ return ProcessResult::PROCESS_CONTINUE;
default:
break;
}
- return PROCESS_FALSE;
+ return ProcessResult::PROCESS_FALSE;
}
/*!
static void make_description_of_affecred_monster(PlayerType *player_ptr, effect_monster_type *em_ptr)
{
em_ptr->dam = (em_ptr->dam + em_ptr->r) / (em_ptr->r + 1);
- monster_desc(player_ptr, em_ptr->m_name, em_ptr->m_ptr, 0);
- monster_desc(player_ptr, em_ptr->m_poss, em_ptr->m_ptr, MD_PRON_VISIBLE | MD_POSSESSIVE);
+ angband_strcpy(em_ptr->m_name, monster_desc(player_ptr, em_ptr->m_ptr, 0).data(), sizeof(em_ptr->m_name));
+ angband_strcpy(em_ptr->m_poss, monster_desc(player_ptr, em_ptr->m_ptr, MD_PRON_VISIBLE | MD_POSSESSIVE).data(), sizeof(em_ptr->m_poss));
}
/*!
* 完全な耐性を持っていたら、一部属性を除いて影響は及ぼさない
* デバッグ属性、モンスター打撃、モンスター射撃であれば貫通する
*/
-static process_result exe_affect_monster_by_effect(PlayerType *player_ptr, effect_monster_type *em_ptr, std::optional<CapturedMonsterType *> cap_mon_ptr)
+static ProcessResult exe_affect_monster_by_effect(PlayerType *player_ptr, effect_monster_type *em_ptr, std::optional<CapturedMonsterType *> cap_mon_ptr)
{
const std::vector<AttributeType> effect_arrtibute = {
AttributeType::OLD_CLONE,
return em_ptr->attribute == attribute;
};
- process_result result = is_affective(player_ptr, em_ptr);
- if (result != PROCESS_TRUE) {
- if (result == PROCESS_CONTINUE) {
+ ProcessResult result = is_affective(player_ptr, em_ptr);
+ if (result != ProcessResult::PROCESS_TRUE) {
+ if (result == ProcessResult::PROCESS_CONTINUE) {
em_ptr->note = _("には効果がなかった。", " is unaffected.");
em_ptr->dam = 0;
}
em_ptr->skipped = true;
}
- return PROCESS_CONTINUE;
+ return ProcessResult::PROCESS_CONTINUE;
}
/*!
*/
static void effect_damage_killed_pet(PlayerType *player_ptr, effect_monster_type *em_ptr)
{
- bool sad = is_pet(em_ptr->m_ptr) && !(em_ptr->m_ptr->ml);
+ bool sad = em_ptr->m_ptr->is_pet() && !(em_ptr->m_ptr->ml);
if (em_ptr->known && em_ptr->note) {
- monster_desc(player_ptr, em_ptr->m_name, em_ptr->m_ptr, MD_TRUE_NAME);
+ angband_strcpy(em_ptr->m_name, monster_desc(player_ptr, em_ptr->m_ptr, MD_TRUE_NAME).data(), sizeof(em_ptr->m_name));
if (em_ptr->see_s_msg) {
- msg_format("%^s%s", em_ptr->m_name, em_ptr->note);
+ msg_format("%s^%s", em_ptr->m_name, em_ptr->note);
} else {
player_ptr->current_floor_ptr->monster_noise = true;
}
static void effect_damage_makes_sleep(PlayerType *player_ptr, effect_monster_type *em_ptr)
{
if (em_ptr->note && em_ptr->seen_msg) {
- msg_format("%^s%s", em_ptr->m_name, em_ptr->note);
+ msg_format("%s^%s", em_ptr->m_name, em_ptr->note);
} else if (em_ptr->see_s_msg) {
- message_pain(player_ptr, em_ptr->g_ptr->m_idx, em_ptr->dam);
+ const auto pain_message = MonsterPainDescriber(player_ptr, em_ptr->g_ptr->m_idx).describe(em_ptr->dam);
+ if (!pain_message.empty()) {
+ msg_print(pain_message);
+ }
} else {
player_ptr->current_floor_ptr->monster_noise = true;
}
msg_print(_("不潔な病人は病気が治った!", "The Mangy looking leper is healed!"));
}
- if (record_named_pet && is_pet(em_ptr->m_ptr) && em_ptr->m_ptr->nickname) {
- char m2_name[MAX_NLEN];
- monster_desc(player_ptr, m2_name, em_ptr->m_ptr, MD_INDEF_VISIBLE);
- exe_write_diary(player_ptr, DIARY_NAMED_PET, RECORD_NAMED_PET_HEAL_LEPER, m2_name);
+ if (record_named_pet && em_ptr->m_ptr->is_named_pet()) {
+ const auto m2_name = monster_desc(player_ptr, em_ptr->m_ptr, MD_INDEF_VISIBLE);
+ exe_write_diary(player_ptr, DIARY_NAMED_PET, RECORD_NAMED_PET_HEAL_LEPER, m2_name.data());
}
delete_monster_idx(player_ptr, em_ptr->g_ptr->m_idx);
}
if (em_ptr->note && em_ptr->seen) {
- msg_format(_("%s%s", "%^s%s"), em_ptr->m_name, em_ptr->note);
+ msg_format(_("%s%s", "%s^%s"), em_ptr->m_name, em_ptr->note);
} else if (em_ptr->known && (em_ptr->dam || !em_ptr->do_fear)) {
- message_pain(player_ptr, em_ptr->g_ptr->m_idx, em_ptr->dam);
+ const auto pain_message = MonsterPainDescriber(player_ptr, em_ptr->g_ptr->m_idx).describe(em_ptr->dam);
+ if (!pain_message.empty()) {
+ msg_print(pain_message);
+ }
}
if (((em_ptr->dam > 0) || em_ptr->get_angry) && !em_ptr->do_sleep) {
if ((fear || em_ptr->do_fear) && em_ptr->seen) {
sound(SOUND_FLEE);
- msg_format(_("%^sは恐怖して逃げ出した!", "%^s flees in terror!"), em_ptr->m_name);
+ msg_format(_("%s^は恐怖して逃げ出した!", "%s^ flees in terror!"), em_ptr->m_name);
}
return false;
}
if (em_ptr->r_ptr->kind_flags.has_not(MonsterKindType::EVIL) || one_in_(5)) {
- chg_virtue(player_ptr, V_COMPASSION, -1);
+ chg_virtue(player_ptr, Virtue::COMPASSION, -1);
}
if (em_ptr->r_ptr->kind_flags.has_not(MonsterKindType::EVIL) || one_in_(5)) {
- chg_virtue(player_ptr, V_HONOUR, -1);
+ chg_virtue(player_ptr, Virtue::HONOUR, -1);
}
}
em_ptr->do_polymorph = false;
}
- if ((em_ptr->r_ptr->kind_flags.has(MonsterKindType::UNIQUE) || any_bits(em_ptr->r_ptr->flags1, RF1_QUESTOR) || (em_ptr->r_ptr->flags7 & RF7_NAZGUL)) && !player_ptr->phase_out && (em_ptr->who > 0) && (em_ptr->dam > em_ptr->m_ptr->hp)) {
+ if ((em_ptr->r_ptr->kind_flags.has(MonsterKindType::UNIQUE) || any_bits(em_ptr->r_ptr->flags1, RF1_QUESTOR) || (em_ptr->r_ptr->population_flags.has(MonsterPopulationType::NAZGUL))) && !player_ptr->phase_out && (em_ptr->who > 0) && (em_ptr->dam > em_ptr->m_ptr->hp)) {
em_ptr->dam = em_ptr->m_ptr->hp;
}
}
}
int turns = 0;
- if (monster_stunned_remaining(em_ptr->m_ptr)) {
+ if (em_ptr->m_ptr->get_remaining_stun()) {
em_ptr->note = _("はひどくもうろうとした。", " is more dazed.");
- turns = monster_stunned_remaining(em_ptr->m_ptr) + (em_ptr->do_stun / 2);
+ turns = em_ptr->m_ptr->get_remaining_stun() + (em_ptr->do_stun / 2);
} else {
em_ptr->note = _("はもうろうとした。", " is dazed.");
turns = em_ptr->do_stun;
}
int turns = 0;
- if (monster_confused_remaining(em_ptr->m_ptr)) {
+ if (em_ptr->m_ptr->is_confused()) {
em_ptr->note = _("はさらに混乱したようだ。", " looks more confused.");
- turns = monster_confused_remaining(em_ptr->m_ptr) + (em_ptr->do_conf / 2);
+ turns = em_ptr->m_ptr->get_remaining_confusion() + (em_ptr->do_conf / 2);
} else {
em_ptr->note = _("は混乱したようだ。", " looks confused.");
turns = em_ptr->do_conf;
return;
}
- (void)set_monster_monfear(player_ptr, em_ptr->g_ptr->m_idx, monster_fear_remaining(em_ptr->m_ptr) + em_ptr->do_fear);
+ (void)set_monster_monfear(player_ptr, em_ptr->g_ptr->m_idx, em_ptr->m_ptr->get_remaining_fear() + em_ptr->do_fear);
em_ptr->get_angry = true;
}
}
em_ptr->m_ptr = &player_ptr->current_floor_ptr->m_list[em_ptr->g_ptr->m_idx];
- em_ptr->r_ptr = &r_info[em_ptr->m_ptr->r_idx];
+ em_ptr->r_ptr = &monraces_info[em_ptr->m_ptr->r_idx];
}
/*!
em_ptr->note = _("が消え去った!", " disappears!");
if (!em_ptr->who) {
- chg_virtue(player_ptr, V_VALOUR, -1);
+ chg_virtue(player_ptr, Virtue::VALOUR, -1);
}
teleport_flags tflag = i2enum<teleport_flags>((!em_ptr->who ? TELEPORT_DEC_VALOUR : TELEPORT_SPONTANEOUS) | TELEPORT_PASSIVE);
*/
static void postprocess_by_effected_pet(PlayerType *player_ptr, effect_monster_type *em_ptr)
{
- if ((em_ptr->dam <= 0) || is_pet(em_ptr->m_ptr) || is_friendly(em_ptr->m_ptr)) {
+ auto *m_ptr = em_ptr->m_ptr;
+ if ((em_ptr->dam <= 0) || m_ptr->is_pet() || m_ptr->is_friendly()) {
return;
}
if (em_ptr->who == 0) {
if (!(em_ptr->flag & PROJECT_NO_HANGEKI)) {
- set_target(em_ptr->m_ptr, monster_target_y, monster_target_x);
+ set_target(m_ptr, monster_target_y, monster_target_x);
}
return;
}
- if ((em_ptr->who > 0) && is_pet(em_ptr->m_caster_ptr) && !player_bold(player_ptr, em_ptr->m_ptr->target_y, em_ptr->m_ptr->target_x)) {
- set_target(em_ptr->m_ptr, em_ptr->m_caster_ptr->fy, em_ptr->m_caster_ptr->fx);
+ const auto &m_caster_ref = *em_ptr->m_caster_ptr;
+ if ((em_ptr->who > 0) && m_caster_ref.is_pet() && !player_bold(player_ptr, m_ptr->target_y, m_ptr->target_x)) {
+ set_target(m_ptr, m_caster_ref.fy, m_caster_ref.fx);
}
}
return;
}
- ObjectType *q_ptr;
- ObjectType forge;
+ ItemEntity *q_ptr;
+ ItemEntity forge;
q_ptr = &forge;
- q_ptr->prep(lookup_kind(ItemKindType::STATUE, SV_PHOTO));
+ q_ptr->prep(lookup_baseitem_id({ ItemKindType::STATUE, SV_PHOTO }));
q_ptr->pval = em_ptr->photo;
q_ptr->ident |= (IDENT_FULL_KNOWN);
(void)drop_near(player_ptr, q_ptr, -1, player_ptr->y, player_ptr->x);
disturb(player_ptr, true, true);
}
- process_result result = exe_affect_monster_by_effect(player_ptr, em_ptr, cap_mon_ptr);
- if (result != PROCESS_CONTINUE) {
- return (bool)result;
+ ProcessResult result = exe_affect_monster_by_effect(player_ptr, em_ptr, cap_mon_ptr);
+ if (result != ProcessResult::PROCESS_CONTINUE) {
+ return result == ProcessResult::PROCESS_TRUE;
}
if (em_ptr->skipped) {
lite_spot(player_ptr, em_ptr->y, em_ptr->x);
if ((player_ptr->monster_race_idx == em_ptr->m_ptr->r_idx) && (em_ptr->seen || !monster_is_valid)) {
- player_ptr->window_flags |= (PW_MONSTER);
+ player_ptr->window_flags |= (PW_MONSTER_LORE);
}
exe_affect_monster_postprocess(player_ptr, em_ptr);