OSDN Git Service

Merge pull request #2360 from Slimebreath6078/hotfix/breath_bug
[hengbandforosx/hengbandosx.git] / src / player / race-resistances.cpp
1 #include "player/race-resistances.h"
2 #include "inventory/inventory-slot-types.h"
3 #include "mind/mind-elementalist.h"
4 #include "mutation/mutation-flag-types.h"
5 #include "object-enchant/tr-types.h"
6 #include "object/object-flags.h"
7 #include "player-base/player-class.h"
8 #include "player-base/player-race.h"
9 #include "player-info/race-info.h"
10 #include "player-info/samurai-data-type.h"
11 #include "player/special-defense-types.h"
12 #include "system/object-type-definition.h"
13 #include "system/player-type-definition.h"
14 #include "util/bit-flags-calculator.h"
15
16 /*!
17  * @brief プレイヤーの職業/種族による免疫フラグを返す
18  * @param player_ptr プレイヤーへの参照ポインタ
19  * @param flags フラグを保管する配列
20  */
21 void player_immunity(PlayerType *player_ptr, TrFlags &flags)
22 {
23     flags.clear();
24
25     const auto p_flags = (PlayerRace(player_ptr).tr_flags() | PlayerClass(player_ptr).tr_flags());
26
27     if (p_flags.has(TR_IM_ACID)) {
28         flags.set(TR_RES_ACID);
29     }
30     if (p_flags.has(TR_IM_COLD)) {
31         flags.set(TR_RES_COLD);
32     }
33     if (p_flags.has(TR_IM_ELEC)) {
34         flags.set(TR_RES_ELEC);
35     }
36     if (p_flags.has(TR_IM_FIRE)) {
37         flags.set(TR_RES_FIRE);
38     }
39     if (p_flags.has(TR_IM_DARK)) {
40         flags.set(TR_RES_DARK);
41     }
42
43     if (PlayerRace(player_ptr).equals(PlayerRaceType::SPECTRE)) {
44         flags.set(TR_RES_NETHER);
45     }
46 }
47
48 /*!
49  * @brief プレイヤーの一時的魔法効果による免疫フラグを返す
50  * @param player_ptr プレイヤーへの参照ポインタ
51  * @param flags フラグを保管する配列
52  */
53 void tim_player_immunity(PlayerType *player_ptr, TrFlags &flags)
54 {
55     flags.clear();
56
57     if (player_ptr->special_defense & DEFENSE_ACID) {
58         flags.set(TR_RES_ACID);
59     }
60     if (player_ptr->special_defense & DEFENSE_ELEC) {
61         flags.set(TR_RES_ELEC);
62     }
63     if (player_ptr->special_defense & DEFENSE_FIRE) {
64         flags.set(TR_RES_FIRE);
65     }
66     if (player_ptr->special_defense & DEFENSE_COLD) {
67         flags.set(TR_RES_COLD);
68     }
69     if (player_ptr->wraith_form) {
70         flags.set(TR_RES_DARK);
71     }
72 }
73
74 /*!
75  * @brief プレイヤーの装備による免疫フラグを返す
76  * @param player_ptr プレイヤーへの参照ポインタ
77  * @param flags フラグを保管する配列
78  */
79 void known_obj_immunity(PlayerType *player_ptr, TrFlags &flags)
80 {
81     flags.clear();
82
83     for (int i = INVEN_MAIN_HAND; i < INVEN_TOTAL; i++) {
84         ObjectType *o_ptr;
85         o_ptr = &player_ptr->inventory_list[i];
86         if (!o_ptr->k_idx) {
87             continue;
88         }
89
90         auto o_flags = object_flags_known(o_ptr);
91         if (o_flags.has(TR_IM_ACID)) {
92             flags.set(TR_RES_ACID);
93         }
94         if (o_flags.has(TR_IM_ELEC)) {
95             flags.set(TR_RES_ELEC);
96         }
97         if (o_flags.has(TR_IM_FIRE)) {
98             flags.set(TR_RES_FIRE);
99         }
100         if (o_flags.has(TR_IM_COLD)) {
101             flags.set(TR_RES_COLD);
102         }
103     }
104 }
105
106 /*!
107  * @brief プレイヤーの種族による弱点フラグを返す
108  * @param player_ptr プレイヤーへの参照ポインタ
109  * @param flags フラグを保管する配列
110  */
111 void player_vulnerability_flags(PlayerType *player_ptr, TrFlags &flags)
112 {
113     flags.clear();
114
115     if (player_ptr->muta.has(PlayerMutationType::VULN_ELEM) || PlayerClass(player_ptr).samurai_stance_is(SamuraiStanceType::KOUKIJIN)) {
116         flags.set(TR_RES_ACID);
117         flags.set(TR_RES_ELEC);
118         flags.set(TR_RES_FIRE);
119         flags.set(TR_RES_COLD);
120     }
121
122     const auto p_flags = PlayerRace(player_ptr).tr_flags();
123
124     if (p_flags.has(TR_VUL_ACID)) {
125         flags.set(TR_RES_ACID);
126     }
127     if (p_flags.has(TR_VUL_COLD)) {
128         flags.set(TR_RES_COLD);
129     }
130     if (p_flags.has(TR_VUL_ELEC)) {
131         flags.set(TR_RES_ELEC);
132     }
133     if (p_flags.has(TR_VUL_FIRE)) {
134         flags.set(TR_RES_FIRE);
135     }
136     if (p_flags.has(TR_VUL_LITE)) {
137         flags.set(TR_RES_LITE);
138     }
139 }