OSDN Git Service

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