-#include "combat/shoot.h"
+#include "combat/shoot.h"
#include "artifact/fixed-art-types.h"
#include "avatar/avatar.h"
#include "combat/attack-criticality.h"
-#include "core/player-redraw-types.h"
-#include "core/player-update-types.h"
#include "core/stuff-handler.h"
#include "effect/attribute-types.h"
#include "effect/effect-characteristics.h"
#include "monster/monster-status.h"
#include "monster/monster-update.h"
#include "object/object-broken.h"
-#include "object/object-flags.h"
#include "object/object-info.h"
#include "object/object-mark-types.h"
#include "player-base/player-class.h"
#include "system/monster-entity.h"
#include "system/monster-race-info.h"
#include "system/player-type-definition.h"
+#include "system/redrawing-flags-updater.h"
#include "target/projection-path-calculator.h"
#include "target/target-checker.h"
#include "target/target-getter.h"
AttributeFlags attribute_flags{};
attribute_flags.set(AttributeType::PLAYER_SHOOT);
- TrFlags flags{};
- auto arrow_flags = object_flags(arrow_ptr);
- auto bow_flags = object_flags(bow_ptr);
-
- flags = bow_flags | arrow_flags;
+ const auto arrow_flags = arrow_ptr->get_flags();
+ const auto bow_flags = bow_ptr->get_flags();
+ const auto flags = bow_flags | arrow_flags;
static const struct snipe_convert_table_t {
SPELL_IDX snipe_type;
{
MULTIPLY mult = 10;
- MonsterRaceInfo *race_ptr = &monraces_info[monster_ptr->r_idx];
-
- TrFlags flags{};
- auto arrow_flags = object_flags(arrow_ptr);
- auto bow_flags = object_flags(bow_ptr);
+ auto &monrace = monster_ptr->get_monrace();
- flags = bow_flags | arrow_flags;
+ const auto arrow_flags = arrow_ptr->get_flags();
+ const auto bow_flags = bow_ptr->get_flags();
+ const auto flags = bow_flags | arrow_flags;
/* Some "weapons" and "ammo" do extra damage */
switch (arrow_ptr->bi_key.tval()) {
case ItemKindType::SHOT:
case ItemKindType::ARROW:
case ItemKindType::BOLT: {
- if ((flags.has(TR_SLAY_ANIMAL)) && race_ptr->kind_flags.has(MonsterKindType::ANIMAL)) {
+ if ((flags.has(TR_SLAY_ANIMAL)) && monrace.kind_flags.has(MonsterKindType::ANIMAL)) {
if (is_original_ap_and_seen(player_ptr, monster_ptr)) {
- race_ptr->r_kind_flags.set(MonsterKindType::ANIMAL);
+ monrace.r_kind_flags.set(MonsterKindType::ANIMAL);
}
if (mult < 17) {
mult = 17;
}
}
- if ((flags.has(TR_KILL_ANIMAL)) && race_ptr->kind_flags.has(MonsterKindType::ANIMAL)) {
+ if ((flags.has(TR_KILL_ANIMAL)) && monrace.kind_flags.has(MonsterKindType::ANIMAL)) {
if (is_original_ap_and_seen(player_ptr, monster_ptr)) {
- race_ptr->r_kind_flags.set(MonsterKindType::ANIMAL);
+ monrace.r_kind_flags.set(MonsterKindType::ANIMAL);
}
if (mult < 27) {
mult = 27;
}
}
- if ((flags.has(TR_SLAY_EVIL)) && race_ptr->kind_flags.has(MonsterKindType::EVIL)) {
+ if ((flags.has(TR_SLAY_EVIL)) && monrace.kind_flags.has(MonsterKindType::EVIL)) {
if (is_original_ap_and_seen(player_ptr, monster_ptr)) {
- race_ptr->r_kind_flags.set(MonsterKindType::EVIL);
+ monrace.r_kind_flags.set(MonsterKindType::EVIL);
}
if (mult < 15) {
mult = 15;
}
}
- if ((flags.has(TR_KILL_EVIL)) && race_ptr->kind_flags.has(MonsterKindType::EVIL)) {
+ if ((flags.has(TR_KILL_EVIL)) && monrace.kind_flags.has(MonsterKindType::EVIL)) {
if (is_original_ap_and_seen(player_ptr, monster_ptr)) {
- race_ptr->r_kind_flags.set(MonsterKindType::EVIL);
+ monrace.r_kind_flags.set(MonsterKindType::EVIL);
}
if (mult < 25) {
mult = 25;
}
}
- if ((flags.has(TR_SLAY_GOOD)) && race_ptr->kind_flags.has(MonsterKindType::GOOD)) {
+ if ((flags.has(TR_SLAY_GOOD)) && monrace.kind_flags.has(MonsterKindType::GOOD)) {
if (is_original_ap_and_seen(player_ptr, monster_ptr)) {
- race_ptr->r_kind_flags.set(MonsterKindType::GOOD);
+ monrace.r_kind_flags.set(MonsterKindType::GOOD);
}
if (mult < 15) {
mult = 15;
}
}
- if ((flags.has(TR_KILL_GOOD)) && race_ptr->kind_flags.has(MonsterKindType::GOOD)) {
+ if ((flags.has(TR_KILL_GOOD)) && monrace.kind_flags.has(MonsterKindType::GOOD)) {
if (is_original_ap_and_seen(player_ptr, monster_ptr)) {
- race_ptr->r_kind_flags.set(MonsterKindType::GOOD);
+ monrace.r_kind_flags.set(MonsterKindType::GOOD);
}
if (mult < 25) {
mult = 25;
}
}
- if ((flags.has(TR_SLAY_HUMAN)) && race_ptr->kind_flags.has(MonsterKindType::HUMAN)) {
+ if ((flags.has(TR_SLAY_HUMAN)) && monrace.kind_flags.has(MonsterKindType::HUMAN)) {
if (is_original_ap_and_seen(player_ptr, monster_ptr)) {
- race_ptr->r_kind_flags.set(MonsterKindType::HUMAN);
+ monrace.r_kind_flags.set(MonsterKindType::HUMAN);
}
if (mult < 17) {
mult = 17;
}
}
- if ((flags.has(TR_KILL_HUMAN)) && race_ptr->kind_flags.has(MonsterKindType::HUMAN)) {
+ if ((flags.has(TR_KILL_HUMAN)) && monrace.kind_flags.has(MonsterKindType::HUMAN)) {
if (is_original_ap_and_seen(player_ptr, monster_ptr)) {
- race_ptr->r_kind_flags.set(MonsterKindType::HUMAN);
+ monrace.r_kind_flags.set(MonsterKindType::HUMAN);
}
if (mult < 27) {
mult = 27;
}
}
- if ((flags.has(TR_SLAY_UNDEAD)) && race_ptr->kind_flags.has(MonsterKindType::UNDEAD)) {
+ if ((flags.has(TR_SLAY_UNDEAD)) && monrace.kind_flags.has(MonsterKindType::UNDEAD)) {
if (is_original_ap_and_seen(player_ptr, monster_ptr)) {
- race_ptr->r_kind_flags.set(MonsterKindType::UNDEAD);
+ monrace.r_kind_flags.set(MonsterKindType::UNDEAD);
}
if (mult < 20) {
mult = 20;
}
}
- if ((flags.has(TR_KILL_UNDEAD)) && race_ptr->kind_flags.has(MonsterKindType::UNDEAD)) {
+ if ((flags.has(TR_KILL_UNDEAD)) && monrace.kind_flags.has(MonsterKindType::UNDEAD)) {
if (is_original_ap_and_seen(player_ptr, monster_ptr)) {
- race_ptr->r_kind_flags.set(MonsterKindType::UNDEAD);
+ monrace.r_kind_flags.set(MonsterKindType::UNDEAD);
}
if (mult < 30) {
mult = 30;
}
}
- if ((flags.has(TR_SLAY_DEMON)) && race_ptr->kind_flags.has(MonsterKindType::DEMON)) {
+ if ((flags.has(TR_SLAY_DEMON)) && monrace.kind_flags.has(MonsterKindType::DEMON)) {
if (is_original_ap_and_seen(player_ptr, monster_ptr)) {
- race_ptr->r_kind_flags.set(MonsterKindType::DEMON);
+ monrace.r_kind_flags.set(MonsterKindType::DEMON);
}
if (mult < 20) {
mult = 20;
}
}
- if ((flags.has(TR_KILL_DEMON)) && race_ptr->kind_flags.has(MonsterKindType::DEMON)) {
+ if ((flags.has(TR_KILL_DEMON)) && monrace.kind_flags.has(MonsterKindType::DEMON)) {
if (is_original_ap_and_seen(player_ptr, monster_ptr)) {
- race_ptr->r_kind_flags.set(MonsterKindType::DEMON);
+ monrace.r_kind_flags.set(MonsterKindType::DEMON);
}
if (mult < 30) {
mult = 30;
}
}
- if ((flags.has(TR_SLAY_ORC)) && race_ptr->kind_flags.has(MonsterKindType::ORC)) {
+ if ((flags.has(TR_SLAY_ORC)) && monrace.kind_flags.has(MonsterKindType::ORC)) {
if (is_original_ap_and_seen(player_ptr, monster_ptr)) {
- race_ptr->r_kind_flags.set(MonsterKindType::ORC);
+ monrace.r_kind_flags.set(MonsterKindType::ORC);
}
if (mult < 20) {
mult = 20;
}
}
- if ((flags.has(TR_KILL_ORC)) && race_ptr->kind_flags.has(MonsterKindType::ORC)) {
+ if ((flags.has(TR_KILL_ORC)) && monrace.kind_flags.has(MonsterKindType::ORC)) {
if (is_original_ap_and_seen(player_ptr, monster_ptr)) {
- race_ptr->r_kind_flags.set(MonsterKindType::ORC);
+ monrace.r_kind_flags.set(MonsterKindType::ORC);
}
if (mult < 30) {
mult = 30;
}
}
- if ((flags.has(TR_SLAY_TROLL)) && race_ptr->kind_flags.has(MonsterKindType::TROLL)) {
+ if ((flags.has(TR_SLAY_TROLL)) && monrace.kind_flags.has(MonsterKindType::TROLL)) {
if (is_original_ap_and_seen(player_ptr, monster_ptr)) {
- race_ptr->r_kind_flags.set(MonsterKindType::TROLL);
+ monrace.r_kind_flags.set(MonsterKindType::TROLL);
}
if (mult < 20) {
}
}
- if ((flags.has(TR_KILL_TROLL)) && race_ptr->kind_flags.has(MonsterKindType::TROLL)) {
+ if ((flags.has(TR_KILL_TROLL)) && monrace.kind_flags.has(MonsterKindType::TROLL)) {
if (is_original_ap_and_seen(player_ptr, monster_ptr)) {
- race_ptr->r_kind_flags.set(MonsterKindType::TROLL);
+ monrace.r_kind_flags.set(MonsterKindType::TROLL);
}
if (mult < 30) {
mult = 30;
}
}
- if ((flags.has(TR_SLAY_GIANT)) && race_ptr->kind_flags.has(MonsterKindType::GIANT)) {
+ if ((flags.has(TR_SLAY_GIANT)) && monrace.kind_flags.has(MonsterKindType::GIANT)) {
if (is_original_ap_and_seen(player_ptr, monster_ptr)) {
- race_ptr->r_kind_flags.set(MonsterKindType::GIANT);
+ monrace.r_kind_flags.set(MonsterKindType::GIANT);
}
if (mult < 20) {
mult = 20;
}
}
- if ((flags.has(TR_KILL_GIANT)) && race_ptr->kind_flags.has(MonsterKindType::GIANT)) {
+ if ((flags.has(TR_KILL_GIANT)) && monrace.kind_flags.has(MonsterKindType::GIANT)) {
if (is_original_ap_and_seen(player_ptr, monster_ptr)) {
- race_ptr->r_kind_flags.set(MonsterKindType::GIANT);
+ monrace.r_kind_flags.set(MonsterKindType::GIANT);
}
if (mult < 30) {
mult = 30;
}
}
- if ((flags.has(TR_SLAY_DRAGON)) && race_ptr->kind_flags.has(MonsterKindType::DRAGON)) {
+ if ((flags.has(TR_SLAY_DRAGON)) && monrace.kind_flags.has(MonsterKindType::DRAGON)) {
if (is_original_ap_and_seen(player_ptr, monster_ptr)) {
- race_ptr->r_kind_flags.set(MonsterKindType::DRAGON);
+ monrace.r_kind_flags.set(MonsterKindType::DRAGON);
}
if (mult < 20) {
mult = 20;
}
}
- if ((flags.has(TR_KILL_DRAGON)) && race_ptr->kind_flags.has(MonsterKindType::DRAGON)) {
+ if ((flags.has(TR_KILL_DRAGON)) && monrace.kind_flags.has(MonsterKindType::DRAGON)) {
if (is_original_ap_and_seen(player_ptr, monster_ptr)) {
- race_ptr->r_kind_flags.set(MonsterKindType::DRAGON);
+ monrace.r_kind_flags.set(MonsterKindType::DRAGON);
}
if (mult < 30) {
mult = 30;
if (flags.has(TR_BRAND_ACID)) {
/* Notice immunity */
- if (race_ptr->resistance_flags.has_any_of(RFR_EFF_IM_ACID_MASK)) {
+ if (monrace.resistance_flags.has_any_of(RFR_EFF_IM_ACID_MASK)) {
if (is_original_ap_and_seen(player_ptr, monster_ptr)) {
- race_ptr->r_resistance_flags.set(race_ptr->resistance_flags & RFR_EFF_IM_ACID_MASK);
+ monrace.r_resistance_flags.set(monrace.resistance_flags & RFR_EFF_IM_ACID_MASK);
}
} else {
if (mult < 17) {
if (flags.has(TR_BRAND_ELEC)) {
/* Notice immunity */
- if (race_ptr->resistance_flags.has_any_of(RFR_EFF_IM_ELEC_MASK)) {
+ if (monrace.resistance_flags.has_any_of(RFR_EFF_IM_ELEC_MASK)) {
if (is_original_ap_and_seen(player_ptr, monster_ptr)) {
- race_ptr->r_resistance_flags.set(race_ptr->resistance_flags & RFR_EFF_IM_ELEC_MASK);
+ monrace.r_resistance_flags.set(monrace.resistance_flags & RFR_EFF_IM_ELEC_MASK);
}
} else {
if (mult < 17) {
if (flags.has(TR_BRAND_FIRE)) {
/* Notice immunity */
- if (race_ptr->resistance_flags.has_any_of(RFR_EFF_IM_FIRE_MASK)) {
+ if (monrace.resistance_flags.has_any_of(RFR_EFF_IM_FIRE_MASK)) {
if (is_original_ap_and_seen(player_ptr, monster_ptr)) {
- race_ptr->r_resistance_flags.set(race_ptr->resistance_flags & RFR_EFF_IM_FIRE_MASK);
+ monrace.r_resistance_flags.set(monrace.resistance_flags & RFR_EFF_IM_FIRE_MASK);
}
}
/* Otherwise, take the damage */
else {
- if (race_ptr->resistance_flags.has(MonsterResistanceType::HURT_FIRE)) {
+ if (monrace.resistance_flags.has(MonsterResistanceType::HURT_FIRE)) {
if (mult < 25) {
mult = 25;
}
if (is_original_ap_and_seen(player_ptr, monster_ptr)) {
- race_ptr->r_resistance_flags.set(MonsterResistanceType::HURT_FIRE);
+ monrace.r_resistance_flags.set(MonsterResistanceType::HURT_FIRE);
}
} else if (mult < 17) {
mult = 17;
if (flags.has(TR_BRAND_COLD)) {
/* Notice immunity */
- if (race_ptr->resistance_flags.has_any_of(RFR_EFF_IM_COLD_MASK)) {
+ if (monrace.resistance_flags.has_any_of(RFR_EFF_IM_COLD_MASK)) {
if (is_original_ap_and_seen(player_ptr, monster_ptr)) {
- race_ptr->r_resistance_flags.set(race_ptr->resistance_flags & RFR_EFF_IM_COLD_MASK);
+ monrace.r_resistance_flags.set(monrace.resistance_flags & RFR_EFF_IM_COLD_MASK);
}
}
/* Otherwise, take the damage */
else {
- if (race_ptr->resistance_flags.has(MonsterResistanceType::HURT_COLD)) {
+ if (monrace.resistance_flags.has(MonsterResistanceType::HURT_COLD)) {
if (mult < 25) {
mult = 25;
}
if (is_original_ap_and_seen(player_ptr, monster_ptr)) {
- race_ptr->r_resistance_flags.set(MonsterResistanceType::HURT_COLD);
+ monrace.r_resistance_flags.set(MonsterResistanceType::HURT_COLD);
}
} else if (mult < 17) {
mult = 17;
if (flags.has(TR_BRAND_POIS)) {
/* Notice immunity */
- if (race_ptr->resistance_flags.has_any_of(RFR_EFF_IM_POISON_MASK)) {
+ if (monrace.resistance_flags.has_any_of(RFR_EFF_IM_POISON_MASK)) {
if (is_original_ap_and_seen(player_ptr, monster_ptr)) {
- race_ptr->r_resistance_flags.set(race_ptr->resistance_flags & RFR_EFF_IM_POISON_MASK);
+ monrace.r_resistance_flags.set(monrace.resistance_flags & RFR_EFF_IM_POISON_MASK);
}
}
/* Otherwise, take the damage */
if ((flags.has(TR_FORCE_WEAPON)) && (player_ptr->csp > (player_ptr->msp / 30))) {
player_ptr->csp -= (1 + (player_ptr->msp / 30));
- set_bits(player_ptr->redraw, PR_MANA);
+ RedrawingFlagsUpdater::get_instance().set_flag(MainWindowRedrawingFlag::MP);
mult = mult * 5 / 2;
}
break;
auto stick_to = false;
/* Access the item (if in the pack) */
+ auto *floor_ptr = player_ptr->current_floor_ptr;
if (item >= 0) {
o_ptr = &player_ptr->inventory_list[item];
} else {
- o_ptr = &player_ptr->current_floor_ptr->o_list[0 - item];
+ o_ptr = &floor_ptr->o_list[0 - item];
}
/* Sniper - Cannot shot a single arrow twice */
snipe_type = SP_NONE;
}
- GAME_TEXT o_name[MAX_NLEN];
- describe_flavor(player_ptr, o_name, o_ptr, OD_OMIT_PREFIX);
+ const auto item_name = describe_flavor(player_ptr, o_ptr, OD_OMIT_PREFIX);
/* Use the proper number of shots */
auto thits = player_ptr->num_fire;
tdam_base *= tmul;
tdam_base /= 100;
- auto sniper_data = PlayerClass(player_ptr).get_specific_data<sniper_data_type>();
+ auto sniper_data = PlayerClass(player_ptr).get_specific_data<SniperData>();
auto sniper_concent = sniper_data ? sniper_data->concent : 0;
/* Base range */
/* Shatter Arrow */
if (snipe_type == SP_KILL_WALL) {
- g_ptr = &player_ptr->current_floor_ptr->grid_array[ny][nx];
+ g_ptr = &floor_ptr->grid_array[ny][nx];
if (g_ptr->cave_has_flag(TerrainCharacteristics::HURT_ROCK) && !g_ptr->m_idx) {
if (any_bits(g_ptr->info, (CAVE_MARK))) {
}
/* Forget the wall */
reset_bits(g_ptr->info, (CAVE_MARK));
- set_bits(player_ptr->update, PU_VIEW | PU_LITE | PU_FLOW | PU_MON_LITE);
+ static constexpr auto flags = {
+ StatusRecalculatingFlag::VIEW,
+ StatusRecalculatingFlag::LITE,
+ StatusRecalculatingFlag::FLOW,
+ StatusRecalculatingFlag::MONSTER_LITE,
+ };
+ RedrawingFlagsUpdater::get_instance().set_flags(flags);
/* Destroy the wall */
cave_alter_feat(player_ptr, ny, nx, TerrainCharacteristics::HURT_ROCK);
}
/* Stopped by walls/doors */
- if (!cave_has_flag_bold(player_ptr->current_floor_ptr, ny, nx, TerrainCharacteristics::PROJECT) && !player_ptr->current_floor_ptr->grid_array[ny][nx].m_idx) {
+ if (!cave_has_flag_bold(floor_ptr, ny, nx, TerrainCharacteristics::PROJECT) && !floor_ptr->grid_array[ny][nx].m_idx) {
break;
}
/* Sniper */
if (snipe_type == SP_LITE) {
- set_bits(player_ptr->current_floor_ptr->grid_array[ny][nx].info, CAVE_GLOW);
+ set_bits(floor_ptr->grid_array[ny][nx].info, CAVE_GLOW);
note_spot(player_ptr, ny, nx);
lite_spot(player_ptr, ny, nx);
}
/* Sniper */
if (snipe_type == SP_KILL_TRAP) {
- project(player_ptr, 0, 0, ny, nx, 0, AttributeType::KILL_TRAP, (PROJECT_JUMP | PROJECT_HIDE | PROJECT_GRID | PROJECT_ITEM));
+ constexpr auto flags = PROJECT_JUMP | PROJECT_HIDE | PROJECT_GRID | PROJECT_ITEM;
+ project(player_ptr, 0, 0, ny, nx, 0, AttributeType::KILL_TRAP, flags);
}
/* Sniper */
if (snipe_type == SP_EVILNESS) {
- reset_bits(player_ptr->current_floor_ptr->grid_array[ny][nx].info, (CAVE_GLOW | CAVE_MARK));
+ reset_bits(floor_ptr->grid_array[ny][nx].info, (CAVE_GLOW | CAVE_MARK));
note_spot(player_ptr, ny, nx);
lite_spot(player_ptr, ny, nx);
}
y = ny;
/* Monster here, Try to hit it */
- if (player_ptr->current_floor_ptr->grid_array[y][x].m_idx) {
+ if (floor_ptr->grid_array[y][x].m_idx) {
sound(SOUND_SHOOT_HIT);
- grid_type *c_mon_ptr = &player_ptr->current_floor_ptr->grid_array[y][x];
+ grid_type *c_mon_ptr = &floor_ptr->grid_array[y][x];
- auto *m_ptr = &player_ptr->current_floor_ptr->m_list[c_mon_ptr->m_idx];
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *m_ptr = &floor_ptr->m_list[c_mon_ptr->m_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
/* Check the visibility */
auto visible = m_ptr->ml;
if (m_ptr->is_asleep()) {
if (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 (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);
}
}
}
/* Did we hit it (penalize range) */
- if (test_hit_fire(player_ptr, chance - cur_dis, m_ptr, m_ptr->ml, o_name)) {
+ if (test_hit_fire(player_ptr, chance - cur_dis, m_ptr, m_ptr->ml, item_name.data())) {
bool fear = false;
auto tdam = tdam_base; //!< @note 実際に与えるダメージ
auto base_dam = tdam; //!< @note 補正前の与えるダメージ(無傷、全ての耐性など)
/* Handle unseen monster */
if (!visible) {
/* Invisible monster */
- msg_format(_("%sが敵を捕捉した。", "The %s finds a mark."), o_name);
+ msg_format(_("%sが敵を捕捉した。", "The %s finds a mark."), item_name.data());
}
/* Handle visible monster */
/* Get "the monster" or "it" */
const auto m_name = monster_desc(player_ptr, m_ptr, 0);
- msg_format(_("%sが%sに命中した。", "The %s hits %s."), o_name, m_name.data());
+ msg_format(_("%sが%sに命中した。", "The %s hits %s."), item_name.data(), m_name.data());
if (m_ptr->ml) {
if (!player_ptr->effects()->hallucination()->is_hallucinated()) {
/* Sniper */
if (snipe_type == SP_HOLYNESS) {
- set_bits(player_ptr->current_floor_ptr->grid_array[ny][nx].info, CAVE_GLOW);
+ set_bits(floor_ptr->grid_array[ny][nx].info, CAVE_GLOW);
note_spot(player_ptr, ny, nx);
lite_spot(player_ptr, ny, nx);
}
/* Hit the monster, check for death */
MonsterDamageProcessor mdp(player_ptr, c_mon_ptr->m_idx, tdam, &fear, attribute_flags);
- if (mdp.mon_take_hit(extract_note_dies(m_ptr->get_real_r_idx()))) {
+ if (mdp.mon_take_hit(m_ptr->get_died_message())) {
/* Dead monster */
}
const auto m_name = monster_desc(player_ptr, m_ptr, 0);
stick_to = true;
- msg_format(_("%sは%sに突き刺さった!", "%s^ is stuck in %s!"), o_name, m_name.data());
+ msg_format(_("%sは%sに突き刺さった!", "%s^ is stuck in %s!"), item_name.data(), m_name.data());
}
if (const auto pain_message = MonsterPainDescriber(player_ptr, c_mon_ptr->m_idx).describe(tdam);
mmove2(&ny, &nx, player_ptr->y, player_ptr->x, ty, tx);
/* Stopped by wilderness boundary */
- if (!in_bounds2(player_ptr->current_floor_ptr, ny, nx)) {
+ if (!in_bounds2(floor_ptr, ny, nx)) {
break;
}
/* Stopped by walls/doors */
- if (!player_can_enter(player_ptr, player_ptr->current_floor_ptr->grid_array[ny][nx].feat, 0)) {
+ if (!player_can_enter(player_ptr, floor_ptr->grid_array[ny][nx].feat, 0)) {
break;
}
break;
}
- player_ptr->current_floor_ptr->grid_array[ny][nx].m_idx = m_idx;
- player_ptr->current_floor_ptr->grid_array[oy][ox].m_idx = 0;
+ floor_ptr->grid_array[ny][nx].m_idx = m_idx;
+ floor_ptr->grid_array[oy][ox].m_idx = 0;
m_ptr->fx = nx;
m_ptr->fy = ny;
auto j = (hit_body ? breakage_chance(player_ptr, q_ptr, PlayerClass(player_ptr).equals(PlayerClassType::ARCHER), snipe_type) : 0);
if (stick_to) {
- MONSTER_IDX m_idx = player_ptr->current_floor_ptr->grid_array[y][x].m_idx;
- auto *m_ptr = &player_ptr->current_floor_ptr->m_list[m_idx];
- OBJECT_IDX o_idx = o_pop(player_ptr->current_floor_ptr);
+ MONSTER_IDX m_idx = floor_ptr->grid_array[y][x].m_idx;
+ auto *m_ptr = &floor_ptr->m_list[m_idx];
+ OBJECT_IDX o_idx = o_pop(floor_ptr);
if (!o_idx) {
- msg_format(_("%sはどこかへ行った。", "The %s went somewhere."), o_name);
+ msg_format(_("%sはどこかへ行った。", "The %s went somewhere."), item_name.data());
if (q_ptr->is_fixed_artifact()) {
- artifacts_info.at(j_ptr->fixed_artifact_idx).is_generated = false;
+ ArtifactsInfo::get_instance().get_artifact(j_ptr->fixed_artifact_idx).is_generated = false;
}
return;
}
- o_ptr = &player_ptr->current_floor_ptr->o_list[o_idx];
+ o_ptr = &floor_ptr->o_list[o_idx];
o_ptr->copy_from(q_ptr);
/* Forget mark */
o_ptr->held_m_idx = m_idx;
/* Carry object */
- m_ptr->hold_o_idx_list.add(player_ptr->current_floor_ptr, o_idx);
- } else if (cave_has_flag_bold(player_ptr->current_floor_ptr, y, x, TerrainCharacteristics::PROJECT)) {
+ m_ptr->hold_o_idx_list.add(floor_ptr, o_idx);
+ } else if (cave_has_flag_bold(floor_ptr, y, x, TerrainCharacteristics::PROJECT)) {
/* Drop (or break) near that location */
(void)drop_near(player_ptr, q_ptr, j, y, x);
} else {
}
/*!
- * @brief プレイヤーからモンスターへの射撃命中判定 /
- * Determine if the player "hits" a monster (normal combat).
+ * @brief プレイヤーからモンスターへの射撃命中判定
* @param chance 基本命中値
* @param monster_ptr モンスターの構造体参照ポインタ
* @param vis 目標を視界に捕らえているならばTRUEを指定
- * @param o_name ã\83¡ã\83\83ã\82»ã\83¼ã\82¸è¡¨ç¤ºæ\99\82ã\81®ã\83¢ã\83³ã\82¹ã\82¿ã\83¼å\90\8d
+ * @param item_name ç\9f³å·\9däº\94å\8f³è¡\9bé\96\80å°\82ç\94¨ã\83¡ã\83\83ã\82»ã\83¼ã\82¸ï¼\9aç\84¡å\8a¹å\8c\96ã\81\97ã\81\9fç\9f¢å¼¾ã\81®å\90\8då\89\8d
* @return 命中と判定された場合TRUEを返す
- * @note Always miss 5%, always hit 5%, otherwise random.
+ * @note 最低命中率5%、最大命中率95%
*/
-bool test_hit_fire(PlayerType *player_ptr, int chance, MonsterEntity *m_ptr, int vis, char *o_name)
+bool test_hit_fire(PlayerType *player_ptr, int chance, MonsterEntity *m_ptr, int vis, std::string_view item_name)
{
int k;
ARMOUR_CLASS ac;
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
/* Percentile dice */
k = randint1(100);
- auto sniper_data = PlayerClass(player_ptr).get_specific_data<sniper_data_type>();
+ auto sniper_data = PlayerClass(player_ptr).get_specific_data<SniperData>();
auto sniper_concent = sniper_data ? sniper_data->concent : 0;
/* Snipers with high-concentration reduce instant miss percentage.*/
if (randint0(chance) < (ac * 3 / 4)) {
if (m_ptr->r_idx == MonsterRaceId::GOEMON && !m_ptr->is_asleep()) {
const auto m_name = monster_desc(player_ptr, m_ptr, 0);
- msg_format(_("%sは%sを斬り捨てた!", "%s cuts down %s!"), m_name.data(), o_name);
+ msg_format(_("%sは%sを斬り捨てた!", "%s cuts down %s!"), m_name.data(), item_name.data());
}
return false;
}
}
PlayerClass pc(player_ptr);
- const auto sniper_data = pc.get_specific_data<sniper_data_type>();
+ const auto sniper_data = pc.get_specific_data<SniperData>();
const auto sniper_concent = sniper_data ? sniper_data->concent : 0;
/* Snipers can shot more critically with crossbows */
}
PlayerClass pc(player_ptr);
- auto sniper_data = pc.get_specific_data<sniper_data_type>();
+ auto sniper_data = pc.get_specific_data<SniperData>();
auto sniper_concent = sniper_data ? sniper_data->concent : 0;
/* Snipers can shot more critically with crossbows */