OSDN Git Service

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