OSDN Git Service

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