OSDN Git Service

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