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"
17 * @brief プレイヤーの職業/種族による免疫フラグを返す
18 * @param player_ptr プレイヤーへの参照ポインタ
19 * @param flags フラグを保管する配列
21 void player_immunity(PlayerType *player_ptr, TrFlags &flags)
25 const auto p_flags = (PlayerRace(player_ptr).tr_flags() | PlayerClass(player_ptr).tr_flags());
27 if (p_flags.has(TR_IM_ACID)) {
28 flags.set(TR_RES_ACID);
30 if (p_flags.has(TR_IM_COLD)) {
31 flags.set(TR_RES_COLD);
33 if (p_flags.has(TR_IM_ELEC)) {
34 flags.set(TR_RES_ELEC);
36 if (p_flags.has(TR_IM_FIRE)) {
37 flags.set(TR_RES_FIRE);
39 if (p_flags.has(TR_IM_DARK)) {
40 flags.set(TR_RES_DARK);
43 if (PlayerRace(player_ptr).equals(PlayerRaceType::SPECTRE)) {
44 flags.set(TR_RES_NETHER);
49 * @brief プレイヤーの一時的魔法効果による免疫フラグを返す
50 * @param player_ptr プレイヤーへの参照ポインタ
51 * @param flags フラグを保管する配列
53 void tim_player_immunity(PlayerType *player_ptr, TrFlags &flags)
57 if (player_ptr->special_defense & DEFENSE_ACID) {
58 flags.set(TR_RES_ACID);
60 if (player_ptr->special_defense & DEFENSE_ELEC) {
61 flags.set(TR_RES_ELEC);
63 if (player_ptr->special_defense & DEFENSE_FIRE) {
64 flags.set(TR_RES_FIRE);
66 if (player_ptr->special_defense & DEFENSE_COLD) {
67 flags.set(TR_RES_COLD);
69 if (player_ptr->wraith_form) {
70 flags.set(TR_RES_DARK);
75 * @brief プレイヤーの装備による免疫フラグを返す
76 * @param player_ptr プレイヤーへの参照ポインタ
77 * @param flags フラグを保管する配列
79 void known_obj_immunity(PlayerType *player_ptr, TrFlags &flags)
83 for (int i = INVEN_MAIN_HAND; i < INVEN_TOTAL; i++) {
85 o_ptr = &player_ptr->inventory_list[i];
90 auto o_flags = object_flags_known(o_ptr);
91 if (o_flags.has(TR_IM_ACID)) {
92 flags.set(TR_RES_ACID);
94 if (o_flags.has(TR_IM_ELEC)) {
95 flags.set(TR_RES_ELEC);
97 if (o_flags.has(TR_IM_FIRE)) {
98 flags.set(TR_RES_FIRE);
100 if (o_flags.has(TR_IM_COLD)) {
101 flags.set(TR_RES_COLD);
107 * @brief プレイヤーの種族による弱点フラグを返す
108 * @param player_ptr プレイヤーへの参照ポインタ
109 * @param flags フラグを保管する配列
111 void player_vulnerability_flags(PlayerType *player_ptr, TrFlags &flags)
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);
122 const auto p_flags = PlayerRace(player_ptr).tr_flags();
124 if (p_flags.has(TR_VUL_ACID)) {
125 flags.set(TR_RES_ACID);
127 if (p_flags.has(TR_VUL_COLD)) {
128 flags.set(TR_RES_COLD);
130 if (p_flags.has(TR_VUL_ELEC)) {
131 flags.set(TR_RES_ELEC);
133 if (p_flags.has(TR_VUL_FIRE)) {
134 flags.set(TR_RES_FIRE);
136 if (p_flags.has(TR_VUL_LITE)) {
137 flags.set(TR_RES_LITE);