OSDN Git Service

[Add] @return を不要に書き込んだことによる警告をひとまず置換で修正.
[hengbandforosx/hengbandosx.git] / src / player / race-resistances.cpp
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 "mind/mind-elementalist.h"
10 #include "system/object-type-definition.h"
11 #include "system/player-type-definition.h"
12 #include "util/bit-flags-calculator.h"
13
14 /*!
15  * @brief プレイヤーの職業/種族による免疫フラグを返す
16  * @param creature_ptr プレーヤーへの参照ポインタ
17  * @param flags フラグを保管する配列
18  * @todo
19  * xtra1.c周りと多重実装になっているのを何とかする
20  */
21 void player_immunity(player_type *creature_ptr, BIT_FLAGS *flags)
22 {
23     for (int i = 0; i < TR_FLAG_SIZE; i++) {
24         flags[i] = 0L;
25     }
26
27         if (player_race_has_flag(creature_ptr, TR_IM_ACID))
28         add_flag(flags, TR_RES_ACID);
29     if (player_race_has_flag(creature_ptr, TR_IM_COLD))
30         add_flag(flags, TR_RES_COLD);
31     if (player_race_has_flag(creature_ptr, TR_IM_ELEC))
32         add_flag(flags, TR_RES_ELEC);
33     if (player_race_has_flag(creature_ptr, TR_IM_FIRE))
34         add_flag(flags, TR_RES_FIRE);
35
36     if (is_specific_player_race(creature_ptr, RACE_SPECTRE))
37         add_flag(flags, TR_RES_NETHER);
38     if (player_race_has_flag(creature_ptr, TR_IM_DARK))
39         add_flag(flags, TR_RES_DARK);
40
41     if (creature_ptr->pclass == CLASS_ELEMENTALIST) {
42         if (has_element_resist(creature_ptr, ElementRealm::FIRE, 30))
43             add_flag(flags, TR_RES_FIRE);
44         if (has_element_resist(creature_ptr, ElementRealm::SKY, 30))
45             add_flag(flags, TR_RES_ELEC);
46         if (has_element_resist(creature_ptr, ElementRealm::SEA, 30))
47             add_flag(flags, TR_RES_ACID);
48         if (has_element_resist(creature_ptr, ElementRealm::ICE, 30))
49             add_flag(flags, TR_RES_COLD);
50     }
51 }
52
53
54 /*!
55  * @brief プレイヤーの一時的魔法効果による免疫フラグを返す
56  * @param creature_ptr プレーヤーへの参照ポインタ
57  * @param flags フラグを保管する配列
58  * @todo
59  * xtra1.c周りと多重実装になっているのを何とかする
60  */
61 void tim_player_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         if (creature_ptr->special_defense & DEFENSE_ACID)
67                 add_flag(flags, TR_RES_ACID);
68         if (creature_ptr->special_defense & DEFENSE_ELEC)
69                 add_flag(flags, TR_RES_ELEC);
70         if (creature_ptr->special_defense & DEFENSE_FIRE)
71                 add_flag(flags, TR_RES_FIRE);
72         if (creature_ptr->special_defense & DEFENSE_COLD)
73                 add_flag(flags, TR_RES_COLD);
74         if (creature_ptr->wraith_form)
75                 add_flag(flags, TR_RES_DARK);
76 }
77
78
79 /*!
80  * @brief プレイヤーの装備による免疫フラグを返す
81  * @param creature_ptr プレーヤーへの参照ポインタ
82  * @param flags フラグを保管する配列
83  * @todo
84  * xtra1.c周りと多重実装になっているのを何とかする
85  */
86 void known_obj_immunity(player_type *creature_ptr, BIT_FLAGS *flags)
87 {
88         for (int i = 0; i < TR_FLAG_SIZE; i++)
89                 flags[i] = 0L;
90
91         for (int i = INVEN_MAIN_HAND; i < INVEN_TOTAL; i++)
92         {
93                 u32b o_flags[TR_FLAG_SIZE];
94                 object_type *o_ptr;
95                 o_ptr = &creature_ptr->inventory_list[i];
96                 if (!o_ptr->k_idx) continue;
97
98                 object_flags_known(creature_ptr, o_ptr, o_flags);
99                 if (has_flag(o_flags, TR_IM_ACID)) add_flag(flags, TR_RES_ACID);
100                 if (has_flag(o_flags, TR_IM_ELEC)) add_flag(flags, TR_RES_ELEC);
101                 if (has_flag(o_flags, TR_IM_FIRE)) add_flag(flags, TR_RES_FIRE);
102                 if (has_flag(o_flags, TR_IM_COLD)) add_flag(flags, TR_RES_COLD);
103         }
104 }
105
106
107 /*!
108  * @brief プレイヤーの種族による弱点フラグを返す
109  * @param creature_ptr プレーヤーへの参照ポインタ
110  * @param flags フラグを保管する配列
111  * @todo
112  * xtra1.c周りと多重実装になっているのを何とかする
113  */
114 void player_vulnerability_flags(player_type *creature_ptr, BIT_FLAGS *flags)
115 {
116         for (int i = 0; i < TR_FLAG_SIZE; i++)
117                 flags[i] = 0L;
118
119         if (creature_ptr->muta.has(MUTA::VULN_ELEM) || (creature_ptr->special_defense & KATA_KOUKIJIN))
120         {
121                 add_flag(flags, TR_RES_ACID);
122                 add_flag(flags, TR_RES_ELEC);
123                 add_flag(flags, TR_RES_FIRE);
124                 add_flag(flags, TR_RES_COLD);
125         }
126
127         if (player_race_has_flag(creature_ptr, TR_VUL_ACID))
128             add_flag(flags, TR_RES_ACID);
129     if (player_race_has_flag(creature_ptr, TR_VUL_COLD))
130         add_flag(flags, TR_RES_COLD);
131     if (player_race_has_flag(creature_ptr, TR_VUL_ELEC))
132         add_flag(flags, TR_RES_ELEC);
133     if (player_race_has_flag(creature_ptr, TR_VUL_FIRE))
134         add_flag(flags, TR_RES_FIRE);
135     if (player_race_has_flag(creature_ptr, TR_VUL_LITE))
136         add_flag(flags, TR_RES_LITE);
137 }