OSDN Git Service

モンスターの状態変数7種を配列化し, 状態変数の変更を関数化. 各配列の値
authornothere <nothere@0568b783-4c39-0410-ac80-bf13821ea2a2>
Mon, 19 Jan 2004 04:27:36 +0000 (04:27 +0000)
committernothere <nothere@0568b783-4c39-0410-ac80-bf13821ea2a2>
Mon, 19 Jan 2004 04:27:36 +0000 (04:27 +0000)
は記述短縮のためマクロで参照する. csleep以外の6つはbyte型からs16bに変
更したが, 1.6.xに移植することを考慮し, セーブファイルでのこれら変数は
引き続きbyte型で読み書きする. 関連して, 以下の変更と修正を含む.
* モンスタープロセス配列全体の初期化をmproc_init()で行うように変更.
  floors.c, load.c, spells3.cからmproc_add()を削除. mproc_init()呼び
  出しは最低限必要な2箇所 (dungeon()のメインループ直前と,
  do_cmd_save_game()のhandle_staff()近く) のみに置いた.
* dungeon.cにあったprocess_monsters_*()をprocess_monsters()の類型とみ
  なし, melee2.cに移転. mproc関数群も移転.
* mproc_add(), mproc_remove()に配列外アクセス防止処理追加.
* 剣術 "みね打ち" を朦朧としているモンスターに使うと朦朧度が逆にいく
  らか回復するバグを修正.
* 位置交換テレポート成功時にモンスターが起きないバグを修正.
* モンスターへの魔力消去とメッセージは関数dispel_monster_status()にま
  とめた. これを用い, 乗馬がプレイヤーへの魔力消去の巻き添えになった
  場合もメッセージを出すように変更.

31 files changed:
src/cave.c
src/cmd1.c
src/cmd2.c
src/cmd5.c
src/defines.h
src/dungeon.c
src/effects.c
src/externs.h
src/files.c
src/floors.c
src/generate.c
src/init2.c
src/load.c
src/mane.c
src/melee1.c
src/melee2.c
src/mind.c
src/monster2.c
src/mspells1.c
src/mspells2.c
src/mspells3.c
src/object2.c
src/save.c
src/spells1.c
src/spells2.c
src/spells3.c
src/types.h
src/variable.c
src/wild.c
src/xtra1.c
src/xtra2.c

index 0d8ae30..f63e239 100644 (file)
@@ -3068,14 +3068,14 @@ void update_mon_lite(void)
                        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 */
index 67718ce..8bd007b 100644 (file)
@@ -2010,7 +2010,7 @@ static void py_attack_aux(int y, int x, bool *fear, bool *mdeath, s16b hand, int
                        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;
@@ -2019,7 +2019,7 @@ static void py_attack_aux(int y, int x, bool *fear, bool *mdeath, s16b hand, int
                        {
                                fuiuchi = TRUE;
                        }
-                       else if (m_ptr->monfear && m_ptr->ml)
+                       else if (MON_MONFEAR(m_ptr) && m_ptr->ml)
                        {
                                stab_fleeing = TRUE;
                        }
@@ -2071,13 +2071,8 @@ static void py_attack_aux(int y, int x, bool *fear, bool *mdeath, s16b hand, int
                }
        }
 
-       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);
@@ -2344,25 +2339,22 @@ static void py_attack_aux(int y, int x, bool *fear, bool *mdeath, s16b hand, int
                                {
                                        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);
                                        }
                                }
                        }
@@ -2524,7 +2516,7 @@ static void py_attack_aux(int y, int x, bool *fear, bool *mdeath, s16b hand, int
                                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);
@@ -2541,11 +2533,10 @@ static void py_attack_aux(int y, int x, bool *fear, bool *mdeath, s16b hand, int
 #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
                                {
@@ -2779,16 +2770,13 @@ static void py_attack_aux(int y, int x, bool *fear, bool *mdeath, s16b hand, int
                                }
                                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);
                                }
                        }
 
@@ -3183,19 +3171,14 @@ bool py_attack(int y, int x, int mode)
                        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);
@@ -3896,13 +3879,8 @@ void move_player(int dir, bool do_pickup, bool break_trap)
                    ((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);
@@ -3960,7 +3938,7 @@ void move_player(int dir, bool do_pickup, bool break_trap)
                        oktomove = FALSE;
                        disturb(0, 0);
                }
-               else if (riding_m_ptr->monfear)
+               else if (MON_MONFEAR(riding_m_ptr))
                {
                        char m_name[80];
 
@@ -4025,7 +4003,7 @@ void move_player(int dir, bool do_pickup, bool break_trap)
                        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);
index 7a1aeae..90b4c00 100644 (file)
@@ -3556,7 +3556,7 @@ void do_cmd_fire_aux(int item, object_type *j_ptr)
                        /* 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);
@@ -4320,7 +4320,7 @@ msg_print("
                                /* 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);
index 8424576..aa5793c 100644 (file)
@@ -2147,12 +2147,11 @@ bool do_riding(bool force)
                        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
index d097475..a1102fe 100644 (file)
@@ -5486,12 +5486,20 @@ extern int PlayerUID;
 #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])
index 4601383..b6597eb 100644 (file)
@@ -1097,445 +1097,6 @@ static void regen_captured_monsters(void)
 }
 
 
-/*
- * 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 */
@@ -4423,13 +3984,13 @@ msg_print("
        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();
        }
 
 
@@ -5930,14 +5491,12 @@ msg_print("
                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);
@@ -5946,36 +5505,16 @@ msg_print("
 #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);
 
@@ -5988,33 +5527,14 @@ msg_print("
                        }
                }
 
-               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);
 
@@ -6027,33 +5547,14 @@ msg_print("
                        }
                }
 
-               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);
 
@@ -6063,7 +5564,6 @@ msg_print("
 #else
                                msg_format("%^s is no longer fear.", m_name);
 #endif
-                               p_ptr->redraw |= (PR_UHEALTH);
                        }
                }
 
@@ -6670,6 +6170,9 @@ msg_print("
        /* Not leaving dungeon */
        p_ptr->leaving_dungeon = FALSE;
 
+       /* Initialize monster process */
+       mproc_init();
+
        /* Main loop */
        while (TRUE)
        {
index eacc0f2..5f0b669 100644 (file)
@@ -219,23 +219,9 @@ void reset_tim_flags(void)
 
        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)
index 4535786..b1bee75 100644 (file)
@@ -444,8 +444,8 @@ extern s16b max_floor_id;
 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;
@@ -860,6 +860,23 @@ extern bool load_floor(saved_floor_type *sf_ptr, u32b mode);
 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);
@@ -895,8 +912,6 @@ extern cptr funny_comments[MAX_SAN_COMMENT];
 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);
index 0468674..93f78c9 100644 (file)
@@ -1825,8 +1825,8 @@ static void display_player_middle(void)
                }
                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)
@@ -6248,6 +6248,9 @@ prt("
        /* Update stuff */
        update_stuff();
 
+       /* Initialize monster process */
+       mproc_init();
+
        /* HACK -- reset the hackish flag */
        hack_mind = TRUE;
 }
index 51fc850..31a5e53 100644 (file)
@@ -399,7 +399,7 @@ static void preserve_pet(void)
                                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;
@@ -545,7 +545,6 @@ static void place_pet(void)
                {
                        monster_type *m_ptr = &m_list[m_idx];
                        monster_race *r_ptr;
-                       int cmi;
 
                        cave[cy][cx].m_idx = m_idx;
 
@@ -558,8 +557,7 @@ static void place_pet(void)
                        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;
@@ -584,13 +582,6 @@ static void place_pet(void)
                        /* 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];
@@ -1213,47 +1204,13 @@ void change_floor(void)
                                        /* 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 */
index ce82aa6..6e4ef1e 100644 (file)
@@ -1445,7 +1445,7 @@ void clear_cave(void)
        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();
index 9b37c6c..734f1f2 100644 (file)
@@ -1606,7 +1606,7 @@ static errr init_other(void)
        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;
index ccb3cf9..d81caba 100644 (file)
@@ -705,7 +705,7 @@ static void rd_monster_old(monster_type *m_ptr)
        {
                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))
        {
@@ -719,17 +719,22 @@ static void rd_monster_old(monster_type *m_ptr)
 
        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))
        {
@@ -747,7 +752,8 @@ static void rd_monster_old(monster_type *m_ptr)
                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);
@@ -799,6 +805,7 @@ static void rd_monster(monster_type *m_ptr)
 {
        u32b flags;
        char buf[128];
+       byte tmp8u;
 
        if (h_older_than(1, 5, 0, 0))
        {
@@ -828,31 +835,55 @@ static void rd_monster(monster_type *m_ptr)
        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;
@@ -2608,7 +2639,7 @@ note(format("
        /* Read the monsters */
        for (i = 1; i < limit; i++)
        {
-               int m_idx, cmi;
+               int m_idx;
                monster_type *m_ptr;
 
                /* Get a new record */
@@ -2632,14 +2663,6 @@ note(format("
 
                /* 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 */
@@ -2896,7 +2919,7 @@ static errr rd_saved_floor(saved_floor_type *sf_ptr)
        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 */
@@ -2911,14 +2934,6 @@ static errr rd_saved_floor(saved_floor_type *sf_ptr)
 
                /* 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 */
index 2c12b88..5491bd3 100644 (file)
@@ -310,53 +310,14 @@ msg_print("
                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:
index 03d8aca..0c0a2b2 100644 (file)
@@ -251,7 +251,7 @@ bool make_attack_normal(int m_idx)
                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);
@@ -859,7 +859,7 @@ bool make_attack_normal(int m_idx)
                                        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;
 
@@ -943,7 +943,7 @@ bool make_attack_normal(int m_idx)
                                        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;
 
index 0a882c2..3b83a7b 100644 (file)
@@ -209,17 +209,12 @@ void mon_take_hit_mon(int m_idx, int dam, bool *fear, cptr note, int who)
                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)
                {
@@ -339,36 +334,21 @@ msg_format("%^s
 #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,
@@ -381,11 +361,9 @@ msg_format("%^s
                        (*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))));
                }
        }
 
@@ -462,7 +440,7 @@ static int mon_will_run(int m_idx)
        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
 
@@ -1525,15 +1503,10 @@ static bool monst_attack_monst(int m_idx, int t_idx)
                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)
                        {
@@ -2148,31 +2121,18 @@ msg_format("%s
                        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;
@@ -2201,11 +2161,7 @@ msg_format("%s
                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);
@@ -2315,7 +2271,7 @@ static void process_monster(int 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];
@@ -2495,7 +2451,7 @@ static void process_monster(int m_idx)
        }
 
        /* Handle "sleep" */
-       if (m_ptr->csleep)
+       if (MON_CSLEEP(m_ptr))
        {
                /* Handle non-aggravation - Still sleeping */
                if (!(p_ptr->cursed & TRC_AGGRAVATE)) return;
@@ -2503,9 +2459,7 @@ static void process_monster(int m_idx)
                /* 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)
@@ -2525,10 +2479,6 @@ static void process_monster(int m_idx)
 
                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))
                        {
@@ -2538,7 +2488,7 @@ static void process_monster(int m_idx)
        }
 
        /* Handle "stun" */
-       if (m_ptr->stunned)
+       if (MON_STUNNED(m_ptr))
        {
                /* Sometimes skip move */
                if (one_in_(2)) return;
@@ -2658,11 +2608,10 @@ static void process_monster(int m_idx)
                {
                        if (disturb_minor) disturb(FALSE, FALSE);
 #ifdef JP
-msg_print("½Å¸ü¤Ê­²»¤¬Ê¹¤³¤¨¤¿¡£");
+                       msg_print("½Å¸ü¤Ê­²»¤¬Ê¹¤³¤¨¤¿¡£");
 #else
                        msg_print("You hear heavy steps.");
 #endif
-
                }
 
                /* Some monsters can speak */
@@ -2680,42 +2629,36 @@ msg_print("
                                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)
                        {
@@ -2775,7 +2718,7 @@ msg_format("%^s%s", m_name, monmessage);
 
 
        /* 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;
@@ -3155,7 +3098,7 @@ msg_format("%^s%s", m_name, monmessage);
                        /* 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
@@ -3194,7 +3137,7 @@ msg_format("%^s%s", m_name, monmessage);
                        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))
                                {
@@ -3211,7 +3154,7 @@ msg_format("%^s%s", m_name, monmessage);
                                                /* 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);
@@ -3234,19 +3177,8 @@ msg_format("%^s%s", m_name, monmessage);
                                /* 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 */
                        }
@@ -3276,7 +3208,7 @@ msg_format("%^s%s", m_name, monmessage);
 
                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 */
@@ -3520,7 +3452,7 @@ msg_format("%^s%s", m_name, monmessage);
                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)
@@ -3575,11 +3507,10 @@ msg_format("%^s%s", m_name, monmessage);
 
 
        /* 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)
@@ -3597,14 +3528,7 @@ msg_format("%^s%s", m_name, monmessage);
 #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 (?) */
        }
@@ -3789,8 +3713,8 @@ void process_monsters(void)
                        /* 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 */
@@ -3853,6 +3777,735 @@ void process_monsters(void)
 }
 
 
+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)
 {
index 47607b3..712219b 100644 (file)
@@ -1166,53 +1166,14 @@ static bool cast_force_spell(int spell)
                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:
@@ -1740,12 +1701,8 @@ msg_print("
                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);
index a2aa447..0d8564a 100644 (file)
@@ -190,20 +190,6 @@ monster_race *real_r_ptr(monster_type *m_ptr)
 }
 
 
-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.
  *
@@ -231,8 +217,8 @@ void delete_monster_idx(int i)
        /* 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 */
@@ -383,7 +369,7 @@ static void compact_monsters_aux(int i1, int i2)
        /* 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;
        }
@@ -540,7 +526,7 @@ void wipe_m_list(void)
        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;
@@ -3143,12 +3129,12 @@ msg_print("
        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;
@@ -3209,14 +3195,13 @@ msg_print("
        }
 
        /* 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 */
@@ -3248,11 +3233,7 @@ msg_print("
        /* 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)
@@ -3285,7 +3266,7 @@ msg_print("
 
        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 */
index b2577b2..927f141 100644 (file)
@@ -924,7 +924,7 @@ static bool dispel_check(int m_idx)
 
        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 */
@@ -1049,7 +1049,7 @@ static int choose_attack_spell(int m_idx, byte spells[], byte num)
        }
 
        /* 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)]);
@@ -1137,7 +1137,7 @@ static int choose_attack_spell(int m_idx, byte spells[], byte 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)]);
@@ -1151,7 +1151,7 @@ static int choose_attack_spell(int m_idx, byte spells[], byte 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)]);
@@ -1296,7 +1296,7 @@ bool make_attack_spell(int m_idx)
        bool can_remember;
 
        /* Cannot cast spells when confused */
-       if (m_ptr->confused)
+       if (MON_CONFUSED(m_ptr))
        {
                reset_target(m_ptr);
                return (FALSE);
@@ -1620,7 +1620,7 @@ bool make_attack_spell(int m_idx)
 
        /* 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 */
@@ -1750,30 +1750,7 @@ msg_format("%^s
 
                                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))
@@ -3259,17 +3236,14 @@ msg_format("%^s
                        }
 
                        /* 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;
                }
 
@@ -3372,19 +3346,17 @@ msg_format("%^s
                        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;
                }
@@ -3414,14 +3386,7 @@ msg_format("%s
 
                        }
 
-                       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;
                }
 
index 197a5ee..da40f28 100644 (file)
@@ -310,7 +310,7 @@ bool monst_spell_monst(int m_idx)
        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;
@@ -701,7 +701,7 @@ bool monst_spell_monst(int m_idx)
        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 */
@@ -2670,15 +2670,7 @@ bool monst_spell_monst(int m_idx)
                }
                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;
@@ -2726,16 +2718,13 @@ bool monst_spell_monst(int m_idx)
                }
                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;
@@ -2781,16 +2770,13 @@ bool monst_spell_monst(int m_idx)
                }
                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;
@@ -2837,18 +2823,14 @@ bool monst_spell_monst(int m_idx)
                }
                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;
@@ -2895,16 +2877,13 @@ bool monst_spell_monst(int m_idx)
                }
                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;
@@ -2932,17 +2911,14 @@ bool monst_spell_monst(int m_idx)
                }
 
                /* 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 */
@@ -3025,7 +3001,6 @@ bool monst_spell_monst(int m_idx)
 #else
                                msg_format("%^s looks healthier.", m_name);
 #endif
-
                        }
                        else
                        {
@@ -3038,11 +3013,10 @@ bool monst_spell_monst(int m_idx)
                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
@@ -3050,7 +3024,6 @@ bool monst_spell_monst(int m_idx)
 #else
                        if (see_m) msg_format("%^s recovers %s courage.", m_name, m_poss);
 #endif
-
                }
 
                break;
@@ -3067,7 +3040,6 @@ bool monst_spell_monst(int m_idx)
 #else
                                msg_format("%^s casts a Globe of Invulnerability.", m_name);
 #endif
-
                        }
                        else
                        {
@@ -3075,14 +3047,7 @@ bool monst_spell_monst(int m_idx)
                        }
                }
 
-               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 */
@@ -4218,18 +4183,7 @@ bool monst_spell_monst(int m_idx)
                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)
        {
@@ -4238,7 +4192,6 @@ bool monst_spell_monst(int m_idx)
 #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))
index 636a827..4979b76 100644 (file)
@@ -724,53 +724,14 @@ msg_print("
                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:
index 66aae95..0c372e8 100644 (file)
@@ -6661,7 +6661,7 @@ bool process_warning(int xx, int yy)
 
                        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];
index 9379d7b..9b73034 100644 (file)
@@ -186,18 +186,19 @@ static void wr_item(object_type *o_ptr)
 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;
@@ -219,19 +220,43 @@ static void wr_monster(monster_type *m_ptr)
        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);
@@ -1091,7 +1116,7 @@ static bool wr_dungeon(void)
 
        /*** Meta info ***/
 
-        /* Number of floor_id used from birth */
+       /* Number of floor_id used from birth */
        wr_s16b(max_floor_id);
 
        /* Current dungeon type */
index 64e1ad3..8b80bf5 100644 (file)
@@ -1656,7 +1656,7 @@ static bool project_m(int who, int r, int y, int x, int dam, int typ , int flg)
        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;
@@ -2494,18 +2494,14 @@ note = "
                                /* 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;
@@ -2614,18 +2610,14 @@ note = "
                                /* 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 */
@@ -3381,13 +3373,8 @@ note = "
                {
                        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)
                        {
@@ -3413,42 +3400,34 @@ note = "
                {
                        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 */
@@ -3507,19 +3486,14 @@ note = "
                        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)
                        {
@@ -3567,19 +3541,14 @@ note = "
                        /* 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 */
@@ -5137,10 +5106,7 @@ note_dies = "
                                        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;
                }
@@ -5438,7 +5404,7 @@ msg_format("
                        if (r_ptr->flags2 & RF2_EMPTY_MIND)
                        {
 #ifdef JP
-note = "¤Ë¤Ï¸ú²Ì¤¬¤Ê¤«¤Ã¤¿¡ª";
+                               note = "¤Ë¤Ï¸ú²Ì¤¬¤Ê¤«¤Ã¤¿¡ª";
 #else
                                note = " is immune!";
 #endif
@@ -5447,10 +5413,10 @@ note = "
                                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
@@ -5471,7 +5437,7 @@ note = "
                                    (r_ptr->level > randint1((dam - 10) < 1 ? 1 : (dam - 10)) + 10))
                                {
 #ifdef JP
-note = "¤Ë¤Ï¸ú²Ì¤¬¤Ê¤«¤Ã¤¿¡ª";
+                                       note = "¤Ë¤Ï¸ú²Ì¤¬¤Ê¤«¤Ã¤¿¡ª";
 #else
                                        note = " is unaffected!";
 #endif
@@ -5482,19 +5448,14 @@ note = "
                                /* 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);
                                }
                        }
 
@@ -5682,10 +5643,7 @@ note = "
                                        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;
                                }
 
@@ -5702,14 +5660,13 @@ note = "
                                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);
@@ -5824,7 +5781,7 @@ note = "
                        if (seen) obvious = TRUE;
 
                        /* Get stunned */
-                       if (m_ptr->stunned)
+                       if (MON_STUNNED(m_ptr))
                        {
 #ifdef JP
                                note = "¤Ï¤Ò¤É¤¯¤â¤¦¤í¤¦¤È¤·¤¿¡£";
@@ -5832,7 +5789,7 @@ note = "
                                note = " is more dazed.";
 #endif
 
-                               tmp = m_ptr->stunned + (do_stun / 2);
+                               tmp = MON_STUNNED(m_ptr) + (do_stun / 2);
                        }
                        else
                        {
@@ -5843,11 +5800,10 @@ note = "
 #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;
@@ -5862,7 +5818,7 @@ note = "
                        if (seen) obvious = TRUE;
 
                        /* Already partially confused */
-                       if (m_ptr->confused)
+                       if (MON_CONFUSED(m_ptr))
                        {
 #ifdef JP
                                note = "¤Ï¤µ¤é¤Ëº®Í𤷤¿¤è¤¦¤À¡£";
@@ -5870,7 +5826,7 @@ note = "
                                note = " looks more confused.";
 #endif
 
-                               tmp = m_ptr->confused + (do_conf / 2);
+                               tmp = MON_CONFUSED(m_ptr) + (do_conf / 2);
                        }
 
                        /* Was not confused */
@@ -5883,11 +5839,10 @@ note = "
 #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;
@@ -5977,12 +5932,8 @@ note = "
                /* 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;
@@ -6001,13 +5952,8 @@ note = "
                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;
@@ -6045,11 +5991,10 @@ note = "
                        if (sad)
                        {
 #ifdef JP
-msg_print("¾¯¤·Èᤷ¤¤µ¤Ê¬¤¬¤·¤¿¡£");
+                               msg_print("¾¯¤·Èᤷ¤¤µ¤Ê¬¤¬¤·¤¿¡£");
 #else
                                msg_print("You feel sad for a moment.");
 #endif
-
                        }
                }
 
@@ -6070,11 +6015,7 @@ msg_print("
                        }
 
                        /* 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);
                }
        }
 
@@ -6140,11 +6081,7 @@ msg_print("
                        }
 
                        /* 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);
                }
        }
 
index ab1cb03..ace5f53 100644 (file)
@@ -4605,18 +4605,9 @@ void aggravate_monsters(int who)
                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;
@@ -4627,8 +4618,7 @@ void aggravate_monsters(int who)
                {
                        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;
                        }
                }
@@ -4686,17 +4676,9 @@ bool genocide_aux(int m_idx, int power, bool player_cast, int dam_side, cptr spe
                        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
@@ -4953,8 +4935,8 @@ bool probing(void)
                        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
@@ -4991,17 +4973,17 @@ sprintf(buf, "%s ... align:%s HP:%d/%d AC:%d speed:%s%d exp:", m_name, align, m_
                        }
 
 #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);
@@ -5666,11 +5648,7 @@ msg_format("%^s
                                        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;
@@ -5680,7 +5658,7 @@ msg_format("%^s
                                        {
                                                /* 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
@@ -5969,12 +5947,10 @@ static void cave_temp_room_lite(void)
                        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))
@@ -5986,18 +5962,11 @@ static void cave_temp_room_lite(void)
 
                                        /* 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);
-                               }
                        }
                }
 
@@ -6610,8 +6579,7 @@ msg_print("
        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)
        {
@@ -6623,13 +6591,6 @@ msg_print("
 
                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;
        }
index 075c502..89d989b 100644 (file)
@@ -436,7 +436,7 @@ void teleport_player(int dis, bool passive)
                                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);
                                }
                        }
                }
@@ -1504,11 +1504,10 @@ static bool vanish_dungeon(void)
                        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))
@@ -1523,13 +1522,6 @@ static bool vanish_dungeon(void)
                                        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 */
@@ -5368,16 +5360,20 @@ bool polymorph_monster(int y, int x)
                        {
                                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);
                        }
                }
 
index cfd0499..6a1c055 100644 (file)
@@ -584,18 +584,12 @@ struct monster_type
        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 */
@@ -615,8 +609,6 @@ struct monster_type
        u32b smart;                     /* Field for "smart_learn" */
 
        s16b parent_m_idx;
-
-       s16b mproc_idx[MAX_MPROC];
 };
 
 
index d69e8f3..c300cf5 100644 (file)
@@ -689,8 +689,8 @@ monster_type *m_list;
 /*
  * 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 */
 
 
 /*
index e5d41f2..9369564 100644 (file)
@@ -1221,7 +1221,7 @@ bool change_wild_mode(void)
 
                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
index 4009524..6fbe91b 100644 (file)
@@ -1276,8 +1276,9 @@ static void prt_speed(void)
        {
                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;
@@ -1296,8 +1297,9 @@ static void prt_speed(void)
        {
                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;
@@ -1568,13 +1570,13 @@ static void health_redraw(bool riding)
                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;
@@ -4593,8 +4595,8 @@ void calc_bonuses(void)
                        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;
 
index 37343dc..bd2ff20 100644 (file)
@@ -1570,17 +1570,17 @@ int mon_damage_mod(monster_type *m_ptr, int dam, bool is_psy_spear)
        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
@@ -1714,13 +1714,8 @@ bool mon_take_hit(int m_idx, int dam, bool *fear, cptr note)
        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)
@@ -2093,36 +2088,21 @@ msg_format("%s
 #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,
@@ -2135,11 +2115,9 @@ msg_format("%s
                        (*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))));
                }
        }
 
@@ -4360,7 +4338,7 @@ if (!get_com("
                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)
@@ -4399,7 +4377,7 @@ msg_print("
                        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);