OSDN Git Service

[Refactor] #37353 モンスターステータス処理を melee2.c から monster-status.c/h へ分離。
authorDeskull <deskull@users.sourceforge.jp>
Fri, 28 Sep 2018 12:58:38 +0000 (21:58 +0900)
committerDeskull <deskull@users.sourceforge.jp>
Fri, 28 Sep 2018 12:58:38 +0000 (21:58 +0900)
Separate shoot process from melee2.c to monster-status.c/h.

Hengband_vcs2015/Hengband/Hengband.vcxproj
Hengband_vcs2015/Hengband/Hengband.vcxproj.filters
src/Makefile.am
src/externs.h
src/melee2.c
src/monster-status.c [new file with mode: 0644]
src/monster-status.h [new file with mode: 0644]
src/monster2.c

index f3ecab5..19dd4f9 100644 (file)
     <ClCompile Include="..\..\src\floor-save.c" />\r
     <ClCompile Include="..\..\src\history.c" />\r
     <ClCompile Include="..\..\src\monster-hook.c" />\r
+    <ClCompile Include="..\..\src\monster-status.c" />\r
     <ClCompile Include="..\..\src\object-hook.c" />\r
     <ClCompile Include="..\..\src\realm-craft.c" />\r
     <ClCompile Include="..\..\src\realm-crusade.c" />\r
     <ClInclude Include="..\..\src\kajitips.h" />\r
     <ClInclude Include="..\..\src\mindtips.h" />\r
     <ClInclude Include="..\..\src\monster-hook.h" />\r
+    <ClInclude Include="..\..\src\monster-status.h" />\r
     <ClInclude Include="..\..\src\object-hook.h" />\r
     <ClInclude Include="..\..\src\readdib.h" />\r
     <ClInclude Include="..\..\src\realm-arcane.h" />\r
index 4351e61..c46e8cd 100644 (file)
     <ClCompile Include="..\..\src\object-hook.c">\r
       <Filter>Source</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\src\monster-status.c">\r
+      <Filter>Source</Filter>\r
+    </ClCompile>\r
   </ItemGroup>\r
   <ItemGroup>\r
     <ClInclude Include="..\..\src\angband.h">\r
     <ClInclude Include="..\..\src\cmd-zapwand.h">\r
       <Filter>Header</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\src\monster-status.h">\r
+      <Filter>Header</Filter>\r
+    </ClInclude>\r
   </ItemGroup>\r
   <ItemGroup>\r
     <ResourceCompile Include="..\..\src\angband.rc" />\r
index 4068cfc..dab9f7f 100644 (file)
@@ -16,7 +16,7 @@ hengband_SOURCES = \
        history.h history.c \
        h-system.h h-type.h inet.c init1.c init2.c init.h japanese.c load.c \
        main.c main-x11.c main-gcu.c mane.c melee1.c melee2.c mind.c \
-       monster-hook.c monster-hook.h monster1.c \
+       monster-hook.c monster-hook.h monster-status.c monster-status.h monster1.c \
        monster2.c mspells1.c mspells2.c mspells3.c mspells4.c mutation.c \
        object-hook.c object-hook.h object1.c object2.c obj_kind.c racial.c \
        realm-arcane.c \
index fba7bd6..6a8c3bb 100644 (file)
@@ -882,6 +882,7 @@ extern HIT_POINT critical_norm(int weight, int plus, HIT_POINT dam, s16b meichuu
 extern bool py_attack(int y, int x, BIT_FLAGS mode);
 extern bool make_attack_normal(MONSTER_IDX m_idx);
 extern void process_monsters(void);
+extern void process_monster(MONSTER_IDX m_idx);
 extern int get_mproc_idx(MONSTER_IDX m_idx, int mproc_type);
 extern void mproc_init(void);
 extern bool set_monster_csleep(MONSTER_IDX m_idx, int v);
index 4741b8f..d7def9a 100644 (file)
@@ -2100,7 +2100,7 @@ static bool check_hp_for_feat_destruction(feature_type *f_ptr, monster_type *m_p
  *\n
  * A "direction" of "5" means "pick a random direction".\n
  */
-static void process_monster(MONSTER_IDX m_idx)
+void process_monster(MONSTER_IDX m_idx)
 {
        monster_type    *m_ptr = &m_list[m_idx];
        monster_race    *r_ptr = &r_info[m_ptr->r_idx];
@@ -3597,869 +3597,3 @@ void process_monsters(void)
        }
 }
 
-/*!
- * @brief モンスターの時限ステータスを取得する
- * @return m_idx モンスターの参照ID
- * @return mproc_type モンスターの時限ステータスID
- * @return 残りターン値
- */
-int get_mproc_idx(MONSTER_IDX m_idx, int mproc_type)
-{
-       s16b *cur_mproc_list = mproc_list[mproc_type];
-       int i;
-
-       for (i = mproc_max[mproc_type] - 1; i >= 0; i--)
-       {
-               if (cur_mproc_list[i] == m_idx) return i;
-       }
-
-       return -1;
-}
-
-/*!
- * @brief モンスターの時限ステータスリストを追加する
- * @return m_idx モンスターの参照ID
- * @return mproc_type 追加したいモンスターの時限ステータスID
- * @return なし
- */
-static void mproc_add(MONSTER_IDX m_idx, int mproc_type)
-{
-       if (mproc_max[mproc_type] < max_m_idx) mproc_list[mproc_type][mproc_max[mproc_type]++] = (s16b)m_idx;
-}
-
-
-/*!
- * @brief モンスターの時限ステータスリストを削除
- * @return m_idx モンスターの参照ID
- * @return mproc_type 削除したいモンスターの時限ステータスID
- * @return なし
- */
-static void mproc_remove(MONSTER_IDX m_idx, int mproc_type)
-{
-       int mproc_idx = get_mproc_idx(m_idx, mproc_type);
-       if (mproc_idx >= 0) mproc_list[mproc_type][mproc_idx] = mproc_list[mproc_type][--mproc_max[mproc_type]];
-}
-
-
-/*!
- * @brief モンスターの時限ステータスリストを初期化する / Initialize monster process
- * @return なし
- */
-void mproc_init(void)
-{
-       monster_type *m_ptr;
-       MONSTER_IDX i;
-       int cmi;
-
-       /* Reset "mproc_max[]" */
-       for (cmi = 0; cmi < MAX_MTIMED; cmi++) mproc_max[cmi] = 0;
-
-       /* 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);
-               }
-       }
-}
-
-
-/*!
- * @brief モンスターの睡眠状態値をセットする /
- * Set "m_ptr->mtimed[MTIMED_CSLEEP]", notice observable changes
- * @param m_idx モンスター参照ID
- * @param v セットする値
- * @return 別途更新処理が必要な場合TRUEを返す
- */
-bool set_monster_csleep(MONSTER_IDX 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] = (s16b)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;
-}
-
-
-/*!
- * @brief モンスターの加速状態値をセット /
- * Set "m_ptr->mtimed[MTIMED_FAST]", notice observable changes
- * @param m_idx モンスター参照ID
- * @param v セットする値
- * @return 別途更新処理が必要な場合TRUEを返す
- */
-bool set_monster_fast(MONSTER_IDX 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] = (s16b)v;
-
-       if (!notice) return FALSE;
-
-       if ((p_ptr->riding == m_idx) && !p_ptr->leaving) p_ptr->update |= (PU_BONUS);
-
-       return TRUE;
-}
-
-
-/*
- * Set "m_ptr->mtimed[MTIMED_SLOW]", notice observable changes
- */
-bool set_monster_slow(MONSTER_IDX 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] = (s16b)v;
-
-       if (!notice) return FALSE;
-
-       if ((p_ptr->riding == m_idx) && !p_ptr->leaving) p_ptr->update |= (PU_BONUS);
-
-       return TRUE;
-}
-
-
-/*!
- * @brief モンスターの朦朧状態値をセット /
- * Set "m_ptr->mtimed[MTIMED_STUNNED]", notice observable changes
- * @param m_idx モンスター参照ID
- * @param v セットする値
- * @return 別途更新処理が必要な場合TRUEを返す
- */
-bool set_monster_stunned(MONSTER_IDX 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] = (s16b)v;
-
-       return notice;
-}
-
-
-/*!
- * @brief モンスターの混乱状態値をセット /
- * Set "m_ptr->mtimed[MTIMED_CONFUSED]", notice observable changes
- * @param m_idx モンスター参照ID
- * @param v セットする値
- * @return 別途更新処理が必要な場合TRUEを返す
- */
-bool set_monster_confused(MONSTER_IDX 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] = (s16b)v;
-
-       return notice;
-}
-
-
-/*!
- * @brief モンスターの恐慌状態値をセット /
- * Set "m_ptr->mtimed[MTIMED_MONFEAR]", notice observable changes
- * @param m_idx モンスター参照ID
- * @param v セットする値
- * @return 別途更新処理が必要な場合TRUEを返す
- */
-bool set_monster_monfear(MONSTER_IDX 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] = (s16b)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;
-}
-
-
-/*!
- * @brief モンスターの無敵状態値をセット /
- * Set "m_ptr->mtimed[MTIMED_INVULNER]", notice observable changes
- * @param m_idx モンスター参照ID
- * @param v セットする値
- * @param energy_need TRUEならば無敵解除時に行動ターン消費を行う
- * @return 別途更新処理が必要な場合TRUEを返す
- */
-bool set_monster_invulner(MONSTER_IDX 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] = (s16b)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;
-}
-
-
-static u32b csleep_noise;
-
-/*!
- * @brief モンスターの各種状態値を時間経過により更新するサブルーチン
- * @param m_idx モンスター参照ID
- * @param mtimed_idx 更新するモンスターの時限ステータスID
- * @return なし
- */
-static void process_monsters_mtimed_aux(MONSTER_IDX m_idx, int mtimed_idx)
-{
-       monster_type *m_ptr = &m_list[m_idx];
-
-       switch (mtimed_idx)
-       {
-       case MTIMED_CSLEEP:
-       {
-               monster_race *r_ptr = &r_info[m_ptr->r_idx];
-
-               /* Assume does not wake up */
-               bool 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) <= csleep_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 (m_ptr->ml)
-                                       {
-                                               char m_name[80];
-
-                                               /* Acquire the monster name */
-                                               monster_desc(m_name, m_ptr, 0);
-
-                                               /* Dump a message */
-                                               msg_format(_("%^sが目を覚ました。", "%^s wakes up."), m_name);
-                                       }
-
-                                       if (is_original_ap_and_seen(m_ptr))
-                                       {
-                                               /* Hack -- Count the wakings */
-                                               if (r_ptr->r_wake < MAX_UCHAR) r_ptr->r_wake++;
-                                       }
-                               }
-                       }
-               }
-               break;
-       }
-
-       case MTIMED_FAST:
-               /* 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 */
-                               msg_format(_("%^sはもう加速されていない。", "%^s is no longer fast."), m_name);
-                       }
-               }
-               break;
-
-       case MTIMED_SLOW:
-               /* 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 */
-                               msg_format(_("%^sはもう減速されていない。", "%^s is no longer slow."), m_name);
-                       }
-               }
-               break;
-
-       case MTIMED_STUNNED:
-       {
-               int rlev = r_info[m_ptr->r_idx].level;
-
-               /* Recover from stun */
-               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 */
-                               msg_format(_("%^sは朦朧状態から立ち直った。", "%^s is no longer stunned."), m_name);
-                       }
-               }
-               break;
-       }
-
-       case MTIMED_CONFUSED:
-               /* Reduce the confusion */
-               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 */
-                               msg_format(_("%^sは混乱から立ち直った。", "%^s is no longer confused."), m_name);
-                       }
-               }
-               break;
-
-       case MTIMED_MONFEAR:
-               /* Reduce the fear */
-               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
-                       }
-               }
-               break;
-
-       case MTIMED_INVULNER:
-               /* 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 */
-                               msg_format(_("%^sはもう無敵でない。", "%^s is no longer invulnerable."), m_name);
-                       }
-               }
-               break;
-       }
-}
-
-
-/*!
- * @brief 全モンスターの各種状態値を時間経過により更新するメインルーチン
- * @param mtimed_idx 更新するモンスターの時限ステータスID
- * @return なし
- * @details
- * Process the counters of monsters (once per 10 game turns)\n
- * These functions are to process monsters' counters same as player's.
- */
-void process_monsters_mtimed(int mtimed_idx)
-{
-       int  i;
-       s16b *cur_mproc_list = mproc_list[mtimed_idx];
-
-       /* Hack -- calculate the "player noise" */
-       if (mtimed_idx == MTIMED_CSLEEP) csleep_noise = (1L << (30 - p_ptr->skill_stl));
-
-       /* Process the monsters (backwards) */
-       for (i = mproc_max[mtimed_idx] - 1; i >= 0; i--)
-       {
-               /* Access the monster */
-               process_monsters_mtimed_aux(cur_mproc_list[i], mtimed_idx);
-       }
-}
-
-/*!
- * @brief モンスターへの魔力消去処理
- * @param m_idx 魔力消去を受けるモンスターの参照ID
- * @return なし
- */
-void dispel_monster_status(MONSTER_IDX 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))
-       {
-               if (m_ptr->ml) msg_format(_("%sはもう無敵ではない。", "%^s is no longer invulnerable."), m_name);
-       }
-       if (set_monster_fast(m_idx, 0))
-       {
-               if (m_ptr->ml) msg_format(_("%sはもう加速されていない。", "%^s is no longer fast."), m_name);
-       }
-       if (set_monster_slow(m_idx, 0))
-       {
-               if (m_ptr->ml) msg_format(_("%sはもう減速されていない。", "%^s is no longer slow."), m_name);
-       }
-}
-
-/*!
- * @brief モンスターの時間停止処理
- * @param num 時間停止を行った敵が行動できる回数
- * @param who 時間停止処理の主体ID
- * @param vs_player TRUEならば時間停止開始処理を行う
- * @return 時間停止が行われている状態ならばTRUEを返す
- */
-bool process_the_world(int num, int who, bool vs_player)
-{
-       monster_type *m_ptr = &m_list[hack_m_idx];  /* the world monster */
-
-       if(world_monster) return (FALSE);
-
-       if(vs_player)
-       {
-               char m_name[80];
-               monster_desc(m_name, m_ptr, 0);
-
-               if (who == 1)
-                       msg_format(_("「『ザ・ワールド』!時は止まった!」", "%s yells 'The World! Time has stopped!'"), m_name);
-               else if (who == 3)
-                       msg_format(_("「時よ!」", "%s yells 'Time!'"), m_name);
-               else msg_print("hek!");
-
-               msg_print(NULL);
-       }
-
-       /* This monster cast spells */
-       world_monster = hack_m_idx;
-
-       if (vs_player) do_cmd_redraw();
-
-       while(num--)
-       {
-               if(!m_ptr->r_idx) break;
-               process_monster(world_monster);
-
-               reset_target(m_ptr);
-
-               /* Notice stuff */
-               if (p_ptr->notice) notice_stuff();
-
-               /* Update stuff */
-               if (p_ptr->update) update_stuff();
-
-               /* Redraw stuff */
-               if (p_ptr->redraw) redraw_stuff();
-
-               /* Redraw stuff */
-               if (p_ptr->window) window_stuff();
-
-               /* Delay */
-               if (vs_player) Term_xtra(TERM_XTRA_DELAY, 500);
-       }
-
-       /* Redraw map */
-       p_ptr->redraw |= (PR_MAP);
-
-       /* Update monsters */
-       p_ptr->update |= (PU_MONSTERS);
-
-       /* Window stuff */
-       p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
-
-       world_monster = 0;
-       if (vs_player || (player_has_los_bold(m_ptr->fy, m_ptr->fx) && projectable(p_ptr->y, p_ptr->x, m_ptr->fy, m_ptr->fx)))
-       {
-               msg_print(_("「時は動きだす…」", "You feel time flowing around you once more."));
-               msg_print(NULL);
-       }
-
-       handle_stuff();
-
-       return (TRUE);
-}
-
-/*!
- * @brief モンスターの経験値取得処理
- * @param m_idx 経験値を得るモンスターの参照ID
- * @param s_idx 撃破されたモンスター種族の参照ID
- * @return なし
- */
-void monster_gain_exp(MONSTER_IDX m_idx, IDX s_idx)
-{
-       monster_type *m_ptr;
-       monster_race *r_ptr;
-       monster_race *s_ptr;
-       int new_exp;
-
-       /* Paranoia */
-       if (m_idx <= 0 || s_idx <= 0) return;
-
-       m_ptr = &m_list[m_idx];
-
-       /* Paranoia -- Skip dead monsters */
-       if (!m_ptr->r_idx) return;
-
-       r_ptr = &r_info[m_ptr->r_idx];
-       s_ptr = &r_info[s_idx];
-
-       if (p_ptr->inside_battle) return;
-
-       if (!r_ptr->next_exp) return;
-
-       new_exp = s_ptr->mexp * s_ptr->level / (r_ptr->level + 2);
-       if (m_idx == p_ptr->riding) new_exp = (new_exp + 1) / 2;
-       if (!dun_level) new_exp /= 5;
-       m_ptr->exp += new_exp;
-       if (m_ptr->mflag2 & MFLAG2_CHAMELEON) return;
-
-       if (m_ptr->exp >= r_ptr->next_exp)
-       {
-               char m_name[80];
-               int old_hp = m_ptr->hp;
-               int old_maxhp = m_ptr->max_maxhp;
-               int old_r_idx = m_ptr->r_idx;
-               byte old_sub_align = m_ptr->sub_align;
-
-               /* Hack -- Reduce the racial counter of previous monster */
-               real_r_ptr(m_ptr)->cur_num--;
-
-               monster_desc(m_name, m_ptr, 0);
-               m_ptr->r_idx = r_ptr->next_r_idx;
-
-               /* Count the monsters on the level */
-               real_r_ptr(m_ptr)->cur_num++;
-
-               m_ptr->ap_r_idx = m_ptr->r_idx;
-               r_ptr = &r_info[m_ptr->r_idx];
-
-               if (r_ptr->flags1 & RF1_FORCE_MAXHP)
-               {
-                       m_ptr->max_maxhp = maxroll(r_ptr->hdice, r_ptr->hside);
-               }
-               else
-               {
-                       m_ptr->max_maxhp = damroll(r_ptr->hdice, r_ptr->hside);
-               }
-               if (ironman_nightmare)
-               {
-                       u32b hp = m_ptr->max_maxhp * 2L;
-
-                       m_ptr->max_maxhp = (s16b)MIN(30000, hp);
-               }
-               m_ptr->maxhp = m_ptr->max_maxhp;
-               m_ptr->hp = old_hp * m_ptr->maxhp / old_maxhp;
-               
-               /* dealt damage is 0 at initial*/
-               m_ptr->dealt_damage = 0;
-
-               /* Extract the monster base speed */
-               m_ptr->mspeed = get_mspeed(r_ptr);
-
-               /* Sub-alignment of a monster */
-               if (!is_pet(m_ptr) && !(r_ptr->flags3 & (RF3_EVIL | RF3_GOOD)))
-                       m_ptr->sub_align = old_sub_align;
-               else
-               {
-                       m_ptr->sub_align = SUB_ALIGN_NEUTRAL;
-                       if (r_ptr->flags3 & RF3_EVIL) m_ptr->sub_align |= SUB_ALIGN_EVIL;
-                       if (r_ptr->flags3 & RF3_GOOD) m_ptr->sub_align |= SUB_ALIGN_GOOD;
-               }
-
-               m_ptr->exp = 0;
-
-               if (is_pet(m_ptr) || m_ptr->ml)
-               {
-                       if (!ignore_unview || player_can_see_bold(m_ptr->fy, m_ptr->fx))
-                       {
-                               if (p_ptr->image)
-                               {
-                                       monster_race *hallu_race;
-
-                                       do
-                                       {
-                                               hallu_race = &r_info[randint1(max_r_idx - 1)];
-                                       }
-                                       while (!hallu_race->name || (hallu_race->flags1 & RF1_UNIQUE));
-                                       msg_format(_("%sは%sに進化した。", "%^s evolved into %s."), m_name, r_name + hallu_race->name);
-                               }
-                               else
-                               {
-                                       msg_format(_("%sは%sに進化した。", "%^s evolved into %s."), m_name, r_name + r_ptr->name);
-                               }
-                       }
-
-                       if (!p_ptr->image) r_info[old_r_idx].r_xtra1 |= MR1_SINKA;
-
-                       /* Now you feel very close to this pet. */
-                       m_ptr->parent_m_idx = 0;
-               }
-               update_mon(m_idx, FALSE);
-               lite_spot(m_ptr->fy, m_ptr->fx);
-       }
-       if (m_idx == p_ptr->riding) p_ptr->update |= PU_BONUS;
-}
diff --git a/src/monster-status.c b/src/monster-status.c
new file mode 100644 (file)
index 0000000..c41fab0
--- /dev/null
@@ -0,0 +1,868 @@
+#include "angband.h"\r
+\r
+\r
+/*!\r
+* @brief \83\82\83\93\83X\83^\81[\82Ì\8e\9e\8cÀ\83X\83e\81[\83^\83X\82ð\8eæ\93¾\82·\82é\r
+* @return m_idx \83\82\83\93\83X\83^\81[\82Ì\8eQ\8fÆID\r
+* @return mproc_type \83\82\83\93\83X\83^\81[\82Ì\8e\9e\8cÀ\83X\83e\81[\83^\83XID\r
+* @return \8ec\82è\83^\81[\83\93\92l\r
+*/\r
+int get_mproc_idx(MONSTER_IDX m_idx, int mproc_type)\r
+{\r
+       s16b *cur_mproc_list = mproc_list[mproc_type];\r
+       int i;\r
+\r
+       for (i = mproc_max[mproc_type] - 1; i >= 0; i--)\r
+       {\r
+               if (cur_mproc_list[i] == m_idx) return i;\r
+       }\r
+\r
+       return -1;\r
+}\r
+\r
+/*!\r
+* @brief \83\82\83\93\83X\83^\81[\82Ì\8e\9e\8cÀ\83X\83e\81[\83^\83X\83\8a\83X\83g\82ð\92Ç\89Á\82·\82é\r
+* @return m_idx \83\82\83\93\83X\83^\81[\82Ì\8eQ\8fÆID\r
+* @return mproc_type \92Ç\89Á\82µ\82½\82¢\83\82\83\93\83X\83^\81[\82Ì\8e\9e\8cÀ\83X\83e\81[\83^\83XID\r
+* @return \82È\82µ\r
+*/\r
+static void mproc_add(MONSTER_IDX m_idx, int mproc_type)\r
+{\r
+       if (mproc_max[mproc_type] < max_m_idx) mproc_list[mproc_type][mproc_max[mproc_type]++] = (s16b)m_idx;\r
+}\r
+\r
+\r
+/*!\r
+* @brief \83\82\83\93\83X\83^\81[\82Ì\8e\9e\8cÀ\83X\83e\81[\83^\83X\83\8a\83X\83g\82ð\8dí\8f\9c\r
+* @return m_idx \83\82\83\93\83X\83^\81[\82Ì\8eQ\8fÆID\r
+* @return mproc_type \8dí\8f\9c\82µ\82½\82¢\83\82\83\93\83X\83^\81[\82Ì\8e\9e\8cÀ\83X\83e\81[\83^\83XID\r
+* @return \82È\82µ\r
+*/\r
+static void mproc_remove(MONSTER_IDX m_idx, int mproc_type)\r
+{\r
+       int mproc_idx = get_mproc_idx(m_idx, mproc_type);\r
+       if (mproc_idx >= 0) mproc_list[mproc_type][mproc_idx] = mproc_list[mproc_type][--mproc_max[mproc_type]];\r
+}\r
+\r
+\r
+/*!\r
+* @brief \83\82\83\93\83X\83^\81[\82Ì\8e\9e\8cÀ\83X\83e\81[\83^\83X\83\8a\83X\83g\82ð\8f\89\8aú\89»\82·\82é / Initialize monster process\r
+* @return \82È\82µ\r
+*/\r
+void mproc_init(void)\r
+{\r
+       monster_type *m_ptr;\r
+       MONSTER_IDX i;\r
+       int cmi;\r
+\r
+       /* Reset "mproc_max[]" */\r
+       for (cmi = 0; cmi < MAX_MTIMED; cmi++) mproc_max[cmi] = 0;\r
+\r
+       /* Process the monsters (backwards) */\r
+       for (i = m_max - 1; i >= 1; i--)\r
+       {\r
+               /* Access the monster */\r
+               m_ptr = &m_list[i];\r
+\r
+               /* Ignore "dead" monsters */\r
+               if (!m_ptr->r_idx) continue;\r
+\r
+               for (cmi = 0; cmi < MAX_MTIMED; cmi++)\r
+               {\r
+                       if (m_ptr->mtimed[cmi]) mproc_add(i, cmi);\r
+               }\r
+       }\r
+}\r
+\r
+\r
+/*!\r
+* @brief \83\82\83\93\83X\83^\81[\82Ì\90\87\96°\8fó\91Ô\92l\82ð\83Z\83b\83g\82·\82é /\r
+* Set "m_ptr->mtimed[MTIMED_CSLEEP]", notice observable changes\r
+* @param m_idx \83\82\83\93\83X\83^\81[\8eQ\8fÆID\r
+* @param v \83Z\83b\83g\82·\82é\92l\r
+* @return \95Ê\93r\8dX\90V\8f\88\97\9d\82ª\95K\97v\82È\8fê\8d\87TRUE\82ð\95Ô\82·\r
+*/\r
+bool set_monster_csleep(MONSTER_IDX m_idx, int v)\r
+{\r
+       monster_type *m_ptr = &m_list[m_idx];\r
+       bool notice = FALSE;\r
+\r
+       /* Hack -- Force good values */\r
+       v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;\r
+\r
+       /* Open */\r
+       if (v)\r
+       {\r
+               if (!MON_CSLEEP(m_ptr))\r
+               {\r
+                       mproc_add(m_idx, MTIMED_CSLEEP);\r
+                       notice = TRUE;\r
+               }\r
+       }\r
+\r
+       /* Shut */\r
+       else\r
+       {\r
+               if (MON_CSLEEP(m_ptr))\r
+               {\r
+                       mproc_remove(m_idx, MTIMED_CSLEEP);\r
+                       notice = TRUE;\r
+               }\r
+       }\r
+\r
+       /* Use the value */\r
+       m_ptr->mtimed[MTIMED_CSLEEP] = (s16b)v;\r
+\r
+       if (!notice) return FALSE;\r
+\r
+       if (m_ptr->ml)\r
+       {\r
+               /* Update health bar as needed */\r
+               if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);\r
+               if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);\r
+       }\r
+\r
+       if (r_info[m_ptr->r_idx].flags7 & RF7_HAS_LD_MASK) p_ptr->update |= (PU_MON_LITE);\r
+\r
+       return TRUE;\r
+}\r
+\r
+\r
+/*!\r
+* @brief \83\82\83\93\83X\83^\81[\82Ì\89Á\91¬\8fó\91Ô\92l\82ð\83Z\83b\83g /\r
+* Set "m_ptr->mtimed[MTIMED_FAST]", notice observable changes\r
+* @param m_idx \83\82\83\93\83X\83^\81[\8eQ\8fÆID\r
+* @param v \83Z\83b\83g\82·\82é\92l\r
+* @return \95Ê\93r\8dX\90V\8f\88\97\9d\82ª\95K\97v\82È\8fê\8d\87TRUE\82ð\95Ô\82·\r
+*/\r
+bool set_monster_fast(MONSTER_IDX m_idx, int v)\r
+{\r
+       monster_type *m_ptr = &m_list[m_idx];\r
+       bool notice = FALSE;\r
+\r
+       /* Hack -- Force good values */\r
+       v = (v > 200) ? 200 : (v < 0) ? 0 : v;\r
+\r
+       /* Open */\r
+       if (v)\r
+       {\r
+               if (!MON_FAST(m_ptr))\r
+               {\r
+                       mproc_add(m_idx, MTIMED_FAST);\r
+                       notice = TRUE;\r
+               }\r
+       }\r
+\r
+       /* Shut */\r
+       else\r
+       {\r
+               if (MON_FAST(m_ptr))\r
+               {\r
+                       mproc_remove(m_idx, MTIMED_FAST);\r
+                       notice = TRUE;\r
+               }\r
+       }\r
+\r
+       /* Use the value */\r
+       m_ptr->mtimed[MTIMED_FAST] = (s16b)v;\r
+\r
+       if (!notice) return FALSE;\r
+\r
+       if ((p_ptr->riding == m_idx) && !p_ptr->leaving) p_ptr->update |= (PU_BONUS);\r
+\r
+       return TRUE;\r
+}\r
+\r
+\r
+/*\r
+* Set "m_ptr->mtimed[MTIMED_SLOW]", notice observable changes\r
+*/\r
+bool set_monster_slow(MONSTER_IDX m_idx, int v)\r
+{\r
+       monster_type *m_ptr = &m_list[m_idx];\r
+       bool notice = FALSE;\r
+\r
+       /* Hack -- Force good values */\r
+       v = (v > 200) ? 200 : (v < 0) ? 0 : v;\r
+\r
+       /* Open */\r
+       if (v)\r
+       {\r
+               if (!MON_SLOW(m_ptr))\r
+               {\r
+                       mproc_add(m_idx, MTIMED_SLOW);\r
+                       notice = TRUE;\r
+               }\r
+       }\r
+\r
+       /* Shut */\r
+       else\r
+       {\r
+               if (MON_SLOW(m_ptr))\r
+               {\r
+                       mproc_remove(m_idx, MTIMED_SLOW);\r
+                       notice = TRUE;\r
+               }\r
+       }\r
+\r
+       /* Use the value */\r
+       m_ptr->mtimed[MTIMED_SLOW] = (s16b)v;\r
+\r
+       if (!notice) return FALSE;\r
+\r
+       if ((p_ptr->riding == m_idx) && !p_ptr->leaving) p_ptr->update |= (PU_BONUS);\r
+\r
+       return TRUE;\r
+}\r
+\r
+\r
+/*!\r
+* @brief \83\82\83\93\83X\83^\81[\82Ì\9eN\9eO\8fó\91Ô\92l\82ð\83Z\83b\83g /\r
+* Set "m_ptr->mtimed[MTIMED_STUNNED]", notice observable changes\r
+* @param m_idx \83\82\83\93\83X\83^\81[\8eQ\8fÆID\r
+* @param v \83Z\83b\83g\82·\82é\92l\r
+* @return \95Ê\93r\8dX\90V\8f\88\97\9d\82ª\95K\97v\82È\8fê\8d\87TRUE\82ð\95Ô\82·\r
+*/\r
+bool set_monster_stunned(MONSTER_IDX m_idx, int v)\r
+{\r
+       monster_type *m_ptr = &m_list[m_idx];\r
+       bool notice = FALSE;\r
+\r
+       /* Hack -- Force good values */\r
+       v = (v > 200) ? 200 : (v < 0) ? 0 : v;\r
+\r
+       /* Open */\r
+       if (v)\r
+       {\r
+               if (!MON_STUNNED(m_ptr))\r
+               {\r
+                       mproc_add(m_idx, MTIMED_STUNNED);\r
+                       notice = TRUE;\r
+               }\r
+       }\r
+\r
+       /* Shut */\r
+       else\r
+       {\r
+               if (MON_STUNNED(m_ptr))\r
+               {\r
+                       mproc_remove(m_idx, MTIMED_STUNNED);\r
+                       notice = TRUE;\r
+               }\r
+       }\r
+\r
+       /* Use the value */\r
+       m_ptr->mtimed[MTIMED_STUNNED] = (s16b)v;\r
+\r
+       return notice;\r
+}\r
+\r
+\r
+/*!\r
+* @brief \83\82\83\93\83X\83^\81[\82Ì\8d¬\97\90\8fó\91Ô\92l\82ð\83Z\83b\83g /\r
+* Set "m_ptr->mtimed[MTIMED_CONFUSED]", notice observable changes\r
+* @param m_idx \83\82\83\93\83X\83^\81[\8eQ\8fÆID\r
+* @param v \83Z\83b\83g\82·\82é\92l\r
+* @return \95Ê\93r\8dX\90V\8f\88\97\9d\82ª\95K\97v\82È\8fê\8d\87TRUE\82ð\95Ô\82·\r
+*/\r
+bool set_monster_confused(MONSTER_IDX m_idx, int v)\r
+{\r
+       monster_type *m_ptr = &m_list[m_idx];\r
+       bool notice = FALSE;\r
+\r
+       /* Hack -- Force good values */\r
+       v = (v > 200) ? 200 : (v < 0) ? 0 : v;\r
+\r
+       /* Open */\r
+       if (v)\r
+       {\r
+               if (!MON_CONFUSED(m_ptr))\r
+               {\r
+                       mproc_add(m_idx, MTIMED_CONFUSED);\r
+                       notice = TRUE;\r
+               }\r
+       }\r
+\r
+       /* Shut */\r
+       else\r
+       {\r
+               if (MON_CONFUSED(m_ptr))\r
+               {\r
+                       mproc_remove(m_idx, MTIMED_CONFUSED);\r
+                       notice = TRUE;\r
+               }\r
+       }\r
+\r
+       /* Use the value */\r
+       m_ptr->mtimed[MTIMED_CONFUSED] = (s16b)v;\r
+\r
+       return notice;\r
+}\r
+\r
+\r
+/*!\r
+* @brief \83\82\83\93\83X\83^\81[\82Ì\8b°\8dQ\8fó\91Ô\92l\82ð\83Z\83b\83g /\r
+* Set "m_ptr->mtimed[MTIMED_MONFEAR]", notice observable changes\r
+* @param m_idx \83\82\83\93\83X\83^\81[\8eQ\8fÆID\r
+* @param v \83Z\83b\83g\82·\82é\92l\r
+* @return \95Ê\93r\8dX\90V\8f\88\97\9d\82ª\95K\97v\82È\8fê\8d\87TRUE\82ð\95Ô\82·\r
+*/\r
+bool set_monster_monfear(MONSTER_IDX m_idx, int v)\r
+{\r
+       monster_type *m_ptr = &m_list[m_idx];\r
+       bool notice = FALSE;\r
+\r
+       /* Hack -- Force good values */\r
+       v = (v > 200) ? 200 : (v < 0) ? 0 : v;\r
+\r
+       /* Open */\r
+       if (v)\r
+       {\r
+               if (!MON_MONFEAR(m_ptr))\r
+               {\r
+                       mproc_add(m_idx, MTIMED_MONFEAR);\r
+                       notice = TRUE;\r
+               }\r
+       }\r
+\r
+       /* Shut */\r
+       else\r
+       {\r
+               if (MON_MONFEAR(m_ptr))\r
+               {\r
+                       mproc_remove(m_idx, MTIMED_MONFEAR);\r
+                       notice = TRUE;\r
+               }\r
+       }\r
+\r
+       /* Use the value */\r
+       m_ptr->mtimed[MTIMED_MONFEAR] = (s16b)v;\r
+\r
+       if (!notice) return FALSE;\r
+\r
+       if (m_ptr->ml)\r
+       {\r
+               /* Update health bar as needed */\r
+               if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);\r
+               if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);\r
+       }\r
+\r
+       return TRUE;\r
+}\r
+\r
+\r
+/*!\r
+* @brief \83\82\83\93\83X\83^\81[\82Ì\96³\93G\8fó\91Ô\92l\82ð\83Z\83b\83g /\r
+* Set "m_ptr->mtimed[MTIMED_INVULNER]", notice observable changes\r
+* @param m_idx \83\82\83\93\83X\83^\81[\8eQ\8fÆID\r
+* @param v \83Z\83b\83g\82·\82é\92l\r
+* @param energy_need TRUE\82È\82ç\82Î\96³\93G\89ð\8f\9c\8e\9e\82É\8ds\93®\83^\81[\83\93\8fÁ\94ï\82ð\8ds\82¤\r
+* @return \95Ê\93r\8dX\90V\8f\88\97\9d\82ª\95K\97v\82È\8fê\8d\87TRUE\82ð\95Ô\82·\r
+*/\r
+bool set_monster_invulner(MONSTER_IDX m_idx, int v, bool energy_need)\r
+{\r
+       monster_type *m_ptr = &m_list[m_idx];\r
+       bool notice = FALSE;\r
+\r
+       /* Hack -- Force good values */\r
+       v = (v > 200) ? 200 : (v < 0) ? 0 : v;\r
+\r
+       /* Open */\r
+       if (v)\r
+       {\r
+               if (!MON_INVULNER(m_ptr))\r
+               {\r
+                       mproc_add(m_idx, MTIMED_INVULNER);\r
+                       notice = TRUE;\r
+               }\r
+       }\r
+\r
+       /* Shut */\r
+       else\r
+       {\r
+               if (MON_INVULNER(m_ptr))\r
+               {\r
+                       mproc_remove(m_idx, MTIMED_INVULNER);\r
+                       if (energy_need && !p_ptr->wild_mode) m_ptr->energy_need += ENERGY_NEED();\r
+                       notice = TRUE;\r
+               }\r
+       }\r
+\r
+       /* Use the value */\r
+       m_ptr->mtimed[MTIMED_INVULNER] = (s16b)v;\r
+\r
+       if (!notice) return FALSE;\r
+\r
+       if (m_ptr->ml)\r
+       {\r
+               /* Update health bar as needed */\r
+               if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);\r
+               if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);\r
+       }\r
+\r
+       return TRUE;\r
+}\r
+\r
+\r
+static u32b csleep_noise;\r
+\r
+/*!\r
+* @brief \83\82\83\93\83X\83^\81[\82Ì\8ae\8eí\8fó\91Ô\92l\82ð\8e\9e\8aÔ\8co\89ß\82É\82æ\82è\8dX\90V\82·\82é\83T\83u\83\8b\81[\83`\83\93\r
+* @param m_idx \83\82\83\93\83X\83^\81[\8eQ\8fÆID\r
+* @param mtimed_idx \8dX\90V\82·\82é\83\82\83\93\83X\83^\81[\82Ì\8e\9e\8cÀ\83X\83e\81[\83^\83XID\r
+* @return \82È\82µ\r
+*/\r
+static void process_monsters_mtimed_aux(MONSTER_IDX m_idx, int mtimed_idx)\r
+{\r
+       monster_type *m_ptr = &m_list[m_idx];\r
+\r
+       switch (mtimed_idx)\r
+       {\r
+       case MTIMED_CSLEEP:\r
+       {\r
+               monster_race *r_ptr = &r_info[m_ptr->r_idx];\r
+\r
+               /* Assume does not wake up */\r
+               bool test = FALSE;\r
+\r
+               /* Hack -- Require proximity */\r
+               if (m_ptr->cdis < AAF_LIMIT)\r
+               {\r
+                       /* Handle "sensing radius" */\r
+                       if (m_ptr->cdis <= (is_pet(m_ptr) ? ((r_ptr->aaf > MAX_SIGHT) ? MAX_SIGHT : r_ptr->aaf) : r_ptr->aaf))\r
+                       {\r
+                               /* We may wake up */\r
+                               test = TRUE;\r
+                       }\r
+\r
+                       /* Handle "sight" and "aggravation" */\r
+                       else if ((m_ptr->cdis <= MAX_SIGHT) && (player_has_los_bold(m_ptr->fy, m_ptr->fx)))\r
+                       {\r
+                               /* We may wake up */\r
+                               test = TRUE;\r
+                       }\r
+               }\r
+\r
+               if (test)\r
+               {\r
+                       u32b notice = randint0(1024);\r
+\r
+                       /* Nightmare monsters are more alert */\r
+                       if (ironman_nightmare) notice /= 2;\r
+\r
+                       /* Hack -- See if monster "notices" player */\r
+                       if ((notice * notice * notice) <= csleep_noise)\r
+                       {\r
+                               /* Hack -- amount of "waking" */\r
+                               /* Wake up faster near the player */\r
+                               int d = (m_ptr->cdis < AAF_LIMIT / 2) ? (AAF_LIMIT / m_ptr->cdis) : 1;\r
+\r
+                               /* Hack -- amount of "waking" is affected by speed of player */\r
+                               d = (d * SPEED_TO_ENERGY(p_ptr->pspeed)) / 10;\r
+                               if (d < 0) d = 1;\r
+\r
+                               /* Monster wakes up "a little bit" */\r
+\r
+                               /* Still asleep */\r
+                               if (!set_monster_csleep(m_idx, MON_CSLEEP(m_ptr) - d))\r
+                               {\r
+                                       /* Notice the "not waking up" */\r
+                                       if (is_original_ap_and_seen(m_ptr))\r
+                                       {\r
+                                               /* Hack -- Count the ignores */\r
+                                               if (r_ptr->r_ignore < MAX_UCHAR) r_ptr->r_ignore++;\r
+                                       }\r
+                               }\r
+\r
+                               /* Just woke up */\r
+                               else\r
+                               {\r
+                                       /* Notice the "waking up" */\r
+                                       if (m_ptr->ml)\r
+                                       {\r
+                                               char m_name[80];\r
+\r
+                                               /* Acquire the monster name */\r
+                                               monster_desc(m_name, m_ptr, 0);\r
+\r
+                                               /* Dump a message */\r
+                                               msg_format(_("%^s\82ª\96Ú\82ð\8ao\82Ü\82µ\82½\81B", "%^s wakes up."), m_name);\r
+                                       }\r
+\r
+                                       if (is_original_ap_and_seen(m_ptr))\r
+                                       {\r
+                                               /* Hack -- Count the wakings */\r
+                                               if (r_ptr->r_wake < MAX_UCHAR) r_ptr->r_wake++;\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+               break;\r
+       }\r
+\r
+       case MTIMED_FAST:\r
+               /* Reduce by one, note if expires */\r
+               if (set_monster_fast(m_idx, MON_FAST(m_ptr) - 1))\r
+               {\r
+                       if (is_seen(m_ptr))\r
+                       {\r
+                               char m_name[80];\r
+\r
+                               /* Acquire the monster name */\r
+                               monster_desc(m_name, m_ptr, 0);\r
+\r
+                               /* Dump a message */\r
+                               msg_format(_("%^s\82Í\82à\82¤\89Á\91¬\82³\82ê\82Ä\82¢\82È\82¢\81B", "%^s is no longer fast."), m_name);\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case MTIMED_SLOW:\r
+               /* Reduce by one, note if expires */\r
+               if (set_monster_slow(m_idx, MON_SLOW(m_ptr) - 1))\r
+               {\r
+                       if (is_seen(m_ptr))\r
+                       {\r
+                               char m_name[80];\r
+\r
+                               /* Acquire the monster name */\r
+                               monster_desc(m_name, m_ptr, 0);\r
+\r
+                               /* Dump a message */\r
+                               msg_format(_("%^s\82Í\82à\82¤\8c¸\91¬\82³\82ê\82Ä\82¢\82È\82¢\81B", "%^s is no longer slow."), m_name);\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case MTIMED_STUNNED:\r
+       {\r
+               int rlev = r_info[m_ptr->r_idx].level;\r
+\r
+               /* Recover from stun */\r
+               if (set_monster_stunned(m_idx, (randint0(10000) <= rlev * rlev) ? 0 : (MON_STUNNED(m_ptr) - 1)))\r
+               {\r
+                       /* Message if visible */\r
+                       if (is_seen(m_ptr))\r
+                       {\r
+                               char m_name[80];\r
+\r
+                               /* Acquire the monster name */\r
+                               monster_desc(m_name, m_ptr, 0);\r
+\r
+                               /* Dump a message */\r
+                               msg_format(_("%^s\82Í\9eN\9eO\8fó\91Ô\82©\82ç\97§\82¿\92¼\82Á\82½\81B", "%^s is no longer stunned."), m_name);\r
+                       }\r
+               }\r
+               break;\r
+       }\r
+\r
+       case MTIMED_CONFUSED:\r
+               /* Reduce the confusion */\r
+               if (set_monster_confused(m_idx, MON_CONFUSED(m_ptr) - randint1(r_info[m_ptr->r_idx].level / 20 + 1)))\r
+               {\r
+                       /* Message if visible */\r
+                       if (is_seen(m_ptr))\r
+                       {\r
+                               char m_name[80];\r
+\r
+                               /* Acquire the monster name */\r
+                               monster_desc(m_name, m_ptr, 0);\r
+\r
+                               /* Dump a message */\r
+                               msg_format(_("%^s\82Í\8d¬\97\90\82©\82ç\97§\82¿\92¼\82Á\82½\81B", "%^s is no longer confused."), m_name);\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case MTIMED_MONFEAR:\r
+               /* Reduce the fear */\r
+               if (set_monster_monfear(m_idx, MON_MONFEAR(m_ptr) - randint1(r_info[m_ptr->r_idx].level / 20 + 1)))\r
+               {\r
+                       /* Visual note */\r
+                       if (is_seen(m_ptr))\r
+                       {\r
+                               char m_name[80];\r
+#ifndef JP\r
+                               char m_poss[80];\r
+\r
+                               /* Acquire the monster possessive */\r
+                               monster_desc(m_poss, m_ptr, MD_PRON_VISIBLE | MD_POSSESSIVE);\r
+#endif\r
+\r
+                               /* Acquire the monster name */\r
+                               monster_desc(m_name, m_ptr, 0);\r
+\r
+                               /* Dump a message */\r
+#ifdef JP\r
+                               msg_format("%^s\82Í\97E\8bC\82ð\8eæ\82è\96ß\82µ\82½\81B", m_name);\r
+#else\r
+                               msg_format("%^s recovers %s courage.", m_name, m_poss);\r
+#endif\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case MTIMED_INVULNER:\r
+               /* Reduce by one, note if expires */\r
+               if (set_monster_invulner(m_idx, MON_INVULNER(m_ptr) - 1, TRUE))\r
+               {\r
+                       if (is_seen(m_ptr))\r
+                       {\r
+                               char m_name[80];\r
+\r
+                               /* Acquire the monster name */\r
+                               monster_desc(m_name, m_ptr, 0);\r
+\r
+                               /* Dump a message */\r
+                               msg_format(_("%^s\82Í\82à\82¤\96³\93G\82Å\82È\82¢\81B", "%^s is no longer invulnerable."), m_name);\r
+                       }\r
+               }\r
+               break;\r
+       }\r
+}\r
+\r
+\r
+/*!\r
+* @brief \91S\83\82\83\93\83X\83^\81[\82Ì\8ae\8eí\8fó\91Ô\92l\82ð\8e\9e\8aÔ\8co\89ß\82É\82æ\82è\8dX\90V\82·\82é\83\81\83C\83\93\83\8b\81[\83`\83\93\r
+* @param mtimed_idx \8dX\90V\82·\82é\83\82\83\93\83X\83^\81[\82Ì\8e\9e\8cÀ\83X\83e\81[\83^\83XID\r
+* @return \82È\82µ\r
+* @details\r
+* Process the counters of monsters (once per 10 game turns)\n\r
+* These functions are to process monsters' counters same as player's.\r
+*/\r
+void process_monsters_mtimed(int mtimed_idx)\r
+{\r
+       int  i;\r
+       s16b *cur_mproc_list = mproc_list[mtimed_idx];\r
+\r
+       /* Hack -- calculate the "player noise" */\r
+       if (mtimed_idx == MTIMED_CSLEEP) csleep_noise = (1L << (30 - p_ptr->skill_stl));\r
+\r
+       /* Process the monsters (backwards) */\r
+       for (i = mproc_max[mtimed_idx] - 1; i >= 0; i--)\r
+       {\r
+               /* Access the monster */\r
+               process_monsters_mtimed_aux(cur_mproc_list[i], mtimed_idx);\r
+       }\r
+}\r
+\r
+/*!\r
+* @brief \83\82\83\93\83X\83^\81[\82Ö\82Ì\96\82\97Í\8fÁ\8b\8e\8f\88\97\9d\r
+* @param m_idx \96\82\97Í\8fÁ\8b\8e\82ð\8eó\82¯\82é\83\82\83\93\83X\83^\81[\82Ì\8eQ\8fÆID\r
+* @return \82È\82µ\r
+*/\r
+void dispel_monster_status(MONSTER_IDX m_idx)\r
+{\r
+       monster_type *m_ptr = &m_list[m_idx];\r
+       char         m_name[80];\r
+\r
+       monster_desc(m_name, m_ptr, 0);\r
+       if (set_monster_invulner(m_idx, 0, TRUE))\r
+       {\r
+               if (m_ptr->ml) msg_format(_("%s\82Í\82à\82¤\96³\93G\82Å\82Í\82È\82¢\81B", "%^s is no longer invulnerable."), m_name);\r
+       }\r
+       if (set_monster_fast(m_idx, 0))\r
+       {\r
+               if (m_ptr->ml) msg_format(_("%s\82Í\82à\82¤\89Á\91¬\82³\82ê\82Ä\82¢\82È\82¢\81B", "%^s is no longer fast."), m_name);\r
+       }\r
+       if (set_monster_slow(m_idx, 0))\r
+       {\r
+               if (m_ptr->ml) msg_format(_("%s\82Í\82à\82¤\8c¸\91¬\82³\82ê\82Ä\82¢\82È\82¢\81B", "%^s is no longer slow."), m_name);\r
+       }\r
+}\r
+\r
+/*!\r
+* @brief \83\82\83\93\83X\83^\81[\82Ì\8e\9e\8aÔ\92â\8e~\8f\88\97\9d\r
+* @param num \8e\9e\8aÔ\92â\8e~\82ð\8ds\82Á\82½\93G\82ª\8ds\93®\82Å\82«\82é\89ñ\90\94\r
+* @param who \8e\9e\8aÔ\92â\8e~\8f\88\97\9d\82Ì\8eå\91ÌID\r
+* @param vs_player TRUE\82È\82ç\82Î\8e\9e\8aÔ\92â\8e~\8aJ\8en\8f\88\97\9d\82ð\8ds\82¤\r
+* @return \8e\9e\8aÔ\92â\8e~\82ª\8ds\82í\82ê\82Ä\82¢\82é\8fó\91Ô\82È\82ç\82ÎTRUE\82ð\95Ô\82·\r
+*/\r
+bool process_the_world(int num, int who, bool vs_player)\r
+{\r
+       monster_type *m_ptr = &m_list[hack_m_idx];  /* the world monster */\r
+\r
+       if (world_monster) return (FALSE);\r
+\r
+       if (vs_player)\r
+       {\r
+               char m_name[80];\r
+               monster_desc(m_name, m_ptr, 0);\r
+\r
+               if (who == 1)\r
+                       msg_format(_("\81u\81w\83U\81E\83\8f\81[\83\8b\83h\81x\81I\8e\9e\82Í\8e~\82Ü\82Á\82½\81I\81v", "%s yells 'The World! Time has stopped!'"), m_name);\r
+               else if (who == 3)\r
+                       msg_format(_("\81u\8e\9e\82æ\81I\81v", "%s yells 'Time!'"), m_name);\r
+               else msg_print("hek!");\r
+\r
+               msg_print(NULL);\r
+       }\r
+\r
+       /* This monster cast spells */\r
+       world_monster = hack_m_idx;\r
+\r
+       if (vs_player) do_cmd_redraw();\r
+\r
+       while (num--)\r
+       {\r
+               if (!m_ptr->r_idx) break;\r
+               process_monster(world_monster);\r
+\r
+               reset_target(m_ptr);\r
+\r
+               /* Notice stuff */\r
+               if (p_ptr->notice) notice_stuff();\r
+\r
+               /* Update stuff */\r
+               if (p_ptr->update) update_stuff();\r
+\r
+               /* Redraw stuff */\r
+               if (p_ptr->redraw) redraw_stuff();\r
+\r
+               /* Redraw stuff */\r
+               if (p_ptr->window) window_stuff();\r
+\r
+               /* Delay */\r
+               if (vs_player) Term_xtra(TERM_XTRA_DELAY, 500);\r
+       }\r
+\r
+       /* Redraw map */\r
+       p_ptr->redraw |= (PR_MAP);\r
+\r
+       /* Update monsters */\r
+       p_ptr->update |= (PU_MONSTERS);\r
+\r
+       /* Window stuff */\r
+       p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);\r
+\r
+       world_monster = 0;\r
+       if (vs_player || (player_has_los_bold(m_ptr->fy, m_ptr->fx) && projectable(p_ptr->y, p_ptr->x, m_ptr->fy, m_ptr->fx)))\r
+       {\r
+               msg_print(_("\81u\8e\9e\82Í\93®\82«\82¾\82·\81c\81v", "You feel time flowing around you once more."));\r
+               msg_print(NULL);\r
+       }\r
+\r
+       handle_stuff();\r
+\r
+       return (TRUE);\r
+}\r
+\r
+/*!\r
+* @brief \83\82\83\93\83X\83^\81[\82Ì\8co\8c±\92l\8eæ\93¾\8f\88\97\9d\r
+* @param m_idx \8co\8c±\92l\82ð\93¾\82é\83\82\83\93\83X\83^\81[\82Ì\8eQ\8fÆID\r
+* @param s_idx \8c\82\94j\82³\82ê\82½\83\82\83\93\83X\83^\81[\8eí\91°\82Ì\8eQ\8fÆID\r
+* @return \82È\82µ\r
+*/\r
+void monster_gain_exp(MONSTER_IDX m_idx, IDX s_idx)\r
+{\r
+       monster_type *m_ptr;\r
+       monster_race *r_ptr;\r
+       monster_race *s_ptr;\r
+       int new_exp;\r
+\r
+       /* Paranoia */\r
+       if (m_idx <= 0 || s_idx <= 0) return;\r
+\r
+       m_ptr = &m_list[m_idx];\r
+\r
+       /* Paranoia -- Skip dead monsters */\r
+       if (!m_ptr->r_idx) return;\r
+\r
+       r_ptr = &r_info[m_ptr->r_idx];\r
+       s_ptr = &r_info[s_idx];\r
+\r
+       if (p_ptr->inside_battle) return;\r
+\r
+       if (!r_ptr->next_exp) return;\r
+\r
+       new_exp = s_ptr->mexp * s_ptr->level / (r_ptr->level + 2);\r
+       if (m_idx == p_ptr->riding) new_exp = (new_exp + 1) / 2;\r
+       if (!dun_level) new_exp /= 5;\r
+       m_ptr->exp += new_exp;\r
+       if (m_ptr->mflag2 & MFLAG2_CHAMELEON) return;\r
+\r
+       if (m_ptr->exp >= r_ptr->next_exp)\r
+       {\r
+               char m_name[80];\r
+               int old_hp = m_ptr->hp;\r
+               int old_maxhp = m_ptr->max_maxhp;\r
+               int old_r_idx = m_ptr->r_idx;\r
+               byte old_sub_align = m_ptr->sub_align;\r
+\r
+               /* Hack -- Reduce the racial counter of previous monster */\r
+               real_r_ptr(m_ptr)->cur_num--;\r
+\r
+               monster_desc(m_name, m_ptr, 0);\r
+               m_ptr->r_idx = r_ptr->next_r_idx;\r
+\r
+               /* Count the monsters on the level */\r
+               real_r_ptr(m_ptr)->cur_num++;\r
+\r
+               m_ptr->ap_r_idx = m_ptr->r_idx;\r
+               r_ptr = &r_info[m_ptr->r_idx];\r
+\r
+               if (r_ptr->flags1 & RF1_FORCE_MAXHP)\r
+               {\r
+                       m_ptr->max_maxhp = maxroll(r_ptr->hdice, r_ptr->hside);\r
+               }\r
+               else\r
+               {\r
+                       m_ptr->max_maxhp = damroll(r_ptr->hdice, r_ptr->hside);\r
+               }\r
+               if (ironman_nightmare)\r
+               {\r
+                       u32b hp = m_ptr->max_maxhp * 2L;\r
+\r
+                       m_ptr->max_maxhp = (s16b)MIN(30000, hp);\r
+               }\r
+               m_ptr->maxhp = m_ptr->max_maxhp;\r
+               m_ptr->hp = old_hp * m_ptr->maxhp / old_maxhp;\r
+\r
+               /* dealt damage is 0 at initial*/\r
+               m_ptr->dealt_damage = 0;\r
+\r
+               /* Extract the monster base speed */\r
+               m_ptr->mspeed = get_mspeed(r_ptr);\r
+\r
+               /* Sub-alignment of a monster */\r
+               if (!is_pet(m_ptr) && !(r_ptr->flags3 & (RF3_EVIL | RF3_GOOD)))\r
+                       m_ptr->sub_align = old_sub_align;\r
+               else\r
+               {\r
+                       m_ptr->sub_align = SUB_ALIGN_NEUTRAL;\r
+                       if (r_ptr->flags3 & RF3_EVIL) m_ptr->sub_align |= SUB_ALIGN_EVIL;\r
+                       if (r_ptr->flags3 & RF3_GOOD) m_ptr->sub_align |= SUB_ALIGN_GOOD;\r
+               }\r
+\r
+               m_ptr->exp = 0;\r
+\r
+               if (is_pet(m_ptr) || m_ptr->ml)\r
+               {\r
+                       if (!ignore_unview || player_can_see_bold(m_ptr->fy, m_ptr->fx))\r
+                       {\r
+                               if (p_ptr->image)\r
+                               {\r
+                                       monster_race *hallu_race;\r
+\r
+                                       do\r
+                                       {\r
+                                               hallu_race = &r_info[randint1(max_r_idx - 1)];\r
+                                       } while (!hallu_race->name || (hallu_race->flags1 & RF1_UNIQUE));\r
+                                       msg_format(_("%s\82Í%s\82É\90i\89»\82µ\82½\81B", "%^s evolved into %s."), m_name, r_name + hallu_race->name);\r
+                               }\r
+                               else\r
+                               {\r
+                                       msg_format(_("%s\82Í%s\82É\90i\89»\82µ\82½\81B", "%^s evolved into %s."), m_name, r_name + r_ptr->name);\r
+                               }\r
+                       }\r
+\r
+                       if (!p_ptr->image) r_info[old_r_idx].r_xtra1 |= MR1_SINKA;\r
+\r
+                       /* Now you feel very close to this pet. */\r
+                       m_ptr->parent_m_idx = 0;\r
+               }\r
+               update_mon(m_idx, FALSE);\r
+               lite_spot(m_ptr->fy, m_ptr->fx);\r
+       }\r
+       if (m_idx == p_ptr->riding) p_ptr->update |= PU_BONUS;\r
+}\r
diff --git a/src/monster-status.h b/src/monster-status.h
new file mode 100644 (file)
index 0000000..fb3393b
--- /dev/null
@@ -0,0 +1,2 @@
+extern int get_mproc_idx(MONSTER_IDX m_idx, int mproc_type);\r
+\r
index 111ba11..d94883a 100644 (file)
@@ -13,6 +13,7 @@
 #include "angband.h"
 #include "cmd-pet.h"
 #include "monster-hook.h"
+#include "monster-status.h"
 
 #define HORDE_NOGOOD 0x01 /*!< (未実装フラグ)HORDE生成でGOODなモンスターの生成を禁止する? */
 #define HORDE_NOEVIL 0x02 /*!< (未実装フラグ)HORDE生成でEVILなモンスターの生成を禁止する? */