OSDN Git Service

[Refactor] #2523 PlayerType::blind をPlayerBlindnessの呼び出しに差し替えた
[hengbandforosx/hengbandosx.git] / src / player / player-status-flags.cpp
1 #include "player/player-status-flags.h"
2 #include "artifact/fixed-art-types.h"
3 #include "inventory/inventory-slot-types.h"
4 #include "mind/mind-elementalist.h"
5 #include "monster-race/monster-race.h"
6 #include "monster-race/race-flags2.h"
7 #include "monster-race/race-flags7.h"
8 #include "mutation/mutation-flag-types.h"
9 #include "object-enchant/object-ego.h"
10 #include "object-enchant/tr-types.h"
11 #include "object-enchant/trc-types.h"
12 #include "object-hook/hook-weapon.h"
13 #include "object/object-flags.h"
14 #include "player-ability/player-charisma.h"
15 #include "player-ability/player-constitution.h"
16 #include "player-ability/player-dexterity.h"
17 #include "player-ability/player-intelligence.h"
18 #include "player-ability/player-strength.h"
19 #include "player-ability/player-wisdom.h"
20 #include "player-base/player-class.h"
21 #include "player-base/player-race.h"
22 #include "player-info/class-info.h"
23 #include "player-info/equipment-info.h"
24 #include "player-info/mimic-info-table.h"
25 #include "player-status/player-basic-statistics.h"
26 #include "player-status/player-hand-types.h"
27 #include "player-status/player-infravision.h"
28 #include "player-status/player-speed.h"
29 #include "player-status/player-stealth.h"
30 #include "player/attack-defense-types.h"
31 #include "player/digestion-processor.h"
32 #include "player/player-skill.h"
33 #include "player/player-status.h"
34 #include "player/race-info-table.h"
35 #include "player/special-defense-types.h"
36 #include "realm/realm-hex-numbers.h"
37 #include "realm/realm-song-numbers.h"
38 #include "realm/realm-types.h"
39 #include "spell-realm/spells-hex.h"
40 #include "spell-realm/spells-song.h"
41 #include "sv-definition/sv-weapon-types.h"
42 #include "system/floor-type-definition.h"
43 #include "system/grid-type-definition.h"
44 #include "system/monster-race-definition.h"
45 #include "system/monster-type-definition.h"
46 #include "system/object-type-definition.h"
47 #include "system/player-type-definition.h"
48 #include "timed-effect/player-blindness.h"
49 #include "timed-effect/timed-effects.h"
50 #include "util/bit-flags-calculator.h"
51 #include "util/quarks.h"
52 #include "util/string-processor.h"
53
54 namespace {
55
56 /*!
57  * @brief 指定した特性フラグが得られている要因となる flag_cause 型のうち以下の基本的な物のフラグ集合を取得する
58  * 装備品のアイテムスロット / 種族上の体得 / 職業上の体得
59  * @param tr_flag 特性フラグ
60  * @return tr_flag が得られる要因となるフラグの集合
61  */
62 BIT_FLAGS common_cause_flags(PlayerType *player_ptr, tr_type tr_flag)
63 {
64     BIT_FLAGS result = check_equipment_flags(player_ptr, tr_flag);
65
66     if (PlayerRace(player_ptr).tr_flags().has(tr_flag)) {
67         set_bits(result, FLAG_CAUSE_RACE);
68     }
69
70     if (PlayerClass(player_ptr).tr_flags().has(tr_flag)) {
71         set_bits(result, FLAG_CAUSE_CLASS);
72     }
73
74     if (PlayerClass(player_ptr).stance_tr_flags().has(tr_flag)) {
75         set_bits(result, FLAG_CAUSE_STANCE);
76     }
77
78     return result;
79 }
80
81 }
82
83 #define SPELL_SW 22
84 #define SPELL_WALL 20
85
86 BIT_FLAGS convert_inventory_slot_type_to_flag_cause(inventory_slot_type inventory_slot)
87 {
88     switch (inventory_slot) {
89     case INVEN_MAIN_HAND:
90         return FLAG_CAUSE_INVEN_MAIN_HAND;
91     case INVEN_SUB_HAND:
92         return FLAG_CAUSE_INVEN_SUB_HAND;
93     case INVEN_BOW:
94         return FLAG_CAUSE_INVEN_BOW;
95     case INVEN_MAIN_RING:
96         return FLAG_CAUSE_INVEN_MAIN_RING;
97     case INVEN_SUB_RING:
98         return FLAG_CAUSE_INVEN_SUB_RING;
99     case INVEN_NECK:
100         return FLAG_CAUSE_INVEN_NECK;
101     case INVEN_LITE:
102         return FLAG_CAUSE_INVEN_LITE;
103     case INVEN_BODY:
104         return FLAG_CAUSE_INVEN_BODY;
105     case INVEN_OUTER:
106         return FLAG_CAUSE_INVEN_OUTER;
107     case INVEN_HEAD:
108         return FLAG_CAUSE_INVEN_HEAD;
109     case INVEN_ARMS:
110         return FLAG_CAUSE_INVEN_ARMS;
111     case INVEN_FEET:
112         return FLAG_CAUSE_INVEN_FEET;
113
114     default:
115         return 0;
116     }
117 }
118
119 /*!
120  * @brief 装備による所定の特性フラグを得ているかを一括して取得する関数。
121  */
122 BIT_FLAGS check_equipment_flags(PlayerType *player_ptr, tr_type tr_flag)
123 {
124     ObjectType *o_ptr;
125     BIT_FLAGS result = 0L;
126     for (int i = INVEN_MAIN_HAND; i < INVEN_TOTAL; i++) {
127         o_ptr = &player_ptr->inventory_list[i];
128         if (!o_ptr->k_idx) {
129             continue;
130         }
131
132         auto flgs = object_flags(o_ptr);
133
134         if (flgs.has(tr_flag)) {
135             set_bits(result, convert_inventory_slot_type_to_flag_cause(i2enum<inventory_slot_type>(i)));
136         }
137     }
138     return result;
139 }
140
141 BIT_FLAGS player_flags_brand_pois(PlayerType *player_ptr)
142 {
143     BIT_FLAGS result = common_cause_flags(player_ptr, TR_BRAND_POIS);
144
145     if (player_ptr->special_attack & ATTACK_POIS) {
146         set_bits(result, FLAG_CAUSE_MAGIC_TIME_EFFECT);
147     }
148
149     return result;
150 }
151
152 BIT_FLAGS player_flags_brand_acid(PlayerType *player_ptr)
153 {
154     BIT_FLAGS result = common_cause_flags(player_ptr, TR_BRAND_ACID);
155
156     if (player_ptr->special_attack & ATTACK_ACID) {
157         set_bits(result, FLAG_CAUSE_MAGIC_TIME_EFFECT);
158     }
159
160     return result;
161 }
162
163 BIT_FLAGS player_flags_brand_elec(PlayerType *player_ptr)
164 {
165     BIT_FLAGS result = common_cause_flags(player_ptr, TR_BRAND_ELEC);
166
167     if (player_ptr->special_attack & ATTACK_ELEC) {
168         set_bits(result, FLAG_CAUSE_MAGIC_TIME_EFFECT);
169     }
170
171     return result;
172 }
173
174 BIT_FLAGS player_flags_brand_fire(PlayerType *player_ptr)
175 {
176     BIT_FLAGS result = common_cause_flags(player_ptr, TR_BRAND_FIRE);
177
178     if (player_ptr->special_attack & ATTACK_FIRE) {
179         set_bits(result, FLAG_CAUSE_MAGIC_TIME_EFFECT);
180     }
181
182     return result;
183 }
184
185 BIT_FLAGS player_flags_brand_cold(PlayerType *player_ptr)
186 {
187     BIT_FLAGS result = common_cause_flags(player_ptr, TR_BRAND_COLD);
188
189     if (player_ptr->special_attack & ATTACK_COLD) {
190         set_bits(result, FLAG_CAUSE_MAGIC_TIME_EFFECT);
191     }
192
193     return result;
194 }
195
196 /*!
197  * @brief プレイヤーの所持するフラグのうち、tr_flagに対応するものを返す
198  * @param player_ptr プレイヤーへの参照ポインタ
199  * @param tr_flag 要求する装備フラグ
200  */
201 BIT_FLAGS get_player_flags(PlayerType *player_ptr, tr_type tr_flag)
202 {
203     switch (tr_flag) {
204     case TR_STR:
205         return PlayerStrength(player_ptr).get_all_flags();
206     case TR_INT:
207         return PlayerIntelligence(player_ptr).get_all_flags();
208     case TR_WIS:
209         return PlayerWisdom(player_ptr).get_all_flags();
210     case TR_DEX:
211         return PlayerDexterity(player_ptr).get_all_flags();
212     case TR_CON:
213         return PlayerConstitution(player_ptr).get_all_flags();
214     case TR_CHR:
215         return PlayerCharisma(player_ptr).get_all_flags();
216     case TR_MAGIC_MASTERY:
217         return has_magic_mastery(player_ptr);
218     case TR_FORCE_WEAPON:
219         return check_equipment_flags(player_ptr, tr_flag);
220     case TR_STEALTH:
221         return PlayerStealth(player_ptr).get_all_flags();
222     case TR_SEARCH:
223         return 0;
224     case TR_INFRA:
225         return PlayerInfravision(player_ptr).get_all_flags();
226     case TR_TUNNEL:
227         return 0;
228     case TR_SPEED:
229         return PlayerSpeed(player_ptr).get_all_flags();
230     case TR_BLOWS:
231         return 0;
232     case TR_CHAOTIC:
233     case TR_VAMPIRIC:
234     case TR_SLAY_ANIMAL:
235     case TR_SLAY_EVIL:
236     case TR_SLAY_UNDEAD:
237     case TR_SLAY_DEMON:
238     case TR_SLAY_ORC:
239     case TR_SLAY_TROLL:
240     case TR_SLAY_GIANT:
241     case TR_SLAY_DRAGON:
242     case TR_KILL_DRAGON:
243     case TR_VORPAL:
244         return check_equipment_flags(player_ptr, tr_flag);
245     case TR_EARTHQUAKE:
246         return has_earthquake(player_ptr);
247     case TR_BRAND_POIS:
248         return player_flags_brand_pois(player_ptr);
249     case TR_BRAND_ACID:
250         return player_flags_brand_acid(player_ptr);
251     case TR_BRAND_ELEC:
252         return player_flags_brand_elec(player_ptr);
253     case TR_BRAND_FIRE:
254         return player_flags_brand_fire(player_ptr);
255     case TR_BRAND_COLD:
256         return player_flags_brand_cold(player_ptr);
257
258     case TR_SUST_STR:
259         return has_sustain_str(player_ptr);
260     case TR_SUST_INT:
261         return has_sustain_int(player_ptr);
262     case TR_SUST_WIS:
263         return has_sustain_wis(player_ptr);
264     case TR_SUST_DEX:
265         return has_sustain_dex(player_ptr);
266     case TR_SUST_CON:
267         return has_sustain_con(player_ptr);
268     case TR_SUST_CHR:
269         return has_sustain_chr(player_ptr);
270     case TR_RIDING:
271         return check_equipment_flags(player_ptr, tr_flag);
272     case TR_EASY_SPELL:
273         return has_easy_spell(player_ptr);
274     case TR_IM_ACID:
275         return has_immune_acid(player_ptr);
276     case TR_IM_ELEC:
277         return has_immune_elec(player_ptr);
278     case TR_IM_FIRE:
279         return has_immune_fire(player_ptr);
280     case TR_IM_COLD:
281         return has_immune_cold(player_ptr);
282     case TR_THROW:
283         return check_equipment_flags(player_ptr, tr_flag);
284     case TR_REFLECT:
285         return has_reflect(player_ptr);
286     case TR_FREE_ACT:
287         return has_free_act(player_ptr);
288     case TR_HOLD_EXP:
289         return has_hold_exp(player_ptr);
290     case TR_RES_ACID:
291         return has_resist_acid(player_ptr);
292     case TR_RES_ELEC:
293         return has_resist_elec(player_ptr);
294     case TR_RES_FIRE:
295         return has_resist_fire(player_ptr);
296     case TR_RES_COLD:
297         return has_resist_cold(player_ptr);
298     case TR_RES_POIS:
299         return has_resist_pois(player_ptr);
300     case TR_RES_FEAR:
301         return has_resist_fear(player_ptr);
302     case TR_RES_LITE:
303         return has_resist_lite(player_ptr);
304     case TR_RES_DARK:
305         return has_resist_dark(player_ptr);
306     case TR_RES_BLIND:
307         return has_resist_blind(player_ptr);
308     case TR_RES_CONF:
309         return has_resist_conf(player_ptr);
310     case TR_RES_SOUND:
311         return has_resist_sound(player_ptr);
312     case TR_RES_SHARDS:
313         return has_resist_shard(player_ptr);
314     case TR_RES_NETHER:
315         return has_resist_neth(player_ptr);
316     case TR_RES_NEXUS:
317         return has_resist_nexus(player_ptr);
318     case TR_RES_CHAOS:
319         return has_resist_chaos(player_ptr);
320     case TR_RES_DISEN:
321         return has_resist_disen(player_ptr);
322     case TR_RES_TIME:
323         return has_resist_time(player_ptr);
324     case TR_RES_WATER:
325         return has_resist_water(player_ptr);
326     case TR_RES_CURSE:
327         return has_resist_curse(player_ptr);
328
329     case TR_SH_FIRE:
330         return has_sh_fire(player_ptr);
331     case TR_SH_ELEC:
332         return has_sh_elec(player_ptr);
333     case TR_SLAY_HUMAN:
334         return check_equipment_flags(player_ptr, tr_flag);
335     case TR_SH_COLD:
336         return has_sh_cold(player_ptr);
337     case TR_NO_TELE:
338         return has_anti_tele(player_ptr);
339     case TR_NO_MAGIC:
340         return has_anti_magic(player_ptr);
341     case TR_DEC_MANA:
342         return has_dec_mana(player_ptr);
343     case TR_TY_CURSE:
344         return check_equipment_flags(player_ptr, tr_flag);
345     case TR_WARNING:
346         return has_warning(player_ptr);
347     case TR_HIDE_TYPE:
348     case TR_SHOW_MODS:
349     case TR_SLAY_GOOD:
350         return check_equipment_flags(player_ptr, tr_flag);
351     case TR_LEVITATION:
352         return has_levitation(player_ptr);
353     case TR_LITE_1:
354         return has_lite(player_ptr);
355     case TR_SEE_INVIS:
356         return has_see_inv(player_ptr);
357     case TR_TELEPATHY:
358         return has_esp_telepathy(player_ptr);
359     case TR_SLOW_DIGEST:
360         return has_slow_digest(player_ptr);
361     case TR_REGEN:
362         return has_regenerate(player_ptr);
363     case TR_XTRA_MIGHT:
364         return has_xtra_might(player_ptr);
365     case TR_XTRA_SHOTS:
366     case TR_IGNORE_ACID:
367     case TR_IGNORE_ELEC:
368     case TR_IGNORE_FIRE:
369     case TR_IGNORE_COLD:
370     case TR_ACTIVATE:
371     case TR_DRAIN_EXP:
372     case TR_TELEPORT:
373         return check_equipment_flags(player_ptr, tr_flag);
374     case TR_AGGRAVATE:
375         return 0;
376     case TR_BLESSED:
377         return has_bless_blade(player_ptr);
378     case TR_XXX_93:
379     case TR_XXX_94:
380     case TR_KILL_GOOD:
381     case TR_KILL_ANIMAL:
382     case TR_KILL_EVIL:
383     case TR_KILL_UNDEAD:
384     case TR_KILL_DEMON:
385     case TR_KILL_ORC:
386     case TR_KILL_TROLL:
387     case TR_KILL_GIANT:
388     case TR_KILL_HUMAN:
389         return check_equipment_flags(player_ptr, tr_flag);
390     case TR_ESP_ANIMAL:
391         return has_esp_animal(player_ptr);
392     case TR_ESP_UNDEAD:
393         return has_esp_undead(player_ptr);
394     case TR_ESP_DEMON:
395         return has_esp_demon(player_ptr);
396     case TR_ESP_ORC:
397         return has_esp_orc(player_ptr);
398     case TR_ESP_TROLL:
399         return has_esp_troll(player_ptr);
400     case TR_ESP_GIANT:
401         return has_esp_giant(player_ptr);
402     case TR_ESP_DRAGON:
403         return has_esp_dragon(player_ptr);
404     case TR_ESP_HUMAN:
405         return has_esp_human(player_ptr);
406     case TR_ESP_EVIL:
407         return has_esp_evil(player_ptr);
408     case TR_ESP_GOOD:
409         return has_esp_good(player_ptr);
410     case TR_ESP_NONLIVING:
411         return has_esp_nonliving(player_ptr);
412     case TR_ESP_UNIQUE:
413         return has_esp_unique(player_ptr);
414     case TR_FULL_NAME:
415     case TR_FIXED_FLAVOR:
416     case TR_ADD_L_CURSE:
417     case TR_ADD_H_CURSE:
418     case TR_DRAIN_HP:
419     case TR_DRAIN_MANA:
420     case TR_LITE_2:
421     case TR_LITE_3:
422     case TR_LITE_M1:
423     case TR_LITE_M2:
424     case TR_LITE_M3:
425     case TR_LITE_FUEL:
426     case TR_CALL_ANIMAL:
427     case TR_CALL_DEMON:
428     case TR_CALL_DRAGON:
429     case TR_CALL_UNDEAD:
430     case TR_COWARDICE:
431     case TR_LOW_MELEE:
432     case TR_LOW_AC:
433     case TR_HARD_SPELL:
434     case TR_FAST_DIGEST:
435     case TR_SLOW_REGEN:
436         return check_equipment_flags(player_ptr, tr_flag);
437     case TR_MIGHTY_THROW:
438         return has_mighty_throw(player_ptr);
439     case TR_EASY2_WEAPON:
440         return has_easy2_weapon(player_ptr);
441     case TR_DOWN_SAVING:
442         return has_down_saving(player_ptr);
443     case TR_NO_AC:
444         return has_no_ac(player_ptr);
445     case TR_HEAVY_SPELL:
446         return has_heavy_spell(player_ptr);
447     case TR_INVULN_ARROW:
448         return has_invuln_arrow(player_ptr);
449     case TR_DARK_SOURCE:
450     case TR_SUPPORTIVE:
451     case TR_BERS_RAGE:
452     case TR_BRAND_MAGIC:
453         return check_equipment_flags(player_ptr, tr_flag);
454     case TR_IMPACT:
455         return has_impact(player_ptr);
456     case TR_VUL_ACID:
457         return has_vuln_acid(player_ptr);
458     case TR_VUL_COLD:
459         return has_vuln_cold(player_ptr);
460     case TR_VUL_ELEC:
461         return has_vuln_elec(player_ptr);
462     case TR_VUL_FIRE:
463         return has_vuln_fire(player_ptr);
464     case TR_VUL_LITE:
465         return has_vuln_lite(player_ptr);
466     case TR_IM_DARK:
467         return has_immune_dark(player_ptr);
468     case TR_SELF_FIRE:
469     case TR_SELF_COLD:
470     case TR_SELF_ELEC:
471     case TR_PERSISTENT_CURSE:
472         return check_equipment_flags(player_ptr, tr_flag);
473     case TR_VUL_CURSE:
474         return has_vuln_curse(player_ptr);
475
476     case TR_FLAG_MAX:
477         break;
478     }
479     return 0;
480 }
481
482 /*!
483  * @brief プレイヤーが壁破壊進行を持っているかを返す。
484  */
485 bool has_kill_wall(PlayerType *player_ptr)
486 {
487     if (player_ptr->mimic_form == MimicKindType::DEMON_LORD || music_singing(player_ptr, MUSIC_WALL)) {
488         return true;
489     }
490
491     if (player_ptr->riding) {
492         monster_type *riding_m_ptr = &player_ptr->current_floor_ptr->m_list[player_ptr->riding];
493         monster_race *riding_r_ptr = &r_info[riding_m_ptr->r_idx];
494         if (riding_r_ptr->feature_flags.has(MonsterFeatureType::KILL_WALL)) {
495             return true;
496         }
497     }
498
499     return false;
500 }
501
502 /*!
503  * @brief プレイヤーが壁通過を持っているかを返す。
504  * @param player_ptr プレイヤーへの参照ポインタ
505  * @return 持っていたらTRUE
506  * @details
507  * * 時限で幽体化、壁抜けをもつか種族幽霊ならばひとまずTRUE。
508  * * 但し騎乗中は乗騎が壁抜けを持っていなければ不能になる。
509  */
510 bool has_pass_wall(PlayerType *player_ptr)
511 {
512     bool pow = false;
513
514     if (player_ptr->wraith_form || player_ptr->tim_pass_wall || PlayerRace(player_ptr).equals(PlayerRaceType::SPECTRE)) {
515         pow = true;
516     }
517
518     if (player_ptr->riding) {
519         monster_type *riding_m_ptr = &player_ptr->current_floor_ptr->m_list[player_ptr->riding];
520         monster_race *riding_r_ptr = &r_info[riding_m_ptr->r_idx];
521         if (riding_r_ptr->feature_flags.has_not(MonsterFeatureType::PASS_WALL)) {
522             pow = false;
523         }
524     }
525
526     return pow;
527 }
528
529 /*!
530  * @brief プレイヤーが強力射を持っているかを返す。
531  * @param player_ptr プレイヤーへの参照ポインタ
532  * @return 持っていたら所持前提ビットフラグを返す。
533  */
534 BIT_FLAGS has_xtra_might(PlayerType *player_ptr)
535 {
536     return common_cause_flags(player_ptr, TR_XTRA_MIGHT);
537 }
538
539 /*!
540  * @brief プレイヤーが邪悪感知を持っているかを返す。
541  * @param player_ptr プレイヤーへの参照ポインタ
542  * @return 持っていたら所持前提ビットフラグを返す。
543  */
544 BIT_FLAGS has_esp_evil(PlayerType *player_ptr)
545 {
546     BIT_FLAGS result = common_cause_flags(player_ptr, TR_ESP_EVIL);
547     if (player_ptr->realm1 == REALM_HEX) {
548         if (SpellHex(player_ptr).is_spelling_specific(HEX_DETECT_EVIL)) {
549             result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
550         }
551     }
552     return result;
553 }
554
555 /*!
556  * @brief プレイヤーが自然界の動物感知を持っているかを返す。
557  * @param player_ptr プレイヤーへの参照ポインタ
558  * @return 持っていたら所持前提ビットフラグを返す。
559  */
560 BIT_FLAGS has_esp_animal(PlayerType *player_ptr)
561 {
562     return common_cause_flags(player_ptr, TR_ESP_ANIMAL);
563 }
564
565 /*!
566  * @brief プレイヤーがアンデッド感知を持っているかを返す。
567  * @param player_ptr プレイヤーへの参照ポインタ
568  * @return 持っていたら所持前提ビットフラグを返す。
569  */
570 BIT_FLAGS has_esp_undead(PlayerType *player_ptr)
571 {
572     return common_cause_flags(player_ptr, TR_ESP_UNDEAD);
573 }
574
575 /*!
576  * @brief プレイヤーが悪魔感知を持っているかを返す。
577  * @param player_ptr プレイヤーへの参照ポインタ
578  * @return 持っていたら所持前提ビットフラグを返す。
579  */
580 BIT_FLAGS has_esp_demon(PlayerType *player_ptr)
581 {
582     return common_cause_flags(player_ptr, TR_ESP_DEMON);
583 }
584
585 /*!
586  * @brief プレイヤーがオーク感知を持っているかを返す。
587  * @param player_ptr プレイヤーへの参照ポインタ
588  * @return 持っていたら所持前提ビットフラグを返す。
589  */
590 BIT_FLAGS has_esp_orc(PlayerType *player_ptr)
591 {
592     return common_cause_flags(player_ptr, TR_ESP_ORC);
593 }
594
595 /*!
596  * @brief プレイヤーがトロル感知を持っているかを返す。
597  * @param player_ptr プレイヤーへの参照ポインタ
598  * @return 持っていたら所持前提ビットフラグを返す。
599  */
600 BIT_FLAGS has_esp_troll(PlayerType *player_ptr)
601 {
602     return common_cause_flags(player_ptr, TR_ESP_TROLL);
603 }
604
605 /*!
606  * @brief プレイヤーが巨人感知を持っているかを返す。
607  * @param player_ptr プレイヤーへの参照ポインタ
608  * @return 持っていたら所持前提ビットフラグを返す。
609  */
610 BIT_FLAGS has_esp_giant(PlayerType *player_ptr)
611 {
612     return common_cause_flags(player_ptr, TR_ESP_GIANT);
613 }
614
615 /*!
616  * @brief プレイヤーがドラゴン感知を持っているかを返す。
617  * @param player_ptr プレイヤーへの参照ポインタ
618  * @return 持っていたら所持前提ビットフラグを返す。
619  */
620 BIT_FLAGS has_esp_dragon(PlayerType *player_ptr)
621 {
622     return common_cause_flags(player_ptr, TR_ESP_DRAGON);
623 }
624
625 /*!
626  * @brief プレイヤーが人間感知を持っているかを返す。
627  * @param player_ptr プレイヤーへの参照ポインタ
628  * @return 持っていたら所持前提ビットフラグを返す。
629  */
630 BIT_FLAGS has_esp_human(PlayerType *player_ptr)
631 {
632     return common_cause_flags(player_ptr, TR_ESP_HUMAN);
633 }
634
635 /*!
636  * @brief プレイヤーが善良感知を持っているかを返す。
637  * @param player_ptr プレイヤーへの参照ポインタ
638  * @return 持っていたら所持前提ビットフラグを返す。
639  */
640 BIT_FLAGS has_esp_good(PlayerType *player_ptr)
641 {
642     return common_cause_flags(player_ptr, TR_ESP_GOOD);
643 }
644
645 /*!
646  * @brief プレイヤーが無生物感知を持っているかを返す。
647  * @param player_ptr プレイヤーへの参照ポインタ
648  * @return 持っていたら所持前提ビットフラグを返す。
649  */
650 BIT_FLAGS has_esp_nonliving(PlayerType *player_ptr)
651 {
652     return common_cause_flags(player_ptr, TR_ESP_NONLIVING);
653 }
654
655 /*!
656  * @brief プレイヤーがユニーク感知を持っているかを返す。
657  * @param player_ptr プレイヤーへの参照ポインタ
658  * @return 持っていたら所持前提ビットフラグを返す。
659  */
660 BIT_FLAGS has_esp_unique(PlayerType *player_ptr)
661 {
662     return common_cause_flags(player_ptr, TR_ESP_UNIQUE);
663 }
664
665 /*!
666  * @brief プレイヤーがテレパシーを持っているかを返す。
667  * @param player_ptr プレイヤーへの参照ポインタ
668  * @return 持っていたら所持前提ビットフラグを返す。
669  */
670 BIT_FLAGS has_esp_telepathy(PlayerType *player_ptr)
671 {
672     BIT_FLAGS result = common_cause_flags(player_ptr, TR_TELEPATHY);
673
674     if (is_time_limit_esp(player_ptr) || player_ptr->ult_res) {
675         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
676     }
677
678     if (player_ptr->muta.has(PlayerMutationType::ESP)) {
679         result |= FLAG_CAUSE_MUTATION;
680     }
681
682     return result;
683 }
684
685 BIT_FLAGS has_bless_blade(PlayerType *player_ptr)
686 {
687     return common_cause_flags(player_ptr, TR_BLESSED);
688 }
689
690 BIT_FLAGS has_easy2_weapon(PlayerType *player_ptr)
691 {
692     return common_cause_flags(player_ptr, TR_EASY2_WEAPON);
693 }
694
695 BIT_FLAGS has_down_saving(PlayerType *player_ptr)
696 {
697     return common_cause_flags(player_ptr, TR_DOWN_SAVING);
698 }
699
700 BIT_FLAGS has_no_ac(PlayerType *player_ptr)
701 {
702     return common_cause_flags(player_ptr, TR_NO_AC);
703 }
704
705 BIT_FLAGS has_invuln_arrow(PlayerType *player_ptr)
706 {
707     if (player_ptr->effects()->blindness()->is_blind()) {
708         return 0;
709     }
710
711     return common_cause_flags(player_ptr, TR_INVULN_ARROW);
712 }
713
714 void check_no_flowed(PlayerType *player_ptr)
715 {
716     ObjectType *o_ptr;
717     bool has_sw = false, has_kabe = false;
718
719     player_ptr->no_flowed = false;
720
721     if (has_pass_wall(player_ptr) && !has_kill_wall(player_ptr)) {
722         player_ptr->no_flowed = true;
723         return;
724     }
725
726     if (!player_ptr->realm1) {
727         player_ptr->no_flowed = false;
728         return;
729     }
730
731     for (int i = 0; i < INVEN_PACK; i++) {
732         if ((player_ptr->inventory_list[i].tval == ItemKindType::NATURE_BOOK) && (player_ptr->inventory_list[i].sval == 2)) {
733             has_sw = true;
734         }
735         if ((player_ptr->inventory_list[i].tval == ItemKindType::CRAFT_BOOK) && (player_ptr->inventory_list[i].sval == 2)) {
736             has_kabe = true;
737         }
738     }
739
740     for (const auto this_o_idx : player_ptr->current_floor_ptr->grid_array[player_ptr->y][player_ptr->x].o_idx_list) {
741         o_ptr = &player_ptr->current_floor_ptr->o_list[this_o_idx];
742
743         if ((o_ptr->tval == ItemKindType::NATURE_BOOK) && (o_ptr->sval == 2)) {
744             has_sw = true;
745         }
746         if ((o_ptr->tval == ItemKindType::CRAFT_BOOK) && (o_ptr->sval == 2)) {
747             has_kabe = true;
748         }
749     }
750
751     PlayerClass pc(player_ptr);
752     if (has_sw && ((player_ptr->realm1 == REALM_NATURE) || (player_ptr->realm2 == REALM_NATURE) || pc.equals(PlayerClassType::SORCERER))) {
753         const magic_type *s_ptr = &mp_ptr->info[REALM_NATURE - 1][SPELL_SW];
754         if (player_ptr->lev >= s_ptr->slevel) {
755             player_ptr->no_flowed = true;
756         }
757     }
758
759     if (has_kabe && ((player_ptr->realm1 == REALM_CRAFT) || (player_ptr->realm2 == REALM_CRAFT) || pc.equals(PlayerClassType::SORCERER))) {
760         const magic_type *s_ptr = &mp_ptr->info[REALM_CRAFT - 1][SPELL_WALL];
761         if (player_ptr->lev >= s_ptr->slevel) {
762             player_ptr->no_flowed = true;
763         }
764     }
765 }
766
767 BIT_FLAGS has_mighty_throw(PlayerType *player_ptr)
768 {
769     return common_cause_flags(player_ptr, TR_MIGHTY_THROW);
770 }
771
772 BIT_FLAGS has_dec_mana(PlayerType *player_ptr)
773 {
774     return common_cause_flags(player_ptr, TR_DEC_MANA);
775 }
776
777 BIT_FLAGS has_reflect(PlayerType *player_ptr)
778 {
779     BIT_FLAGS result = common_cause_flags(player_ptr, TR_REFLECT);
780
781     if (player_ptr->ult_res || player_ptr->wraith_form || player_ptr->magicdef || player_ptr->tim_reflect) {
782         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
783     }
784
785     return result;
786 }
787
788 BIT_FLAGS has_see_nocto(PlayerType *player_ptr)
789 {
790     return PlayerClass(player_ptr).equals(PlayerClassType::NINJA) ? FLAG_CAUSE_CLASS : FLAG_CAUSE_NONE;
791 }
792
793 BIT_FLAGS has_warning(PlayerType *player_ptr)
794 {
795     BIT_FLAGS result = 0L;
796     ObjectType *o_ptr;
797
798     for (int i = INVEN_MAIN_HAND; i < INVEN_TOTAL; i++) {
799         o_ptr = &player_ptr->inventory_list[i];
800         if (!o_ptr->k_idx) {
801             continue;
802         }
803
804         auto flgs = object_flags(o_ptr);
805
806         if (flgs.has(TR_WARNING)) {
807             if (!o_ptr->inscription || !(angband_strchr(quark_str(o_ptr->inscription), '$'))) {
808                 set_bits(result, convert_inventory_slot_type_to_flag_cause(i2enum<inventory_slot_type>(i)));
809             }
810         }
811     }
812     return result;
813 }
814
815 BIT_FLAGS has_anti_magic(PlayerType *player_ptr)
816 {
817     return common_cause_flags(player_ptr, TR_NO_MAGIC);
818 }
819
820 BIT_FLAGS has_anti_tele(PlayerType *player_ptr)
821 {
822     return common_cause_flags(player_ptr, TR_NO_TELE);
823 }
824
825 BIT_FLAGS has_sh_fire(PlayerType *player_ptr)
826 {
827     BIT_FLAGS result = common_cause_flags(player_ptr, TR_SH_FIRE);
828
829     if (player_ptr->muta.has(PlayerMutationType::FIRE_BODY)) {
830         result |= FLAG_CAUSE_MUTATION;
831     }
832
833     if (SpellHex(player_ptr).is_spelling_specific(HEX_DEMON_AURA) || player_ptr->ult_res || player_ptr->tim_sh_fire) {
834         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
835     }
836
837     return result;
838 }
839
840 BIT_FLAGS has_sh_elec(PlayerType *player_ptr)
841 {
842     BIT_FLAGS result = common_cause_flags(player_ptr, TR_SH_ELEC);
843
844     if (player_ptr->muta.has(PlayerMutationType::ELEC_TOUC)) {
845         result |= FLAG_CAUSE_MUTATION;
846     }
847
848     if (SpellHex(player_ptr).is_spelling_specific(HEX_SHOCK_CLOAK) || player_ptr->ult_res) {
849         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
850     }
851
852     return result;
853 }
854
855 BIT_FLAGS has_sh_cold(PlayerType *player_ptr)
856 {
857     BIT_FLAGS result = common_cause_flags(player_ptr, TR_SH_COLD);
858
859     if (player_ptr->ult_res || SpellHex(player_ptr).is_spelling_specific(HEX_ICE_ARMOR)) {
860         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
861     }
862
863     return result;
864 }
865
866 BIT_FLAGS has_easy_spell(PlayerType *player_ptr)
867 {
868     return common_cause_flags(player_ptr, TR_EASY_SPELL);
869 }
870
871 BIT_FLAGS has_heavy_spell(PlayerType *player_ptr)
872 {
873     return common_cause_flags(player_ptr, TR_HEAVY_SPELL);
874 }
875
876 BIT_FLAGS has_hold_exp(PlayerType *player_ptr)
877 {
878     BIT_FLAGS result = common_cause_flags(player_ptr, TR_HOLD_EXP);
879
880     if (player_ptr->ppersonality == PERSONALITY_MUNCHKIN) {
881         result |= FLAG_CAUSE_PERSONALITY;
882     }
883
884     if (player_ptr->ult_res) {
885         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
886     }
887
888     return result;
889 }
890
891 BIT_FLAGS has_see_inv(PlayerType *player_ptr)
892 {
893     BIT_FLAGS result = common_cause_flags(player_ptr, TR_SEE_INVIS);
894
895     if (player_ptr->ult_res || player_ptr->tim_invis) {
896         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
897     }
898
899     return result;
900 }
901
902 BIT_FLAGS has_magic_mastery(PlayerType *player_ptr)
903 {
904     return common_cause_flags(player_ptr, TR_MAGIC_MASTERY);
905 }
906
907 BIT_FLAGS has_free_act(PlayerType *player_ptr)
908 {
909     BIT_FLAGS result = common_cause_flags(player_ptr, TR_FREE_ACT);
910
911     if (player_ptr->muta.has(PlayerMutationType::MOTION)) {
912         result |= FLAG_CAUSE_MUTATION;
913     }
914
915     if (player_ptr->ult_res || player_ptr->magicdef) {
916         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
917     }
918
919     return result;
920 }
921
922 BIT_FLAGS has_sustain_str(PlayerType *player_ptr)
923 {
924     BIT_FLAGS result = common_cause_flags(player_ptr, TR_SUST_STR);
925
926     if (player_ptr->ult_res) {
927         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
928     }
929
930     return result;
931 }
932
933 BIT_FLAGS has_sustain_int(PlayerType *player_ptr)
934 {
935     BIT_FLAGS result = common_cause_flags(player_ptr, TR_SUST_INT);
936
937     if (player_ptr->ult_res) {
938         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
939     }
940
941     return result;
942 }
943
944 BIT_FLAGS has_sustain_wis(PlayerType *player_ptr)
945 {
946     BIT_FLAGS result = common_cause_flags(player_ptr, TR_SUST_WIS);
947
948     if (player_ptr->ult_res) {
949         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
950     }
951
952     return result;
953 }
954
955 BIT_FLAGS has_sustain_dex(PlayerType *player_ptr)
956 {
957     BIT_FLAGS result = common_cause_flags(player_ptr, TR_SUST_DEX);
958
959     if (player_ptr->ult_res) {
960         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
961     }
962
963     return result;
964 }
965
966 BIT_FLAGS has_sustain_con(PlayerType *player_ptr)
967 {
968     BIT_FLAGS result = common_cause_flags(player_ptr, TR_SUST_CON);
969
970     if (player_ptr->ult_res) {
971         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
972     }
973
974     return result;
975 }
976
977 BIT_FLAGS has_sustain_chr(PlayerType *player_ptr)
978 {
979     BIT_FLAGS result = common_cause_flags(player_ptr, TR_SUST_CHR);
980
981     if (player_ptr->ult_res) {
982         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
983     }
984
985     return result;
986 }
987
988 BIT_FLAGS has_levitation(PlayerType *player_ptr)
989 {
990     BIT_FLAGS result = common_cause_flags(player_ptr, TR_LEVITATION);
991
992     if (player_ptr->muta.has(PlayerMutationType::WINGS)) {
993         result |= FLAG_CAUSE_MUTATION;
994     }
995
996     if (player_ptr->ult_res || player_ptr->magicdef) {
997         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
998     }
999
1000     if (player_ptr->tim_levitation) {
1001         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1002     }
1003
1004     // 乗馬中は実際に浮遊するかどうかは乗馬中のモンスターに依存する
1005     if (player_ptr->riding) {
1006         monster_type *riding_m_ptr = &player_ptr->current_floor_ptr->m_list[player_ptr->riding];
1007         monster_race *riding_r_ptr = &r_info[riding_m_ptr->r_idx];
1008         result = riding_r_ptr->feature_flags.has(MonsterFeatureType::CAN_FLY) ? FLAG_CAUSE_RIDING : FLAG_CAUSE_NONE;
1009     }
1010
1011     return result;
1012 }
1013
1014 bool has_can_swim(PlayerType *player_ptr)
1015 {
1016     bool can_swim = false;
1017     if (player_ptr->riding) {
1018         monster_type *riding_m_ptr = &player_ptr->current_floor_ptr->m_list[player_ptr->riding];
1019         monster_race *riding_r_ptr = &r_info[riding_m_ptr->r_idx];
1020         if (riding_r_ptr->feature_flags.has_any_of({ MonsterFeatureType::CAN_SWIM, MonsterFeatureType::AQUATIC })) {
1021             can_swim = true;
1022         }
1023     }
1024
1025     return can_swim;
1026 }
1027
1028 BIT_FLAGS has_slow_digest(PlayerType *player_ptr)
1029 {
1030     BIT_FLAGS result = common_cause_flags(player_ptr, TR_SLOW_DIGEST);
1031
1032     if (player_ptr->ult_res) {
1033         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1034     }
1035
1036     return result;
1037 }
1038
1039 BIT_FLAGS has_regenerate(PlayerType *player_ptr)
1040 {
1041     BIT_FLAGS result = common_cause_flags(player_ptr, TR_REGEN);
1042
1043     if (player_ptr->muta.has(PlayerMutationType::REGEN)) {
1044         result |= FLAG_CAUSE_MUTATION;
1045     }
1046
1047     if (SpellHex(player_ptr).is_spelling_specific(HEX_DEMON_AURA) || player_ptr->ult_res || player_ptr->tim_regen) {
1048         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1049     }
1050
1051     if (player_ptr->muta.has(PlayerMutationType::FLESH_ROT)) {
1052         result = 0L;
1053     }
1054
1055     return result;
1056 }
1057
1058 void update_curses(PlayerType *player_ptr)
1059 {
1060     ObjectType *o_ptr;
1061     player_ptr->cursed.clear();
1062     player_ptr->cursed_special.clear();
1063
1064     if (player_ptr->ppersonality == PERSONALITY_SEXY) {
1065         player_ptr->cursed.set(CurseTraitType::AGGRAVATE);
1066     }
1067
1068     for (int i = INVEN_MAIN_HAND; i < INVEN_TOTAL; i++) {
1069         o_ptr = &player_ptr->inventory_list[i];
1070         if (!o_ptr->k_idx) {
1071             continue;
1072         }
1073         auto flgs = object_flags(o_ptr);
1074         if (flgs.has(TR_AGGRAVATE)) {
1075             player_ptr->cursed.set(CurseTraitType::AGGRAVATE);
1076         }
1077         if (flgs.has(TR_DRAIN_EXP)) {
1078             player_ptr->cursed.set(CurseTraitType::DRAIN_EXP);
1079         }
1080         if (flgs.has(TR_TY_CURSE)) {
1081             player_ptr->cursed.set(CurseTraitType::TY_CURSE);
1082         }
1083         if (flgs.has(TR_ADD_L_CURSE)) {
1084             player_ptr->cursed.set(CurseTraitType::ADD_L_CURSE);
1085         }
1086         if (flgs.has(TR_ADD_H_CURSE)) {
1087             player_ptr->cursed.set(CurseTraitType::ADD_H_CURSE);
1088         }
1089         if (flgs.has(TR_DRAIN_HP)) {
1090             player_ptr->cursed.set(CurseTraitType::DRAIN_HP);
1091         }
1092         if (flgs.has(TR_DRAIN_MANA)) {
1093             player_ptr->cursed.set(CurseTraitType::DRAIN_MANA);
1094         }
1095         if (flgs.has(TR_CALL_ANIMAL)) {
1096             player_ptr->cursed.set(CurseTraitType::CALL_ANIMAL);
1097         }
1098         if (flgs.has(TR_CALL_DEMON)) {
1099             player_ptr->cursed.set(CurseTraitType::CALL_DEMON);
1100         }
1101         if (flgs.has(TR_CALL_DRAGON)) {
1102             player_ptr->cursed.set(CurseTraitType::CALL_DRAGON);
1103         }
1104         if (flgs.has(TR_CALL_UNDEAD)) {
1105             player_ptr->cursed.set(CurseTraitType::CALL_UNDEAD);
1106         }
1107         if (flgs.has(TR_COWARDICE)) {
1108             player_ptr->cursed.set(CurseTraitType::COWARDICE);
1109         }
1110         if (flgs.has(TR_LOW_MELEE)) {
1111             player_ptr->cursed.set(CurseTraitType::LOW_MELEE);
1112         }
1113         if (flgs.has(TR_LOW_AC)) {
1114             player_ptr->cursed.set(CurseTraitType::LOW_AC);
1115         }
1116         if (flgs.has(TR_HARD_SPELL)) {
1117             player_ptr->cursed.set(CurseTraitType::HARD_SPELL);
1118         }
1119         if (flgs.has(TR_FAST_DIGEST)) {
1120             player_ptr->cursed.set(CurseTraitType::FAST_DIGEST);
1121         }
1122         if (flgs.has(TR_SLOW_REGEN)) {
1123             player_ptr->cursed.set(CurseTraitType::SLOW_REGEN);
1124         }
1125         if (flgs.has(TR_BERS_RAGE)) {
1126             player_ptr->cursed.set(CurseTraitType::BERS_RAGE);
1127         }
1128         if (flgs.has(TR_PERSISTENT_CURSE)) {
1129             player_ptr->cursed.set(CurseTraitType::PERSISTENT_CURSE);
1130         }
1131         if (flgs.has(TR_VUL_CURSE)) {
1132             player_ptr->cursed.set(CurseTraitType::VUL_CURSE);
1133         }
1134
1135         auto obj_curse_flags = o_ptr->curse_flags;
1136         obj_curse_flags.reset({ CurseTraitType::CURSED, CurseTraitType::HEAVY_CURSE, CurseTraitType::PERMA_CURSE });
1137         player_ptr->cursed.set(obj_curse_flags);
1138         if (o_ptr->fixed_artifact_idx == ART_CHAINSWORD) {
1139             player_ptr->cursed_special.set(CurseSpecialTraitType::CHAINSWORD);
1140         }
1141
1142         if (flgs.has(TR_TELEPORT)) {
1143             if (o_ptr->is_cursed()) {
1144                 player_ptr->cursed.set(CurseTraitType::TELEPORT);
1145             } else {
1146                 concptr insc = quark_str(o_ptr->inscription);
1147
1148                 /* {.} will stop random teleportation. */
1149                 if (o_ptr->inscription && angband_strchr(insc, '.')) {
1150                 } else {
1151                     player_ptr->cursed_special.set(CurseSpecialTraitType::TELEPORT_SELF);
1152                 }
1153             }
1154         }
1155     }
1156
1157     if (player_ptr->cursed.has(CurseTraitType::TELEPORT)) {
1158         player_ptr->cursed_special.reset(CurseSpecialTraitType::TELEPORT_SELF);
1159     }
1160 }
1161
1162 BIT_FLAGS has_impact(PlayerType *player_ptr)
1163 {
1164     return common_cause_flags(player_ptr, TR_IMPACT);
1165 }
1166
1167 BIT_FLAGS has_earthquake(PlayerType *player_ptr)
1168 {
1169     return common_cause_flags(player_ptr, TR_EARTHQUAKE);
1170 }
1171
1172 void update_extra_blows(PlayerType *player_ptr)
1173 {
1174     ObjectType *o_ptr;
1175     player_ptr->extra_blows[0] = player_ptr->extra_blows[1] = 0;
1176
1177     const melee_type melee_type = player_melee_type(player_ptr);
1178     const bool two_handed = (melee_type == MELEE_TYPE_WEAPON_TWOHAND || melee_type == MELEE_TYPE_BAREHAND_TWO);
1179
1180     for (int i = INVEN_MAIN_HAND; i < INVEN_TOTAL; i++) {
1181         o_ptr = &player_ptr->inventory_list[i];
1182         if (!o_ptr->k_idx) {
1183             continue;
1184         }
1185
1186         auto flgs = object_flags(o_ptr);
1187         if (flgs.has(TR_BLOWS)) {
1188             if ((i == INVEN_MAIN_HAND || i == INVEN_MAIN_RING) && !two_handed) {
1189                 player_ptr->extra_blows[0] += o_ptr->pval;
1190             } else if ((i == INVEN_SUB_HAND || i == INVEN_SUB_RING) && !two_handed) {
1191                 player_ptr->extra_blows[1] += o_ptr->pval;
1192             } else {
1193                 player_ptr->extra_blows[0] += o_ptr->pval;
1194                 player_ptr->extra_blows[1] += o_ptr->pval;
1195             }
1196         }
1197     }
1198 }
1199
1200 BIT_FLAGS has_resist_acid(PlayerType *player_ptr)
1201 {
1202     BIT_FLAGS result = common_cause_flags(player_ptr, TR_RES_ACID);
1203
1204     if (player_ptr->ult_res) {
1205         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1206     }
1207
1208     result |= has_immune_acid(player_ptr);
1209
1210     return result;
1211 }
1212
1213 BIT_FLAGS has_vuln_acid(PlayerType *player_ptr)
1214 {
1215     BIT_FLAGS result = common_cause_flags(player_ptr, TR_VUL_ACID);
1216
1217     if (player_ptr->muta.has(PlayerMutationType::VULN_ELEM)) {
1218         result |= FLAG_CAUSE_MUTATION;
1219     }
1220
1221     return result;
1222 }
1223
1224 BIT_FLAGS has_resist_elec(PlayerType *player_ptr)
1225 {
1226     BIT_FLAGS result = common_cause_flags(player_ptr, TR_RES_ELEC);
1227
1228     if (player_ptr->ult_res) {
1229         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1230     }
1231
1232     result |= has_immune_elec(player_ptr);
1233
1234     return result;
1235 }
1236
1237 BIT_FLAGS has_vuln_elec(PlayerType *player_ptr)
1238 {
1239     BIT_FLAGS result = common_cause_flags(player_ptr, TR_VUL_ELEC);
1240
1241     if (player_ptr->muta.has(PlayerMutationType::VULN_ELEM)) {
1242         result |= FLAG_CAUSE_MUTATION;
1243     }
1244
1245     return result;
1246 }
1247
1248 BIT_FLAGS has_resist_fire(PlayerType *player_ptr)
1249 {
1250     BIT_FLAGS result = common_cause_flags(player_ptr, TR_RES_FIRE);
1251
1252     if (player_ptr->ult_res) {
1253         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1254     }
1255
1256     result |= has_immune_fire(player_ptr);
1257
1258     return result;
1259 }
1260
1261 BIT_FLAGS has_vuln_fire(PlayerType *player_ptr)
1262 {
1263     BIT_FLAGS result = common_cause_flags(player_ptr, TR_VUL_FIRE);
1264
1265     if (player_ptr->muta.has(PlayerMutationType::VULN_ELEM)) {
1266         result |= FLAG_CAUSE_MUTATION;
1267     }
1268
1269     return result;
1270 }
1271
1272 BIT_FLAGS has_resist_cold(PlayerType *player_ptr)
1273 {
1274     BIT_FLAGS result = common_cause_flags(player_ptr, TR_RES_COLD);
1275
1276     if (player_ptr->ult_res) {
1277         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1278     }
1279
1280     result |= has_immune_cold(player_ptr);
1281
1282     return result;
1283 }
1284
1285 BIT_FLAGS has_vuln_cold(PlayerType *player_ptr)
1286 {
1287     BIT_FLAGS result = common_cause_flags(player_ptr, TR_VUL_COLD);
1288
1289     if (player_ptr->muta.has(PlayerMutationType::VULN_ELEM)) {
1290         result |= FLAG_CAUSE_MUTATION;
1291     }
1292
1293     return result;
1294 }
1295
1296 BIT_FLAGS has_resist_pois(PlayerType *player_ptr)
1297 {
1298     BIT_FLAGS result = common_cause_flags(player_ptr, TR_RES_POIS);
1299
1300     if (player_ptr->ult_res) {
1301         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1302     }
1303
1304     return result;
1305 }
1306
1307 BIT_FLAGS has_resist_conf(PlayerType *player_ptr)
1308 {
1309     BIT_FLAGS result = common_cause_flags(player_ptr, TR_RES_CONF);
1310
1311     if (player_ptr->ppersonality == PERSONALITY_CHARGEMAN || player_ptr->ppersonality == PERSONALITY_MUNCHKIN) {
1312         result |= FLAG_CAUSE_PERSONALITY;
1313     }
1314
1315     if (player_ptr->ult_res || player_ptr->magicdef) {
1316         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1317     }
1318
1319     return result;
1320 }
1321
1322 BIT_FLAGS has_resist_sound(PlayerType *player_ptr)
1323 {
1324     BIT_FLAGS result = common_cause_flags(player_ptr, TR_RES_SOUND);
1325
1326     if (player_ptr->ult_res) {
1327         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1328     }
1329
1330     return result;
1331 }
1332
1333 BIT_FLAGS has_resist_lite(PlayerType *player_ptr)
1334 {
1335     BIT_FLAGS result = common_cause_flags(player_ptr, TR_RES_LITE);
1336
1337     if (player_ptr->ult_res) {
1338         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1339     }
1340
1341     return result;
1342 }
1343
1344 BIT_FLAGS has_vuln_lite(PlayerType *player_ptr)
1345 {
1346     BIT_FLAGS result = common_cause_flags(player_ptr, TR_VUL_LITE);
1347
1348     if (player_ptr->wraith_form) {
1349         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1350     }
1351
1352     return result;
1353 }
1354
1355 BIT_FLAGS has_resist_dark(PlayerType *player_ptr)
1356 {
1357     BIT_FLAGS result = common_cause_flags(player_ptr, TR_RES_DARK) | common_cause_flags(player_ptr, TR_IM_DARK);
1358
1359     if (player_ptr->ult_res) {
1360         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1361     }
1362
1363     return result;
1364 }
1365
1366 BIT_FLAGS has_resist_chaos(PlayerType *player_ptr)
1367 {
1368     BIT_FLAGS result = common_cause_flags(player_ptr, TR_RES_CHAOS);
1369
1370     if (player_ptr->ult_res) {
1371         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1372     }
1373
1374     return result;
1375 }
1376
1377 BIT_FLAGS has_resist_disen(PlayerType *player_ptr)
1378 {
1379     BIT_FLAGS result = common_cause_flags(player_ptr, TR_RES_DISEN);
1380
1381     if (player_ptr->ult_res) {
1382         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1383     }
1384
1385     return result;
1386 }
1387
1388 BIT_FLAGS has_resist_shard(PlayerType *player_ptr)
1389 {
1390     BIT_FLAGS result = common_cause_flags(player_ptr, TR_RES_SHARDS);
1391
1392     if (player_ptr->ult_res) {
1393         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1394     }
1395
1396     return result;
1397 }
1398
1399 BIT_FLAGS has_resist_nexus(PlayerType *player_ptr)
1400 {
1401     BIT_FLAGS result = common_cause_flags(player_ptr, TR_RES_NEXUS);
1402
1403     if (player_ptr->ult_res) {
1404         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1405     }
1406
1407     return result;
1408 }
1409
1410 BIT_FLAGS has_resist_blind(PlayerType *player_ptr)
1411 {
1412     BIT_FLAGS result = common_cause_flags(player_ptr, TR_RES_BLIND);
1413
1414     if (player_ptr->ppersonality == PERSONALITY_MUNCHKIN) {
1415         result |= FLAG_CAUSE_PERSONALITY;
1416     }
1417
1418     if (player_ptr->ult_res || player_ptr->magicdef) {
1419         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1420     }
1421
1422     return result;
1423 }
1424
1425 BIT_FLAGS has_resist_neth(PlayerType *player_ptr)
1426 {
1427     BIT_FLAGS result = common_cause_flags(player_ptr, TR_RES_NETHER);
1428
1429     if (player_ptr->ult_res || player_ptr->tim_res_nether) {
1430         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1431     }
1432
1433     return result;
1434 }
1435
1436 BIT_FLAGS has_resist_time(PlayerType *player_ptr)
1437 {
1438     BIT_FLAGS result = common_cause_flags(player_ptr, TR_RES_TIME);
1439
1440     if (player_ptr->ult_res || player_ptr->tim_res_time) {
1441         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1442     }
1443
1444     return result;
1445 }
1446
1447 BIT_FLAGS has_resist_water(PlayerType *player_ptr)
1448 {
1449     BIT_FLAGS result = common_cause_flags(player_ptr, TR_RES_WATER);
1450
1451     if (player_ptr->ult_res) {
1452         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1453     }
1454
1455     return result;
1456 }
1457
1458 /*!
1459  * @brief 呪力耐性を所持しているかどうか
1460  * @param プレイヤー情報への参照ポインタ
1461  * @return 呪力耐性を所持していればTRUE、なければFALSE
1462  */
1463 BIT_FLAGS has_resist_curse(PlayerType *player_ptr)
1464 {
1465     BIT_FLAGS result = common_cause_flags(player_ptr, TR_RES_CURSE);
1466
1467     if (player_ptr->ult_res) {
1468         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1469     }
1470
1471     return result;
1472 }
1473
1474 /*!
1475  * @brief 呪力弱点を所持しているかどうか
1476  * @param プレイヤー情報への参照ポインタ
1477  * @return 呪力弱点を所持していればTRUE、なければFALSE
1478  */
1479 BIT_FLAGS has_vuln_curse(PlayerType *player_ptr)
1480 {
1481     ObjectType *o_ptr;
1482     BIT_FLAGS result = 0L;
1483     for (int i = INVEN_MAIN_HAND; i < INVEN_TOTAL; i++) {
1484         o_ptr = &player_ptr->inventory_list[i];
1485         if (!o_ptr->k_idx) {
1486             continue;
1487         }
1488
1489         auto flgs = object_flags(o_ptr);
1490
1491         if (flgs.has(TR_VUL_CURSE) || o_ptr->curse_flags.has(CurseTraitType::VUL_CURSE)) {
1492             set_bits(result, convert_inventory_slot_type_to_flag_cause(i2enum<inventory_slot_type>(i)));
1493         }
1494     }
1495
1496     return result;
1497 }
1498
1499 /*!
1500  * @brief 呪力弱点かつ重く呪われている装備の有無
1501  * @param プレイヤー情報への参照ポインタ
1502  * @return 呪力弱点かつ重く呪われている装備があればTRUE、なければFALSE
1503  */
1504 BIT_FLAGS has_heavy_vuln_curse(PlayerType *player_ptr)
1505 {
1506     ObjectType *o_ptr;
1507     BIT_FLAGS result = 0L;
1508     for (int i = INVEN_MAIN_HAND; i < INVEN_TOTAL; i++) {
1509         o_ptr = &player_ptr->inventory_list[i];
1510         if (!o_ptr->k_idx) {
1511             continue;
1512         }
1513
1514         auto flgs = object_flags(o_ptr);
1515
1516         if ((flgs.has(TR_VUL_CURSE) || o_ptr->curse_flags.has(CurseTraitType::VUL_CURSE)) && o_ptr->curse_flags.has(CurseTraitType::HEAVY_CURSE)) {
1517             set_bits(result, convert_inventory_slot_type_to_flag_cause(i2enum<inventory_slot_type>(i)));
1518         }
1519     }
1520
1521     return result;
1522 }
1523
1524 BIT_FLAGS has_resist_fear(PlayerType *player_ptr)
1525 {
1526     BIT_FLAGS result = common_cause_flags(player_ptr, TR_RES_FEAR);
1527
1528     if (player_ptr->muta.has(PlayerMutationType::FEARLESS)) {
1529         result |= FLAG_CAUSE_MUTATION;
1530     }
1531
1532     if (is_hero(player_ptr) || is_shero(player_ptr) || player_ptr->ult_res) {
1533         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1534     }
1535
1536     return result;
1537 }
1538
1539 BIT_FLAGS has_immune_acid(PlayerType *player_ptr)
1540 {
1541     BIT_FLAGS result = common_cause_flags(player_ptr, TR_IM_ACID);
1542
1543     if (player_ptr->ele_immune) {
1544         if (player_ptr->special_defense & DEFENSE_ACID) {
1545             result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1546         }
1547     }
1548
1549     return result;
1550 }
1551
1552 BIT_FLAGS has_immune_elec(PlayerType *player_ptr)
1553 {
1554     BIT_FLAGS result = common_cause_flags(player_ptr, TR_IM_ELEC);
1555
1556     if (player_ptr->ele_immune) {
1557         if (player_ptr->special_defense & DEFENSE_ELEC) {
1558             result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1559         }
1560     }
1561
1562     return result;
1563 }
1564
1565 BIT_FLAGS has_immune_fire(PlayerType *player_ptr)
1566 {
1567     BIT_FLAGS result = common_cause_flags(player_ptr, TR_IM_FIRE);
1568
1569     if (player_ptr->ele_immune) {
1570         if (player_ptr->special_defense & DEFENSE_FIRE) {
1571             result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1572         }
1573     }
1574
1575     return result;
1576 }
1577
1578 BIT_FLAGS has_immune_cold(PlayerType *player_ptr)
1579 {
1580     BIT_FLAGS result = common_cause_flags(player_ptr, TR_IM_COLD);
1581
1582     if (player_ptr->ele_immune) {
1583         if (player_ptr->special_defense & DEFENSE_COLD) {
1584             result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1585         }
1586     }
1587
1588     return result;
1589 }
1590
1591 BIT_FLAGS has_immune_dark(PlayerType *player_ptr)
1592 {
1593     BIT_FLAGS result = common_cause_flags(player_ptr, TR_IM_DARK);
1594
1595     if (player_ptr->wraith_form) {
1596         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1597     }
1598
1599     return result;
1600 }
1601
1602 melee_type player_melee_type(PlayerType *player_ptr)
1603 {
1604     if (has_two_handed_weapons(player_ptr)) {
1605         return MELEE_TYPE_WEAPON_TWOHAND;
1606     }
1607
1608     if (has_melee_weapon(player_ptr, INVEN_MAIN_HAND)) {
1609         if (has_melee_weapon(player_ptr, INVEN_SUB_HAND)) {
1610             return MELEE_TYPE_WEAPON_DOUBLE;
1611         }
1612         return MELEE_TYPE_WEAPON_MAIN;
1613     }
1614
1615     if (has_melee_weapon(player_ptr, INVEN_SUB_HAND)) {
1616         return MELEE_TYPE_WEAPON_SUB;
1617     }
1618
1619     if (empty_hands(player_ptr, false) == (EMPTY_HAND_MAIN | EMPTY_HAND_SUB)) {
1620         return MELEE_TYPE_BAREHAND_TWO;
1621     }
1622
1623     if (empty_hands(player_ptr, false) == EMPTY_HAND_MAIN) {
1624         return MELEE_TYPE_BAREHAND_MAIN;
1625     }
1626
1627     if (empty_hands(player_ptr, false) == EMPTY_HAND_SUB) {
1628         return MELEE_TYPE_BAREHAND_SUB;
1629     }
1630
1631     return MELEE_TYPE_SHIELD_DOUBLE;
1632 }
1633
1634 /*
1635  * @brief 利き手で攻撃可能かどうかを判定する
1636  *        利き手で攻撃可能とは、利き手に武器を持っているか、
1637  *        利き手が素手かつ左手も素手もしくは盾を装備している事を意味する。
1638  * @details Includes martial arts and hand combats as weapons.
1639  */
1640 bool can_attack_with_main_hand(PlayerType *player_ptr)
1641 {
1642     if (has_melee_weapon(player_ptr, INVEN_MAIN_HAND)) {
1643         return true;
1644     }
1645
1646     if ((empty_hands(player_ptr, true) & EMPTY_HAND_MAIN) && !can_attack_with_sub_hand(player_ptr)) {
1647         return true;
1648     }
1649
1650     return false;
1651 }
1652
1653 /*
1654  * @brief 非利き手で攻撃可能かどうかを判定する
1655  *        非利き手で攻撃可能とは、非利き手に武器を持っている事に等しい
1656  * @details Exclude martial arts and hand combats from weapons.
1657  */
1658 bool can_attack_with_sub_hand(PlayerType *player_ptr)
1659 {
1660     return has_melee_weapon(player_ptr, INVEN_SUB_HAND);
1661 }
1662
1663 /*
1664  * @brief 両手持ち状態かどうかを判定する
1665  */
1666 bool has_two_handed_weapons(PlayerType *player_ptr)
1667 {
1668     if (can_two_hands_wielding(player_ptr)) {
1669         if (can_attack_with_main_hand(player_ptr) && (empty_hands(player_ptr, false) == EMPTY_HAND_SUB) && player_ptr->inventory_list[INVEN_MAIN_HAND].allow_two_hands_wielding()) {
1670             return true;
1671         } else if (can_attack_with_sub_hand(player_ptr) && (empty_hands(player_ptr, false) == EMPTY_HAND_MAIN) && player_ptr->inventory_list[INVEN_SUB_HAND].allow_two_hands_wielding()) {
1672             return true;
1673         }
1674     }
1675     return false;
1676 }
1677
1678 BIT_FLAGS has_lite(PlayerType *player_ptr)
1679 {
1680     BIT_FLAGS result = 0L;
1681     if (PlayerClass(player_ptr).equals(PlayerClassType::NINJA)) {
1682         return 0L;
1683     }
1684
1685     if (player_ptr->ppersonality == PERSONALITY_MUNCHKIN) {
1686         result |= FLAG_CAUSE_PERSONALITY;
1687     }
1688
1689     if (PlayerRace(player_ptr).tr_flags().has(TR_LITE_1)) {
1690         result |= FLAG_CAUSE_RACE;
1691     }
1692
1693     if (player_ptr->ult_res) {
1694         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1695     }
1696
1697     result |= has_sh_fire(player_ptr);
1698
1699     return result;
1700 }
1701
1702 /*
1703  * @brief 両手持ちボーナスがもらえないかどうかを判定する。 / Does *not * get two hand wielding bonus.
1704  * @details
1705  *  Only can get hit bonuses when wieids an enough light weapon which is lighter than 5 times of weight limit.
1706  *  If its weight is 10 times heavier or more than weight limit, gets hit penalty in calc_to_hit().
1707  */
1708 bool has_disable_two_handed_bonus(PlayerType *player_ptr, int i)
1709 {
1710     if (has_melee_weapon(player_ptr, INVEN_MAIN_HAND + i) && has_two_handed_weapons(player_ptr)) {
1711         auto *o_ptr = &player_ptr->inventory_list[INVEN_MAIN_HAND + i];
1712         int limit = calc_weapon_weight_limit(player_ptr);
1713
1714         /* Enable when two hand wields an enough light weapon */
1715         if (limit >= o_ptr->weight / 5) {
1716             return false;
1717         }
1718     }
1719
1720     /* Disable when empty hands, one hand wieldings and heavy weapons */
1721     return true;
1722 }
1723
1724 /*!
1725  * @brief ふさわしくない武器を持っているかどうかを返す。
1726  * @todo 相応しい時にFALSEで相応しくない時にTRUEという負論理は良くない、後で修正する
1727  */
1728 bool is_wielding_icky_weapon(PlayerType *player_ptr, int i)
1729 {
1730     auto *o_ptr = &player_ptr->inventory_list[INVEN_MAIN_HAND + i];
1731     auto flgs = object_flags(o_ptr);
1732
1733     auto has_no_weapon = (o_ptr->tval == ItemKindType::NONE) || (o_ptr->tval == ItemKindType::SHIELD);
1734     PlayerClass pc(player_ptr);
1735     if (pc.equals(PlayerClassType::PRIEST)) {
1736         auto is_suitable_weapon = flgs.has(TR_BLESSED);
1737         is_suitable_weapon |= (o_ptr->tval != ItemKindType::SWORD) && (o_ptr->tval != ItemKindType::POLEARM);
1738         return !has_no_weapon && !is_suitable_weapon;
1739     }
1740
1741     if (pc.equals(PlayerClassType::SORCERER)) {
1742         auto is_suitable_weapon = o_ptr->tval == ItemKindType::HAFTED;
1743         is_suitable_weapon &= (o_ptr->sval == SV_WIZSTAFF) || (o_ptr->sval == SV_NAMAKE_HAMMER);
1744         return !has_no_weapon && !is_suitable_weapon;
1745     }
1746
1747     return has_not_monk_weapon(player_ptr, i) || has_not_ninja_weapon(player_ptr, i);
1748 }
1749
1750 /*!
1751  * @brief 乗馬にふさわしくない武器を持って乗馬しているかどうかを返す.
1752  * @param player_ptr プレイヤーへの参照ポインタ
1753  * @param i 武器を持っている手。0ならば利き手、1ならば反対の手
1754  */
1755 bool is_wielding_icky_riding_weapon(PlayerType *player_ptr, int i)
1756 {
1757     auto *o_ptr = &player_ptr->inventory_list[INVEN_MAIN_HAND + i];
1758     auto flgs = object_flags(o_ptr);
1759     auto has_no_weapon = (o_ptr->tval == ItemKindType::NONE) || (o_ptr->tval == ItemKindType::SHIELD);
1760     auto is_suitable = o_ptr->is_lance() || flgs.has(TR_RIDING);
1761     return (player_ptr->riding > 0) && !has_no_weapon && !is_suitable;
1762 }
1763
1764 bool has_not_ninja_weapon(PlayerType *player_ptr, int i)
1765 {
1766     if (!has_melee_weapon(player_ptr, INVEN_MAIN_HAND + i)) {
1767         return false;
1768     }
1769
1770     auto tval = player_ptr->inventory_list[INVEN_MAIN_HAND + i].tval;
1771     auto sval = player_ptr->inventory_list[INVEN_MAIN_HAND + i].sval;
1772     return PlayerClass(player_ptr).equals(PlayerClassType::NINJA) &&
1773            !((player_ptr->weapon_exp_max[tval][sval] > PlayerSkill::weapon_exp_at(PlayerSkillRank::BEGINNER)) &&
1774                (player_ptr->inventory_list[INVEN_SUB_HAND - i].tval != ItemKindType::SHIELD));
1775 }
1776
1777 bool has_not_monk_weapon(PlayerType *player_ptr, int i)
1778 {
1779     if (!has_melee_weapon(player_ptr, INVEN_MAIN_HAND + i)) {
1780         return false;
1781     }
1782
1783     auto tval = player_ptr->inventory_list[INVEN_MAIN_HAND + i].tval;
1784     auto sval = player_ptr->inventory_list[INVEN_MAIN_HAND + i].sval;
1785     PlayerClass pc(player_ptr);
1786     return pc.is_martial_arts_pro() && (player_ptr->weapon_exp_max[tval][sval] == PlayerSkill::weapon_exp_at(PlayerSkillRank::UNSKILLED));
1787 }
1788
1789 bool has_good_luck(PlayerType *player_ptr)
1790 {
1791     return (player_ptr->ppersonality == PERSONALITY_LUCKY) || (player_ptr->muta.has(PlayerMutationType::GOOD_LUCK));
1792 }
1793
1794 BIT_FLAGS player_aggravate_state(PlayerType *player_ptr)
1795 {
1796     if (player_ptr->cursed.has(CurseTraitType::AGGRAVATE)) {
1797         if ((PlayerRace(player_ptr).equals(PlayerRaceType::S_FAIRY)) && (player_ptr->ppersonality != PERSONALITY_SEXY)) {
1798             return AGGRAVATE_S_FAIRY;
1799         }
1800         return AGGRAVATE_NORMAL;
1801     }
1802
1803     return AGGRAVATE_NONE;
1804 }
1805
1806 bool has_aggravate(PlayerType *player_ptr)
1807 {
1808     return player_aggravate_state(player_ptr) == AGGRAVATE_NORMAL;
1809 }