1 #include "player/player-status-flags.h"
2 #include "artifact/fixed-art-types.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-infravision.h"
18 #include "player-status/player-speed.h"
19 #include "player-status/player-stealth.h"
20 #include "player/attack-defense-types.h"
21 #include "player/mimic-info-table.h"
22 #include "player/player-class.h"
23 #include "player/player-race-types.h"
24 #include "player/player-race.h"
25 #include "player/player-skill.h"
26 #include "player/player-status.h"
27 #include "player/race-info-table.h"
28 #include "player/special-defense-types.h"
29 #include "realm/realm-hex-numbers.h"
30 #include "realm/realm-song-numbers.h"
31 #include "realm/realm-types.h"
32 #include "spell-realm/spells-hex.h"
33 #include "sv-definition/sv-weapon-types.h"
34 #include "system/floor-type-definition.h"
35 #include "system/monster-race-definition.h"
36 #include "system/monster-type-definition.h"
37 #include "system/object-type-definition.h"
38 #include "system/player-type-definition.h"
39 #include "util/bit-flags-calculator.h"
40 #include "util/quarks.h"
41 #include "util/string-processor.h"
43 BIT_FLAGS convert_inventory_slot_type_to_flag_cause(inventory_slot_type inventory_slot)
45 switch (inventory_slot) {
47 return FLAG_CAUSE_INVEN_MAIN_HAND;
49 return FLAG_CAUSE_INVEN_SUB_HAND;
51 return FLAG_CAUSE_INVEN_BOW;
53 return FLAG_CAUSE_INVEN_MAIN_RING;
55 return FLAG_CAUSE_INVEN_SUB_RING;
57 return FLAG_CAUSE_INVEN_NECK;
59 return FLAG_CAUSE_INVEN_LITE;
61 return FLAG_CAUSE_INVEN_BODY;
63 return FLAG_CAUSE_INVEN_OUTER;
65 return FLAG_CAUSE_INVEN_HEAD;
67 return FLAG_CAUSE_INVEN_ARMS;
69 return FLAG_CAUSE_INVEN_FEET;
77 * @brief 装備による所定の特性フラグを得ているかを一括して取得する関数。
79 BIT_FLAGS check_equipment_flags(player_type *creature_ptr, tr_type tr_flag)
82 BIT_FLAGS flgs[TR_FLAG_SIZE];
83 BIT_FLAGS result = 0L;
84 for (int i = INVEN_MAIN_HAND; i < INVEN_TOTAL; i++) {
85 o_ptr = &creature_ptr->inventory_list[i];
89 object_flags(creature_ptr, o_ptr, flgs);
91 if (has_flag(flgs, tr_flag))
92 set_bits(result, convert_inventory_slot_type_to_flag_cause(static_cast<inventory_slot_type>(i)));
97 BIT_FLAGS player_flags_brand_pois(player_type *creature_ptr)
99 BIT_FLAGS result = check_equipment_flags(creature_ptr, TR_BRAND_POIS);
101 if (creature_ptr->special_attack & ATTACK_POIS)
102 set_bits(result, FLAG_CAUSE_MAGIC_TIME_EFFECT);
107 BIT_FLAGS player_flags_brand_acid(player_type *creature_ptr)
109 BIT_FLAGS result = check_equipment_flags(creature_ptr, TR_BRAND_ACID);
111 if (creature_ptr->special_attack & ATTACK_ACID)
112 set_bits(result, FLAG_CAUSE_MAGIC_TIME_EFFECT);
117 BIT_FLAGS player_flags_brand_elec(player_type *creature_ptr)
119 BIT_FLAGS result = check_equipment_flags(creature_ptr, TR_BRAND_ELEC);
121 if (creature_ptr->special_attack & ATTACK_ELEC)
122 set_bits(result, FLAG_CAUSE_MAGIC_TIME_EFFECT);
127 BIT_FLAGS player_flags_brand_fire(player_type *creature_ptr)
129 BIT_FLAGS result = check_equipment_flags(creature_ptr, TR_BRAND_FIRE);
131 if (creature_ptr->special_attack & ATTACK_FIRE)
132 set_bits(result, FLAG_CAUSE_MAGIC_TIME_EFFECT);
137 BIT_FLAGS player_flags_brand_cold(player_type *creature_ptr)
139 BIT_FLAGS result = check_equipment_flags(creature_ptr, TR_BRAND_COLD);
141 if (creature_ptr->special_attack & ATTACK_COLD)
142 set_bits(result, FLAG_CAUSE_MAGIC_TIME_EFFECT);
148 * @brief プレイヤーの所持するフラグのうち、tr_flagに対応するものを返す
149 * @param creature_ptr 判定対象のクリーチャー参照ポインタ
150 * @param tr_flag 要求する装備フラグ
152 BIT_FLAGS get_player_flags(player_type *creature_ptr, tr_type tr_flag)
156 return PlayerStrength(creature_ptr).get_all_flags();
158 return PlayerIntelligence(creature_ptr).get_all_flags();
160 return PlayerWisdom(creature_ptr).get_all_flags();
162 return PlayerDextarity(creature_ptr).get_all_flags();
164 return PlayerConstitution(creature_ptr).get_all_flags();
166 return PlayerCharisma(creature_ptr).get_all_flags();
167 case TR_MAGIC_MASTERY:
168 return has_magic_mastery(creature_ptr);
169 case TR_FORCE_WEAPON:
170 return check_equipment_flags(creature_ptr, tr_flag);
172 return PlayerStealth(creature_ptr).get_all_flags();
176 return PlayerInfravision(creature_ptr).get_all_flags();
180 return PlayerSpeed(creature_ptr).get_all_flags();
195 return check_equipment_flags(creature_ptr, tr_flag);
197 return has_earthquake(creature_ptr);
199 return player_flags_brand_pois(creature_ptr);
201 return player_flags_brand_acid(creature_ptr);
203 return player_flags_brand_elec(creature_ptr);
205 return player_flags_brand_fire(creature_ptr);
207 return player_flags_brand_cold(creature_ptr);
210 return has_sustain_str(creature_ptr);
212 return has_sustain_int(creature_ptr);
214 return has_sustain_wis(creature_ptr);
216 return has_sustain_dex(creature_ptr);
218 return has_sustain_con(creature_ptr);
220 return has_sustain_chr(creature_ptr);
222 return check_equipment_flags(creature_ptr, tr_flag);
224 return has_easy_spell(creature_ptr);
226 return has_immune_acid(creature_ptr);
228 return has_immune_elec(creature_ptr);
230 return has_immune_fire(creature_ptr);
232 return has_immune_cold(creature_ptr);
234 return check_equipment_flags(creature_ptr, tr_flag);
236 return has_reflect(creature_ptr);
238 return has_free_act(creature_ptr);
240 return has_hold_exp(creature_ptr);
242 return has_resist_acid(creature_ptr);
244 return has_resist_elec(creature_ptr);
246 return has_resist_fire(creature_ptr);
248 return has_resist_cold(creature_ptr);
250 return has_resist_pois(creature_ptr);
252 return has_resist_fear(creature_ptr);
254 return has_resist_lite(creature_ptr);
256 return has_resist_dark(creature_ptr);
258 return has_resist_blind(creature_ptr);
260 return has_resist_conf(creature_ptr);
262 return has_resist_sound(creature_ptr);
264 return has_resist_shard(creature_ptr);
266 return has_resist_neth(creature_ptr);
268 return has_resist_nexus(creature_ptr);
270 return has_resist_chaos(creature_ptr);
272 return has_resist_disen(creature_ptr);
274 return has_resist_time(creature_ptr);
276 return has_resist_water(creature_ptr);
278 return has_resist_curse(creature_ptr);
281 return has_sh_fire(creature_ptr);
283 return has_sh_elec(creature_ptr);
285 return check_equipment_flags(creature_ptr, tr_flag);
287 return has_sh_cold(creature_ptr);
289 return has_anti_tele(creature_ptr);
291 return has_anti_magic(creature_ptr);
293 return has_dec_mana(creature_ptr);
295 return check_equipment_flags(creature_ptr, tr_flag);
297 return has_warning(creature_ptr);
301 return check_equipment_flags(creature_ptr, tr_flag);
303 return has_levitation(creature_ptr);
305 return has_lite(creature_ptr);
307 return has_see_inv(creature_ptr);
309 return has_esp_telepathy(creature_ptr);
311 return has_slow_digest(creature_ptr);
313 return has_regenerate(creature_ptr);
315 return has_xtra_might(creature_ptr);
324 return check_equipment_flags(creature_ptr, tr_flag);
328 return has_bless_blade(creature_ptr);
340 return check_equipment_flags(creature_ptr, tr_flag);
342 return has_esp_animal(creature_ptr);
344 return has_esp_undead(creature_ptr);
346 return has_esp_demon(creature_ptr);
348 return has_esp_orc(creature_ptr);
350 return has_esp_troll(creature_ptr);
352 return has_esp_giant(creature_ptr);
354 return has_esp_dragon(creature_ptr);
356 return has_esp_human(creature_ptr);
358 return has_esp_evil(creature_ptr);
360 return has_esp_good(creature_ptr);
361 case TR_ESP_NONLIVING:
362 return has_esp_nonliving(creature_ptr);
364 return has_esp_unique(creature_ptr);
366 case TR_FIXED_FLAVOR:
387 return check_equipment_flags(creature_ptr, tr_flag);
388 case TR_MIGHTY_THROW:
389 return has_mighty_throw(creature_ptr);
390 case TR_EASY2_WEAPON:
391 return has_easy2_weapon(creature_ptr);
393 return has_down_saving(creature_ptr);
395 return has_no_ac(creature_ptr);
397 return has_heavy_spell(creature_ptr);
398 case TR_INVULN_ARROW:
399 return has_invuln_arrow(creature_ptr);
404 return check_equipment_flags(creature_ptr, tr_flag);
406 return has_impact(creature_ptr);
408 return has_vuln_acid(creature_ptr);
410 return has_vuln_cold(creature_ptr);
412 return has_vuln_elec(creature_ptr);
414 return has_vuln_fire(creature_ptr);
416 return has_vuln_lite(creature_ptr);
418 return has_immune_dark(creature_ptr);
427 * @brief クリーチャーが壁破壊進行を持っているかを返す。
429 bool has_kill_wall(player_type *creature_ptr)
431 if (creature_ptr->mimic_form == MIMIC_DEMON_LORD || music_singing(creature_ptr, MUSIC_WALL)) {
435 if (creature_ptr->riding) {
436 monster_type *riding_m_ptr = &creature_ptr->current_floor_ptr->m_list[creature_ptr->riding];
437 monster_race *riding_r_ptr = &r_info[riding_m_ptr->r_idx];
438 if (riding_r_ptr->flags2 & RF2_KILL_WALL)
446 * @brief クリーチャーが壁通過を持っているかを返す。
447 * @param creature_ptr 判定対象のクリーチャー参照ポインタ
450 * * 時限で幽体化、壁抜けをもつか種族幽霊ならばひとまずTRUE。
451 * * 但し騎乗中は乗騎が壁抜けを持っていなければ不能になる。
453 bool has_pass_wall(player_type *creature_ptr)
457 if (creature_ptr->wraith_form || creature_ptr->tim_pass_wall || (!creature_ptr->mimic_form && creature_ptr->prace == RACE_SPECTRE)) {
461 if (creature_ptr->riding) {
462 monster_type *riding_m_ptr = &creature_ptr->current_floor_ptr->m_list[creature_ptr->riding];
463 monster_race *riding_r_ptr = &r_info[riding_m_ptr->r_idx];
464 if (!(riding_r_ptr->flags2 & RF2_PASS_WALL))
472 * @brief クリーチャーが強力射を持っているかを返す。
473 * @param creature_ptr 判定対象のクリーチャー参照ポインタ
474 * @return 持っていたら所持前提ビットフラグを返す。
476 BIT_FLAGS has_xtra_might(player_type *creature_ptr)
478 BIT_FLAGS result = 0L;
479 result |= check_equipment_flags(creature_ptr, TR_XTRA_MIGHT);
484 * @brief クリーチャーが邪悪感知を持っているかを返す。
485 * @param creature_ptr 判定対象のクリーチャー参照ポインタ
486 * @return 持っていたら所持前提ビットフラグを返す。
488 BIT_FLAGS has_esp_evil(player_type *creature_ptr)
490 BIT_FLAGS result = 0L;
491 if (creature_ptr->realm1 == REALM_HEX) {
492 if (hex_spelling(creature_ptr, HEX_DETECT_EVIL))
493 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
495 result |= check_equipment_flags(creature_ptr, TR_ESP_EVIL);
500 * @brief クリーチャーが自然界の動物感知を持っているかを返す。
501 * @param creature_ptr 判定対象のクリーチャー参照ポインタ
502 * @return 持っていたら所持前提ビットフラグを返す。
504 BIT_FLAGS has_esp_animal(player_type *creature_ptr)
506 return check_equipment_flags(creature_ptr, TR_ESP_ANIMAL);
510 * @brief クリーチャーがアンデッド感知を持っているかを返す。
511 * @param creature_ptr 判定対象のクリーチャー参照ポインタ
512 * @return 持っていたら所持前提ビットフラグを返す。
514 BIT_FLAGS has_esp_undead(player_type *creature_ptr)
516 return check_equipment_flags(creature_ptr, TR_ESP_UNDEAD);
520 * @brief クリーチャーが悪魔感知を持っているかを返す。
521 * @param creature_ptr 判定対象のクリーチャー参照ポインタ
522 * @return 持っていたら所持前提ビットフラグを返す。
524 BIT_FLAGS has_esp_demon(player_type *creature_ptr)
526 return check_equipment_flags(creature_ptr, TR_ESP_DEMON);
530 * @brief クリーチャーがオーク感知を持っているかを返す。
531 * @param creature_ptr 判定対象のクリーチャー参照ポインタ
532 * @return 持っていたら所持前提ビットフラグを返す。
534 BIT_FLAGS has_esp_orc(player_type *creature_ptr)
536 return check_equipment_flags(creature_ptr, TR_ESP_ORC);
540 * @brief クリーチャーがトロル感知を持っているかを返す。
541 * @param creature_ptr 判定対象のクリーチャー参照ポインタ
542 * @return 持っていたら所持前提ビットフラグを返す。
544 BIT_FLAGS has_esp_troll(player_type *creature_ptr)
546 return check_equipment_flags(creature_ptr, TR_ESP_TROLL);
550 * @brief クリーチャーが巨人感知を持っているかを返す。
551 * @param creature_ptr 判定対象のクリーチャー参照ポインタ
552 * @return 持っていたら所持前提ビットフラグを返す。
554 BIT_FLAGS has_esp_giant(player_type *creature_ptr)
556 return check_equipment_flags(creature_ptr, TR_ESP_GIANT);
560 * @brief クリーチャーがドラゴン感知を持っているかを返す。
561 * @param creature_ptr 判定対象のクリーチャー参照ポインタ
562 * @return 持っていたら所持前提ビットフラグを返す。
564 BIT_FLAGS has_esp_dragon(player_type *creature_ptr)
566 return check_equipment_flags(creature_ptr, TR_ESP_DRAGON);
570 * @brief クリーチャーが人間感知を持っているかを返す。
571 * @param creature_ptr 判定対象のクリーチャー参照ポインタ
572 * @return 持っていたら所持前提ビットフラグを返す。
574 BIT_FLAGS has_esp_human(player_type *creature_ptr)
576 return check_equipment_flags(creature_ptr, TR_ESP_HUMAN);
580 * @brief クリーチャーが善良感知を持っているかを返す。
581 * @param creature_ptr 判定対象のクリーチャー参照ポインタ
582 * @return 持っていたら所持前提ビットフラグを返す。
584 BIT_FLAGS has_esp_good(player_type *creature_ptr)
586 return check_equipment_flags(creature_ptr, TR_ESP_GOOD);
590 * @brief クリーチャーが無生物感知を持っているかを返す。
591 * @param creature_ptr 判定対象のクリーチャー参照ポインタ
592 * @return 持っていたら所持前提ビットフラグを返す。
594 BIT_FLAGS has_esp_nonliving(player_type *creature_ptr)
596 return check_equipment_flags(creature_ptr, TR_ESP_NONLIVING);
600 * @brief クリーチャーがユニーク感知を持っているかを返す。
601 * @param creature_ptr 判定対象のクリーチャー参照ポインタ
602 * @return 持っていたら所持前提ビットフラグを返す。
604 BIT_FLAGS has_esp_unique(player_type *creature_ptr)
606 return check_equipment_flags(creature_ptr, TR_ESP_UNIQUE);
610 * @brief クリーチャーがテレパシーを持っているかを返す。
611 * @param creature_ptr 判定対象のクリーチャー参照ポインタ
612 * @return 持っていたら所持前提ビットフラグを返す。
614 BIT_FLAGS has_esp_telepathy(player_type *creature_ptr)
616 BIT_FLAGS result = 0L;
618 if (is_time_limit_esp(creature_ptr) || creature_ptr->ult_res) {
619 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
621 if (creature_ptr->special_defense & KATA_MUSOU) {
622 result |= FLAG_CAUSE_BATTLE_FORM;
625 if (creature_ptr->muta.has(MUTA::ESP)) {
626 result |= FLAG_CAUSE_MUTATION;
629 if (player_race_has_flag(creature_ptr, TR_TELEPATHY))
630 result |= FLAG_CAUSE_RACE;
632 if (creature_ptr->pclass == CLASS_MINDCRAFTER && creature_ptr->lev > 39)
633 result |= FLAG_CAUSE_CLASS;
635 result |= check_equipment_flags(creature_ptr, TR_TELEPATHY);
639 BIT_FLAGS has_bless_blade(player_type *creature_ptr)
641 return check_equipment_flags(creature_ptr, TR_BLESSED);
644 BIT_FLAGS has_easy2_weapon(player_type *creature_ptr)
646 return check_equipment_flags(creature_ptr, TR_EASY2_WEAPON);
649 BIT_FLAGS has_down_saving(player_type *creature_ptr)
651 return check_equipment_flags(creature_ptr, TR_DOWN_SAVING);
654 BIT_FLAGS has_no_ac(player_type *creature_ptr)
656 return check_equipment_flags(creature_ptr, TR_NO_AC);
659 BIT_FLAGS has_invuln_arrow(player_type *creature_ptr)
661 BIT_FLAGS result = 0L;
662 if (creature_ptr->blind)
664 result |= check_equipment_flags(creature_ptr, TR_INVULN_ARROW);
668 void check_no_flowed(player_type *creature_ptr)
671 bool has_sw = FALSE, has_kabe = FALSE;
672 OBJECT_IDX this_o_idx, next_o_idx = 0;
674 creature_ptr->no_flowed = FALSE;
676 if (has_pass_wall(creature_ptr) && !has_kill_wall(creature_ptr)) {
677 creature_ptr->no_flowed = TRUE;
681 if (!creature_ptr->realm1) {
682 creature_ptr->no_flowed = FALSE;
686 for (int i = 0; i < INVEN_PACK; i++) {
687 if ((creature_ptr->inventory_list[i].tval == TV_NATURE_BOOK) && (creature_ptr->inventory_list[i].sval == 2))
689 if ((creature_ptr->inventory_list[i].tval == TV_CRAFT_BOOK) && (creature_ptr->inventory_list[i].sval == 2))
693 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) {
694 o_ptr = &creature_ptr->current_floor_ptr->o_list[this_o_idx];
695 next_o_idx = o_ptr->next_o_idx;
697 if ((o_ptr->tval == TV_NATURE_BOOK) && (o_ptr->sval == 2))
699 if ((o_ptr->tval == TV_CRAFT_BOOK) && (o_ptr->sval == 2))
703 if (has_sw && ((creature_ptr->realm1 == REALM_NATURE) || (creature_ptr->realm2 == REALM_NATURE) || (creature_ptr->pclass == CLASS_SORCERER))) {
704 const magic_type *s_ptr = &mp_ptr->info[REALM_NATURE - 1][SPELL_SW];
705 if (creature_ptr->lev >= s_ptr->slevel)
706 creature_ptr->no_flowed = TRUE;
709 if (has_kabe && ((creature_ptr->realm1 == REALM_CRAFT) || (creature_ptr->realm2 == REALM_CRAFT) || (creature_ptr->pclass == CLASS_SORCERER))) {
710 const magic_type *s_ptr = &mp_ptr->info[REALM_CRAFT - 1][SPELL_WALL];
711 if (creature_ptr->lev >= s_ptr->slevel)
712 creature_ptr->no_flowed = TRUE;
716 BIT_FLAGS has_mighty_throw(player_type *creature_ptr)
718 return check_equipment_flags(creature_ptr, TR_MIGHTY_THROW);
721 BIT_FLAGS has_dec_mana(player_type *creature_ptr)
723 return check_equipment_flags(creature_ptr, TR_DEC_MANA);
726 BIT_FLAGS has_reflect(player_type *creature_ptr)
728 BIT_FLAGS result = 0L;
730 if (creature_ptr->pclass == CLASS_BERSERKER && creature_ptr->lev > 39)
731 result |= FLAG_CAUSE_CLASS;
733 if (creature_ptr->pclass == CLASS_MIRROR_MASTER && creature_ptr->lev > 39)
734 result |= FLAG_CAUSE_CLASS;
736 if (creature_ptr->special_defense & KAMAE_GENBU || creature_ptr->special_defense & KATA_MUSOU) {
737 result |= FLAG_CAUSE_BATTLE_FORM;
740 if (creature_ptr->ult_res || creature_ptr->wraith_form || creature_ptr->magicdef || creature_ptr->tim_reflect) {
741 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
744 if (has_element_resist(creature_ptr, ElementRealm::EARTH, 30))
745 result |= FLAG_CAUSE_CLASS;
747 result |= check_equipment_flags(creature_ptr, TR_REFLECT);
751 BIT_FLAGS has_see_nocto(player_type *creature_ptr)
753 return (creature_ptr->pclass == CLASS_NINJA) ? FLAG_CAUSE_CLASS : FLAG_CAUSE_NONE;
756 BIT_FLAGS has_warning(player_type *creature_ptr)
758 BIT_FLAGS result = 0L;
760 BIT_FLAGS flgs[TR_FLAG_SIZE];
762 for (int i = INVEN_MAIN_HAND; i < INVEN_TOTAL; i++) {
763 o_ptr = &creature_ptr->inventory_list[i];
767 object_flags(creature_ptr, o_ptr, flgs);
769 if (has_flag(flgs, TR_WARNING)) {
770 if (!o_ptr->inscription || !(angband_strchr(quark_str(o_ptr->inscription), '$')))
771 set_bits(result, convert_inventory_slot_type_to_flag_cause(static_cast<inventory_slot_type>(i)));
777 BIT_FLAGS has_anti_magic(player_type *creature_ptr)
779 return check_equipment_flags(creature_ptr, TR_NO_MAGIC);
782 BIT_FLAGS has_anti_tele(player_type *creature_ptr)
784 return check_equipment_flags(creature_ptr, TR_NO_TELE);
787 BIT_FLAGS has_sh_fire(player_type *creature_ptr)
789 BIT_FLAGS result = 0L;
791 if (creature_ptr->muta.has(MUTA::FIRE_BODY)) {
792 result |= FLAG_CAUSE_MUTATION;
795 if (player_race_has_flag(creature_ptr, TR_SH_FIRE))
796 result |= FLAG_CAUSE_RACE;
798 if (creature_ptr->special_defense & KAMAE_SEIRYU || creature_ptr->special_defense & KATA_MUSOU) {
799 result |= FLAG_CAUSE_BATTLE_FORM;
802 if (hex_spelling(creature_ptr, HEX_DEMON_AURA) || creature_ptr->ult_res || creature_ptr->tim_sh_fire) {
803 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
806 result |= check_equipment_flags(creature_ptr, TR_SH_FIRE);
810 BIT_FLAGS has_sh_elec(player_type *creature_ptr)
812 BIT_FLAGS result = 0L;
814 if (player_race_has_flag(creature_ptr, TR_SH_ELEC))
815 result |= FLAG_CAUSE_RACE;
817 if (creature_ptr->muta.has(MUTA::ELEC_TOUC))
818 result |= FLAG_CAUSE_MUTATION;
820 if (hex_spelling(creature_ptr, HEX_SHOCK_CLOAK) || creature_ptr->ult_res) {
821 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
824 if (creature_ptr->special_defense & KAMAE_SEIRYU || (creature_ptr->special_defense & KATA_MUSOU)) {
825 result |= FLAG_CAUSE_BATTLE_FORM;
828 result |= check_equipment_flags(creature_ptr, TR_SH_ELEC);
832 BIT_FLAGS has_sh_cold(player_type *creature_ptr)
834 BIT_FLAGS result = 0L;
836 if (player_race_has_flag(creature_ptr, TR_SH_COLD))
837 result |= FLAG_CAUSE_RACE;
839 if (creature_ptr->special_defense & KAMAE_SEIRYU || creature_ptr->special_defense & KATA_MUSOU) {
840 result |= FLAG_CAUSE_BATTLE_FORM;
843 if (creature_ptr->ult_res || hex_spelling(creature_ptr, HEX_ICE_ARMOR)) {
844 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
847 result |= check_equipment_flags(creature_ptr, TR_SH_COLD);
851 BIT_FLAGS has_easy_spell(player_type *creature_ptr)
853 return check_equipment_flags(creature_ptr, TR_EASY_SPELL);
856 BIT_FLAGS has_heavy_spell(player_type *creature_ptr)
858 return check_equipment_flags(creature_ptr, TR_HEAVY_SPELL);
861 BIT_FLAGS has_hold_exp(player_type *creature_ptr)
863 BIT_FLAGS result = 0L;
865 if (creature_ptr->pseikaku == PERSONALITY_MUNCHKIN) {
866 result |= FLAG_CAUSE_PERSONALITY;
869 if (player_race_has_flag(creature_ptr, TR_HOLD_EXP))
870 result |= FLAG_CAUSE_RACE;
872 if (creature_ptr->special_defense & KATA_MUSOU) {
873 result |= FLAG_CAUSE_BATTLE_FORM;
876 if (creature_ptr->ult_res) {
877 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
880 result |= check_equipment_flags(creature_ptr, TR_HOLD_EXP);
884 BIT_FLAGS has_see_inv(player_type *creature_ptr)
886 BIT_FLAGS result = 0L;
888 if (creature_ptr->pclass == CLASS_NINJA && creature_ptr->lev > 29)
889 result |= FLAG_CAUSE_CLASS;
891 if (player_race_has_flag(creature_ptr, TR_SEE_INVIS))
892 result |= FLAG_CAUSE_RACE;
894 if (creature_ptr->special_defense & KATA_MUSOU) {
895 result |= FLAG_CAUSE_BATTLE_FORM;
898 if (creature_ptr->ult_res || creature_ptr->tim_invis) {
899 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
902 result |= check_equipment_flags(creature_ptr, TR_SEE_INVIS);
906 BIT_FLAGS has_magic_mastery(player_type *creature_ptr)
908 return check_equipment_flags(creature_ptr, TR_MAGIC_MASTERY);
911 BIT_FLAGS has_free_act(player_type *creature_ptr)
913 BIT_FLAGS result = 0L;
915 if (creature_ptr->muta.has(MUTA::MOTION))
916 result |= FLAG_CAUSE_MUTATION;
918 if (player_race_has_flag(creature_ptr, TR_FREE_ACT))
919 result |= FLAG_CAUSE_RACE;
921 if (creature_ptr->pclass == CLASS_NINJA && !heavy_armor(creature_ptr)
922 && (!creature_ptr->inventory_list[INVEN_MAIN_HAND].k_idx || can_attack_with_main_hand(creature_ptr))
923 && (!creature_ptr->inventory_list[INVEN_SUB_HAND].k_idx || can_attack_with_sub_hand(creature_ptr))) {
924 if (creature_ptr->lev > 24)
925 result |= FLAG_CAUSE_CLASS;
928 if (creature_ptr->pclass == CLASS_MONK || creature_ptr->pclass == CLASS_FORCETRAINER) {
929 if (!(heavy_armor(creature_ptr))) {
930 if (creature_ptr->lev > 24)
931 result |= FLAG_CAUSE_CLASS;
935 if (creature_ptr->pclass == CLASS_BERSERKER) {
936 result |= FLAG_CAUSE_CLASS;
939 if (creature_ptr->ult_res || creature_ptr->magicdef) {
940 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
943 if (creature_ptr->special_defense & KATA_MUSOU) {
944 result |= FLAG_CAUSE_BATTLE_FORM;
947 result |= check_equipment_flags(creature_ptr, TR_FREE_ACT);
951 BIT_FLAGS has_sustain_str(player_type *creature_ptr)
953 BIT_FLAGS result = 0L;
955 if (creature_ptr->pclass == CLASS_BERSERKER) {
956 result |= FLAG_CAUSE_CLASS;
959 if (player_race_has_flag(creature_ptr, TR_SUST_STR))
960 result |= FLAG_CAUSE_RACE;
962 if (creature_ptr->ult_res) {
963 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
966 if (creature_ptr->special_defense & KATA_MUSOU) {
967 result |= FLAG_CAUSE_BATTLE_FORM;
970 result |= check_equipment_flags(creature_ptr, TR_SUST_STR);
974 BIT_FLAGS has_sustain_int(player_type *creature_ptr)
976 BIT_FLAGS result = 0L;
978 if (player_race_has_flag(creature_ptr, TR_SUST_INT))
979 result |= FLAG_CAUSE_RACE;
981 if (creature_ptr->ult_res) {
982 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
985 if (creature_ptr->special_defense & KATA_MUSOU) {
986 result |= FLAG_CAUSE_BATTLE_FORM;
989 result |= check_equipment_flags(creature_ptr, TR_SUST_INT);
993 BIT_FLAGS has_sustain_wis(player_type *creature_ptr)
995 BIT_FLAGS result = 0L;
997 if (creature_ptr->pclass == CLASS_MINDCRAFTER && creature_ptr->lev > 19)
998 result |= FLAG_CAUSE_CLASS;
1000 if (player_race_has_flag(creature_ptr, TR_SUST_WIS))
1001 result |= FLAG_CAUSE_RACE;
1003 if (creature_ptr->ult_res) {
1004 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1007 if (creature_ptr->special_defense & KATA_MUSOU) {
1008 result |= FLAG_CAUSE_BATTLE_FORM;
1011 result |= check_equipment_flags(creature_ptr, TR_SUST_WIS);
1015 BIT_FLAGS has_sustain_dex(player_type *creature_ptr)
1017 BIT_FLAGS result = 0L;
1018 if (creature_ptr->pclass == CLASS_BERSERKER) {
1019 result |= FLAG_CAUSE_CLASS;
1022 if (creature_ptr->pclass == CLASS_NINJA && creature_ptr->lev > 24)
1023 result |= FLAG_CAUSE_CLASS;
1025 if (player_race_has_flag(creature_ptr, TR_SUST_DEX))
1026 result |= FLAG_CAUSE_RACE;
1028 if (creature_ptr->ult_res) {
1029 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1032 if (creature_ptr->special_defense & KATA_MUSOU) {
1033 result |= FLAG_CAUSE_BATTLE_FORM;
1036 result |= check_equipment_flags(creature_ptr, TR_SUST_DEX);
1040 BIT_FLAGS has_sustain_con(player_type *creature_ptr)
1042 BIT_FLAGS result = 0L;
1043 if (creature_ptr->pclass == CLASS_BERSERKER) {
1044 result |= FLAG_CAUSE_CLASS;
1047 if (player_race_has_flag(creature_ptr, TR_SUST_CON))
1048 result |= FLAG_CAUSE_RACE;
1050 if (creature_ptr->ult_res) {
1051 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1054 if (creature_ptr->special_defense & KATA_MUSOU) {
1055 result |= FLAG_CAUSE_BATTLE_FORM;
1058 result |= check_equipment_flags(creature_ptr, TR_SUST_CON);
1062 BIT_FLAGS has_sustain_chr(player_type *creature_ptr)
1064 BIT_FLAGS result = 0L;
1066 if (player_race_has_flag(creature_ptr, TR_SUST_CHR))
1067 result |= FLAG_CAUSE_RACE;
1069 if (creature_ptr->ult_res) {
1070 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1073 if (creature_ptr->special_defense & KATA_MUSOU) {
1074 result |= FLAG_CAUSE_BATTLE_FORM;
1077 result |= check_equipment_flags(creature_ptr, TR_SUST_CHR);
1081 BIT_FLAGS has_levitation(player_type *creature_ptr)
1083 BIT_FLAGS result = 0L;
1085 if (creature_ptr->muta.has(MUTA::WINGS)) {
1086 result |= FLAG_CAUSE_MUTATION;
1089 if (player_race_has_flag(creature_ptr, TR_LEVITATION))
1090 result |= FLAG_CAUSE_RACE;
1092 if (creature_ptr->special_defense & KAMAE_SEIRYU || creature_ptr->special_defense & KAMAE_SUZAKU || (creature_ptr->special_defense & KATA_MUSOU)) {
1093 result |= FLAG_CAUSE_BATTLE_FORM;
1096 if (creature_ptr->ult_res || creature_ptr->magicdef) {
1097 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1100 if (creature_ptr->tim_levitation) {
1101 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1104 result |= check_equipment_flags(creature_ptr, TR_LEVITATION);
1106 if (creature_ptr->riding) {
1107 monster_type *riding_m_ptr = &creature_ptr->current_floor_ptr->m_list[creature_ptr->riding];
1108 monster_race *riding_r_ptr = &r_info[riding_m_ptr->r_idx];
1109 result = (riding_r_ptr->flags7 & RF7_CAN_FLY) ? FLAG_CAUSE_RIDING : FLAG_CAUSE_NONE;
1114 bool has_can_swim(player_type *creature_ptr)
1116 bool can_swim = FALSE;
1117 if (creature_ptr->riding) {
1118 monster_type *riding_m_ptr = &creature_ptr->current_floor_ptr->m_list[creature_ptr->riding];
1119 monster_race *riding_r_ptr = &r_info[riding_m_ptr->r_idx];
1120 if (riding_r_ptr->flags7 & (RF7_CAN_SWIM | RF7_AQUATIC))
1127 BIT_FLAGS has_slow_digest(player_type *creature_ptr)
1129 BIT_FLAGS result = 0L;
1131 if (creature_ptr->pclass == CLASS_NINJA) {
1132 result |= FLAG_CAUSE_CLASS;
1135 if (player_race_has_flag(creature_ptr, TR_SLOW_DIGEST))
1136 result |= FLAG_CAUSE_RACE;
1138 if (creature_ptr->special_defense & KATA_MUSOU) {
1139 result |= FLAG_CAUSE_BATTLE_FORM;
1142 if (creature_ptr->ult_res) {
1143 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1146 result |= check_equipment_flags(creature_ptr, TR_SLOW_DIGEST);
1150 BIT_FLAGS has_regenerate(player_type *creature_ptr)
1152 BIT_FLAGS result = 0L;
1154 if (creature_ptr->pclass == CLASS_WARRIOR && creature_ptr->lev > 44) {
1155 result |= FLAG_CAUSE_CLASS;
1158 if (creature_ptr->muta.has(MUTA::REGEN))
1159 result |= FLAG_CAUSE_MUTATION;
1161 if (player_race_has_flag(creature_ptr, TR_REGEN))
1162 result |= FLAG_CAUSE_RACE;
1164 if (creature_ptr->special_defense & KATA_MUSOU) {
1165 result |= FLAG_CAUSE_BATTLE_FORM;
1168 if (hex_spelling(creature_ptr, HEX_DEMON_AURA) || creature_ptr->ult_res || creature_ptr->tim_regen) {
1169 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1172 result |= check_equipment_flags(creature_ptr, TR_REGEN);
1174 if (creature_ptr->muta.has(MUTA::FLESH_ROT))
1180 void update_curses(player_type *creature_ptr)
1183 BIT_FLAGS flgs[TR_FLAG_SIZE];
1184 creature_ptr->cursed = 0L;
1186 if (creature_ptr->pseikaku == PERSONALITY_SEXY)
1187 creature_ptr->cursed |= (TRC_AGGRAVATE);
1189 for (int i = INVEN_MAIN_HAND; i < INVEN_TOTAL; i++) {
1190 o_ptr = &creature_ptr->inventory_list[i];
1193 object_flags(creature_ptr, o_ptr, flgs);
1194 if (has_flag(flgs, TR_AGGRAVATE))
1195 creature_ptr->cursed |= TRC_AGGRAVATE;
1196 if (has_flag(flgs, TR_DRAIN_EXP))
1197 creature_ptr->cursed |= TRC_DRAIN_EXP;
1198 if (has_flag(flgs, TR_TY_CURSE))
1199 creature_ptr->cursed |= TRC_TY_CURSE;
1200 if (has_flag(flgs, TR_ADD_L_CURSE))
1201 creature_ptr->cursed |= TRC_ADD_L_CURSE;
1202 if (has_flag(flgs, TR_ADD_H_CURSE))
1203 creature_ptr->cursed |= TRC_ADD_H_CURSE;
1204 if (has_flag(flgs, TR_DRAIN_HP))
1205 creature_ptr->cursed |= TRC_DRAIN_HP;
1206 if (has_flag(flgs, TR_DRAIN_MANA))
1207 creature_ptr->cursed |= TRC_DRAIN_MANA;
1208 if (has_flag(flgs, TR_CALL_ANIMAL))
1209 creature_ptr->cursed |= TRC_CALL_ANIMAL;
1210 if (has_flag(flgs, TR_CALL_DEMON))
1211 creature_ptr->cursed |= TRC_CALL_DEMON;
1212 if (has_flag(flgs, TR_CALL_DRAGON))
1213 creature_ptr->cursed |= TRC_CALL_DRAGON;
1214 if (has_flag(flgs, TR_CALL_UNDEAD))
1215 creature_ptr->cursed |= TRC_CALL_UNDEAD;
1216 if (has_flag(flgs, TR_COWARDICE))
1217 creature_ptr->cursed |= TRC_COWARDICE;
1218 if (has_flag(flgs, TR_LOW_MELEE))
1219 creature_ptr->cursed |= TRC_LOW_MELEE;
1220 if (has_flag(flgs, TR_LOW_AC))
1221 creature_ptr->cursed |= TRC_LOW_AC;
1222 if (has_flag(flgs, TR_HARD_SPELL))
1223 creature_ptr->cursed |= TRC_HARD_SPELL;
1224 if (has_flag(flgs, TR_FAST_DIGEST))
1225 creature_ptr->cursed |= TRC_FAST_DIGEST;
1226 if (has_flag(flgs, TR_SLOW_REGEN))
1227 creature_ptr->cursed |= TRC_SLOW_REGEN;
1228 if (has_flag(flgs, TR_BERS_RAGE))
1229 creature_ptr->cursed |= TRC_BERS_RAGE;
1231 creature_ptr->cursed |= (o_ptr->curse_flags & (0xFFFFFFF0L));
1232 if (o_ptr->name1 == ART_CHAINSWORD)
1233 creature_ptr->cursed |= TRC_CHAINSWORD;
1235 if (has_flag(flgs, TR_TELEPORT)) {
1236 if (object_is_cursed(o_ptr))
1237 creature_ptr->cursed |= TRC_TELEPORT;
1239 concptr insc = quark_str(o_ptr->inscription);
1241 /* {.} will stop random teleportation. */
1242 if (o_ptr->inscription && angband_strchr(insc, '.')) {
1244 creature_ptr->cursed |= TRC_TELEPORT_SELF;
1250 if (creature_ptr->cursed & TRC_TELEPORT)
1251 creature_ptr->cursed &= ~(TRC_TELEPORT_SELF);
1254 BIT_FLAGS has_impact(player_type *creature_ptr)
1256 return check_equipment_flags(creature_ptr, TR_IMPACT);
1259 BIT_FLAGS has_earthquake(player_type *creature_ptr)
1261 return check_equipment_flags(creature_ptr, TR_EARTHQUAKE);
1264 void update_extra_blows(player_type *creature_ptr)
1267 BIT_FLAGS flgs[TR_FLAG_SIZE];
1268 creature_ptr->extra_blows[0] = creature_ptr->extra_blows[1] = 0;
1270 for (int i = INVEN_MAIN_HAND; i < INVEN_TOTAL; i++) {
1271 o_ptr = &creature_ptr->inventory_list[i];
1275 object_flags(creature_ptr, o_ptr, flgs);
1276 if (has_flag(flgs, TR_BLOWS)) {
1277 if ((i == INVEN_MAIN_HAND || i == INVEN_MAIN_RING) && !has_two_handed_weapons(creature_ptr))
1278 creature_ptr->extra_blows[0] += o_ptr->pval;
1279 else if ((i == INVEN_SUB_HAND || i == INVEN_SUB_RING) && !has_two_handed_weapons(creature_ptr))
1280 creature_ptr->extra_blows[1] += o_ptr->pval;
1282 creature_ptr->extra_blows[0] += o_ptr->pval;
1283 creature_ptr->extra_blows[1] += o_ptr->pval;
1289 BIT_FLAGS has_resist_acid(player_type *creature_ptr)
1291 BIT_FLAGS result = 0L;
1293 if (player_race_has_flag(creature_ptr, TR_RES_ACID))
1294 result |= FLAG_CAUSE_RACE;
1296 if (creature_ptr->special_defense & KAMAE_SEIRYU || creature_ptr->special_defense & KATA_MUSOU) {
1297 result |= FLAG_CAUSE_BATTLE_FORM;
1300 if (creature_ptr->ult_res) {
1301 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1304 if (has_element_resist(creature_ptr, ElementRealm::SEA, 1))
1305 result |= FLAG_CAUSE_CLASS;
1307 result |= has_immune_acid(creature_ptr);
1309 result |= check_equipment_flags(creature_ptr, TR_RES_ACID);
1313 BIT_FLAGS has_vuln_acid(player_type *creature_ptr)
1315 BIT_FLAGS result = 0L;
1317 if (creature_ptr->muta.has(MUTA::VULN_ELEM)) {
1318 result |= FLAG_CAUSE_MUTATION;
1321 if (player_race_has_flag(creature_ptr, TR_VUL_ACID))
1322 result |= FLAG_CAUSE_RACE;
1324 if (creature_ptr->special_defense & KATA_KOUKIJIN) {
1325 result |= FLAG_CAUSE_BATTLE_FORM;
1328 result |= check_equipment_flags(creature_ptr, TR_VUL_ACID);
1332 BIT_FLAGS has_resist_elec(player_type *creature_ptr)
1334 BIT_FLAGS result = 0L;
1336 if (player_race_has_flag(creature_ptr, TR_RES_ELEC))
1337 result |= FLAG_CAUSE_RACE;
1339 if (creature_ptr->special_defense & KAMAE_SEIRYU || creature_ptr->special_defense & KATA_MUSOU) {
1340 result |= FLAG_CAUSE_BATTLE_FORM;
1343 if (creature_ptr->ult_res) {
1344 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1347 if (has_element_resist(creature_ptr, ElementRealm::SKY, 1))
1348 result |= FLAG_CAUSE_CLASS;
1350 result |= check_equipment_flags(creature_ptr, TR_RES_ELEC);
1351 result |= has_immune_elec(creature_ptr);
1355 BIT_FLAGS has_vuln_elec(player_type *creature_ptr)
1357 BIT_FLAGS result = 0L;
1358 if (creature_ptr->muta.has(MUTA::VULN_ELEM)) {
1359 result |= FLAG_CAUSE_MUTATION;
1362 if (player_race_has_flag(creature_ptr, TR_VUL_ELEC))
1363 result |= FLAG_CAUSE_RACE;
1365 if (creature_ptr->special_defense & KATA_KOUKIJIN) {
1366 result |= FLAG_CAUSE_BATTLE_FORM;
1369 result |= check_equipment_flags(creature_ptr, TR_VUL_ELEC);
1373 BIT_FLAGS has_resist_fire(player_type *creature_ptr)
1375 BIT_FLAGS result = 0L;
1377 if (player_race_has_flag(creature_ptr, TR_RES_FIRE))
1378 result |= FLAG_CAUSE_RACE;
1380 if (creature_ptr->special_defense & KAMAE_SEIRYU || creature_ptr->special_defense & KATA_MUSOU) {
1381 result |= FLAG_CAUSE_BATTLE_FORM;
1384 if (creature_ptr->ult_res) {
1385 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1388 if (has_element_resist(creature_ptr, ElementRealm::FIRE, 1))
1389 result |= FLAG_CAUSE_CLASS;
1391 result |= check_equipment_flags(creature_ptr, TR_RES_FIRE);
1392 result |= has_immune_fire(creature_ptr);
1396 BIT_FLAGS has_vuln_fire(player_type *creature_ptr)
1398 BIT_FLAGS result = 0L;
1400 if (creature_ptr->muta.has(MUTA::VULN_ELEM)) {
1401 result |= FLAG_CAUSE_MUTATION;
1404 if (player_race_has_flag(creature_ptr, TR_VUL_FIRE))
1405 result |= FLAG_CAUSE_RACE;
1407 if (creature_ptr->special_defense & KATA_KOUKIJIN) {
1408 result |= FLAG_CAUSE_BATTLE_FORM;
1411 result |= check_equipment_flags(creature_ptr, TR_VUL_FIRE);
1415 BIT_FLAGS has_resist_cold(player_type *creature_ptr)
1417 BIT_FLAGS result = 0L;
1419 if (player_race_has_flag(creature_ptr, TR_RES_COLD))
1420 result |= FLAG_CAUSE_RACE;
1422 if (creature_ptr->special_defense & KAMAE_SEIRYU || creature_ptr->special_defense & KATA_MUSOU) {
1423 result |= FLAG_CAUSE_BATTLE_FORM;
1426 if (creature_ptr->ult_res) {
1427 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1430 if (has_element_resist(creature_ptr, ElementRealm::ICE, 1))
1431 result |= FLAG_CAUSE_CLASS;
1433 result |= check_equipment_flags(creature_ptr, TR_RES_COLD);
1434 result |= has_immune_cold(creature_ptr);
1438 BIT_FLAGS has_vuln_cold(player_type *creature_ptr)
1440 BIT_FLAGS result = 0L;
1442 if (creature_ptr->muta.has(MUTA::VULN_ELEM)) {
1443 result |= FLAG_CAUSE_MUTATION;
1446 if (player_race_has_flag(creature_ptr, TR_VUL_COLD))
1447 result |= FLAG_CAUSE_RACE;
1449 if (creature_ptr->special_defense & KATA_KOUKIJIN) {
1450 result |= FLAG_CAUSE_BATTLE_FORM;
1453 result |= check_equipment_flags(creature_ptr, TR_VUL_COLD);
1457 BIT_FLAGS has_resist_pois(player_type *creature_ptr)
1459 BIT_FLAGS result = 0L;
1461 if (creature_ptr->pclass == CLASS_NINJA && creature_ptr->lev > 19)
1462 result |= FLAG_CAUSE_CLASS;
1464 if (player_race_has_flag(creature_ptr, TR_RES_POIS))
1465 result |= FLAG_CAUSE_RACE;
1467 if (creature_ptr->special_defense & KAMAE_SEIRYU || creature_ptr->special_defense & KATA_MUSOU) {
1468 result |= FLAG_CAUSE_BATTLE_FORM;
1471 if (creature_ptr->ult_res) {
1472 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1475 if (has_element_resist(creature_ptr, ElementRealm::DEATH, 1))
1476 result |= FLAG_CAUSE_CLASS;
1478 result |= check_equipment_flags(creature_ptr, TR_RES_POIS);
1482 BIT_FLAGS has_resist_conf(player_type *creature_ptr)
1484 BIT_FLAGS result = 0L;
1486 if (creature_ptr->pclass == CLASS_MINDCRAFTER && creature_ptr->lev > 29)
1487 result |= FLAG_CAUSE_CLASS;
1489 if (creature_ptr->pseikaku == PERSONALITY_CHARGEMAN || creature_ptr->pseikaku == PERSONALITY_MUNCHKIN) {
1490 result |= FLAG_CAUSE_PERSONALITY;
1493 if (player_race_has_flag(creature_ptr, TR_RES_CONF))
1494 result |= FLAG_CAUSE_RACE;
1496 if (creature_ptr->ult_res || creature_ptr->magicdef) {
1497 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1500 if (creature_ptr->special_defense & KATA_MUSOU) {
1501 result |= FLAG_CAUSE_BATTLE_FORM;
1504 if (has_element_resist(creature_ptr, ElementRealm::CHAOS, 1))
1505 result |= FLAG_CAUSE_CLASS;
1507 result |= check_equipment_flags(creature_ptr, TR_RES_CONF);
1511 BIT_FLAGS has_resist_sound(player_type *creature_ptr)
1513 BIT_FLAGS result = 0L;
1515 if (creature_ptr->pclass == CLASS_BARD) {
1516 result |= FLAG_CAUSE_CLASS;
1518 if (player_race_has_flag(creature_ptr, TR_RES_SOUND))
1519 result |= FLAG_CAUSE_RACE;
1521 if (creature_ptr->special_defense & KATA_MUSOU) {
1522 result |= FLAG_CAUSE_BATTLE_FORM;
1525 if (creature_ptr->ult_res) {
1526 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1529 result |= check_equipment_flags(creature_ptr, TR_RES_SOUND);
1533 BIT_FLAGS has_resist_lite(player_type *creature_ptr)
1535 BIT_FLAGS result = 0L;
1537 if (player_race_has_flag(creature_ptr, TR_RES_LITE))
1538 result |= FLAG_CAUSE_RACE;
1540 if (creature_ptr->special_defense & KATA_MUSOU) {
1541 result |= FLAG_CAUSE_BATTLE_FORM;
1544 if (creature_ptr->ult_res) {
1545 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1548 result |= check_equipment_flags(creature_ptr, TR_RES_LITE);
1552 BIT_FLAGS has_vuln_lite(player_type *creature_ptr)
1554 BIT_FLAGS result = 0L;
1556 if (player_race_has_flag(creature_ptr, TR_VUL_LITE))
1557 result |= FLAG_CAUSE_RACE;
1559 if (creature_ptr->wraith_form) {
1560 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1563 result |= check_equipment_flags(creature_ptr, TR_VUL_LITE);
1567 BIT_FLAGS has_resist_dark(player_type *creature_ptr)
1569 BIT_FLAGS result = 0L;
1571 if (player_race_has_flag(creature_ptr, TR_RES_DARK))
1572 result |= FLAG_CAUSE_RACE;
1574 if (creature_ptr->special_defense & KATA_MUSOU) {
1575 result |= FLAG_CAUSE_BATTLE_FORM;
1578 if (creature_ptr->ult_res) {
1579 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1582 if (has_element_resist(creature_ptr, ElementRealm::DARKNESS, 1))
1583 result |= FLAG_CAUSE_CLASS;
1585 result |= check_equipment_flags(creature_ptr, TR_RES_DARK);
1589 BIT_FLAGS has_resist_chaos(player_type *creature_ptr)
1591 BIT_FLAGS result = 0L;
1593 if (creature_ptr->pclass == CLASS_CHAOS_WARRIOR && creature_ptr->lev > 29)
1594 result |= FLAG_CAUSE_CLASS;
1596 if (player_race_has_flag(creature_ptr, TR_RES_CHAOS))
1597 result |= FLAG_CAUSE_RACE;
1599 if (creature_ptr->special_defense & KATA_MUSOU) {
1600 result |= FLAG_CAUSE_BATTLE_FORM;
1603 if (creature_ptr->ult_res) {
1604 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1607 if (has_element_resist(creature_ptr, ElementRealm::CHAOS, 30))
1608 result |= FLAG_CAUSE_CLASS;
1610 result |= check_equipment_flags(creature_ptr, TR_RES_CHAOS);
1614 BIT_FLAGS has_resist_disen(player_type *creature_ptr)
1616 BIT_FLAGS result = 0L;
1618 if (player_race_has_flag(creature_ptr, TR_RES_DISEN))
1619 result |= FLAG_CAUSE_RACE;
1621 if (creature_ptr->special_defense & KATA_MUSOU) {
1622 result |= FLAG_CAUSE_BATTLE_FORM;
1625 if (creature_ptr->ult_res) {
1626 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1629 if (has_element_resist(creature_ptr, ElementRealm::DEATH, 30))
1630 result |= FLAG_CAUSE_CLASS;
1632 result |= check_equipment_flags(creature_ptr, TR_RES_DISEN);
1636 BIT_FLAGS has_resist_shard(player_type *creature_ptr)
1638 BIT_FLAGS result = 0L;
1640 if (player_race_has_flag(creature_ptr, TR_RES_SHARDS))
1641 result |= FLAG_CAUSE_RACE;
1643 if (creature_ptr->special_defense & KATA_MUSOU) {
1644 result |= FLAG_CAUSE_BATTLE_FORM;
1647 if (creature_ptr->ult_res) {
1648 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1651 if (has_element_resist(creature_ptr, ElementRealm::EARTH, 1))
1652 result |= FLAG_CAUSE_CLASS;
1654 result |= check_equipment_flags(creature_ptr, TR_RES_SHARDS);
1658 BIT_FLAGS has_resist_nexus(player_type *creature_ptr)
1660 BIT_FLAGS result = 0L;
1662 if (player_race_has_flag(creature_ptr, TR_RES_NEXUS))
1663 result |= FLAG_CAUSE_RACE;
1665 if (creature_ptr->special_defense & KATA_MUSOU) {
1666 result |= FLAG_CAUSE_BATTLE_FORM;
1669 if (creature_ptr->ult_res) {
1670 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1673 result |= check_equipment_flags(creature_ptr, TR_RES_NEXUS);
1677 BIT_FLAGS has_resist_blind(player_type *creature_ptr)
1679 BIT_FLAGS result = 0L;
1681 if (creature_ptr->pseikaku == PERSONALITY_MUNCHKIN) {
1682 result |= FLAG_CAUSE_PERSONALITY;
1685 if (player_race_has_flag(creature_ptr, TR_RES_BLIND))
1686 result |= FLAG_CAUSE_RACE;
1688 if (creature_ptr->special_defense & KATA_MUSOU) {
1689 result |= FLAG_CAUSE_BATTLE_FORM;
1692 if (creature_ptr->ult_res || creature_ptr->magicdef) {
1693 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1696 result |= check_equipment_flags(creature_ptr, TR_RES_BLIND);
1700 BIT_FLAGS has_resist_neth(player_type *creature_ptr)
1702 BIT_FLAGS result = 0L;
1704 if (player_race_has_flag(creature_ptr, TR_RES_NETHER))
1705 result |= FLAG_CAUSE_RACE;
1707 if (creature_ptr->special_defense & KATA_MUSOU) {
1708 result |= FLAG_CAUSE_BATTLE_FORM;
1711 if (creature_ptr->ult_res || creature_ptr->tim_res_nether) {
1712 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1715 if (has_element_resist(creature_ptr, ElementRealm::DARKNESS, 30))
1716 result |= FLAG_CAUSE_CLASS;
1718 result |= check_equipment_flags(creature_ptr, TR_RES_NETHER);
1722 BIT_FLAGS has_resist_time(player_type *creature_ptr)
1724 BIT_FLAGS result = 0L;
1726 if (player_race_has_flag(creature_ptr, TR_RES_TIME))
1727 result |= FLAG_CAUSE_RACE;
1729 if (creature_ptr->tim_res_time) {
1730 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1733 result |= check_equipment_flags(creature_ptr, TR_RES_TIME);
1737 BIT_FLAGS has_resist_water(player_type *creature_ptr)
1739 BIT_FLAGS result = 0L;
1741 if (player_race_has_flag(creature_ptr, TR_RES_WATER))
1742 result |= FLAG_CAUSE_RACE;
1744 result |= check_equipment_flags(creature_ptr, TR_RES_WATER);
1749 * @brief 呪力耐性を所持しているかどうか
1750 * @param プレイヤー情報への参照ポインタ
1751 * @return 呪力耐性を所持していればTRUE、なければFALSE
1753 BIT_FLAGS has_resist_curse(player_type *creature_ptr)
1755 BIT_FLAGS result = 0L;
1757 if (player_race_has_flag(creature_ptr, TR_RES_CURSE))
1758 result |= FLAG_CAUSE_RACE;
1760 result |= check_equipment_flags(creature_ptr, TR_RES_CURSE);
1764 BIT_FLAGS has_resist_fear(player_type *creature_ptr)
1766 BIT_FLAGS result = 0L;
1768 if (creature_ptr->muta.has(MUTA::FEARLESS))
1769 result |= FLAG_CAUSE_MUTATION;
1771 switch (creature_ptr->pclass) {
1774 if (creature_ptr->lev > 29)
1775 result |= FLAG_CAUSE_CLASS;
1778 case CLASS_CHAOS_WARRIOR:
1779 if (creature_ptr->lev > 39)
1780 result |= FLAG_CAUSE_CLASS;
1782 case CLASS_MINDCRAFTER:
1783 if (creature_ptr->lev > 9)
1784 result |= FLAG_CAUSE_CLASS;
1787 result |= FLAG_CAUSE_CLASS;
1794 if (player_race_has_flag(creature_ptr, TR_RES_FEAR))
1795 result |= FLAG_CAUSE_RACE;
1797 if ((creature_ptr->special_defense & KATA_MUSOU)) {
1798 result |= FLAG_CAUSE_BATTLE_FORM;
1801 if (is_hero(creature_ptr) || is_shero(creature_ptr) || creature_ptr->ult_res) {
1802 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1805 result |= check_equipment_flags(creature_ptr, TR_RES_FEAR);
1809 BIT_FLAGS has_immune_acid(player_type *creature_ptr)
1811 BIT_FLAGS result = 0L;
1813 if (player_race_has_flag(creature_ptr, TR_IM_ACID))
1814 result |= FLAG_CAUSE_RACE;
1816 if (creature_ptr->ele_immune) {
1817 if (creature_ptr->special_defense & DEFENSE_ACID)
1818 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1821 if (has_element_resist(creature_ptr, ElementRealm::SEA, 30))
1822 result |= FLAG_CAUSE_CLASS;
1824 result |= check_equipment_flags(creature_ptr, TR_IM_ACID);
1828 BIT_FLAGS has_immune_elec(player_type *creature_ptr)
1830 BIT_FLAGS result = 0L;
1832 if (player_race_has_flag(creature_ptr, TR_IM_ELEC))
1833 result |= FLAG_CAUSE_RACE;
1835 if (creature_ptr->ele_immune) {
1836 if (creature_ptr->special_defense & DEFENSE_ELEC)
1837 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1840 if (has_element_resist(creature_ptr, ElementRealm::SKY, 30))
1841 result |= FLAG_CAUSE_CLASS;
1843 result |= check_equipment_flags(creature_ptr, TR_IM_ELEC);
1847 BIT_FLAGS has_immune_fire(player_type *creature_ptr)
1849 BIT_FLAGS result = 0L;
1851 if (player_race_has_flag(creature_ptr, TR_IM_FIRE))
1852 result |= FLAG_CAUSE_RACE;
1854 if (creature_ptr->ele_immune) {
1855 if (creature_ptr->special_defense & DEFENSE_FIRE)
1856 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1859 if (has_element_resist(creature_ptr, ElementRealm::FIRE, 30))
1860 result |= FLAG_CAUSE_CLASS;
1862 result |= check_equipment_flags(creature_ptr, TR_IM_FIRE);
1866 BIT_FLAGS has_immune_cold(player_type *creature_ptr)
1868 BIT_FLAGS result = 0L;
1870 if (player_race_has_flag(creature_ptr, TR_IM_COLD))
1871 result |= FLAG_CAUSE_RACE;
1873 if (creature_ptr->ele_immune) {
1874 if (creature_ptr->special_defense & DEFENSE_COLD)
1875 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1878 if (has_element_resist(creature_ptr, ElementRealm::ICE, 30))
1879 result |= FLAG_CAUSE_CLASS;
1881 result |= check_equipment_flags(creature_ptr, TR_IM_COLD);
1885 BIT_FLAGS has_immune_dark(player_type *creature_ptr)
1887 BIT_FLAGS result = 0L;
1889 if (player_race_has_flag(creature_ptr, TR_IM_DARK))
1890 result |= FLAG_CAUSE_RACE;
1892 if (creature_ptr->wraith_form) {
1893 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1896 result |= check_equipment_flags(creature_ptr, TR_IM_DARK);
1900 melee_type player_melee_type(player_type *creature_ptr)
1902 if (has_two_handed_weapons(creature_ptr))
1903 return MELEE_TYPE_WEAPON_TWOHAND;
1905 if (has_melee_weapon(creature_ptr, INVEN_MAIN_HAND)) {
1906 if (has_melee_weapon(creature_ptr, INVEN_SUB_HAND)) {
1907 return MELEE_TYPE_WEAPON_DOUBLE;
1909 return MELEE_TYPE_WEAPON_MAIN;
1912 if (has_melee_weapon(creature_ptr, INVEN_SUB_HAND))
1913 return MELEE_TYPE_WEAPON_SUB;
1915 if (empty_hands(creature_ptr, FALSE) == (EMPTY_HAND_MAIN | EMPTY_HAND_SUB))
1916 return MELEE_TYPE_BAREHAND_TWO;
1918 if (empty_hands(creature_ptr, FALSE) == EMPTY_HAND_MAIN)
1919 return MELEE_TYPE_BAREHAND_MAIN;
1921 if (empty_hands(creature_ptr, FALSE) == EMPTY_HAND_SUB)
1922 return MELEE_TYPE_BAREHAND_SUB;
1924 return MELEE_TYPE_SHIELD_DOUBLE;
1928 * @brief 利き手で攻撃可能かどうかを判定する
1929 * 利き手で攻撃可能とは、利き手に武器を持っているか、
1930 * 利き手が素手かつ左手も素手もしくは盾を装備している事を意味する。
1931 * @details Includes martial arts and hand combats as weapons.
1933 bool can_attack_with_main_hand(player_type *creature_ptr)
1935 if (has_melee_weapon(creature_ptr, INVEN_MAIN_HAND))
1938 if ((empty_hands(creature_ptr, TRUE) & EMPTY_HAND_MAIN) && !can_attack_with_sub_hand(creature_ptr))
1945 * @brief 非利き手で攻撃可能かどうかを判定する
1946 * 非利き手で攻撃可能とは、非利き手に武器を持っている事に等しい
1947 * @details Exclude martial arts and hand combats from weapons.
1949 bool can_attack_with_sub_hand(player_type *creature_ptr)
1951 return has_melee_weapon(creature_ptr, INVEN_SUB_HAND);
1955 * @brief 両手持ち状態かどうかを判定する
1957 bool has_two_handed_weapons(player_type *creature_ptr)
1959 if (can_two_hands_wielding(creature_ptr)) {
1960 if (can_attack_with_main_hand(creature_ptr) && (empty_hands(creature_ptr, FALSE) == EMPTY_HAND_SUB)
1961 && object_allow_two_hands_wielding(&creature_ptr->inventory_list[INVEN_MAIN_HAND])) {
1963 } else if (can_attack_with_sub_hand(creature_ptr) && (empty_hands(creature_ptr, FALSE) == EMPTY_HAND_MAIN)
1964 && object_allow_two_hands_wielding(&creature_ptr->inventory_list[INVEN_SUB_HAND])) {
1971 BIT_FLAGS has_lite(player_type *creature_ptr)
1973 BIT_FLAGS result = 0L;
1974 if (creature_ptr->pclass == CLASS_NINJA)
1977 if (creature_ptr->pseikaku == PERSONALITY_MUNCHKIN) {
1978 result |= FLAG_CAUSE_PERSONALITY;
1981 if (player_race_has_flag(creature_ptr, TR_LITE_1))
1982 result |= FLAG_CAUSE_RACE;
1984 if (creature_ptr->ult_res) {
1985 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1988 if (creature_ptr->special_defense & KATA_MUSOU) {
1989 result |= FLAG_CAUSE_BATTLE_FORM;
1992 result |= has_sh_fire(creature_ptr);
1998 * @brief 両手持ちボーナスがもらえないかどうかを判定する。 / Does *not * get two hand wielding bonus.
2000 * Only can get hit bonuses when wieids an enough light weapon which is lighter than 5 times of weight limit.
2001 * If its weight is 10 times heavier or more than weight limit, gets hit penalty in calc_to_hit().
2003 bool has_disable_two_handed_bonus(player_type *creature_ptr, int i)
2005 if (has_melee_weapon(creature_ptr, INVEN_MAIN_HAND + i) && has_two_handed_weapons(creature_ptr)) {
2006 object_type *o_ptr = &creature_ptr->inventory_list[INVEN_MAIN_HAND + i];
2007 int limit = calc_weapon_weight_limit(creature_ptr) * 2;
2009 /* Enable when two hand wields an enough light weapon */
2010 if (limit >= o_ptr->weight / 5)
2014 /* Disable when empty hands, one hand wieldings and heavy weapons */
2019 * @brief ふさわしくない武器を持っているかどうかを返す。
2020 * @todo 相応しい時にFALSEで相応しくない時にTRUEという負論理は良くない、後で修正する
2022 bool has_icky_wield_weapon(player_type *creature_ptr, int i)
2024 BIT_FLAGS flgs[TR_FLAG_SIZE];
2025 object_type *o_ptr = &creature_ptr->inventory_list[INVEN_MAIN_HAND + i];
2026 object_flags(creature_ptr, o_ptr, flgs);
2028 bool has_no_weapon = (o_ptr->tval == TV_NONE) || (o_ptr->tval == TV_SHIELD);
2029 if (creature_ptr->pclass == CLASS_PRIEST) {
2030 bool is_suitable_weapon = has_flag(flgs, TR_BLESSED);
2031 is_suitable_weapon |= (o_ptr->tval != TV_SWORD) && (o_ptr->tval != TV_POLEARM);
2032 return !has_no_weapon && !is_suitable_weapon;
2035 if (creature_ptr->pclass == CLASS_SORCERER) {
2036 bool is_suitable_weapon = o_ptr->tval == TV_HAFTED;
2037 is_suitable_weapon &= (o_ptr->sval == SV_WIZSTAFF) || (o_ptr->sval == SV_NAMAKE_HAMMER);
2038 return !has_no_weapon && !is_suitable_weapon;
2041 if (has_not_monk_weapon(creature_ptr, i) || has_not_ninja_weapon(creature_ptr, i))
2047 bool has_riding_wield_weapon(player_type *creature_ptr, int i)
2050 BIT_FLAGS flgs[TR_FLAG_SIZE];
2051 o_ptr = &creature_ptr->inventory_list[INVEN_MAIN_HAND + i];
2052 object_flags(creature_ptr, o_ptr, flgs);
2053 if (creature_ptr->riding != 0 && !(o_ptr->tval == TV_POLEARM) && ((o_ptr->sval == SV_LANCE) || (o_ptr->sval == SV_HEAVY_LANCE))
2054 && !has_flag(flgs, TR_RIDING)) {
2060 bool has_not_ninja_weapon(player_type *creature_ptr, int i)
2062 if (!has_melee_weapon(creature_ptr, INVEN_MAIN_HAND + i)) {
2065 int tval = creature_ptr->inventory_list[INVEN_MAIN_HAND + i].tval - TV_WEAPON_BEGIN;
2066 OBJECT_SUBTYPE_VALUE sval = creature_ptr->inventory_list[INVEN_MAIN_HAND + i].sval;
2067 return creature_ptr->pclass == CLASS_NINJA
2068 && !((s_info[CLASS_NINJA].w_max[tval][sval] > WEAPON_EXP_BEGINNER) && (creature_ptr->inventory_list[INVEN_SUB_HAND - i].tval != TV_SHIELD));
2071 bool has_not_monk_weapon(player_type *creature_ptr, int i)
2073 if (!has_melee_weapon(creature_ptr, INVEN_MAIN_HAND + i)) {
2076 int tval = creature_ptr->inventory_list[INVEN_MAIN_HAND + i].tval - TV_WEAPON_BEGIN;
2077 OBJECT_SUBTYPE_VALUE sval = creature_ptr->inventory_list[INVEN_MAIN_HAND + i].sval;
2078 return ((creature_ptr->pclass == CLASS_MONK) || (creature_ptr->pclass == CLASS_FORCETRAINER)) && !(s_info[creature_ptr->pclass].w_max[tval][sval]);
2081 bool has_good_luck(player_type *creature_ptr)
2083 return (creature_ptr->pseikaku == PERSONALITY_LUCKY) || (creature_ptr->muta.has(MUTA::GOOD_LUCK));
2086 BIT_FLAGS player_aggravate_state(player_type *creature_ptr)
2088 if (creature_ptr->cursed & TRC_AGGRAVATE) {
2089 if ((is_specific_player_race(creature_ptr, RACE_S_FAIRY)) && (creature_ptr->pseikaku != PERSONALITY_SEXY)) {
2090 return AGGRAVATE_S_FAIRY;
2092 return AGGRAVATE_NORMAL;
2095 return AGGRAVATE_NONE;
2098 bool has_aggravate(player_type *creature_ptr)
2100 return player_aggravate_state(creature_ptr) == AGGRAVATE_NORMAL;