OSDN Git Service

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