OSDN Git Service

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