1 #include "player/player-status-flags.h"
2 #include "artifact/fixed-art-types.h"
3 #include "inventory/inventory-slot-types.h"
4 #include "mind/mind-elementalist.h"
5 #include "monster-race/monster-race.h"
6 #include "monster-race/race-flags2.h"
7 #include "monster-race/race-flags7.h"
8 #include "mutation/mutation-flag-types.h"
9 #include "object-enchant/object-ego.h"
10 #include "object-enchant/tr-types.h"
11 #include "object-enchant/trc-types.h"
12 #include "object-hook/hook-weapon.h"
13 #include "player-ability/player-charisma.h"
14 #include "player-ability/player-constitution.h"
15 #include "player-ability/player-dexterity.h"
16 #include "player-ability/player-intelligence.h"
17 #include "player-ability/player-strength.h"
18 #include "player-ability/player-wisdom.h"
19 #include "player-base/player-class.h"
20 #include "player-base/player-race.h"
21 #include "player-info/class-info.h"
22 #include "player-info/equipment-info.h"
23 #include "player-info/mimic-info-table.h"
24 #include "player-status/player-basic-statistics.h"
25 #include "player-status/player-hand-types.h"
26 #include "player-status/player-infravision.h"
27 #include "player-status/player-speed.h"
28 #include "player-status/player-stealth.h"
29 #include "player/attack-defense-types.h"
30 #include "player/digestion-processor.h"
31 #include "player/player-skill.h"
32 #include "player/player-status.h"
33 #include "player/race-info-table.h"
34 #include "player/special-defense-types.h"
35 #include "realm/realm-hex-numbers.h"
36 #include "realm/realm-song-numbers.h"
37 #include "realm/realm-types.h"
38 #include "spell-realm/spells-hex.h"
39 #include "spell-realm/spells-song.h"
40 #include "sv-definition/sv-weapon-types.h"
41 #include "system/floor-type-definition.h"
42 #include "system/grid-type-definition.h"
43 #include "system/item-entity.h"
44 #include "system/monster-entity.h"
45 #include "system/monster-race-info.h"
46 #include "system/player-type-definition.h"
47 #include "timed-effect/player-blindness.h"
48 #include "timed-effect/timed-effects.h"
49 #include "util/bit-flags-calculator.h"
50 #include "util/string-processor.h"
55 * @brief 指定した特性フラグが得られている要因となる flag_cause 型のうち以下の基本的な物のフラグ集合を取得する
56 * 装備品のアイテムスロット / 種族上の体得 / 職業上の体得
57 * @param tr_flag 特性フラグ
58 * @return tr_flag が得られる要因となるフラグの集合
60 BIT_FLAGS common_cause_flags(PlayerType *player_ptr, tr_type tr_flag)
62 BIT_FLAGS result = check_equipment_flags(player_ptr, tr_flag);
64 if (PlayerRace(player_ptr).tr_flags().has(tr_flag)) {
65 set_bits(result, FLAG_CAUSE_RACE);
68 if (PlayerClass(player_ptr).tr_flags().has(tr_flag)) {
69 set_bits(result, FLAG_CAUSE_CLASS);
72 if (PlayerClass(player_ptr).stance_tr_flags().has(tr_flag)) {
73 set_bits(result, FLAG_CAUSE_STANCE);
84 BIT_FLAGS convert_inventory_slot_type_to_flag_cause(inventory_slot_type inventory_slot)
86 switch (inventory_slot) {
88 return FLAG_CAUSE_INVEN_MAIN_HAND;
90 return FLAG_CAUSE_INVEN_SUB_HAND;
92 return FLAG_CAUSE_INVEN_BOW;
94 return FLAG_CAUSE_INVEN_MAIN_RING;
96 return FLAG_CAUSE_INVEN_SUB_RING;
98 return FLAG_CAUSE_INVEN_NECK;
100 return FLAG_CAUSE_INVEN_LITE;
102 return FLAG_CAUSE_INVEN_BODY;
104 return FLAG_CAUSE_INVEN_OUTER;
106 return FLAG_CAUSE_INVEN_HEAD;
108 return FLAG_CAUSE_INVEN_ARMS;
110 return FLAG_CAUSE_INVEN_FEET;
118 * @brief 装備による所定の特性フラグを得ているかを一括して取得する関数。
120 BIT_FLAGS check_equipment_flags(PlayerType *player_ptr, tr_type tr_flag)
123 BIT_FLAGS result = 0L;
124 for (int i = INVEN_MAIN_HAND; i < INVEN_TOTAL; i++) {
125 o_ptr = &player_ptr->inventory_list[i];
126 if (!o_ptr->is_valid()) {
130 const auto flags = o_ptr->get_flags();
132 if (flags.has(tr_flag)) {
133 set_bits(result, convert_inventory_slot_type_to_flag_cause(i2enum<inventory_slot_type>(i)));
139 BIT_FLAGS player_flags_brand_pois(PlayerType *player_ptr)
141 BIT_FLAGS result = common_cause_flags(player_ptr, TR_BRAND_POIS);
143 if (player_ptr->special_attack & ATTACK_POIS) {
144 set_bits(result, FLAG_CAUSE_MAGIC_TIME_EFFECT);
150 BIT_FLAGS player_flags_brand_acid(PlayerType *player_ptr)
152 BIT_FLAGS result = common_cause_flags(player_ptr, TR_BRAND_ACID);
154 if (player_ptr->special_attack & ATTACK_ACID) {
155 set_bits(result, FLAG_CAUSE_MAGIC_TIME_EFFECT);
161 BIT_FLAGS player_flags_brand_elec(PlayerType *player_ptr)
163 BIT_FLAGS result = common_cause_flags(player_ptr, TR_BRAND_ELEC);
165 if (player_ptr->special_attack & ATTACK_ELEC) {
166 set_bits(result, FLAG_CAUSE_MAGIC_TIME_EFFECT);
172 BIT_FLAGS player_flags_brand_fire(PlayerType *player_ptr)
174 BIT_FLAGS result = common_cause_flags(player_ptr, TR_BRAND_FIRE);
176 if (player_ptr->special_attack & ATTACK_FIRE) {
177 set_bits(result, FLAG_CAUSE_MAGIC_TIME_EFFECT);
183 BIT_FLAGS player_flags_brand_cold(PlayerType *player_ptr)
185 BIT_FLAGS result = common_cause_flags(player_ptr, TR_BRAND_COLD);
187 if (player_ptr->special_attack & ATTACK_COLD) {
188 set_bits(result, FLAG_CAUSE_MAGIC_TIME_EFFECT);
195 * @brief プレイヤーの所持するフラグのうち、tr_flagに対応するものを返す
196 * @param player_ptr プレイヤーへの参照ポインタ
197 * @param tr_flag 要求する装備フラグ
199 BIT_FLAGS get_player_flags(PlayerType *player_ptr, tr_type tr_flag)
203 return PlayerStrength(player_ptr).get_all_flags();
205 return PlayerIntelligence(player_ptr).get_all_flags();
207 return PlayerWisdom(player_ptr).get_all_flags();
209 return PlayerDexterity(player_ptr).get_all_flags();
211 return PlayerConstitution(player_ptr).get_all_flags();
213 return PlayerCharisma(player_ptr).get_all_flags();
214 case TR_MAGIC_MASTERY:
215 return has_magic_mastery(player_ptr);
216 case TR_FORCE_WEAPON:
217 return check_equipment_flags(player_ptr, tr_flag);
219 return PlayerStealth(player_ptr).get_all_flags();
223 return PlayerInfravision(player_ptr).get_all_flags();
227 return PlayerSpeed(player_ptr).get_all_flags();
242 return check_equipment_flags(player_ptr, tr_flag);
244 return has_earthquake(player_ptr);
246 return player_flags_brand_pois(player_ptr);
248 return player_flags_brand_acid(player_ptr);
250 return player_flags_brand_elec(player_ptr);
252 return player_flags_brand_fire(player_ptr);
254 return player_flags_brand_cold(player_ptr);
257 return has_sustain_str(player_ptr);
259 return has_sustain_int(player_ptr);
261 return has_sustain_wis(player_ptr);
263 return has_sustain_dex(player_ptr);
265 return has_sustain_con(player_ptr);
267 return has_sustain_chr(player_ptr);
269 return check_equipment_flags(player_ptr, tr_flag);
271 return has_easy_spell(player_ptr);
273 return has_immune_acid(player_ptr);
275 return has_immune_elec(player_ptr);
277 return has_immune_fire(player_ptr);
279 return has_immune_cold(player_ptr);
281 return check_equipment_flags(player_ptr, tr_flag);
283 return has_reflect(player_ptr);
285 return has_free_act(player_ptr);
287 return has_hold_exp(player_ptr);
289 return has_resist_acid(player_ptr);
291 return has_resist_elec(player_ptr);
293 return has_resist_fire(player_ptr);
295 return has_resist_cold(player_ptr);
297 return has_resist_pois(player_ptr);
299 return has_resist_fear(player_ptr);
301 return has_resist_lite(player_ptr);
303 return has_resist_dark(player_ptr);
305 return has_resist_blind(player_ptr);
307 return has_resist_conf(player_ptr);
309 return has_resist_sound(player_ptr);
311 return has_resist_shard(player_ptr);
313 return has_resist_neth(player_ptr);
315 return has_resist_nexus(player_ptr);
317 return has_resist_chaos(player_ptr);
319 return has_resist_disen(player_ptr);
321 return has_resist_time(player_ptr);
323 return has_resist_water(player_ptr);
325 return has_resist_curse(player_ptr);
328 return has_sh_fire(player_ptr);
330 return has_sh_elec(player_ptr);
332 return check_equipment_flags(player_ptr, tr_flag);
334 return has_sh_cold(player_ptr);
336 return has_anti_tele(player_ptr);
338 return has_anti_magic(player_ptr);
340 return has_dec_mana(player_ptr);
342 return check_equipment_flags(player_ptr, tr_flag);
344 return has_warning(player_ptr);
348 return check_equipment_flags(player_ptr, tr_flag);
350 return has_levitation(player_ptr);
352 return has_lite(player_ptr);
354 return has_see_inv(player_ptr);
356 return has_esp_telepathy(player_ptr);
358 return has_slow_digest(player_ptr);
360 return has_regenerate(player_ptr);
362 return has_xtra_might(player_ptr);
371 return check_equipment_flags(player_ptr, tr_flag);
375 return has_bless_blade(player_ptr);
387 return check_equipment_flags(player_ptr, tr_flag);
389 return has_esp_animal(player_ptr);
391 return has_esp_undead(player_ptr);
393 return has_esp_demon(player_ptr);
395 return has_esp_orc(player_ptr);
397 return has_esp_troll(player_ptr);
399 return has_esp_giant(player_ptr);
401 return has_esp_dragon(player_ptr);
403 return has_esp_human(player_ptr);
405 return has_esp_evil(player_ptr);
407 return has_esp_good(player_ptr);
408 case TR_ESP_NONLIVING:
409 return has_esp_nonliving(player_ptr);
411 return has_esp_unique(player_ptr);
413 case TR_FIXED_FLAVOR:
434 return check_equipment_flags(player_ptr, tr_flag);
435 case TR_MIGHTY_THROW:
436 return has_mighty_throw(player_ptr);
437 case TR_EASY2_WEAPON:
438 return has_easy2_weapon(player_ptr);
440 return has_down_saving(player_ptr);
442 return has_no_ac(player_ptr);
444 return has_heavy_spell(player_ptr);
445 case TR_INVULN_ARROW:
446 return has_invuln_arrow(player_ptr);
451 return check_equipment_flags(player_ptr, tr_flag);
453 return has_impact(player_ptr);
455 return has_vuln_acid(player_ptr);
457 return has_vuln_cold(player_ptr);
459 return has_vuln_elec(player_ptr);
461 return has_vuln_fire(player_ptr);
463 return has_vuln_lite(player_ptr);
465 return has_immune_dark(player_ptr);
469 case TR_PERSISTENT_CURSE:
470 return check_equipment_flags(player_ptr, tr_flag);
472 return has_vuln_curse(player_ptr);
481 * @brief プレイヤーが壁破壊進行を持っているかを返す。
483 bool has_kill_wall(PlayerType *player_ptr)
485 if (player_ptr->mimic_form == MimicKindType::DEMON_LORD || music_singing(player_ptr, MUSIC_WALL)) {
489 if (player_ptr->riding == 0) {
493 const auto &riding_monster = player_ptr->current_floor_ptr->m_list[player_ptr->riding];
494 const auto &riding_monrace = riding_monster.get_monrace();
495 return riding_monrace.feature_flags.has(MonsterFeatureType::KILL_WALL);
499 * @brief プレイヤーが壁通過を持っているかを返す。
500 * @param player_ptr プレイヤーへの参照ポインタ
503 * * 時限で幽体化、壁抜けをもつか種族幽霊ならばひとまずTRUE。
504 * * 但し騎乗中は乗騎が壁抜けを持っていなければ不能になる。
506 bool has_pass_wall(PlayerType *player_ptr)
508 if (player_ptr->wraith_form || player_ptr->tim_pass_wall || PlayerRace(player_ptr).equals(PlayerRaceType::SPECTRE)) {
512 if (player_ptr->riding == 0) {
516 const auto &monster = player_ptr->current_floor_ptr->m_list[player_ptr->riding];
517 const auto &monrace = monraces_info[monster.r_idx];
518 return monrace.feature_flags.has(MonsterFeatureType::PASS_WALL);
522 * @brief プレイヤーが強力射を持っているかを返す。
523 * @param player_ptr プレイヤーへの参照ポインタ
524 * @return 持っていたら所持前提ビットフラグを返す。
526 BIT_FLAGS has_xtra_might(PlayerType *player_ptr)
528 return common_cause_flags(player_ptr, TR_XTRA_MIGHT);
532 * @brief プレイヤーが邪悪感知を持っているかを返す。
533 * @param player_ptr プレイヤーへの参照ポインタ
534 * @return 持っていたら所持前提ビットフラグを返す。
536 BIT_FLAGS has_esp_evil(PlayerType *player_ptr)
538 BIT_FLAGS result = common_cause_flags(player_ptr, TR_ESP_EVIL);
539 if (player_ptr->realm1 == REALM_HEX) {
540 if (SpellHex(player_ptr).is_spelling_specific(HEX_DETECT_EVIL)) {
541 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
548 * @brief プレイヤーが自然界の動物感知を持っているかを返す。
549 * @param player_ptr プレイヤーへの参照ポインタ
550 * @return 持っていたら所持前提ビットフラグを返す。
552 BIT_FLAGS has_esp_animal(PlayerType *player_ptr)
554 return common_cause_flags(player_ptr, TR_ESP_ANIMAL);
558 * @brief プレイヤーがアンデッド感知を持っているかを返す。
559 * @param player_ptr プレイヤーへの参照ポインタ
560 * @return 持っていたら所持前提ビットフラグを返す。
562 BIT_FLAGS has_esp_undead(PlayerType *player_ptr)
564 return common_cause_flags(player_ptr, TR_ESP_UNDEAD);
568 * @brief プレイヤーが悪魔感知を持っているかを返す。
569 * @param player_ptr プレイヤーへの参照ポインタ
570 * @return 持っていたら所持前提ビットフラグを返す。
572 BIT_FLAGS has_esp_demon(PlayerType *player_ptr)
574 return common_cause_flags(player_ptr, TR_ESP_DEMON);
578 * @brief プレイヤーがオーク感知を持っているかを返す。
579 * @param player_ptr プレイヤーへの参照ポインタ
580 * @return 持っていたら所持前提ビットフラグを返す。
582 BIT_FLAGS has_esp_orc(PlayerType *player_ptr)
584 return common_cause_flags(player_ptr, TR_ESP_ORC);
588 * @brief プレイヤーがトロル感知を持っているかを返す。
589 * @param player_ptr プレイヤーへの参照ポインタ
590 * @return 持っていたら所持前提ビットフラグを返す。
592 BIT_FLAGS has_esp_troll(PlayerType *player_ptr)
594 return common_cause_flags(player_ptr, TR_ESP_TROLL);
598 * @brief プレイヤーが巨人感知を持っているかを返す。
599 * @param player_ptr プレイヤーへの参照ポインタ
600 * @return 持っていたら所持前提ビットフラグを返す。
602 BIT_FLAGS has_esp_giant(PlayerType *player_ptr)
604 return common_cause_flags(player_ptr, TR_ESP_GIANT);
608 * @brief プレイヤーがドラゴン感知を持っているかを返す。
609 * @param player_ptr プレイヤーへの参照ポインタ
610 * @return 持っていたら所持前提ビットフラグを返す。
612 BIT_FLAGS has_esp_dragon(PlayerType *player_ptr)
614 return common_cause_flags(player_ptr, TR_ESP_DRAGON);
618 * @brief プレイヤーが人間感知を持っているかを返す。
619 * @param player_ptr プレイヤーへの参照ポインタ
620 * @return 持っていたら所持前提ビットフラグを返す。
622 BIT_FLAGS has_esp_human(PlayerType *player_ptr)
624 return common_cause_flags(player_ptr, TR_ESP_HUMAN);
628 * @brief プレイヤーが善良感知を持っているかを返す。
629 * @param player_ptr プレイヤーへの参照ポインタ
630 * @return 持っていたら所持前提ビットフラグを返す。
632 BIT_FLAGS has_esp_good(PlayerType *player_ptr)
634 return common_cause_flags(player_ptr, TR_ESP_GOOD);
638 * @brief プレイヤーが無生物感知を持っているかを返す。
639 * @param player_ptr プレイヤーへの参照ポインタ
640 * @return 持っていたら所持前提ビットフラグを返す。
642 BIT_FLAGS has_esp_nonliving(PlayerType *player_ptr)
644 return common_cause_flags(player_ptr, TR_ESP_NONLIVING);
648 * @brief プレイヤーがユニーク感知を持っているかを返す。
649 * @param player_ptr プレイヤーへの参照ポインタ
650 * @return 持っていたら所持前提ビットフラグを返す。
652 BIT_FLAGS has_esp_unique(PlayerType *player_ptr)
654 return common_cause_flags(player_ptr, TR_ESP_UNIQUE);
658 * @brief プレイヤーがテレパシーを持っているかを返す。
659 * @param player_ptr プレイヤーへの参照ポインタ
660 * @return 持っていたら所持前提ビットフラグを返す。
662 BIT_FLAGS has_esp_telepathy(PlayerType *player_ptr)
664 BIT_FLAGS result = common_cause_flags(player_ptr, TR_TELEPATHY);
666 if (is_time_limit_esp(player_ptr) || player_ptr->ult_res) {
667 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
670 if (player_ptr->muta.has(PlayerMutationType::ESP)) {
671 result |= FLAG_CAUSE_MUTATION;
677 BIT_FLAGS has_bless_blade(PlayerType *player_ptr)
679 return common_cause_flags(player_ptr, TR_BLESSED);
682 BIT_FLAGS has_easy2_weapon(PlayerType *player_ptr)
684 return common_cause_flags(player_ptr, TR_EASY2_WEAPON);
687 BIT_FLAGS has_down_saving(PlayerType *player_ptr)
689 return common_cause_flags(player_ptr, TR_DOWN_SAVING);
692 BIT_FLAGS has_no_ac(PlayerType *player_ptr)
694 return common_cause_flags(player_ptr, TR_NO_AC);
697 BIT_FLAGS has_invuln_arrow(PlayerType *player_ptr)
699 if (player_ptr->effects()->blindness()->is_blind()) {
703 return common_cause_flags(player_ptr, TR_INVULN_ARROW);
706 void check_no_flowed(PlayerType *player_ptr)
709 bool has_sw = false, has_kabe = false;
711 player_ptr->no_flowed = false;
713 if (has_pass_wall(player_ptr) && !has_kill_wall(player_ptr)) {
714 player_ptr->no_flowed = true;
718 if (!player_ptr->realm1) {
719 player_ptr->no_flowed = false;
723 for (int i = 0; i < INVEN_PACK; i++) {
724 const auto &bi_key = player_ptr->inventory_list[i].bi_key;
725 if (bi_key == BaseitemKey(ItemKindType::NATURE_BOOK, 2)) {
729 if (bi_key == BaseitemKey(ItemKindType::CRAFT_BOOK, 2)) {
734 for (const auto this_o_idx : player_ptr->current_floor_ptr->grid_array[player_ptr->y][player_ptr->x].o_idx_list) {
735 o_ptr = &player_ptr->current_floor_ptr->o_list[this_o_idx];
737 if (o_ptr->bi_key == BaseitemKey(ItemKindType::NATURE_BOOK, 2)) {
740 if (o_ptr->bi_key == BaseitemKey(ItemKindType::CRAFT_BOOK, 2)) {
745 PlayerClass pc(player_ptr);
746 if (has_sw && ((player_ptr->realm1 == REALM_NATURE) || (player_ptr->realm2 == REALM_NATURE) || pc.equals(PlayerClassType::SORCERER))) {
747 const magic_type *s_ptr = &mp_ptr->info[REALM_NATURE - 1][SPELL_SW];
748 if (player_ptr->lev >= s_ptr->slevel) {
749 player_ptr->no_flowed = true;
753 if (has_kabe && ((player_ptr->realm1 == REALM_CRAFT) || (player_ptr->realm2 == REALM_CRAFT) || pc.equals(PlayerClassType::SORCERER))) {
754 const magic_type *s_ptr = &mp_ptr->info[REALM_CRAFT - 1][SPELL_WALL];
755 if (player_ptr->lev >= s_ptr->slevel) {
756 player_ptr->no_flowed = true;
761 BIT_FLAGS has_mighty_throw(PlayerType *player_ptr)
763 return common_cause_flags(player_ptr, TR_MIGHTY_THROW);
766 BIT_FLAGS has_dec_mana(PlayerType *player_ptr)
768 return common_cause_flags(player_ptr, TR_DEC_MANA);
771 BIT_FLAGS has_reflect(PlayerType *player_ptr)
773 BIT_FLAGS result = common_cause_flags(player_ptr, TR_REFLECT);
775 if (player_ptr->ult_res || player_ptr->wraith_form || player_ptr->magicdef || player_ptr->tim_reflect) {
776 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
782 BIT_FLAGS has_see_nocto(PlayerType *player_ptr)
784 return PlayerClass(player_ptr).equals(PlayerClassType::NINJA) ? FLAG_CAUSE_CLASS : FLAG_CAUSE_NONE;
787 BIT_FLAGS has_warning(PlayerType *player_ptr)
789 BIT_FLAGS result = 0L;
792 for (int i = INVEN_MAIN_HAND; i < INVEN_TOTAL; i++) {
793 o_ptr = &player_ptr->inventory_list[i];
794 if (!o_ptr->is_valid()) {
798 const auto flags = o_ptr->get_flags();
800 if (flags.has(TR_WARNING)) {
801 if (!o_ptr->is_inscribed() || !angband_strchr(o_ptr->inscription->data(), '$')) {
802 set_bits(result, convert_inventory_slot_type_to_flag_cause(i2enum<inventory_slot_type>(i)));
809 BIT_FLAGS has_anti_magic(PlayerType *player_ptr)
811 return common_cause_flags(player_ptr, TR_NO_MAGIC);
814 BIT_FLAGS has_anti_tele(PlayerType *player_ptr)
816 return common_cause_flags(player_ptr, TR_NO_TELE);
819 BIT_FLAGS has_sh_fire(PlayerType *player_ptr)
821 BIT_FLAGS result = common_cause_flags(player_ptr, TR_SH_FIRE);
823 if (player_ptr->muta.has(PlayerMutationType::FIRE_BODY)) {
824 result |= FLAG_CAUSE_MUTATION;
827 if (SpellHex(player_ptr).is_spelling_specific(HEX_DEMON_AURA) || player_ptr->ult_res || player_ptr->tim_sh_fire) {
828 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
834 BIT_FLAGS has_sh_elec(PlayerType *player_ptr)
836 BIT_FLAGS result = common_cause_flags(player_ptr, TR_SH_ELEC);
838 if (player_ptr->muta.has(PlayerMutationType::ELEC_TOUC)) {
839 result |= FLAG_CAUSE_MUTATION;
842 if (SpellHex(player_ptr).is_spelling_specific(HEX_SHOCK_CLOAK) || player_ptr->ult_res) {
843 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
849 BIT_FLAGS has_sh_cold(PlayerType *player_ptr)
851 BIT_FLAGS result = common_cause_flags(player_ptr, TR_SH_COLD);
853 if (player_ptr->ult_res || SpellHex(player_ptr).is_spelling_specific(HEX_ICE_ARMOR)) {
854 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
860 BIT_FLAGS has_easy_spell(PlayerType *player_ptr)
862 return common_cause_flags(player_ptr, TR_EASY_SPELL);
865 BIT_FLAGS has_heavy_spell(PlayerType *player_ptr)
867 return common_cause_flags(player_ptr, TR_HEAVY_SPELL);
870 BIT_FLAGS has_hold_exp(PlayerType *player_ptr)
872 BIT_FLAGS result = common_cause_flags(player_ptr, TR_HOLD_EXP);
874 if (player_ptr->ppersonality == PERSONALITY_MUNCHKIN) {
875 result |= FLAG_CAUSE_PERSONALITY;
878 if (player_ptr->ult_res) {
879 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
885 BIT_FLAGS has_see_inv(PlayerType *player_ptr)
887 BIT_FLAGS result = common_cause_flags(player_ptr, TR_SEE_INVIS);
889 if (player_ptr->ult_res || player_ptr->tim_invis) {
890 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
896 BIT_FLAGS has_magic_mastery(PlayerType *player_ptr)
898 return common_cause_flags(player_ptr, TR_MAGIC_MASTERY);
901 BIT_FLAGS has_free_act(PlayerType *player_ptr)
903 BIT_FLAGS result = common_cause_flags(player_ptr, TR_FREE_ACT);
905 if (player_ptr->muta.has(PlayerMutationType::MOTION)) {
906 result |= FLAG_CAUSE_MUTATION;
909 if (player_ptr->ult_res || player_ptr->magicdef) {
910 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
916 BIT_FLAGS has_sustain_str(PlayerType *player_ptr)
918 BIT_FLAGS result = common_cause_flags(player_ptr, TR_SUST_STR);
920 if (player_ptr->ult_res) {
921 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
927 BIT_FLAGS has_sustain_int(PlayerType *player_ptr)
929 BIT_FLAGS result = common_cause_flags(player_ptr, TR_SUST_INT);
931 if (player_ptr->ult_res) {
932 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
938 BIT_FLAGS has_sustain_wis(PlayerType *player_ptr)
940 BIT_FLAGS result = common_cause_flags(player_ptr, TR_SUST_WIS);
942 if (player_ptr->ult_res) {
943 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
949 BIT_FLAGS has_sustain_dex(PlayerType *player_ptr)
951 BIT_FLAGS result = common_cause_flags(player_ptr, TR_SUST_DEX);
953 if (player_ptr->ult_res) {
954 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
960 BIT_FLAGS has_sustain_con(PlayerType *player_ptr)
962 BIT_FLAGS result = common_cause_flags(player_ptr, TR_SUST_CON);
964 if (player_ptr->ult_res) {
965 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
971 BIT_FLAGS has_sustain_chr(PlayerType *player_ptr)
973 BIT_FLAGS result = common_cause_flags(player_ptr, TR_SUST_CHR);
975 if (player_ptr->ult_res) {
976 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
982 BIT_FLAGS has_levitation(PlayerType *player_ptr)
984 BIT_FLAGS result = common_cause_flags(player_ptr, TR_LEVITATION);
986 if (player_ptr->muta.has(PlayerMutationType::WINGS)) {
987 result |= FLAG_CAUSE_MUTATION;
990 if (player_ptr->ult_res || player_ptr->magicdef) {
991 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
994 if (player_ptr->tim_levitation) {
995 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
998 // 乗馬中は実際に浮遊するかどうかは乗馬中のモンスターに依存する
999 if (player_ptr->riding == 0) {
1003 const auto &monster = player_ptr->current_floor_ptr->m_list[player_ptr->riding];
1004 const auto &monrace = monraces_info[monster.r_idx];
1005 return monrace.feature_flags.has(MonsterFeatureType::CAN_FLY) ? FLAG_CAUSE_RIDING : FLAG_CAUSE_NONE;
1008 bool has_can_swim(PlayerType *player_ptr)
1010 if (player_ptr->riding == 0) {
1014 const auto &monster = player_ptr->current_floor_ptr->m_list[player_ptr->riding];
1015 const auto &monrace = monraces_info[monster.r_idx];
1016 return monrace.feature_flags.has_any_of({ MonsterFeatureType::CAN_SWIM, MonsterFeatureType::AQUATIC });
1019 BIT_FLAGS has_slow_digest(PlayerType *player_ptr)
1021 BIT_FLAGS result = common_cause_flags(player_ptr, TR_SLOW_DIGEST);
1023 if (player_ptr->ult_res) {
1024 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1030 BIT_FLAGS has_regenerate(PlayerType *player_ptr)
1032 BIT_FLAGS result = common_cause_flags(player_ptr, TR_REGEN);
1034 if (player_ptr->muta.has(PlayerMutationType::REGEN)) {
1035 result |= FLAG_CAUSE_MUTATION;
1038 if (SpellHex(player_ptr).is_spelling_specific(HEX_DEMON_AURA) || player_ptr->ult_res || player_ptr->tim_regen) {
1039 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1042 if (player_ptr->muta.has(PlayerMutationType::FLESH_ROT)) {
1049 void update_curses(PlayerType *player_ptr)
1052 player_ptr->cursed.clear();
1053 player_ptr->cursed_special.clear();
1055 if (player_ptr->ppersonality == PERSONALITY_SEXY) {
1056 player_ptr->cursed.set(CurseTraitType::AGGRAVATE);
1059 for (int i = INVEN_MAIN_HAND; i < INVEN_TOTAL; i++) {
1060 o_ptr = &player_ptr->inventory_list[i];
1061 if (!o_ptr->is_valid()) {
1064 const auto flags = o_ptr->get_flags();
1065 if (flags.has(TR_AGGRAVATE)) {
1066 player_ptr->cursed.set(CurseTraitType::AGGRAVATE);
1068 if (flags.has(TR_DRAIN_EXP)) {
1069 player_ptr->cursed.set(CurseTraitType::DRAIN_EXP);
1071 if (flags.has(TR_TY_CURSE)) {
1072 player_ptr->cursed.set(CurseTraitType::TY_CURSE);
1074 if (flags.has(TR_ADD_L_CURSE)) {
1075 player_ptr->cursed.set(CurseTraitType::ADD_L_CURSE);
1077 if (flags.has(TR_ADD_H_CURSE)) {
1078 player_ptr->cursed.set(CurseTraitType::ADD_H_CURSE);
1080 if (flags.has(TR_DRAIN_HP)) {
1081 player_ptr->cursed.set(CurseTraitType::DRAIN_HP);
1083 if (flags.has(TR_DRAIN_MANA)) {
1084 player_ptr->cursed.set(CurseTraitType::DRAIN_MANA);
1086 if (flags.has(TR_CALL_ANIMAL)) {
1087 player_ptr->cursed.set(CurseTraitType::CALL_ANIMAL);
1089 if (flags.has(TR_CALL_DEMON)) {
1090 player_ptr->cursed.set(CurseTraitType::CALL_DEMON);
1092 if (flags.has(TR_CALL_DRAGON)) {
1093 player_ptr->cursed.set(CurseTraitType::CALL_DRAGON);
1095 if (flags.has(TR_CALL_UNDEAD)) {
1096 player_ptr->cursed.set(CurseTraitType::CALL_UNDEAD);
1098 if (flags.has(TR_COWARDICE)) {
1099 player_ptr->cursed.set(CurseTraitType::COWARDICE);
1101 if (flags.has(TR_LOW_MELEE)) {
1102 player_ptr->cursed.set(CurseTraitType::LOW_MELEE);
1104 if (flags.has(TR_LOW_AC)) {
1105 player_ptr->cursed.set(CurseTraitType::LOW_AC);
1107 if (flags.has(TR_HARD_SPELL)) {
1108 player_ptr->cursed.set(CurseTraitType::HARD_SPELL);
1110 if (flags.has(TR_FAST_DIGEST)) {
1111 player_ptr->cursed.set(CurseTraitType::FAST_DIGEST);
1113 if (flags.has(TR_SLOW_REGEN)) {
1114 player_ptr->cursed.set(CurseTraitType::SLOW_REGEN);
1116 if (flags.has(TR_BERS_RAGE)) {
1117 player_ptr->cursed.set(CurseTraitType::BERS_RAGE);
1119 if (flags.has(TR_PERSISTENT_CURSE)) {
1120 player_ptr->cursed.set(CurseTraitType::PERSISTENT_CURSE);
1122 if (flags.has(TR_VUL_CURSE)) {
1123 player_ptr->cursed.set(CurseTraitType::VUL_CURSE);
1126 auto obj_curse_flags = o_ptr->curse_flags;
1127 obj_curse_flags.reset({ CurseTraitType::CURSED, CurseTraitType::HEAVY_CURSE, CurseTraitType::PERMA_CURSE });
1128 player_ptr->cursed.set(obj_curse_flags);
1129 if (o_ptr->is_specific_artifact(FixedArtifactId::CHAINSWORD)) {
1130 player_ptr->cursed_special.set(CurseSpecialTraitType::CHAINSWORD);
1133 if (flags.has(TR_TELEPORT)) {
1134 if (o_ptr->is_cursed()) {
1135 player_ptr->cursed.set(CurseTraitType::TELEPORT);
1137 /* {.} will stop random teleportation. */
1138 if (o_ptr->is_inscribed() && angband_strchr(o_ptr->inscription->data(), '.')) {
1140 player_ptr->cursed_special.set(CurseSpecialTraitType::TELEPORT_SELF);
1146 if (player_ptr->cursed.has(CurseTraitType::TELEPORT)) {
1147 player_ptr->cursed_special.reset(CurseSpecialTraitType::TELEPORT_SELF);
1151 BIT_FLAGS has_impact(PlayerType *player_ptr)
1153 return common_cause_flags(player_ptr, TR_IMPACT);
1156 BIT_FLAGS has_earthquake(PlayerType *player_ptr)
1158 return common_cause_flags(player_ptr, TR_EARTHQUAKE);
1161 void update_extra_blows(PlayerType *player_ptr)
1164 player_ptr->extra_blows[0] = player_ptr->extra_blows[1] = 0;
1166 const melee_type melee_type = player_melee_type(player_ptr);
1167 const bool two_handed = (melee_type == MELEE_TYPE_WEAPON_TWOHAND || melee_type == MELEE_TYPE_BAREHAND_TWO);
1169 for (int i = INVEN_MAIN_HAND; i < INVEN_TOTAL; i++) {
1170 o_ptr = &player_ptr->inventory_list[i];
1171 if (!o_ptr->is_valid()) {
1175 const auto flags = o_ptr->get_flags();
1176 if (flags.has(TR_BLOWS)) {
1177 if ((i == INVEN_MAIN_HAND || i == INVEN_MAIN_RING) && !two_handed) {
1178 player_ptr->extra_blows[0] += o_ptr->pval;
1179 } else if ((i == INVEN_SUB_HAND || i == INVEN_SUB_RING) && !two_handed) {
1180 player_ptr->extra_blows[1] += o_ptr->pval;
1182 player_ptr->extra_blows[0] += o_ptr->pval;
1183 player_ptr->extra_blows[1] += o_ptr->pval;
1189 BIT_FLAGS has_resist_acid(PlayerType *player_ptr)
1191 BIT_FLAGS result = common_cause_flags(player_ptr, TR_RES_ACID);
1193 if (player_ptr->ult_res) {
1194 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1197 result |= has_immune_acid(player_ptr);
1202 BIT_FLAGS has_vuln_acid(PlayerType *player_ptr)
1204 BIT_FLAGS result = common_cause_flags(player_ptr, TR_VUL_ACID);
1206 if (player_ptr->muta.has(PlayerMutationType::VULN_ELEM)) {
1207 result |= FLAG_CAUSE_MUTATION;
1213 BIT_FLAGS has_resist_elec(PlayerType *player_ptr)
1215 BIT_FLAGS result = common_cause_flags(player_ptr, TR_RES_ELEC);
1217 if (player_ptr->ult_res) {
1218 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1221 result |= has_immune_elec(player_ptr);
1226 BIT_FLAGS has_vuln_elec(PlayerType *player_ptr)
1228 BIT_FLAGS result = common_cause_flags(player_ptr, TR_VUL_ELEC);
1230 if (player_ptr->muta.has(PlayerMutationType::VULN_ELEM)) {
1231 result |= FLAG_CAUSE_MUTATION;
1237 BIT_FLAGS has_resist_fire(PlayerType *player_ptr)
1239 BIT_FLAGS result = common_cause_flags(player_ptr, TR_RES_FIRE);
1241 if (player_ptr->ult_res) {
1242 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1245 result |= has_immune_fire(player_ptr);
1250 BIT_FLAGS has_vuln_fire(PlayerType *player_ptr)
1252 BIT_FLAGS result = common_cause_flags(player_ptr, TR_VUL_FIRE);
1254 if (player_ptr->muta.has(PlayerMutationType::VULN_ELEM)) {
1255 result |= FLAG_CAUSE_MUTATION;
1261 BIT_FLAGS has_resist_cold(PlayerType *player_ptr)
1263 BIT_FLAGS result = common_cause_flags(player_ptr, TR_RES_COLD);
1265 if (player_ptr->ult_res) {
1266 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1269 result |= has_immune_cold(player_ptr);
1274 BIT_FLAGS has_vuln_cold(PlayerType *player_ptr)
1276 BIT_FLAGS result = common_cause_flags(player_ptr, TR_VUL_COLD);
1278 if (player_ptr->muta.has(PlayerMutationType::VULN_ELEM)) {
1279 result |= FLAG_CAUSE_MUTATION;
1285 BIT_FLAGS has_resist_pois(PlayerType *player_ptr)
1287 BIT_FLAGS result = common_cause_flags(player_ptr, TR_RES_POIS);
1289 if (player_ptr->ult_res) {
1290 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1296 BIT_FLAGS has_resist_conf(PlayerType *player_ptr)
1298 BIT_FLAGS result = common_cause_flags(player_ptr, TR_RES_CONF);
1300 if (player_ptr->ppersonality == PERSONALITY_CHARGEMAN || player_ptr->ppersonality == PERSONALITY_MUNCHKIN) {
1301 result |= FLAG_CAUSE_PERSONALITY;
1304 if (player_ptr->ult_res || player_ptr->magicdef) {
1305 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1311 BIT_FLAGS has_resist_sound(PlayerType *player_ptr)
1313 BIT_FLAGS result = common_cause_flags(player_ptr, TR_RES_SOUND);
1315 if (player_ptr->ult_res) {
1316 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1322 BIT_FLAGS has_resist_lite(PlayerType *player_ptr)
1324 BIT_FLAGS result = common_cause_flags(player_ptr, TR_RES_LITE);
1326 if (player_ptr->ult_res) {
1327 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1333 BIT_FLAGS has_vuln_lite(PlayerType *player_ptr)
1335 BIT_FLAGS result = common_cause_flags(player_ptr, TR_VUL_LITE);
1337 if (player_ptr->wraith_form) {
1338 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1344 BIT_FLAGS has_resist_dark(PlayerType *player_ptr)
1346 BIT_FLAGS result = common_cause_flags(player_ptr, TR_RES_DARK) | common_cause_flags(player_ptr, TR_IM_DARK);
1348 if (player_ptr->ult_res) {
1349 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1355 BIT_FLAGS has_resist_chaos(PlayerType *player_ptr)
1357 BIT_FLAGS result = common_cause_flags(player_ptr, TR_RES_CHAOS);
1359 if (player_ptr->ult_res) {
1360 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1366 BIT_FLAGS has_resist_disen(PlayerType *player_ptr)
1368 BIT_FLAGS result = common_cause_flags(player_ptr, TR_RES_DISEN);
1370 if (player_ptr->ult_res) {
1371 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1377 BIT_FLAGS has_resist_shard(PlayerType *player_ptr)
1379 BIT_FLAGS result = common_cause_flags(player_ptr, TR_RES_SHARDS);
1381 if (player_ptr->ult_res) {
1382 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1388 BIT_FLAGS has_resist_nexus(PlayerType *player_ptr)
1390 BIT_FLAGS result = common_cause_flags(player_ptr, TR_RES_NEXUS);
1392 if (player_ptr->ult_res) {
1393 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1399 BIT_FLAGS has_resist_blind(PlayerType *player_ptr)
1401 BIT_FLAGS result = common_cause_flags(player_ptr, TR_RES_BLIND);
1403 if (player_ptr->ppersonality == PERSONALITY_MUNCHKIN) {
1404 result |= FLAG_CAUSE_PERSONALITY;
1407 if (player_ptr->ult_res || player_ptr->magicdef) {
1408 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1414 BIT_FLAGS has_resist_neth(PlayerType *player_ptr)
1416 BIT_FLAGS result = common_cause_flags(player_ptr, TR_RES_NETHER);
1418 if (player_ptr->ult_res || player_ptr->tim_res_nether) {
1419 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1425 BIT_FLAGS has_resist_time(PlayerType *player_ptr)
1427 BIT_FLAGS result = common_cause_flags(player_ptr, TR_RES_TIME);
1429 if (player_ptr->ult_res || player_ptr->tim_res_time) {
1430 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1436 BIT_FLAGS has_resist_water(PlayerType *player_ptr)
1438 BIT_FLAGS result = common_cause_flags(player_ptr, TR_RES_WATER);
1440 if (player_ptr->ult_res) {
1441 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1448 * @brief 呪力耐性を所持しているかどうか
1449 * @param プレイヤー情報への参照ポインタ
1450 * @return 呪力耐性を所持していればTRUE、なければFALSE
1452 BIT_FLAGS has_resist_curse(PlayerType *player_ptr)
1454 BIT_FLAGS result = common_cause_flags(player_ptr, TR_RES_CURSE);
1456 if (player_ptr->ult_res) {
1457 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1464 * @brief 呪力弱点を所持しているかどうか
1465 * @param プレイヤー情報への参照ポインタ
1466 * @return 呪力弱点を所持していればTRUE、なければFALSE
1468 BIT_FLAGS has_vuln_curse(PlayerType *player_ptr)
1471 BIT_FLAGS result = 0L;
1472 for (int i = INVEN_MAIN_HAND; i < INVEN_TOTAL; i++) {
1473 o_ptr = &player_ptr->inventory_list[i];
1474 if (!o_ptr->is_valid()) {
1478 const auto flags = o_ptr->get_flags();
1480 if (flags.has(TR_VUL_CURSE) || o_ptr->curse_flags.has(CurseTraitType::VUL_CURSE)) {
1481 set_bits(result, convert_inventory_slot_type_to_flag_cause(i2enum<inventory_slot_type>(i)));
1489 * @brief 呪力弱点かつ重く呪われている装備の有無
1490 * @param プレイヤー情報への参照ポインタ
1491 * @return 呪力弱点かつ重く呪われている装備があればTRUE、なければFALSE
1493 BIT_FLAGS has_heavy_vuln_curse(PlayerType *player_ptr)
1496 BIT_FLAGS result = 0L;
1497 for (int i = INVEN_MAIN_HAND; i < INVEN_TOTAL; i++) {
1498 o_ptr = &player_ptr->inventory_list[i];
1499 if (!o_ptr->is_valid()) {
1503 const auto flags = o_ptr->get_flags();
1505 if ((flags.has(TR_VUL_CURSE) || o_ptr->curse_flags.has(CurseTraitType::VUL_CURSE)) && o_ptr->curse_flags.has(CurseTraitType::HEAVY_CURSE)) {
1506 set_bits(result, convert_inventory_slot_type_to_flag_cause(i2enum<inventory_slot_type>(i)));
1513 BIT_FLAGS has_resist_fear(PlayerType *player_ptr)
1515 BIT_FLAGS result = common_cause_flags(player_ptr, TR_RES_FEAR);
1517 if (player_ptr->muta.has(PlayerMutationType::FEARLESS)) {
1518 result |= FLAG_CAUSE_MUTATION;
1521 if (is_hero(player_ptr) || is_shero(player_ptr) || player_ptr->ult_res) {
1522 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1528 BIT_FLAGS has_immune_acid(PlayerType *player_ptr)
1530 BIT_FLAGS result = common_cause_flags(player_ptr, TR_IM_ACID);
1532 if (player_ptr->ele_immune) {
1533 if (player_ptr->special_defense & DEFENSE_ACID) {
1534 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1541 BIT_FLAGS has_immune_elec(PlayerType *player_ptr)
1543 BIT_FLAGS result = common_cause_flags(player_ptr, TR_IM_ELEC);
1545 if (player_ptr->ele_immune) {
1546 if (player_ptr->special_defense & DEFENSE_ELEC) {
1547 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1554 BIT_FLAGS has_immune_fire(PlayerType *player_ptr)
1556 BIT_FLAGS result = common_cause_flags(player_ptr, TR_IM_FIRE);
1558 if (player_ptr->ele_immune) {
1559 if (player_ptr->special_defense & DEFENSE_FIRE) {
1560 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1567 BIT_FLAGS has_immune_cold(PlayerType *player_ptr)
1569 BIT_FLAGS result = common_cause_flags(player_ptr, TR_IM_COLD);
1571 if (player_ptr->ele_immune) {
1572 if (player_ptr->special_defense & DEFENSE_COLD) {
1573 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1580 BIT_FLAGS has_immune_dark(PlayerType *player_ptr)
1582 BIT_FLAGS result = common_cause_flags(player_ptr, TR_IM_DARK);
1584 if (player_ptr->wraith_form) {
1585 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1591 melee_type player_melee_type(PlayerType *player_ptr)
1593 if (has_two_handed_weapons(player_ptr)) {
1594 return MELEE_TYPE_WEAPON_TWOHAND;
1597 if (has_melee_weapon(player_ptr, INVEN_MAIN_HAND)) {
1598 if (has_melee_weapon(player_ptr, INVEN_SUB_HAND)) {
1599 return MELEE_TYPE_WEAPON_DOUBLE;
1601 return MELEE_TYPE_WEAPON_MAIN;
1604 if (has_melee_weapon(player_ptr, INVEN_SUB_HAND)) {
1605 return MELEE_TYPE_WEAPON_SUB;
1608 if (empty_hands(player_ptr, false) == (EMPTY_HAND_MAIN | EMPTY_HAND_SUB)) {
1609 return MELEE_TYPE_BAREHAND_TWO;
1612 if (empty_hands(player_ptr, false) == EMPTY_HAND_MAIN) {
1613 return MELEE_TYPE_BAREHAND_MAIN;
1616 if (empty_hands(player_ptr, false) == EMPTY_HAND_SUB) {
1617 return MELEE_TYPE_BAREHAND_SUB;
1620 return MELEE_TYPE_SHIELD_DOUBLE;
1624 * @brief 利き手で攻撃可能かどうかを判定する
1625 * 利き手で攻撃可能とは、利き手に武器を持っているか、
1626 * 利き手が素手かつ左手も素手もしくは盾を装備している事を意味する。
1627 * @details Includes martial arts and hand combats as weapons.
1629 bool can_attack_with_main_hand(PlayerType *player_ptr)
1631 if (has_melee_weapon(player_ptr, INVEN_MAIN_HAND)) {
1635 if ((empty_hands(player_ptr, true) & EMPTY_HAND_MAIN) && !can_attack_with_sub_hand(player_ptr)) {
1643 * @brief 非利き手で攻撃可能かどうかを判定する
1644 * 非利き手で攻撃可能とは、非利き手に武器を持っている事に等しい
1645 * @details Exclude martial arts and hand combats from weapons.
1647 bool can_attack_with_sub_hand(PlayerType *player_ptr)
1649 return has_melee_weapon(player_ptr, INVEN_SUB_HAND);
1653 * @brief 両手持ち状態かどうかを判定する
1655 bool has_two_handed_weapons(PlayerType *player_ptr)
1657 if (can_two_hands_wielding(player_ptr)) {
1658 if (can_attack_with_main_hand(player_ptr) && (empty_hands(player_ptr, false) == EMPTY_HAND_SUB) && player_ptr->inventory_list[INVEN_MAIN_HAND].allow_two_hands_wielding()) {
1660 } else if (can_attack_with_sub_hand(player_ptr) && (empty_hands(player_ptr, false) == EMPTY_HAND_MAIN) && player_ptr->inventory_list[INVEN_SUB_HAND].allow_two_hands_wielding()) {
1667 BIT_FLAGS has_lite(PlayerType *player_ptr)
1669 BIT_FLAGS result = 0L;
1670 if (PlayerClass(player_ptr).equals(PlayerClassType::NINJA)) {
1674 if (player_ptr->ppersonality == PERSONALITY_MUNCHKIN) {
1675 result |= FLAG_CAUSE_PERSONALITY;
1678 if (PlayerRace(player_ptr).tr_flags().has(TR_LITE_1)) {
1679 result |= FLAG_CAUSE_RACE;
1682 if (player_ptr->ult_res) {
1683 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
1686 result |= has_sh_fire(player_ptr);
1692 * @brief 両手持ちボーナスがもらえないかどうかを判定する。 / Does *not * get two hand wielding bonus.
1694 * Only can get hit bonuses when wieids an enough light weapon which is lighter than 5 times of weight limit.
1695 * If its weight is 10 times heavier or more than weight limit, gets hit penalty in calc_to_hit().
1697 bool has_disable_two_handed_bonus(PlayerType *player_ptr, int i)
1699 if (has_melee_weapon(player_ptr, INVEN_MAIN_HAND + i) && has_two_handed_weapons(player_ptr)) {
1700 auto *o_ptr = &player_ptr->inventory_list[INVEN_MAIN_HAND + i];
1701 int limit = calc_weapon_weight_limit(player_ptr);
1703 /* Enable when two hand wields an enough light weapon */
1704 if (limit >= o_ptr->weight / 5) {
1709 /* Disable when empty hands, one hand wieldings and heavy weapons */
1714 * @brief ふさわしくない武器を持っているかどうかを返す。
1715 * @todo 相応しい時にFALSEで相応しくない時にTRUEという負論理は良くない、後で修正する
1717 bool is_wielding_icky_weapon(PlayerType *player_ptr, int i)
1719 const auto *o_ptr = &player_ptr->inventory_list[INVEN_MAIN_HAND + i];
1720 const auto flags = o_ptr->get_flags();
1722 const auto tval = o_ptr->bi_key.tval();
1723 const auto has_no_weapon = (tval == ItemKindType::NONE) || (tval == ItemKindType::SHIELD);
1724 PlayerClass pc(player_ptr);
1725 if (pc.equals(PlayerClassType::PRIEST)) {
1726 auto is_suitable_weapon = flags.has(TR_BLESSED);
1727 is_suitable_weapon |= (tval != ItemKindType::SWORD) && (tval != ItemKindType::POLEARM);
1728 return !has_no_weapon && !is_suitable_weapon;
1731 if (pc.equals(PlayerClassType::SORCERER)) {
1732 auto is_suitable_weapon = o_ptr->bi_key == BaseitemKey(ItemKindType::HAFTED, SV_WIZSTAFF);
1733 is_suitable_weapon |= o_ptr->bi_key == BaseitemKey(ItemKindType::HAFTED, SV_NAMAKE_HAMMER);
1734 return !has_no_weapon && !is_suitable_weapon;
1737 return has_not_monk_weapon(player_ptr, i) || has_not_ninja_weapon(player_ptr, i);
1741 * @brief 乗馬にふさわしくない武器を持って乗馬しているかどうかを返す.
1742 * @param player_ptr プレイヤーへの参照ポインタ
1743 * @param i 武器を持っている手。0ならば利き手、1ならば反対の手
1745 bool is_wielding_icky_riding_weapon(PlayerType *player_ptr, int i)
1747 const auto *o_ptr = &player_ptr->inventory_list[INVEN_MAIN_HAND + i];
1748 const auto flags = o_ptr->get_flags();
1749 const auto tval = o_ptr->bi_key.tval();
1750 const auto has_no_weapon = (tval == ItemKindType::NONE) || (tval == ItemKindType::SHIELD);
1751 const auto is_suitable = o_ptr->is_lance() || flags.has(TR_RIDING);
1752 return (player_ptr->riding > 0) && !has_no_weapon && !is_suitable;
1755 bool has_not_ninja_weapon(PlayerType *player_ptr, int i)
1757 if (!has_melee_weapon(player_ptr, INVEN_MAIN_HAND + i)) {
1761 const auto &item = player_ptr->inventory_list[INVEN_MAIN_HAND + i];
1762 const auto tval = item.bi_key.tval();
1763 const auto sval = item.bi_key.sval().value();
1764 return PlayerClass(player_ptr).equals(PlayerClassType::NINJA) &&
1765 !((player_ptr->weapon_exp_max[tval][sval] > PlayerSkill::weapon_exp_at(PlayerSkillRank::BEGINNER)) &&
1766 (player_ptr->inventory_list[INVEN_SUB_HAND - i].bi_key.tval() != ItemKindType::SHIELD));
1769 bool has_not_monk_weapon(PlayerType *player_ptr, int i)
1771 if (!has_melee_weapon(player_ptr, INVEN_MAIN_HAND + i)) {
1775 const auto &item = player_ptr->inventory_list[INVEN_MAIN_HAND + i];
1776 const auto tval = item.bi_key.tval();
1777 const auto sval = item.bi_key.sval().value();
1778 PlayerClass pc(player_ptr);
1779 return pc.is_martial_arts_pro() && (player_ptr->weapon_exp_max[tval][sval] == PlayerSkill::weapon_exp_at(PlayerSkillRank::UNSKILLED));
1782 bool has_good_luck(PlayerType *player_ptr)
1784 return (player_ptr->ppersonality == PERSONALITY_LUCKY) || (player_ptr->muta.has(PlayerMutationType::GOOD_LUCK));
1787 BIT_FLAGS player_aggravate_state(PlayerType *player_ptr)
1789 if (player_ptr->cursed.has(CurseTraitType::AGGRAVATE)) {
1790 if ((PlayerRace(player_ptr).equals(PlayerRaceType::S_FAIRY)) && (player_ptr->ppersonality != PERSONALITY_SEXY)) {
1791 return AGGRAVATE_S_FAIRY;
1793 return AGGRAVATE_NORMAL;
1796 return AGGRAVATE_NONE;
1799 bool has_aggravate(PlayerType *player_ptr)
1801 return player_aggravate_state(player_ptr) == AGGRAVATE_NORMAL;