OSDN Git Service

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