if (!rad) continue;
else if (rad > 0)
{
- if (!(r_ptr->flags7 & (RF7_SELF_LITE_1 | RF7_SELF_LITE_2)) && (m_ptr->csleep || (!dun_level && is_daytime()) || p_ptr->inside_battle)) continue;
+ if (!(r_ptr->flags7 & (RF7_SELF_LITE_1 | RF7_SELF_LITE_2)) && (MON_CSLEEP(m_ptr) || (!dun_level && is_daytime()) || p_ptr->inside_battle)) continue;
if (d_info[dungeon_type].flags1 & DF1_DARKNESS) rad = 1;
add_mon_lite = mon_lite_hack;
f_flag = FF_LOS;
}
else
{
- if (!(r_ptr->flags7 & (RF7_SELF_DARK_1 | RF7_SELF_DARK_2)) && (m_ptr->csleep || (!dun_level && !is_daytime()))) continue;
+ if (!(r_ptr->flags7 & (RF7_SELF_DARK_1 | RF7_SELF_DARK_2)) && (MON_CSLEEP(m_ptr) || (!dun_level && !is_daytime()))) continue;
add_mon_lite = mon_dark_hack;
f_flag = FF_PROJECT;
rad = -rad; /* Use absolute value */
if (p_ptr->monlite && (mode != HISSATSU_NYUSIN)) tmp /= 3;
if (p_ptr->cursed & TRC_AGGRAVATE) tmp /= 2;
if (r_ptr->level > (p_ptr->lev * p_ptr->lev / 20 + 10)) tmp /= 3;
- if (m_ptr->csleep && m_ptr->ml)
+ if (MON_CSLEEP(m_ptr) && m_ptr->ml)
{
/* Can't backstab creatures that we can't see, right? */
backstab = TRUE;
{
fuiuchi = TRUE;
}
- else if (m_ptr->monfear && m_ptr->ml)
+ else if (MON_MONFEAR(m_ptr) && m_ptr->ml)
{
stab_fleeing = TRUE;
}
}
}
- if (m_ptr->csleep)
- {
- /* Disturb the monster */
- m_ptr->csleep = 0;
- mproc_remove(c_ptr->m_idx, m_ptr->mproc_idx[MPROC_CSLEEP], MPROC_CSLEEP);
- if (r_ptr->flags7 & RF7_HAS_LD_MASK) p_ptr->update |= (PU_MON_LITE);
- }
+ /* Disturb the monster */
+ (void)set_monster_csleep(c_ptr->m_idx, 0);
/* Extract monster name (or "it") */
monster_desc(m_name, m_ptr, 0);
{
if (p_ptr->lev > randint1(r_ptr->level + resist_stun + 10))
{
- if (m_ptr->stunned)
+ if (set_monster_stunned(c_ptr->m_idx, stun_effect + MON_STUNNED(m_ptr)))
{
#ifdef JP
- msg_format("%^s¤Ï¤µ¤é¤Ë¥Õ¥é¥Õ¥é¤Ë¤Ê¤Ã¤¿¡£", m_name);
+ msg_format("%^s¤Ï¥Õ¥é¥Õ¥é¤Ë¤Ê¤Ã¤¿¡£", m_name);
#else
- msg_format("%^s is more stunned.", m_name);
+ msg_format("%^s is stunned.", m_name);
#endif
}
else
{
#ifdef JP
- msg_format("%^s¤Ï¥Õ¥é¥Õ¥é¤Ë¤Ê¤Ã¤¿¡£", m_name);
+ msg_format("%^s¤Ï¤µ¤é¤Ë¥Õ¥é¥Õ¥é¤Ë¤Ê¤Ã¤¿¡£", m_name);
#else
- msg_format("%^s is stunned.", m_name);
+ msg_format("%^s is more stunned.", m_name);
#endif
- mproc_add(c_ptr->m_idx, MPROC_STUNNED);
}
-
- m_ptr->stunned = MIN(stun_effect + m_ptr->stunned, 200);
}
}
}
if (!(r_ptr->flags3 & (RF3_NO_STUN)))
{
/* Get stunned */
- if (m_ptr->stunned)
+ if (MON_STUNNED(m_ptr))
{
#ifdef JP
msg_format("%s¤Ï¤Ò¤É¤¯¤â¤¦¤í¤¦¤È¤·¤¿¡£", m_name);
#else
msg_format("%s is dazed.", m_name);
#endif
- mproc_add(c_ptr->m_idx, MPROC_STUNNED);
}
/* Apply stun */
- m_ptr->stunned = (tmp < 200) ? tmp : 200;
+ (void)set_monster_stunned(c_ptr->m_idx, MON_STUNNED(m_ptr) + tmp);
}
else
{
}
else
{
- int tmp = m_ptr->confused + 10 + randint0(p_ptr->lev) / 5;
-
#ifdef JP
msg_format("%^s¤Ïº®Í𤷤¿¤è¤¦¤À¡£", m_name);
#else
msg_format("%^s appears confused.", m_name);
#endif
- m_ptr->confused = (tmp < 200) ? tmp : 200;
- if (!m_ptr->mproc_idx[MPROC_CONFUSED]) mproc_add(c_ptr->m_idx, MPROC_CONFUSED);
+ (void)set_monster_confused(c_ptr->m_idx, MON_CONFUSED(m_ptr) + 10 + randint0(p_ptr->lev) / 5);
}
}
msg_format ("There is something scary in your way!");
#endif
- if (m_ptr->csleep)
- {
- /* Disturb the monster */
- m_ptr->csleep = 0;
- mproc_remove(c_ptr->m_idx, m_ptr->mproc_idx[MPROC_CSLEEP], MPROC_CSLEEP);
- if (r_ptr->flags7 & RF7_HAS_LD_MASK) p_ptr->update |= (PU_MON_LITE);
- }
+ /* Disturb the monster */
+ (void)set_monster_csleep(c_ptr->m_idx, 0);
/* Done */
return FALSE;
}
- if (m_ptr->csleep) /* It is not honorable etc to attack helpless victims */
+ if (MON_CSLEEP(m_ptr)) /* It is not honorable etc to attack helpless victims */
{
if (!(r_ptr->flags3 & RF3_EVIL) || one_in_(5)) chg_virtue(V_COMPASSION, -1);
if (!(r_ptr->flags3 & RF3_EVIL) || one_in_(5)) chg_virtue(V_HONOUR, -1);
((p_ptr->muta2 & MUT2_BERS_RAGE) && p_ptr->shero)) &&
pattern_seq(py, px, y, x) && (p_can_enter || p_can_kill_walls))
{
- if (m_ptr->csleep)
- {
- /* Disturb the monster */
- m_ptr->csleep = 0;
- mproc_remove(c_ptr->m_idx, m_ptr->mproc_idx[MPROC_CSLEEP], MPROC_CSLEEP);
- if (r_ptr->flags7 & RF7_HAS_LD_MASK) p_ptr->update |= (PU_MON_LITE);
- }
+ /* Disturb the monster */
+ (void)set_monster_csleep(c_ptr->m_idx, 0);
/* Extract monster name (or "it") */
monster_desc(m_name, m_ptr, 0);
oktomove = FALSE;
disturb(0, 0);
}
- else if (riding_m_ptr->monfear)
+ else if (MON_MONFEAR(riding_m_ptr))
{
char m_name[80];
disturb(0, 0);
}
- if (oktomove && riding_m_ptr->stunned && one_in_(2))
+ if (oktomove && MON_STUNNED(riding_m_ptr) && one_in_(2))
{
char m_name[80];
monster_desc(m_name, riding_m_ptr, 0);
/* Note the collision */
hit_body = TRUE;
- if (m_ptr->csleep)
+ if (MON_CSLEEP(m_ptr))
{
if (!(r_ptr->flags3 & RF3_EVIL) || one_in_(5)) chg_virtue(V_COMPASSION, -1);
if (!(r_ptr->flags3 & RF3_EVIL) || one_in_(5)) chg_virtue(V_HONOUR, -1);
/* ToDo (Robert): fix the invulnerability */
if (cave[y][x].m_idx &&
is_friendly(&m_list[cave[y][x].m_idx]) &&
- !(m_ptr->invulner))
+ !MON_INVULNER(m_ptr))
{
char m_name[80];
monster_desc(m_name, &m_list[cave[y][x].m_idx], 0);
return FALSE;
}
- if (m_ptr->csleep)
+ if (MON_CSLEEP(m_ptr))
{
char m_name[80];
monster_desc(m_name, m_ptr, 0);
- m_ptr->csleep = 0;
- mproc_remove(c_ptr->m_idx, m_ptr->mproc_idx[MPROC_CSLEEP], MPROC_CSLEEP);
+ (void)set_monster_csleep(c_ptr->m_idx, 0);
#ifdef JP
msg_format("%s¤òµ¯¤³¤·¤¿¡£", m_name);
#else
#define MPE_DONT_SWAP_MON 0x00000080
-#define MPROC_CSLEEP 0
-#define MPROC_FAST 1
-#define MPROC_SLOW 2
-#define MPROC_STUNNED 3
-#define MPROC_CONFUSED 4
-#define MPROC_MONFEAR 5
-#define MPROC_INVULNER 6
-
-#define MAX_MPROC 7
+#define MTIMED_CSLEEP 0 /* Monster is sleeping */
+#define MTIMED_FAST 1 /* Monster is temporarily fast */
+#define MTIMED_SLOW 2 /* Monster is temporarily slow */
+#define MTIMED_STUNNED 3 /* Monster is stunned */
+#define MTIMED_CONFUSED 4 /* Monster is confused */
+#define MTIMED_MONFEAR 5 /* Monster is afraid */
+#define MTIMED_INVULNER 6 /* Monster is temporarily invulnerable */
+
+#define MAX_MTIMED 7
+
+#define MON_CSLEEP(M_PTR) ((M_PTR)->mtimed[MTIMED_CSLEEP])
+#define MON_FAST(M_PTR) ((M_PTR)->mtimed[MTIMED_FAST])
+#define MON_SLOW(M_PTR) ((M_PTR)->mtimed[MTIMED_SLOW])
+#define MON_STUNNED(M_PTR) ((M_PTR)->mtimed[MTIMED_STUNNED])
+#define MON_CONFUSED(M_PTR) ((M_PTR)->mtimed[MTIMED_CONFUSED])
+#define MON_MONFEAR(M_PTR) ((M_PTR)->mtimed[MTIMED_MONFEAR])
+#define MON_INVULNER(M_PTR) ((M_PTR)->mtimed[MTIMED_INVULNER])
}
-/*
- * Process the counters of monsters (once per 10 game turns)
- *
- * These functions are to process monsters' counters same as player's.
- */
-
-
-/* Handle "sleep" */
-static void process_monsters_csleep(void)
-{
- int m_idx, i;
- monster_type *m_ptr;
- monster_race *r_ptr;
- bool see_m, test;
- s16b *cur_mproc_list = mproc_list[MPROC_CSLEEP];
-
- u32b noise; /* Hack -- local "player stealth" value */
-
- /* Hack -- calculate the "player noise" */
- noise = (1L << (30 - p_ptr->skill_stl));
-
- /* Process the monsters (backwards) */
- for (i = mproc_max[MPROC_CSLEEP] - 1; i >= 1; i--)
- {
- /* Access the monster */
- m_idx = cur_mproc_list[i];
- m_ptr = &m_list[m_idx];
- r_ptr = &r_info[m_ptr->r_idx];
- see_m = is_seen(m_ptr);
-
- /* Assume does not wake up */
- test = FALSE;
-
- /* Hack -- Require proximity */
- if (m_ptr->cdis < AAF_LIMIT)
- {
- /* Handle "sensing radius" */
- if (m_ptr->cdis <= (is_pet(m_ptr) ? ((r_ptr->aaf > MAX_SIGHT) ? MAX_SIGHT : r_ptr->aaf) : r_ptr->aaf))
- {
- /* We may wake up */
- test = TRUE;
- }
-
- /* Handle "sight" and "aggravation" */
- else if ((m_ptr->cdis <= MAX_SIGHT) && (player_has_los_bold(m_ptr->fy, m_ptr->fx)))
- {
- /* We may wake up */
- test = TRUE;
- }
- }
-
- if (test)
- {
- u32b notice = randint0(1024);
-
- /* Nightmare monsters are more alert */
- if (ironman_nightmare) notice /= 2;
-
- /* Hack -- See if monster "notices" player */
- if ((notice * notice * notice) <= noise)
- {
- /* Hack -- amount of "waking" */
- /* Wake up faster near the player */
- int d = (m_ptr->cdis < AAF_LIMIT / 2) ? (AAF_LIMIT / m_ptr->cdis) : 1;
-
- /* Hack -- amount of "waking" is affected by speed of player */
- d = (d * SPEED_TO_ENERGY(p_ptr->pspeed)) / 10;
- if (d < 0) d = 1;
-
- /* Still asleep */
- if (m_ptr->csleep > d)
- {
- /* Monster wakes up "a little bit" */
- m_ptr->csleep -= d;
-
- /* Notice the "not waking up" */
- if (is_original_ap_and_seen(m_ptr))
- {
- /* Hack -- Count the ignores */
- if (r_ptr->r_ignore < MAX_UCHAR) r_ptr->r_ignore++;
- }
- }
-
- /* Just woke up */
- else
- {
- /* Reset sleep counter */
- m_ptr->csleep = 0;
- mproc_remove(m_idx, i, MPROC_CSLEEP);
- if (r_ptr->flags7 & RF7_HAS_LD_MASK) p_ptr->update |= (PU_MON_LITE);
-
- /* Notice the "waking up" */
- if (see_m)
- {
- char m_name[80];
-
- /* Acquire the monster name */
- monster_desc(m_name, m_ptr, 0);
-
- /* Dump a message */
-#ifdef JP
- msg_format("%^s¤¬Ìܤò³Ð¤Þ¤·¤¿¡£", m_name);
-#else
- msg_format("%^s wakes up.", m_name);
-#endif
- }
-
- if (m_ptr->ml)
- {
- /* Redraw the health bar */
- if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);
- if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);
-
- /* Hack -- Count the wakings */
- if ((r_ptr->r_wake < MAX_UCHAR) && is_original_ap(m_ptr))
- {
- r_ptr->r_wake++;
- }
- }
- }
- }
- }
- }
-}
-
-
-/* Handle fast */
-static void process_monsters_fast(void)
-{
- int m_idx, i;
- monster_type *m_ptr;
- bool see_m;
- s16b *cur_mproc_list = mproc_list[MPROC_FAST];
-
- /* Process the monsters (backwards) */
- for (i = mproc_max[MPROC_FAST] - 1; i >= 1; i--)
- {
- /* Access the monster */
- m_idx = cur_mproc_list[i];
- m_ptr = &m_list[m_idx];
- see_m = is_seen(m_ptr);
-
- /* Reduce by one, note if expires */
- m_ptr->fast--;
-
- if (!m_ptr->fast)
- {
- mproc_remove(m_idx, i, MPROC_FAST);
- if (see_m)
- {
- char m_name[80];
-
- /* Acquire the monster name */
- monster_desc(m_name, m_ptr, 0);
-
- /* Dump a message */
-#ifdef JP
- msg_format("%^s¤Ï¤â¤¦²Ã®¤µ¤ì¤Æ¤¤¤Ê¤¤¡£", m_name);
-#else
- msg_format("%^s is no longer fast.", m_name);
-#endif
- }
- if (p_ptr->riding == m_idx) p_ptr->update |= (PU_BONUS);
- }
- }
-}
-
-
-/* Handle slow */
-static void process_monsters_slow(void)
-{
- int m_idx, i;
- monster_type *m_ptr;
- bool see_m;
- s16b *cur_mproc_list = mproc_list[MPROC_SLOW];
-
- /* Process the monsters (backwards) */
- for (i = mproc_max[MPROC_SLOW] - 1; i >= 1; i--)
- {
- /* Access the monster */
- m_idx = cur_mproc_list[i];
- m_ptr = &m_list[m_idx];
- see_m = is_seen(m_ptr);
-
- /* Reduce by one, note if expires */
- m_ptr->slow--;
-
- if (!m_ptr->slow)
- {
- mproc_remove(m_idx, i, MPROC_SLOW);
- if (see_m)
- {
- char m_name[80];
-
- /* Acquire the monster name */
- monster_desc(m_name, m_ptr, 0);
-
- /* Dump a message */
-#ifdef JP
- msg_format("%^s¤Ï¤â¤¦¸ºÂ®¤µ¤ì¤Æ¤¤¤Ê¤¤¡£", m_name);
-#else
- msg_format("%^s is no longer slow.", m_name);
-#endif
- }
- if (p_ptr->riding == m_idx) p_ptr->update |= (PU_BONUS);
- }
- }
-}
-
-
-/* Handle "stun" */
-static void process_monsters_stunned(void)
-{
- int m_idx, i, d;
- monster_type *m_ptr;
- monster_race *r_ptr;
- bool see_m;
- s16b *cur_mproc_list = mproc_list[MPROC_STUNNED];
-
- /* Process the monsters (backwards) */
- for (i = mproc_max[MPROC_STUNNED] - 1; i >= 1; i--)
- {
- /* Access the monster */
- m_idx = cur_mproc_list[i];
- m_ptr = &m_list[m_idx];
- r_ptr = &r_info[m_ptr->r_idx];
- see_m = is_seen(m_ptr);
-
- d = 1;
-
- /* Make a "saving throw" against stun */
- if (randint0(10000) <= r_ptr->level * r_ptr->level)
- {
- /* Recover fully */
- d = m_ptr->stunned;
- }
-
- /* Hack -- Recover from stun */
- if (m_ptr->stunned > d)
- {
- /* Recover somewhat */
- m_ptr->stunned -= d;
- }
-
- /* Fully recover */
- else
- {
- /* Recover fully */
- m_ptr->stunned = 0;
- mproc_remove(m_idx, i, MPROC_STUNNED);
-
- /* Message if visible */
- if (see_m)
- {
- char m_name[80];
-
- /* Acquire the monster name */
- monster_desc(m_name, m_ptr, 0);
-
- /* Dump a message */
-#ifdef JP
- msg_format("%^s¤ÏÛ¯Û°¾õÂÖ¤«¤éΩ¤Áľ¤Ã¤¿¡£", m_name);
-#else
- msg_format("%^s is no longer stunned.", m_name);
-#endif
- }
- }
- }
-}
-
-
-/* Handle confusion */
-static void process_monsters_confused(void)
-{
- int m_idx, i, d;
- monster_type *m_ptr;
- monster_race *r_ptr;
- bool see_m;
- s16b *cur_mproc_list = mproc_list[MPROC_CONFUSED];
-
- /* Process the monsters (backwards) */
- for (i = mproc_max[MPROC_CONFUSED] - 1; i >= 1; i--)
- {
- /* Access the monster */
- m_idx = cur_mproc_list[i];
- m_ptr = &m_list[m_idx];
- r_ptr = &r_info[m_ptr->r_idx];
- see_m = is_seen(m_ptr);
-
- /* Amount of "boldness" */
- d = randint1(r_ptr->level / 20 + 1);
-
- /* Still confused */
- if (m_ptr->confused > d)
- {
- /* Reduce the confusion */
- m_ptr->confused -= d;
- }
-
- /* Recovered */
- else
- {
- /* No longer confused */
- m_ptr->confused = 0;
- mproc_remove(m_idx, i, MPROC_CONFUSED);
-
- /* Message if visible */
- if (see_m)
- {
- char m_name[80];
-
- /* Acquire the monster name */
- monster_desc(m_name, m_ptr, 0);
-
- /* Dump a message */
-#ifdef JP
- msg_format("%^s¤Ïº®Í𤫤éΩ¤Áľ¤Ã¤¿¡£", m_name);
-#else
- msg_format("%^s is no longer confused.", m_name);
-#endif
- }
- }
- }
-}
-
-
-/* Handle "fear" */
-static void process_monsters_monfear(void)
-{
- int m_idx, i, d;
- monster_type *m_ptr;
- monster_race *r_ptr;
- bool see_m;
- s16b *cur_mproc_list = mproc_list[MPROC_MONFEAR];
-
- /* Process the monsters (backwards) */
- for (i = mproc_max[MPROC_MONFEAR] - 1; i >= 1; i--)
- {
- /* Access the monster */
- m_idx = cur_mproc_list[i];
- m_ptr = &m_list[m_idx];
- r_ptr = &r_info[m_ptr->r_idx];
- see_m = is_seen(m_ptr);
-
- /* Amount of "boldness" */
- d = randint1(r_ptr->level / 20 + 1);
-
- /* Still afraid */
- if (m_ptr->monfear > d)
- {
- /* Reduce the fear */
- m_ptr->monfear -= d;
- }
-
- /* Recover from fear, take note if seen */
- else
- {
- /* No longer afraid */
- m_ptr->monfear = 0;
- mproc_remove(m_idx, i, MPROC_MONFEAR);
-
- /* Visual note */
- if (see_m)
- {
- char m_name[80];
-#ifndef JP
- char m_poss[80];
-
- /* Acquire the monster possessive */
- monster_desc(m_poss, m_ptr, MD_PRON_VISIBLE | MD_POSSESSIVE);
-#endif
-
- /* Acquire the monster name */
- monster_desc(m_name, m_ptr, 0);
-
- /* Dump a message */
-#ifdef JP
- msg_format("%^s¤Ïͦµ¤¤ò¼è¤êÌᤷ¤¿¡£", m_name);
-#else
- msg_format("%^s recovers %s courage.", m_name, m_poss);
-#endif
- }
- if (m_ptr->ml)
- {
- if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);
- if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);
- }
- }
- }
-}
-
-
-/* Handle Invulnerability */
-static void process_monsters_invulner(void)
-{
- int m_idx, i;
- monster_type *m_ptr;
- bool see_m;
- s16b *cur_mproc_list = mproc_list[MPROC_INVULNER];
-
- /* Process the monsters (backwards) */
- for (i = mproc_max[MPROC_INVULNER] - 1; i >= 1; i--)
- {
- /* Access the monster */
- m_idx = cur_mproc_list[i];
- m_ptr = &m_list[m_idx];
- see_m = is_seen(m_ptr);
-
- /* Reduce by one, note if expires */
- m_ptr->invulner--;
-
- if (!m_ptr->invulner)
- {
- mproc_remove(m_idx, i, MPROC_INVULNER);
- if (see_m)
- {
- char m_name[80];
-
- /* Acquire the monster name */
- monster_desc(m_name, m_ptr, 0);
-
- /* Dump a message */
-#ifdef JP
- msg_format("%^s¤Ï¤â¤¦ÌµÅ¨¤Ç¤Ê¤¤¡£", m_name);
-#else
- msg_format("%^s is no longer invulnerable.", m_name);
-#endif
- }
- if (m_ptr->ml)
- {
- if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);
- if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);
- }
- if (!p_ptr->wild_mode) m_ptr->energy_need += ENERGY_NEED();
- }
- }
-}
-
-
static void notice_lite_change(object_type *o_ptr)
{
/* Hack -- notice interesting fuel steps */
if (!p_ptr->leaving)
{
/* Hack -- Process the counters of monsters if needed */
- if (mproc_max[MPROC_CSLEEP] > 1) process_monsters_csleep();
- if (mproc_max[MPROC_FAST] > 1) process_monsters_fast();
- if (mproc_max[MPROC_SLOW] > 1) process_monsters_slow();
- if (mproc_max[MPROC_STUNNED] > 1) process_monsters_stunned();
- if (mproc_max[MPROC_CONFUSED] > 1) process_monsters_confused();
- if (mproc_max[MPROC_MONFEAR] > 1) process_monsters_monfear();
- if (mproc_max[MPROC_INVULNER] > 1) process_monsters_invulner();
+ if (mproc_max[MTIMED_CSLEEP] > 1) process_monsters_csleep();
+ if (mproc_max[MTIMED_FAST] > 1) process_monsters_fast();
+ if (mproc_max[MTIMED_SLOW] > 1) process_monsters_slow();
+ if (mproc_max[MTIMED_STUNNED] > 1) process_monsters_stunned();
+ if (mproc_max[MTIMED_CONFUSED] > 1) process_monsters_confused();
+ if (mproc_max[MTIMED_MONFEAR] > 1) process_monsters_monfear();
+ if (mproc_max[MTIMED_INVULNER] > 1) process_monsters_invulner();
}
monster_type *m_ptr = &m_list[p_ptr->riding];
monster_race *r_ptr = &r_info[m_ptr->r_idx];
- if (m_ptr->csleep)
+ if (MON_CSLEEP(m_ptr))
{
char m_name[80];
/* Recover fully */
- m_ptr->csleep = 0;
- mproc_remove(p_ptr->riding, m_ptr->mproc_idx[MPROC_CSLEEP], MPROC_CSLEEP);
- if (r_ptr->flags7 & RF7_HAS_LD_MASK) p_ptr->update |= (PU_MON_LITE);
+ (void)set_monster_csleep(p_ptr->riding, 0);
/* Acquire the monster name */
monster_desc(m_name, m_ptr, 0);
#else
msg_format("You have waked %s up.", m_name);
#endif
- p_ptr->redraw |= (PR_UHEALTH);
}
- if (m_ptr->stunned)
+ if (MON_STUNNED(m_ptr))
{
- int d = 1;
-
- /* Make a "saving throw" against stun */
- if (randint0(r_ptr->level) < p_ptr->skill_exp[GINOU_RIDING])
- {
- /* Recover fully */
- d = m_ptr->stunned;
- }
-
/* Hack -- Recover from stun */
- if (m_ptr->stunned > d)
- {
- /* Recover somewhat */
- m_ptr->stunned -= d;
- }
-
- /* Fully recover */
- else
+ if (set_monster_stunned(p_ptr->riding,
+ (randint0(r_ptr->level) < p_ptr->skill_exp[GINOU_RIDING]) ? 0 : (MON_STUNNED(m_ptr) - 1)))
{
char m_name[80];
- /* Recover fully */
- m_ptr->stunned = 0;
- mproc_remove(p_ptr->riding, m_ptr->mproc_idx[MPROC_STUNNED], MPROC_STUNNED);
-
/* Acquire the monster name */
monster_desc(m_name, m_ptr, 0);
}
}
- if (m_ptr->confused)
+ if (MON_CONFUSED(m_ptr))
{
- int d = 1;
-
- /* Make a "saving throw" against stun */
- if (randint0(r_ptr->level) < p_ptr->skill_exp[GINOU_RIDING])
- {
- /* Recover fully */
- d = m_ptr->confused;
- }
-
- /* Hack -- Recover from stun */
- if (m_ptr->confused > d)
- {
- /* Recover somewhat */
- m_ptr->confused -= d;
- }
-
- /* Fully recover */
- else
+ /* Hack -- Recover from confusion */
+ if (set_monster_confused(p_ptr->riding,
+ (randint0(r_ptr->level) < p_ptr->skill_exp[GINOU_RIDING]) ? 0 : (MON_CONFUSED(m_ptr) - 1)))
{
char m_name[80];
- /* Recover fully */
- m_ptr->confused = 0;
- mproc_remove(p_ptr->riding, m_ptr->mproc_idx[MPROC_CONFUSED], MPROC_CONFUSED);
-
/* Acquire the monster name */
monster_desc(m_name, m_ptr, 0);
}
}
- if (m_ptr->monfear)
+ if (MON_MONFEAR(m_ptr))
{
- int d = 1;
-
- /* Make a "saving throw" against stun */
- if (randint0(r_ptr->level) < p_ptr->skill_exp[GINOU_RIDING])
- {
- /* Recover fully */
- d = m_ptr->monfear;
- }
-
- /* Hack -- Recover from stun */
- if (m_ptr->monfear > d)
- {
- /* Recover somewhat */
- m_ptr->monfear -= d;
- }
-
- /* Fully recover */
- else
+ /* Hack -- Recover from fear */
+ if (set_monster_monfear(p_ptr->riding,
+ (randint0(r_ptr->level) < p_ptr->skill_exp[GINOU_RIDING]) ? 0 : (MON_MONFEAR(m_ptr) - 1)))
{
char m_name[80];
- /* Recover fully */
- m_ptr->monfear = 0;
- mproc_remove(p_ptr->riding, m_ptr->mproc_idx[MPROC_MONFEAR], MPROC_MONFEAR);
-
/* Acquire the monster name */
monster_desc(m_name, m_ptr, 0);
#else
msg_format("%^s is no longer fear.", m_name);
#endif
- p_ptr->redraw |= (PR_UHEALTH);
}
}
/* Not leaving dungeon */
p_ptr->leaving_dungeon = FALSE;
+ /* Initialize monster process */
+ mproc_init();
+
/* Main loop */
while (TRUE)
{
if (p_ptr->riding)
{
- monster_type *m_ptr = &m_list[p_ptr->riding];
-
- if (m_ptr->fast)
- {
- m_ptr->fast = 0;
- mproc_remove(p_ptr->riding, m_ptr->mproc_idx[MPROC_FAST], MPROC_FAST);
- }
- if (m_ptr->slow)
- {
- m_ptr->slow = 0;
- mproc_remove(p_ptr->riding, m_ptr->mproc_idx[MPROC_SLOW], MPROC_SLOW);
- }
- if (m_ptr->invulner)
- {
- m_ptr->invulner = 0;
- mproc_remove(p_ptr->riding, m_ptr->mproc_idx[MPROC_INVULNER], MPROC_INVULNER);
- }
+ (void)set_monster_fast(p_ptr->riding, 0);
+ (void)set_monster_slow(p_ptr->riding, 0);
+ (void)set_monster_invulner(p_ptr->riding, 0, FALSE);
}
if (p_ptr->pclass == CLASS_BARD)
extern u32b saved_floor_file_sign;
extern object_type *o_list;
extern monster_type *m_list;
-extern s16b *mproc_list[MAX_MPROC];
-extern s16b mproc_max[MAX_MPROC];
+extern s16b *mproc_list[MAX_MTIMED];
+extern s16b mproc_max[MAX_MTIMED];
extern u16b max_towns;
extern town_type *town;
extern object_type *inventory;
extern bool make_attack_normal(int m_idx);
extern bool make_attack_spell(int m_idx);
extern void process_monsters(void);
+extern void mproc_remove(int m_idx, int mproc_type);
+extern void mproc_init(void);
+extern bool set_monster_csleep(int m_idx, int v);
+extern bool set_monster_fast(int m_idx, int v);
+extern bool set_monster_slow(int m_idx, int v);
+extern bool set_monster_stunned(int m_idx, int v);
+extern bool set_monster_confused(int m_idx, int v);
+extern bool set_monster_monfear(int m_idx, int v);
+extern bool set_monster_invulner(int m_idx, int v, bool energy_need);
+extern void process_monsters_csleep(void);
+extern void process_monsters_fast(void);
+extern void process_monsters_slow(void);
+extern void process_monsters_stunned(void);
+extern void process_monsters_confused(void);
+extern void process_monsters_monfear(void);
+extern void process_monsters_invulner(void);
+extern void dispel_monster_status(int m_idx);
extern u32b get_curse(int power, object_type *o_ptr);
extern void curse_equipment(int chance, int heavy_chance);
extern void mon_take_hit_mon(int m_idx, int dam, bool *fear, cptr note, int who);
extern void set_target(monster_type *m_ptr, int y, int x);
extern void reset_target(monster_type *m_ptr);
extern monster_race *real_r_ptr(monster_type *m_ptr);
-extern void mproc_add(int m_idx, int mproc_type);
-extern void mproc_remove(int m_idx, int mproc_idx, int mproc_type);
extern void delete_monster_idx(int i);
extern void delete_monster(int y, int x);
extern void compact_monsters(int size);
}
else
{
- if (m_list[p_ptr->riding].fast) tmp_speed += 10;
- if (m_list[p_ptr->riding].slow) tmp_speed -= 10;
+ if (MON_FAST(&m_list[p_ptr->riding])) tmp_speed += 10;
+ if (MON_SLOW(&m_list[p_ptr->riding])) tmp_speed -= 10;
}
if (tmp_speed)
/* Update stuff */
update_stuff();
+ /* Initialize monster process */
+ mproc_init();
+
/* HACK -- reset the hackish flag */
hack_mind = TRUE;
}
int dis = distance(py, px, m_ptr->fy, m_ptr->fx);
/* Confused (etc.) monsters don't follow. */
- if (m_ptr->confused || m_ptr->stunned || m_ptr->csleep) continue;
+ if (MON_CONFUSED(m_ptr) || MON_STUNNED(m_ptr) || MON_CSLEEP(m_ptr)) continue;
/* Pet of other pet don't follow. */
if (m_ptr->parent_m_idx) continue;
{
monster_type *m_ptr = &m_list[m_idx];
monster_race *r_ptr;
- int cmi;
cave[cy][cx].m_idx = m_idx;
m_ptr->fy = cy;
m_ptr->fx = cx;
m_ptr->ml = TRUE;
- m_ptr->csleep = 0;
- for (cmi = 0; cmi < MAX_MPROC; cmi++) m_ptr->mproc_idx[cmi] = 0;
+ m_ptr->mtimed[MTIMED_CSLEEP] = 0;
/* Paranoia */
m_ptr->hold_o_idx = 0;
/* Hack -- Count the number of "reproducers" */
if (r_ptr->flags2 & RF2_MULTIPLY) num_repro++;
- if (m_ptr->fast) mproc_add(m_idx, MPROC_FAST);
- if (m_ptr->slow) mproc_add(m_idx, MPROC_SLOW);
- if (m_ptr->stunned) mproc_add(m_idx, MPROC_STUNNED);
- if (m_ptr->confused) mproc_add(m_idx, MPROC_CONFUSED);
- if (m_ptr->monfear) mproc_add(m_idx, MPROC_MONFEAR);
- if (m_ptr->invulner) mproc_add(m_idx, MPROC_INVULNER);
-
/* Hack -- Notice new multi-hued monsters */
{
monster_race *ap_r_ptr = &r_info[m_ptr->ap_r_idx];
/* Restore HP */
m_ptr->hp = m_ptr->maxhp = m_ptr->max_maxhp;
- if (m_ptr->monfear)
- {
- /* Remove fear */
- m_ptr->monfear = 0;
- mproc_remove(i, m_ptr->mproc_idx[MPROC_MONFEAR], MPROC_MONFEAR);
- }
-
- if (m_ptr->invulner)
- {
- /* Remove invulnerability */
- m_ptr->invulner = 0;
- mproc_remove(i, m_ptr->mproc_idx[MPROC_INVULNER], MPROC_INVULNER);
- }
-
- if (m_ptr->fast)
- {
- /* Remove fast status */
- m_ptr->fast = 0;
- mproc_remove(i, m_ptr->mproc_idx[MPROC_FAST], MPROC_FAST);
- }
-
- if (m_ptr->slow)
- {
- /* Remove slow status */
- m_ptr->slow = 0;
- mproc_remove(i, m_ptr->mproc_idx[MPROC_SLOW], MPROC_SLOW);
- }
-
- if (m_ptr->stunned)
- {
- /* Remove stun */
- m_ptr->stunned = 0;
- mproc_remove(i, m_ptr->mproc_idx[MPROC_STUNNED], MPROC_STUNNED);
- }
-
- if (m_ptr->confused)
- {
- /* Remove confusion */
- m_ptr->confused = 0;
- mproc_remove(i, m_ptr->mproc_idx[MPROC_CONFUSED], MPROC_CONFUSED);
- }
+ /* Remove timed status (except MTIMED_CSLEEP) */
+ (void)set_monster_fast(i, 0);
+ (void)set_monster_slow(i, 0);
+ (void)set_monster_stunned(i, 0);
+ (void)set_monster_confused(i, 0);
+ (void)set_monster_monfear(i, 0);
+ (void)set_monster_invulner(i, 0, FALSE);
}
/* Extract real monster race */
C_WIPE(m_list, m_max, monster_type);
m_max = 1;
m_cnt = 0;
- for (i = 0; i < MAX_MPROC; i++) mproc_max[i] = 1;
+ for (i = 0; i < MAX_MTIMED; i++) mproc_max[i] = 1;
/* Pre-calc cur_num of pets in party_mon[] */
precalc_cur_num_of_pet();
C_MAKE(m_list, max_m_idx, monster_type);
/* Allocate and Wipe the monster process list */
- for (i = 0; i < MAX_MPROC; i++)
+ for (i = 0; i < MAX_MTIMED; i++)
{
C_MAKE(mproc_list[i], max_m_idx, s16b);
mproc_max[i] = 1;
{
rd_s16b(&m_ptr->max_maxhp);
}
- rd_s16b(&m_ptr->csleep);
+ rd_s16b(&m_ptr->mtimed[MTIMED_CSLEEP]);
rd_byte(&m_ptr->mspeed);
if (z_older_than(10, 4, 2))
{
if (z_older_than(10,0,7))
{
- m_ptr->fast = 0;
- m_ptr->slow = 0;
+ m_ptr->mtimed[MTIMED_FAST] = 0;
+ m_ptr->mtimed[MTIMED_SLOW] = 0;
}
else
{
- rd_byte(&m_ptr->fast);
- rd_byte(&m_ptr->slow);
+ rd_byte(&tmp8u);
+ m_ptr->mtimed[MTIMED_FAST] = (s16b)tmp8u;
+ rd_byte(&tmp8u);
+ m_ptr->mtimed[MTIMED_SLOW] = (s16b)tmp8u;
}
- rd_byte(&m_ptr->stunned);
- rd_byte(&m_ptr->confused);
- rd_byte(&m_ptr->monfear);
+ rd_byte(&tmp8u);
+ m_ptr->mtimed[MTIMED_STUNNED] = (s16b)tmp8u;
+ rd_byte(&tmp8u);
+ m_ptr->mtimed[MTIMED_CONFUSED] = (s16b)tmp8u;
+ rd_byte(&tmp8u);
+ m_ptr->mtimed[MTIMED_MONFEAR] = (s16b)tmp8u;
if (z_older_than(10,0,10))
{
rd_s16b(&m_ptr->target_x);
}
- rd_byte(&m_ptr->invulner);
+ rd_byte(&tmp8u);
+ m_ptr->mtimed[MTIMED_INVULNER] = (s16b)tmp8u;
if (!(z_major == 2 && z_minor == 0 && z_patch == 6))
rd_u32b(&m_ptr->smart);
{
u32b flags;
char buf[128];
+ byte tmp8u;
if (h_older_than(1, 5, 0, 0))
{
if (flags & SAVE_MON_SUB_ALIGN) rd_byte(&m_ptr->sub_align);
else m_ptr->sub_align = 0;
- if (flags & SAVE_MON_CSLEEP) rd_s16b(&m_ptr->csleep);
- else m_ptr->csleep = 0;
+ if (flags & SAVE_MON_CSLEEP) rd_s16b(&m_ptr->mtimed[MTIMED_CSLEEP]);
+ else m_ptr->mtimed[MTIMED_CSLEEP] = 0;
rd_byte(&m_ptr->mspeed);
rd_s16b(&m_ptr->energy_need);
- if (flags & SAVE_MON_FAST) rd_byte(&m_ptr->fast);
- else m_ptr->fast = 0;
- if (flags & SAVE_MON_SLOW) rd_byte(&m_ptr->slow);
- else m_ptr->slow = 0;
- if (flags & SAVE_MON_STUNNED) rd_byte(&m_ptr->stunned);
- else m_ptr->stunned = 0;
- if (flags & SAVE_MON_CONFUSED) rd_byte(&m_ptr->confused);
- else m_ptr->confused = 0;
- if (flags & SAVE_MON_MONFEAR) rd_byte(&m_ptr->monfear);
- else m_ptr->monfear = 0;
+ if (flags & SAVE_MON_FAST)
+ {
+ rd_byte(&tmp8u);
+ m_ptr->mtimed[MTIMED_FAST] = (s16b)tmp8u;
+ }
+ else m_ptr->mtimed[MTIMED_FAST] = 0;
+ if (flags & SAVE_MON_SLOW)
+ {
+ rd_byte(&tmp8u);
+ m_ptr->mtimed[MTIMED_SLOW] = (s16b)tmp8u;
+ }
+ else m_ptr->mtimed[MTIMED_SLOW] = 0;
+ if (flags & SAVE_MON_STUNNED)
+ {
+ rd_byte(&tmp8u);
+ m_ptr->mtimed[MTIMED_STUNNED] = (s16b)tmp8u;
+ }
+ else m_ptr->mtimed[MTIMED_STUNNED] = 0;
+ if (flags & SAVE_MON_CONFUSED)
+ {
+ rd_byte(&tmp8u);
+ m_ptr->mtimed[MTIMED_CONFUSED] = (s16b)tmp8u;
+ }
+ else m_ptr->mtimed[MTIMED_CONFUSED] = 0;
+ if (flags & SAVE_MON_MONFEAR)
+ {
+ rd_byte(&tmp8u);
+ m_ptr->mtimed[MTIMED_MONFEAR] = (s16b)tmp8u;
+ }
+ else m_ptr->mtimed[MTIMED_MONFEAR] = 0;
if (flags & SAVE_MON_TARGET_Y) rd_s16b(&m_ptr->target_y);
else m_ptr->target_y = 0;
if (flags & SAVE_MON_TARGET_X) rd_s16b(&m_ptr->target_x);
else m_ptr->target_x = 0;
- if (flags & SAVE_MON_INVULNER) rd_byte(&m_ptr->invulner);
- else m_ptr->invulner = 0;
+ if (flags & SAVE_MON_INVULNER)
+ {
+ rd_byte(&tmp8u);
+ m_ptr->mtimed[MTIMED_INVULNER] = (s16b)tmp8u;
+ }
+ else m_ptr->mtimed[MTIMED_INVULNER] = 0;
if (flags & SAVE_MON_SMART) rd_u32b(&m_ptr->smart);
else m_ptr->smart = 0;
/* Read the monsters */
for (i = 1; i < limit; i++)
{
- int m_idx, cmi;
+ int m_idx;
monster_type *m_ptr;
/* Get a new record */
/* Read the monster */
rd_monster(m_ptr);
- for (cmi = 0; cmi < MAX_MPROC; cmi++) m_ptr->mproc_idx[cmi] = 0;
- if (m_ptr->csleep) mproc_add(m_idx, MPROC_CSLEEP);
- if (m_ptr->fast) mproc_add(m_idx, MPROC_FAST);
- if (m_ptr->slow) mproc_add(m_idx, MPROC_SLOW);
- if (m_ptr->stunned) mproc_add(m_idx, MPROC_STUNNED);
- if (m_ptr->confused) mproc_add(m_idx, MPROC_CONFUSED);
- if (m_ptr->monfear) mproc_add(m_idx, MPROC_MONFEAR);
- if (m_ptr->invulner) mproc_add(m_idx, MPROC_INVULNER);
/* Access grid */
for (i = 1; i < limit; i++)
{
cave_type *c_ptr;
- int m_idx, cmi;
+ int m_idx;
monster_type *m_ptr;
/* Get a new record */
/* Read the monster */
rd_monster(m_ptr);
- for (cmi = 0; cmi < MAX_MPROC; cmi++) m_ptr->mproc_idx[cmi] = 0;
- if (m_ptr->csleep) mproc_add(m_idx, MPROC_CSLEEP);
- if (m_ptr->fast) mproc_add(m_idx, MPROC_FAST);
- if (m_ptr->slow) mproc_add(m_idx, MPROC_SLOW);
- if (m_ptr->stunned) mproc_add(m_idx, MPROC_STUNNED);
- if (m_ptr->confused) mproc_add(m_idx, MPROC_CONFUSED);
- if (m_ptr->monfear) mproc_add(m_idx, MPROC_MONFEAR);
- if (m_ptr->invulner) mproc_add(m_idx, MPROC_INVULNER);
/* Access grid */
break;
case MS_DISPEL:
{
- monster_type *m_ptr;
int m_idx;
- char m_name[80];
if (!target_set(TARGET_KILL)) return FALSE;
m_idx = cave[target_row][target_col].m_idx;
if (!m_idx) break;
if (!player_has_los_bold(target_row, target_col)) break;
if (!projectable(py, px, target_row, target_col)) break;
- m_ptr = &m_list[m_idx];
- monster_desc(m_name, m_ptr, 0);
- if (m_ptr->invulner)
- {
- m_ptr->invulner = 0;
- mproc_remove(m_idx, m_ptr->mproc_idx[MPROC_INVULNER], MPROC_INVULNER);
- if (m_ptr->ml)
- {
-#ifdef JP
- msg_format("%s¤Ï¤â¤¦ÌµÅ¨¤Ç¤Ï¤Ê¤¤¡£", m_name);
-#else
- msg_format("%^s is no longer invulnerable.", m_name);
-#endif
- p_ptr->redraw |= (PR_HEALTH);
- if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);
- }
- m_ptr->energy_need += ENERGY_NEED();
- }
- if (m_ptr->fast)
- {
- m_ptr->fast = 0;
- mproc_remove(m_idx, m_ptr->mproc_idx[MPROC_FAST], MPROC_FAST);
-#ifdef JP
- if (m_ptr->ml) msg_format("%s¤Ï¤â¤¦²Ã®¤µ¤ì¤Æ¤¤¤Ê¤¤¡£", m_name);
-#else
- if (m_ptr->ml) msg_format("%^s is no longer fast.", m_name);
-#endif
- }
- if (m_ptr->slow)
- {
- m_ptr->slow = 0;
- mproc_remove(m_idx, m_ptr->mproc_idx[MPROC_SLOW], MPROC_SLOW);
-#ifdef JP
- if (m_ptr->ml) msg_format("%s¤Ï¤â¤¦¸ºÂ®¤µ¤ì¤Æ¤¤¤Ê¤¤¡£", m_name);
-#else
- if (m_ptr->ml) msg_format("%^s is no longer slow.", m_name);
-#endif
- }
+ dispel_monster_status(m_idx);
break;
}
case MS_ROCKET:
ac = p_ptr->ac + p_ptr->to_a;
/* Monster hits player */
- if (!effect || check_hit(power, rlev, m_ptr->stunned))
+ if (!effect || check_hit(power, rlev, MON_STUNNED(m_ptr)))
{
/* Always disturbing */
disturb(1, 0);
get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
/* Confused monsters cannot steal successfully. -LM-*/
- if (m_ptr->confused) break;
+ if (MON_CONFUSED(m_ptr)) break;
if (p_ptr->is_dead) break;
get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
/* Confused monsters cannot steal successfully. -LM-*/
- if (m_ptr->confused) break;
+ if (MON_CONFUSED(m_ptr)) break;
if (p_ptr->is_dead) break;
if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);
}
- if (m_ptr->csleep)
- {
- /* Wake it up */
- m_ptr->csleep = 0;
- mproc_remove(m_idx, m_ptr->mproc_idx[MPROC_CSLEEP], MPROC_CSLEEP);
- if (r_ptr->flags7 & RF7_HAS_LD_MASK) p_ptr->update |= (PU_MON_LITE);
- }
+ /* Wake it up */
+ (void)set_monster_csleep(m_idx, 0);
if (p_ptr->riding && (m_idx == p_ptr->riding)) disturb(1, 0);
- if (m_ptr->invulner && randint0(PENETRATE_INVULNERABILITY))
+ if (MON_INVULNER(m_ptr) && randint0(PENETRATE_INVULNERABILITY))
{
if (seen)
{
#ifdef ALLOW_FEAR
/* Mega-Hack -- Pain cancels fear */
- if (m_ptr->monfear && (dam > 0))
+ if (MON_MONFEAR(m_ptr) && (dam > 0))
{
- int tmp = randint1(dam / 4);
-
- /* Cure a little fear */
- if (tmp < m_ptr->monfear)
- {
- /* Reduce fear */
- m_ptr->monfear -= tmp;
- }
-
- /* Cure all the fear */
- else
+ /* Cure fear */
+ if (set_monster_monfear(m_idx, MON_MONFEAR(m_ptr) - randint1(dam / 4)))
{
- /* Cure fear */
- m_ptr->monfear = 0;
- mproc_remove(m_idx, m_ptr->mproc_idx[MPROC_MONFEAR], MPROC_MONFEAR);
-
/* No more fear */
(*fear) = FALSE;
}
}
/* Sometimes a monster gets scared by damage */
- if (!m_ptr->monfear && !(r_ptr->flags3 & RF3_NO_FEAR))
+ if (!MON_MONFEAR(m_ptr) && !(r_ptr->flags3 & RF3_NO_FEAR))
{
- int percentage;
-
/* Percentage of fully healthy */
- percentage = (100L * m_ptr->hp) / m_ptr->maxhp;
+ int percentage = (100L * m_ptr->hp) / m_ptr->maxhp;
/*
* Run (sometimes) if at 10% or less of max hit points,
(*fear) = TRUE;
/* XXX XXX XXX Hack -- Add some timed fear */
- m_ptr->monfear += (randint1(10) +
+ (void)set_monster_monfear(m_idx, (randint1(10) +
(((dam >= m_ptr->hp) && (percentage > 7)) ?
- 20 : ((11 - percentage) * 5)));
-
- mproc_add(m_idx, MPROC_MONFEAR);
+ 20 : ((11 - percentage) * 5))));
}
}
if (m_ptr->cdis > MAX_SIGHT + 5) return (FALSE);
/* All "afraid" monsters will run away */
- if (m_ptr->monfear) return (TRUE);
+ if (MON_MONFEAR(m_ptr)) return (TRUE);
#ifdef ALLOW_TERROR
power = mbe_info[effect].power;
/* Monster hits */
- if (!effect || check_hit2(power, rlev, ac, m_ptr->stunned))
+ if (!effect || check_hit2(power, rlev, ac, MON_STUNNED(m_ptr)))
{
- if (t_ptr->csleep)
- {
- /* Wake it up */
- t_ptr->csleep = 0;
- mproc_remove(t_idx, t_ptr->mproc_idx[MPROC_CSLEEP], MPROC_CSLEEP);
- if (tr_ptr->flags7 & RF7_HAS_LD_MASK) p_ptr->update |= (PU_MON_LITE);
- }
+ /* Wake it up */
+ (void)set_monster_csleep(t_idx, 0);
if (t_ptr->ml)
{
case RBM_ENGULF:
case RBM_CHARGE:
{
- if (t_ptr->csleep)
- {
- /* Wake it up */
- t_ptr->csleep = 0;
- mproc_remove(t_idx, t_ptr->mproc_idx[MPROC_CSLEEP], MPROC_CSLEEP);
- if (tr_ptr->flags7 & RF7_HAS_LD_MASK) p_ptr->update |= (PU_MON_LITE);
-
- if (t_ptr->ml)
- {
- /* Redraw the health bar */
- if (p_ptr->health_who == t_idx) p_ptr->redraw |= (PR_HEALTH);
- if (p_ptr->riding == t_idx) p_ptr->redraw |= (PR_UHEALTH);
- }
- }
+ /* Wake it up */
+ (void)set_monster_csleep(t_idx, 0);
/* Visible monsters */
if (see_m)
{
/* Message */
#ifdef JP
-msg_format("%s¤Ï%^s¤Î¹¶·â¤ò¤«¤ï¤·¤¿¡£", t_name,m_name);
+ msg_format("%s¤Ï%^s¤Î¹¶·â¤ò¤«¤ï¤·¤¿¡£", t_name,m_name);
#else
msg_format("%^s misses %s.", m_name, t_name);
#endif
-
}
break;
sound(SOUND_EXPLODE);
/* Cancel Invulnerability */
- if (m_ptr->invulner)
- {
- m_ptr->invulner = 0;
- mproc_remove(m_idx, m_ptr->mproc_idx[MPROC_INVULNER], MPROC_INVULNER);
- }
+ (void)set_monster_invulner(m_idx, 0, FALSE);
#ifdef JP
mon_take_hit_mon(m_idx, m_ptr->hp + 1, &fear, "¤ÏÇúȯ¤·¤ÆÊ´¡¹¤Ë¤Ê¤Ã¤¿¡£", m_idx);
}
}
- if ((m_ptr->mflag2 & MFLAG2_CHAMELEON) && one_in_(13) && !m_ptr->csleep)
+ if ((m_ptr->mflag2 & MFLAG2_CHAMELEON) && one_in_(13) && !MON_CSLEEP(m_ptr))
{
choose_new_monster(m_idx, FALSE, 0);
r_ptr = &r_info[m_ptr->r_idx];
}
/* Handle "sleep" */
- if (m_ptr->csleep)
+ if (MON_CSLEEP(m_ptr))
{
/* Handle non-aggravation - Still sleeping */
if (!(p_ptr->cursed & TRC_AGGRAVATE)) return;
/* Handle aggravation */
/* Reset sleep counter */
- m_ptr->csleep = 0;
- mproc_remove(m_idx, m_ptr->mproc_idx[MPROC_CSLEEP], MPROC_CSLEEP);
- if (r_ptr->flags7 & RF7_HAS_LD_MASK) p_ptr->update |= (PU_MON_LITE);
+ (void)set_monster_csleep(m_idx, 0);
/* Notice the "waking up" */
if (see_m)
if (m_ptr->ml)
{
- /* Redraw the health bar */
- if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);
- if (is_riding_mon) p_ptr->redraw |= (PR_UHEALTH);
-
/* Hack -- Count the wakings */
if ((r_ptr->r_wake < MAX_UCHAR) && is_original_ap(m_ptr))
{
}
/* Handle "stun" */
- if (m_ptr->stunned)
+ if (MON_STUNNED(m_ptr))
{
/* Sometimes skip move */
if (one_in_(2)) return;
{
if (disturb_minor) disturb(FALSE, FALSE);
#ifdef JP
-msg_print("½Å¸ü¤Ê²»¤¬Ê¹¤³¤¨¤¿¡£");
+ msg_print("½Å¸ü¤Ê²»¤¬Ê¹¤³¤¨¤¿¡£");
#else
msg_print("You hear heavy steps.");
#endif
-
}
/* Some monsters can speak */
monster_desc(m_name, m_ptr, 0);
else
#ifdef JP
-strcpy(m_name, "¤½¤ì");
+ strcpy(m_name, "¤½¤ì");
#else
strcpy(m_name, "It");
#endif
-
/* Select the file for monster quotes */
- if (m_ptr->monfear)
+ if (MON_MONFEAR(m_ptr))
#ifdef JP
-filename = "monfear_j.txt";
+ filename = "monfear_j.txt";
#else
filename = "monfear.txt";
#endif
-
else if (is_pet(m_ptr))
#ifdef JP
-filename = "monpet_j.txt";
+ filename = "monpet_j.txt";
#else
filename = "monpet.txt";
#endif
-
else if (is_friendly(m_ptr))
#ifdef JP
-filename = "monfrien_j.txt";
+ filename = "monfrien_j.txt";
#else
filename = "monfrien.txt";
#endif
-
else
#ifdef JP
filename = "monspeak_j.txt";
#else
filename = "monspeak.txt";
#endif
-
-
/* Get the monster line */
if (get_rnd_line(filename, m_ptr->ap_r_idx, monmessage) == 0)
{
/* Confused -- 100% random */
- if (m_ptr->confused || !aware)
+ if (MON_CONFUSED(m_ptr) || !aware)
{
/* Try four "random" directions */
mm[0] = mm[1] = mm[2] = mm[3] = 5;
/* In anti-melee dungeon, stupid or confused monster takes useless turn */
if (do_move && (d_info[dungeon_type].flags1 & DF1_NO_MELEE))
{
- if (!m_ptr->confused)
+ if (!MON_CONFUSED(m_ptr))
{
if (!(r_ptr->flags2 & RF2_STUPID)) do_move = FALSE;
else
if (((r_ptr->flags2 & RF2_KILL_BODY) && !(r_ptr->flags1 & RF1_NEVER_BLOW) &&
(r_ptr->mexp * r_ptr->level > z_ptr->mexp * z_ptr->level) &&
can_cross && (c_ptr->m_idx != p_ptr->riding)) ||
- are_enemies(m_ptr, y_ptr) || m_ptr->confused)
+ are_enemies(m_ptr, y_ptr) || MON_CONFUSED(m_ptr))
{
if (!(r_ptr->flags1 & RF1_NEVER_BLOW))
{
/* In anti-melee dungeon, stupid or confused monster takes useless turn */
else if (d_info[dungeon_type].flags1 & DF1_NO_MELEE)
{
- if (m_ptr->confused) return;
+ if (MON_CONFUSED(m_ptr)) return;
else if (r_ptr->flags2 & RF2_STUPID)
{
if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags2 |= (RF2_STUPID);
/* Monster pushed past another monster */
did_move_body = TRUE;
- if (y_ptr->csleep)
- {
- /* Wake up the moved monster */
- y_ptr->csleep = 0;
- mproc_remove(c_ptr->m_idx, y_ptr->mproc_idx[MPROC_CSLEEP], MPROC_CSLEEP);
- if (z_ptr->flags7 & (RF7_LITE_MASK | RF7_DARK_MASK)) p_ptr->update |= (PU_MON_LITE);
-
- if (y_ptr->ml)
- {
- /* Redraw the health bar */
- if (p_ptr->health_who == c_ptr->m_idx) p_ptr->redraw |= (PR_HEALTH);
- }
- }
+ /* Wake up the moved monster */
+ (void)set_monster_csleep(c_ptr->m_idx, 0);
/* XXX XXX XXX Message */
}
if (is_riding_mon)
{
- if (!p_ptr->riding_ryoute && !(m_list[p_ptr->riding].monfear)) do_move = FALSE;
+ if (!p_ptr->riding_ryoute && !MON_MONFEAR(&m_list[p_ptr->riding])) do_move = FALSE;
}
/* Creature has been allowed move */
m_ptr->mflag2 &= ~MFLAG2_NOFLOW;
/* If we haven't done anything, try casting a spell again */
- if (!do_turn && !do_move && !m_ptr->monfear && !is_riding_mon && aware)
+ if (!do_turn && !do_move && !MON_MONFEAR(m_ptr) && !is_riding_mon && aware)
{
/* Try to cast spell again */
if (r_ptr->freq_spell && randint1(100) <= r_ptr->freq_spell)
/* Hack -- get "bold" if out of options */
- if (!do_turn && !do_move && m_ptr->monfear && aware)
+ if (!do_turn && !do_move && MON_MONFEAR(m_ptr) && aware)
{
/* No longer afraid */
- m_ptr->monfear = 0;
- mproc_remove(m_idx, m_ptr->mproc_idx[MPROC_MONFEAR], MPROC_MONFEAR);
+ (void)set_monster_monfear(m_idx, 0);
/* Message if seen */
if (see_m)
#endif
}
- if (m_ptr->ml)
- {
- /* Redraw (later) if needed */
- if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);
- if (is_riding_mon) p_ptr->redraw |= (PR_UHEALTH);
-
- chg_virtue(V_COMPASSION, -1);
- }
+ if (m_ptr->ml) chg_virtue(V_COMPASSION, -1);
/* XXX XXX XXX Actually do something now (?) */
}
/* Monsters move quickly in Nightmare mode */
if (ironman_nightmare) speed += 5;
- if (m_ptr->fast) speed += 10;
- if (m_ptr->slow) speed -= 10;
+ if (MON_FAST(m_ptr)) speed += 10;
+ if (MON_SLOW(m_ptr)) speed -= 10;
}
/* Give this monster some energy */
}
+static void mproc_add(int m_idx, int mproc_type)
+{
+ if (mproc_max[mproc_type] < max_m_idx)
+ {
+ m_list[m_idx].mproc_idx[mproc_type] = mproc_max[mproc_type];
+ mproc_list[mproc_type][mproc_max[mproc_type]++] = m_idx;
+ }
+}
+
+
+void mproc_remove(int m_idx, int mproc_type)
+{
+ if (mproc_max[mproc_type] > 1)
+ {
+ mproc_list[mproc_type][m_list[m_idx].mproc_idx[mproc_type]] = mproc_list[mproc_type][--mproc_max[mproc_type]];
+ m_list[m_idx].mproc_idx[mproc_type] = 0;
+ }
+}
+
+
+/*
+ * Initialize monster process
+ */
+void mproc_init(void)
+{
+ monster_type *m_ptr;
+ int i, cmi;
+
+ /* Reset "mproc_max[]" */
+ for (cmi = 0; cmi < MAX_MTIMED; cmi++) mproc_max[cmi] = 1;
+
+ /* Process the monsters (backwards) */
+ for (i = m_max - 1; i >= 1; i--)
+ {
+ /* Access the monster */
+ m_ptr = &m_list[i];
+
+ /* Ignore "dead" monsters */
+ if (!m_ptr->r_idx) continue;
+
+ for (cmi = 0; cmi < MAX_MTIMED; cmi++)
+ {
+ if (m_ptr->mtimed[cmi]) mproc_add(i, cmi);
+ else m_ptr->mproc_idx[cmi] = 0;
+ }
+ }
+}
+
+
+/*
+ * Set "m_ptr->mtimed[MTIMED_CSLEEP]", notice observable changes
+ */
+bool set_monster_csleep(int m_idx, int v)
+{
+ monster_type *m_ptr = &m_list[m_idx];
+ bool notice = FALSE;
+
+ /* Hack -- Force good values */
+ v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
+
+ /* Open */
+ if (v)
+ {
+ if (!MON_CSLEEP(m_ptr))
+ {
+ mproc_add(m_idx, MTIMED_CSLEEP);
+ notice = TRUE;
+ }
+ }
+
+ /* Shut */
+ else
+ {
+ if (MON_CSLEEP(m_ptr))
+ {
+ mproc_remove(m_idx, MTIMED_CSLEEP);
+ notice = TRUE;
+ }
+ }
+
+ /* Use the value */
+ m_ptr->mtimed[MTIMED_CSLEEP] = v;
+
+ if (!notice) return FALSE;
+
+ if (m_ptr->ml)
+ {
+ /* Update health bar as needed */
+ if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);
+ if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);
+ }
+
+ if (r_info[m_ptr->r_idx].flags7 & RF7_HAS_LD_MASK) p_ptr->update |= (PU_MON_LITE);
+
+ return TRUE;
+}
+
+
+/*
+ * Set "m_ptr->mtimed[MTIMED_FAST]", notice observable changes
+ */
+bool set_monster_fast(int m_idx, int v)
+{
+ monster_type *m_ptr = &m_list[m_idx];
+ bool notice = FALSE;
+
+ /* Hack -- Force good values */
+ v = (v > 200) ? 200 : (v < 0) ? 0 : v;
+
+ /* Open */
+ if (v)
+ {
+ if (!MON_FAST(m_ptr))
+ {
+ mproc_add(m_idx, MTIMED_FAST);
+ notice = TRUE;
+ }
+ }
+
+ /* Shut */
+ else
+ {
+ if (MON_FAST(m_ptr))
+ {
+ mproc_remove(m_idx, MTIMED_FAST);
+ notice = TRUE;
+ }
+ }
+
+ /* Use the value */
+ m_ptr->mtimed[MTIMED_FAST] = v;
+
+ if (!notice) return FALSE;
+
+ if (p_ptr->riding == m_idx) p_ptr->update |= (PU_BONUS);
+
+ return TRUE;
+}
+
+
+/*
+ * Set "m_ptr->mtimed[MTIMED_SLOW]", notice observable changes
+ */
+bool set_monster_slow(int m_idx, int v)
+{
+ monster_type *m_ptr = &m_list[m_idx];
+ bool notice = FALSE;
+
+ /* Hack -- Force good values */
+ v = (v > 200) ? 200 : (v < 0) ? 0 : v;
+
+ /* Open */
+ if (v)
+ {
+ if (!MON_SLOW(m_ptr))
+ {
+ mproc_add(m_idx, MTIMED_SLOW);
+ notice = TRUE;
+ }
+ }
+
+ /* Shut */
+ else
+ {
+ if (MON_SLOW(m_ptr))
+ {
+ mproc_remove(m_idx, MTIMED_SLOW);
+ notice = TRUE;
+ }
+ }
+
+ /* Use the value */
+ m_ptr->mtimed[MTIMED_SLOW] = v;
+
+ if (!notice) return FALSE;
+
+ if (p_ptr->riding == m_idx) p_ptr->update |= (PU_BONUS);
+
+ return TRUE;
+}
+
+
+/*
+ * Set "m_ptr->mtimed[MTIMED_STUNNED]", notice observable changes
+ */
+bool set_monster_stunned(int m_idx, int v)
+{
+ monster_type *m_ptr = &m_list[m_idx];
+ bool notice = FALSE;
+
+ /* Hack -- Force good values */
+ v = (v > 200) ? 200 : (v < 0) ? 0 : v;
+
+ /* Open */
+ if (v)
+ {
+ if (!MON_STUNNED(m_ptr))
+ {
+ mproc_add(m_idx, MTIMED_STUNNED);
+ notice = TRUE;
+ }
+ }
+
+ /* Shut */
+ else
+ {
+ if (MON_STUNNED(m_ptr))
+ {
+ mproc_remove(m_idx, MTIMED_STUNNED);
+ notice = TRUE;
+ }
+ }
+
+ /* Use the value */
+ m_ptr->mtimed[MTIMED_STUNNED] = v;
+
+ return notice;
+}
+
+
+/*
+ * Set "m_ptr->mtimed[MTIMED_CONFUSED]", notice observable changes
+ */
+bool set_monster_confused(int m_idx, int v)
+{
+ monster_type *m_ptr = &m_list[m_idx];
+ bool notice = FALSE;
+
+ /* Hack -- Force good values */
+ v = (v > 200) ? 200 : (v < 0) ? 0 : v;
+
+ /* Open */
+ if (v)
+ {
+ if (!MON_CONFUSED(m_ptr))
+ {
+ mproc_add(m_idx, MTIMED_CONFUSED);
+ notice = TRUE;
+ }
+ }
+
+ /* Shut */
+ else
+ {
+ if (MON_CONFUSED(m_ptr))
+ {
+ mproc_remove(m_idx, MTIMED_CONFUSED);
+ notice = TRUE;
+ }
+ }
+
+ /* Use the value */
+ m_ptr->mtimed[MTIMED_CONFUSED] = v;
+
+ return notice;
+}
+
+
+/*
+ * Set "m_ptr->mtimed[MTIMED_MONFEAR]", notice observable changes
+ */
+bool set_monster_monfear(int m_idx, int v)
+{
+ monster_type *m_ptr = &m_list[m_idx];
+ bool notice = FALSE;
+
+ /* Hack -- Force good values */
+ v = (v > 200) ? 200 : (v < 0) ? 0 : v;
+
+ /* Open */
+ if (v)
+ {
+ if (!MON_MONFEAR(m_ptr))
+ {
+ mproc_add(m_idx, MTIMED_MONFEAR);
+ notice = TRUE;
+ }
+ }
+
+ /* Shut */
+ else
+ {
+ if (MON_MONFEAR(m_ptr))
+ {
+ mproc_remove(m_idx, MTIMED_MONFEAR);
+ notice = TRUE;
+ }
+ }
+
+ /* Use the value */
+ m_ptr->mtimed[MTIMED_MONFEAR] = v;
+
+ if (!notice) return FALSE;
+
+ if (m_ptr->ml)
+ {
+ /* Update health bar as needed */
+ if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);
+ if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);
+ }
+
+ return TRUE;
+}
+
+
+/*
+ * Set "m_ptr->mtimed[MTIMED_INVULNER]", notice observable changes
+ */
+bool set_monster_invulner(int m_idx, int v, bool energy_need)
+{
+ monster_type *m_ptr = &m_list[m_idx];
+ bool notice = FALSE;
+
+ /* Hack -- Force good values */
+ v = (v > 200) ? 200 : (v < 0) ? 0 : v;
+
+ /* Open */
+ if (v)
+ {
+ if (!MON_INVULNER(m_ptr))
+ {
+ mproc_add(m_idx, MTIMED_INVULNER);
+ notice = TRUE;
+ }
+ }
+
+ /* Shut */
+ else
+ {
+ if (MON_INVULNER(m_ptr))
+ {
+ mproc_remove(m_idx, MTIMED_INVULNER);
+ if (energy_need && !p_ptr->wild_mode) m_ptr->energy_need += ENERGY_NEED();
+ notice = TRUE;
+ }
+ }
+
+ /* Use the value */
+ m_ptr->mtimed[MTIMED_INVULNER] = v;
+
+ if (!notice) return FALSE;
+
+ if (m_ptr->ml)
+ {
+ /* Update health bar as needed */
+ if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);
+ if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);
+ }
+
+ return TRUE;
+}
+
+
+/*
+ * Process the counters of monsters (once per 10 game turns)
+ *
+ * These functions are to process monsters' counters same as player's.
+ */
+
+
+/* Handle "sleep" */
+void process_monsters_csleep(void)
+{
+ int m_idx, i;
+ monster_type *m_ptr;
+ monster_race *r_ptr;
+ bool test;
+ s16b *cur_mproc_list = mproc_list[MTIMED_CSLEEP];
+
+ u32b noise; /* Hack -- local "player stealth" value */
+
+ /* Hack -- calculate the "player noise" */
+ noise = (1L << (30 - p_ptr->skill_stl));
+
+ /* Process the monsters (backwards) */
+ for (i = mproc_max[MTIMED_CSLEEP] - 1; i >= 1; i--)
+ {
+ /* Access the monster */
+ m_idx = cur_mproc_list[i];
+ m_ptr = &m_list[m_idx];
+ r_ptr = &r_info[m_ptr->r_idx];
+
+ /* Assume does not wake up */
+ test = FALSE;
+
+ /* Hack -- Require proximity */
+ if (m_ptr->cdis < AAF_LIMIT)
+ {
+ /* Handle "sensing radius" */
+ if (m_ptr->cdis <= (is_pet(m_ptr) ? ((r_ptr->aaf > MAX_SIGHT) ? MAX_SIGHT : r_ptr->aaf) : r_ptr->aaf))
+ {
+ /* We may wake up */
+ test = TRUE;
+ }
+
+ /* Handle "sight" and "aggravation" */
+ else if ((m_ptr->cdis <= MAX_SIGHT) && (player_has_los_bold(m_ptr->fy, m_ptr->fx)))
+ {
+ /* We may wake up */
+ test = TRUE;
+ }
+ }
+
+ if (test)
+ {
+ u32b notice = randint0(1024);
+
+ /* Nightmare monsters are more alert */
+ if (ironman_nightmare) notice /= 2;
+
+ /* Hack -- See if monster "notices" player */
+ if ((notice * notice * notice) <= noise)
+ {
+ /* Hack -- amount of "waking" */
+ /* Wake up faster near the player */
+ int d = (m_ptr->cdis < AAF_LIMIT / 2) ? (AAF_LIMIT / m_ptr->cdis) : 1;
+
+ /* Hack -- amount of "waking" is affected by speed of player */
+ d = (d * SPEED_TO_ENERGY(p_ptr->pspeed)) / 10;
+ if (d < 0) d = 1;
+
+ /* Monster wakes up "a little bit" */
+
+ /* Still asleep */
+ if (!set_monster_csleep(m_idx, MON_CSLEEP(m_ptr) - d))
+ {
+ /* Notice the "not waking up" */
+ if (is_original_ap_and_seen(m_ptr))
+ {
+ /* Hack -- Count the ignores */
+ if (r_ptr->r_ignore < MAX_UCHAR) r_ptr->r_ignore++;
+ }
+ }
+
+ /* Just woke up */
+ else
+ {
+ /* Notice the "waking up" */
+ if (is_seen(m_ptr))
+ {
+ char m_name[80];
+
+ /* Acquire the monster name */
+ monster_desc(m_name, m_ptr, 0);
+
+ /* Dump a message */
+#ifdef JP
+ msg_format("%^s¤¬Ìܤò³Ð¤Þ¤·¤¿¡£", m_name);
+#else
+ msg_format("%^s wakes up.", m_name);
+#endif
+ }
+
+ if (is_original_ap_and_seen(m_ptr))
+ {
+ /* Hack -- Count the wakings */
+ if (r_ptr->r_wake < MAX_UCHAR) r_ptr->r_wake++;
+ }
+ }
+ }
+ }
+ }
+}
+
+
+/* Handle fast */
+void process_monsters_fast(void)
+{
+ int m_idx, i;
+ monster_type *m_ptr;
+ s16b *cur_mproc_list = mproc_list[MTIMED_FAST];
+
+ /* Process the monsters (backwards) */
+ for (i = mproc_max[MTIMED_FAST] - 1; i >= 1; i--)
+ {
+ /* Access the monster */
+ m_idx = cur_mproc_list[i];
+ m_ptr = &m_list[m_idx];
+
+ /* Reduce by one, note if expires */
+ if (set_monster_fast(m_idx, MON_FAST(m_ptr) - 1))
+ {
+ if (is_seen(m_ptr))
+ {
+ char m_name[80];
+
+ /* Acquire the monster name */
+ monster_desc(m_name, m_ptr, 0);
+
+ /* Dump a message */
+#ifdef JP
+ msg_format("%^s¤Ï¤â¤¦²Ã®¤µ¤ì¤Æ¤¤¤Ê¤¤¡£", m_name);
+#else
+ msg_format("%^s is no longer fast.", m_name);
+#endif
+ }
+ }
+ }
+}
+
+
+/* Handle slow */
+void process_monsters_slow(void)
+{
+ int m_idx, i;
+ monster_type *m_ptr;
+ s16b *cur_mproc_list = mproc_list[MTIMED_SLOW];
+
+ /* Process the monsters (backwards) */
+ for (i = mproc_max[MTIMED_SLOW] - 1; i >= 1; i--)
+ {
+ /* Access the monster */
+ m_idx = cur_mproc_list[i];
+ m_ptr = &m_list[m_idx];
+
+ /* Reduce by one, note if expires */
+ if (set_monster_slow(m_idx, MON_SLOW(m_ptr) - 1))
+ {
+ if (is_seen(m_ptr))
+ {
+ char m_name[80];
+
+ /* Acquire the monster name */
+ monster_desc(m_name, m_ptr, 0);
+
+ /* Dump a message */
+#ifdef JP
+ msg_format("%^s¤Ï¤â¤¦¸ºÂ®¤µ¤ì¤Æ¤¤¤Ê¤¤¡£", m_name);
+#else
+ msg_format("%^s is no longer slow.", m_name);
+#endif
+ }
+ }
+ }
+}
+
+
+/* Handle "stun" */
+void process_monsters_stunned(void)
+{
+ int m_idx, i, rlev;
+ monster_type *m_ptr;
+ s16b *cur_mproc_list = mproc_list[MTIMED_STUNNED];
+
+ /* Process the monsters (backwards) */
+ for (i = mproc_max[MTIMED_STUNNED] - 1; i >= 1; i--)
+ {
+ /* Access the monster */
+ m_idx = cur_mproc_list[i];
+ m_ptr = &m_list[m_idx];
+ rlev = r_info[m_ptr->r_idx].level;
+
+ /* Hack -- Recover from stun */
+
+ /* Fully recover */
+ if (set_monster_stunned(m_idx, (randint0(10000) <= rlev * rlev) ? 0 : (MON_STUNNED(m_ptr) - 1)))
+ {
+ /* Message if visible */
+ if (is_seen(m_ptr))
+ {
+ char m_name[80];
+
+ /* Acquire the monster name */
+ monster_desc(m_name, m_ptr, 0);
+
+ /* Dump a message */
+#ifdef JP
+ msg_format("%^s¤ÏÛ¯Û°¾õÂÖ¤«¤éΩ¤Áľ¤Ã¤¿¡£", m_name);
+#else
+ msg_format("%^s is no longer stunned.", m_name);
+#endif
+ }
+ }
+ }
+}
+
+
+/* Handle confusion */
+void process_monsters_confused(void)
+{
+ int m_idx, i;
+ monster_type *m_ptr;
+ s16b *cur_mproc_list = mproc_list[MTIMED_CONFUSED];
+
+ /* Process the monsters (backwards) */
+ for (i = mproc_max[MTIMED_CONFUSED] - 1; i >= 1; i--)
+ {
+ /* Access the monster */
+ m_idx = cur_mproc_list[i];
+ m_ptr = &m_list[m_idx];
+
+ /* Reduce the confusion */
+
+ /* Recovered */
+ if (set_monster_confused(m_idx, MON_CONFUSED(m_ptr) - randint1(r_info[m_ptr->r_idx].level / 20 + 1)))
+ {
+ /* Message if visible */
+ if (is_seen(m_ptr))
+ {
+ char m_name[80];
+
+ /* Acquire the monster name */
+ monster_desc(m_name, m_ptr, 0);
+
+ /* Dump a message */
+#ifdef JP
+ msg_format("%^s¤Ïº®Í𤫤éΩ¤Áľ¤Ã¤¿¡£", m_name);
+#else
+ msg_format("%^s is no longer confused.", m_name);
+#endif
+ }
+ }
+ }
+}
+
+
+/* Handle "fear" */
+void process_monsters_monfear(void)
+{
+ int m_idx, i;
+ monster_type *m_ptr;
+ s16b *cur_mproc_list = mproc_list[MTIMED_MONFEAR];
+
+ /* Process the monsters (backwards) */
+ for (i = mproc_max[MTIMED_MONFEAR] - 1; i >= 1; i--)
+ {
+ /* Access the monster */
+ m_idx = cur_mproc_list[i];
+ m_ptr = &m_list[m_idx];
+
+ /* Reduce the fear */
+
+ /* Recover from fear, take note if seen */
+ if (set_monster_monfear(m_idx, MON_MONFEAR(m_ptr) - randint1(r_info[m_ptr->r_idx].level / 20 + 1)))
+ {
+ /* Visual note */
+ if (is_seen(m_ptr))
+ {
+ char m_name[80];
+#ifndef JP
+ char m_poss[80];
+
+ /* Acquire the monster possessive */
+ monster_desc(m_poss, m_ptr, MD_PRON_VISIBLE | MD_POSSESSIVE);
+#endif
+
+ /* Acquire the monster name */
+ monster_desc(m_name, m_ptr, 0);
+
+ /* Dump a message */
+#ifdef JP
+ msg_format("%^s¤Ïͦµ¤¤ò¼è¤êÌᤷ¤¿¡£", m_name);
+#else
+ msg_format("%^s recovers %s courage.", m_name, m_poss);
+#endif
+ }
+ }
+ }
+}
+
+
+/* Handle Invulnerability */
+void process_monsters_invulner(void)
+{
+ int m_idx, i;
+ monster_type *m_ptr;
+ s16b *cur_mproc_list = mproc_list[MTIMED_INVULNER];
+
+ /* Process the monsters (backwards) */
+ for (i = mproc_max[MTIMED_INVULNER] - 1; i >= 1; i--)
+ {
+ /* Access the monster */
+ m_idx = cur_mproc_list[i];
+ m_ptr = &m_list[m_idx];
+
+ /* Reduce by one, note if expires */
+ if (set_monster_invulner(m_idx, MON_INVULNER(m_ptr) - 1, TRUE))
+ {
+ if (is_seen(m_ptr))
+ {
+ char m_name[80];
+
+ /* Acquire the monster name */
+ monster_desc(m_name, m_ptr, 0);
+
+ /* Dump a message */
+#ifdef JP
+ msg_format("%^s¤Ï¤â¤¦ÌµÅ¨¤Ç¤Ê¤¤¡£", m_name);
+#else
+ msg_format("%^s is no longer invulnerable.", m_name);
+#endif
+ }
+ }
+ }
+}
+
+
+void dispel_monster_status(int m_idx)
+{
+ monster_type *m_ptr = &m_list[m_idx];
+ char m_name[80];
+
+ monster_desc(m_name, m_ptr, 0);
+ if (set_monster_invulner(m_idx, 0, TRUE))
+ {
+#ifdef JP
+ if (m_ptr->ml) msg_format("%s¤Ï¤â¤¦ÌµÅ¨¤Ç¤Ï¤Ê¤¤¡£", m_name);
+#else
+ if (m_ptr->ml) msg_format("%^s is no longer invulnerable.", m_name);
+#endif
+ }
+ if (set_monster_fast(m_idx, 0))
+ {
+#ifdef JP
+ if (m_ptr->ml) msg_format("%s¤Ï¤â¤¦²Ã®¤µ¤ì¤Æ¤¤¤Ê¤¤¡£", m_name);
+#else
+ if (m_ptr->ml) msg_format("%^s is no longer fast.", m_name);
+#endif
+ }
+ if (set_monster_slow(m_idx, 0))
+ {
+#ifdef JP
+ if (m_ptr->ml) msg_format("%s¤Ï¤â¤¦¸ºÂ®¤µ¤ì¤Æ¤¤¤Ê¤¤¡£", m_name);
+#else
+ if (m_ptr->ml) msg_format("%^s is no longer slow.", m_name);
+#endif
+ }
+}
+
bool process_the_world(int num, int who, bool vs_player)
{
break;
case 9:
{
- monster_type *m_ptr;
int m_idx;
- char m_name[80];
if (!target_set(TARGET_KILL)) return FALSE;
m_idx = cave[target_row][target_col].m_idx;
if (!m_idx) break;
if (!player_has_los_bold(target_row, target_col)) break;
if (!projectable(py, px, target_row, target_col)) break;
- m_ptr = &m_list[m_idx];
- monster_desc(m_name, m_ptr, 0);
- if (m_ptr->invulner)
- {
- m_ptr->invulner = 0;
- mproc_remove(m_idx, m_ptr->mproc_idx[MPROC_INVULNER], MPROC_INVULNER);
- if (m_ptr->ml)
- {
-#ifdef JP
- msg_format("%s¤Ï¤â¤¦ÌµÅ¨¤Ç¤Ï¤Ê¤¤¡£", m_name);
-#else
- msg_format("%^s is no longer invulnerable.", m_name);
-#endif
- p_ptr->redraw |= (PR_HEALTH);
- if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);
- }
- m_ptr->energy_need += ENERGY_NEED();
- }
- if (m_ptr->fast)
- {
- m_ptr->fast = 0;
- mproc_remove(m_idx, m_ptr->mproc_idx[MPROC_FAST], MPROC_FAST);
-#ifdef JP
- if (m_ptr->ml) msg_format("%s¤Ï¤â¤¦²Ã®¤µ¤ì¤Æ¤¤¤Ê¤¤¡£", m_name);
-#else
- if (m_ptr->ml) msg_format("%^s is no longer fast.", m_name);
-#endif
- }
- if (m_ptr->slow)
- {
- m_ptr->slow = 0;
- mproc_remove(m_idx, m_ptr->mproc_idx[MPROC_SLOW], MPROC_SLOW);
-#ifdef JP
- if (m_ptr->ml) msg_format("%s¤Ï¤â¤¦¸ºÂ®¤µ¤ì¤Æ¤¤¤Ê¤¤¡£", m_name);
-#else
- if (m_ptr->ml) msg_format("%^s is no longer slow.", m_name);
-#endif
- }
+ dispel_monster_status(m_idx);
break;
}
case 10:
m_ptr->fy = ty;
m_ptr->fx = tx;
- if (m_ptr->csleep)
- {
- /* Wake the monster up */
- m_ptr->csleep = 0;
- mproc_remove(m_idx, m_ptr->mproc_idx[MPROC_CSLEEP], MPROC_CSLEEP);
- }
+ /* Wake the monster up */
+ (void)set_monster_csleep(m_idx, 0);
/* Update the monster (new location) */
update_mon(m_idx, TRUE);
}
-void mproc_add(int m_idx, int mproc_type)
-{
- m_list[m_idx].mproc_idx[mproc_type] = mproc_max[mproc_type];
- mproc_list[mproc_type][mproc_max[mproc_type]++] = m_idx;
-}
-
-
-void mproc_remove(int m_idx, int mproc_idx, int mproc_type)
-{
- m_list[m_idx].mproc_idx[mproc_type] = 0;
- mproc_list[mproc_type][mproc_idx] = mproc_list[mproc_type][--mproc_max[mproc_type]];
-}
-
-
/*
* Delete a monster by index.
*
/* Hack -- count the number of "reproducers" */
if (r_ptr->flags2 & (RF2_MULTIPLY)) num_repro--;
- for (cmi = 0; cmi < MAX_MPROC; cmi++)
- if (m_ptr->mproc_idx[cmi]) mproc_remove(i, m_ptr->mproc_idx[cmi], cmi);
+ for (cmi = 0; cmi < MAX_MTIMED; cmi++)
+ if (m_ptr->mproc_idx[cmi]) mproc_remove(i, cmi);
/* Hack -- remove target monster */
/* New monster */
m_ptr = &m_list[i2];
- for (i = 0; i < MAX_MPROC; i++)
+ for (i = 0; i < MAX_MTIMED; i++)
{
if (m_ptr->mproc_idx[i]) mproc_list[i][m_ptr->mproc_idx[i]] = i2;
}
m_cnt = 0;
/* Reset "mproc_max[]" */
- for (i = 0; i < MAX_MPROC; i++) mproc_max[i] = 1;
+ for (i = 0; i < MAX_MTIMED; i++) mproc_max[i] = 1;
/* Hack -- reset "reproducer" count */
num_repro = 0;
m_ptr->fx = x;
- /* No "damage" yet */
- m_ptr->stunned = 0;
- m_ptr->confused = 0;
- m_ptr->monfear = 0;
-
- for (cmi = 0; cmi < MAX_MPROC; cmi++) m_ptr->mproc_idx[cmi] = 0;
+ /* No "timed status" yet */
+ for (cmi = 0; cmi < MAX_MTIMED; cmi++)
+ {
+ m_ptr->mtimed[cmi] = 0;
+ m_ptr->mproc_idx[cmi] = 0;
+ }
/* Unknown distance */
m_ptr->cdis = 0;
}
/* Assume no sleeping */
- m_ptr->csleep = 0;
+ m_ptr->mtimed[MTIMED_CSLEEP] = 0;
/* Enforce sleeping if needed */
if ((mode & PM_ALLOW_SLEEP) && r_ptr->sleep && !ironman_nightmare)
{
int val = r_ptr->sleep;
- m_ptr->csleep = ((val * 2) + randint1(val * 10));
- mproc_add(c_ptr->m_idx, MPROC_CSLEEP);
+ (void)set_monster_csleep(c_ptr->m_idx, (val * 2) + randint1(val * 10));
}
/* Assign maximal hitpoints */
/* Extract the monster base speed */
m_ptr->mspeed = get_mspeed(r_ptr);
- if (mode & PM_HASTE)
- {
- m_ptr->fast = 100;
- mproc_add(c_ptr->m_idx, MPROC_FAST);
- }
+ if (mode & PM_HASTE) (void)set_monster_fast(c_ptr->m_idx, 100);
/* Give a random starting energy */
if (!ironman_nightmare)
if (r_ptr->flags7 & RF7_SELF_LD_MASK)
p_ptr->update |= (PU_MON_LITE);
- else if ((r_ptr->flags7 & RF7_HAS_LD_MASK) && !m_ptr->csleep)
+ else if ((r_ptr->flags7 & RF7_HAS_LD_MASK) && !MON_CSLEEP(m_ptr))
p_ptr->update |= (PU_MON_LITE);
/* Update the monster */
if (p_ptr->riding && (m_list[p_ptr->riding].mspeed < 135))
{
- if (m_list[p_ptr->riding].fast) return (TRUE);
+ if (MON_FAST(&m_list[p_ptr->riding])) return (TRUE);
}
/* No need to cast dispel spell */
}
/* Hurt badly or afraid, attempt to flee */
- if (((m_ptr->hp < m_ptr->maxhp / 3) || m_ptr->monfear) && one_in_(2))
+ if (((m_ptr->hp < m_ptr->maxhp / 3) || MON_MONFEAR(m_ptr)) && one_in_(2))
{
/* Choose escape spell if possible */
if (escape_num) return (escape[randint0(escape_num)]);
}
/* Cast globe of invulnerability if not already in effect */
- if (invul_num && !(m_ptr->invulner) && (randint0(100) < 50))
+ if (invul_num && !m_ptr->mtimed[MTIMED_INVULNER] && (randint0(100) < 50))
{
/* Choose Globe of Invulnerability */
return (invul[randint0(invul_num)]);
}
/* Haste self if we aren't already somewhat hasted (rarely) */
- if (haste_num && (randint0(100) < 20) && !(m_ptr->fast))
+ if (haste_num && (randint0(100) < 20) && !MON_FAST(m_ptr))
{
/* Choose haste spell */
return (haste[randint0(haste_num)]);
bool can_remember;
/* Cannot cast spells when confused */
- if (m_ptr->confused)
+ if (MON_CONFUSED(m_ptr))
{
reset_target(m_ptr);
return (FALSE);
/* Check for spell failure (inate attacks never fail) */
if (!spell_is_inate(thrown_spell)
- && (in_no_magic_dungeon || (m_ptr->stunned && one_in_(2)) || (randint0(100) < failrate)))
+ && (in_no_magic_dungeon || (MON_STUNNED(m_ptr) && one_in_(2)) || (randint0(100) < failrate)))
{
disturb(1, 0);
/* Message */
p_ptr->energy_need += ENERGY_NEED();
}
- if (p_ptr->riding)
- {
- monster_type *riding_ptr = &m_list[p_ptr->riding];
-
- if (riding_ptr->invulner)
- {
- riding_ptr->invulner = 0;
- mproc_remove(p_ptr->riding, riding_ptr->mproc_idx[MPROC_INVULNER], MPROC_INVULNER);
- riding_ptr->energy_need += ENERGY_NEED();
- }
- if (riding_ptr->fast)
- {
- riding_ptr->fast = 0;
- mproc_remove(p_ptr->riding, riding_ptr->mproc_idx[MPROC_FAST], MPROC_FAST);
- }
- if (riding_ptr->slow)
- {
- riding_ptr->slow = 0;
- mproc_remove(p_ptr->riding, riding_ptr->mproc_idx[MPROC_SLOW], MPROC_SLOW);
- }
- p_ptr->update |= PU_BONUS;
- if (p_ptr->health_who == p_ptr->riding) p_ptr->redraw |= PR_HEALTH;
- p_ptr->redraw |= (PR_UHEALTH);
- }
+ if (p_ptr->riding) dispel_monster_status(p_ptr->riding);
#ifdef JP
if ((p_ptr->pseikaku == SEIKAKU_COMBAT) || (inventory[INVEN_BOW].name1 == ART_CRIMSON))
}
/* Allow quick speed increases to base+10 */
- if (!m_ptr->fast)
+ if (set_monster_fast(m_idx, MON_FAST(m_ptr) + 100))
{
#ifdef JP
-msg_format("%^s¤ÎÆ°¤¤¬Â®¤¯¤Ê¤Ã¤¿¡£", m_name);
+ msg_format("%^s¤ÎÆ°¤¤¬Â®¤¯¤Ê¤Ã¤¿¡£", m_name);
#else
msg_format("%^s starts moving faster.", m_name);
#endif
- mproc_add(m_idx, MPROC_FAST);
}
- m_ptr->fast = MIN(200, m_ptr->fast + 100);
- if (p_ptr->riding == m_idx) p_ptr->update |= PU_BONUS;
break;
}
if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);
/* Cancel fear */
- if (m_ptr->monfear)
+ if (MON_MONFEAR(m_ptr))
{
/* Cancel fear */
- m_ptr->monfear = 0;
- mproc_remove(m_idx, m_ptr->mproc_idx[MPROC_MONFEAR], MPROC_MONFEAR);
+ (void)set_monster_monfear(m_idx, 0);
/* Message */
#ifdef JP
-msg_format("%^s¤Ïͦµ¤¤ò¼è¤êÌᤷ¤¿¡£", m_name);
+ msg_format("%^s¤Ïͦµ¤¤ò¼è¤êÌᤷ¤¿¡£", m_name);
#else
msg_format("%^s recovers %s courage.", m_name, m_poss);
#endif
-
}
break;
}
}
- if (!m_ptr->invulner)
- {
- m_ptr->invulner = randint1(4) + 4;
- mproc_add(m_idx, MPROC_INVULNER);
- }
-
- if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);
- if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);
+ if (!MON_INVULNER(m_ptr)) (void)set_monster_invulner(m_idx, randint1(4) + 4, FALSE);
break;
}
if (!pet) u_mode |= PM_ALLOW_UNIQUE;
/* Cannot cast spells when confused */
- if (m_ptr->confused) return (FALSE);
+ if (MON_CONFUSED(m_ptr)) return (FALSE);
/* Extract the racial spell flags */
f4 = r_ptr->flags4;
if (p_ptr->riding && (m_idx == p_ptr->riding)) disturb(1, 0);
/* Check for spell failure (inate attacks never fail) */
- if (!spell_is_inate(thrown_spell) && (in_no_magic_dungeon || (m_ptr->stunned && one_in_(2))))
+ if (!spell_is_inate(thrown_spell) && (in_no_magic_dungeon || (MON_STUNNED(m_ptr) && one_in_(2))))
{
disturb(1, 0);
/* Message */
}
else
{
- int tmp = t_ptr->monfear + randint0(4) + 4;
-
- if (!t_ptr->monfear)
- {
- fear = TRUE;
- mproc_add(t_idx, MPROC_MONFEAR);
- }
-
- t_ptr->monfear = (tmp < 200) ? tmp : 200;
+ if (set_monster_monfear(t_idx, MON_MONFEAR(t_ptr) + randint0(4) + 4)) fear = TRUE;
}
wake_up = TRUE;
}
else
{
- int tmp = t_ptr->confused + 12 + randint0(4);
-
#ifdef JP
if (see_t) msg_format("%^s¤ÏÌܤ¬¸«¤¨¤Ê¤¯¤Ê¤Ã¤¿¡ª ", t_name);
#else
if (see_t) msg_format("%^s is blinded!", t_name);
#endif
- t_ptr->confused = (tmp < 200) ? tmp : 200;
- if (!t_ptr->mproc_idx[MPROC_CONFUSED]) mproc_add(t_idx, MPROC_CONFUSED);
+ (void)set_monster_confused(t_idx, MON_CONFUSED(t_ptr) + 12 + randint0(4));
}
wake_up = TRUE;
}
else
{
- int tmp = t_ptr->confused + 12 + randint0(4);
-
#ifdef JP
if (see_t) msg_format("%^s¤Ïº®Í𤷤¿¤è¤¦¤À¡£", t_name);
#else
if (see_t) msg_format("%^s seems confused.", t_name);
#endif
- t_ptr->confused = (tmp < 200) ? tmp : 200;
- if (!t_ptr->mproc_idx[MPROC_CONFUSED]) mproc_add(t_idx, MPROC_CONFUSED);
+ (void)set_monster_confused(t_idx, MON_CONFUSED(t_ptr) + 12 + randint0(4));
}
wake_up = TRUE;
}
else
{
- if (!t_ptr->slow)
+ if (set_monster_slow(t_idx, MON_SLOW(t_ptr) + 50))
{
#ifdef JP
if (see_t) msg_format("%s¤ÎÆ°¤¤¬ÃÙ¤¯¤Ê¤Ã¤¿¡£", t_name);
#else
if (see_t) msg_format("%^s starts moving slower.", t_name);
#endif
- mproc_add(t_idx, MPROC_SLOW);
}
-
- t_ptr->slow = MIN(200, t_ptr->slow + 50);
- if (p_ptr->riding == t_idx) p_ptr->update |= PU_BONUS;
}
wake_up = TRUE;
}
else
{
- int tmp = t_ptr->stunned + randint1(4) + 4;
-
#ifdef JP
if (see_t) msg_format("%^s¤ÏËãá㤷¤¿¡ª", t_name);
#else
if (see_t) msg_format("%^s is paralyzed!", t_name);
#endif
- t_ptr->stunned = (tmp < 200) ? tmp : 200;
- if (!t_ptr->mproc_idx[MPROC_STUNNED]) mproc_add(t_idx, MPROC_STUNNED);
+ (void)set_monster_stunned(t_idx, MON_STUNNED(t_ptr) + randint1(4) + 4);
}
wake_up = TRUE;
}
/* Allow quick speed increases to base+10 */
- if (!m_ptr->fast)
+ if (set_monster_fast(m_idx, MON_FAST(m_ptr) + 100))
{
#ifdef JP
if (see_m) msg_format("%^s¤ÎÆ°¤¤¬Â®¤¯¤Ê¤Ã¤¿¡£", m_name);
#else
if (see_m) msg_format("%^s starts moving faster.", m_name);
#endif
- mproc_add(m_idx, MPROC_FAST);
}
- m_ptr->fast = MIN(200, m_ptr->fast + 100);
- if (p_ptr->riding == m_idx) p_ptr->update |= PU_BONUS;
break;
/* RF6_HAND_DOOM */
#else
msg_format("%^s looks healthier.", m_name);
#endif
-
}
else
{
if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);
/* Cancel fear */
- if (m_ptr->monfear)
+ if (MON_MONFEAR(m_ptr))
{
/* Cancel fear */
- m_ptr->monfear = 0;
- mproc_remove(m_idx, m_ptr->mproc_idx[MPROC_MONFEAR], MPROC_MONFEAR);
+ (void)set_monster_monfear(m_idx, 0);
/* Message */
#ifdef JP
#else
if (see_m) msg_format("%^s recovers %s courage.", m_name, m_poss);
#endif
-
}
break;
#else
msg_format("%^s casts a Globe of Invulnerability.", m_name);
#endif
-
}
else
{
}
}
- if (!m_ptr->invulner)
- {
- m_ptr->invulner = randint1(4) + 4;
- mproc_add(m_idx, MPROC_INVULNER);
- }
-
- if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);
- if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);
+ if (!MON_INVULNER(m_ptr)) (void)set_monster_invulner(m_idx, randint1(4) + 4, FALSE);
break;
/* RF6_BLINK */
break;
}
- if (wake_up && t_ptr->csleep)
- {
- t_ptr->csleep = 0;
- mproc_remove(t_idx, t_ptr->mproc_idx[MPROC_CSLEEP], MPROC_CSLEEP);
- if (tr_ptr->flags7 & RF7_HAS_LD_MASK) p_ptr->update |= (PU_MON_LITE);
- if (t_ptr->ml)
- {
- /* Redraw the health bar */
- if (p_ptr->health_who == t_idx) p_ptr->redraw |= (PR_HEALTH);
- if (p_ptr->riding == t_idx) p_ptr->redraw |= (PR_UHEALTH);
- }
- }
+ if (wake_up) (void)set_monster_csleep(t_idx, 0);
if (fear && see_t)
{
#else
msg_format("%^s flees in terror!", t_name);
#endif
-
}
if (m_ptr->ml && maneable && !world_monster && !p_ptr->blind && (p_ptr->pclass == CLASS_IMITATOR))
break;
case MS_DISPEL:
{
- monster_type *m_ptr;
int m_idx;
- char m_name[80];
if (!target_set(TARGET_KILL)) return FALSE;
m_idx = cave[target_row][target_col].m_idx;
if (!m_idx) break;
if (!player_has_los_bold(target_row, target_col)) break;
if (!projectable(py, px, target_row, target_col)) break;
- m_ptr = &m_list[m_idx];
- monster_desc(m_name, m_ptr, 0);
- if (m_ptr->invulner)
- {
- m_ptr->invulner = 0;
- mproc_remove(m_idx, m_ptr->mproc_idx[MPROC_INVULNER], MPROC_INVULNER);
- if (m_ptr->ml)
- {
-#ifdef JP
- msg_format("%s¤Ï¤â¤¦ÌµÅ¨¤Ç¤Ï¤Ê¤¤¡£", m_name);
-#else
- msg_format("%^s is no longer invulnerable.", m_name);
-#endif
- p_ptr->redraw |= (PR_HEALTH);
- if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);
- }
- m_ptr->energy_need += ENERGY_NEED();
- }
- if (m_ptr->fast)
- {
- m_ptr->fast = 0;
- mproc_remove(m_idx, m_ptr->mproc_idx[MPROC_FAST], MPROC_FAST);
-#ifdef JP
- if (m_ptr->ml) msg_format("%s¤Ï¤â¤¦²Ã®¤µ¤ì¤Æ¤¤¤Ê¤¤¡£", m_name);
-#else
- if (m_ptr->ml) msg_format("%^s is no longer fast.", m_name);
-#endif
- }
- if (m_ptr->slow)
- {
- m_ptr->slow = 0;
- mproc_remove(m_idx, m_ptr->mproc_idx[MPROC_SLOW], MPROC_SLOW);
-#ifdef JP
- if (m_ptr->ml) msg_format("%s¤Ï¤â¤¦¸ºÂ®¤µ¤ì¤Æ¤¤¤Ê¤¤¡£", m_name);
-#else
- if (m_ptr->ml) msg_format("%^s is no longer slow.", m_name);
-#endif
- }
+ dispel_monster_status(m_idx);
break;
}
case MS_ROCKET:
m_ptr = &m_list[c_ptr->m_idx];
- if (m_ptr->csleep) continue;
+ if (MON_CSLEEP(m_ptr)) continue;
if (!is_hostile(m_ptr)) continue;
r_ptr = &r_info[m_ptr->r_idx];
static void wr_monster(monster_type *m_ptr)
{
u32b flags = 0x00000000;
+ byte tmp8u;
if (m_ptr->ap_r_idx != m_ptr->r_idx) flags |= SAVE_MON_AP_R_IDX;
if (m_ptr->sub_align) flags |= SAVE_MON_SUB_ALIGN;
- if (m_ptr->csleep) flags |= SAVE_MON_CSLEEP;
- if (m_ptr->fast) flags |= SAVE_MON_FAST;
- if (m_ptr->slow) flags |= SAVE_MON_SLOW;
- if (m_ptr->stunned) flags |= SAVE_MON_STUNNED;
- if (m_ptr->confused) flags |= SAVE_MON_CONFUSED;
- if (m_ptr->monfear) flags |= SAVE_MON_MONFEAR;
+ if (MON_CSLEEP(m_ptr)) flags |= SAVE_MON_CSLEEP;
+ if (MON_FAST(m_ptr)) flags |= SAVE_MON_FAST;
+ if (MON_SLOW(m_ptr)) flags |= SAVE_MON_SLOW;
+ if (MON_STUNNED(m_ptr)) flags |= SAVE_MON_STUNNED;
+ if (MON_CONFUSED(m_ptr)) flags |= SAVE_MON_CONFUSED;
+ if (MON_MONFEAR(m_ptr)) flags |= SAVE_MON_MONFEAR;
if (m_ptr->target_y) flags |= SAVE_MON_TARGET_Y;
if (m_ptr->target_x) flags |= SAVE_MON_TARGET_X;
- if (m_ptr->invulner) flags |= SAVE_MON_INVULNER;
+ if (MON_INVULNER(m_ptr)) flags |= SAVE_MON_INVULNER;
if (m_ptr->smart) flags |= SAVE_MON_SMART;
if (m_ptr->exp) flags |= SAVE_MON_EXP;
if (m_ptr->mflag2) flags |= SAVE_MON_MFLAG2;
if (flags & SAVE_MON_AP_R_IDX) wr_s16b(m_ptr->ap_r_idx);
if (flags & SAVE_MON_SUB_ALIGN) wr_byte(m_ptr->sub_align);
- if (flags & SAVE_MON_CSLEEP) wr_s16b(m_ptr->csleep);
+ if (flags & SAVE_MON_CSLEEP) wr_s16b(m_ptr->mtimed[MTIMED_CSLEEP]);
wr_byte(m_ptr->mspeed);
wr_s16b(m_ptr->energy_need);
- if (flags & SAVE_MON_FAST) wr_byte(m_ptr->fast);
- if (flags & SAVE_MON_SLOW) wr_byte(m_ptr->slow);
- if (flags & SAVE_MON_STUNNED) wr_byte(m_ptr->stunned);
- if (flags & SAVE_MON_CONFUSED) wr_byte(m_ptr->confused);
- if (flags & SAVE_MON_MONFEAR) wr_byte(m_ptr->monfear);
+ if (flags & SAVE_MON_FAST)
+ {
+ tmp8u = (byte)m_ptr->mtimed[MTIMED_FAST];
+ wr_byte(tmp8u);
+ }
+ if (flags & SAVE_MON_SLOW)
+ {
+ tmp8u = (byte)m_ptr->mtimed[MTIMED_SLOW];
+ wr_byte(tmp8u);
+ }
+ if (flags & SAVE_MON_STUNNED)
+ {
+ tmp8u = (byte)m_ptr->mtimed[MTIMED_STUNNED];
+ wr_byte(tmp8u);
+ }
+ if (flags & SAVE_MON_CONFUSED)
+ {
+ tmp8u = (byte)m_ptr->mtimed[MTIMED_CONFUSED];
+ wr_byte(tmp8u);
+ }
+ if (flags & SAVE_MON_MONFEAR)
+ {
+ tmp8u = (byte)m_ptr->mtimed[MTIMED_MONFEAR];
+ wr_byte(tmp8u);
+ }
if (flags & SAVE_MON_TARGET_Y) wr_s16b(m_ptr->target_y);
if (flags & SAVE_MON_TARGET_X) wr_s16b(m_ptr->target_x);
- if (flags & SAVE_MON_INVULNER) wr_byte(m_ptr->invulner);
+ if (flags & SAVE_MON_INVULNER)
+ {
+ tmp8u = (byte)m_ptr->mtimed[MTIMED_INVULNER];
+ wr_byte(tmp8u);
+ }
if (flags & SAVE_MON_SMART) wr_u32b(m_ptr->smart);
if (flags & SAVE_MON_EXP) wr_u32b(m_ptr->exp);
if (flags & SAVE_MON_MFLAG2) wr_byte(m_ptr->mflag2);
/*** Meta info ***/
- /* Number of floor_id used from birth */
+ /* Number of floor_id used from birth */
wr_s16b(max_floor_id);
/* Current dungeon type */
bool seen = m_ptr->ml;
bool seen_msg = is_seen(m_ptr);
- bool slept = (bool)(m_ptr->csleep > 0);
+ bool slept = (bool)MON_CSLEEP(m_ptr);
/* Were the effects "obvious" (if seen)? */
bool obvious = FALSE;
/* Normal monsters slow down */
else
{
- if (!m_ptr->slow)
+ if (set_monster_slow(c_ptr->m_idx, MON_SLOW(m_ptr) + 50))
{
#ifdef JP
note = "¤ÎÆ°¤¤¬ÃÙ¤¯¤Ê¤Ã¤¿¡£";
#else
note = " starts moving slower.";
#endif
- mproc_add(c_ptr->m_idx, MPROC_SLOW);
}
- m_ptr->slow = MIN(200, m_ptr->slow + 50);
- if (c_ptr->m_idx == p_ptr->riding)
- p_ptr->update |= (PU_BONUS);
}
}
break;
/* Normal monsters slow down */
else
{
- if (!m_ptr->slow)
+ if (set_monster_slow(c_ptr->m_idx, MON_SLOW(m_ptr) + 50))
{
#ifdef JP
note = "¤ÎÆ°¤¤¬ÃÙ¤¯¤Ê¤Ã¤¿¡£";
#else
note = " starts moving slower.";
#endif
- mproc_add(c_ptr->m_idx, MPROC_SLOW);
}
- m_ptr->slow = MIN(200, m_ptr->slow + 50);
- if (c_ptr->m_idx == p_ptr->riding)
- p_ptr->update |= (PU_BONUS);
}
/* 2. stun */
{
if (seen) obvious = TRUE;
- if (m_ptr->csleep)
- {
- /* Wake up */
- m_ptr->csleep = 0;
- mproc_remove(c_ptr->m_idx, m_ptr->mproc_idx[MPROC_CSLEEP], MPROC_CSLEEP);
- if (r_ptr->flags7 & RF7_HAS_LD_MASK) p_ptr->update |= (PU_MON_LITE);
- }
+ /* Wake up */
+ (void)set_monster_csleep(c_ptr->m_idx, 0);
if (m_ptr->maxhp < m_ptr->max_maxhp)
{
{
if (seen) obvious = TRUE;
- if (m_ptr->csleep)
- {
- /* Wake up */
- m_ptr->csleep = 0;
- mproc_remove(c_ptr->m_idx, m_ptr->mproc_idx[MPROC_CSLEEP], MPROC_CSLEEP);
- if (r_ptr->flags7 & RF7_HAS_LD_MASK) p_ptr->update |= (PU_MON_LITE);
- }
- if (m_ptr->stunned)
+ /* Wake up */
+ (void)set_monster_csleep(c_ptr->m_idx, 0);
+ if (MON_STUNNED(m_ptr))
{
#ifdef JP
if (seen_msg) msg_format("%^s¤ÏÛ¯Û°¾õÂÖ¤«¤éΩ¤Áľ¤Ã¤¿¡£", m_name);
#else
if (seen_msg) msg_format("%^s is no longer stunned.", m_name);
#endif
- m_ptr->stunned = 0;
- mproc_remove(c_ptr->m_idx, m_ptr->mproc_idx[MPROC_STUNNED], MPROC_STUNNED);
+ (void)set_monster_stunned(c_ptr->m_idx, 0);
}
- if (m_ptr->confused)
+ if (MON_CONFUSED(m_ptr))
{
#ifdef JP
if (seen_msg) msg_format("%^s¤Ïº®Í𤫤éΩ¤Áľ¤Ã¤¿¡£", m_name);
#else
if (seen_msg) msg_format("%^s is no longer confused.", m_name);
#endif
- m_ptr->confused = 0;
- mproc_remove(c_ptr->m_idx, m_ptr->mproc_idx[MPROC_CONFUSED], MPROC_CONFUSED);
+ (void)set_monster_confused(c_ptr->m_idx, 0);
}
- if (m_ptr->monfear)
+ if (MON_MONFEAR(m_ptr))
{
#ifdef JP
if (seen_msg) msg_format("%^s¤Ïͦµ¤¤ò¼è¤êÌᤷ¤¿¡£", m_name);
#else
if (seen_msg) msg_format("%^s recovers %s courage.", m_name, m_poss);
#endif
- m_ptr->monfear = 0;
- mproc_remove(c_ptr->m_idx, m_ptr->mproc_idx[MPROC_MONFEAR], MPROC_MONFEAR);
+ (void)set_monster_monfear(c_ptr->m_idx, 0);
}
/* Heal */
if (seen) obvious = TRUE;
/* Speed up */
- if (!m_ptr->fast)
+ if (set_monster_fast(c_ptr->m_idx, MON_FAST(m_ptr) + 100))
{
#ifdef JP
note = "¤ÎÆ°¤¤¬Â®¤¯¤Ê¤Ã¤¿¡£";
#else
note = " starts moving faster.";
#endif
- mproc_add(c_ptr->m_idx, MPROC_FAST);
}
- m_ptr->fast = MIN(200, m_ptr->fast + 100);
-
- if (c_ptr->m_idx == p_ptr->riding)
- p_ptr->update |= (PU_BONUS);
if (!who)
{
/* Normal monsters slow down */
else
{
- if (!m_ptr->slow)
+ if (set_monster_slow(c_ptr->m_idx, MON_SLOW(m_ptr) + 50))
{
#ifdef JP
note = "¤ÎÆ°¤¤¬ÃÙ¤¯¤Ê¤Ã¤¿¡£";
#else
note = " starts moving slower.";
#endif
- mproc_add(c_ptr->m_idx, MPROC_SLOW);
}
- m_ptr->slow = MIN(200, m_ptr->slow + 50);
-
- if (c_ptr->m_idx == p_ptr->riding)
- p_ptr->update |= (PU_BONUS);
}
/* No "real" damage */
do_conf = randint0(8) + 8;
do_stun = randint0(8) + 8;
}
- m_ptr->slow = MIN(200, m_ptr->slow + 10);
- if (!m_ptr->mproc_idx[MPROC_SLOW]) mproc_add(c_ptr->m_idx, MPROC_SLOW);
- if (c_ptr->m_idx == p_ptr->riding)
- p_ptr->update |= (PU_BONUS);
+ (void)set_monster_slow(c_ptr->m_idx, MON_SLOW(m_ptr) + 10);
}
break;
}
if (r_ptr->flags2 & RF2_EMPTY_MIND)
{
#ifdef JP
-note = "¤Ë¤Ï¸ú²Ì¤¬¤Ê¤«¤Ã¤¿¡ª";
+ note = "¤Ë¤Ï¸ú²Ì¤¬¤Ê¤«¤Ã¤¿¡ª";
#else
note = " is immune!";
#endif
if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags2 |= (RF2_EMPTY_MIND);
break;
}
- if (m_ptr->csleep)
+ if (MON_CSLEEP(m_ptr))
{
#ifdef JP
-note = "¤Ë¤Ï¸ú²Ì¤¬¤Ê¤«¤Ã¤¿¡ª";
+ note = "¤Ë¤Ï¸ú²Ì¤¬¤Ê¤«¤Ã¤¿¡ª";
#else
note = " is immune!";
#endif
(r_ptr->level > randint1((dam - 10) < 1 ? 1 : (dam - 10)) + 10))
{
#ifdef JP
-note = "¤Ë¤Ï¸ú²Ì¤¬¤Ê¤«¤Ã¤¿¡ª";
+ note = "¤Ë¤Ï¸ú²Ì¤¬¤Ê¤«¤Ã¤¿¡ª";
#else
note = " is unaffected!";
#endif
/* Normal monsters slow down */
else
{
- if (!m_ptr->slow)
+ if (set_monster_slow(c_ptr->m_idx, MON_SLOW(m_ptr) + 50))
{
#ifdef JP
note = "¤ÎÆ°¤¤¬ÃÙ¤¯¤Ê¤Ã¤¿¡£";
#else
note = " starts moving slower.";
#endif
- mproc_add(c_ptr->m_idx, MPROC_SLOW);
}
- m_ptr->slow = MIN(200, m_ptr->slow + 50);
-
- if (c_ptr->m_idx == p_ptr->riding)
- p_ptr->update |= (PU_BONUS);
}
}
note = " starts moving faster.";
#endif
- m_ptr->fast = MIN(200, m_ptr->fast + 100);
- if (!m_ptr->mproc_idx[MPROC_FAST]) mproc_add(c_ptr->m_idx, MPROC_FAST);
-
- if (c_ptr->m_idx == p_ptr->riding) p_ptr->update |= (PU_BONUS);
+ (void)set_monster_fast(c_ptr->m_idx, MON_FAST(m_ptr) + 100);
success = TRUE;
}
else
{
#ifdef JP
-note = "¤ò»ÙÇÛ¤·¤¿¡£";
+ note = "¤ò»ÙÇÛ¤·¤¿¡£";
#else
note = " is tamed!";
#endif
set_pet(m_ptr);
- m_ptr->fast = MIN(200, m_ptr->fast + 100);
- if (!m_ptr->mproc_idx[MPROC_FAST]) mproc_add(c_ptr->m_idx, MPROC_FAST);
+ (void)set_monster_fast(c_ptr->m_idx, MON_FAST(m_ptr) + 100);
/* Learn about type */
if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= (RF3_GOOD);
if (seen) obvious = TRUE;
/* Get stunned */
- if (m_ptr->stunned)
+ if (MON_STUNNED(m_ptr))
{
#ifdef JP
note = "¤Ï¤Ò¤É¤¯¤â¤¦¤í¤¦¤È¤·¤¿¡£";
note = " is more dazed.";
#endif
- tmp = m_ptr->stunned + (do_stun / 2);
+ tmp = MON_STUNNED(m_ptr) + (do_stun / 2);
}
else
{
#endif
tmp = do_stun;
- mproc_add(c_ptr->m_idx, MPROC_STUNNED);
}
/* Apply stun */
- m_ptr->stunned = (tmp < 200) ? tmp : 200;
+ (void)set_monster_stunned(c_ptr->m_idx, tmp);
/* Get angry */
get_angry = TRUE;
if (seen) obvious = TRUE;
/* Already partially confused */
- if (m_ptr->confused)
+ if (MON_CONFUSED(m_ptr))
{
#ifdef JP
note = "¤Ï¤µ¤é¤Ëº®Í𤷤¿¤è¤¦¤À¡£";
note = " looks more confused.";
#endif
- tmp = m_ptr->confused + (do_conf / 2);
+ tmp = MON_CONFUSED(m_ptr) + (do_conf / 2);
}
/* Was not confused */
#endif
tmp = do_conf;
- mproc_add(c_ptr->m_idx, MPROC_CONFUSED);
}
/* Apply confusion */
- m_ptr->confused = (tmp < 200) ? tmp : 200;
+ (void)set_monster_confused(c_ptr->m_idx, tmp);
/* Get angry */
get_angry = TRUE;
/* Fear */
if (do_fear)
{
- /* Increase fear */
- tmp = m_ptr->monfear + do_fear;
-
/* Set fear */
- m_ptr->monfear = (tmp < 200) ? tmp : 200;
- if (!m_ptr->mproc_idx[MPROC_MONFEAR]) mproc_add(c_ptr->m_idx, MPROC_MONFEAR);
+ (void)set_monster_monfear(c_ptr->m_idx, MON_MONFEAR(m_ptr) + do_fear);
/* Get angry */
get_angry = TRUE;
if (p_ptr->health_who == c_ptr->m_idx) p_ptr->redraw |= (PR_HEALTH);
if (p_ptr->riding == c_ptr->m_idx) p_ptr->redraw |= (PR_UHEALTH);
- if (m_ptr->csleep)
- {
- /* Wake the monster up */
- m_ptr->csleep = 0;
- mproc_remove(c_ptr->m_idx, m_ptr->mproc_idx[MPROC_CSLEEP], MPROC_CSLEEP);
- if (r_ptr->flags7 & RF7_HAS_LD_MASK) p_ptr->update |= (PU_MON_LITE);
- }
+ /* Wake the monster up */
+ (void)set_monster_csleep(c_ptr->m_idx, 0);
/* Hurt the monster */
m_ptr->hp -= dam;
if (sad)
{
#ifdef JP
-msg_print("¾¯¤·Èᤷ¤¤µ¤Ê¬¤¬¤·¤¿¡£");
+ msg_print("¾¯¤·Èᤷ¤¤µ¤Ê¬¤¬¤·¤¿¡£");
#else
msg_print("You feel sad for a moment.");
#endif
-
}
}
}
/* Hack -- handle sleep */
- if (do_sleep)
- {
- m_ptr->csleep = do_sleep;
- if (!m_ptr->mproc_idx[MPROC_CSLEEP]) mproc_add(c_ptr->m_idx, MPROC_CSLEEP);
- }
+ if (do_sleep) (void)set_monster_csleep(c_ptr->m_idx, do_sleep);
}
}
}
/* Hack -- handle sleep */
- if (do_sleep)
- {
- m_ptr->csleep = do_sleep;
- if (!m_ptr->mproc_idx[MPROC_CSLEEP]) mproc_add(c_ptr->m_idx, MPROC_CSLEEP);
- }
+ if (do_sleep) (void)set_monster_csleep(c_ptr->m_idx, do_sleep);
}
}
if (m_ptr->cdis < MAX_SIGHT * 2)
{
/* Wake up */
- if (m_ptr->csleep)
+ if (MON_CSLEEP(m_ptr))
{
- /* Wake up */
- m_ptr->csleep = 0;
- mproc_remove(i, m_ptr->mproc_idx[MPROC_CSLEEP], MPROC_CSLEEP);
- if (r_info[m_ptr->r_idx].flags7 & RF7_HAS_LD_MASK) p_ptr->update |= (PU_MON_LITE);
- if (m_ptr->ml)
- {
- /* Redraw (later) if needed */
- if (p_ptr->health_who == i) p_ptr->redraw |= (PR_HEALTH);
- if (p_ptr->riding == i) p_ptr->redraw |= (PR_UHEALTH);
- }
+ (void)set_monster_csleep(i, 0);
sleep = TRUE;
}
if (!is_pet(m_ptr)) m_ptr->mflag2 |= MFLAG2_NOPET;
{
if (!is_pet(m_ptr))
{
- m_ptr->fast = MIN(200, m_ptr->fast + 100);
- if (!m_ptr->mproc_idx[MPROC_FAST]) mproc_add(i, MPROC_FAST);
+ (void)set_monster_fast(i, MON_FAST(m_ptr) + 100);
speed = TRUE;
}
}
msg_format("%^s is unaffected.", m_name);
#endif
}
- if (m_ptr->csleep)
+ if (MON_CSLEEP(m_ptr))
{
- m_ptr->csleep = 0;
- mproc_remove(m_idx, m_ptr->mproc_idx[MPROC_CSLEEP], MPROC_CSLEEP);
- if (r_ptr->flags7 & RF7_HAS_LD_MASK) p_ptr->update |= (PU_MON_LITE);
- if (m_ptr->ml)
- {
- /* Redraw (later) if needed */
- if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);
- if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);
- }
+ (void)set_monster_csleep(m_idx, 0);
if (see_m)
{
#ifdef JP
monster_desc(m_name, m_ptr, MD_IGNORE_HALLU | MD_INDEF_HIDDEN);
speed = m_ptr->mspeed - 110;
- if(m_ptr->fast) speed += 10;
- if(m_ptr->slow) speed -= 10;
+ if (MON_FAST(m_ptr)) speed += 10;
+ if (MON_SLOW(m_ptr)) speed -= 10;
/* Get the monster's alignment */
#ifdef JP
}
#ifdef JP
- if (m_ptr->csleep) strcat(buf,"¿ç̲ ");
- if (m_ptr->stunned) strcat(buf,"ۯ۰ ");
- if (m_ptr->monfear) strcat(buf,"¶²ÉÝ ");
- if (m_ptr->confused) strcat(buf,"º®Íð ");
- if (m_ptr->invulner) strcat(buf,"̵Ũ ");
+ if (MON_CSLEEP(m_ptr)) strcat(buf,"¿ç̲ ");
+ if (MON_STUNNED(m_ptr)) strcat(buf,"ۯ۰ ");
+ if (MON_MONFEAR(m_ptr)) strcat(buf,"¶²ÉÝ ");
+ if (MON_CONFUSED(m_ptr)) strcat(buf,"º®Íð ");
+ if (MON_INVULNER(m_ptr)) strcat(buf,"̵Ũ ");
#else
- if (m_ptr->csleep) strcat(buf,"sleeping ");
- if (m_ptr->stunned) strcat(buf,"stunned ");
- if (m_ptr->monfear) strcat(buf,"scared ");
- if (m_ptr->confused) strcat(buf,"confused ");
- if (m_ptr->invulner) strcat(buf,"invulnerable ");
+ if (MON_CSLEEP(m_ptr)) strcat(buf,"sleeping ");
+ if (MON_STUNNED(m_ptr)) strcat(buf,"stunned ");
+ if (MON_MONFEAR(m_ptr)) strcat(buf,"scared ");
+ if (MON_CONFUSED(m_ptr)) strcat(buf,"confused ");
+ if (MON_INVULNER(m_ptr)) strcat(buf,"invulnerable ");
#endif
buf[strlen(buf)-1] = '\0';
prt(buf,0,0);
damage = (sn ? damroll(4, 8) : (m_ptr->hp + 1));
/* Monster is certainly awake */
- if (m_ptr->csleep)
- {
- m_ptr->csleep = 0;
- mproc_remove(c_ptr->m_idx, m_ptr->mproc_idx[MPROC_CSLEEP], MPROC_CSLEEP);
- }
+ (void)set_monster_csleep(c_ptr->m_idx, 0);
/* Apply damage directly */
m_ptr->hp -= damage;
{
/* Message */
#ifdef JP
-msg_format("%^s¤Ï´äÀФËËä¤â¤ì¤Æ¤·¤Þ¤Ã¤¿¡ª", m_name);
+ msg_format("%^s¤Ï´äÀФËËä¤â¤ì¤Æ¤·¤Þ¤Ã¤¿¡ª", m_name);
#else
msg_format("%^s is embedded in the rock!", m_name);
#endif
if (r_ptr->flags2 & (RF2_SMART)) chance = 100;
/* Sometimes monsters wake up */
- if (m_ptr->csleep && (randint0(100) < chance))
+ if (MON_CSLEEP(m_ptr) && (randint0(100) < chance))
{
/* Wake up! */
- m_ptr->csleep = 0;
- mproc_remove(c_ptr->m_idx, m_ptr->mproc_idx[MPROC_CSLEEP], MPROC_CSLEEP);
- if (r_ptr->flags7 & RF7_HAS_LD_MASK) p_ptr->update |= (PU_MON_LITE);
+ (void)set_monster_csleep(c_ptr->m_idx, 0);
/* Notice the "waking up" */
if (is_seen(m_ptr))
/* Dump a message */
#ifdef JP
-msg_format("%^s¤¬Ìܤò³Ð¤Þ¤·¤¿¡£", m_name);
+ msg_format("%^s¤¬Ìܤò³Ð¤Þ¤·¤¿¡£", m_name);
#else
msg_format("%^s wakes up.", m_name);
#endif
}
-
- if (m_ptr->ml)
- {
- /* Redraw the health bar */
- if (p_ptr->health_who == c_ptr->m_idx) p_ptr->redraw |= (PR_HEALTH);
- if (p_ptr->riding == c_ptr->m_idx) p_ptr->redraw |= (PR_UHEALTH);
- }
}
}
m_ptr = &m_list[c_ptr->m_idx];
r_ptr = &r_info[m_ptr->r_idx];
- /* Redraw the health bar */
- if (p_ptr->health_who == c_ptr->m_idx) p_ptr->redraw |= (PR_HEALTH);
+ (void)set_monster_csleep(c_ptr->m_idx, 0);
if (r_ptr->flagsr & RFR_RES_TELE)
{
if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= RFR_RES_TELE;
- if (m_ptr->csleep)
- {
- m_ptr->csleep = 0;
- mproc_remove(c_ptr->m_idx, m_ptr->mproc_idx[MPROC_CSLEEP], MPROC_CSLEEP);
- if (r_ptr->flags7 & RF7_HAS_LD_MASK) p_ptr->update |= (PU_MON_LITE);
- }
-
/* Failure */
return FALSE;
}
if ((r_ptr->flags6 & RF6_TPORT) &&
!(r_ptr->flagsr & RFR_RES_TELE))
{
- if (!m_ptr->csleep) teleport_monster_to(tmp_m_idx, y, x, r_ptr->level, FALSE);
+ if (!MON_CSLEEP(m_ptr)) teleport_monster_to(tmp_m_idx, y, x, r_ptr->level, FALSE);
}
}
}
m_ptr = &m_list[c_ptr->m_idx];
/* Awake monster */
- if (c_ptr->m_idx && m_ptr->csleep)
+ if (c_ptr->m_idx && MON_CSLEEP(m_ptr))
{
/* Reset sleep counter */
- m_ptr->csleep = 0;
- mproc_remove(c_ptr->m_idx, m_ptr->mproc_idx[MPROC_CSLEEP], MPROC_CSLEEP);
+ (void)set_monster_csleep(c_ptr->m_idx, 0);
/* Notice the "waking up" */
if (is_seen(m_ptr))
msg_format("%^s wakes up.", m_name);
#endif
}
-
- if (m_ptr->ml)
- {
- /* Redraw the health bar */
- if (p_ptr->health_who == c_ptr->m_idx) p_ptr->redraw |= (PR_HEALTH);
- if (p_ptr->riding == c_ptr->m_idx) p_ptr->redraw |= (PR_UHEALTH);
- }
}
/* Process all walls, doors and patterns */
{
int cmi;
+ for (cmi = 0; cmi < MAX_MTIMED; cmi++)
+ {
+ back_m.mtimed[cmi] = 0;
+ back_m.mproc_idx[cmi] = 0;
+ }
m_list[hack_m_idx_ii] = back_m;
- for (cmi = 0; cmi < MAX_MPROC; cmi++) m_list[hack_m_idx_ii].mproc_idx[cmi] = 0;
- if (back_m.csleep) mproc_add(hack_m_idx_ii, MPROC_CSLEEP);
- if (back_m.fast) mproc_add(hack_m_idx_ii, MPROC_FAST);
- if (back_m.slow) mproc_add(hack_m_idx_ii, MPROC_SLOW);
- if (back_m.stunned) mproc_add(hack_m_idx_ii, MPROC_STUNNED);
- if (back_m.confused) mproc_add(hack_m_idx_ii, MPROC_CONFUSED);
- if (back_m.monfear) mproc_add(hack_m_idx_ii, MPROC_MONFEAR);
- if (back_m.invulner) mproc_add(hack_m_idx_ii, MPROC_INVULNER);
+ if (MON_CSLEEP(&back_m)) (void)set_monster_csleep(hack_m_idx_ii, MON_CSLEEP(&back_m));
+ if (MON_FAST(&back_m)) (void)set_monster_fast(hack_m_idx_ii, MON_FAST(&back_m));
+ if (MON_SLOW(&back_m)) (void)set_monster_slow(hack_m_idx_ii, MON_SLOW(&back_m));
+ if (MON_STUNNED(&back_m)) (void)set_monster_stunned(hack_m_idx_ii, MON_STUNNED(&back_m));
+ if (MON_CONFUSED(&back_m)) (void)set_monster_confused(hack_m_idx_ii, MON_CONFUSED(&back_m));
+ if (MON_MONFEAR(&back_m)) (void)set_monster_monfear(hack_m_idx_ii, MON_MONFEAR(&back_m));
+ if (MON_INVULNER(&back_m)) (void)set_monster_invulner(hack_m_idx_ii, MON_INVULNER(&back_m), FALSE);
}
}
s16b maxhp; /* Max Hit points */
s16b max_maxhp; /* Max Max Hit points */
- s16b csleep; /* Inactive counter */
+ s16b mtimed[MAX_MTIMED]; /* Timed status counter */
+ s16b mproc_idx[MAX_MTIMED];
byte mspeed; /* Monster "speed" */
s16b energy_need; /* Monster "energy" */
- byte fast; /* Monster is stunned */
- byte slow; /* Monster is stunned */
- byte stunned; /* Monster is stunned */
- byte confused; /* Monster is confused */
- byte monfear; /* Monster is afraid */
- byte invulner; /* Monster is temporarily invulnerable */
-
byte cdis; /* Current dis from player */
byte mflag; /* Extra monster flags */
u32b smart; /* Field for "smart_learn" */
s16b parent_m_idx;
-
- s16b mproc_idx[MAX_MPROC];
};
/*
* The array to process dungeon monsters [max_m_idx]
*/
-s16b *mproc_list[MAX_MPROC];
-s16b mproc_max[MAX_MPROC]; /* Number of monsters to be processed */
+s16b *mproc_list[MAX_MTIMED];
+s16b mproc_max[MAX_MTIMED]; /* Number of monsters to be processed */
/*
if (!m_ptr->r_idx) continue;
if (is_pet(m_ptr) && i != p_ptr->riding) have_pet = TRUE;
- if (m_ptr->csleep) continue;
+ if (MON_CSLEEP(m_ptr)) continue;
if (m_ptr->cdis > MAX_SIGHT) continue;
if (!is_hostile(m_ptr)) continue;
#ifdef JP
{
if (p_ptr->riding)
{
- if (m_list[p_ptr->riding].fast && !m_list[p_ptr->riding].slow) attr = TERM_L_BLUE;
- else if (m_list[p_ptr->riding].slow && !m_list[p_ptr->riding].fast) attr = TERM_VIOLET;
+ monster_type *m_ptr = &m_list[p_ptr->riding];
+ if (MON_FAST(m_ptr) && !MON_SLOW(m_ptr)) attr = TERM_L_BLUE;
+ else if (MON_SLOW(m_ptr) && !MON_FAST(m_ptr)) attr = TERM_VIOLET;
else attr = TERM_GREEN;
}
else if ((is_fast && !p_ptr->slow) || p_ptr->lightspeed) attr = TERM_YELLOW;
{
if (p_ptr->riding)
{
- if (m_list[p_ptr->riding].fast && !m_list[p_ptr->riding].slow) attr = TERM_L_BLUE;
- else if (m_list[p_ptr->riding].slow && !m_list[p_ptr->riding].fast) attr = TERM_VIOLET;
+ monster_type *m_ptr = &m_list[p_ptr->riding];
+ if (MON_FAST(m_ptr) && !MON_SLOW(m_ptr)) attr = TERM_L_BLUE;
+ else if (MON_SLOW(m_ptr) && !MON_FAST(m_ptr)) attr = TERM_VIOLET;
else attr = TERM_RED;
}
else if (is_fast && !p_ptr->slow) attr = TERM_YELLOW;
byte attr = TERM_RED;
/* Invulnerable */
- if (m_ptr->invulner) attr = TERM_WHITE;
+ if (MON_INVULNER(m_ptr)) attr = TERM_WHITE;
/* Asleep */
- else if (m_ptr->csleep) attr = TERM_BLUE;
+ else if (MON_CSLEEP(m_ptr)) attr = TERM_BLUE;
/* Afraid */
- else if (m_ptr->monfear) attr = TERM_VIOLET;
+ else if (MON_MONFEAR(m_ptr)) attr = TERM_VIOLET;
/* Healthy */
else if (pct >= 100) attr = TERM_L_GREEN;
new_speed = speed;
}
new_speed += (p_ptr->skill_exp[GINOU_RIDING] + p_ptr->lev *160L)/3200;
- if (riding_m_ptr->fast) new_speed += 10;
- if (riding_m_ptr->slow) new_speed -= 10;
+ if (MON_FAST(riding_m_ptr)) new_speed += 10;
+ if (MON_SLOW(riding_m_ptr)) new_speed -= 10;
riding_levitation = (riding_r_ptr->flags7 & RF7_CAN_FLY) ? TRUE : FALSE;
if (riding_r_ptr->flags7 & (RF7_CAN_SWIM | RF7_AQUATIC)) p_ptr->can_swim = TRUE;
if ((r_ptr->flagsr & RFR_RES_ALL) && dam > 0)
{
dam /= 100;
- if((dam == 0) && one_in_(3)) dam = 1;
+ if ((dam == 0) && one_in_(3)) dam = 1;
}
- if (m_ptr->invulner)
+ if (MON_INVULNER(m_ptr))
{
if (is_psy_spear)
{
if (!p_ptr->blind && is_seen(m_ptr))
{
#ifdef JP
-msg_print("¥Ð¥ê¥¢¤òÀÚ¤êÎö¤¤¤¿¡ª");
+ msg_print("¥Ð¥ê¥¢¤òÀÚ¤êÎö¤¤¤¿¡ª");
#else
msg_print("The barrier is penetrated!");
#endif
if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);
if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);
- if (m_ptr->csleep)
- {
- /* Wake it up */
- m_ptr->csleep = 0;
- mproc_remove(m_idx, m_ptr->mproc_idx[MPROC_CSLEEP], MPROC_CSLEEP);
- if (r_ptr->flags7 & RF7_HAS_LD_MASK) p_ptr->update |= (PU_MON_LITE);
- }
+ /* Wake it up */
+ (void)set_monster_csleep(m_idx, 0);
/* Hack - Cancel any special player stealth magics. -LM- */
if (p_ptr->special_defense & NINJA_S_STEALTH)
#ifdef ALLOW_FEAR
/* Mega-Hack -- Pain cancels fear */
- if (m_ptr->monfear && (dam > 0))
+ if (MON_MONFEAR(m_ptr) && (dam > 0))
{
- int tmp = randint1(dam);
-
- /* Cure a little fear */
- if (tmp < m_ptr->monfear)
- {
- /* Reduce fear */
- m_ptr->monfear -= tmp;
- }
-
- /* Cure all the fear */
- else
+ /* Cure fear */
+ if (set_monster_monfear(m_idx, MON_MONFEAR(m_ptr) - randint1(dam)))
{
- /* Cure fear */
- m_ptr->monfear = 0;
- mproc_remove(m_idx, m_ptr->mproc_idx[MPROC_MONFEAR], MPROC_MONFEAR);
-
/* No more fear */
(*fear) = FALSE;
}
}
/* Sometimes a monster gets scared by damage */
- if (!m_ptr->monfear && !(r_ptr->flags3 & (RF3_NO_FEAR)))
+ if (!MON_MONFEAR(m_ptr) && !(r_ptr->flags3 & (RF3_NO_FEAR)))
{
- int percentage;
-
/* Percentage of fully healthy */
- percentage = (100L * m_ptr->hp) / m_ptr->maxhp;
+ int percentage = (100L * m_ptr->hp) / m_ptr->maxhp;
/*
* Run (sometimes) if at 10% or less of max hit points,
(*fear) = TRUE;
/* XXX XXX XXX Hack -- Add some timed fear */
- m_ptr->monfear = (randint1(10) +
+ (void)set_monster_monfear(m_idx, (randint1(10) +
(((dam >= m_ptr->hp) && (percentage > 7)) ?
- 20 : ((11 - percentage) * 5)));
-
- mproc_add(m_idx, MPROC_MONFEAR);
+ 20 : ((11 - percentage) * 5))));
}
}
monster_type *m_ptr = &m_list[p_ptr->riding];
monster_race *r_ptr = &r_info[m_ptr->r_idx];
- if (m_ptr->confused)
+ if (MON_CONFUSED(m_ptr))
{
/* Standard confusion */
if (randint0(100) < 75)
monster_type *m_ptr = &m_list[p_ptr->riding];
monster_desc(m_name, m_ptr, 0);
- if (m_ptr->confused)
+ if (MON_CONFUSED(m_ptr))
{
#ifdef JP
msg_format("%s¤Ïº®Í𤷤Ƥ¤¤ë¡£", m_name);