OSDN Git Service

[Refactor] #37353 is_original_ap と is_original_ap_and_seen を monster.h へ移動.
[hengband/hengband.git] / src / monster.h
index 1ac9d4d..15d0ab0 100644 (file)
@@ -1,6 +1,107 @@
 #pragma once
 #include "monsterrace.h"
 
+typedef bool(*monsterrace_hook_type)(MONRACE_IDX r_idx);
+
+extern MONSTER_IDX hack_m_idx;
+extern MONSTER_IDX hack_m_idx_ii;
+
+/*
+ * Monster information, for a specific monster.
+ * Note: fy, fx constrain dungeon size to 256x256
+ * The "hold_o_idx" field points to the first object of a stack
+ * of objects (if any) being carried by the monster (see above).
+ */
+
+typedef struct monster_type monster_type;
+
+struct monster_type
+{
+       MONRACE_IDX r_idx;              /* Monster race index 0 = dead. */
+       MONRACE_IDX ap_r_idx;   /* Monster race appearance index */
+       byte sub_align;         /* Sub-alignment for a neutral monster */
+
+       POSITION fy;            /* Y location on map */
+       POSITION fx;            /* X location on map */
+
+       HIT_POINT hp;           /* Current Hit points */
+       HIT_POINT maxhp;                /* Max Hit points */
+       HIT_POINT max_maxhp;            /* Max Max Hit points */
+       HIT_POINT dealt_damage;         /* Sum of damages dealt by player */
+
+       TIME_EFFECT mtimed[MAX_MTIMED]; /* Timed status counter */
+
+       SPEED mspeed;           /* Monster "speed" */
+       ACTION_ENERGY energy_need;      /* Monster "energy" */
+
+       POSITION cdis;          /* Current dis from player */
+
+       BIT_FLAGS8 mflag;       /* Extra monster flags */
+#define MFLAG_VIEW      0x01    /* Monster is in line of sight */
+#define MFLAG_LOS       0x02    /* Monster is marked for project_all_los() */
+#define MFLAG_XXX2      0x04    /* (unused) */
+#define MFLAG_ETF       0x08    /* Monster is entering the field. */
+#define MFLAG_BORN      0x10    /* Monster is still being born */
+#define MFLAG_NICE      0x20    /* Monster is still being nice */
+
+       BIT_FLAGS8 mflag2;      /* Extra monster flags */
+#define MFLAG2_KAGE      0x01    /* Monster is kage */
+#define MFLAG2_NOPET     0x02    /* Cannot make monster pet */
+#define MFLAG2_NOGENO    0x04    /* Cannot genocide */
+#define MFLAG2_CHAMELEON 0x08    /* Monster is chameleon */
+#define MFLAG2_NOFLOW    0x10    /* Monster is in no_flow_by_smell mode */
+#define MFLAG2_SHOW      0x20    /* Monster is recently memorized */
+#define MFLAG2_MARK      0x40    /* Monster is currently memorized */
+
+       bool ml;                /* Monster is "visible" */
+
+       OBJECT_IDX hold_o_idx;  /* Object being held (if any) */
+
+       POSITION target_y;              /* Can attack !los player */
+       POSITION target_x;              /* Can attack !los player */
+
+       STR_OFFSET nickname;            /* Monster's Nickname */
+
+       EXP exp;
+
+       /* TODO: クローン、ペット、有効化は意義が異なるので別変数に切り離すこと。save/loadのバージョン更新が面倒そうだけど */
+       BIT_FLAGS smart; /*!< Field for "smart_learn" - Some bit-flags for the "smart" field */
+#define SM_RES_ACID             0x00000001 /*!< モンスターの学習フラグ: プレイヤーに酸耐性あり */
+#define SM_RES_ELEC             0x00000002 /*!< モンスターの学習フラグ: プレイヤーに電撃耐性あり */
+#define SM_RES_FIRE             0x00000004 /*!< モンスターの学習フラグ: プレイヤーに火炎耐性あり */
+#define SM_RES_COLD             0x00000008 /*!< モンスターの学習フラグ: プレイヤーに冷気耐性あり */
+#define SM_RES_POIS             0x00000010 /*!< モンスターの学習フラグ: プレイヤーに毒耐性あり */
+#define SM_RES_NETH             0x00000020 /*!< モンスターの学習フラグ: プレイヤーに地獄耐性あり */
+#define SM_RES_LITE             0x00000040 /*!< モンスターの学習フラグ: プレイヤーに閃光耐性あり */
+#define SM_RES_DARK             0x00000080 /*!< モンスターの学習フラグ: プレイヤーに暗黒耐性あり */
+#define SM_RES_FEAR             0x00000100 /*!< モンスターの学習フラグ: プレイヤーに恐怖耐性あり */
+#define SM_RES_CONF             0x00000200 /*!< モンスターの学習フラグ: プレイヤーに混乱耐性あり */
+#define SM_RES_CHAOS            0x00000400 /*!< モンスターの学習フラグ: プレイヤーにカオス耐性あり */
+#define SM_RES_DISEN            0x00000800 /*!< モンスターの学習フラグ: プレイヤーに劣化耐性あり */
+#define SM_RES_BLIND            0x00001000 /*!< モンスターの学習フラグ: プレイヤーに盲目耐性あり */
+#define SM_RES_NEXUS            0x00002000 /*!< モンスターの学習フラグ: プレイヤーに因果混乱耐性あり */
+#define SM_RES_SOUND            0x00004000 /*!< モンスターの学習フラグ: プレイヤーに轟音耐性あり */
+#define SM_RES_SHARD            0x00008000 /*!< モンスターの学習フラグ: プレイヤーに破片耐性あり */
+#define SM_OPP_ACID             0x00010000 /*!< モンスターの学習フラグ: プレイヤーに二重酸耐性あり */
+#define SM_OPP_ELEC             0x00020000 /*!< モンスターの学習フラグ: プレイヤーに二重電撃耐性あり */
+#define SM_OPP_FIRE             0x00040000 /*!< モンスターの学習フラグ: プレイヤーに二重火炎耐性あり */
+#define SM_OPP_COLD             0x00080000 /*!< モンスターの学習フラグ: プレイヤーに二重冷気耐性あり */
+#define SM_OPP_POIS             0x00100000 /*!< モンスターの学習フラグ: プレイヤーに二重毒耐性あり */
+#define SM_OPP_XXX1             0x00200000 /*!< 未使用 / (unused) */
+#define SM_CLONED               0x00400000 /*!< クローンである / Cloned */
+#define SM_PET                  0x00800000 /*!< ペットである / Pet */
+#define SM_IMM_ACID             0x01000000 /*!< モンスターの学習フラグ: プレイヤーに酸免疫あり */
+#define SM_IMM_ELEC             0x02000000 /*!< モンスターの学習フラグ: プレイヤーに電撃免疫あり */
+#define SM_IMM_FIRE             0x04000000 /*!< モンスターの学習フラグ: プレイヤーに火炎免疫あり */
+#define SM_IMM_COLD             0x08000000 /*!< モンスターの学習フラグ: プレイヤーに冷気免疫あり */
+#define SM_FRIENDLY             0x10000000 /*!< 友好的である / Friendly */
+#define SM_IMM_REFLECT          0x20000000 /*!< モンスターの学習フラグ: プレイヤーに反射あり */
+#define SM_IMM_FREE             0x40000000 /*!< モンスターの学習フラグ: プレイヤーに麻痺耐性あり */
+#define SM_IMM_MANA             0x80000000 /*!< モンスターの学習フラグ: プレイヤーにMPがない */
+
+       MONSTER_IDX parent_m_idx;
+};
+
 #define MON_BEGGAR        12
 #define MON_LEPER         13
 #define MON_BLACK_MARKET  14
@@ -327,6 +428,28 @@ extern concptr look_mon_desc(monster_type *m_ptr, BIT_FLAGS mode);
 extern int get_monster_crowd_number(MONSTER_IDX m_idx);
 extern void message_pain(MONSTER_IDX m_idx, HIT_POINT dam);
 
+/* monster2.c */
+extern void set_target(monster_type *m_ptr, POSITION y, POSITION x);
+extern void reset_target(monster_type *m_ptr);
+extern monster_race *real_r_ptr(monster_type *m_ptr);
+extern MONRACE_IDX real_r_idx(monster_type *m_ptr);
+extern void delete_monster_idx(MONSTER_IDX i);
+extern void delete_monster(POSITION y, POSITION x);
+extern void compact_monsters(int size);
+extern void wipe_m_list(void);
+extern MONSTER_IDX m_pop(void);
+extern errr get_mon_num_prep(monsterrace_hook_type monster_hook, monsterrace_hook_type monster_hook2);
+extern MONRACE_IDX get_mon_num(DEPTH level);
+extern int lore_do_probe(MONRACE_IDX r_idx);
+extern void lore_treasure(MONSTER_IDX m_idx, ITEM_NUMBER num_item, ITEM_NUMBER num_gold);
+extern void update_monster(MONSTER_IDX m_idx, bool full);
+extern void update_monsters(bool full);
+extern bool multiply_monster(MONSTER_IDX m_idx, bool clone, BIT_FLAGS mode);
+extern void update_smart_learn(MONSTER_IDX m_idx, int what);
+extern void choose_new_monster(MONSTER_IDX m_idx, bool born, MONRACE_IDX r_idx);
+extern SPEED get_mspeed(monster_race *r_ptr);
+extern void monster_drop_carried_objects(monster_type *m_ptr);
+
 #define is_friendly(A) \
         (bool)(((A)->smart & SM_FRIENDLY) ? TRUE : FALSE)
 
@@ -337,4 +460,11 @@ extern void message_pain(MONSTER_IDX m_idx, HIT_POINT dam);
         (bool)(((A)->smart & SM_PET) ? TRUE : FALSE)
 
 #define is_hostile(A) \
-        (bool)((is_friendly(A) || is_pet(A)) ? FALSE : TRUE)
\ No newline at end of file
+        (bool)((is_friendly(A) || is_pet(A)) ? FALSE : TRUE)
+
+/* Hack -- Determine monster race appearance index is same as race index */
+#define is_original_ap(A) \
+        (bool)(((A)->ap_r_idx == (A)->r_idx) ? TRUE : FALSE)
+
+#define is_original_ap_and_seen(A) \
+        (bool)((A)->ml && !p_ptr->image && ((A)->ap_r_idx == (A)->r_idx))
\ No newline at end of file