bool can_move = true;
bool do_past = false;
if (g_ptr->m_idx && (m_ptr->ml || p_can_enter || p_can_kill_walls)) {
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
auto effects = player_ptr->effects();
auto is_stunned = effects->stun()->is_stunned();
auto can_cast = !effects->confusion()->is_confused();
void AvatarChanger::change_virtue_non_beginner()
{
auto *floor_ptr = this->player_ptr->current_floor_ptr;
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
if (floor_ptr->get_dungeon_definition().flags.has(DungeonFeatureType::BEGINNER)) {
return;
}
*/
void AvatarChanger::change_virtue_unique()
{
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
if (r_ptr->kind_flags.has_not(MonsterKindType::UNIQUE)) {
return;
}
void AvatarChanger::change_virtue_good_evil()
{
auto *floor_ptr = this->player_ptr->current_floor_ptr;
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
if (r_ptr->kind_flags.has(MonsterKindType::GOOD) && ((r_ptr->level) / 10 + (3 * floor_ptr->dun_level) >= randint1(100))) {
chg_virtue(this->player_ptr, Virtue::UNLIFE, 1);
}
void AvatarChanger::change_virtue_revenge()
{
auto *floor_ptr = this->player_ptr->current_floor_ptr;
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
if (r_ptr->r_deaths == 0) {
return;
}
void AvatarChanger::change_virtue_wild_thief()
{
auto *floor_ptr = this->player_ptr->current_floor_ptr;
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
auto innocent = true;
auto thief = false;
for (const auto &blow : r_ptr->blows) {
*/
void AvatarChanger::change_virtue_good_animal()
{
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
auto magic_ability_flags = r_ptr->ability_flags;
magic_ability_flags.reset(RF_ABILITY_NOMAGIC_MASK);
if (r_ptr->kind_flags.has_not(MonsterKindType::ANIMAL) || r_ptr->kind_flags.has(MonsterKindType::EVIL) || magic_ability_flags.any()) {
}
m_ptr = &floor_ptr->m_list[floor_ptr->grid_array[target_row][target_col].m_idx];
- r_ptr = &monraces_info[m_ptr->r_idx];
+ r_ptr = &m_ptr->get_monrace();
auto m_name = monster_desc(player_ptr, m_ptr, 0);
if (r_ptr->resistance_flags.has_not(MonsterResistanceType::RESIST_TELEPORT)) {
return m_name;
{
WEIGHT n_weight = 0;
auto *m_ptr = &player_ptr->current_floor_ptr->m_list[m_idx];
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
int dice_num, dice_side;
concptr atk_desc;
auto &floor = *player_ptr->current_floor_ptr;
auto *g_ptr = &floor.grid_array[y][x];
auto *m_ptr = &floor.m_list[g_ptr->m_idx];
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
const auto mutation_attack_methods = {
PlayerMutationType::HORNS,
const auto &grid = floor_ptr->grid_array[target_row][target_col];
auto *m_ptr = &floor_ptr->m_list[grid.m_idx];
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
const auto m_name = monster_desc(player_ptr, m_ptr, 0);
if (r_ptr->resistance_flags.has(MonsterResistanceType::RESIST_TELEPORT)) {
if (r_ptr->kind_flags.has(MonsterKindType::UNIQUE) || r_ptr->resistance_flags.has(MonsterResistanceType::RESIST_ALL)) {
msg_print(_("そのモンスターはペットではありません。", "That monster is not a pet."));
return false;
}
- if (!(monraces_info[m_ptr->r_idx].flags7 & RF7_RIDING)) {
+ if (!(m_ptr->get_monrace().flags7 & RF7_RIDING)) {
msg_print(_("そのモンスターには乗れなさそうだ。", "This monster doesn't seem suitable for riding."));
return false;
}
return false;
}
- if (monraces_info[m_ptr->r_idx].level > randint1((player_ptr->skill_exp[PlayerSkillKindType::RIDING] / 50 + player_ptr->lev / 2 + 20))) {
+ if (m_ptr->get_monrace().level > randint1((player_ptr->skill_exp[PlayerSkillKindType::RIDING] / 50 + player_ptr->lev / 2 + 20))) {
msg_print(_("うまく乗れなかった。", "You failed to ride."));
PlayerEnergy(player_ptr).set_player_turn_energy(100);
return false;
return;
}
- if (monraces_info[m_ptr->r_idx].kind_flags.has(MonsterKindType::UNIQUE)) {
+ if (m_ptr->get_monrace().kind_flags.has(MonsterKindType::UNIQUE)) {
msg_print(_("そのモンスターの名前は変えられない!", "You cannot change the name of this monster!"));
return;
}
grid_type *c_mon_ptr = &floor_ptr->grid_array[y][x];
auto *m_ptr = &floor_ptr->m_list[c_mon_ptr->m_idx];
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
/* Check the visibility */
auto visible = m_ptr->ml;
{
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);
{ TR_KILL_DRAGON, MonsterKindType::DRAGON, 50 },
};
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
for (size_t i = 0; i < sizeof(slay_table) / sizeof(slay_table[0]); ++i) {
const struct slay_table_t *p = &slay_table[i];
{ TR_BRAND_POIS, RFR_EFF_IM_POISON_MASK, MonsterResistanceType::MAX },
};
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
for (size_t i = 0; i < sizeof(brand_table) / sizeof(brand_table[0]); ++i) {
const struct brand_table_t *p = &brand_table[i];
const auto effects = player_ptr->effects();
if (player_ptr->riding && !effects->confusion()->is_confused() && !effects->blindness()->is_blind()) {
auto *m_ptr = &player_ptr->current_floor_ptr->m_list[player_ptr->riding];
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
if (m_ptr->is_asleep()) {
const auto m_name = monster_desc(player_ptr, m_ptr, 0);
(void)set_monster_csleep(player_ptr, player_ptr->riding, 0);
auto x = gx[i];
if (grids <= 1) {
auto *m_ptr = &player_ptr->current_floor_ptr->m_list[player_ptr->current_floor_ptr->grid_array[y][x].m_idx];
- MonsterRaceInfo *ref_ptr = &monraces_info[m_ptr->r_idx];
+ MonsterRaceInfo *ref_ptr = &m_ptr->get_monrace();
if ((flag & PROJECT_REFLECTABLE) && player_ptr->current_floor_ptr->grid_array[y][x].m_idx && (ref_ptr->flags2 & RF2_REFLECTING) && ((player_ptr->current_floor_ptr->grid_array[y][x].m_idx != player_ptr->riding) || !(flag & PROJECT_PLAYER)) && (!who || path_n > 1) && !one_in_(10)) {
POSITION t_y, t_x;
int max_attempts = 10;
continue;
}
- r_ptr = &monraces_info[m_ptr->r_idx];
+ r_ptr = &m_ptr->get_monrace();
if (r_ptr->kind_flags.has(MonsterKindType::UNIQUE)) {
if (r_ptr->level + 10 > floor_ptr->dun_level) {
delta += (r_ptr->level + 10 - floor_ptr->dun_level) * 2 * base;
}
if (!(mode & TELEPORT_PASSIVE)) {
- if (!monster_can_cross_terrain(player_ptr, g_ptr->feat, &monraces_info[m_ptr->r_idx], 0)) {
+ if (!monster_can_cross_terrain(player_ptr, g_ptr->feat, &m_ptr->get_monrace(), 0)) {
return false;
}
}
{
for (int i = 1; i < player_ptr->current_floor_ptr->m_max; i++) {
auto *m_ptr = &player_ptr->current_floor_ptr->m_list[i];
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
if (!m_ptr->is_valid()) {
continue;
}
if (h_older_than(1, 0, 14)) {
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
m_ptr->sub_align = SUB_ALIGN_NEUTRAL;
if (r_ptr->kind_flags.has(MonsterKindType::EVIL)) {
void lore_treasure(PlayerType *player_ptr, MONSTER_IDX m_idx, ITEM_NUMBER num_item, ITEM_NUMBER num_gold)
{
auto *m_ptr = &player_ptr->current_floor_ptr->m_list[m_idx];
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
if (!m_ptr->is_original_ap()) {
return;
static void aura_cold_by_melee(PlayerType *player_ptr, mam_type *mam_ptr)
{
const auto *m_ptr = mam_ptr->m_ptr;
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
MonsterRaceInfo *tr_ptr = &monraces_info[mam_ptr->t_ptr->r_idx];
if (tr_ptr->aura_flags.has_not(MonsterAuraType::COLD) || !MonsterRace(m_ptr->r_idx).is_valid()) {
return;
static void aura_elec_by_melee(PlayerType *player_ptr, mam_type *mam_ptr)
{
const auto *m_ptr = mam_ptr->m_ptr;
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
MonsterRaceInfo *tr_ptr = &monraces_info[mam_ptr->t_ptr->r_idx];
if (tr_ptr->aura_flags.has_not(MonsterAuraType::ELEC) || !MonsterRace(m_ptr->r_idx).is_valid()) {
return;
void repeat_melee(PlayerType *player_ptr, mam_type *mam_ptr)
{
const auto *m_ptr = mam_ptr->m_ptr;
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
for (int ap_cnt = 0; ap_cnt < MAX_NUM_BLOWS; ap_cnt++) {
mam_ptr->effect = r_ptr->blows[ap_cnt].effect;
mam_ptr->method = r_ptr->blows[ap_cnt].method;
}
auto *m_ptr = &player_ptr->current_floor_ptr->m_list[player_ptr->riding];
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
const auto m_name = monster_desc(player_ptr, m_ptr, 0);
msg_format(_("%sに乗った。", "You ride on %s."), m_name.data());
POSITION oy = y, ox = x;
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];
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
const auto m_name = monster_desc(player_ptr, m_ptr, 0);
if (randint1(r_ptr->level * 3 / 2) > randint0(dam / 2) + dam / 2) {
*/
MULTIPLY mult_hissatsu(PlayerType *player_ptr, MULTIPLY mult, const TrFlags &flags, MonsterEntity *m_ptr, combat_options mode)
{
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
samurai_slaying_type tmp_slaying(mult, flags, m_ptr, mode, r_ptr);
samurai_slaying_type *samurai_slaying_ptr = &tmp_slaying;
hissatsu_burning_strike(player_ptr, samurai_slaying_ptr);
*/
MULTIPLY calc_snipe_damage_with_slay(PlayerType *player_ptr, MULTIPLY mult, MonsterEntity *m_ptr, SPELL_IDX snipe_type)
{
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
bool seen = is_seen(player_ptr, m_ptr);
auto sniper_data = PlayerClass(player_ptr).get_specific_data<SniperData>();
{
auto &floor = *player_ptr->current_floor_ptr;
auto *m_ptr = &floor.m_list[m_idx];
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
if (!turn_flags_ptr->do_move || !player_bold(player_ptr, ny, nx)) {
return;
}
{
auto &floor = *player_ptr->current_floor_ptr;
auto *m_ptr = &floor.m_list[m_idx];
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
MonsterEntity *y_ptr;
y_ptr = &player_ptr->current_floor_ptr->m_list[g_ptr->m_idx];
if (r_ptr->behavior_flags.has(MonsterBehaviorType::NEVER_BLOW)) {
bool process_monster_attack_to_monster(PlayerType *player_ptr, turn_flags *turn_flags_ptr, MONSTER_IDX m_idx, grid_type *g_ptr, bool can_cross)
{
auto *m_ptr = &player_ptr->current_floor_ptr->m_list[m_idx];
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
MonsterEntity *y_ptr;
y_ptr = &player_ptr->current_floor_ptr->m_list[g_ptr->m_idx];
if (!turn_flags_ptr->do_move || (g_ptr->m_idx == 0)) {
*/
static bool decide_pet_approch_direction(PlayerType *player_ptr, MonsterEntity *m_ptr, MonsterEntity *t_ptr)
{
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
if (!m_ptr->is_pet()) {
return false;
}
{
auto *floor_ptr = player_ptr->current_floor_ptr;
auto *m_ptr = &floor_ptr->m_list[m_idx];
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
for (int i = start; ((i < start + floor_ptr->m_max) && (i > start - floor_ptr->m_max)); i += plus) {
MONSTER_IDX dummy = (i % floor_ptr->m_max);
if (dummy == 0) {
*/
static bool random_walk(PlayerType *player_ptr, DIRECTION *mm, MonsterEntity *m_ptr)
{
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
if (r_ptr->behavior_flags.has_all_of({ MonsterBehaviorType::RAND_MOVE_50, MonsterBehaviorType::RAND_MOVE_25 }) && (randint0(100) < 75)) {
if (is_original_ap_and_seen(player_ptr, m_ptr)) {
r_ptr->r_behavior_flags.set({ MonsterBehaviorType::RAND_MOVE_50, MonsterBehaviorType::RAND_MOVE_25 });
bool decide_monster_movement_direction(PlayerType *player_ptr, DIRECTION *mm, MONSTER_IDX m_idx, bool aware)
{
auto *m_ptr = &player_ptr->current_floor_ptr->m_list[m_idx];
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
if (m_ptr->is_confused() || !aware) {
mm[0] = mm[1] = mm[2] = mm[3] = 5;
MonsterRaceInfo *r_ptr;
for (int i = 1; i < floor_ptr->m_max; i++) {
m_ptr = &floor_ptr->m_list[i];
- r_ptr = &monraces_info[m_ptr->r_idx];
+ r_ptr = &m_ptr->get_monrace();
if (!m_ptr->is_valid() || (m_ptr->cdis > dis_lim)) {
continue;
}
static bool check_hp_for_terrain_destruction(TerrainType *f_ptr, MonsterEntity *m_ptr)
{
auto can_destroy = f_ptr->flags.has_not(TerrainCharacteristics::GLASS);
- can_destroy |= monraces_info[m_ptr->r_idx].behavior_flags.has(MonsterBehaviorType::STUPID);
+ can_destroy |= m_ptr->get_monrace().behavior_flags.has(MonsterBehaviorType::STUPID);
can_destroy |= m_ptr->hp >= std::max(m_ptr->maxhp / 3, 200);
return can_destroy;
}
*/
static bool process_wall(PlayerType *player_ptr, turn_flags *turn_flags_ptr, MonsterEntity *m_ptr, POSITION ny, POSITION nx, bool can_cross)
{
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
auto *g_ptr = &player_ptr->current_floor_ptr->grid_array[ny][nx];
auto *f_ptr = &terrains_info[g_ptr->feat];
if (player_bold(player_ptr, ny, nx)) {
*/
static bool bash_normal_door(PlayerType *player_ptr, turn_flags *turn_flags_ptr, MonsterEntity *m_ptr, POSITION ny, POSITION nx)
{
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
auto *g_ptr = &player_ptr->current_floor_ptr->grid_array[ny][nx];
auto *f_ptr = &terrains_info[g_ptr->feat];
turn_flags_ptr->do_move = false;
*/
static void bash_glass_door(PlayerType *player_ptr, turn_flags *turn_flags_ptr, MonsterEntity *m_ptr, TerrainType *f_ptr, bool may_bash)
{
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
auto can_bash = may_bash;
can_bash &= r_ptr->behavior_flags.has(MonsterBehaviorType::BASH_DOOR);
can_bash &= f_ptr->flags.has(TerrainCharacteristics::BASH);
*/
static bool process_door(PlayerType *player_ptr, turn_flags *turn_flags_ptr, MonsterEntity *m_ptr, POSITION ny, POSITION nx)
{
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
const auto &g_ref = player_ptr->current_floor_ptr->grid_array[ny][nx];
if (!is_closed_door(player_ptr, g_ref.feat)) {
return true;
static bool process_protection_rune(PlayerType *player_ptr, turn_flags *turn_flags_ptr, MonsterEntity *m_ptr, POSITION ny, POSITION nx)
{
auto *g_ptr = &player_ptr->current_floor_ptr->grid_array[ny][nx];
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
auto can_enter = turn_flags_ptr->do_move;
can_enter &= g_ptr->is_rune_protection();
can_enter &= (r_ptr->behavior_flags.has_not(MonsterBehaviorType::NEVER_BLOW)) || !player_bold(player_ptr, ny, nx);
static bool process_explosive_rune(PlayerType *player_ptr, turn_flags *turn_flags_ptr, MonsterEntity *m_ptr, POSITION ny, POSITION nx)
{
auto *g_ptr = &player_ptr->current_floor_ptr->grid_array[ny][nx];
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
auto should_explode = turn_flags_ptr->do_move;
should_explode &= g_ptr->is_rune_explosion();
should_explode &= (r_ptr->behavior_flags.has_not(MonsterBehaviorType::NEVER_BLOW)) || !player_bold(player_ptr, ny, nx);
*/
static bool process_post_dig_wall(PlayerType *player_ptr, turn_flags *turn_flags_ptr, MonsterEntity *m_ptr, POSITION ny, POSITION nx)
{
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
grid_type *g_ptr;
g_ptr = &player_ptr->current_floor_ptr->grid_array[ny][nx];
TerrainType *f_ptr;
grid_type *g_ptr;
g_ptr = &player_ptr->current_floor_ptr->grid_array[ny][nx];
auto *m_ptr = &player_ptr->current_floor_ptr->m_list[m_idx];
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
bool can_cross = monster_can_cross_terrain(player_ptr, g_ptr->feat, r_ptr, turn_flags_ptr->is_riding_mon ? CEM_RIDING : 0);
if (!process_wall(player_ptr, turn_flags_ptr, m_ptr, ny, nx, can_cross)) {
const POSITION ny, const POSITION nx, std::string_view m_name, std::string_view o_name, const OBJECT_IDX this_o_idx)
{
auto *m_ptr = &player_ptr->current_floor_ptr->m_list[m_idx];
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
if (is_unpickable_object) {
if (turn_flags_ptr->do_take && r_ptr->behavior_flags.has(MonsterBehaviorType::STUPID)) {
turn_flags_ptr->did_take_item = true;
void update_object_by_monster_movement(PlayerType *player_ptr, turn_flags *turn_flags_ptr, MONSTER_IDX m_idx, POSITION ny, POSITION nx)
{
auto *m_ptr = &player_ptr->current_floor_ptr->m_list[m_idx];
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
auto *g_ptr = &player_ptr->current_floor_ptr->grid_array[ny][nx];
turn_flags_ptr->do_take = r_ptr->behavior_flags.has(MonsterBehaviorType::TAKE_ITEM);
for (auto it = g_ptr->o_idx_list.begin(); it != g_ptr->o_idx_list.end();) {
{
auto *floor_ptr = player_ptr->current_floor_ptr;
auto *m_ptr = &floor_ptr->m_list[i];
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
POSITION y = m_ptr->fy;
POSITION x = m_ptr->fx;
MonsterSpeakType::SPEAK_FEAR,
};
- auto speak = monraces_info[m_ptr->r_idx].speak_flags.has_any_of(flags);
+ auto speak = m_ptr->get_monrace().speak_flags.has_any_of(flags);
speak &= !is_acting_monster(m_ptr->r_idx);
speak &= player_has_los_bold(player_ptr, m_ptr->fy, m_ptr->fx);
speak &= projectable(player_ptr, m_ptr->fy, m_ptr->fx, player_ptr->y, player_ptr->x);
bool runaway_monster(PlayerType *player_ptr, turn_flags *turn_flags_ptr, MONSTER_IDX m_idx)
{
auto *m_ptr = &player_ptr->current_floor_ptr->m_list[m_idx];
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
bool can_runaway = m_ptr->is_pet() || m_ptr->is_friendly();
can_runaway &= (r_ptr->kind_flags.has(MonsterKindType::UNIQUE)) || (r_ptr->population_flags.has(MonsterPopulationType::NAZGUL));
can_runaway &= !player_ptr->phase_out;
continue;
}
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
grid_type *g_ptr;
g_ptr = &floor_ptr->grid_array[y][x];
static void sweep_hiding_candidate(
PlayerType *player_ptr, MonsterEntity *m_ptr, const POSITION *y_offsets, const POSITION *x_offsets, coordinate_candidate *candidate)
{
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
for (POSITION i = 0, dx = x_offsets[0], dy = y_offsets[0]; dx != 0 || dy != 0; i++, dx = x_offsets[i], dy = y_offsets[i]) {
POSITION y = m_ptr->fy + dy;
POSITION x = m_ptr->fx + dx;
{
auto *floor_ptr = this->player_ptr->current_floor_ptr;
auto *m_ptr = &floor_ptr->m_list[this->m_idx];
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
POSITION y = 0;
POSITION x = 0;
auto y2 = this->player_ptr->y;
bool MonsterSweepGrid::mon_will_run()
{
auto *m_ptr = &this->player_ptr->current_floor_ptr->m_list[this->m_idx];
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
if (m_ptr->is_pet()) {
return (this->player_ptr->pet_follow_distance < 0) && (m_ptr->cdis <= (0 - this->player_ptr->pet_follow_distance));
}
{
auto *floor_ptr = this->player_ptr->current_floor_ptr;
auto *m_ptr = &floor_ptr->m_list[this->m_idx];
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
if (this->done || this->will_run || !m_ptr->is_hostile() || none_bits(r_ptr->flags1, RF1_FRIENDS)) {
return;
}
{
auto *floor_ptr = this->player_ptr->current_floor_ptr;
auto *m_ptr = &floor_ptr->m_list[this->m_idx];
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
if (!this->check_movable_grid(yp, xp, no_flow)) {
return;
}
{
auto *floor_ptr = this->player_ptr->current_floor_ptr;
auto *m_ptr = &floor_ptr->m_list[this->m_idx];
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
auto y1 = m_ptr->fy;
auto x1 = m_ptr->fx;
if (projectable(this->player_ptr, y1, x1, this->player_ptr->y, this->player_ptr->x)) {
auto gx = 0;
auto *floor_ptr = this->player_ptr->current_floor_ptr;
auto *m_ptr = &floor_ptr->m_list[this->m_idx];
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
auto fy = m_ptr->fy;
auto fx = m_ptr->fx;
auto y1 = fy - *yp;
if (any_bits(r_ptr->flags7, RF7_CHAMELEON)) {
choose_new_monster(player_ptr, g_ptr->m_idx, true, MonsterRace::empty_id());
- r_ptr = &monraces_info[m_ptr->r_idx];
+ r_ptr = &m_ptr->get_monrace();
m_ptr->mflag2.set(MonsterConstantFlagType::CHAMELEON);
if (r_ptr->kind_flags.has(MonsterKindType::UNIQUE) && (who <= 0)) {
m_ptr->sub_align = SUB_ALIGN_NEUTRAL;
bool process_quantum_effect(PlayerType *player_ptr, MONSTER_IDX m_idx, bool see_m)
{
auto *m_ptr = &player_ptr->current_floor_ptr->m_list[m_idx];
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
if (r_ptr->kind_flags.has_not(MonsterKindType::QUANTUM)) {
return false;
}
int cur_dis = 5 * (20 - cnt);
for (MONSTER_IDX i = 1; i < floor_ptr->m_max; i++) {
auto *m_ptr = &floor_ptr->m_list[i];
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
if (!m_ptr->is_valid()) {
continue;
}
*/
void MonsterDamageProcessor::get_exp_from_mon(MonsterEntity *m_ptr, int exp_dam)
{
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
if (!m_ptr->is_valid() || m_ptr->is_pet() || this->player_ptr->phase_out) {
return;
}
}
}
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
if (m_ptr->is_fearful() || any_bits(r_ptr->flags3, RF3_NO_FEAR)) {
return;
}
ss << add_cameleon_name(*m_ptr, mode);
if (any_bits(mode, MD_IGNORE_HALLU) && !m_ptr->is_original_ap()) {
- ss << "(" << monraces_info[m_ptr->r_idx].name << ")";
+ ss << "(" << m_ptr->get_monrace().name << ")";
}
if (any_bits(mode, MD_POSSESSIVE)) {
auto *floor_ptr = player_ptr->current_floor_ptr;
auto *r_ptr = &monraces_info[r_idx];
auto *m_ptr = &floor_ptr->m_list[chameleon_change_m_idx];
- MonsterRaceInfo *old_r_ptr = &monraces_info[m_ptr->r_idx];
+ MonsterRaceInfo *old_r_ptr = &m_ptr->get_monrace();
if (r_ptr->kind_flags.has_not(MonsterKindType::UNIQUE)) {
return false;
auto *floor_ptr = player_ptr->current_floor_ptr;
auto *r_ptr = &monraces_info[r_idx];
auto *m_ptr = &floor_ptr->m_list[chameleon_change_m_idx];
- MonsterRaceInfo *old_r_ptr = &monraces_info[m_ptr->r_idx];
+ MonsterRaceInfo *old_r_ptr = &m_ptr->get_monrace();
if (r_ptr->kind_flags.has(MonsterKindType::UNIQUE)) {
return false;
MonsterRaceInfo *r_ptr;
bool old_unique = false;
- if (monraces_info[m_ptr->r_idx].kind_flags.has(MonsterKindType::UNIQUE)) {
+ if (m_ptr->get_monrace().kind_flags.has(MonsterKindType::UNIQUE)) {
old_unique = true;
}
if (old_unique && (r_idx == MonsterRaceId::CHAMELEON)) {
void process_monster(PlayerType *player_ptr, MONSTER_IDX m_idx)
{
auto *m_ptr = &player_ptr->current_floor_ptr->m_list[m_idx];
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
turn_flags tmp_flags;
turn_flags *turn_flags_ptr = init_turn_flags(player_ptr->riding, m_idx, &tmp_flags);
turn_flags_ptr->see_m = is_seen(player_ptr, m_ptr);
decide_drop_from_monster(player_ptr, m_idx, turn_flags_ptr->is_riding_mon);
if (m_ptr->mflag2.has(MonsterConstantFlagType::CHAMELEON) && one_in_(13) && !m_ptr->is_asleep()) {
choose_new_monster(player_ptr, m_idx, false, MonsterRace::empty_id());
- r_ptr = &monraces_info[m_ptr->r_idx];
+ r_ptr = &m_ptr->get_monrace();
}
turn_flags_ptr->aware = process_stealth(player_ptr, m_idx);
}
auto *m_ptr = &player_ptr->current_floor_ptr->m_list[m_idx];
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
int tmp = player_ptr->lev * 6 + (player_ptr->skill_stl + 10) * 4;
if (player_ptr->monlite) {
tmp /= 3;
void decide_drop_from_monster(PlayerType *player_ptr, MONSTER_IDX m_idx, bool is_riding_mon)
{
auto *m_ptr = &player_ptr->current_floor_ptr->m_list[m_idx];
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
if (!is_riding_mon || ((r_ptr->flags7 & RF7_RIDING) != 0)) {
return;
}
bool awake_monster(PlayerType *player_ptr, MONSTER_IDX m_idx)
{
auto *m_ptr = &player_ptr->current_floor_ptr->m_list[m_idx];
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
if (!m_ptr->is_asleep()) {
return true;
}
void process_angar(PlayerType *player_ptr, MONSTER_IDX m_idx, bool see_m)
{
auto *m_ptr = &player_ptr->current_floor_ptr->m_list[m_idx];
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
bool gets_angry = false;
if (m_ptr->is_friendly() && has_aggravate(player_ptr)) {
gets_angry = true;
void process_special(PlayerType *player_ptr, MONSTER_IDX m_idx)
{
auto *m_ptr = &player_ptr->current_floor_ptr->m_list[m_idx];
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
if (r_ptr->ability_flags.has_not(MonsterAbilityType::SPECIAL) || (m_ptr->r_idx != MonsterRaceId::OHMU) || player_ptr->current_floor_ptr->inside_arena || player_ptr->phase_out || (r_ptr->freq_spell == 0) || (randint1(100) > r_ptr->freq_spell)) {
return;
}
bool decide_monster_multiplication(PlayerType *player_ptr, MONSTER_IDX m_idx, POSITION oy, POSITION ox)
{
auto *m_ptr = &player_ptr->current_floor_ptr->m_list[m_idx];
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
if (((r_ptr->flags2 & RF2_MULTIPLY) == 0) || (player_ptr->current_floor_ptr->num_repro >= MAX_REPRODUCTION)) {
return false;
}
bool cast_spell(PlayerType *player_ptr, MONSTER_IDX m_idx, bool aware)
{
auto *m_ptr = &player_ptr->current_floor_ptr->m_list[m_idx];
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
if ((r_ptr->freq_spell == 0) || (randint1(100) > r_ptr->freq_spell)) {
return false;
}
bool decide_process_continue(PlayerType *player_ptr, MonsterEntity *m_ptr)
{
MonsterRaceInfo *r_ptr;
- r_ptr = &monraces_info[m_ptr->r_idx];
+ r_ptr = &m_ptr->get_monrace();
if (!player_ptr->no_flowed) {
m_ptr->mflag2.reset(MonsterConstantFlagType::NOFLOW);
}
{
QuestCompletionChecker(player_ptr, m_ptr).complete();
m_ptr->mflag2.set(MonsterConstantFlagType::PET);
- if (monraces_info[m_ptr->r_idx].kind_flags.has_none_of(alignment_mask)) {
+ if (m_ptr->get_monrace().kind_flags.has_none_of(alignment_mask)) {
m_ptr->sub_align = SUB_ALIGN_NEUTRAL;
}
}
}
}
- if (monraces_info[m_ptr->r_idx].brightness_flags.has_any_of(has_ld_mask)) {
+ if (m_ptr->get_monrace().brightness_flags.has_any_of(has_ld_mask)) {
rfu.set_flag(StatusRecalculatingFlag::MONSTER_LITE);
}
bool monster_is_powerful(FloorType *floor_ptr, MONSTER_IDX m_idx)
{
auto *m_ptr = &floor_ptr->m_list[m_idx];
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
return any_bits(r_ptr->flags2, RF2_POWERFUL);
}
DEPTH monster_level_idx(FloorType *floor_ptr, MONSTER_IDX m_idx)
{
auto *m_ptr = &floor_ptr->m_list[m_idx];
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
return (r_ptr->level >= 1) ? r_ptr->level : 1;
}
*/
int mon_damage_mod(PlayerType *player_ptr, MonsterEntity *m_ptr, int dam, bool is_psy_spear)
{
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
if (r_ptr->resistance_flags.has(MonsterResistanceType::RESIST_ALL) && dam > 0) {
dam /= 100;
if ((dam == 0) && one_in_(3)) {
auto *m_ptr = &player_ptr->current_floor_ptr->m_list[m_idx];
switch (mtimed_idx) {
case MTIMED_CSLEEP: {
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
auto is_wakeup = false;
if (m_ptr->cdis < MAX_MONSTER_SENSING) {
/* Handle "sensing radius" */
break;
case MTIMED_STUNNED: {
- int rlev = monraces_info[m_ptr->r_idx].level;
+ int rlev = m_ptr->get_monrace().level;
/* Recover from stun */
if (set_monster_stunned(player_ptr, m_idx, (randint0(10000) <= rlev * rlev) ? 0 : (m_ptr->get_remaining_stun() - 1))) {
case MTIMED_CONFUSED: {
/* Reduce the confusion */
- if (!set_monster_confused(player_ptr, m_idx, m_ptr->get_remaining_confusion() - randint1(monraces_info[m_ptr->r_idx].level / 20 + 1))) {
+ if (!set_monster_confused(player_ptr, m_idx, m_ptr->get_remaining_confusion() - randint1(m_ptr->get_monrace().level / 20 + 1))) {
break;
}
case MTIMED_MONFEAR: {
/* Reduce the fear */
- if (!set_monster_monfear(player_ptr, m_idx, m_ptr->get_remaining_fear() - randint1(monraces_info[m_ptr->r_idx].level / 20 + 1))) {
+ if (!set_monster_monfear(player_ptr, m_idx, m_ptr->get_remaining_fear() - randint1(m_ptr->get_monrace().level / 20 + 1))) {
break;
}
return;
}
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
auto *s_ptr = &monraces_info[s_idx];
if (player_ptr->phase_out || (r_ptr->next_exp == 0)) {
m_ptr->get_real_monrace().cur_num++;
m_ptr->ap_r_idx = m_ptr->r_idx;
- r_ptr = &monraces_info[m_ptr->r_idx];
+ r_ptr = &m_ptr->get_monrace();
m_ptr->max_maxhp = any_bits(r_ptr->flags1, RF1_FORCE_MAXHP) ? maxroll(r_ptr->hdice, r_ptr->hside) : damroll(r_ptr->hdice, r_ptr->hside);
if (ironman_nightmare) {
*/
void update_monster_race_flags(PlayerType *player_ptr, turn_flags *turn_flags_ptr, MonsterEntity *m_ptr)
{
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
if (!is_original_ap_and_seen(player_ptr, m_ptr)) {
return;
}
static bool update_weird_telepathy(PlayerType *player_ptr, um_type *um_ptr, MONSTER_IDX m_idx)
{
auto *m_ptr = um_ptr->m_ptr;
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
if ((r_ptr->flags2 & RF2_WEIRD_MIND) == 0) {
return false;
}
static void update_telepathy_sight(PlayerType *player_ptr, um_type *um_ptr, MONSTER_IDX m_idx)
{
auto *m_ptr = um_ptr->m_ptr;
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
if (PlayerClass(player_ptr).samurai_stance_is(SamuraiStanceType::MUSOU)) {
um_ptr->flag = true;
um_ptr->m_ptr->mflag.set(MonsterTemporaryFlagType::ESP);
static void update_specific_race_telepathy(PlayerType *player_ptr, um_type *um_ptr)
{
auto *m_ptr = um_ptr->m_ptr;
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
auto is_hallucinated = player_ptr->effects()->hallucination()->is_hallucinated();
if ((player_ptr->esp_animal) && r_ptr->kind_flags.has(MonsterKindType::ANIMAL)) {
um_ptr->flag = true;
{
POSITION distance = decide_updated_distance(player_ptr, um_ptr);
auto *m_ptr = um_ptr->m_ptr;
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
m_ptr->mflag.reset(MonsterTemporaryFlagType::ESP);
}
if (!player_ptr->effects()->hallucination()->is_hallucinated()) {
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
if ((m_ptr->ap_r_idx == MonsterRaceId::KAGE) && (monraces_info[MonsterRaceId::KAGE].r_sights < MAX_SHORT)) {
monraces_info[MonsterRaceId::KAGE].r_sights++;
} else if (m_ptr->is_original_ap() && (r_ptr->r_sights < MAX_SHORT)) {
void update_smart_learn(PlayerType *player_ptr, MONSTER_IDX m_idx, int what)
{
auto *m_ptr = &player_ptr->current_floor_ptr->m_list[m_idx];
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
if (!smart_learn || (r_ptr->behavior_flags.has(MonsterBehaviorType::STUPID)) || ((r_ptr->behavior_flags.has_not(MonsterBehaviorType::SMART)) && (randint0(100) < 50))) {
return;
}
ProjectResult breath(PlayerType *player_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, AttributeType typ, int dam_hp, POSITION rad, int target_type)
{
auto *m_ptr = &player_ptr->current_floor_ptr->m_list[m_idx];
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
BIT_FLAGS flg = PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL | PROJECT_BREATH;
if (target_type == MONSTER_TO_PLAYER) {
flg |= PROJECT_PLAYER;
{
auto *floor_ptr = player_ptr->current_floor_ptr;
auto *m_ptr = &floor_ptr->m_list[m_idx];
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
DEPTH rlev = monster_level_idx(floor_ptr, m_idx);
int hp = (TYPE == DAM_ROLL) ? m_ptr->hp : m_ptr->max_maxhp;
int shoot_dd, shoot_ds;
concptr msg_done;
auto *floor_ptr = player_ptr->current_floor_ptr;
auto *m_ptr = &floor_ptr->m_list[m_idx];
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
bool can_use_lite_area = false;
bool monster_to_monster = target_type == MONSTER_TO_MONSTER;
bool monster_to_player = target_type == MONSTER_TO_PLAYER;
const auto &floor_ref = *player_ptr->current_floor_ptr;
auto *m_ptr = &floor_ref.m_list[m_idx];
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
if (r_ptr->ability_flags.has(MonsterAbilityType::BR_ACID)) {
if (!has_immune_acid(player_ptr) && (player_ptr->oppose_acid || music_singing(player_ptr, MUSIC_RESIST))) {
return true;
std::vector<MonsterAbilityType> dispel;
auto *m_ptr = &player_ptr->current_floor_ptr->m_list[msa_ptr->m_idx];
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
if (r_ptr->flags2 & RF2_STUPID) {
return rand_choice(msa_ptr->mspells);
}
{
auto *floor_ptr = player_ptr->current_floor_ptr;
auto *m_ptr = &floor_ptr->m_list[m_idx];
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
switch (m_ptr->r_idx) {
case MonsterRaceId::OHMU:
msg_format(_("%s^が何かをつぶやいた。", "%s^ mumbles."), m_name);
}
} else if (mon_to_player || (mon_to_mon && known && see_either)) {
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
#ifdef JP
(void)m_poss;
#endif
summon_disturb(player_ptr, target_type, known, see_either);
auto *m_ptr = &floor_ptr->m_list[m_idx];
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
int num = 1;
if (r_ptr->kind_flags.has(MonsterKindType::UNIQUE)) {
num += r_ptr->level / 40;
: ability_flags(ability_flags)
{
auto *m_ptr = &player_ptr->current_floor_ptr->m_list[m_idx];
- this->r_ptr = &monraces_info[m_ptr->r_idx];
+ this->r_ptr = &m_ptr->get_monrace();
}
/*!
int danger_amount = 0;
for (MONSTER_IDX monster = 0; monster < player_ptr->current_floor_ptr->m_max; monster++) {
auto *m_ptr = &player_ptr->current_floor_ptr->m_list[monster];
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
if (!m_ptr->is_valid()) {
continue;
}
continue;
}
- r_ptr = &monraces_info[m_ptr->r_idx];
+ r_ptr = &m_ptr->get_monrace();
if (r_ptr->kind_flags.has(MonsterKindType::UNIQUE)) {
msg_format(_("%s. ", "%s. "), r_ptr->name.data());
}
*/
static void spell_damcalc(PlayerType *player_ptr, MonsterEntity *m_ptr, AttributeType typ, int dam, int *max)
{
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
int rlev = r_ptr->level;
bool ignore_wraith_form = false;
continue;
}
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
/* Monster spells (only powerful ones)*/
if (projectable(player_ptr, my, mx, yy, xx)) {
POSITION sx = 0;
int sn = 0;
auto *m_ptr = &player_ptr->current_floor_ptr->m_list[player_ptr->riding];
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
if (!player_ptr->riding || player_ptr->wild_mode) {
return false;
if (!m_ptr->is_valid()) {
continue;
}
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
if (!m_ptr->is_pet()) {
continue;
if (player_ptr->riding == m_idx) {
total_friend_levels += (r_ptr->level + 5) * 2;
- } else if (!has_a_unique && any_bits(monraces_info[m_ptr->r_idx].flags7, RF7_RIDING)) {
+ } else if (!has_a_unique && any_bits(m_ptr->get_monrace().flags7, RF7_RIDING)) {
total_friend_levels += (r_ptr->level + 5) * 7 / 2;
} else {
total_friend_levels += (r_ptr->level + 5) * 10;
if (!m_ptr->is_valid()) {
continue;
}
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
if (!m_ptr->is_pet()) {
continue;
*/
static void process_aura_damage(MonsterEntity *m_ptr, PlayerType *player_ptr, bool immune, MonsterAuraType aura_flag, dam_func dam_func, concptr message)
{
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
if (r_ptr->aura_flags.has_not(aura_flag) || immune) {
return;
}
lite_spot(player_ptr, oy, ox);
lite_spot(player_ptr, ty, tx);
- if (monraces_info[m_ptr->r_idx].brightness_flags.has_any_of(ld_mask)) {
+ if (m_ptr->get_monrace().brightness_flags.has_any_of(ld_mask)) {
RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::MONSTER_LITE);
}
}
m_ptr = &player_ptr->current_floor_ptr->m_list[m_idx];
/* Monster cannot move back? */
- if (!monster_can_enter(player_ptr, ny, nx, &monraces_info[m_ptr->r_idx], 0)) {
+ if (!monster_can_enter(player_ptr, ny, nx, &m_ptr->get_monrace(), 0)) {
/* -more- */
if (i < 2) {
msg_print(nullptr);
}
auto *m_ptr = &floor_ptr->m_list[gg_ptr->m_idx];
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
if (r_ptr->flags1 & RF1_QUESTOR) {
map[16 + yy - cy][16 + xx - cx] = false;
continue;
bool flag = false;
for (MONSTER_IDX i = 1; i < floor.m_max; i++) {
auto *m_ptr = &floor.m_list[i];
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
if (!m_ptr->is_valid()) {
continue;
}
auto flag = false;
for (MONSTER_IDX i = 1; i < floor.m_max; i++) {
auto *m_ptr = &floor.m_list[i];
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
if (!m_ptr->is_valid()) {
continue;
auto flag = false;
for (MONSTER_IDX i = 1; i < floor.m_max; i++) {
auto *m_ptr = &floor.m_list[i];
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
if (!m_ptr->is_valid()) {
continue;
}
auto flag = false;
for (MONSTER_IDX i = 1; i < floor.m_max; i++) {
auto *m_ptr = &floor.m_list[i];
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
if (!m_ptr->is_valid()) {
continue;
}
auto flag = false;
for (MONSTER_IDX i = 1; i < floor.m_max; i++) {
auto *m_ptr = &floor.m_list[i];
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
if (!m_ptr->is_valid()) {
continue;
}
update_monster(player_ptr, m_idx, true);
lite_spot(player_ptr, target_row, target_col);
lite_spot(player_ptr, ty, tx);
- if (monraces_info[m_ptr->r_idx].brightness_flags.has_any_of(ld_mask)) {
+ if (m_ptr->get_monrace().brightness_flags.has_any_of(ld_mask)) {
RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::MONSTER_LITE);
}
if (g_ptr->m_idx) {
auto *m_ptr = &floor_ptr->m_list[g_ptr->m_idx];
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
if (in_generate) /* In generation */
{
{
auto &floor = *player_ptr->current_floor_ptr;
auto *m_ptr = &floor.m_list[m_idx];
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
if (m_ptr->is_pet() && !player_cast) {
return false;
}
auto result = false;
for (short i = 1; i < floor.m_max; i++) {
auto *m_ptr = &floor.m_list[i];
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
if (!m_ptr->is_valid() || (r_ptr->d_char != symbol)) {
continue;
}
bool result = false;
for (MONSTER_IDX i = 1; i < floor.m_max; i++) {
auto *m_ptr = &floor.m_list[i];
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
if (!m_ptr->is_valid()) {
continue;
}
if (g_ptr->m_idx) {
PERCENTAGE chance = 25;
auto *m_ptr = &player_ptr->current_floor_ptr->m_list[g_ptr->m_idx];
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
update_monster(player_ptr, g_ptr->m_idx, false);
if (r_ptr->behavior_flags.has(MonsterBehaviorType::STUPID)) {
chance = 10;
}
MonsterRaceInfo *r_ptr;
- r_ptr = &monraces_info[m_ptr->r_idx];
+ r_ptr = &m_ptr->get_monrace();
if (r_ptr->kind_flags.has(MonsterKindType::UNIQUE)) {
const auto m_name = monster_desc(player_ptr, m_ptr, 0x00);
msg_format(_("%sは爆破されるのを嫌がり、勝手に自分の世界へと帰った。", "%s^ resists being blasted and runs away."), m_name.data());
auto probe = false;
for (int i = 1; i < player_ptr->current_floor_ptr->m_max; i++) {
auto *m_ptr = &player_ptr->current_floor_ptr->m_list[i];
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
if (!m_ptr->is_valid()) {
continue;
}
MonsterEntity *m_ptr;
MonsterRaceInfo *r_ptr;
m_ptr = &player_ptr->current_floor_ptr->m_list[g_ptr->m_idx];
- r_ptr = &monraces_info[m_ptr->r_idx];
+ r_ptr = &m_ptr->get_monrace();
(void)set_monster_csleep(player_ptr, g_ptr->m_idx, 0);
lite_spot(player_ptr, oy, ox);
lite_spot(player_ptr, ny, nx);
- if (monraces_info[m_ptr->r_idx].brightness_flags.has_any_of(ld_mask)) {
+ if (m_ptr->get_monrace().brightness_flags.has_any_of(ld_mask)) {
RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::MONSTER_LITE);
}
lite_spot(player_ptr, oy, ox);
lite_spot(player_ptr, ny, nx);
- if (monraces_info[m_ptr->r_idx].brightness_flags.has_any_of(ld_mask)) {
+ if (m_ptr->get_monrace().brightness_flags.has_any_of(ld_mask)) {
RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::MONSTER_LITE);
}
}
MONSTER_IDX tmp_m_idx = player_ptr->current_floor_ptr->grid_array[oy + yy][ox + xx].m_idx;
if (tmp_m_idx && (player_ptr->riding != tmp_m_idx)) {
auto *m_ptr = &player_ptr->current_floor_ptr->m_list[tmp_m_idx];
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
bool can_follow = r_ptr->ability_flags.has(MonsterAbilityType::TPORT);
can_follow &= r_ptr->resistance_flags.has_not(MonsterResistanceType::RESIST_TELEPORT);
}
auto *m_ptr = &player_ptr->current_floor_ptr->m_list[tmp_m_idx];
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
bool can_follow = r_ptr->ability_flags.has(MonsterAbilityType::TPORT);
can_follow &= r_ptr->resistance_flags.has_not(MonsterResistanceType::RESIST_TELEPORT);
MonsterEntity *m_ptr;
MonsterRaceInfo *r_ptr;
m_ptr = &player_ptr->current_floor_ptr->m_list[target_m_idx];
- r_ptr = &monraces_info[m_ptr->r_idx];
+ r_ptr = &m_ptr->get_monrace();
const auto m_name = monster_desc(player_ptr, m_ptr, 0);
msg_format(_("%s^の足を指さした。", "You gesture at %s^'s feet."), m_name.data());
bool SpellHex::check_hex_barrier(MONSTER_IDX m_idx, spell_hex_type type) const
{
const auto *m_ptr = &this->player_ptr->current_floor_ptr->m_list[m_idx];
- const auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ const auto *r_ptr = &m_ptr->get_monrace();
return this->is_spelling_specific(type) && ((this->player_ptr->lev * 3 / 2) >= randint1(r_ptr->level));
}
*/
bool common_saving_throw_charm(PlayerType *player_ptr, int pow, MonsterEntity *m_ptr)
{
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
if (player_ptr->current_floor_ptr->inside_arena) {
return true;
*/
bool common_saving_throw_control(PlayerType *player_ptr, int pow, MonsterEntity *m_ptr)
{
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
if (player_ptr->current_floor_ptr->inside_arena) {
return true;
return monraces_info[this->get_real_monrace_id()];
}
+MonsterRaceInfo &MonsterEntity::get_monrace() const
+{
+ return monraces_info[this->r_idx];
+}
+
short MonsterEntity::get_remaining_sleep() const
{
return this->mtimed[MTIMED_CSLEEP];
bool is_valid() const;
MonsterRaceId get_real_monrace_id() const;
MonsterRaceInfo &get_real_monrace() const;
+ MonsterRaceInfo &get_monrace() const;
short get_remaining_sleep() const;
short get_remaining_acceleration() const;
short get_remaining_deceleration() const;
}
} else if (player_ptr->riding) {
auto *m_ptr = &player_ptr->current_floor_ptr->m_list[player_ptr->riding];
- auto *r_ptr = &monraces_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
if (m_ptr->is_confused()) {
if (randint0(100) < 75) {
dir = ddd[randint0(8)];