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"
16 * @brief プレイヤーの職業/種族による免疫フラグを返す
17 * @param player_ptr プレイヤーへの参照ポインタ
18 * @param flags フラグを保管する配列
20 void player_immunity(PlayerType *player_ptr, TrFlags &flags)
24 const auto p_flags = (PlayerRace(player_ptr).tr_flags() | PlayerClass(player_ptr).tr_flags());
26 if (p_flags.has(TR_IM_ACID)) {
27 flags.set(TR_RES_ACID);
29 if (p_flags.has(TR_IM_COLD)) {
30 flags.set(TR_RES_COLD);
32 if (p_flags.has(TR_IM_ELEC)) {
33 flags.set(TR_RES_ELEC);
35 if (p_flags.has(TR_IM_FIRE)) {
36 flags.set(TR_RES_FIRE);
38 if (p_flags.has(TR_IM_DARK)) {
39 flags.set(TR_RES_DARK);
42 if (PlayerRace(player_ptr).equals(PlayerRaceType::SPECTRE)) {
43 flags.set(TR_RES_NETHER);
48 * @brief プレイヤーの一時的魔法効果による免疫フラグを返す
49 * @param player_ptr プレイヤーへの参照ポインタ
50 * @param flags フラグを保管する配列
52 void tim_player_immunity(PlayerType *player_ptr, TrFlags &flags)
56 if (player_ptr->special_defense & DEFENSE_ACID) {
57 flags.set(TR_RES_ACID);
59 if (player_ptr->special_defense & DEFENSE_ELEC) {
60 flags.set(TR_RES_ELEC);
62 if (player_ptr->special_defense & DEFENSE_FIRE) {
63 flags.set(TR_RES_FIRE);
65 if (player_ptr->special_defense & DEFENSE_COLD) {
66 flags.set(TR_RES_COLD);
68 if (player_ptr->wraith_form) {
69 flags.set(TR_RES_DARK);
74 * @brief プレイヤーの装備による免疫フラグを返す
75 * @param player_ptr プレイヤーへの参照ポインタ
76 * @param flags フラグを保管する配列
78 void known_obj_immunity(PlayerType *player_ptr, TrFlags &flags)
82 for (int i = INVEN_MAIN_HAND; i < INVEN_TOTAL; i++) {
84 o_ptr = &player_ptr->inventory_list[i];
85 if (!o_ptr->is_valid()) {
89 auto o_flags = o_ptr->get_flags_known();
90 if (o_flags.has(TR_IM_ACID)) {
91 flags.set(TR_RES_ACID);
93 if (o_flags.has(TR_IM_ELEC)) {
94 flags.set(TR_RES_ELEC);
96 if (o_flags.has(TR_IM_FIRE)) {
97 flags.set(TR_RES_FIRE);
99 if (o_flags.has(TR_IM_COLD)) {
100 flags.set(TR_RES_COLD);
106 * @brief プレイヤーの種族による弱点フラグを返す
107 * @param player_ptr プレイヤーへの参照ポインタ
108 * @param flags フラグを保管する配列
110 void player_vulnerability_flags(PlayerType *player_ptr, TrFlags &flags)
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);
121 const auto p_flags = PlayerRace(player_ptr).tr_flags();
123 if (p_flags.has(TR_VUL_ACID)) {
124 flags.set(TR_RES_ACID);
126 if (p_flags.has(TR_VUL_COLD)) {
127 flags.set(TR_RES_COLD);
129 if (p_flags.has(TR_VUL_ELEC)) {
130 flags.set(TR_RES_ELEC);
132 if (p_flags.has(TR_VUL_FIRE)) {
133 flags.set(TR_RES_FIRE);
135 if (p_flags.has(TR_VUL_LITE)) {
136 flags.set(TR_RES_LITE);