1 #include "player/player-status-flags.h"
2 #include "artifact/fixed-art-types.h"
4 #include "inventory/inventory-slot-types.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-checker.h"
13 #include "object-hook/hook-weapon.h"
14 #include "object/object-flags.h"
15 #include "player/mimic-info-table.h"
16 #include "player/player-class.h"
17 #include "player/player-race-types.h"
18 #include "player/player-race.h"
19 #include "player/player-skill.h"
20 #include "player/player-status.h"
21 #include "player/race-info-table.h"
22 #include "player/special-defense-types.h"
23 #include "realm/realm-hex-numbers.h"
24 #include "realm/realm-song-numbers.h"
25 #include "realm/realm-types.h"
26 #include "spell-realm/spells-hex.h"
27 #include "sv-definition/sv-weapon-types.h"
28 #include "system/floor-type-definition.h"
29 #include "system/monster-type-definition.h"
30 #include "system/object-type-definition.h"
31 #include "util/bit-flags-calculator.h"
32 #include "util/quarks.h"
33 #include "util/string-processor.h"
35 static BIT_FLAGS check_equipment_flags(player_type *creature_ptr, tr_type tr_flag);
38 * @brief 装備による所定の特性フラグを得ているかを一括して取得する関数。
40 static BIT_FLAGS check_equipment_flags(player_type *creature_ptr, tr_type tr_flag)
43 BIT_FLAGS flgs[TR_FLAG_SIZE];
44 BIT_FLAGS result = 0L;
45 for (inventory_slot_type i = INVEN_MAIN_HAND; i < INVEN_TOTAL; i++) {
46 o_ptr = &creature_ptr->inventory_list[i];
50 object_flags(creature_ptr, o_ptr, flgs);
52 if (has_flag(flgs, tr_flag))
53 result |= 0x01U << (i - INVEN_MAIN_HAND);
59 * @brief クリーチャーが壁破壊進行を持っているかを返す。
61 bool has_kill_wall(player_type *creature_ptr)
63 if (creature_ptr->mimic_form == MIMIC_DEMON_LORD || music_singing(creature_ptr, MUSIC_WALL)) {
67 if (creature_ptr->riding) {
68 monster_type *riding_m_ptr = &creature_ptr->current_floor_ptr->m_list[creature_ptr->riding];
69 monster_race *riding_r_ptr = &r_info[riding_m_ptr->r_idx];
70 if (riding_r_ptr->flags2 & RF2_KILL_WALL)
78 * @brief クリーチャーが壁通過を持っているかを返す。
79 * @param creature_ptr 判定対象のクリーチャー参照ポインタ
82 * * 時限で幽体化、壁抜けをもつか種族幽霊ならばひとまずTRUE。
83 * * 但し騎乗中は乗騎が壁抜けを持っていなければ不能になる。
85 bool has_pass_wall(player_type *creature_ptr)
89 if (creature_ptr->wraith_form || creature_ptr->tim_pass_wall || (!creature_ptr->mimic_form && creature_ptr->prace == RACE_SPECTRE)) {
93 if (creature_ptr->riding) {
94 monster_type *riding_m_ptr = &creature_ptr->current_floor_ptr->m_list[creature_ptr->riding];
95 monster_race *riding_r_ptr = &r_info[riding_m_ptr->r_idx];
96 if (!(riding_r_ptr->flags2 & RF2_PASS_WALL))
104 * @brief クリーチャーが強力射を持っているかを返す。
105 * @param creature_ptr 判定対象のクリーチャー参照ポインタ
106 * @return 持っていたら所持前提ビットフラグを返す。
108 BIT_FLAGS has_xtra_might(player_type *creature_ptr)
110 BIT_FLAGS result = 0L;
111 result |= check_equipment_flags(creature_ptr, TR_XTRA_MIGHT);
116 * @brief クリーチャーが赤外線視力修正を持っているかを返す。
117 * @param creature_ptr 判定対象のクリーチャー参照ポインタ
118 * @return 持っていたら所持前提ビットフラグを返す。
119 * @details 種族修正は0より大きければTRUEとする。
121 BIT_FLAGS has_infra_vision(player_type *creature_ptr)
123 BIT_FLAGS result = 0L;
124 const player_race *tmp_rp_ptr;
126 if (creature_ptr->mimic_form)
127 tmp_rp_ptr = &mimic_info[creature_ptr->mimic_form];
129 tmp_rp_ptr = &race_info[creature_ptr->prace];
131 if (tmp_rp_ptr->infra > 0)
132 result |= FLAG_CAUSE_RACE;
134 if (creature_ptr->muta3 & MUT3_INFRAVIS)
135 result |= FLAG_CAUSE_MUTATION;
137 if (creature_ptr->tim_infra)
138 result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
140 result |= check_equipment_flags(creature_ptr, TR_INFRA);
145 * @brief クリーチャーが邪悪感知を持っているかを返す。
146 * @param creature_ptr 判定対象のクリーチャー参照ポインタ
147 * @return 持っていたら所持前提ビットフラグを返す。
149 BIT_FLAGS has_esp_evil(player_type *creature_ptr)
151 BIT_FLAGS result = 0L;
152 if (creature_ptr->realm1 == REALM_HEX) {
153 if (hex_spelling(creature_ptr, HEX_DETECT_EVIL))
154 result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
156 result |= check_equipment_flags(creature_ptr, TR_ESP_EVIL);
161 * @brief クリーチャーが自然界の動物感知を持っているかを返す。
162 * @param creature_ptr 判定対象のクリーチャー参照ポインタ
163 * @return 持っていたら所持前提ビットフラグを返す。
165 BIT_FLAGS has_esp_animal(player_type *creature_ptr) { return check_equipment_flags(creature_ptr, TR_ESP_ANIMAL); }
168 * @brief クリーチャーがアンデッド感知を持っているかを返す。
169 * @param creature_ptr 判定対象のクリーチャー参照ポインタ
170 * @return 持っていたら所持前提ビットフラグを返す。
172 BIT_FLAGS has_esp_undead(player_type *creature_ptr) { return check_equipment_flags(creature_ptr, TR_ESP_UNDEAD); }
175 * @brief クリーチャーが悪魔感知を持っているかを返す。
176 * @param creature_ptr 判定対象のクリーチャー参照ポインタ
177 * @return 持っていたら所持前提ビットフラグを返す。
179 BIT_FLAGS has_esp_demon(player_type *creature_ptr) { return check_equipment_flags(creature_ptr, TR_ESP_DEMON); }
182 * @brief クリーチャーがオーク感知を持っているかを返す。
183 * @param creature_ptr 判定対象のクリーチャー参照ポインタ
184 * @return 持っていたら所持前提ビットフラグを返す。
186 BIT_FLAGS has_esp_orc(player_type *creature_ptr) { return check_equipment_flags(creature_ptr, TR_ESP_ORC); }
189 * @brief クリーチャーがトロル感知を持っているかを返す。
190 * @param creature_ptr 判定対象のクリーチャー参照ポインタ
191 * @return 持っていたら所持前提ビットフラグを返す。
193 BIT_FLAGS has_esp_troll(player_type *creature_ptr) { return check_equipment_flags(creature_ptr, TR_ESP_TROLL); }
196 * @brief クリーチャーが巨人感知を持っているかを返す。
197 * @param creature_ptr 判定対象のクリーチャー参照ポインタ
198 * @return 持っていたら所持前提ビットフラグを返す。
200 BIT_FLAGS has_esp_giant(player_type *creature_ptr) { return check_equipment_flags(creature_ptr, TR_ESP_GIANT); }
203 * @brief クリーチャーがドラゴン感知を持っているかを返す。
204 * @param creature_ptr 判定対象のクリーチャー参照ポインタ
205 * @return 持っていたら所持前提ビットフラグを返す。
207 BIT_FLAGS has_esp_dragon(player_type *creature_ptr) { return check_equipment_flags(creature_ptr, TR_ESP_DRAGON); }
210 * @brief クリーチャーが人間感知を持っているかを返す。
211 * @param creature_ptr 判定対象のクリーチャー参照ポインタ
212 * @return 持っていたら所持前提ビットフラグを返す。
214 BIT_FLAGS has_esp_human(player_type *creature_ptr) { return check_equipment_flags(creature_ptr, TR_ESP_HUMAN); }
217 * @brief クリーチャーが善良感知を持っているかを返す。
218 * @param creature_ptr 判定対象のクリーチャー参照ポインタ
219 * @return 持っていたら所持前提ビットフラグを返す。
221 BIT_FLAGS has_esp_good(player_type *creature_ptr) { return check_equipment_flags(creature_ptr, TR_ESP_GOOD); }
224 * @brief クリーチャーが無生物感知を持っているかを返す。
225 * @param creature_ptr 判定対象のクリーチャー参照ポインタ
226 * @return 持っていたら所持前提ビットフラグを返す。
228 BIT_FLAGS has_esp_nonliving(player_type *creature_ptr) { return check_equipment_flags(creature_ptr, TR_ESP_NONLIVING); }
231 * @brief クリーチャーがユニーク感知を持っているかを返す。
232 * @param creature_ptr 判定対象のクリーチャー参照ポインタ
233 * @return 持っていたら所持前提ビットフラグを返す。
235 BIT_FLAGS has_esp_unique(player_type *creature_ptr) { return check_equipment_flags(creature_ptr, TR_ESP_UNIQUE); }
238 * @brief クリーチャーがテレパシーを持っているかを返す。
239 * @param creature_ptr 判定対象のクリーチャー参照ポインタ
240 * @return 持っていたら所持前提ビットフラグを返す。
242 BIT_FLAGS has_esp_telepathy(player_type *creature_ptr)
244 BIT_FLAGS result = 0L;
246 if (is_time_limit_esp(creature_ptr) || creature_ptr->ult_res || (creature_ptr->special_defense & KATA_MUSOU)) {
247 result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
250 if (creature_ptr->muta3 & MUT3_ESP) {
251 result |= 0x01U << FLAG_CAUSE_MUTATION;
254 if (is_specific_player_race(creature_ptr, RACE_MIND_FLAYER) && creature_ptr->lev > 29)
255 result |= 0x01U << FLAG_CAUSE_RACE;
257 if (is_specific_player_race(creature_ptr, RACE_SPECTRE) && creature_ptr->lev > 34)
258 result |= 0x01U << FLAG_CAUSE_RACE;
260 if (creature_ptr->pclass == CLASS_MINDCRAFTER && creature_ptr->lev > 39)
261 result |= 0x01U << FLAG_CAUSE_CLASS;
263 if (creature_ptr->mimic_form == MIMIC_DEMON_LORD) {
264 result |= 0x01U << FLAG_CAUSE_RACE;
267 result |= check_equipment_flags(creature_ptr, TR_TELEPATHY);
271 BIT_FLAGS has_bless_blade(player_type *creature_ptr) { return check_equipment_flags(creature_ptr, TR_BLESSED); }
273 BIT_FLAGS has_easy2_weapon(player_type *creature_ptr) { return check_equipment_flags(creature_ptr, TR_EASY2_WEAPON); }
275 BIT_FLAGS has_down_saving(player_type *creature_ptr) { return check_equipment_flags(creature_ptr, TR_DOWN_SAVING); }
277 BIT_FLAGS has_no_ac(player_type *creature_ptr) { return check_equipment_flags(creature_ptr, TR_NO_AC); }
279 BIT_FLAGS has_invuln_arrow(player_type *creature_ptr)
281 BIT_FLAGS result = 0L;
282 if (creature_ptr->blind)
284 result |= check_equipment_flags(creature_ptr, TR_INVULN_ARROW);
288 void check_no_flowed(player_type *creature_ptr)
291 bool has_sw = FALSE, has_kabe = FALSE;
292 OBJECT_IDX this_o_idx, next_o_idx = 0;
294 creature_ptr->no_flowed = FALSE;
296 if (has_pass_wall(creature_ptr) && !has_kill_wall(creature_ptr))
297 creature_ptr->no_flowed = TRUE;
299 for (int i = 0; i < INVEN_PACK; i++) {
300 if ((creature_ptr->inventory_list[i].tval == TV_NATURE_BOOK) && (creature_ptr->inventory_list[i].sval == 2))
302 if ((creature_ptr->inventory_list[i].tval == TV_CRAFT_BOOK) && (creature_ptr->inventory_list[i].sval == 2))
306 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) {
307 o_ptr = &creature_ptr->current_floor_ptr->o_list[this_o_idx];
308 next_o_idx = o_ptr->next_o_idx;
310 if ((o_ptr->tval == TV_NATURE_BOOK) && (o_ptr->sval == 2))
312 if ((o_ptr->tval == TV_CRAFT_BOOK) && (o_ptr->sval == 2))
316 if (has_sw && ((creature_ptr->realm1 == REALM_NATURE) || (creature_ptr->realm2 == REALM_NATURE) || (creature_ptr->pclass == CLASS_SORCERER))) {
317 const magic_type *s_ptr = &mp_ptr->info[REALM_NATURE - 1][SPELL_SW];
318 if (creature_ptr->lev >= s_ptr->slevel)
319 creature_ptr->no_flowed = TRUE;
322 if (has_kabe && ((creature_ptr->realm1 == REALM_CRAFT) || (creature_ptr->realm2 == REALM_CRAFT) || (creature_ptr->pclass == CLASS_SORCERER))) {
323 const magic_type *s_ptr = &mp_ptr->info[REALM_CRAFT - 1][SPELL_WALL];
324 if (creature_ptr->lev >= s_ptr->slevel)
325 creature_ptr->no_flowed = TRUE;
329 BIT_FLAGS has_mighty_throw(player_type *creature_ptr) { return check_equipment_flags(creature_ptr, TR_MIGHTY_THROW); }
331 BIT_FLAGS has_dec_mana(player_type *creature_ptr) { return check_equipment_flags(creature_ptr, TR_DEC_MANA); }
333 BIT_FLAGS has_reflect(player_type *creature_ptr)
335 BIT_FLAGS result = 0L;
337 if (creature_ptr->pclass == CLASS_BERSERKER && creature_ptr->lev > 39)
338 result |= 0x01U << FLAG_CAUSE_CLASS;
340 if (creature_ptr->pclass == CLASS_MIRROR_MASTER && creature_ptr->lev > 39)
341 result |= 0x01U << FLAG_CAUSE_CLASS;
343 if (creature_ptr->special_defense & KAMAE_GENBU || creature_ptr->special_defense & KATA_MUSOU) {
344 result |= 0x01U << FLAG_CAUSE_BATTLE_FORM;
347 if (creature_ptr->ult_res || creature_ptr->wraith_form || creature_ptr->magicdef || creature_ptr->tim_reflect) {
348 result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
351 result |= check_equipment_flags(creature_ptr, TR_REFLECT);
355 BIT_FLAGS has_see_nocto(player_type *creature_ptr) { return creature_ptr->pclass == CLASS_NINJA ? FLAG_CAUSE_CLASS : 0L; }
357 BIT_FLAGS has_warning(player_type *creature_ptr)
359 BIT_FLAGS result = 0L;
361 BIT_FLAGS flgs[TR_FLAG_SIZE];
363 for (inventory_slot_type i = INVEN_MAIN_HAND; i < INVEN_TOTAL; i++) {
364 o_ptr = &creature_ptr->inventory_list[i];
368 object_flags(creature_ptr, o_ptr, flgs);
370 if (has_flag(flgs, TR_WARNING)) {
371 if (!o_ptr->inscription || !(angband_strchr(quark_str(o_ptr->inscription), '$')))
372 result |= 0x01U << (i - INVEN_MAIN_HAND);
378 BIT_FLAGS has_anti_magic(player_type *creature_ptr) { return check_equipment_flags(creature_ptr, TR_NO_MAGIC); }
380 BIT_FLAGS has_anti_tele(player_type *creature_ptr) { return check_equipment_flags(creature_ptr, TR_NO_TELE); }
382 BIT_FLAGS has_sh_fire(player_type *creature_ptr)
384 BIT_FLAGS result = 0L;
386 if (creature_ptr->muta3 & MUT3_FIRE_BODY) {
387 result |= 0x01U << FLAG_CAUSE_MUTATION;
390 if (creature_ptr->mimic_form == MIMIC_DEMON_LORD) {
391 result |= 0x01U << FLAG_CAUSE_RACE;
394 if (creature_ptr->special_defense & KAMAE_SEIRYU || creature_ptr->special_defense & KATA_MUSOU) {
395 result |= 0x01U << FLAG_CAUSE_BATTLE_FORM;
398 if (hex_spelling(creature_ptr, HEX_DEMON_AURA) || creature_ptr->ult_res || creature_ptr->tim_sh_fire) {
399 result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
402 result |= check_equipment_flags(creature_ptr, TR_SH_FIRE);
406 BIT_FLAGS has_sh_elec(player_type *creature_ptr)
408 BIT_FLAGS result = 0L;
410 if (creature_ptr->muta3 & MUT3_ELEC_TOUC)
411 result |= 0x01U << FLAG_CAUSE_MUTATION;
413 if (hex_spelling(creature_ptr, HEX_SHOCK_CLOAK) || creature_ptr->ult_res) {
414 result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
417 if (creature_ptr->special_defense & KAMAE_SEIRYU || (creature_ptr->special_defense & KATA_MUSOU)) {
418 result |= 0x01U << FLAG_CAUSE_BATTLE_FORM;
421 result |= check_equipment_flags(creature_ptr, TR_SH_ELEC);
425 BIT_FLAGS has_sh_cold(player_type *creature_ptr)
427 BIT_FLAGS result = 0L;
429 if (creature_ptr->special_defense & KAMAE_SEIRYU || creature_ptr->special_defense & KATA_MUSOU) {
430 result |= 0x01U << FLAG_CAUSE_BATTLE_FORM;
433 if (creature_ptr->ult_res || hex_spelling(creature_ptr, HEX_ICE_ARMOR)) {
434 result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
437 result |= check_equipment_flags(creature_ptr, TR_SH_COLD);
441 BIT_FLAGS has_easy_spell(player_type *creature_ptr) { return check_equipment_flags(creature_ptr, TR_EASY_SPELL); }
443 BIT_FLAGS has_heavy_spell(player_type *creature_ptr) { return check_equipment_flags(creature_ptr, TR_HEAVY_SPELL); }
445 BIT_FLAGS has_hold_exp(player_type *creature_ptr)
447 BIT_FLAGS result = 0L;
449 if (creature_ptr->pseikaku == PERSONALITY_MUNCHKIN) {
450 result |= 0x01U << FLAG_CAUSE_PERSONALITY;
453 if (creature_ptr->mimic_form == MIMIC_DEMON || creature_ptr->mimic_form == MIMIC_DEMON_LORD || creature_ptr->mimic_form == MIMIC_VAMPIRE) {
454 result |= 0x01U << FLAG_CAUSE_RACE;
457 if (is_specific_player_race(creature_ptr, RACE_HOBBIT) || is_specific_player_race(creature_ptr, RACE_SKELETON)
458 || is_specific_player_race(creature_ptr, RACE_ZOMBIE) || is_specific_player_race(creature_ptr, RACE_VAMPIRE)
459 || is_specific_player_race(creature_ptr, RACE_SPECTRE) || is_specific_player_race(creature_ptr, RACE_BALROG)
460 || is_specific_player_race(creature_ptr, RACE_ANDROID)) {
461 result |= 0x01U << FLAG_CAUSE_RACE;
464 if (is_specific_player_race(creature_ptr, RACE_GOLEM)) {
465 if (creature_ptr->lev > 34)
466 result |= 0x01U << FLAG_CAUSE_RACE;
469 if (creature_ptr->special_defense & KATA_MUSOU) {
470 result |= 0x01U << FLAG_CAUSE_BATTLE_FORM;
473 if (creature_ptr->ult_res) {
474 result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
477 result |= check_equipment_flags(creature_ptr, TR_HOLD_EXP);
481 BIT_FLAGS has_see_inv(player_type *creature_ptr)
483 BIT_FLAGS result = 0L;
485 if (creature_ptr->pclass == CLASS_NINJA && creature_ptr->lev > 29)
486 result |= 0x01U << FLAG_CAUSE_CLASS;
488 if (creature_ptr->mimic_form == MIMIC_DEMON || creature_ptr->mimic_form == MIMIC_DEMON_LORD || creature_ptr->mimic_form == MIMIC_VAMPIRE) {
489 result |= 0x01U << FLAG_CAUSE_RACE;
490 } else if (is_specific_player_race(creature_ptr, RACE_HIGH_ELF) || is_specific_player_race(creature_ptr, RACE_GOLEM)
491 || is_specific_player_race(creature_ptr, RACE_SKELETON) || is_specific_player_race(creature_ptr, RACE_ZOMBIE)
492 || is_specific_player_race(creature_ptr, RACE_SPECTRE) || is_specific_player_race(creature_ptr, RACE_ARCHON)) {
493 result |= 0x01U << FLAG_CAUSE_RACE;
494 } else if (is_specific_player_race(creature_ptr, RACE_DARK_ELF) && creature_ptr->lev > 19) {
495 result |= 0x01U << FLAG_CAUSE_RACE;
496 } else if (is_specific_player_race(creature_ptr, RACE_MIND_FLAYER) && creature_ptr->lev > 14) {
497 result |= 0x01U << FLAG_CAUSE_RACE;
498 } else if ((is_specific_player_race(creature_ptr, RACE_IMP) || is_specific_player_race(creature_ptr, RACE_BALROG)) && creature_ptr->lev > 9) {
499 result |= 0x01U << FLAG_CAUSE_RACE;
502 if (creature_ptr->special_defense & KATA_MUSOU) {
503 result |= 0x01U << FLAG_CAUSE_BATTLE_FORM;
506 if (creature_ptr->ult_res || creature_ptr->tim_invis) {
507 result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
510 result |= check_equipment_flags(creature_ptr, TR_SEE_INVIS);
514 BIT_FLAGS has_magic_mastery(player_type *creature_ptr) { return check_equipment_flags(creature_ptr, TR_MAGIC_MASTERY); }
516 BIT_FLAGS has_free_act(player_type *creature_ptr)
518 BIT_FLAGS result = 0L;
520 if (creature_ptr->muta3 & MUT3_MOTION)
521 result |= 0x01U << FLAG_CAUSE_MUTATION;
523 if (is_specific_player_race(creature_ptr, RACE_GNOME) || is_specific_player_race(creature_ptr, RACE_GOLEM)
524 || is_specific_player_race(creature_ptr, RACE_SPECTRE) || is_specific_player_race(creature_ptr, RACE_ANDROID)) {
525 result |= 0x01U << FLAG_CAUSE_RACE;
528 if (creature_ptr->pclass == CLASS_NINJA && !heavy_armor(creature_ptr)
529 && (!creature_ptr->inventory_list[INVEN_MAIN_HAND].k_idx || can_attack_with_main_hand(creature_ptr))
530 && (!creature_ptr->inventory_list[INVEN_SUB_HAND].k_idx || can_attack_with_sub_hand(creature_ptr))) {
531 if (creature_ptr->lev > 24)
532 result |= 0x01U << FLAG_CAUSE_CLASS;
535 if (creature_ptr->pclass == CLASS_MONK || creature_ptr->pclass == CLASS_FORCETRAINER) {
536 if (!(heavy_armor(creature_ptr))) {
537 if (creature_ptr->lev > 24)
538 result |= 0x01U << FLAG_CAUSE_CLASS;
542 if (creature_ptr->pclass == CLASS_BERSERKER) {
543 result |= 0x01U << FLAG_CAUSE_CLASS;
546 if (creature_ptr->ult_res || creature_ptr->magicdef) {
547 result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
550 if (creature_ptr->special_defense & KATA_MUSOU) {
551 result |= 0x01U << FLAG_CAUSE_BATTLE_FORM;
554 result |= check_equipment_flags(creature_ptr, TR_FREE_ACT);
558 BIT_FLAGS has_sustain_str(player_type *creature_ptr)
560 BIT_FLAGS result = 0L;
562 if (creature_ptr->pclass == CLASS_BERSERKER) {
563 result |= 0x01U << FLAG_CAUSE_CLASS;
565 if (is_specific_player_race(creature_ptr, RACE_HALF_TROLL) || is_specific_player_race(creature_ptr, RACE_HALF_OGRE)
566 || is_specific_player_race(creature_ptr, RACE_HALF_GIANT)) {
567 result |= 0x01U << FLAG_CAUSE_RACE;
570 if (creature_ptr->ult_res) {
571 result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
574 if (creature_ptr->special_defense & KATA_MUSOU) {
575 result |= 0x01U << FLAG_CAUSE_BATTLE_FORM;
578 result |= check_equipment_flags(creature_ptr, TR_SUST_STR);
582 BIT_FLAGS has_sustain_int(player_type *creature_ptr)
584 BIT_FLAGS result = 0L;
586 if (is_specific_player_race(creature_ptr, RACE_MIND_FLAYER)) {
587 result |= 0x01U << FLAG_CAUSE_RACE;
590 if (creature_ptr->ult_res) {
591 result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
594 if (creature_ptr->special_defense & KATA_MUSOU) {
595 result |= 0x01U << FLAG_CAUSE_BATTLE_FORM;
598 result |= check_equipment_flags(creature_ptr, TR_SUST_INT);
602 BIT_FLAGS has_sustain_wis(player_type *creature_ptr)
604 BIT_FLAGS result = 0L;
607 if (creature_ptr->pclass == CLASS_MINDCRAFTER && creature_ptr->lev > 19)
608 result |= 0x01U << FLAG_CAUSE_CLASS;
610 if (!creature_ptr->mimic_form && (creature_ptr->prace == RACE_MIND_FLAYER)) {
611 result |= 0x01U << FLAG_CAUSE_RACE;
614 if (creature_ptr->ult_res) {
615 result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
618 if (creature_ptr->special_defense & KATA_MUSOU) {
619 result |= 0x01U << FLAG_CAUSE_BATTLE_FORM;
622 result |= check_equipment_flags(creature_ptr, TR_SUST_WIS);
626 BIT_FLAGS has_sustain_dex(player_type *creature_ptr)
628 BIT_FLAGS result = 0L;
629 if (creature_ptr->pclass == CLASS_BERSERKER) {
630 result |= 0x01U << FLAG_CAUSE_CLASS;
633 if (creature_ptr->pclass == CLASS_NINJA && creature_ptr->lev > 24)
634 result |= 0x01U << FLAG_CAUSE_CLASS;
636 if (creature_ptr->ult_res) {
637 result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
640 if (creature_ptr->special_defense & KATA_MUSOU) {
641 result |= 0x01U << FLAG_CAUSE_BATTLE_FORM;
644 result |= check_equipment_flags(creature_ptr, TR_SUST_DEX);
648 BIT_FLAGS has_sustain_con(player_type *creature_ptr)
650 BIT_FLAGS result = 0L;
651 if (creature_ptr->pclass == CLASS_BERSERKER) {
652 result |= 0x01U << FLAG_CAUSE_CLASS;
655 if (!creature_ptr->mimic_form && (creature_ptr->prace == RACE_AMBERITE || creature_ptr->prace == RACE_DUNADAN)) {
656 result |= 0x01U << FLAG_CAUSE_RACE;
659 if (creature_ptr->ult_res) {
660 result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
663 if (creature_ptr->special_defense & KATA_MUSOU) {
664 result |= 0x01U << FLAG_CAUSE_BATTLE_FORM;
667 result |= check_equipment_flags(creature_ptr, TR_SUST_CON);
671 BIT_FLAGS has_sustain_chr(player_type *creature_ptr)
673 BIT_FLAGS result = 0L;
675 if (creature_ptr->ult_res) {
676 result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
679 if (creature_ptr->special_defense & KATA_MUSOU) {
680 result |= 0x01U << FLAG_CAUSE_BATTLE_FORM;
683 result |= check_equipment_flags(creature_ptr, TR_SUST_CHR);
687 BIT_FLAGS has_levitation(player_type *creature_ptr)
689 BIT_FLAGS result = 0L;
691 if (creature_ptr->muta3 & MUT3_WINGS)
692 result = FLAG_CAUSE_MUTATION;
694 if (creature_ptr->mimic_form == MIMIC_DEMON_LORD) {
695 result = FLAG_CAUSE_RACE;
698 if (is_specific_player_race(creature_ptr, RACE_DRACONIAN) || is_specific_player_race(creature_ptr, RACE_SPECTRE)
699 || is_specific_player_race(creature_ptr, RACE_SPRITE) || is_specific_player_race(creature_ptr, RACE_ARCHON)
700 || is_specific_player_race(creature_ptr, RACE_S_FAIRY)) {
701 result = FLAG_CAUSE_RACE;
704 if (creature_ptr->special_defense & KAMAE_SEIRYU || creature_ptr->special_defense & KAMAE_SUZAKU || (creature_ptr->special_defense & KATA_MUSOU)) {
705 result = FLAG_CAUSE_BATTLE_FORM;
708 if (creature_ptr->ult_res || creature_ptr->magicdef) {
709 result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
712 if (creature_ptr->riding) {
713 monster_type *riding_m_ptr = &creature_ptr->current_floor_ptr->m_list[creature_ptr->riding];
714 monster_race *riding_r_ptr = &r_info[riding_m_ptr->r_idx];
715 result = (riding_r_ptr->flags7 & RF7_CAN_FLY) ? result : 0;
718 if (creature_ptr->tim_levitation) {
719 result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
722 result |= check_equipment_flags(creature_ptr, TR_LEVITATION);
726 void has_can_swim(player_type *creature_ptr)
728 creature_ptr->can_swim = FALSE;
729 if (creature_ptr->riding) {
730 monster_type *riding_m_ptr = &creature_ptr->current_floor_ptr->m_list[creature_ptr->riding];
731 monster_race *riding_r_ptr = &r_info[riding_m_ptr->r_idx];
732 if (riding_r_ptr->flags7 & (RF7_CAN_SWIM | RF7_AQUATIC))
733 creature_ptr->can_swim = TRUE;
737 BIT_FLAGS has_slow_digest(player_type *creature_ptr)
739 BIT_FLAGS result = 0L;
741 if (creature_ptr->pclass == CLASS_NINJA) {
742 result = FLAG_CAUSE_CLASS;
745 if (creature_ptr->lev > 14 && !creature_ptr->mimic_form && creature_ptr->prace == RACE_HALF_TROLL) {
746 if (creature_ptr->pclass == CLASS_WARRIOR || creature_ptr->pclass == CLASS_BERSERKER) {
747 result = FLAG_CAUSE_CLASS;
748 /* Let's not make Regeneration
749 * a disadvantage for the poor warriors who can
750 * never learn a spell that satisfies hunger (actually
751 * neither can rogues, but half-trolls are not
752 * supposed to play rogues) */
756 if (creature_ptr->special_defense & KATA_MUSOU) {
757 result = FLAG_CAUSE_BATTLE_FORM;
760 if (creature_ptr->ult_res) {
761 result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
764 if (!creature_ptr->mimic_form
765 && (creature_ptr->prace == RACE_GOLEM || creature_ptr->prace == RACE_ZOMBIE || creature_ptr->prace == RACE_SPECTRE
766 || creature_ptr->prace == RACE_ANDROID)) {
767 result = FLAG_CAUSE_RACE;
770 result |= check_equipment_flags(creature_ptr, TR_SLOW_DIGEST);
774 BIT_FLAGS has_regenerate(player_type *creature_ptr)
776 BIT_FLAGS result = 0L;
778 if (is_specific_player_race(creature_ptr, RACE_HALF_TROLL) && creature_ptr->lev > 14) {
779 result |= 0x01U << FLAG_CAUSE_RACE;
782 if (is_specific_player_race(creature_ptr, RACE_AMBERITE)) {
783 result |= 0x01U << FLAG_CAUSE_RACE;
786 if (creature_ptr->pclass == CLASS_WARRIOR && creature_ptr->lev > 44) {
787 result |= 0x01U << FLAG_CAUSE_RACE;
790 if (creature_ptr->pclass == CLASS_BERSERKER) {
791 result |= 0x01U << FLAG_CAUSE_RACE;
794 if (creature_ptr->muta3 & MUT3_REGEN)
795 result |= 0x01U << FLAG_CAUSE_MUTATION;
797 if (creature_ptr->special_defense & KATA_MUSOU) {
798 result |= 0x01U << FLAG_CAUSE_MUTATION;
801 if (hex_spelling(creature_ptr, HEX_DEMON_AURA) || creature_ptr->ult_res || creature_ptr->tim_regen) {
802 result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
805 result |= check_equipment_flags(creature_ptr, TR_REGEN);
807 if (creature_ptr->muta3 & MUT3_FLESH_ROT)
813 void has_curses(player_type *creature_ptr)
816 BIT_FLAGS flgs[TR_FLAG_SIZE];
817 creature_ptr->cursed = 0L;
819 if (creature_ptr->pseikaku == PERSONALITY_SEXY)
820 creature_ptr->cursed |= (TRC_AGGRAVATE);
822 for (inventory_slot_type i = INVEN_MAIN_HAND; i < INVEN_TOTAL; i++) {
823 o_ptr = &creature_ptr->inventory_list[i];
826 object_flags(creature_ptr, o_ptr, flgs);
827 if (has_flag(flgs, TR_AGGRAVATE))
828 creature_ptr->cursed |= TRC_AGGRAVATE;
829 if (has_flag(flgs, TR_DRAIN_EXP))
830 creature_ptr->cursed |= TRC_DRAIN_EXP;
831 if (has_flag(flgs, TR_TY_CURSE))
832 creature_ptr->cursed |= TRC_TY_CURSE;
833 if (has_flag(flgs, TR_ADD_L_CURSE))
834 creature_ptr->cursed |= TRC_ADD_L_CURSE;
835 if (has_flag(flgs, TR_ADD_H_CURSE))
836 creature_ptr->cursed |= TRC_ADD_H_CURSE;
837 if (has_flag(flgs, TR_DRAIN_HP))
838 creature_ptr->cursed |= TRC_DRAIN_HP;
839 if (has_flag(flgs, TR_DRAIN_MANA))
840 creature_ptr->cursed |= TRC_DRAIN_MANA;
841 if (has_flag(flgs, TR_CALL_ANIMAL))
842 creature_ptr->cursed |= TRC_CALL_ANIMAL;
843 if (has_flag(flgs, TR_CALL_DEMON))
844 creature_ptr->cursed |= TRC_CALL_DEMON;
845 if (has_flag(flgs, TR_CALL_DRAGON))
846 creature_ptr->cursed |= TRC_CALL_DRAGON;
847 if (has_flag(flgs, TR_CALL_UNDEAD))
848 creature_ptr->cursed |= TRC_CALL_UNDEAD;
849 if (has_flag(flgs, TR_COWARDICE))
850 creature_ptr->cursed |= TRC_COWARDICE;
851 if (has_flag(flgs, TR_LOW_MELEE))
852 creature_ptr->cursed |= TRC_LOW_MELEE;
853 if (has_flag(flgs, TR_LOW_AC))
854 creature_ptr->cursed |= TRC_LOW_AC;
855 if (has_flag(flgs, TR_LOW_MAGIC))
856 creature_ptr->cursed |= TRC_LOW_MAGIC;
857 if (has_flag(flgs, TR_FAST_DIGEST))
858 creature_ptr->cursed |= TRC_FAST_DIGEST;
859 if (has_flag(flgs, TR_SLOW_REGEN))
860 creature_ptr->cursed |= TRC_SLOW_REGEN;
862 creature_ptr->cursed |= (o_ptr->curse_flags & (0xFFFFFFF0L));
863 if (o_ptr->name1 == ART_CHAINSWORD)
864 creature_ptr->cursed |= TRC_CHAINSWORD;
866 if (has_flag(flgs, TR_TELEPORT)) {
867 if (object_is_cursed(o_ptr))
868 creature_ptr->cursed |= TRC_TELEPORT;
870 concptr insc = quark_str(o_ptr->inscription);
872 /* {.} will stop random teleportation. */
873 if (o_ptr->inscription && angband_strchr(insc, '.')) {
875 creature_ptr->cursed |= TRC_TELEPORT_SELF;
881 if (creature_ptr->cursed & TRC_TELEPORT)
882 creature_ptr->cursed &= ~(TRC_TELEPORT_SELF);
885 BIT_FLAGS has_impact(player_type *creature_ptr) { return check_equipment_flags(creature_ptr, TR_IMPACT); }
887 void has_extra_blow(player_type *creature_ptr)
890 BIT_FLAGS flgs[TR_FLAG_SIZE];
891 creature_ptr->extra_blows[0] = creature_ptr->extra_blows[1] = 0;
893 for (inventory_slot_type i = INVEN_MAIN_HAND; i < INVEN_TOTAL; i++) {
894 o_ptr = &creature_ptr->inventory_list[i];
898 object_flags(creature_ptr, o_ptr, flgs);
899 if (has_flag(flgs, TR_BLOWS)) {
900 if ((i == INVEN_MAIN_HAND || i == INVEN_MAIN_RING) && !has_two_handed_weapons(creature_ptr))
901 creature_ptr->extra_blows[0] += o_ptr->pval;
902 else if ((i == INVEN_SUB_HAND || i == INVEN_SUB_RING) && !has_two_handed_weapons(creature_ptr))
903 creature_ptr->extra_blows[1] += o_ptr->pval;
905 creature_ptr->extra_blows[0] += o_ptr->pval;
906 creature_ptr->extra_blows[1] += o_ptr->pval;
912 BIT_FLAGS has_resist_acid(player_type *creature_ptr)
914 BIT_FLAGS result = 0L;
916 if (creature_ptr->mimic_form == MIMIC_DEMON_LORD) {
917 result |= 0x01U << FLAG_CAUSE_RACE;
918 } else if (is_specific_player_race(creature_ptr, RACE_YEEK) || is_specific_player_race(creature_ptr, RACE_KLACKON)) {
919 result |= 0x01U << FLAG_CAUSE_RACE;
920 } else if (is_specific_player_race(creature_ptr, RACE_DRACONIAN) && creature_ptr->lev > 14) {
921 result |= 0x01U << FLAG_CAUSE_RACE;
924 if (creature_ptr->special_defense & KAMAE_SEIRYU || creature_ptr->special_defense & KATA_MUSOU) {
925 result |= 0x01U << FLAG_CAUSE_BATTLE_FORM;
928 if (creature_ptr->ult_res) {
929 result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
932 result |= has_immune_acid(creature_ptr);
934 result |= check_equipment_flags(creature_ptr, TR_RES_ACID);
938 BIT_FLAGS has_vuln_acid(player_type *creature_ptr)
940 BIT_FLAGS result = 0L;
941 if (creature_ptr->muta3 & MUT3_VULN_ELEM) {
942 result |= 0x01U << FLAG_CAUSE_MUTATION;
945 if (creature_ptr->special_defense & KATA_KOUKIJIN) {
946 result |= 0x01U << FLAG_CAUSE_BATTLE_FORM;
951 BIT_FLAGS has_resist_elec(player_type *creature_ptr)
953 BIT_FLAGS result = 0L;
955 if (creature_ptr->mimic_form == MIMIC_DEMON_LORD) {
956 result |= 0x01U << FLAG_CAUSE_RACE;
957 } else if (is_specific_player_race(creature_ptr, RACE_DRACONIAN) && creature_ptr->lev > 19) {
958 result |= 0x01U << FLAG_CAUSE_RACE;
961 if (creature_ptr->special_defense & KAMAE_SEIRYU || creature_ptr->special_defense & KATA_MUSOU) {
962 result |= 0x01U << FLAG_CAUSE_BATTLE_FORM;
965 if (creature_ptr->ult_res) {
966 result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
969 result |= check_equipment_flags(creature_ptr, TR_RES_ELEC);
970 result |= has_immune_elec(creature_ptr);
974 BIT_FLAGS has_vuln_elec(player_type *creature_ptr)
976 BIT_FLAGS result = 0L;
977 if (creature_ptr->muta3 & MUT3_VULN_ELEM) {
978 result |= 0x01U << FLAG_CAUSE_MUTATION;
981 if (is_specific_player_race(creature_ptr, RACE_ANDROID)) {
982 result |= 0x01U << FLAG_CAUSE_RACE;
985 if (creature_ptr->special_defense & KATA_KOUKIJIN) {
986 result |= 0x01U << FLAG_CAUSE_BATTLE_FORM;
991 BIT_FLAGS has_resist_fire(player_type *creature_ptr)
993 BIT_FLAGS result = 0L;
995 if (creature_ptr->mimic_form == MIMIC_DEMON || creature_ptr->mimic_form == MIMIC_DEMON_LORD) {
996 result |= 0x01U << FLAG_CAUSE_RACE;
999 if (is_specific_player_race(creature_ptr, RACE_DRACONIAN) && creature_ptr->lev > 4) {
1000 result |= 0x01U << FLAG_CAUSE_RACE;
1003 if (!creature_ptr->mimic_form && (creature_ptr->prace == RACE_IMP || creature_ptr->prace == RACE_BALROG)) {
1004 result |= 0x01U << FLAG_CAUSE_RACE;
1007 if (creature_ptr->special_defense & KAMAE_SEIRYU || creature_ptr->special_defense & KATA_MUSOU) {
1008 result |= 0x01U << FLAG_CAUSE_BATTLE_FORM;
1011 if (creature_ptr->ult_res) {
1012 result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1015 result |= check_equipment_flags(creature_ptr, TR_RES_FIRE);
1016 result |= has_immune_fire(creature_ptr);
1020 BIT_FLAGS has_vuln_fire(player_type *creature_ptr)
1022 BIT_FLAGS result = 0L;
1023 if (creature_ptr->muta3 & MUT3_VULN_ELEM) {
1024 result |= 0x01U << FLAG_CAUSE_MUTATION;
1027 if (is_specific_player_race(creature_ptr, RACE_ENT)) {
1028 result |= 0x01U << FLAG_CAUSE_RACE;
1031 if (creature_ptr->special_defense & KATA_KOUKIJIN) {
1032 result |= 0x01U << FLAG_CAUSE_BATTLE_FORM;
1037 BIT_FLAGS has_resist_cold(player_type *creature_ptr)
1039 BIT_FLAGS result = 0L;
1041 if (creature_ptr->mimic_form == MIMIC_DEMON_LORD || creature_ptr->mimic_form == MIMIC_VAMPIRE) {
1042 result |= 0x01U << FLAG_CAUSE_RACE;
1045 if (!creature_ptr->mimic_form && (creature_ptr->prace == RACE_ZOMBIE) && creature_ptr->lev > 4) {
1046 result |= 0x01U << FLAG_CAUSE_RACE;
1049 if ((is_specific_player_race(creature_ptr, RACE_DRACONIAN) || is_specific_player_race(creature_ptr, RACE_SKELETON)) && creature_ptr->lev > 9) {
1050 result |= 0x01U << FLAG_CAUSE_RACE;
1053 if (!creature_ptr->mimic_form && (creature_ptr->prace == RACE_VAMPIRE || creature_ptr->prace == RACE_SPECTRE)) {
1054 result |= 0x01U << FLAG_CAUSE_RACE;
1057 if (creature_ptr->special_defense & KAMAE_SEIRYU || creature_ptr->special_defense & KATA_MUSOU) {
1058 result |= 0x01U << FLAG_CAUSE_BATTLE_FORM;
1061 if (creature_ptr->ult_res) {
1062 result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1065 result |= check_equipment_flags(creature_ptr, TR_RES_COLD);
1066 result |= has_immune_cold(creature_ptr);
1070 BIT_FLAGS has_vuln_cold(player_type *creature_ptr)
1072 BIT_FLAGS result = 0L;
1073 if (creature_ptr->muta3 & MUT3_VULN_ELEM) {
1074 result |= 0x01U << FLAG_CAUSE_MUTATION;
1077 if (creature_ptr->special_defense & KATA_KOUKIJIN) {
1078 result |= 0x01U << FLAG_CAUSE_BATTLE_FORM;
1083 BIT_FLAGS has_resist_pois(player_type *creature_ptr)
1085 BIT_FLAGS result = 0L;
1087 if (creature_ptr->pclass == CLASS_NINJA && creature_ptr->lev > 19)
1088 result |= 0x01U << FLAG_CAUSE_CLASS;
1090 if (creature_ptr->mimic_form == MIMIC_VAMPIRE || creature_ptr->mimic_form == MIMIC_DEMON_LORD) {
1091 result |= 0x01U << FLAG_CAUSE_RACE;
1094 if (is_specific_player_race(creature_ptr, RACE_DRACONIAN) && creature_ptr->lev > 34) {
1095 result |= 0x01U << FLAG_CAUSE_RACE;
1098 if (!creature_ptr->mimic_form
1099 && (creature_ptr->prace == RACE_KOBOLD || creature_ptr->prace == RACE_GOLEM || creature_ptr->prace == RACE_SKELETON
1100 || creature_ptr->prace == RACE_VAMPIRE || creature_ptr->prace == RACE_SPECTRE || creature_ptr->prace == RACE_ANDROID)) {
1101 result |= 0x01U << FLAG_CAUSE_RACE;
1104 if (creature_ptr->special_defense & KAMAE_SEIRYU || creature_ptr->special_defense & KATA_MUSOU) {
1105 result |= 0x01U << FLAG_CAUSE_BATTLE_FORM;
1108 if (creature_ptr->ult_res) {
1109 result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1112 result |= check_equipment_flags(creature_ptr, TR_RES_POIS);
1116 BIT_FLAGS has_resist_conf(player_type *creature_ptr)
1118 BIT_FLAGS result = 0L;
1120 if (creature_ptr->pclass == CLASS_MINDCRAFTER && creature_ptr->lev > 29)
1121 result |= 0x01U << FLAG_CAUSE_CLASS;
1123 if (creature_ptr->pseikaku == PERSONALITY_CHARGEMAN || creature_ptr->pseikaku == PERSONALITY_MUNCHKIN) {
1124 result |= 0x01U << FLAG_CAUSE_PERSONALITY;
1127 if (!creature_ptr->mimic_form && (creature_ptr->prace == RACE_KLACKON || creature_ptr->prace == RACE_BEASTMAN || creature_ptr->prace == RACE_KUTAR)) {
1128 result |= 0x01U << FLAG_CAUSE_RACE;
1131 if (creature_ptr->mimic_form == MIMIC_DEMON_LORD) {
1132 result |= 0x01U << FLAG_CAUSE_RACE;
1135 if (creature_ptr->ult_res || creature_ptr->magicdef) {
1136 result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1139 if (creature_ptr->special_defense & KATA_MUSOU) {
1140 result |= 0x01U << FLAG_CAUSE_BATTLE_FORM;
1143 result |= check_equipment_flags(creature_ptr, TR_RES_CONF);
1147 BIT_FLAGS has_resist_sound(player_type *creature_ptr)
1149 BIT_FLAGS result = 0L;
1151 if (creature_ptr->pclass == CLASS_BARD) {
1152 result |= 0x01U << FLAG_CAUSE_CLASS;
1155 if (!creature_ptr->mimic_form && (creature_ptr->prace == RACE_CYCLOPS || creature_ptr->prace == RACE_BEASTMAN)) {
1156 result |= 0x01U << FLAG_CAUSE_RACE;
1159 if (creature_ptr->special_defense & KATA_MUSOU) {
1160 result |= 0x01U << FLAG_CAUSE_BATTLE_FORM;
1163 if (creature_ptr->ult_res) {
1164 result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1167 result |= check_equipment_flags(creature_ptr, TR_RES_SOUND);
1171 BIT_FLAGS has_resist_lite(player_type *creature_ptr)
1173 BIT_FLAGS result = 0L;
1175 if (!creature_ptr->mimic_form && (creature_ptr->prace == RACE_ELF || creature_ptr->prace == RACE_HIGH_ELF || creature_ptr->prace == RACE_SPRITE)) {
1176 result |= 0x01U << FLAG_CAUSE_RACE;
1179 if (creature_ptr->special_defense & KATA_MUSOU) {
1180 result |= 0x01U << FLAG_CAUSE_BATTLE_FORM;
1183 if (creature_ptr->ult_res) {
1184 result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1187 result |= check_equipment_flags(creature_ptr, TR_RES_LITE);
1191 BIT_FLAGS has_vuln_lite(player_type *creature_ptr)
1193 BIT_FLAGS result = 0L;
1194 if (is_specific_player_race(creature_ptr, RACE_S_FAIRY) || is_specific_player_race(creature_ptr, RACE_VAMPIRE)
1195 || (creature_ptr->mimic_form == MIMIC_VAMPIRE)) {
1196 result |= 0x01U << FLAG_CAUSE_RACE;
1199 if (creature_ptr->wraith_form) {
1200 result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1206 BIT_FLAGS has_resist_dark(player_type *creature_ptr)
1208 BIT_FLAGS result = 0L;
1210 if (creature_ptr->mimic_form == MIMIC_VAMPIRE) {
1211 result |= 0x01U << FLAG_CAUSE_RACE;
1214 if (!creature_ptr->mimic_form
1215 && (creature_ptr->prace == RACE_HALF_ORC || creature_ptr->prace == RACE_HALF_OGRE || creature_ptr->prace == RACE_NIBELUNG
1216 || creature_ptr->prace == RACE_DARK_ELF || creature_ptr->prace == RACE_VAMPIRE)) {
1217 result |= 0x01U << FLAG_CAUSE_RACE;
1220 if (creature_ptr->special_defense & KATA_MUSOU) {
1221 result |= 0x01U << FLAG_CAUSE_BATTLE_FORM;
1224 if (creature_ptr->ult_res) {
1225 result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1228 result |= check_equipment_flags(creature_ptr, TR_RES_DARK);
1232 BIT_FLAGS has_resist_chaos(player_type *creature_ptr)
1234 BIT_FLAGS result = 0L;
1236 if (creature_ptr->pclass == CLASS_CHAOS_WARRIOR && creature_ptr->lev > 29)
1237 result |= 0x01U << FLAG_CAUSE_CLASS;
1239 if (creature_ptr->mimic_form == MIMIC_DEMON || creature_ptr->mimic_form == MIMIC_DEMON_LORD) {
1240 result |= 0x01U << FLAG_CAUSE_RACE;
1243 if (!creature_ptr->mimic_form && creature_ptr->prace == RACE_HALF_TITAN)
1244 result |= 0x01U << FLAG_CAUSE_RACE;
1246 if (creature_ptr->special_defense & KATA_MUSOU) {
1247 result |= 0x01U << FLAG_CAUSE_BATTLE_FORM;
1250 if (creature_ptr->ult_res) {
1251 result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1254 result |= check_equipment_flags(creature_ptr, TR_RES_CHAOS);
1258 BIT_FLAGS has_resist_disen(player_type *creature_ptr)
1260 BIT_FLAGS result = 0L;
1262 if (creature_ptr->mimic_form == MIMIC_DEMON_LORD) {
1263 result |= 0x01U << FLAG_CAUSE_RACE;
1266 if (!creature_ptr->mimic_form && creature_ptr->prace == RACE_NIBELUNG)
1267 result |= 0x01U << FLAG_CAUSE_RACE;
1269 if (creature_ptr->special_defense & KATA_MUSOU) {
1270 result |= 0x01U << FLAG_CAUSE_BATTLE_FORM;
1273 if (creature_ptr->ult_res) {
1274 result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1277 result |= check_equipment_flags(creature_ptr, TR_RES_DISEN);
1281 BIT_FLAGS has_resist_shard(player_type *creature_ptr)
1283 BIT_FLAGS result = 0L;
1285 if (!creature_ptr->mimic_form && (creature_ptr->prace == RACE_HALF_GIANT || creature_ptr->prace == RACE_SKELETON))
1286 result |= 0x01U << FLAG_CAUSE_RACE;
1288 if (creature_ptr->special_defense & KATA_MUSOU) {
1289 result |= 0x01U << FLAG_CAUSE_BATTLE_FORM;
1292 if (creature_ptr->ult_res) {
1293 result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1296 result |= check_equipment_flags(creature_ptr, TR_RES_SHARDS);
1300 BIT_FLAGS has_resist_nexus(player_type *creature_ptr)
1302 BIT_FLAGS result = 0L;
1304 if (creature_ptr->mimic_form == MIMIC_DEMON_LORD) {
1305 result |= 0x01U << FLAG_CAUSE_RACE;
1308 if (creature_ptr->special_defense & KATA_MUSOU) {
1309 result |= 0x01U << FLAG_CAUSE_BATTLE_FORM;
1312 if (creature_ptr->ult_res) {
1313 result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1316 result |= check_equipment_flags(creature_ptr, TR_RES_NEXUS);
1320 BIT_FLAGS has_resist_blind(player_type *creature_ptr)
1322 BIT_FLAGS result = 0L;
1324 if (creature_ptr->pseikaku == PERSONALITY_MUNCHKIN) {
1325 result |= 0x01U << FLAG_CAUSE_PERSONALITY;
1328 if (!creature_ptr->mimic_form && creature_ptr->prace == RACE_DWARF)
1329 result |= 0x01U << FLAG_CAUSE_RACE;
1331 if (creature_ptr->special_defense & KATA_MUSOU) {
1332 result |= 0x01U << FLAG_CAUSE_BATTLE_FORM;
1335 if (creature_ptr->ult_res || creature_ptr->magicdef) {
1336 result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1339 result |= check_equipment_flags(creature_ptr, TR_RES_BLIND);
1343 BIT_FLAGS has_resist_neth(player_type *creature_ptr)
1345 BIT_FLAGS result = 0L;
1347 if (creature_ptr->mimic_form == MIMIC_DEMON_LORD || creature_ptr->mimic_form == MIMIC_DEMON || creature_ptr->mimic_form == MIMIC_VAMPIRE) {
1348 result |= 0x01U << FLAG_CAUSE_RACE;
1351 if (!creature_ptr->mimic_form
1352 && (creature_ptr->prace == RACE_ZOMBIE || creature_ptr->prace == RACE_VAMPIRE || creature_ptr->prace == RACE_SPECTRE
1353 || creature_ptr->prace == RACE_BALROG))
1354 result |= 0x01U << FLAG_CAUSE_RACE;
1356 if (creature_ptr->special_defense & KATA_MUSOU) {
1357 result |= 0x01U << FLAG_CAUSE_BATTLE_FORM;
1360 if (creature_ptr->ult_res || creature_ptr->tim_res_nether) {
1361 result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1364 result |= check_equipment_flags(creature_ptr, TR_RES_NETHER);
1368 BIT_FLAGS has_resist_time(player_type *creature_ptr)
1370 BIT_FLAGS result = 0L;
1372 if (creature_ptr->tim_res_time) {
1373 result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1376 result |= check_equipment_flags(creature_ptr, TR_RES_TIME);
1380 BIT_FLAGS has_resist_water(player_type *creature_ptr)
1382 BIT_FLAGS result = 0L;
1384 if (!creature_ptr->mimic_form && creature_ptr->prace == RACE_MERFOLK)
1385 result |= 0x01U << FLAG_CAUSE_RACE;
1387 result |= check_equipment_flags(creature_ptr, TR_RES_WATER);
1391 BIT_FLAGS has_resist_fear(player_type *creature_ptr)
1393 BIT_FLAGS result = 0L;
1395 if (creature_ptr->muta3 & MUT3_FEARLESS)
1396 result |= 0x01U << FLAG_CAUSE_MUTATION;
1398 switch (creature_ptr->pclass) {
1401 if (creature_ptr->lev > 29)
1402 result |= 0x01U << FLAG_CAUSE_CLASS;
1405 case CLASS_CHAOS_WARRIOR:
1406 if (creature_ptr->lev > 39)
1407 result |= 0x01U << FLAG_CAUSE_CLASS;
1409 case CLASS_MINDCRAFTER:
1410 if (creature_ptr->lev > 9)
1411 result |= 0x01U << FLAG_CAUSE_CLASS;
1414 result |= 0x01U << FLAG_CAUSE_CLASS;
1418 if (creature_ptr->mimic_form == MIMIC_DEMON_LORD) {
1419 result |= 0x01U << FLAG_CAUSE_RACE;
1422 if (!creature_ptr->mimic_form && creature_ptr->prace == RACE_BARBARIAN)
1423 result |= 0x01U << FLAG_CAUSE_RACE;
1425 if ((creature_ptr->special_defense & KATA_MUSOU)) {
1426 result |= 0x01U << FLAG_CAUSE_BATTLE_FORM;
1429 if (is_hero(creature_ptr) || is_shero(creature_ptr) || creature_ptr->ult_res) {
1430 result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1433 result |= check_equipment_flags(creature_ptr, TR_RES_FEAR);
1437 BIT_FLAGS has_immune_acid(player_type *creature_ptr)
1439 BIT_FLAGS result = 0L;
1440 if (!creature_ptr->mimic_form && creature_ptr->prace == RACE_YEEK && creature_ptr->lev > 19)
1441 result |= 0x01U << FLAG_CAUSE_RACE;
1443 if (creature_ptr->ele_immune) {
1444 if (creature_ptr->special_defense & DEFENSE_ACID)
1445 result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1448 result |= check_equipment_flags(creature_ptr, TR_IM_ACID);
1452 BIT_FLAGS has_immune_elec(player_type *creature_ptr)
1454 BIT_FLAGS result = 0L;
1456 if (creature_ptr->ele_immune) {
1457 if (creature_ptr->special_defense & DEFENSE_ELEC)
1458 result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1461 result |= check_equipment_flags(creature_ptr, TR_IM_ELEC);
1465 BIT_FLAGS has_immune_fire(player_type *creature_ptr)
1467 BIT_FLAGS result = 0L;
1469 if (creature_ptr->ele_immune) {
1470 if (creature_ptr->special_defense & DEFENSE_FIRE)
1471 result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1474 result |= check_equipment_flags(creature_ptr, TR_IM_FIRE);
1478 BIT_FLAGS has_immune_cold(player_type *creature_ptr)
1480 BIT_FLAGS result = 0L;
1482 if (creature_ptr->ele_immune) {
1483 if (creature_ptr->special_defense & DEFENSE_COLD)
1484 result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1487 result |= check_equipment_flags(creature_ptr, TR_IM_COLD);
1491 BIT_FLAGS has_immune_dark(player_type *creature_ptr)
1493 BIT_FLAGS result = 0L;
1495 if (is_specific_player_race(creature_ptr, RACE_VAMPIRE) || (creature_ptr->mimic_form == MIMIC_VAMPIRE)) {
1496 result |= 0x01U << FLAG_CAUSE_RACE;
1499 if (creature_ptr->wraith_form) {
1500 result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1506 melee_type player_melee_type(player_type *creature_ptr)
1508 if (has_two_handed_weapons(creature_ptr))
1509 return MELEE_TYPE_WEAPON_TWOHAND;
1511 if (has_melee_weapon(creature_ptr, INVEN_MAIN_HAND)) {
1512 if (has_melee_weapon(creature_ptr, INVEN_SUB_HAND)) {
1513 return MELEE_TYPE_WEAPON_DOUBLE;
1515 return MELEE_TYPE_WEAPON_MAIN;
1518 if (has_melee_weapon(creature_ptr, INVEN_SUB_HAND))
1519 return MELEE_TYPE_WEAPON_SUB;
1521 if (empty_hands(creature_ptr, FALSE) == (EMPTY_HAND_MAIN | EMPTY_HAND_SUB))
1522 return MELEE_TYPE_BAREHAND_TWO;
1524 if (empty_hands(creature_ptr, FALSE) == EMPTY_HAND_MAIN)
1525 return MELEE_TYPE_BAREHAND_MAIN;
1527 if (empty_hands(creature_ptr, FALSE) == EMPTY_HAND_SUB)
1528 return MELEE_TYPE_BAREHAND_SUB;
1530 return MELEE_TYPE_SHIELD_DOUBLE;
1534 * @brief 利き手で攻撃可能かどうかを判定する
1535 * 利き手で攻撃可能とは、利き手に武器を持っているか、
1536 * 利き手が素手かつ左手も素手もしくは盾を装備している事を意味する。
1537 * @detail Includes martial arts and hand combats as weapons.
1539 bool can_attack_with_main_hand(player_type *creature_ptr)
1541 if (has_melee_weapon(creature_ptr, INVEN_MAIN_HAND))
1544 if ((empty_hands(creature_ptr, TRUE) & EMPTY_HAND_MAIN) && !can_attack_with_sub_hand(creature_ptr))
1551 * @brief 非利き手で攻撃可能かどうかを判定する
1552 * 非利き手で攻撃可能とは、非利き手に武器を持っている事に等しい
1553 * @detail Exclude martial arts and hand combats from weapons.
1555 bool can_attack_with_sub_hand(player_type *creature_ptr) { return has_melee_weapon(creature_ptr, INVEN_SUB_HAND); }
1558 * @brief 両手持ち状態かどうかを判定する
1560 bool has_two_handed_weapons(player_type *creature_ptr)
1562 if (can_two_hands_wielding(creature_ptr)) {
1563 if (can_attack_with_main_hand(creature_ptr) && (empty_hands(creature_ptr, FALSE) == EMPTY_HAND_SUB)
1564 && object_allow_two_hands_wielding(&creature_ptr->inventory_list[INVEN_MAIN_HAND])) {
1566 } else if (can_attack_with_sub_hand(creature_ptr) && (empty_hands(creature_ptr, FALSE) == EMPTY_HAND_MAIN)
1567 && object_allow_two_hands_wielding(&creature_ptr->inventory_list[INVEN_SUB_HAND])) {
1574 BIT_FLAGS has_lite(player_type *creature_ptr)
1576 BIT_FLAGS result = 0L;
1577 if (creature_ptr->pclass == CLASS_NINJA)
1580 if (creature_ptr->pseikaku == PERSONALITY_MUNCHKIN) {
1581 result |= 0x01U << FLAG_CAUSE_PERSONALITY;
1584 if (creature_ptr->mimic_form == MIMIC_VAMPIRE) {
1585 result |= 0x01U << FLAG_CAUSE_RACE;
1588 if (!creature_ptr->mimic_form && creature_ptr->prace == RACE_VAMPIRE)
1589 result |= 0x01U << FLAG_CAUSE_RACE;
1591 if (creature_ptr->ult_res) {
1592 result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1595 if (creature_ptr->special_defense & KATA_MUSOU) {
1596 result |= 0x01U << FLAG_CAUSE_BATTLE_FORM;
1599 result |= has_sh_fire(creature_ptr);
1605 * @brief 両手持ちボーナスがもらえないかどうかを判定する。 / Does *not * get two hand wielding bonus.
1607 * Only can get hit bonuses when wieids an enough light weapon which is lighter than 5 times of weight limit.
1608 * If its weight is 10 times heavier or more than weight limit, gets hit penalty in calc_to_hit().
1610 bool has_disable_two_handed_bonus(player_type *creature_ptr, int i)
1612 if (has_melee_weapon(creature_ptr, INVEN_MAIN_HAND + i) && has_two_handed_weapons(creature_ptr)) {
1613 object_type *o_ptr = &creature_ptr->inventory_list[INVEN_MAIN_HAND + i];
1614 int limit = calc_weapon_weight_limit(creature_ptr) * 2;
1616 /* Enable when two hand wields an enough light weapon */
1617 if (limit >= o_ptr->weight / 5)
1621 /* Disable when empty hands, one hand wieldings and heavy weapons */
1626 * todo 相応しい時にFALSEで相応しくない時にTRUEという負論理は良くない、後で修正する
1628 bool has_icky_wield_weapon(player_type *creature_ptr, int i)
1630 BIT_FLAGS flgs[TR_FLAG_SIZE];
1631 object_type *o_ptr = &creature_ptr->inventory_list[INVEN_MAIN_HAND + i];
1632 object_flags(creature_ptr, o_ptr, flgs);
1634 bool has_no_weapon = (o_ptr->tval == TV_NONE) || (o_ptr->tval == TV_SHIELD);
1635 if (creature_ptr->pclass == CLASS_PRIEST) {
1636 bool is_suitable_weapon = has_flag(flgs, TR_BLESSED);
1637 is_suitable_weapon |= (o_ptr->tval != TV_SWORD) && (o_ptr->tval != TV_POLEARM);
1638 return !has_no_weapon && !is_suitable_weapon;
1641 if (creature_ptr->pclass == CLASS_SORCERER) {
1642 bool is_suitable_weapon = o_ptr->tval == TV_HAFTED;
1643 is_suitable_weapon &= (o_ptr->sval == SV_WIZSTAFF) || (o_ptr->sval == SV_NAMAKE_HAMMER);
1644 return !has_no_weapon && !is_suitable_weapon;
1647 if (has_not_monk_weapon(creature_ptr, i) || has_not_ninja_weapon(creature_ptr, i))
1653 bool has_riding_wield_weapon(player_type *creature_ptr, int i)
1656 BIT_FLAGS flgs[TR_FLAG_SIZE];
1657 o_ptr = &creature_ptr->inventory_list[INVEN_MAIN_HAND + i];
1658 object_flags(creature_ptr, o_ptr, flgs);
1659 if (creature_ptr->riding != 0 && !(o_ptr->tval == TV_POLEARM) && ((o_ptr->sval == SV_LANCE) || (o_ptr->sval == SV_HEAVY_LANCE))
1660 && !has_flag(flgs, TR_RIDING)) {
1666 bool has_not_ninja_weapon(player_type *creature_ptr, int i)
1668 if (!has_melee_weapon(creature_ptr, INVEN_MAIN_HAND + i)) {
1671 tval_type tval = creature_ptr->inventory_list[INVEN_MAIN_HAND + i].tval - TV_WEAPON_BEGIN;
1672 OBJECT_SUBTYPE_VALUE sval = creature_ptr->inventory_list[INVEN_MAIN_HAND + i].sval;
1673 return creature_ptr->pclass == CLASS_NINJA
1674 && !((s_info[CLASS_NINJA].w_max[tval][sval] > WEAPON_EXP_BEGINNER) && (creature_ptr->inventory_list[INVEN_SUB_HAND - i].tval != TV_SHIELD));
1677 bool has_not_monk_weapon(player_type *creature_ptr, int i)
1679 if (!has_melee_weapon(creature_ptr, INVEN_MAIN_HAND + i)) {
1682 tval_type tval = creature_ptr->inventory_list[INVEN_MAIN_HAND + i].tval - TV_WEAPON_BEGIN;
1683 OBJECT_SUBTYPE_VALUE sval = creature_ptr->inventory_list[INVEN_MAIN_HAND + i].sval;
1684 return ((creature_ptr->pclass == CLASS_MONK) || (creature_ptr->pclass == CLASS_FORCETRAINER)) && !(s_info[creature_ptr->pclass].w_max[tval][sval]);
1687 bool has_good_luck(player_type *creature_ptr) { return (creature_ptr->pseikaku == PERSONALITY_LUCKY) || (creature_ptr->muta3 & MUT3_GOOD_LUCK); }
1689 BIT_FLAGS player_aggravate_state(player_type *creature_ptr)
1691 if (creature_ptr->cursed & TRC_AGGRAVATE) {
1692 if ((is_specific_player_race(creature_ptr, RACE_S_FAIRY)) && (creature_ptr->pseikaku != PERSONALITY_SEXY)) {
1693 return AGGRAVATE_S_FAIRY;
1695 return AGGRAVATE_NORMAL;
1698 return AGGRAVATE_NONE;
1701 bool has_aggravate(player_type *creature_ptr) { return player_aggravate_state(creature_ptr) == AGGRAVATE_NORMAL; }