OSDN Git Service

[Refactor] #37353 cmd4.c を cmd-dump.c に改名して関数整理.
[hengband/hengband.git] / src / monster-status.c
index 3cd495f..200a2dd 100644 (file)
@@ -1,13 +1,51 @@
 #include "angband.h"
+#include "util.h"
+
+#include "cmd-dump.h"
+#include "dungeon.h"
+#include "floor.h"
+#include "grid.h"
 #include "monster.h"
 #include "monster-status.h"
+#include "monster-spell.h"
+#include "monster-process.h"
+#include "spells.h"
 #include "spells-summon.h"
 #include "monsterrace-hook.h"
 #include "object-curse.h"
 #include "artifact.h"
 #include "avatar.h"
+#include "files.h"
+#include "player-effects.h"
+#include "view-mainwindow.h"
+#include "world.h"
+
 
+/*!
+* @brief モンスターIDからPOWERFULフラグの有無を取得する /
+* @param m_idx モンスターID
+* @return POWERFULフラグがあればTRUE、なければFALSEを返す。
+*/
+bool monster_is_powerful(MONSTER_IDX m_idx)
+{
+       monster_type *m_ptr = &current_floor_ptr->m_list[m_idx];
+       monster_race *r_ptr = &r_info[m_ptr->r_idx];
+       bool powerful = r_ptr->flags2 & RF2_POWERFUL ? TRUE : FALSE;
+       return powerful;
+}
 
+/*!
+* @brief モンスターIDからモンスターのレベルを取得する(ただし最低1を保証する) /
+* @param m_idx モンスターID
+* @return モンスターのレベル
+*/
+DEPTH monster_level_idx(MONSTER_IDX m_idx)
+{
+       monster_type *m_ptr = &current_floor_ptr->m_list[m_idx];
+       monster_race *r_ptr = &r_info[m_ptr->r_idx];
+       DEPTH rlev = ((r_ptr->level >= 1) ? r_ptr->level : 1);
+       return rlev;
+}
 
 /*!
  * @brief モンスターに与えたダメージの修正処理 /
@@ -76,7 +114,7 @@ static void get_exp_from_mon(HIT_POINT dam, monster_type *m_ptr)
        s32b div_h;
        u32b div_l;
 
-       if (!m_ptr->r_idx) return;
+       if (!monster_is_valid(m_ptr)) return;
        if (is_pet(m_ptr) || p_ptr->inside_battle) return;
 
        /*
@@ -196,13 +234,13 @@ void mproc_init(void)
        for (cmi = 0; cmi < MAX_MTIMED; cmi++) current_floor_ptr->mproc_max[cmi] = 0;
 
        /* Process the monsters (backwards) */
-       for (i = m_max - 1; i >= 1; i--)
+       for (i = current_floor_ptr->m_max - 1; i >= 1; i--)
        {
                /* Access the monster */
                m_ptr = &current_floor_ptr->m_list[i];
 
                /* Ignore "dead" monsters */
-               if (!m_ptr->r_idx) continue;
+               if (!monster_is_valid(m_ptr)) continue;
 
                for (cmi = 0; cmi < MAX_MTIMED; cmi++)
                {
@@ -213,7 +251,7 @@ void mproc_init(void)
 
 
 /*!
-* @brief モンスターの睡眠状態値をセットする /
+* @brief モンスターの睡眠状態値をセットする。0で起きる。 /
 * Set "m_ptr->mtimed[MTIMED_CSLEEP]", notice observable changes
 * @param m_idx モンスター参照ID
 * @param v セットする値
@@ -773,7 +811,7 @@ void dispel_monster_status(MONSTER_IDX m_idx)
 * @param vs_player TRUEならば時間停止開始処理を行う
 * @return 時間停止が行われている状態ならばTRUEを返す
 */
-bool process_the_world(int num, MONSTER_IDX who, bool vs_player)
+bool set_monster_timewalk(int num, MONSTER_IDX who, bool vs_player)
 {
        monster_type *m_ptr = &current_floor_ptr->m_list[hack_m_idx];  /* the world monster */
 
@@ -800,7 +838,7 @@ bool process_the_world(int num, MONSTER_IDX who, bool vs_player)
 
        while (num--)
        {
-               if (!m_ptr->r_idx) break;
+               if (!monster_is_valid(m_ptr)) break;
                process_monster(current_world_ptr->timewalk_m_idx);
                reset_target(m_ptr);
                handle_stuff();
@@ -829,20 +867,17 @@ bool process_the_world(int num, MONSTER_IDX who, bool vs_player)
 * @param s_idx 撃破されたモンスター種族の参照ID
 * @return なし
 */
-void monster_gain_exp(MONSTER_IDX m_idx, IDX s_idx)
+void monster_gain_exp(MONSTER_IDX m_idx, MONRACE_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 = &current_floor_ptr->m_list[m_idx];
 
-       /* Paranoia -- Skip dead monsters */
-       if (!m_ptr->r_idx) return;
+       if (!monster_is_valid(m_ptr)) return;
 
        r_ptr = &r_info[m_ptr->r_idx];
        s_ptr = &r_info[s_idx];
@@ -989,7 +1024,7 @@ bool mon_take_hit(MONSTER_IDX m_idx, HIT_POINT dam, bool *fear, concptr note)
        get_exp_from_mon(expdam, &exp_mon);
 
        /* Genocided by chaos patron */
-       if (!m_ptr->r_idx) m_idx = 0;
+       if (!monster_is_valid(m_ptr)) m_idx = 0;
 
        /* Redraw (later) if needed */
        if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);
@@ -1123,7 +1158,7 @@ bool mon_take_hit(MONSTER_IDX m_idx, HIT_POINT dam, bool *fear, concptr note)
 
                if (!(d_info[p_ptr->dungeon_idx].flags1 & DF1_BEGINNER))
                {
-                       if (!current_floor_ptr->dun_level && !ambush_flag && !p_ptr->inside_arena)
+                       if (!current_floor_ptr->dun_level && !p_ptr->ambush_flag && !p_ptr->inside_arena)
                        {
                                chg_virtue(V_VALOUR, -1);
                        }
@@ -1248,7 +1283,7 @@ bool mon_take_hit(MONSTER_IDX m_idx, HIT_POINT dam, bool *fear, concptr note)
                else if (!m_ptr->ml)
                {
 #ifdef JP
-                       if ((p_ptr->pseikaku == SEIKAKU_COMBAT) || (inventory[INVEN_BOW].name1 == ART_CRIMSON))
+                       if ((p_ptr->pseikaku == SEIKAKU_COMBAT) || (p_ptr->inventory_list[INVEN_BOW].name1 == ART_CRIMSON))
                                msg_format("せっかくだから%sを殺した。", m_name);
                        else
                                msg_format("%sを殺した。", m_name);
@@ -1274,7 +1309,7 @@ bool mon_take_hit(MONSTER_IDX m_idx, HIT_POINT dam, bool *fear, concptr note)
                        else
                        {
 #ifdef JP
-                               if ((p_ptr->pseikaku == SEIKAKU_COMBAT) || (inventory[INVEN_BOW].name1 == ART_CRIMSON))
+                               if ((p_ptr->pseikaku == SEIKAKU_COMBAT) || (p_ptr->inventory_list[INVEN_BOW].name1 == ART_CRIMSON))
                                        msg_format("せっかくだから%sを倒した。", m_name);
                                else
                                        msg_format("%sを倒した。", m_name);
@@ -1288,7 +1323,7 @@ bool mon_take_hit(MONSTER_IDX m_idx, HIT_POINT dam, bool *fear, concptr note)
                else
                {
 #ifdef JP
-                       if ((p_ptr->pseikaku == SEIKAKU_COMBAT) || (inventory[INVEN_BOW].name1 == ART_CRIMSON))
+                       if ((p_ptr->pseikaku == SEIKAKU_COMBAT) || (p_ptr->inventory_list[INVEN_BOW].name1 == ART_CRIMSON))
                                msg_format("せっかくだから%sを葬り去った。", m_name);
                        else
                                msg_format("%sを葬り去った。", m_name);
@@ -1381,3 +1416,7 @@ bool mon_take_hit(MONSTER_IDX m_idx, HIT_POINT dam, bool *fear, concptr note)
        return (FALSE);
 }
 
+bool monster_is_valid(monster_type *m_ptr)
+{
+       return (m_ptr->r_idx != 0);
+}
\ No newline at end of file