OSDN Git Service

Merge pull request #753 from iks3/fix-low-magic-down-saving
[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 "grid/grid.h"
4 #include "inventory/inventory-slot-types.h"
5 #include "mind/mind-elementalist.h"
6 #include "monster-race/monster-race.h"
7 #include "monster-race/race-flags2.h"
8 #include "monster-race/race-flags7.h"
9 #include "mutation/mutation-flag-types.h"
10 #include "object-enchant/object-ego.h"
11 #include "object-enchant/tr-types.h"
12 #include "object-enchant/trc-types.h"
13 #include "object-hook/hook-checker.h"
14 #include "object-hook/hook-weapon.h"
15 #include "object/object-flags.h"
16 #include "player-status/player-basic-statistics.h"
17 #include "player-status/player-speed.h"
18 #include "player-status/player-stealth.h"
19 #include "player/attack-defense-types.h"
20 #include "player/mimic-info-table.h"
21 #include "player/player-class.h"
22 #include "player/player-race-types.h"
23 #include "player/player-race.h"
24 #include "player/player-skill.h"
25 #include "player/player-status.h"
26 #include "player/race-info-table.h"
27 #include "player/special-defense-types.h"
28 #include "realm/realm-hex-numbers.h"
29 #include "realm/realm-song-numbers.h"
30 #include "realm/realm-types.h"
31 #include "spell-realm/spells-hex.h"
32 #include "sv-definition/sv-weapon-types.h"
33 #include "system/floor-type-definition.h"
34 #include "system/monster-type-definition.h"
35 #include "system/object-type-definition.h"
36 #include "util/bit-flags-calculator.h"
37 #include "util/quarks.h"
38 #include "util/string-processor.h"
39
40 BIT_FLAGS convert_inventory_slot_type_to_flag_cause(inventory_slot_type inventory_slot)
41 {
42     switch (inventory_slot) {
43     case INVEN_MAIN_HAND:
44         return FLAG_CAUSE_INVEN_MAIN_HAND;
45     case INVEN_SUB_HAND:
46         return FLAG_CAUSE_INVEN_SUB_HAND;
47     case INVEN_BOW:
48         return FLAG_CAUSE_INVEN_BOW;
49     case INVEN_MAIN_RING:
50         return FLAG_CAUSE_INVEN_MAIN_RING;
51     case INVEN_SUB_RING:
52         return FLAG_CAUSE_INVEN_SUB_RING;
53     case INVEN_NECK:
54         return FLAG_CAUSE_INVEN_NECK;
55     case INVEN_LITE:
56         return FLAG_CAUSE_INVEN_LITE;
57     case INVEN_BODY:
58         return FLAG_CAUSE_INVEN_BODY;
59     case INVEN_OUTER:
60         return FLAG_CAUSE_INVEN_OUTER;
61     case INVEN_HEAD:
62         return FLAG_CAUSE_INVEN_HEAD;
63     case INVEN_ARMS:
64         return FLAG_CAUSE_INVEN_ARMS;
65     case INVEN_FEET:
66         return FLAG_CAUSE_INVEN_FEET;
67
68     default:
69         return 0;
70     }
71 }
72
73 /*!
74  * @brief 装備による所定の特性フラグを得ているかを一括して取得する関数。
75  */
76 BIT_FLAGS check_equipment_flags(player_type *creature_ptr, tr_type tr_flag)
77 {
78     object_type *o_ptr;
79     BIT_FLAGS flgs[TR_FLAG_SIZE];
80     BIT_FLAGS result = 0L;
81     for (int i = INVEN_MAIN_HAND; i < INVEN_TOTAL; i++) {
82         o_ptr = &creature_ptr->inventory_list[i];
83         if (!o_ptr->k_idx)
84             continue;
85
86         object_flags(creature_ptr, o_ptr, flgs);
87
88         if (has_flag(flgs, tr_flag))
89             set_bits(result, convert_inventory_slot_type_to_flag_cause(static_cast<inventory_slot_type>(i)));
90     }
91     return result;
92 }
93
94 BIT_FLAGS player_flags_brand_pois(player_type *creature_ptr)
95 {
96     BIT_FLAGS result = check_equipment_flags(creature_ptr, TR_BRAND_POIS);
97
98     if (creature_ptr->special_attack & ATTACK_POIS)
99         set_bits(result, FLAG_CAUSE_MAGIC_TIME_EFFECT);
100
101     return result;
102 }
103
104 BIT_FLAGS player_flags_brand_acid(player_type *creature_ptr)
105 {
106     BIT_FLAGS result = check_equipment_flags(creature_ptr, TR_BRAND_ACID);
107
108     if (creature_ptr->special_attack & ATTACK_ACID)
109         set_bits(result, FLAG_CAUSE_MAGIC_TIME_EFFECT);
110
111     return result;
112 }
113
114 BIT_FLAGS player_flags_brand_elec(player_type *creature_ptr)
115 {
116     BIT_FLAGS result = check_equipment_flags(creature_ptr, TR_BRAND_ELEC);
117
118     if (creature_ptr->special_attack & ATTACK_ELEC)
119         set_bits(result, FLAG_CAUSE_MAGIC_TIME_EFFECT);
120
121     return result;
122 }
123
124 BIT_FLAGS player_flags_brand_fire(player_type *creature_ptr)
125 {
126     BIT_FLAGS result = check_equipment_flags(creature_ptr, TR_BRAND_FIRE);
127
128     if (creature_ptr->special_attack & ATTACK_FIRE)
129         set_bits(result, FLAG_CAUSE_MAGIC_TIME_EFFECT);
130
131     return result;
132 }
133
134 BIT_FLAGS player_flags_brand_cold(player_type *creature_ptr)
135 {
136     BIT_FLAGS result = check_equipment_flags(creature_ptr, TR_BRAND_COLD);
137
138     if (creature_ptr->special_attack & ATTACK_COLD)
139         set_bits(result, FLAG_CAUSE_MAGIC_TIME_EFFECT);
140
141     return result;
142 }
143
144 /*!
145  * @brief プレイヤーの所持するフラグのうち、tr_flagに対応するものを返す
146  * @param creature_ptr 判定対象のクリーチャー参照ポインタ
147  * @param tr_flag 要求する装備フラグ
148  */
149 BIT_FLAGS get_player_flags(player_type *creature_ptr, tr_type tr_flag)
150 {
151     switch (tr_flag) {
152     case TR_STR:
153         return PlayerStrength(creature_ptr).get_all_flags();
154     case TR_INT:
155         return PlayerIntelligence(creature_ptr).get_all_flags();
156     case TR_WIS:
157         return PlayerWisdom(creature_ptr).get_all_flags();
158     case TR_DEX:
159         return PlayerDextarity(creature_ptr).get_all_flags();
160     case TR_CON:
161         return PlayerConstitution(creature_ptr).get_all_flags();
162     case TR_CHR:
163         return PlayerCharisma(creature_ptr).get_all_flags();
164     case TR_MAGIC_MASTERY:
165         return has_magic_mastery(creature_ptr);
166     case TR_FORCE_WEAPON:
167         return check_equipment_flags(creature_ptr, tr_flag);
168     case TR_STEALTH:
169         return PlayerStealth(creature_ptr).get_all_flags();
170     case TR_SEARCH:
171         return 0;
172     case TR_INFRA:
173         return has_infra_vision(creature_ptr);
174     case TR_TUNNEL:
175         return 0;
176     case TR_SPEED:
177         return PlayerSpeed(creature_ptr).get_all_flags();
178     case TR_BLOWS:
179         return 0;
180     case TR_CHAOTIC:
181     case TR_VAMPIRIC:
182     case TR_SLAY_ANIMAL:
183     case TR_SLAY_EVIL:
184     case TR_SLAY_UNDEAD:
185     case TR_SLAY_DEMON:
186     case TR_SLAY_ORC:
187     case TR_SLAY_TROLL:
188     case TR_SLAY_GIANT:
189     case TR_SLAY_DRAGON:
190     case TR_KILL_DRAGON:
191     case TR_VORPAL:
192         return check_equipment_flags(creature_ptr, tr_flag);
193     case TR_IMPACT:
194         return has_impact(creature_ptr);
195     case TR_BRAND_POIS:
196         return player_flags_brand_pois(creature_ptr);
197     case TR_BRAND_ACID:
198         return player_flags_brand_acid(creature_ptr);
199     case TR_BRAND_ELEC:
200         return player_flags_brand_elec(creature_ptr);
201     case TR_BRAND_FIRE:
202         return player_flags_brand_fire(creature_ptr);
203     case TR_BRAND_COLD:
204         return player_flags_brand_cold(creature_ptr);
205
206     case TR_SUST_STR:
207         return has_sustain_str(creature_ptr);
208     case TR_SUST_INT:
209         return has_sustain_int(creature_ptr);
210     case TR_SUST_WIS:
211         return has_sustain_wis(creature_ptr);
212     case TR_SUST_DEX:
213         return has_sustain_dex(creature_ptr);
214     case TR_SUST_CON:
215         return has_sustain_con(creature_ptr);
216     case TR_SUST_CHR:
217         return has_sustain_chr(creature_ptr);
218     case TR_RIDING:
219         return check_equipment_flags(creature_ptr, tr_flag);
220     case TR_EASY_SPELL:
221         return has_easy_spell(creature_ptr);
222     case TR_IM_ACID:
223         return has_immune_acid(creature_ptr);
224     case TR_IM_ELEC:
225         return has_immune_elec(creature_ptr);
226     case TR_IM_FIRE:
227         return has_immune_fire(creature_ptr);
228     case TR_IM_COLD:
229         return has_immune_cold(creature_ptr);
230     case TR_THROW:
231         return check_equipment_flags(creature_ptr, tr_flag);
232     case TR_REFLECT:
233         return has_reflect(creature_ptr);
234     case TR_FREE_ACT:
235         return has_free_act(creature_ptr);
236     case TR_HOLD_EXP:
237         return has_hold_exp(creature_ptr);
238     case TR_RES_ACID:
239         return has_resist_acid(creature_ptr);
240     case TR_RES_ELEC:
241         return has_resist_elec(creature_ptr);
242     case TR_RES_FIRE:
243         return has_resist_fire(creature_ptr);
244     case TR_RES_COLD:
245         return has_resist_cold(creature_ptr);
246     case TR_RES_POIS:
247         return has_resist_pois(creature_ptr);
248     case TR_RES_FEAR:
249         return has_resist_fear(creature_ptr);
250     case TR_RES_LITE:
251         return has_resist_lite(creature_ptr);
252     case TR_RES_DARK:
253         return has_resist_dark(creature_ptr);
254     case TR_RES_BLIND:
255         return has_resist_blind(creature_ptr);
256     case TR_RES_CONF:
257         return has_resist_conf(creature_ptr);
258     case TR_RES_SOUND:
259         return has_resist_sound(creature_ptr);
260     case TR_RES_SHARDS:
261         return has_resist_shard(creature_ptr);
262     case TR_RES_NETHER:
263         return has_resist_neth(creature_ptr);
264     case TR_RES_NEXUS:
265         return has_resist_nexus(creature_ptr);
266     case TR_RES_CHAOS:
267         return has_resist_chaos(creature_ptr);
268     case TR_RES_DISEN:
269         return has_resist_disen(creature_ptr);
270     case TR_RES_TIME:
271         return has_resist_time(creature_ptr);
272     case TR_RES_WATER:
273         return has_resist_water(creature_ptr);
274
275     case TR_SH_FIRE:
276         return has_sh_fire(creature_ptr);
277     case TR_SH_ELEC:
278         return has_sh_elec(creature_ptr);
279     case TR_SLAY_HUMAN:
280         return check_equipment_flags(creature_ptr, tr_flag);
281     case TR_SH_COLD:
282         return has_sh_cold(creature_ptr);
283     case TR_NO_TELE:
284         return has_anti_tele(creature_ptr);
285     case TR_NO_MAGIC:
286         return has_anti_magic(creature_ptr);
287     case TR_DEC_MANA:
288         return has_dec_mana(creature_ptr);
289     case TR_TY_CURSE:
290         return check_equipment_flags(creature_ptr, tr_flag);
291     case TR_WARNING:
292         return has_warning(creature_ptr);
293     case TR_HIDE_TYPE:
294     case TR_SHOW_MODS:
295         return check_equipment_flags(creature_ptr, tr_flag);
296     case TR_SLAY_GOOD:
297         return 0;
298     case TR_LEVITATION:
299         return has_levitation(creature_ptr);
300     case TR_LITE_1:
301         return has_lite(creature_ptr);
302     case TR_SEE_INVIS:
303         return has_see_inv(creature_ptr);
304     case TR_TELEPATHY:
305         return has_esp_telepathy(creature_ptr);
306     case TR_SLOW_DIGEST:
307         return has_slow_digest(creature_ptr);
308     case TR_REGEN:
309         return has_regenerate(creature_ptr);
310     case TR_XTRA_MIGHT:
311         return has_xtra_might(creature_ptr);
312     case TR_XTRA_SHOTS:
313     case TR_IGNORE_ACID:
314     case TR_IGNORE_ELEC:
315     case TR_IGNORE_FIRE:
316     case TR_IGNORE_COLD:
317     case TR_ACTIVATE:
318     case TR_DRAIN_EXP:
319     case TR_TELEPORT:
320         return check_equipment_flags(creature_ptr, tr_flag);
321     case TR_AGGRAVATE:
322         return 0;
323     case TR_BLESSED:
324         return has_bless_blade(creature_ptr);
325     case TR_ES_ATTACK:
326     case TR_ES_AC:
327     case TR_KILL_GOOD:
328     case TR_KILL_ANIMAL:
329     case TR_KILL_EVIL:
330     case TR_KILL_UNDEAD:
331     case TR_KILL_DEMON:
332     case TR_KILL_ORC:
333     case TR_KILL_TROLL:
334     case TR_KILL_GIANT:
335     case TR_KILL_HUMAN:
336         return check_equipment_flags(creature_ptr, tr_flag);
337     case TR_ESP_ANIMAL:
338         return has_esp_animal(creature_ptr);
339     case TR_ESP_UNDEAD:
340         return has_esp_undead(creature_ptr);
341     case TR_ESP_DEMON:
342         return has_esp_demon(creature_ptr);
343     case TR_ESP_ORC:
344         return has_esp_orc(creature_ptr);
345     case TR_ESP_TROLL:
346         return has_esp_troll(creature_ptr);
347     case TR_ESP_GIANT:
348         return has_esp_giant(creature_ptr);
349     case TR_ESP_DRAGON:
350         return has_esp_dragon(creature_ptr);
351     case TR_ESP_HUMAN:
352         return has_esp_human(creature_ptr);
353     case TR_ESP_EVIL:
354         return has_esp_evil(creature_ptr);
355     case TR_ESP_GOOD:
356         return has_esp_good(creature_ptr);
357     case TR_ESP_NONLIVING:
358         return has_esp_nonliving(creature_ptr);
359     case TR_ESP_UNIQUE:
360         return has_esp_unique(creature_ptr);
361     case TR_FULL_NAME:
362     case TR_FIXED_FLAVOR:
363     case TR_ADD_L_CURSE:
364     case TR_ADD_H_CURSE:
365     case TR_DRAIN_HP:
366     case TR_DRAIN_MANA:
367     case TR_LITE_2:
368     case TR_LITE_3:
369     case TR_LITE_M1:
370     case TR_LITE_M2:
371     case TR_LITE_M3:
372     case TR_LITE_FUEL:
373     case TR_CALL_ANIMAL:
374     case TR_CALL_DEMON:
375     case TR_CALL_DRAGON:
376     case TR_CALL_UNDEAD:
377     case TR_COWARDICE:
378     case TR_LOW_MELEE:
379     case TR_LOW_AC:
380     case TR_HARD_SPELL:
381     case TR_FAST_DIGEST:
382     case TR_SLOW_REGEN:
383         return check_equipment_flags(creature_ptr, tr_flag);
384     case TR_MIGHTY_THROW:
385         return has_mighty_throw(creature_ptr);
386     case TR_EASY2_WEAPON:
387         return has_easy2_weapon(creature_ptr);
388     case TR_DOWN_SAVING:
389         return has_down_saving(creature_ptr);
390     case TR_NO_AC:
391         return has_no_ac(creature_ptr);
392     case TR_HEAVY_SPELL:
393         return has_heavy_spell(creature_ptr);
394     case TR_INVULN_ARROW:
395         return has_invuln_arrow(creature_ptr);
396     case TR_DARK_SOURCE:
397     case TR_SUPPORTIVE:
398         return check_equipment_flags(creature_ptr, tr_flag);
399
400     case TR_FLAG_MAX:
401         break;
402     }
403     return 0;
404 }
405
406 /*!
407  * @brief クリーチャーが壁破壊進行を持っているかを返す。
408  */
409 bool has_kill_wall(player_type *creature_ptr)
410 {
411     if (creature_ptr->mimic_form == MIMIC_DEMON_LORD || music_singing(creature_ptr, MUSIC_WALL)) {
412         return TRUE;
413     }
414
415     if (creature_ptr->riding) {
416         monster_type *riding_m_ptr = &creature_ptr->current_floor_ptr->m_list[creature_ptr->riding];
417         monster_race *riding_r_ptr = &r_info[riding_m_ptr->r_idx];
418         if (riding_r_ptr->flags2 & RF2_KILL_WALL)
419             return TRUE;
420     }
421
422     return FALSE;
423 }
424
425 /*!
426  * @brief クリーチャーが壁通過を持っているかを返す。
427  * @param creature_ptr 判定対象のクリーチャー参照ポインタ
428  * @return 持っていたらTRUE
429  * @details
430  * * 時限で幽体化、壁抜けをもつか種族幽霊ならばひとまずTRUE。
431  * * 但し騎乗中は乗騎が壁抜けを持っていなければ不能になる。
432  */
433 bool has_pass_wall(player_type *creature_ptr)
434 {
435     bool pow = FALSE;
436
437     if (creature_ptr->wraith_form || creature_ptr->tim_pass_wall || (!creature_ptr->mimic_form && creature_ptr->prace == RACE_SPECTRE)) {
438         pow = TRUE;
439     }
440
441     if (creature_ptr->riding) {
442         monster_type *riding_m_ptr = &creature_ptr->current_floor_ptr->m_list[creature_ptr->riding];
443         monster_race *riding_r_ptr = &r_info[riding_m_ptr->r_idx];
444         if (!(riding_r_ptr->flags2 & RF2_PASS_WALL))
445             pow = FALSE;
446     }
447
448     return pow;
449 }
450
451 /*!
452  * @brief クリーチャーが強力射を持っているかを返す。
453  * @param creature_ptr 判定対象のクリーチャー参照ポインタ
454  * @return 持っていたら所持前提ビットフラグを返す。
455  */
456 BIT_FLAGS has_xtra_might(player_type *creature_ptr)
457 {
458     BIT_FLAGS result = 0L;
459     result |= check_equipment_flags(creature_ptr, TR_XTRA_MIGHT);
460     return result;
461 }
462
463 /*!
464  * @brief クリーチャーが赤外線視力修正を持っているかを返す。
465  * @param creature_ptr 判定対象のクリーチャー参照ポインタ
466  * @return 持っていたら所持前提ビットフラグを返す。
467  * @details 種族修正は0より大きければTRUEとする。
468  */
469 BIT_FLAGS has_infra_vision(player_type *creature_ptr)
470 {
471     BIT_FLAGS result = 0L;
472     const player_race *tmp_rp_ptr;
473
474     if (creature_ptr->mimic_form)
475         tmp_rp_ptr = &mimic_info[creature_ptr->mimic_form];
476     else
477         tmp_rp_ptr = &race_info[creature_ptr->prace];
478
479     if (tmp_rp_ptr->infra > 0)
480         result |= FLAG_CAUSE_RACE;
481
482     if (creature_ptr->muta.has(MUTA::INFRAVIS))
483         result |= FLAG_CAUSE_MUTATION;
484
485     if (creature_ptr->tim_infra)
486         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
487
488     result |= check_equipment_flags(creature_ptr, TR_INFRA);
489     return result;
490 }
491
492 /*!
493  * @brief クリーチャーが邪悪感知を持っているかを返す。
494  * @param creature_ptr 判定対象のクリーチャー参照ポインタ
495  * @return 持っていたら所持前提ビットフラグを返す。
496  */
497 BIT_FLAGS has_esp_evil(player_type *creature_ptr)
498 {
499     BIT_FLAGS result = 0L;
500     if (creature_ptr->realm1 == REALM_HEX) {
501         if (hex_spelling(creature_ptr, HEX_DETECT_EVIL))
502             result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
503     }
504     result |= check_equipment_flags(creature_ptr, TR_ESP_EVIL);
505     return result;
506 }
507
508 /*!
509  * @brief クリーチャーが自然界の動物感知を持っているかを返す。
510  * @param creature_ptr 判定対象のクリーチャー参照ポインタ
511  * @return 持っていたら所持前提ビットフラグを返す。
512  */
513 BIT_FLAGS has_esp_animal(player_type *creature_ptr)
514 {
515     return check_equipment_flags(creature_ptr, TR_ESP_ANIMAL);
516 }
517
518 /*!
519  * @brief クリーチャーがアンデッド感知を持っているかを返す。
520  * @param creature_ptr 判定対象のクリーチャー参照ポインタ
521  * @return 持っていたら所持前提ビットフラグを返す。
522  */
523 BIT_FLAGS has_esp_undead(player_type *creature_ptr)
524 {
525     return check_equipment_flags(creature_ptr, TR_ESP_UNDEAD);
526 }
527
528 /*!
529  * @brief クリーチャーが悪魔感知を持っているかを返す。
530  * @param creature_ptr 判定対象のクリーチャー参照ポインタ
531  * @return 持っていたら所持前提ビットフラグを返す。
532  */
533 BIT_FLAGS has_esp_demon(player_type *creature_ptr)
534 {
535     return check_equipment_flags(creature_ptr, TR_ESP_DEMON);
536 }
537
538 /*!
539  * @brief クリーチャーがオーク感知を持っているかを返す。
540  * @param creature_ptr 判定対象のクリーチャー参照ポインタ
541  * @return 持っていたら所持前提ビットフラグを返す。
542  */
543 BIT_FLAGS has_esp_orc(player_type *creature_ptr)
544 {
545     return check_equipment_flags(creature_ptr, TR_ESP_ORC);
546 }
547
548 /*!
549  * @brief クリーチャーがトロル感知を持っているかを返す。
550  * @param creature_ptr 判定対象のクリーチャー参照ポインタ
551  * @return 持っていたら所持前提ビットフラグを返す。
552  */
553 BIT_FLAGS has_esp_troll(player_type *creature_ptr)
554 {
555     return check_equipment_flags(creature_ptr, TR_ESP_TROLL);
556 }
557
558 /*!
559  * @brief クリーチャーが巨人感知を持っているかを返す。
560  * @param creature_ptr 判定対象のクリーチャー参照ポインタ
561  * @return 持っていたら所持前提ビットフラグを返す。
562  */
563 BIT_FLAGS has_esp_giant(player_type *creature_ptr)
564 {
565     return check_equipment_flags(creature_ptr, TR_ESP_GIANT);
566 }
567
568 /*!
569  * @brief クリーチャーがドラゴン感知を持っているかを返す。
570  * @param creature_ptr 判定対象のクリーチャー参照ポインタ
571  * @return 持っていたら所持前提ビットフラグを返す。
572  */
573 BIT_FLAGS has_esp_dragon(player_type *creature_ptr)
574 {
575     return check_equipment_flags(creature_ptr, TR_ESP_DRAGON);
576 }
577
578 /*!
579  * @brief クリーチャーが人間感知を持っているかを返す。
580  * @param creature_ptr 判定対象のクリーチャー参照ポインタ
581  * @return 持っていたら所持前提ビットフラグを返す。
582  */
583 BIT_FLAGS has_esp_human(player_type *creature_ptr)
584 {
585     return check_equipment_flags(creature_ptr, TR_ESP_HUMAN);
586 }
587
588 /*!
589  * @brief クリーチャーが善良感知を持っているかを返す。
590  * @param creature_ptr 判定対象のクリーチャー参照ポインタ
591  * @return 持っていたら所持前提ビットフラグを返す。
592  */
593 BIT_FLAGS has_esp_good(player_type *creature_ptr)
594 {
595     return check_equipment_flags(creature_ptr, TR_ESP_GOOD);
596 }
597
598 /*!
599  * @brief クリーチャーが無生物感知を持っているかを返す。
600  * @param creature_ptr 判定対象のクリーチャー参照ポインタ
601  * @return 持っていたら所持前提ビットフラグを返す。
602  */
603 BIT_FLAGS has_esp_nonliving(player_type *creature_ptr)
604 {
605     return check_equipment_flags(creature_ptr, TR_ESP_NONLIVING);
606 }
607
608 /*!
609  * @brief クリーチャーがユニーク感知を持っているかを返す。
610  * @param creature_ptr 判定対象のクリーチャー参照ポインタ
611  * @return 持っていたら所持前提ビットフラグを返す。
612  */
613 BIT_FLAGS has_esp_unique(player_type *creature_ptr)
614 {
615     return check_equipment_flags(creature_ptr, TR_ESP_UNIQUE);
616 }
617
618 /*!
619  * @brief クリーチャーがテレパシーを持っているかを返す。
620  * @param creature_ptr 判定対象のクリーチャー参照ポインタ
621  * @return 持っていたら所持前提ビットフラグを返す。
622  */
623 BIT_FLAGS has_esp_telepathy(player_type *creature_ptr)
624 {
625     BIT_FLAGS result = 0L;
626
627     if (is_time_limit_esp(creature_ptr) || creature_ptr->ult_res) {
628         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
629     }
630     if (creature_ptr->special_defense & KATA_MUSOU) {
631         result |= FLAG_CAUSE_BATTLE_FORM;
632     }
633
634     if (creature_ptr->muta.has(MUTA::ESP)) {
635         result |= FLAG_CAUSE_MUTATION;
636     }
637
638     if (is_specific_player_race(creature_ptr, RACE_MIND_FLAYER) && creature_ptr->lev > 29)
639         result |= FLAG_CAUSE_RACE;
640
641     if (is_specific_player_race(creature_ptr, RACE_SPECTRE) && creature_ptr->lev > 34)
642         result |= FLAG_CAUSE_RACE;
643
644     if (creature_ptr->pclass == CLASS_MINDCRAFTER && creature_ptr->lev > 39)
645         result |= FLAG_CAUSE_CLASS;
646
647     if (creature_ptr->mimic_form == MIMIC_DEMON_LORD) {
648         result |= FLAG_CAUSE_RACE;
649     }
650
651     result |= check_equipment_flags(creature_ptr, TR_TELEPATHY);
652     return result;
653 }
654
655 BIT_FLAGS has_bless_blade(player_type *creature_ptr)
656 {
657     return check_equipment_flags(creature_ptr, TR_BLESSED);
658 }
659
660 BIT_FLAGS has_easy2_weapon(player_type *creature_ptr)
661 {
662     return check_equipment_flags(creature_ptr, TR_EASY2_WEAPON);
663 }
664
665 BIT_FLAGS has_down_saving(player_type *creature_ptr)
666 {
667     return check_equipment_flags(creature_ptr, TR_DOWN_SAVING);
668 }
669
670 BIT_FLAGS has_no_ac(player_type *creature_ptr)
671 {
672     return check_equipment_flags(creature_ptr, TR_NO_AC);
673 }
674
675 BIT_FLAGS has_invuln_arrow(player_type *creature_ptr)
676 {
677     BIT_FLAGS result = 0L;
678     if (creature_ptr->blind)
679         return result;
680     result |= check_equipment_flags(creature_ptr, TR_INVULN_ARROW);
681     return result;
682 }
683
684 void check_no_flowed(player_type *creature_ptr)
685 {
686     object_type *o_ptr;
687     bool has_sw = FALSE, has_kabe = FALSE;
688     OBJECT_IDX this_o_idx, next_o_idx = 0;
689
690     creature_ptr->no_flowed = FALSE;
691
692     if (has_pass_wall(creature_ptr) && !has_kill_wall(creature_ptr)) {
693         creature_ptr->no_flowed = TRUE;
694         return;
695     }
696
697     if (!creature_ptr->realm1 || creature_ptr->pclass == CLASS_ELEMENTALIST) {
698         creature_ptr->no_flowed = FALSE;
699         return;
700     }
701
702     for (int i = 0; i < INVEN_PACK; i++) {
703         if ((creature_ptr->inventory_list[i].tval == TV_NATURE_BOOK) && (creature_ptr->inventory_list[i].sval == 2))
704             has_sw = TRUE;
705         if ((creature_ptr->inventory_list[i].tval == TV_CRAFT_BOOK) && (creature_ptr->inventory_list[i].sval == 2))
706             has_kabe = TRUE;
707     }
708
709     for (this_o_idx = creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x].o_idx; this_o_idx; this_o_idx = next_o_idx) {
710         o_ptr = &creature_ptr->current_floor_ptr->o_list[this_o_idx];
711         next_o_idx = o_ptr->next_o_idx;
712
713         if ((o_ptr->tval == TV_NATURE_BOOK) && (o_ptr->sval == 2))
714             has_sw = TRUE;
715         if ((o_ptr->tval == TV_CRAFT_BOOK) && (o_ptr->sval == 2))
716             has_kabe = TRUE;
717     }
718
719     if (has_sw && ((creature_ptr->realm1 == REALM_NATURE) || (creature_ptr->realm2 == REALM_NATURE) || (creature_ptr->pclass == CLASS_SORCERER))) {
720         const magic_type *s_ptr = &mp_ptr->info[REALM_NATURE - 1][SPELL_SW];
721         if (creature_ptr->lev >= s_ptr->slevel)
722             creature_ptr->no_flowed = TRUE;
723     }
724
725     if (has_kabe && ((creature_ptr->realm1 == REALM_CRAFT) || (creature_ptr->realm2 == REALM_CRAFT) || (creature_ptr->pclass == CLASS_SORCERER))) {
726         const magic_type *s_ptr = &mp_ptr->info[REALM_CRAFT - 1][SPELL_WALL];
727         if (creature_ptr->lev >= s_ptr->slevel)
728             creature_ptr->no_flowed = TRUE;
729     }
730 }
731
732 BIT_FLAGS has_mighty_throw(player_type *creature_ptr)
733 {
734     return check_equipment_flags(creature_ptr, TR_MIGHTY_THROW);
735 }
736
737 BIT_FLAGS has_dec_mana(player_type *creature_ptr)
738 {
739     return check_equipment_flags(creature_ptr, TR_DEC_MANA);
740 }
741
742 BIT_FLAGS has_reflect(player_type *creature_ptr)
743 {
744     BIT_FLAGS result = 0L;
745
746     if (creature_ptr->pclass == CLASS_BERSERKER && creature_ptr->lev > 39)
747         result |= FLAG_CAUSE_CLASS;
748
749     if (creature_ptr->pclass == CLASS_MIRROR_MASTER && creature_ptr->lev > 39)
750         result |= FLAG_CAUSE_CLASS;
751
752     if (creature_ptr->special_defense & KAMAE_GENBU || creature_ptr->special_defense & KATA_MUSOU) {
753         result |= FLAG_CAUSE_BATTLE_FORM;
754     }
755
756     if (creature_ptr->ult_res || creature_ptr->wraith_form || creature_ptr->magicdef || creature_ptr->tim_reflect) {
757         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
758     }
759
760     if (has_element_resist(creature_ptr, ElementRealm::EARTH, 30))
761         result |= FLAG_CAUSE_CLASS;
762
763     result |= check_equipment_flags(creature_ptr, TR_REFLECT);
764     return result;
765 }
766
767 BIT_FLAGS has_see_nocto(player_type *creature_ptr)
768 {
769     return (creature_ptr->pclass == CLASS_NINJA) ? FLAG_CAUSE_CLASS : FLAG_CAUSE_NONE;
770 }
771
772 BIT_FLAGS has_warning(player_type *creature_ptr)
773 {
774     BIT_FLAGS result = 0L;
775     object_type *o_ptr;
776     BIT_FLAGS flgs[TR_FLAG_SIZE];
777
778     for (int i = INVEN_MAIN_HAND; i < INVEN_TOTAL; i++) {
779         o_ptr = &creature_ptr->inventory_list[i];
780         if (!o_ptr->k_idx)
781             continue;
782
783         object_flags(creature_ptr, o_ptr, flgs);
784
785         if (has_flag(flgs, TR_WARNING)) {
786             if (!o_ptr->inscription || !(angband_strchr(quark_str(o_ptr->inscription), '$')))
787                 set_bits(result, convert_inventory_slot_type_to_flag_cause(static_cast<inventory_slot_type>(i)));
788         }
789     }
790     return result;
791 }
792
793 BIT_FLAGS has_anti_magic(player_type *creature_ptr)
794 {
795     return check_equipment_flags(creature_ptr, TR_NO_MAGIC);
796 }
797
798 BIT_FLAGS has_anti_tele(player_type *creature_ptr)
799 {
800     return check_equipment_flags(creature_ptr, TR_NO_TELE);
801 }
802
803 BIT_FLAGS has_sh_fire(player_type *creature_ptr)
804 {
805     BIT_FLAGS result = 0L;
806
807     if (creature_ptr->muta.has(MUTA::FIRE_BODY)) {
808         result |= FLAG_CAUSE_MUTATION;
809     }
810
811     if (creature_ptr->mimic_form == MIMIC_DEMON_LORD) {
812         result |= FLAG_CAUSE_RACE;
813     }
814
815     if (creature_ptr->special_defense & KAMAE_SEIRYU || creature_ptr->special_defense & KATA_MUSOU) {
816         result |= FLAG_CAUSE_BATTLE_FORM;
817     }
818
819     if (hex_spelling(creature_ptr, HEX_DEMON_AURA) || creature_ptr->ult_res || creature_ptr->tim_sh_fire) {
820         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
821     }
822
823     result |= check_equipment_flags(creature_ptr, TR_SH_FIRE);
824     return result;
825 }
826
827 BIT_FLAGS has_sh_elec(player_type *creature_ptr)
828 {
829     BIT_FLAGS result = 0L;
830
831     if (creature_ptr->muta.has(MUTA::ELEC_TOUC))
832         result |= FLAG_CAUSE_MUTATION;
833
834     if (hex_spelling(creature_ptr, HEX_SHOCK_CLOAK) || creature_ptr->ult_res) {
835         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
836     }
837
838     if (creature_ptr->special_defense & KAMAE_SEIRYU || (creature_ptr->special_defense & KATA_MUSOU)) {
839         result |= FLAG_CAUSE_BATTLE_FORM;
840     }
841
842     result |= check_equipment_flags(creature_ptr, TR_SH_ELEC);
843     return result;
844 }
845
846 BIT_FLAGS has_sh_cold(player_type *creature_ptr)
847 {
848     BIT_FLAGS result = 0L;
849
850     if (creature_ptr->special_defense & KAMAE_SEIRYU || creature_ptr->special_defense & KATA_MUSOU) {
851         result |= FLAG_CAUSE_BATTLE_FORM;
852     }
853
854     if (creature_ptr->ult_res || hex_spelling(creature_ptr, HEX_ICE_ARMOR)) {
855         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
856     }
857
858     result |= check_equipment_flags(creature_ptr, TR_SH_COLD);
859     return result;
860 }
861
862 BIT_FLAGS has_easy_spell(player_type *creature_ptr)
863 {
864     return check_equipment_flags(creature_ptr, TR_EASY_SPELL);
865 }
866
867 BIT_FLAGS has_heavy_spell(player_type *creature_ptr)
868 {
869     return check_equipment_flags(creature_ptr, TR_HEAVY_SPELL);
870 }
871
872 BIT_FLAGS has_hold_exp(player_type *creature_ptr)
873 {
874     BIT_FLAGS result = 0L;
875
876     if (creature_ptr->pseikaku == PERSONALITY_MUNCHKIN) {
877         result |= FLAG_CAUSE_PERSONALITY;
878     }
879
880     if (creature_ptr->mimic_form == MIMIC_DEMON || creature_ptr->mimic_form == MIMIC_DEMON_LORD || creature_ptr->mimic_form == MIMIC_VAMPIRE) {
881         result |= FLAG_CAUSE_RACE;
882     }
883
884     if (is_specific_player_race(creature_ptr, RACE_HOBBIT) || is_specific_player_race(creature_ptr, RACE_SKELETON)
885         || is_specific_player_race(creature_ptr, RACE_ZOMBIE) || is_specific_player_race(creature_ptr, RACE_VAMPIRE)
886         || is_specific_player_race(creature_ptr, RACE_SPECTRE) || is_specific_player_race(creature_ptr, RACE_BALROG)
887         || is_specific_player_race(creature_ptr, RACE_ANDROID)) {
888         result |= FLAG_CAUSE_RACE;
889     }
890
891     if (is_specific_player_race(creature_ptr, RACE_GOLEM)) {
892         if (creature_ptr->lev > 34)
893             result |= FLAG_CAUSE_RACE;
894     }
895
896     if (creature_ptr->special_defense & KATA_MUSOU) {
897         result |= FLAG_CAUSE_BATTLE_FORM;
898     }
899
900     if (creature_ptr->ult_res) {
901         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
902     }
903
904     result |= check_equipment_flags(creature_ptr, TR_HOLD_EXP);
905     return result;
906 }
907
908 BIT_FLAGS has_see_inv(player_type *creature_ptr)
909 {
910     BIT_FLAGS result = 0L;
911
912     if (creature_ptr->pclass == CLASS_NINJA && creature_ptr->lev > 29)
913         result |= FLAG_CAUSE_CLASS;
914
915     if (creature_ptr->mimic_form == MIMIC_DEMON || creature_ptr->mimic_form == MIMIC_DEMON_LORD || creature_ptr->mimic_form == MIMIC_VAMPIRE) {
916         result |= FLAG_CAUSE_RACE;
917     } else if (is_specific_player_race(creature_ptr, RACE_HIGH_ELF) || is_specific_player_race(creature_ptr, RACE_GOLEM)
918         || is_specific_player_race(creature_ptr, RACE_SKELETON) || is_specific_player_race(creature_ptr, RACE_ZOMBIE)
919         || is_specific_player_race(creature_ptr, RACE_SPECTRE) || is_specific_player_race(creature_ptr, RACE_ARCHON)) {
920         result |= FLAG_CAUSE_RACE;
921     } else if (is_specific_player_race(creature_ptr, RACE_DARK_ELF) && creature_ptr->lev > 19) {
922         result |= FLAG_CAUSE_RACE;
923     } else if (is_specific_player_race(creature_ptr, RACE_MIND_FLAYER) && creature_ptr->lev > 14) {
924         result |= FLAG_CAUSE_RACE;
925     } else if ((is_specific_player_race(creature_ptr, RACE_IMP) || is_specific_player_race(creature_ptr, RACE_BALROG)) && creature_ptr->lev > 9) {
926         result |= FLAG_CAUSE_RACE;
927     }
928
929     if (creature_ptr->special_defense & KATA_MUSOU) {
930         result |= FLAG_CAUSE_BATTLE_FORM;
931     }
932
933     if (creature_ptr->ult_res || creature_ptr->tim_invis) {
934         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
935     }
936
937     result |= check_equipment_flags(creature_ptr, TR_SEE_INVIS);
938     return result;
939 }
940
941 BIT_FLAGS has_magic_mastery(player_type *creature_ptr)
942 {
943     return check_equipment_flags(creature_ptr, TR_MAGIC_MASTERY);
944 }
945
946 BIT_FLAGS has_free_act(player_type *creature_ptr)
947 {
948     BIT_FLAGS result = 0L;
949
950     if (creature_ptr->muta.has(MUTA::MOTION))
951         result |= FLAG_CAUSE_MUTATION;
952
953     if (is_specific_player_race(creature_ptr, RACE_GNOME) || is_specific_player_race(creature_ptr, RACE_GOLEM)
954         || is_specific_player_race(creature_ptr, RACE_SPECTRE) || is_specific_player_race(creature_ptr, RACE_ANDROID)) {
955         result |= FLAG_CAUSE_RACE;
956     }
957
958     if (creature_ptr->pclass == CLASS_NINJA && !heavy_armor(creature_ptr)
959         && (!creature_ptr->inventory_list[INVEN_MAIN_HAND].k_idx || can_attack_with_main_hand(creature_ptr))
960         && (!creature_ptr->inventory_list[INVEN_SUB_HAND].k_idx || can_attack_with_sub_hand(creature_ptr))) {
961         if (creature_ptr->lev > 24)
962             result |= FLAG_CAUSE_CLASS;
963     }
964
965     if (creature_ptr->pclass == CLASS_MONK || creature_ptr->pclass == CLASS_FORCETRAINER) {
966         if (!(heavy_armor(creature_ptr))) {
967             if (creature_ptr->lev > 24)
968                 result |= FLAG_CAUSE_CLASS;
969         }
970     }
971
972     if (creature_ptr->pclass == CLASS_BERSERKER) {
973         result |= FLAG_CAUSE_CLASS;
974     }
975
976     if (creature_ptr->ult_res || creature_ptr->magicdef) {
977         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
978     }
979
980     if (creature_ptr->special_defense & KATA_MUSOU) {
981         result |= FLAG_CAUSE_BATTLE_FORM;
982     }
983
984     result |= check_equipment_flags(creature_ptr, TR_FREE_ACT);
985     return result;
986 }
987
988 BIT_FLAGS has_sustain_str(player_type *creature_ptr)
989 {
990     BIT_FLAGS result = 0L;
991
992     if (creature_ptr->pclass == CLASS_BERSERKER) {
993         result |= FLAG_CAUSE_CLASS;
994     }
995     if (is_specific_player_race(creature_ptr, RACE_HALF_TROLL) || is_specific_player_race(creature_ptr, RACE_HALF_OGRE)
996         || is_specific_player_race(creature_ptr, RACE_HALF_GIANT)) {
997         result |= FLAG_CAUSE_RACE;
998     }
999
1000     if (creature_ptr->ult_res) {
1001         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1002     }
1003
1004     if (creature_ptr->special_defense & KATA_MUSOU) {
1005         result |= FLAG_CAUSE_BATTLE_FORM;
1006     }
1007
1008     result |= check_equipment_flags(creature_ptr, TR_SUST_STR);
1009     return result;
1010 }
1011
1012 BIT_FLAGS has_sustain_int(player_type *creature_ptr)
1013 {
1014     BIT_FLAGS result = 0L;
1015
1016     if (is_specific_player_race(creature_ptr, RACE_MIND_FLAYER)) {
1017         result |= FLAG_CAUSE_RACE;
1018     }
1019
1020     if (creature_ptr->ult_res) {
1021         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1022     }
1023
1024     if (creature_ptr->special_defense & KATA_MUSOU) {
1025         result |= FLAG_CAUSE_BATTLE_FORM;
1026     }
1027
1028     result |= check_equipment_flags(creature_ptr, TR_SUST_INT);
1029     return result;
1030 }
1031
1032 BIT_FLAGS has_sustain_wis(player_type *creature_ptr)
1033 {
1034     BIT_FLAGS result = 0L;
1035
1036     if (creature_ptr->pclass == CLASS_MINDCRAFTER && creature_ptr->lev > 19)
1037         result |= FLAG_CAUSE_CLASS;
1038
1039     if (!creature_ptr->mimic_form && (creature_ptr->prace == RACE_MIND_FLAYER)) {
1040         result |= FLAG_CAUSE_RACE;
1041     }
1042
1043     if (creature_ptr->ult_res) {
1044         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1045     }
1046
1047     if (creature_ptr->special_defense & KATA_MUSOU) {
1048         result |= FLAG_CAUSE_BATTLE_FORM;
1049     }
1050
1051     result |= check_equipment_flags(creature_ptr, TR_SUST_WIS);
1052     return result;
1053 }
1054
1055 BIT_FLAGS has_sustain_dex(player_type *creature_ptr)
1056 {
1057     BIT_FLAGS result = 0L;
1058     if (creature_ptr->pclass == CLASS_BERSERKER) {
1059         result |= FLAG_CAUSE_CLASS;
1060     }
1061
1062     if (creature_ptr->pclass == CLASS_NINJA && creature_ptr->lev > 24)
1063         result |= FLAG_CAUSE_CLASS;
1064
1065     if (creature_ptr->ult_res) {
1066         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1067     }
1068
1069     if (creature_ptr->special_defense & KATA_MUSOU) {
1070         result |= FLAG_CAUSE_BATTLE_FORM;
1071     }
1072
1073     result |= check_equipment_flags(creature_ptr, TR_SUST_DEX);
1074     return result;
1075 }
1076
1077 BIT_FLAGS has_sustain_con(player_type *creature_ptr)
1078 {
1079     BIT_FLAGS result = 0L;
1080     if (creature_ptr->pclass == CLASS_BERSERKER) {
1081         result |= FLAG_CAUSE_CLASS;
1082     }
1083
1084     if (!creature_ptr->mimic_form && (creature_ptr->prace == RACE_AMBERITE || creature_ptr->prace == RACE_DUNADAN)) {
1085         result |= FLAG_CAUSE_RACE;
1086     }
1087
1088     if (creature_ptr->ult_res) {
1089         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1090     }
1091
1092     if (creature_ptr->special_defense & KATA_MUSOU) {
1093         result |= FLAG_CAUSE_BATTLE_FORM;
1094     }
1095
1096     result |= check_equipment_flags(creature_ptr, TR_SUST_CON);
1097     return result;
1098 }
1099
1100 BIT_FLAGS has_sustain_chr(player_type *creature_ptr)
1101 {
1102     BIT_FLAGS result = 0L;
1103
1104     if (creature_ptr->ult_res) {
1105         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1106     }
1107
1108     if (creature_ptr->special_defense & KATA_MUSOU) {
1109         result |= FLAG_CAUSE_BATTLE_FORM;
1110     }
1111
1112     result |= check_equipment_flags(creature_ptr, TR_SUST_CHR);
1113     return result;
1114 }
1115
1116 BIT_FLAGS has_levitation(player_type *creature_ptr)
1117 {
1118     BIT_FLAGS result = 0L;
1119
1120     if (creature_ptr->muta.has(MUTA::WINGS)) {
1121         result |= FLAG_CAUSE_MUTATION;
1122     }
1123
1124     if (creature_ptr->mimic_form == MIMIC_DEMON_LORD) {
1125         result |= FLAG_CAUSE_RACE;
1126     }
1127
1128     if (is_specific_player_race(creature_ptr, RACE_DRACONIAN) || is_specific_player_race(creature_ptr, RACE_SPECTRE)
1129         || is_specific_player_race(creature_ptr, RACE_SPRITE) || is_specific_player_race(creature_ptr, RACE_ARCHON)
1130         || is_specific_player_race(creature_ptr, RACE_S_FAIRY)) {
1131         result |= FLAG_CAUSE_RACE;
1132     }
1133
1134     if (creature_ptr->special_defense & KAMAE_SEIRYU || creature_ptr->special_defense & KAMAE_SUZAKU || (creature_ptr->special_defense & KATA_MUSOU)) {
1135         result |= FLAG_CAUSE_BATTLE_FORM;
1136     }
1137
1138     if (creature_ptr->ult_res || creature_ptr->magicdef) {
1139         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1140     }
1141
1142     if (creature_ptr->tim_levitation) {
1143         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1144     }
1145
1146     result |= check_equipment_flags(creature_ptr, TR_LEVITATION);
1147
1148     if (creature_ptr->riding) {
1149         monster_type *riding_m_ptr = &creature_ptr->current_floor_ptr->m_list[creature_ptr->riding];
1150         monster_race *riding_r_ptr = &r_info[riding_m_ptr->r_idx];
1151         result = (riding_r_ptr->flags7 & RF7_CAN_FLY) ? FLAG_CAUSE_RIDING : FLAG_CAUSE_NONE;
1152     }
1153     return result;
1154 }
1155
1156 bool has_can_swim(player_type *creature_ptr)
1157 {
1158     bool can_swim = FALSE;
1159     if (creature_ptr->riding) {
1160         monster_type *riding_m_ptr = &creature_ptr->current_floor_ptr->m_list[creature_ptr->riding];
1161         monster_race *riding_r_ptr = &r_info[riding_m_ptr->r_idx];
1162         if (riding_r_ptr->flags7 & (RF7_CAN_SWIM | RF7_AQUATIC))
1163             can_swim = TRUE;
1164     }
1165
1166     return can_swim;
1167 }
1168
1169 BIT_FLAGS has_slow_digest(player_type *creature_ptr)
1170 {
1171     BIT_FLAGS result = 0L;
1172
1173     if (creature_ptr->pclass == CLASS_NINJA) {
1174         result |= FLAG_CAUSE_CLASS;
1175     }
1176
1177     if (creature_ptr->lev > 14 && !creature_ptr->mimic_form && creature_ptr->prace == RACE_HALF_TROLL) {
1178         if (creature_ptr->pclass == CLASS_WARRIOR || creature_ptr->pclass == CLASS_BERSERKER) {
1179             result |= FLAG_CAUSE_CLASS;
1180             /* Let's not make Regeneration
1181              * a disadvantage for the poor warriors who can
1182              * never learn a spell that satisfies hunger (actually
1183              * neither can rogues, but half-trolls are not
1184              * supposed to play rogues) */
1185         }
1186     }
1187
1188     if (creature_ptr->special_defense & KATA_MUSOU) {
1189         result |= FLAG_CAUSE_BATTLE_FORM;
1190     }
1191
1192     if (creature_ptr->ult_res) {
1193         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1194     }
1195
1196     if (!creature_ptr->mimic_form
1197         && (creature_ptr->prace == RACE_GOLEM || creature_ptr->prace == RACE_ZOMBIE || creature_ptr->prace == RACE_SPECTRE
1198             || creature_ptr->prace == RACE_ANDROID)) {
1199         result |= FLAG_CAUSE_RACE;
1200     }
1201
1202     result |= check_equipment_flags(creature_ptr, TR_SLOW_DIGEST);
1203     return result;
1204 }
1205
1206 BIT_FLAGS has_regenerate(player_type *creature_ptr)
1207 {
1208     BIT_FLAGS result = 0L;
1209
1210     if (is_specific_player_race(creature_ptr, RACE_HALF_TROLL) && creature_ptr->lev > 14) {
1211         result |= FLAG_CAUSE_RACE;
1212     }
1213
1214     if (is_specific_player_race(creature_ptr, RACE_AMBERITE)) {
1215         result |= FLAG_CAUSE_RACE;
1216     }
1217
1218     if (creature_ptr->pclass == CLASS_WARRIOR && creature_ptr->lev > 44) {
1219         result |= FLAG_CAUSE_RACE;
1220     }
1221
1222     if (creature_ptr->pclass == CLASS_BERSERKER) {
1223         result |= FLAG_CAUSE_RACE;
1224     }
1225
1226     if (creature_ptr->muta.has(MUTA::REGEN))
1227         result |= FLAG_CAUSE_MUTATION;
1228
1229     if (creature_ptr->special_defense & KATA_MUSOU) {
1230         result |= FLAG_CAUSE_BATTLE_FORM;
1231     }
1232
1233     if (hex_spelling(creature_ptr, HEX_DEMON_AURA) || creature_ptr->ult_res || creature_ptr->tim_regen) {
1234         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1235     }
1236
1237     result |= check_equipment_flags(creature_ptr, TR_REGEN);
1238
1239     if (creature_ptr->muta.has(MUTA::FLESH_ROT))
1240         result = 0L;
1241
1242     return result;
1243 }
1244
1245 void update_curses(player_type *creature_ptr)
1246 {
1247     object_type *o_ptr;
1248     BIT_FLAGS flgs[TR_FLAG_SIZE];
1249     creature_ptr->cursed = 0L;
1250
1251     if (creature_ptr->pseikaku == PERSONALITY_SEXY)
1252         creature_ptr->cursed |= (TRC_AGGRAVATE);
1253
1254     for (int i = INVEN_MAIN_HAND; i < INVEN_TOTAL; i++) {
1255         o_ptr = &creature_ptr->inventory_list[i];
1256         if (!o_ptr->k_idx)
1257             continue;
1258         object_flags(creature_ptr, o_ptr, flgs);
1259         if (has_flag(flgs, TR_AGGRAVATE))
1260             creature_ptr->cursed |= TRC_AGGRAVATE;
1261         if (has_flag(flgs, TR_DRAIN_EXP))
1262             creature_ptr->cursed |= TRC_DRAIN_EXP;
1263         if (has_flag(flgs, TR_TY_CURSE))
1264             creature_ptr->cursed |= TRC_TY_CURSE;
1265         if (has_flag(flgs, TR_ADD_L_CURSE))
1266             creature_ptr->cursed |= TRC_ADD_L_CURSE;
1267         if (has_flag(flgs, TR_ADD_H_CURSE))
1268             creature_ptr->cursed |= TRC_ADD_H_CURSE;
1269         if (has_flag(flgs, TR_DRAIN_HP))
1270             creature_ptr->cursed |= TRC_DRAIN_HP;
1271         if (has_flag(flgs, TR_DRAIN_MANA))
1272             creature_ptr->cursed |= TRC_DRAIN_MANA;
1273         if (has_flag(flgs, TR_CALL_ANIMAL))
1274             creature_ptr->cursed |= TRC_CALL_ANIMAL;
1275         if (has_flag(flgs, TR_CALL_DEMON))
1276             creature_ptr->cursed |= TRC_CALL_DEMON;
1277         if (has_flag(flgs, TR_CALL_DRAGON))
1278             creature_ptr->cursed |= TRC_CALL_DRAGON;
1279         if (has_flag(flgs, TR_CALL_UNDEAD))
1280             creature_ptr->cursed |= TRC_CALL_UNDEAD;
1281         if (has_flag(flgs, TR_COWARDICE))
1282             creature_ptr->cursed |= TRC_COWARDICE;
1283         if (has_flag(flgs, TR_LOW_MELEE))
1284             creature_ptr->cursed |= TRC_LOW_MELEE;
1285         if (has_flag(flgs, TR_LOW_AC))
1286             creature_ptr->cursed |= TRC_LOW_AC;
1287         if (has_flag(flgs, TR_HARD_SPELL))
1288             creature_ptr->cursed |= TRC_HARD_SPELL;
1289         if (has_flag(flgs, TR_FAST_DIGEST))
1290             creature_ptr->cursed |= TRC_FAST_DIGEST;
1291         if (has_flag(flgs, TR_SLOW_REGEN))
1292             creature_ptr->cursed |= TRC_SLOW_REGEN;
1293
1294         creature_ptr->cursed |= (o_ptr->curse_flags & (0xFFFFFFF0L));
1295         if (o_ptr->name1 == ART_CHAINSWORD)
1296             creature_ptr->cursed |= TRC_CHAINSWORD;
1297
1298         if (has_flag(flgs, TR_TELEPORT)) {
1299             if (object_is_cursed(o_ptr))
1300                 creature_ptr->cursed |= TRC_TELEPORT;
1301             else {
1302                 concptr insc = quark_str(o_ptr->inscription);
1303
1304                 /* {.} will stop random teleportation. */
1305                 if (o_ptr->inscription && angband_strchr(insc, '.')) {
1306                 } else {
1307                     creature_ptr->cursed |= TRC_TELEPORT_SELF;
1308                 }
1309             }
1310         }
1311     }
1312
1313     if (creature_ptr->cursed & TRC_TELEPORT)
1314         creature_ptr->cursed &= ~(TRC_TELEPORT_SELF);
1315 }
1316
1317 BIT_FLAGS has_impact(player_type *creature_ptr)
1318 {
1319     return check_equipment_flags(creature_ptr, TR_IMPACT);
1320 }
1321
1322 void update_extra_blows(player_type *creature_ptr)
1323 {
1324     object_type *o_ptr;
1325     BIT_FLAGS flgs[TR_FLAG_SIZE];
1326     creature_ptr->extra_blows[0] = creature_ptr->extra_blows[1] = 0;
1327
1328     for (int i = INVEN_MAIN_HAND; i < INVEN_TOTAL; i++) {
1329         o_ptr = &creature_ptr->inventory_list[i];
1330         if (!o_ptr->k_idx)
1331             continue;
1332
1333         object_flags(creature_ptr, o_ptr, flgs);
1334         if (has_flag(flgs, TR_BLOWS)) {
1335             if ((i == INVEN_MAIN_HAND || i == INVEN_MAIN_RING) && !has_two_handed_weapons(creature_ptr))
1336                 creature_ptr->extra_blows[0] += o_ptr->pval;
1337             else if ((i == INVEN_SUB_HAND || i == INVEN_SUB_RING) && !has_two_handed_weapons(creature_ptr))
1338                 creature_ptr->extra_blows[1] += o_ptr->pval;
1339             else {
1340                 creature_ptr->extra_blows[0] += o_ptr->pval;
1341                 creature_ptr->extra_blows[1] += o_ptr->pval;
1342             }
1343         }
1344     }
1345 }
1346
1347 BIT_FLAGS has_resist_acid(player_type *creature_ptr)
1348 {
1349     BIT_FLAGS result = 0L;
1350
1351     if (creature_ptr->mimic_form == MIMIC_DEMON_LORD) {
1352         result |= FLAG_CAUSE_RACE;
1353     } else if (is_specific_player_race(creature_ptr, RACE_YEEK) || is_specific_player_race(creature_ptr, RACE_KLACKON)) {
1354         result |= FLAG_CAUSE_RACE;
1355     } else if (is_specific_player_race(creature_ptr, RACE_DRACONIAN) && creature_ptr->lev > 14) {
1356         result |= FLAG_CAUSE_RACE;
1357     }
1358
1359     if (creature_ptr->special_defense & KAMAE_SEIRYU || creature_ptr->special_defense & KATA_MUSOU) {
1360         result |= FLAG_CAUSE_BATTLE_FORM;
1361     }
1362
1363     if (creature_ptr->ult_res) {
1364         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1365     }
1366
1367     if (has_element_resist(creature_ptr, ElementRealm::SEA, 1))
1368         result |= FLAG_CAUSE_CLASS;
1369
1370     result |= has_immune_acid(creature_ptr);
1371
1372     result |= check_equipment_flags(creature_ptr, TR_RES_ACID);
1373     return result;
1374 }
1375
1376 BIT_FLAGS has_vuln_acid(player_type *creature_ptr)
1377 {
1378     BIT_FLAGS result = 0L;
1379     if (creature_ptr->muta.has(MUTA::VULN_ELEM)) {
1380         result |= FLAG_CAUSE_MUTATION;
1381     }
1382
1383     if (creature_ptr->special_defense & KATA_KOUKIJIN) {
1384         result |= FLAG_CAUSE_BATTLE_FORM;
1385     }
1386     return result;
1387 }
1388
1389 BIT_FLAGS has_resist_elec(player_type *creature_ptr)
1390 {
1391     BIT_FLAGS result = 0L;
1392
1393     if (creature_ptr->mimic_form == MIMIC_DEMON_LORD) {
1394         result |= FLAG_CAUSE_RACE;
1395     } else if (is_specific_player_race(creature_ptr, RACE_DRACONIAN) && creature_ptr->lev > 19) {
1396         result |= FLAG_CAUSE_RACE;
1397     }
1398
1399     if (creature_ptr->special_defense & KAMAE_SEIRYU || creature_ptr->special_defense & KATA_MUSOU) {
1400         result |= FLAG_CAUSE_BATTLE_FORM;
1401     }
1402
1403     if (creature_ptr->ult_res) {
1404         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1405     }
1406
1407     if (has_element_resist(creature_ptr, ElementRealm::SKY, 1))
1408         result |= FLAG_CAUSE_CLASS;
1409
1410     result |= check_equipment_flags(creature_ptr, TR_RES_ELEC);
1411     result |= has_immune_elec(creature_ptr);
1412     return result;
1413 }
1414
1415 BIT_FLAGS has_vuln_elec(player_type *creature_ptr)
1416 {
1417     BIT_FLAGS result = 0L;
1418     if (creature_ptr->muta.has(MUTA::VULN_ELEM)) {
1419         result |= FLAG_CAUSE_MUTATION;
1420     }
1421
1422     if (is_specific_player_race(creature_ptr, RACE_ANDROID)) {
1423         result |= FLAG_CAUSE_RACE;
1424     }
1425
1426     if (creature_ptr->special_defense & KATA_KOUKIJIN) {
1427         result |= FLAG_CAUSE_BATTLE_FORM;
1428     }
1429     return result;
1430 }
1431
1432 BIT_FLAGS has_resist_fire(player_type *creature_ptr)
1433 {
1434     BIT_FLAGS result = 0L;
1435
1436     if (creature_ptr->mimic_form == MIMIC_DEMON || creature_ptr->mimic_form == MIMIC_DEMON_LORD) {
1437         result |= FLAG_CAUSE_RACE;
1438     }
1439
1440     if (is_specific_player_race(creature_ptr, RACE_DRACONIAN) && creature_ptr->lev > 4) {
1441         result |= FLAG_CAUSE_RACE;
1442     }
1443
1444     if (!creature_ptr->mimic_form && (creature_ptr->prace == RACE_IMP || creature_ptr->prace == RACE_BALROG)) {
1445         result |= FLAG_CAUSE_RACE;
1446     }
1447
1448     if (creature_ptr->special_defense & KAMAE_SEIRYU || creature_ptr->special_defense & KATA_MUSOU) {
1449         result |= FLAG_CAUSE_BATTLE_FORM;
1450     }
1451
1452     if (creature_ptr->ult_res) {
1453         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1454     }
1455
1456     if (has_element_resist(creature_ptr, ElementRealm::FIRE, 1))
1457         result |= FLAG_CAUSE_CLASS;
1458
1459     result |= check_equipment_flags(creature_ptr, TR_RES_FIRE);
1460     result |= has_immune_fire(creature_ptr);
1461     return result;
1462 }
1463
1464 BIT_FLAGS has_vuln_fire(player_type *creature_ptr)
1465 {
1466     BIT_FLAGS result = 0L;
1467     if (creature_ptr->muta.has(MUTA::VULN_ELEM)) {
1468         result |= FLAG_CAUSE_MUTATION;
1469     }
1470
1471     if (is_specific_player_race(creature_ptr, RACE_ENT)) {
1472         result |= FLAG_CAUSE_RACE;
1473     }
1474
1475     if (creature_ptr->special_defense & KATA_KOUKIJIN) {
1476         result |= FLAG_CAUSE_BATTLE_FORM;
1477     }
1478     return result;
1479 }
1480
1481 BIT_FLAGS has_resist_cold(player_type *creature_ptr)
1482 {
1483     BIT_FLAGS result = 0L;
1484
1485     if (creature_ptr->mimic_form == MIMIC_DEMON_LORD || creature_ptr->mimic_form == MIMIC_VAMPIRE) {
1486         result |= FLAG_CAUSE_RACE;
1487     }
1488
1489     if (!creature_ptr->mimic_form && (creature_ptr->prace == RACE_ZOMBIE) && creature_ptr->lev > 4) {
1490         result |= FLAG_CAUSE_RACE;
1491     }
1492
1493     if ((is_specific_player_race(creature_ptr, RACE_DRACONIAN) || is_specific_player_race(creature_ptr, RACE_SKELETON)) && creature_ptr->lev > 9) {
1494         result |= FLAG_CAUSE_RACE;
1495     }
1496
1497     if (!creature_ptr->mimic_form && (creature_ptr->prace == RACE_VAMPIRE || creature_ptr->prace == RACE_SPECTRE)) {
1498         result |= FLAG_CAUSE_RACE;
1499     }
1500
1501     if (creature_ptr->special_defense & KAMAE_SEIRYU || creature_ptr->special_defense & KATA_MUSOU) {
1502         result |= FLAG_CAUSE_BATTLE_FORM;
1503     }
1504
1505     if (creature_ptr->ult_res) {
1506         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1507     }
1508
1509     if (has_element_resist(creature_ptr, ElementRealm::ICE, 1))
1510         result |= FLAG_CAUSE_CLASS;
1511
1512     result |= check_equipment_flags(creature_ptr, TR_RES_COLD);
1513     result |= has_immune_cold(creature_ptr);
1514     return result;
1515 }
1516
1517 BIT_FLAGS has_vuln_cold(player_type *creature_ptr)
1518 {
1519     BIT_FLAGS result = 0L;
1520     if (creature_ptr->muta.has(MUTA::VULN_ELEM)) {
1521         result |= FLAG_CAUSE_MUTATION;
1522     }
1523
1524     if (creature_ptr->special_defense & KATA_KOUKIJIN) {
1525         result |= FLAG_CAUSE_BATTLE_FORM;
1526     }
1527     return result;
1528 }
1529
1530 BIT_FLAGS has_resist_pois(player_type *creature_ptr)
1531 {
1532     BIT_FLAGS result = 0L;
1533
1534     if (creature_ptr->pclass == CLASS_NINJA && creature_ptr->lev > 19)
1535         result |= FLAG_CAUSE_CLASS;
1536
1537     if (creature_ptr->mimic_form == MIMIC_VAMPIRE || creature_ptr->mimic_form == MIMIC_DEMON_LORD) {
1538         result |= FLAG_CAUSE_RACE;
1539     }
1540
1541     if (is_specific_player_race(creature_ptr, RACE_DRACONIAN) && creature_ptr->lev > 34) {
1542         result |= FLAG_CAUSE_RACE;
1543     }
1544
1545     if (!creature_ptr->mimic_form
1546         && (creature_ptr->prace == RACE_KOBOLD || creature_ptr->prace == RACE_GOLEM || creature_ptr->prace == RACE_SKELETON
1547             || creature_ptr->prace == RACE_VAMPIRE || creature_ptr->prace == RACE_SPECTRE || creature_ptr->prace == RACE_ANDROID)) {
1548         result |= FLAG_CAUSE_RACE;
1549     }
1550
1551     if (creature_ptr->special_defense & KAMAE_SEIRYU || creature_ptr->special_defense & KATA_MUSOU) {
1552         result |= FLAG_CAUSE_BATTLE_FORM;
1553     }
1554
1555     if (creature_ptr->ult_res) {
1556         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1557     }
1558
1559     if (has_element_resist(creature_ptr, ElementRealm::DEATH, 1))
1560         result |= FLAG_CAUSE_CLASS;
1561
1562     result |= check_equipment_flags(creature_ptr, TR_RES_POIS);
1563     return result;
1564 }
1565
1566 BIT_FLAGS has_resist_conf(player_type *creature_ptr)
1567 {
1568     BIT_FLAGS result = 0L;
1569
1570     if (creature_ptr->pclass == CLASS_MINDCRAFTER && creature_ptr->lev > 29)
1571         result |= FLAG_CAUSE_CLASS;
1572
1573     if (creature_ptr->pseikaku == PERSONALITY_CHARGEMAN || creature_ptr->pseikaku == PERSONALITY_MUNCHKIN) {
1574         result |= FLAG_CAUSE_PERSONALITY;
1575     }
1576
1577     if (!creature_ptr->mimic_form && (creature_ptr->prace == RACE_KLACKON || creature_ptr->prace == RACE_BEASTMAN || creature_ptr->prace == RACE_KUTAR)) {
1578         result |= FLAG_CAUSE_RACE;
1579     }
1580
1581     if (creature_ptr->mimic_form == MIMIC_DEMON_LORD) {
1582         result |= FLAG_CAUSE_RACE;
1583     }
1584
1585     if (creature_ptr->ult_res || creature_ptr->magicdef) {
1586         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1587     }
1588
1589     if (creature_ptr->special_defense & KATA_MUSOU) {
1590         result |= FLAG_CAUSE_BATTLE_FORM;
1591     }
1592
1593     if (has_element_resist(creature_ptr, ElementRealm::CHAOS, 1))
1594         result |= FLAG_CAUSE_CLASS;
1595
1596     result |= check_equipment_flags(creature_ptr, TR_RES_CONF);
1597     return result;
1598 }
1599
1600 BIT_FLAGS has_resist_sound(player_type *creature_ptr)
1601 {
1602     BIT_FLAGS result = 0L;
1603
1604     if (creature_ptr->pclass == CLASS_BARD) {
1605         result |= FLAG_CAUSE_CLASS;
1606     }
1607
1608     if (!creature_ptr->mimic_form && (creature_ptr->prace == RACE_CYCLOPS || creature_ptr->prace == RACE_BEASTMAN)) {
1609         result |= FLAG_CAUSE_RACE;
1610     }
1611
1612     if (creature_ptr->special_defense & KATA_MUSOU) {
1613         result |= FLAG_CAUSE_BATTLE_FORM;
1614     }
1615
1616     if (creature_ptr->ult_res) {
1617         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1618     }
1619
1620     result |= check_equipment_flags(creature_ptr, TR_RES_SOUND);
1621     return result;
1622 }
1623
1624 BIT_FLAGS has_resist_lite(player_type *creature_ptr)
1625 {
1626     BIT_FLAGS result = 0L;
1627
1628     if (!creature_ptr->mimic_form && (creature_ptr->prace == RACE_ELF || creature_ptr->prace == RACE_HIGH_ELF || creature_ptr->prace == RACE_SPRITE)) {
1629         result |= FLAG_CAUSE_RACE;
1630     }
1631
1632     if (creature_ptr->special_defense & KATA_MUSOU) {
1633         result |= FLAG_CAUSE_BATTLE_FORM;
1634     }
1635
1636     if (creature_ptr->ult_res) {
1637         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1638     }
1639
1640     result |= check_equipment_flags(creature_ptr, TR_RES_LITE);
1641     return result;
1642 }
1643
1644 BIT_FLAGS has_vuln_lite(player_type *creature_ptr)
1645 {
1646     BIT_FLAGS result = 0L;
1647     if (is_specific_player_race(creature_ptr, RACE_S_FAIRY) || is_specific_player_race(creature_ptr, RACE_VAMPIRE)
1648         || (creature_ptr->mimic_form == MIMIC_VAMPIRE)) {
1649         result |= FLAG_CAUSE_RACE;
1650     }
1651
1652     if (creature_ptr->wraith_form) {
1653         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1654     }
1655
1656     return result;
1657 }
1658
1659 BIT_FLAGS has_resist_dark(player_type *creature_ptr)
1660 {
1661     BIT_FLAGS result = 0L;
1662
1663     if (creature_ptr->mimic_form == MIMIC_VAMPIRE) {
1664         result |= FLAG_CAUSE_RACE;
1665     }
1666
1667     if (!creature_ptr->mimic_form
1668         && (creature_ptr->prace == RACE_HALF_ORC || creature_ptr->prace == RACE_HALF_OGRE || creature_ptr->prace == RACE_NIBELUNG
1669             || creature_ptr->prace == RACE_DARK_ELF || creature_ptr->prace == RACE_VAMPIRE)) {
1670         result |= FLAG_CAUSE_RACE;
1671     }
1672
1673     if (creature_ptr->special_defense & KATA_MUSOU) {
1674         result |= FLAG_CAUSE_BATTLE_FORM;
1675     }
1676
1677     if (creature_ptr->ult_res) {
1678         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1679     }
1680
1681     if (has_element_resist(creature_ptr, ElementRealm::DARKNESS, 1))
1682         result |= FLAG_CAUSE_CLASS;
1683
1684     result |= check_equipment_flags(creature_ptr, TR_RES_DARK);
1685     return result;
1686 }
1687
1688 BIT_FLAGS has_resist_chaos(player_type *creature_ptr)
1689 {
1690     BIT_FLAGS result = 0L;
1691
1692     if (creature_ptr->pclass == CLASS_CHAOS_WARRIOR && creature_ptr->lev > 29)
1693         result |= FLAG_CAUSE_CLASS;
1694
1695     if (creature_ptr->mimic_form == MIMIC_DEMON || creature_ptr->mimic_form == MIMIC_DEMON_LORD) {
1696         result |= FLAG_CAUSE_RACE;
1697     }
1698
1699     if (!creature_ptr->mimic_form && creature_ptr->prace == RACE_HALF_TITAN)
1700         result |= FLAG_CAUSE_RACE;
1701
1702     if (creature_ptr->special_defense & KATA_MUSOU) {
1703         result |= FLAG_CAUSE_BATTLE_FORM;
1704     }
1705
1706     if (creature_ptr->ult_res) {
1707         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1708     }
1709
1710     if (has_element_resist(creature_ptr, ElementRealm::CHAOS, 30))
1711         result |= FLAG_CAUSE_CLASS;
1712
1713     result |= check_equipment_flags(creature_ptr, TR_RES_CHAOS);
1714     return result;
1715 }
1716
1717 BIT_FLAGS has_resist_disen(player_type *creature_ptr)
1718 {
1719     BIT_FLAGS result = 0L;
1720
1721     if (creature_ptr->mimic_form == MIMIC_DEMON_LORD) {
1722         result |= FLAG_CAUSE_RACE;
1723     }
1724
1725     if (!creature_ptr->mimic_form && creature_ptr->prace == RACE_NIBELUNG)
1726         result |= FLAG_CAUSE_RACE;
1727
1728     if (creature_ptr->special_defense & KATA_MUSOU) {
1729         result |= FLAG_CAUSE_BATTLE_FORM;
1730     }
1731
1732     if (creature_ptr->ult_res) {
1733         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1734     }
1735
1736     if (has_element_resist(creature_ptr, ElementRealm::DEATH, 30))
1737         result |= FLAG_CAUSE_CLASS;
1738
1739     result |= check_equipment_flags(creature_ptr, TR_RES_DISEN);
1740     return result;
1741 }
1742
1743 BIT_FLAGS has_resist_shard(player_type *creature_ptr)
1744 {
1745     BIT_FLAGS result = 0L;
1746
1747     if (!creature_ptr->mimic_form && (creature_ptr->prace == RACE_HALF_GIANT || creature_ptr->prace == RACE_SKELETON))
1748         result |= FLAG_CAUSE_RACE;
1749
1750     if (creature_ptr->special_defense & KATA_MUSOU) {
1751         result |= FLAG_CAUSE_BATTLE_FORM;
1752     }
1753
1754     if (creature_ptr->ult_res) {
1755         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1756     }
1757
1758     if (has_element_resist(creature_ptr, ElementRealm::EARTH, 1))
1759         result |= FLAG_CAUSE_CLASS;
1760
1761     result |= check_equipment_flags(creature_ptr, TR_RES_SHARDS);
1762     return result;
1763 }
1764
1765 BIT_FLAGS has_resist_nexus(player_type *creature_ptr)
1766 {
1767     BIT_FLAGS result = 0L;
1768
1769     if (creature_ptr->mimic_form == MIMIC_DEMON_LORD) {
1770         result |= FLAG_CAUSE_RACE;
1771     }
1772
1773     if (creature_ptr->special_defense & KATA_MUSOU) {
1774         result |= FLAG_CAUSE_BATTLE_FORM;
1775     }
1776
1777     if (creature_ptr->ult_res) {
1778         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1779     }
1780
1781     result |= check_equipment_flags(creature_ptr, TR_RES_NEXUS);
1782     return result;
1783 }
1784
1785 BIT_FLAGS has_resist_blind(player_type *creature_ptr)
1786 {
1787     BIT_FLAGS result = 0L;
1788
1789     if (creature_ptr->pseikaku == PERSONALITY_MUNCHKIN) {
1790         result |= FLAG_CAUSE_PERSONALITY;
1791     }
1792
1793     if (!creature_ptr->mimic_form && creature_ptr->prace == RACE_DWARF)
1794         result |= FLAG_CAUSE_RACE;
1795
1796     if (creature_ptr->special_defense & KATA_MUSOU) {
1797         result |= FLAG_CAUSE_BATTLE_FORM;
1798     }
1799
1800     if (creature_ptr->ult_res || creature_ptr->magicdef) {
1801         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1802     }
1803
1804     result |= check_equipment_flags(creature_ptr, TR_RES_BLIND);
1805     return result;
1806 }
1807
1808 BIT_FLAGS has_resist_neth(player_type *creature_ptr)
1809 {
1810     BIT_FLAGS result = 0L;
1811
1812     if (creature_ptr->mimic_form == MIMIC_DEMON_LORD || creature_ptr->mimic_form == MIMIC_DEMON || creature_ptr->mimic_form == MIMIC_VAMPIRE) {
1813         result |= FLAG_CAUSE_RACE;
1814     }
1815
1816     if (!creature_ptr->mimic_form
1817         && (creature_ptr->prace == RACE_ZOMBIE || creature_ptr->prace == RACE_VAMPIRE || creature_ptr->prace == RACE_SPECTRE
1818             || creature_ptr->prace == RACE_BALROG))
1819         result |= FLAG_CAUSE_RACE;
1820
1821     if (creature_ptr->special_defense & KATA_MUSOU) {
1822         result |= FLAG_CAUSE_BATTLE_FORM;
1823     }
1824
1825     if (creature_ptr->ult_res || creature_ptr->tim_res_nether) {
1826         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1827     }
1828
1829     if (has_element_resist(creature_ptr, ElementRealm::DARKNESS, 30))
1830         result |= FLAG_CAUSE_CLASS;
1831
1832     result |= check_equipment_flags(creature_ptr, TR_RES_NETHER);
1833     return result;
1834 }
1835
1836 BIT_FLAGS has_resist_time(player_type *creature_ptr)
1837 {
1838     BIT_FLAGS result = 0L;
1839
1840     if (creature_ptr->tim_res_time) {
1841         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1842     }
1843
1844     result |= check_equipment_flags(creature_ptr, TR_RES_TIME);
1845     return result;
1846 }
1847
1848 BIT_FLAGS has_resist_water(player_type *creature_ptr)
1849 {
1850     BIT_FLAGS result = 0L;
1851
1852     if (!creature_ptr->mimic_form && creature_ptr->prace == RACE_MERFOLK)
1853         result |= FLAG_CAUSE_RACE;
1854
1855     result |= check_equipment_flags(creature_ptr, TR_RES_WATER);
1856     return result;
1857 }
1858
1859 BIT_FLAGS has_resist_fear(player_type *creature_ptr)
1860 {
1861     BIT_FLAGS result = 0L;
1862
1863     if (creature_ptr->muta.has(MUTA::FEARLESS))
1864         result |= FLAG_CAUSE_MUTATION;
1865
1866     switch (creature_ptr->pclass) {
1867     case CLASS_WARRIOR:
1868     case CLASS_SAMURAI:
1869         if (creature_ptr->lev > 29)
1870             result |= FLAG_CAUSE_CLASS;
1871         break;
1872     case CLASS_PALADIN:
1873     case CLASS_CHAOS_WARRIOR:
1874         if (creature_ptr->lev > 39)
1875             result |= FLAG_CAUSE_CLASS;
1876         break;
1877     case CLASS_MINDCRAFTER:
1878         if (creature_ptr->lev > 9)
1879             result |= FLAG_CAUSE_CLASS;
1880         break;
1881     case CLASS_NINJA:
1882         result |= FLAG_CAUSE_CLASS;
1883         break;
1884
1885     default:
1886         break;
1887     }
1888
1889     if (creature_ptr->mimic_form == MIMIC_DEMON_LORD) {
1890         result |= FLAG_CAUSE_RACE;
1891     }
1892
1893     if (!creature_ptr->mimic_form && creature_ptr->prace == RACE_BARBARIAN)
1894         result |= FLAG_CAUSE_RACE;
1895
1896     if ((creature_ptr->special_defense & KATA_MUSOU)) {
1897         result |= FLAG_CAUSE_BATTLE_FORM;
1898     }
1899
1900     if (is_hero(creature_ptr) || is_shero(creature_ptr) || creature_ptr->ult_res) {
1901         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1902     }
1903
1904     result |= check_equipment_flags(creature_ptr, TR_RES_FEAR);
1905     return result;
1906 }
1907
1908 BIT_FLAGS has_immune_acid(player_type *creature_ptr)
1909 {
1910     BIT_FLAGS result = 0L;
1911     if (!creature_ptr->mimic_form && creature_ptr->prace == RACE_YEEK && creature_ptr->lev > 19)
1912         result |= FLAG_CAUSE_RACE;
1913
1914     if (creature_ptr->ele_immune) {
1915         if (creature_ptr->special_defense & DEFENSE_ACID)
1916             result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1917     }
1918
1919     if (has_element_resist(creature_ptr, ElementRealm::SEA, 30))
1920         result |= FLAG_CAUSE_CLASS;
1921
1922     result |= check_equipment_flags(creature_ptr, TR_IM_ACID);
1923     return result;
1924 }
1925
1926 BIT_FLAGS has_immune_elec(player_type *creature_ptr)
1927 {
1928     BIT_FLAGS result = 0L;
1929
1930     if (creature_ptr->ele_immune) {
1931         if (creature_ptr->special_defense & DEFENSE_ELEC)
1932             result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1933     }
1934
1935     if (has_element_resist(creature_ptr, ElementRealm::SKY, 30))
1936         result |= FLAG_CAUSE_CLASS;
1937
1938     result |= check_equipment_flags(creature_ptr, TR_IM_ELEC);
1939     return result;
1940 }
1941
1942 BIT_FLAGS has_immune_fire(player_type *creature_ptr)
1943 {
1944     BIT_FLAGS result = 0L;
1945
1946     if (creature_ptr->ele_immune) {
1947         if (creature_ptr->special_defense & DEFENSE_FIRE)
1948             result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1949     }
1950
1951     if (has_element_resist(creature_ptr, ElementRealm::FIRE, 30))
1952         result |= FLAG_CAUSE_CLASS;
1953
1954     result |= check_equipment_flags(creature_ptr, TR_IM_FIRE);
1955     return result;
1956 }
1957
1958 BIT_FLAGS has_immune_cold(player_type *creature_ptr)
1959 {
1960     BIT_FLAGS result = 0L;
1961
1962     if (creature_ptr->ele_immune) {
1963         if (creature_ptr->special_defense & DEFENSE_COLD)
1964             result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1965     }
1966
1967     if (has_element_resist(creature_ptr, ElementRealm::ICE, 30))
1968         result |= FLAG_CAUSE_CLASS;
1969
1970     result |= check_equipment_flags(creature_ptr, TR_IM_COLD);
1971     return result;
1972 }
1973
1974 BIT_FLAGS has_immune_dark(player_type *creature_ptr)
1975 {
1976     BIT_FLAGS result = 0L;
1977
1978     if (is_specific_player_race(creature_ptr, RACE_VAMPIRE) || (creature_ptr->mimic_form == MIMIC_VAMPIRE)) {
1979         result |= FLAG_CAUSE_RACE;
1980     }
1981
1982     if (creature_ptr->wraith_form) {
1983         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1984     }
1985
1986     return result;
1987 }
1988
1989 melee_type player_melee_type(player_type *creature_ptr)
1990 {
1991     if (has_two_handed_weapons(creature_ptr))
1992         return MELEE_TYPE_WEAPON_TWOHAND;
1993
1994     if (has_melee_weapon(creature_ptr, INVEN_MAIN_HAND)) {
1995         if (has_melee_weapon(creature_ptr, INVEN_SUB_HAND)) {
1996             return MELEE_TYPE_WEAPON_DOUBLE;
1997         }
1998         return MELEE_TYPE_WEAPON_MAIN;
1999     }
2000
2001     if (has_melee_weapon(creature_ptr, INVEN_SUB_HAND))
2002         return MELEE_TYPE_WEAPON_SUB;
2003
2004     if (empty_hands(creature_ptr, FALSE) == (EMPTY_HAND_MAIN | EMPTY_HAND_SUB))
2005         return MELEE_TYPE_BAREHAND_TWO;
2006
2007     if (empty_hands(creature_ptr, FALSE) == EMPTY_HAND_MAIN)
2008         return MELEE_TYPE_BAREHAND_MAIN;
2009
2010     if (empty_hands(creature_ptr, FALSE) == EMPTY_HAND_SUB)
2011         return MELEE_TYPE_BAREHAND_SUB;
2012
2013     return MELEE_TYPE_SHIELD_DOUBLE;
2014 }
2015
2016 /*
2017  * @brief 利き手で攻撃可能かどうかを判定する
2018  *        利き手で攻撃可能とは、利き手に武器を持っているか、
2019  *        利き手が素手かつ左手も素手もしくは盾を装備している事を意味する。
2020  * @detail Includes martial arts and hand combats as weapons.
2021  */
2022 bool can_attack_with_main_hand(player_type *creature_ptr)
2023 {
2024     if (has_melee_weapon(creature_ptr, INVEN_MAIN_HAND))
2025         return TRUE;
2026
2027     if ((empty_hands(creature_ptr, TRUE) & EMPTY_HAND_MAIN) && !can_attack_with_sub_hand(creature_ptr))
2028         return TRUE;
2029
2030     return FALSE;
2031 }
2032
2033 /*
2034  * @brief 非利き手で攻撃可能かどうかを判定する
2035  *        非利き手で攻撃可能とは、非利き手に武器を持っている事に等しい
2036  * @detail Exclude martial arts and hand combats from weapons.
2037  */
2038 bool can_attack_with_sub_hand(player_type *creature_ptr)
2039 {
2040     return has_melee_weapon(creature_ptr, INVEN_SUB_HAND);
2041 }
2042
2043 /*
2044  * @brief 両手持ち状態かどうかを判定する
2045  */
2046 bool has_two_handed_weapons(player_type *creature_ptr)
2047 {
2048     if (can_two_hands_wielding(creature_ptr)) {
2049         if (can_attack_with_main_hand(creature_ptr) && (empty_hands(creature_ptr, FALSE) == EMPTY_HAND_SUB)
2050             && object_allow_two_hands_wielding(&creature_ptr->inventory_list[INVEN_MAIN_HAND])) {
2051             return TRUE;
2052         } else if (can_attack_with_sub_hand(creature_ptr) && (empty_hands(creature_ptr, FALSE) == EMPTY_HAND_MAIN)
2053             && object_allow_two_hands_wielding(&creature_ptr->inventory_list[INVEN_SUB_HAND])) {
2054             return TRUE;
2055         }
2056     }
2057     return FALSE;
2058 }
2059
2060 BIT_FLAGS has_lite(player_type *creature_ptr)
2061 {
2062     BIT_FLAGS result = 0L;
2063     if (creature_ptr->pclass == CLASS_NINJA)
2064         return 0L;
2065
2066     if (creature_ptr->pseikaku == PERSONALITY_MUNCHKIN) {
2067         result |= FLAG_CAUSE_PERSONALITY;
2068     }
2069
2070     if (creature_ptr->mimic_form == MIMIC_VAMPIRE) {
2071         result |= FLAG_CAUSE_RACE;
2072     }
2073
2074     if (!creature_ptr->mimic_form && creature_ptr->prace == RACE_VAMPIRE)
2075         result |= FLAG_CAUSE_RACE;
2076
2077     if (creature_ptr->ult_res) {
2078         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
2079     }
2080
2081     if (creature_ptr->special_defense & KATA_MUSOU) {
2082         result |= FLAG_CAUSE_BATTLE_FORM;
2083     }
2084
2085     result |= has_sh_fire(creature_ptr);
2086
2087     return result;
2088 }
2089
2090 /*
2091  * @brief 両手持ちボーナスがもらえないかどうかを判定する。 / Does *not * get two hand wielding bonus.
2092  * @detail
2093  *  Only can get hit bonuses when wieids an enough light weapon which is lighter than 5 times of weight limit.
2094  *  If its weight is 10 times heavier or more than weight limit, gets hit penalty in calc_to_hit().
2095  */
2096 bool has_disable_two_handed_bonus(player_type *creature_ptr, int i)
2097 {
2098     if (has_melee_weapon(creature_ptr, INVEN_MAIN_HAND + i) && has_two_handed_weapons(creature_ptr)) {
2099         object_type *o_ptr = &creature_ptr->inventory_list[INVEN_MAIN_HAND + i];
2100         int limit = calc_weapon_weight_limit(creature_ptr) * 2;
2101
2102         /* Enable when two hand wields an enough light weapon */
2103         if (limit >= o_ptr->weight / 5)
2104             return FALSE;
2105     }
2106
2107     /* Disable when empty hands, one hand wieldings and heavy weapons */
2108     return TRUE;
2109 }
2110
2111 /*!
2112  * @brief ふさわしくない武器を持っているかどうかを返す。
2113  * @todo 相応しい時にFALSEで相応しくない時にTRUEという負論理は良くない、後で修正する
2114  */
2115 bool has_icky_wield_weapon(player_type *creature_ptr, int i)
2116 {
2117     BIT_FLAGS flgs[TR_FLAG_SIZE];
2118     object_type *o_ptr = &creature_ptr->inventory_list[INVEN_MAIN_HAND + i];
2119     object_flags(creature_ptr, o_ptr, flgs);
2120
2121     bool has_no_weapon = (o_ptr->tval == TV_NONE) || (o_ptr->tval == TV_SHIELD);
2122     if (creature_ptr->pclass == CLASS_PRIEST) {
2123         bool is_suitable_weapon = has_flag(flgs, TR_BLESSED);
2124         is_suitable_weapon |= (o_ptr->tval != TV_SWORD) && (o_ptr->tval != TV_POLEARM);
2125         return !has_no_weapon && !is_suitable_weapon;
2126     }
2127
2128     if (creature_ptr->pclass == CLASS_SORCERER) {
2129         bool is_suitable_weapon = o_ptr->tval == TV_HAFTED;
2130         is_suitable_weapon &= (o_ptr->sval == SV_WIZSTAFF) || (o_ptr->sval == SV_NAMAKE_HAMMER);
2131         return !has_no_weapon && !is_suitable_weapon;
2132     }
2133
2134     if (has_not_monk_weapon(creature_ptr, i) || has_not_ninja_weapon(creature_ptr, i))
2135         return TRUE;
2136
2137     return FALSE;
2138 }
2139
2140 bool has_riding_wield_weapon(player_type *creature_ptr, int i)
2141 {
2142     object_type *o_ptr;
2143     BIT_FLAGS flgs[TR_FLAG_SIZE];
2144     o_ptr = &creature_ptr->inventory_list[INVEN_MAIN_HAND + i];
2145     object_flags(creature_ptr, o_ptr, flgs);
2146     if (creature_ptr->riding != 0 && !(o_ptr->tval == TV_POLEARM) && ((o_ptr->sval == SV_LANCE) || (o_ptr->sval == SV_HEAVY_LANCE))
2147         && !has_flag(flgs, TR_RIDING)) {
2148         return TRUE;
2149     }
2150     return FALSE;
2151 }
2152
2153 bool has_not_ninja_weapon(player_type *creature_ptr, int i)
2154 {
2155     if (!has_melee_weapon(creature_ptr, INVEN_MAIN_HAND + i)) {
2156         return FALSE;
2157     }
2158     int tval = creature_ptr->inventory_list[INVEN_MAIN_HAND + i].tval - TV_WEAPON_BEGIN;
2159     OBJECT_SUBTYPE_VALUE sval = creature_ptr->inventory_list[INVEN_MAIN_HAND + i].sval;
2160     return creature_ptr->pclass == CLASS_NINJA
2161         && !((s_info[CLASS_NINJA].w_max[tval][sval] > WEAPON_EXP_BEGINNER) && (creature_ptr->inventory_list[INVEN_SUB_HAND - i].tval != TV_SHIELD));
2162 }
2163
2164 bool has_not_monk_weapon(player_type *creature_ptr, int i)
2165 {
2166     if (!has_melee_weapon(creature_ptr, INVEN_MAIN_HAND + i)) {
2167         return FALSE;
2168     }
2169     int tval = creature_ptr->inventory_list[INVEN_MAIN_HAND + i].tval - TV_WEAPON_BEGIN;
2170     OBJECT_SUBTYPE_VALUE sval = creature_ptr->inventory_list[INVEN_MAIN_HAND + i].sval;
2171     return ((creature_ptr->pclass == CLASS_MONK) || (creature_ptr->pclass == CLASS_FORCETRAINER)) && !(s_info[creature_ptr->pclass].w_max[tval][sval]);
2172 }
2173
2174 bool has_good_luck(player_type *creature_ptr)
2175 {
2176     return (creature_ptr->pseikaku == PERSONALITY_LUCKY) || (creature_ptr->muta.has(MUTA::GOOD_LUCK));
2177 }
2178
2179 BIT_FLAGS player_aggravate_state(player_type *creature_ptr)
2180 {
2181     if (creature_ptr->cursed & TRC_AGGRAVATE) {
2182         if ((is_specific_player_race(creature_ptr, RACE_S_FAIRY)) && (creature_ptr->pseikaku != PERSONALITY_SEXY)) {
2183             return AGGRAVATE_S_FAIRY;
2184         }
2185         return AGGRAVATE_NORMAL;
2186     }
2187
2188     return AGGRAVATE_NONE;
2189 }
2190
2191 bool has_aggravate(player_type *creature_ptr)
2192 {
2193     return player_aggravate_state(creature_ptr) == AGGRAVATE_NORMAL;
2194 }