OSDN Git Service

[Refactor] #40413 Changed macro function PRACE_IS_() to is_specific_player_race()
[hengband/hengband.git] / src / player / race-resistances.c
1 #include "race-resistances.h"
2 #include "player/player-races-types.h"
3 #include "object/object-flags.h"
4 #include "object-enchant/tr-types.h"
5
6 /*!
7  * @brief プレイヤーの種族による免疫フラグを返す
8  * @param creature_ptr プレーヤーへの参照ポインタ
9  * @param flags フラグを保管する配列
10  * @return なし
11  * @todo
12  * xtra1.c周りと多重実装になっているのを何とかする
13  */
14 void player_immunity(player_type *creature_ptr, BIT_FLAGS *flags)
15 {
16         for (int i = 0; i < TR_FLAG_SIZE; i++)
17                 flags[i] = 0L;
18
19         if (is_specific_player_race(creature_ptr, RACE_SPECTRE))
20                 add_flag(flags, TR_RES_NETHER);
21         if (creature_ptr->mimic_form == MIMIC_VAMPIRE || is_specific_player_race(creature_ptr, RACE_VAMPIRE))
22                 add_flag(flags, TR_RES_DARK);
23         if (creature_ptr->mimic_form == MIMIC_DEMON_LORD)
24                 add_flag(flags, TR_RES_FIRE);
25         else if (is_specific_player_race(creature_ptr, RACE_YEEK) && creature_ptr->lev > 19)
26                 add_flag(flags, TR_RES_ACID);
27 }
28
29
30 /*!
31  * @brief プレイヤーの一時的魔法効果による免疫フラグを返す
32  * @param creature_ptr プレーヤーへの参照ポインタ
33  * @param flags フラグを保管する配列
34  * @return なし
35  * @todo
36  * xtra1.c周りと多重実装になっているのを何とかする
37  */
38 void tim_player_immunity(player_type *creature_ptr, BIT_FLAGS *flags)
39 {
40         for (int i = 0; i < TR_FLAG_SIZE; i++)
41                 flags[i] = 0L;
42
43         if (creature_ptr->special_defense & DEFENSE_ACID)
44                 add_flag(flags, TR_RES_ACID);
45         if (creature_ptr->special_defense & DEFENSE_ELEC)
46                 add_flag(flags, TR_RES_ELEC);
47         if (creature_ptr->special_defense & DEFENSE_FIRE)
48                 add_flag(flags, TR_RES_FIRE);
49         if (creature_ptr->special_defense & DEFENSE_COLD)
50                 add_flag(flags, TR_RES_COLD);
51         if (creature_ptr->wraith_form)
52                 add_flag(flags, TR_RES_DARK);
53 }
54
55
56 /*!
57  * @brief プレイヤーの装備による免疫フラグを返す
58  * @param creature_ptr プレーヤーへの参照ポインタ
59  * @param flags フラグを保管する配列
60  * @return なし
61  * @todo
62  * xtra1.c周りと多重実装になっているのを何とかする
63  */
64 void known_obj_immunity(player_type *creature_ptr, BIT_FLAGS *flags)
65 {
66         for (int i = 0; i < TR_FLAG_SIZE; i++)
67                 flags[i] = 0L;
68
69         for (int i = INVEN_RARM; i < INVEN_TOTAL; i++)
70         {
71                 u32b o_flags[TR_FLAG_SIZE];
72                 object_type *o_ptr;
73                 o_ptr = &creature_ptr->inventory_list[i];
74                 if (!o_ptr->k_idx) continue;
75
76                 object_flags_known(o_ptr, o_flags);
77                 if (have_flag(o_flags, TR_IM_ACID)) add_flag(flags, TR_RES_ACID);
78                 if (have_flag(o_flags, TR_IM_ELEC)) add_flag(flags, TR_RES_ELEC);
79                 if (have_flag(o_flags, TR_IM_FIRE)) add_flag(flags, TR_RES_FIRE);
80                 if (have_flag(o_flags, TR_IM_COLD)) add_flag(flags, TR_RES_COLD);
81         }
82 }
83
84
85 /*!
86  * @brief プレイヤーの種族による弱点フラグを返す
87  * @param creature_ptr プレーヤーへの参照ポインタ
88  * @param flags フラグを保管する配列
89  * @return なし
90  * @todo
91  * xtra1.c周りと多重実装になっているのを何とかする
92  */
93 void player_vulnerability_flags(player_type *creature_ptr, BIT_FLAGS *flags)
94 {
95         for (int i = 0; i < TR_FLAG_SIZE; i++)
96                 flags[i] = 0L;
97
98         if ((creature_ptr->muta3 & MUT3_VULN_ELEM) || (creature_ptr->special_defense & KATA_KOUKIJIN))
99         {
100                 add_flag(flags, TR_RES_ACID);
101                 add_flag(flags, TR_RES_ELEC);
102                 add_flag(flags, TR_RES_FIRE);
103                 add_flag(flags, TR_RES_COLD);
104         }
105
106         if (is_specific_player_race(creature_ptr, RACE_ANDROID))
107                 add_flag(flags, TR_RES_ELEC);
108         if (is_specific_player_race(creature_ptr, RACE_ENT))
109                 add_flag(flags, TR_RES_FIRE);
110         if (is_specific_player_race(creature_ptr, RACE_VAMPIRE) || is_specific_player_race(creature_ptr, RACE_S_FAIRY) ||
111                 (creature_ptr->mimic_form == MIMIC_VAMPIRE))
112                 add_flag(flags, TR_RES_LITE);
113 }