if (snipe_type == SP_HOLYNESS)
{
cave[ny][nx].info |= (CAVE_GLOW);
-
note_spot(ny, nx);
-
lite_spot(ny, nx);
}
/* Hit the monster, check for death */
- if (mon_take_hit(c_mon_ptr->m_idx, tdam, &fear, extract_note_dies(real_r_ptr(m_ptr))))
+ if (mon_take_hit(c_mon_ptr->m_idx, tdam, &fear, extract_note_dies(real_r_idx(m_ptr))))
{
/* Dead monster */
}
tdam, m_ptr->hp - tdam, m_ptr->maxhp, m_ptr->max_maxhp);
/* Hit the monster, check for death */
- if (mon_take_hit(c_ptr->m_idx, tdam, &fear, extract_note_dies(real_r_ptr(m_ptr))))
+ if (mon_take_hit(c_ptr->m_idx, tdam, &fear, extract_note_dies(real_r_idx(m_ptr))))
{
/* Dead monster */
}
extern void set_target(monster_type *m_ptr, POSITION y, POSITION x);
extern void reset_target(monster_type *m_ptr);
extern monster_race *real_r_ptr(monster_type *m_ptr);
+extern MONRACE_IDX real_r_idx(monster_type *m_ptr);
extern void delete_monster_idx(MONSTER_IDX i);
extern void delete_monster(POSITION y, POSITION x);
extern void compact_monsters(int size);
extern void complete_quest(QUEST_IDX quest_num);
extern void check_quest_completion(monster_type *m_ptr);
extern void check_find_art_quest_completion(object_type *o_ptr);
-extern cptr extract_note_dies(monster_race *r_ptr);
+extern cptr extract_note_dies(MONRACE_IDX r_idx);
extern void monster_death(MONSTER_IDX m_idx, bool drop_item);
extern bool mon_take_hit(MONSTER_IDX m_idx, HIT_POINT dam, bool *fear, cptr note);
extern void get_screen_size(TERM_LEN *wid_p, TERM_LEN *hgt_p);
/* Zammaken (Nonliving Evil) */
if (mode == HISSATSU_ZANMA)
{
- if (!monster_living(r_ptr) && (r_ptr->flags3 & RF3_EVIL))
+ if (!monster_living(m_ptr->r_idx) && (r_ptr->flags3 & RF3_EVIL))
{
if (mult < 15) mult = 25;
else if (mult < 50) mult = MIN(50, mult+20);
}
/* Bloody Maelstrom */
- if ((mode == HISSATSU_SEKIRYUKA) && p_ptr->cut && monster_living(r_ptr))
+ if ((mode == HISSATSU_SEKIRYUKA) && p_ptr->cut && monster_living(m_ptr->r_idx))
{
MULTIPLY tmp = MIN(100, MAX(10, p_ptr->cut / 10));
if (mult < tmp) mult = tmp;
if ((have_flag(flgs, TR_VAMPIRIC)) || (chaos_effect == 1) || (mode == HISSATSU_DRAIN) || hex_spelling(HEX_VAMP_BLADE))
{
/* Only drain "living" monsters */
- if (monster_living(r_ptr))
+ if (monster_living(m_ptr->r_idx))
can_drain = TRUE;
else
can_drain = FALSE;
drain_result += p_ptr->to_d[hand];
if ((mode == HISSATSU_SUTEMI) || (mode == HISSATSU_3DAN)) k *= 2;
- if ((mode == HISSATSU_SEKIRYUKA) && !monster_living(r_ptr)) k = 0;
+ if ((mode == HISSATSU_SEKIRYUKA) && !monster_living(m_ptr->r_idx)) k = 0;
if ((mode == HISSATSU_SEKIRYUKA) && !p_ptr->cut) k /= 2;
/* No negative damage */
if (k < 0) k = 0;
- if ((mode == HISSATSU_ZANMA) && !(!monster_living(r_ptr) && (r_ptr->flags3 & RF3_EVIL)))
+ if ((mode == HISSATSU_ZANMA) && !(!monster_living(m_ptr->r_idx) && (r_ptr->flags3 & RF3_EVIL)))
{
k = 0;
}
* Used to determine the message to print for a killed monster.
* ("dies", "destroyed")
*/
-bool monster_living(monster_race *r_ptr)
+bool monster_living(MONRACE_IDX r_idx)
{
+ monster_race *r_ptr = &r_info[r_idx];
+
/* Non-living, undead, or demon */
if (r_ptr->flags3 & (RF3_DEMON | RF3_UNDEAD | RF3_NONLIVING))
return FALSE;
extern bool vault_aux_cthulhu(MONRACE_IDX r_idx);\r
extern bool vault_aux_dark_elf(MONRACE_IDX r_idx);\r
\r
-extern bool monster_living(monster_race *r_ptr);\r
+extern bool monster_living(MONRACE_IDX r_idx);\r
extern bool no_questor_or_bounty_uniques(MONRACE_IDX r_idx);\r
else
{
/* Make a sound */
- if (!monster_living(r_ptr))
+ if (!monster_living(m_ptr->r_idx))
{
sound(SOUND_N_KILL);
}
msg_format(_("%^s%s", "%^s%s"), m_name, note);
}
/* Death by normal attack -- nonliving monster */
- else if (!monster_living(r_ptr))
+ else if (!monster_living(m_ptr->r_idx))
{
msg_format(_("%^sは破壊された。", "%^s is destroyed."), m_name);
}
break;
case BLOW_EFFECT_TYPE_HEAL:
- if ((monster_living(tr_ptr)) && (damage > 2))
+ if ((monster_living(m_idx)) && (damage > 2))
{
bool did_heal = FALSE;
*/
monster_race *real_r_ptr(monster_type *m_ptr)
{
+ return &r_info[real_r_idx(m_ptr)];
+}
+
+MONRACE_IDX real_r_idx(monster_type *m_ptr)
+{
monster_race *r_ptr = &r_info[m_ptr->r_idx];
/* Extract real race */
if (m_ptr->mflag2 & MFLAG2_CHAMELEON)
{
if (r_ptr->flags1 & RF1_UNIQUE)
- return &r_info[MON_CHAMELEON_K];
+ return MON_CHAMELEON_K;
else
- return &r_info[MON_CHAMELEON];
+ return MON_CHAMELEON;
}
else
{
- return r_ptr;
+ return m_ptr->r_idx;
}
}
case SUMMON_HI_DRAGON_LIVING:
{
- okay = ((r_ptr->d_char == 'D') && monster_living(r_ptr));
+ okay = ((r_ptr->d_char == 'D') && monster_living(r_idx));
break;
}
case SUMMON_LIVING:
{
- okay = monster_living(r_ptr);
+ okay = monster_living(r_idx);
break;
}
for (i = 0; i < 4; i++)
if (r_ptr->blow[i].method == RBM_EXPLODE) okay = TRUE;
- okay = (okay && monster_living(r_ptr));
+ okay = (okay && monster_living(r_idx));
break;
}
}
if(monster_to_player && p_ptr->riding)
- mon_take_hit_mon(p_ptr->riding, dam, &fear, extract_note_dies(real_r_ptr(&m_list[p_ptr->riding])), m_idx);
+ mon_take_hit_mon(p_ptr->riding, dam, &fear, extract_note_dies(real_r_idx(&m_list[p_ptr->riding])), m_idx);
if(monster_to_monster)
- mon_take_hit_mon(t_idx, dam, &fear, extract_note_dies(real_r_ptr(t_ptr)), m_idx);
+ mon_take_hit_mon(t_idx, dam, &fear, extract_note_dies(real_r_idx(t_ptr)), m_idx);
}
return dam;
}
/* Hack -- attack monsters */
if (c_ptr->m_idx && (m_ptr->ml || cave_have_flag_bold(y, x, FF_PROJECT)))
{
- if (!monster_living(&r_info[m_ptr->r_idx]))
+ if (!monster_living(m_ptr->r_idx))
{
char m_name[80];
cptr note = NULL;
/* Assume a default death */
- cptr note_dies = extract_note_dies(real_r_ptr(m_ptr));
+ cptr note_dies = extract_note_dies(real_r_idx(m_ptr));
- int ty = m_ptr->fy;
- int tx = m_ptr->fx;
+ POSITION ty = m_ptr->fy;
+ POSITION tx = m_ptr->fx;
- int caster_lev = (who > 0) ? r_info[caster_ptr->r_idx].level : (p_ptr->lev * 2);
+ DEPTH caster_lev = (who > 0) ? r_info[caster_ptr->r_idx].level : (p_ptr->lev * 2);
/* Nobody here */
if (!c_ptr->m_idx) return (FALSE);
if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (RFR_RES_ALL);
break;
}
- if (!monster_living(r_ptr))
+ if (!monster_living(m_ptr->r_idx))
{
if (is_original_ap_and_seen(m_ptr))
{
if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (RFR_RES_ALL);
break;
}
- if (!monster_living(r_ptr))
+ if (!monster_living(m_ptr->r_idx))
{
if (is_original_ap_and_seen(m_ptr))
{
/* Attempt a saving throw */
if (common_saving_throw_charm(p_ptr, dam, m_ptr) ||
- !monster_living(r_ptr))
+ !monster_living(m_ptr->r_idx))
{
/* Resist */
/* No obvious effect */
break;
}
/* Only affect non-undead */
- if (monster_living(r_ptr))
+ if (monster_living(m_ptr->r_idx))
{
if (seen) obvious = TRUE;
}
if (is_pet(m_ptr)) nokori_hp = m_ptr->maxhp * 4L;
- else if ((p_ptr->pclass == CLASS_BEASTMASTER) && monster_living(r_ptr))
+ else if ((p_ptr->pclass == CLASS_BEASTMASTER) && monster_living(m_ptr->r_idx))
nokori_hp = m_ptr->maxhp * 3 / 10;
else
nokori_hp = m_ptr->maxhp * 3 / 20;
if (distance(p_ptr->y, p_ptr->x, y, x) > range) continue;
/* Detect non-living monsters */
- if (!monster_living(r_ptr))
+ if (!monster_living(m_ptr->r_idx))
{
/* Update monster recall window */
if (p_ptr->monster_race_idx == m_ptr->r_idx)
* @param r_ptr 撃破されたモンスターの種族情報を持つ構造体の参照ポインタ
* @return 撃破されたモンスターの述語
*/
-cptr extract_note_dies(monster_race *r_ptr)
+cptr extract_note_dies(MONRACE_IDX r_idx)
{
+ monster_race *r_ptr = &r_info[r_idx];
/* Some monsters get "destroyed" */
- if (!monster_living(r_ptr))
+ if (!monster_living(r_idx))
{
int i;
}
/* Death by Physical attack -- non-living monster */
- else if (!monster_living(r_ptr))
+ else if (!monster_living(m_ptr->r_idx))
{
bool explode = FALSE;
cptr clone;
/* Determine if the monster is "living" */
- living = monster_living(ap_r_ptr);
+ living = monster_living(m_ptr->ap_r_idx);
/* Calculate a health "percentage" */
perc = 100L * m_ptr->hp / m_ptr->maxhp;