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_RARM; 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 |= 0x01 << (i - INVEN_RARM);
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);
146 * @brief クリーチャーが邪悪感知を持っているかを返す。
147 * @param creature_ptr 判定対象のクリーチャー参照ポインタ
148 * @return 持っていたら所持前提ビットフラグを返す。
150 BIT_FLAGS has_esp_evil(player_type *creature_ptr)
152 BIT_FLAGS result = 0L;
153 if (creature_ptr->realm1 == REALM_HEX) {
154 if (hex_spelling(creature_ptr, HEX_DETECT_EVIL))
155 result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
157 result |= check_equipment_flags(creature_ptr, TR_ESP_EVIL);
162 * @brief クリーチャーが自然界の動物感知を持っているかを返す。
163 * @param creature_ptr 判定対象のクリーチャー参照ポインタ
164 * @return 持っていたら所持前提ビットフラグを返す。
166 BIT_FLAGS has_esp_animal(player_type *creature_ptr)
168 return check_equipment_flags(creature_ptr, TR_ESP_ANIMAL);
172 * @brief クリーチャーがアンデッド感知を持っているかを返す。
173 * @param creature_ptr 判定対象のクリーチャー参照ポインタ
174 * @return 持っていたら所持前提ビットフラグを返す。
176 BIT_FLAGS has_esp_undead(player_type *creature_ptr)
178 return check_equipment_flags(creature_ptr, TR_ESP_UNDEAD);
182 * @brief クリーチャーが悪魔感知を持っているかを返す。
183 * @param creature_ptr 判定対象のクリーチャー参照ポインタ
184 * @return 持っていたら所持前提ビットフラグを返す。
186 BIT_FLAGS has_esp_demon(player_type *creature_ptr)
188 return check_equipment_flags(creature_ptr, TR_ESP_DEMON);
192 * @brief クリーチャーがオーク感知を持っているかを返す。
193 * @param creature_ptr 判定対象のクリーチャー参照ポインタ
194 * @return 持っていたら所持前提ビットフラグを返す。
196 BIT_FLAGS has_esp_orc(player_type *creature_ptr)
198 return check_equipment_flags(creature_ptr, TR_ESP_ORC);
202 * @brief クリーチャーがトロル感知を持っているかを返す。
203 * @param creature_ptr 判定対象のクリーチャー参照ポインタ
204 * @return 持っていたら所持前提ビットフラグを返す。
206 BIT_FLAGS has_esp_troll(player_type *creature_ptr)
208 return check_equipment_flags(creature_ptr, TR_ESP_TROLL);
212 * @brief クリーチャーが巨人感知を持っているかを返す。
213 * @param creature_ptr 判定対象のクリーチャー参照ポインタ
214 * @return 持っていたら所持前提ビットフラグを返す。
216 BIT_FLAGS has_esp_giant(player_type *creature_ptr)
218 return check_equipment_flags(creature_ptr, TR_ESP_GIANT);
222 * @brief クリーチャーがドラゴン感知を持っているかを返す。
223 * @param creature_ptr 判定対象のクリーチャー参照ポインタ
224 * @return 持っていたら所持前提ビットフラグを返す。
226 BIT_FLAGS has_esp_dragon(player_type *creature_ptr)
228 return check_equipment_flags(creature_ptr, TR_ESP_DRAGON);
232 * @brief クリーチャーが人間感知を持っているかを返す。
233 * @param creature_ptr 判定対象のクリーチャー参照ポインタ
234 * @return 持っていたら所持前提ビットフラグを返す。
236 BIT_FLAGS has_esp_human(player_type *creature_ptr)
238 return check_equipment_flags(creature_ptr, TR_ESP_HUMAN);
242 * @brief クリーチャーが善良感知を持っているかを返す。
243 * @param creature_ptr 判定対象のクリーチャー参照ポインタ
244 * @return 持っていたら所持前提ビットフラグを返す。
246 BIT_FLAGS has_esp_good(player_type *creature_ptr)
248 return check_equipment_flags(creature_ptr, TR_ESP_GOOD);
252 * @brief クリーチャーが無生物感知を持っているかを返す。
253 * @param creature_ptr 判定対象のクリーチャー参照ポインタ
254 * @return 持っていたら所持前提ビットフラグを返す。
256 BIT_FLAGS has_esp_nonliving(player_type *creature_ptr)
258 return check_equipment_flags(creature_ptr, TR_ESP_GOOD);
262 * @brief クリーチャーがユニーク感知を持っているかを返す。
263 * @param creature_ptr 判定対象のクリーチャー参照ポインタ
264 * @return 持っていたら所持前提ビットフラグを返す。
266 BIT_FLAGS has_esp_unique(player_type *creature_ptr)
268 return check_equipment_flags(creature_ptr, TR_ESP_UNIQUE);
272 * @brief クリーチャーがテレパシーを持っているかを返す。
273 * @param creature_ptr 判定対象のクリーチャー参照ポインタ
274 * @return 持っていたら所持前提ビットフラグを返す。
276 BIT_FLAGS has_esp_telepathy(player_type *creature_ptr)
278 BIT_FLAGS result = 0L;
280 if (is_time_limit_esp(creature_ptr) || creature_ptr->ult_res || (creature_ptr->special_defense & KATA_MUSOU)) {
281 result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
284 if (creature_ptr->muta3 & MUT3_ESP) {
285 result |= 0x01 << FLAG_CAUSE_MUTATION;
288 if (is_specific_player_race(creature_ptr, RACE_MIND_FLAYER) && creature_ptr->lev > 29)
289 result |= 0x01 << FLAG_CAUSE_RACE;
291 if (is_specific_player_race(creature_ptr, RACE_SPECTRE) && creature_ptr->lev > 34)
292 result |= 0x01 << FLAG_CAUSE_RACE;
294 if (creature_ptr->pclass == CLASS_MINDCRAFTER && creature_ptr->lev > 39)
295 result |= 0x01 << FLAG_CAUSE_CLASS;
297 if (creature_ptr->mimic_form == MIMIC_DEMON_LORD) {
298 result |= 0x01 << FLAG_CAUSE_RACE;
301 result |= check_equipment_flags(creature_ptr, TR_TELEPATHY);
305 BIT_FLAGS has_bless_blade(player_type *creature_ptr)
307 return check_equipment_flags(creature_ptr, TR_BLESSED);
310 BIT_FLAGS has_easy2_weapon(player_type *creature_ptr)
312 return check_equipment_flags(creature_ptr, TR_EASY2_WEAPON);
315 BIT_FLAGS has_down_saving(player_type *creature_ptr)
317 return check_equipment_flags(creature_ptr, TR_DOWN_SAVING);
320 BIT_FLAGS has_no_ac(player_type *creature_ptr)
322 return check_equipment_flags(creature_ptr, TR_NO_AC);
325 BIT_FLAGS has_invuln_arrow(player_type *creature_ptr)
327 BIT_FLAGS result = 0L;
328 if (creature_ptr->blind)
330 result |= check_equipment_flags(creature_ptr, TR_INVULN_ARROW);
334 void check_no_flowed(player_type *creature_ptr)
337 bool has_sw = FALSE, has_kabe = FALSE;
338 OBJECT_IDX this_o_idx, next_o_idx = 0;
340 creature_ptr->no_flowed = FALSE;
342 if (has_pass_wall(creature_ptr) && !has_kill_wall(creature_ptr))
343 creature_ptr->no_flowed = TRUE;
345 for (int i = 0; i < INVEN_PACK; i++) {
346 if ((creature_ptr->inventory_list[i].tval == TV_NATURE_BOOK) && (creature_ptr->inventory_list[i].sval == 2))
348 if ((creature_ptr->inventory_list[i].tval == TV_CRAFT_BOOK) && (creature_ptr->inventory_list[i].sval == 2))
352 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) {
353 o_ptr = &creature_ptr->current_floor_ptr->o_list[this_o_idx];
354 next_o_idx = o_ptr->next_o_idx;
356 if ((o_ptr->tval == TV_NATURE_BOOK) && (o_ptr->sval == 2))
358 if ((o_ptr->tval == TV_CRAFT_BOOK) && (o_ptr->sval == 2))
362 if (has_sw && ((creature_ptr->realm1 == REALM_NATURE) || (creature_ptr->realm2 == REALM_NATURE) || (creature_ptr->pclass == CLASS_SORCERER))) {
363 const magic_type *s_ptr = &mp_ptr->info[REALM_NATURE - 1][SPELL_SW];
364 if (creature_ptr->lev >= s_ptr->slevel)
365 creature_ptr->no_flowed = TRUE;
368 if (has_kabe && ((creature_ptr->realm1 == REALM_CRAFT) || (creature_ptr->realm2 == REALM_CRAFT) || (creature_ptr->pclass == CLASS_SORCERER))) {
369 const magic_type *s_ptr = &mp_ptr->info[REALM_CRAFT - 1][SPELL_WALL];
370 if (creature_ptr->lev >= s_ptr->slevel)
371 creature_ptr->no_flowed = TRUE;
375 BIT_FLAGS has_mighty_throw(player_type *creature_ptr)
377 return check_equipment_flags(creature_ptr, TR_MIGHTY_THROW);
380 BIT_FLAGS has_dec_mana(player_type *creature_ptr)
382 return check_equipment_flags(creature_ptr, TR_DEC_MANA);
386 BIT_FLAGS has_reflect(player_type *creature_ptr)
388 BIT_FLAGS result = 0L;
390 if (creature_ptr->pclass == CLASS_BERSERKER && creature_ptr->lev > 39)
391 result |= 0x01 << FLAG_CAUSE_CLASS;
393 if (creature_ptr->pclass == CLASS_MIRROR_MASTER && creature_ptr->lev > 39)
394 result |= 0x01 << FLAG_CAUSE_CLASS;
396 if (creature_ptr->special_defense & KAMAE_GENBU || creature_ptr->special_defense & KATA_MUSOU) {
397 result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
400 if (creature_ptr->ult_res || creature_ptr->wraith_form || creature_ptr->magicdef || creature_ptr->tim_reflect) {
401 result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
404 result |= check_equipment_flags(creature_ptr, TR_REFLECT);
408 BIT_FLAGS has_see_nocto(player_type *creature_ptr) { return creature_ptr->pclass == CLASS_NINJA ? FLAG_CAUSE_CLASS : 0L; }
410 BIT_FLAGS has_warning(player_type *creature_ptr)
412 BIT_FLAGS result = 0L;
414 BIT_FLAGS flgs[TR_FLAG_SIZE];
416 for (inventory_slot_type i = INVEN_RARM; i < INVEN_TOTAL; i++) {
417 o_ptr = &creature_ptr->inventory_list[i];
421 object_flags(creature_ptr, o_ptr, flgs);
423 if (has_flag(flgs, TR_WARNING)) {
424 if (!o_ptr->inscription || !(angband_strchr(quark_str(o_ptr->inscription), '$')))
425 result |= 0x01 << (i - INVEN_RARM);
431 BIT_FLAGS has_anti_magic(player_type *creature_ptr)
433 return check_equipment_flags(creature_ptr, TR_NO_MAGIC);
436 BIT_FLAGS has_anti_tele(player_type *creature_ptr)
438 return check_equipment_flags(creature_ptr, TR_NO_TELE);
441 BIT_FLAGS has_sh_fire(player_type *creature_ptr)
443 BIT_FLAGS result = 0L;
445 if (creature_ptr->muta3 & MUT3_FIRE_BODY) {
446 result |= 0x01 << FLAG_CAUSE_MUTATION;
449 if (creature_ptr->mimic_form == MIMIC_DEMON_LORD) {
450 result |= 0x01 << FLAG_CAUSE_RACE;
453 if (creature_ptr->special_defense & KAMAE_SEIRYU || creature_ptr->special_defense & KATA_MUSOU) {
454 result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
457 if (hex_spelling(creature_ptr, HEX_DEMON_AURA) || creature_ptr->ult_res || creature_ptr->tim_sh_fire) {
458 result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
461 result |= check_equipment_flags(creature_ptr, TR_SH_FIRE);
465 BIT_FLAGS has_sh_elec(player_type *creature_ptr)
467 BIT_FLAGS result = 0L;
469 if (creature_ptr->muta3 & MUT3_ELEC_TOUC)
470 result |= 0x01 << FLAG_CAUSE_MUTATION;
472 if (hex_spelling(creature_ptr, HEX_SHOCK_CLOAK) || creature_ptr->ult_res) {
473 result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
476 if (creature_ptr->special_defense & KAMAE_SEIRYU || (creature_ptr->special_defense & KATA_MUSOU)) {
477 result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
480 result |= check_equipment_flags(creature_ptr, TR_SH_ELEC);
484 BIT_FLAGS has_sh_cold(player_type *creature_ptr)
486 BIT_FLAGS result = 0L;
488 if (creature_ptr->special_defense & KAMAE_SEIRYU || creature_ptr->special_defense & KATA_MUSOU) {
489 result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
492 if (creature_ptr->ult_res || hex_spelling(creature_ptr, HEX_ICE_ARMOR)) {
493 result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
496 result |= check_equipment_flags(creature_ptr, TR_SH_COLD);
500 BIT_FLAGS has_easy_spell(player_type *creature_ptr)
502 return check_equipment_flags(creature_ptr, TR_EASY_SPELL);
505 BIT_FLAGS has_heavy_spell(player_type *creature_ptr)
507 return check_equipment_flags(creature_ptr, TR_HEAVY_SPELL);
510 BIT_FLAGS has_hold_exp(player_type *creature_ptr)
512 BIT_FLAGS result = 0L;
514 if (creature_ptr->pseikaku == PERSONALITY_MUNCHKIN) {
515 result |= 0x01 << FLAG_CAUSE_PERSONALITY;
518 if (creature_ptr->mimic_form == MIMIC_DEMON || creature_ptr->mimic_form == MIMIC_DEMON_LORD || creature_ptr->mimic_form == MIMIC_VAMPIRE) {
519 result |= 0x01 << FLAG_CAUSE_RACE;
522 if (is_specific_player_race(creature_ptr, RACE_HOBBIT) || is_specific_player_race(creature_ptr, RACE_SKELETON)
523 || is_specific_player_race(creature_ptr, RACE_ZOMBIE) || is_specific_player_race(creature_ptr, RACE_VAMPIRE)
524 || is_specific_player_race(creature_ptr, RACE_SPECTRE) || is_specific_player_race(creature_ptr, RACE_BALROG)
525 || is_specific_player_race(creature_ptr, RACE_ANDROID)) {
526 result |= 0x01 << FLAG_CAUSE_RACE;
529 if (is_specific_player_race(creature_ptr, RACE_GOLEM)) {
530 if (creature_ptr->lev > 34)
531 result |= 0x01 << FLAG_CAUSE_RACE;
534 if (creature_ptr->special_defense & KATA_MUSOU) {
535 result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
538 if (creature_ptr->ult_res) {
539 result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
542 result |= check_equipment_flags(creature_ptr, TR_HOLD_EXP);
546 BIT_FLAGS has_see_inv(player_type *creature_ptr)
548 BIT_FLAGS result = 0L;
550 if (creature_ptr->pclass == CLASS_NINJA && creature_ptr->lev > 29)
551 result |= 0x01 << FLAG_CAUSE_CLASS;
553 if (creature_ptr->mimic_form == MIMIC_DEMON || creature_ptr->mimic_form == MIMIC_DEMON_LORD || creature_ptr->mimic_form == MIMIC_VAMPIRE) {
554 result |= 0x01 << FLAG_CAUSE_RACE;
555 } else if (is_specific_player_race(creature_ptr, RACE_HIGH_ELF) || is_specific_player_race(creature_ptr, RACE_GOLEM)
556 || is_specific_player_race(creature_ptr, RACE_SKELETON) || is_specific_player_race(creature_ptr, RACE_ZOMBIE)
557 || is_specific_player_race(creature_ptr, RACE_SPECTRE) || is_specific_player_race(creature_ptr, RACE_ARCHON)) {
558 result |= 0x01 << FLAG_CAUSE_RACE;
559 } else if (is_specific_player_race(creature_ptr, RACE_DARK_ELF) && creature_ptr->lev > 19) {
560 result |= 0x01 << FLAG_CAUSE_RACE;
561 } else if (is_specific_player_race(creature_ptr, RACE_MIND_FLAYER) && creature_ptr->lev > 14) {
562 result |= 0x01 << FLAG_CAUSE_RACE;
563 } else if ((is_specific_player_race(creature_ptr, RACE_IMP) || is_specific_player_race(creature_ptr, RACE_BALROG)) && creature_ptr->lev > 9) {
564 result |= 0x01 << FLAG_CAUSE_RACE;
567 if (creature_ptr->special_defense & KATA_MUSOU) {
568 result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
571 if (creature_ptr->ult_res || creature_ptr->tim_invis) {
572 result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
575 result |= check_equipment_flags(creature_ptr, TR_SEE_INVIS);
579 BIT_FLAGS has_magic_mastery(player_type *creature_ptr)
581 return check_equipment_flags(creature_ptr, TR_MAGIC_MASTERY);
584 BIT_FLAGS has_free_act(player_type *creature_ptr)
586 BIT_FLAGS result = 0L;
588 if (creature_ptr->muta3 & MUT3_MOTION)
589 result |= 0x01 << FLAG_CAUSE_MUTATION;
591 if (is_specific_player_race(creature_ptr, RACE_GNOME) || is_specific_player_race(creature_ptr, RACE_GOLEM)
592 || is_specific_player_race(creature_ptr, RACE_SPECTRE) || is_specific_player_race(creature_ptr, RACE_ANDROID)) {
593 result |= 0x01 << FLAG_CAUSE_RACE;
596 if (creature_ptr->pclass == CLASS_NINJA && !heavy_armor(creature_ptr) && (!creature_ptr->inventory_list[INVEN_RARM].k_idx || has_right_hand_weapon(creature_ptr))
597 && (!creature_ptr->inventory_list[INVEN_LARM].k_idx || has_left_hand_weapon(creature_ptr))) {
598 if (creature_ptr->lev > 24)
599 result |= 0x01 << FLAG_CAUSE_CLASS;
602 if (creature_ptr->pclass == CLASS_MONK || creature_ptr->pclass == CLASS_FORCETRAINER) {
603 if (!(heavy_armor(creature_ptr))) {
604 if (creature_ptr->lev > 24)
605 result |= 0x01 << FLAG_CAUSE_CLASS;
609 if (creature_ptr->pclass == CLASS_BERSERKER) {
610 result |= 0x01 << FLAG_CAUSE_CLASS;
613 if (creature_ptr->ult_res || creature_ptr->magicdef) {
614 result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
617 if (creature_ptr->special_defense & KATA_MUSOU) {
618 result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
621 result |= check_equipment_flags(creature_ptr, TR_FREE_ACT);
625 BIT_FLAGS has_sustain_str(player_type *creature_ptr)
627 BIT_FLAGS result = 0L;
629 if (creature_ptr->pclass == CLASS_BERSERKER) {
630 result |= 0x01 << FLAG_CAUSE_CLASS;
632 if (is_specific_player_race(creature_ptr, RACE_HALF_TROLL) || is_specific_player_race(creature_ptr, RACE_HALF_OGRE)
633 || is_specific_player_race(creature_ptr, RACE_HALF_GIANT)) {
634 result |= 0x01 << FLAG_CAUSE_RACE;
637 if (creature_ptr->ult_res) {
638 result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
641 if (creature_ptr->special_defense & KATA_MUSOU) {
642 result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
645 result |= check_equipment_flags(creature_ptr, TR_SUST_STR);
649 BIT_FLAGS has_sustain_int(player_type *creature_ptr)
651 BIT_FLAGS result = 0L;
653 if (is_specific_player_race(creature_ptr, RACE_MIND_FLAYER)) {
654 result |= 0x01 << FLAG_CAUSE_RACE;
657 if (creature_ptr->ult_res) {
658 result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
661 if (creature_ptr->special_defense & KATA_MUSOU) {
662 result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
665 result |= check_equipment_flags(creature_ptr, TR_SUST_INT);
669 BIT_FLAGS has_sustain_wis(player_type *creature_ptr)
671 BIT_FLAGS result = 0L;
674 if (creature_ptr->pclass == CLASS_MINDCRAFTER && creature_ptr->lev > 19)
675 result |= 0x01 << FLAG_CAUSE_CLASS;
677 if (!creature_ptr->mimic_form && (creature_ptr->prace == RACE_MIND_FLAYER)) {
678 result |= 0x01 << FLAG_CAUSE_RACE;
681 if (creature_ptr->ult_res) {
682 result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
685 if (creature_ptr->special_defense & KATA_MUSOU) {
686 result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
689 result |= check_equipment_flags(creature_ptr, TR_SUST_WIS);
693 BIT_FLAGS has_sustain_dex(player_type *creature_ptr)
695 BIT_FLAGS result = 0L;
696 if (creature_ptr->pclass == CLASS_BERSERKER) {
697 result |= 0x01 << FLAG_CAUSE_CLASS;
700 if (creature_ptr->pclass == CLASS_NINJA && creature_ptr->lev > 24)
701 result |= 0x01 << FLAG_CAUSE_CLASS;
703 if (creature_ptr->ult_res) {
704 result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
707 if (creature_ptr->special_defense & KATA_MUSOU) {
708 result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
711 result |= check_equipment_flags(creature_ptr, TR_SUST_DEX);
715 BIT_FLAGS has_sustain_con(player_type *creature_ptr)
717 BIT_FLAGS result = 0L;
718 if (creature_ptr->pclass == CLASS_BERSERKER) {
719 result |= 0x01 << FLAG_CAUSE_CLASS;
722 if (!creature_ptr->mimic_form && (creature_ptr->prace == RACE_AMBERITE || creature_ptr->prace == RACE_DUNADAN)) {
723 result |= 0x01 << FLAG_CAUSE_RACE;
726 if (creature_ptr->ult_res) {
727 result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
730 if (creature_ptr->special_defense & KATA_MUSOU) {
731 result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
734 result |= check_equipment_flags(creature_ptr, TR_SUST_CON);
738 BIT_FLAGS has_sustain_chr(player_type *creature_ptr)
740 BIT_FLAGS result = 0L;
742 if (creature_ptr->ult_res) {
743 result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
746 if (creature_ptr->special_defense & KATA_MUSOU) {
747 result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
750 result |= check_equipment_flags(creature_ptr, TR_SUST_CHR);
754 BIT_FLAGS has_levitation(player_type *creature_ptr)
756 BIT_FLAGS result = 0L;
758 if (creature_ptr->muta3 & MUT3_WINGS)
759 result = FLAG_CAUSE_MUTATION;
761 if (creature_ptr->mimic_form == MIMIC_DEMON_LORD) {
762 result = FLAG_CAUSE_RACE;
765 if (is_specific_player_race(creature_ptr, RACE_DRACONIAN) || is_specific_player_race(creature_ptr, RACE_SPECTRE)
766 || is_specific_player_race(creature_ptr, RACE_SPRITE) || is_specific_player_race(creature_ptr, RACE_ARCHON)
767 || is_specific_player_race(creature_ptr, RACE_S_FAIRY)) {
768 result = FLAG_CAUSE_RACE;
771 if (creature_ptr->special_defense & KAMAE_SEIRYU || creature_ptr->special_defense & KAMAE_SUZAKU || (creature_ptr->special_defense & KATA_MUSOU)) {
772 result = FLAG_CAUSE_BATTLE_FORM;
775 if (creature_ptr->ult_res) {
776 result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
779 if (creature_ptr->riding) {
780 monster_type *riding_m_ptr = &creature_ptr->current_floor_ptr->m_list[creature_ptr->riding];
781 monster_race *riding_r_ptr = &r_info[riding_m_ptr->r_idx];
782 result = (riding_r_ptr->flags7 & RF7_CAN_FLY) ? result : 0;
785 if (creature_ptr->tim_levitation) {
786 result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
789 result |= check_equipment_flags(creature_ptr, TR_LEVITATION);
793 void has_can_swim(player_type *creature_ptr)
795 creature_ptr->can_swim = FALSE;
796 if (creature_ptr->riding) {
797 monster_type *riding_m_ptr = &creature_ptr->current_floor_ptr->m_list[creature_ptr->riding];
798 monster_race *riding_r_ptr = &r_info[riding_m_ptr->r_idx];
799 if (riding_r_ptr->flags7 & (RF7_CAN_SWIM | RF7_AQUATIC))
800 creature_ptr->can_swim = TRUE;
804 BIT_FLAGS has_slow_digest(player_type *creature_ptr)
806 BIT_FLAGS result = 0L;
808 if (creature_ptr->pclass == CLASS_NINJA) {
809 result = FLAG_CAUSE_CLASS;
812 if (creature_ptr->lev > 14 && !creature_ptr->mimic_form && creature_ptr->prace == RACE_HALF_TROLL) {
813 if (creature_ptr->pclass == CLASS_WARRIOR || creature_ptr->pclass == CLASS_BERSERKER) {
814 result = FLAG_CAUSE_CLASS;
815 /* Let's not make Regeneration
816 * a disadvantage for the poor warriors who can
817 * never learn a spell that satisfies hunger (actually
818 * neither can rogues, but half-trolls are not
819 * supposed to play rogues) */
823 if (creature_ptr->special_defense & KATA_MUSOU) {
824 result = FLAG_CAUSE_BATTLE_FORM;
827 if (creature_ptr->ult_res) {
828 result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
831 if (!creature_ptr->mimic_form
832 && (creature_ptr->prace == RACE_GOLEM || creature_ptr->prace == RACE_ZOMBIE || creature_ptr->prace == RACE_SPECTRE
833 || creature_ptr->prace == RACE_ANDROID)) {
834 result = FLAG_CAUSE_RACE;
837 result |= check_equipment_flags(creature_ptr, TR_SLOW_DIGEST);
841 BIT_FLAGS has_regenerate(player_type *creature_ptr)
843 BIT_FLAGS result = 0L;
845 if (is_specific_player_race(creature_ptr, RACE_HALF_TROLL) && creature_ptr->lev > 14) {
846 result |= 0x01 << FLAG_CAUSE_RACE;
849 if (is_specific_player_race(creature_ptr, RACE_AMBERITE)) {
850 result |= 0x01 << FLAG_CAUSE_RACE;
853 if (creature_ptr->pclass == CLASS_WARRIOR && creature_ptr->lev > 44) {
854 result |= 0x01 << FLAG_CAUSE_RACE;
857 if (creature_ptr->pclass == CLASS_BERSERKER) {
858 result |= 0x01 << FLAG_CAUSE_RACE;
861 if (creature_ptr->muta3 & MUT3_REGEN)
862 result |= 0x01 << FLAG_CAUSE_MUTATION;
864 if (creature_ptr->special_defense & KATA_MUSOU) {
865 result |= 0x01 << FLAG_CAUSE_MUTATION;
868 if (hex_spelling(creature_ptr, HEX_DEMON_AURA) || creature_ptr->ult_res || creature_ptr->tim_regen) {
869 result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
872 result |= check_equipment_flags(creature_ptr, TR_REGEN);
874 if (creature_ptr->muta3 & MUT3_FLESH_ROT)
880 void has_curses(player_type *creature_ptr)
883 BIT_FLAGS flgs[TR_FLAG_SIZE];
884 creature_ptr->cursed = 0L;
886 if (creature_ptr->pseikaku == PERSONALITY_SEXY)
887 creature_ptr->cursed |= (TRC_AGGRAVATE);
889 for (inventory_slot_type i = INVEN_RARM; i < INVEN_TOTAL; i++) {
890 o_ptr = &creature_ptr->inventory_list[i];
893 object_flags(creature_ptr, o_ptr, flgs);
894 if (has_flag(flgs, TR_AGGRAVATE))
895 creature_ptr->cursed |= TRC_AGGRAVATE;
896 if (has_flag(flgs, TR_DRAIN_EXP))
897 creature_ptr->cursed |= TRC_DRAIN_EXP;
898 if (has_flag(flgs, TR_TY_CURSE))
899 creature_ptr->cursed |= TRC_TY_CURSE;
900 if (has_flag(flgs, TR_ADD_L_CURSE))
901 creature_ptr->cursed |= TRC_ADD_L_CURSE;
902 if (has_flag(flgs, TR_ADD_H_CURSE))
903 creature_ptr->cursed |= TRC_ADD_H_CURSE;
904 if (has_flag(flgs, TR_DRAIN_HP))
905 creature_ptr->cursed |= TRC_DRAIN_HP;
906 if (has_flag(flgs, TR_DRAIN_MANA))
907 creature_ptr->cursed |= TRC_DRAIN_MANA;
908 if (has_flag(flgs, TR_CALL_ANIMAL))
909 creature_ptr->cursed |= TRC_CALL_ANIMAL;
910 if (has_flag(flgs, TR_CALL_DEMON))
911 creature_ptr->cursed |= TRC_CALL_DEMON;
912 if (has_flag(flgs, TR_CALL_DRAGON))
913 creature_ptr->cursed |= TRC_CALL_DRAGON;
914 if (has_flag(flgs, TR_CALL_UNDEAD))
915 creature_ptr->cursed |= TRC_CALL_UNDEAD;
916 if (has_flag(flgs, TR_COWARDICE))
917 creature_ptr->cursed |= TRC_COWARDICE;
918 if (has_flag(flgs, TR_LOW_MELEE))
919 creature_ptr->cursed |= TRC_LOW_MELEE;
920 if (has_flag(flgs, TR_LOW_AC))
921 creature_ptr->cursed |= TRC_LOW_AC;
922 if (has_flag(flgs, TR_LOW_MAGIC))
923 creature_ptr->cursed |= TRC_LOW_MAGIC;
924 if (has_flag(flgs, TR_FAST_DIGEST))
925 creature_ptr->cursed |= TRC_FAST_DIGEST;
926 if (has_flag(flgs, TR_SLOW_REGEN))
927 creature_ptr->cursed |= TRC_SLOW_REGEN;
929 creature_ptr->cursed |= (o_ptr->curse_flags & (0xFFFFFFF0L));
930 if (o_ptr->name1 == ART_CHAINSWORD)
931 creature_ptr->cursed |= TRC_CHAINSWORD;
933 if (has_flag(flgs, TR_TELEPORT)) {
934 if (object_is_cursed(o_ptr))
935 creature_ptr->cursed |= TRC_TELEPORT;
937 concptr insc = quark_str(o_ptr->inscription);
939 /* {.} will stop random teleportation. */
940 if (o_ptr->inscription && angband_strchr(insc, '.')) {
942 creature_ptr->cursed |= TRC_TELEPORT_SELF;
948 if (creature_ptr->cursed & TRC_TELEPORT)
949 creature_ptr->cursed &= ~(TRC_TELEPORT_SELF);
951 if ((is_specific_player_race(creature_ptr, RACE_S_FAIRY)) && (creature_ptr->pseikaku != PERSONALITY_SEXY) && (creature_ptr->cursed & TRC_AGGRAVATE)) {
952 creature_ptr->cursed &= ~(TRC_AGGRAVATE);
956 BIT_FLAGS has_impact(player_type *creature_ptr)
958 return check_equipment_flags(creature_ptr, TR_IMPACT);
961 void has_extra_blow(player_type *creature_ptr)
964 BIT_FLAGS flgs[TR_FLAG_SIZE];
965 creature_ptr->extra_blows[0] = creature_ptr->extra_blows[1] = 0;
967 for (inventory_slot_type i = INVEN_RARM; i < INVEN_TOTAL; i++) {
968 o_ptr = &creature_ptr->inventory_list[i];
972 object_flags(creature_ptr, o_ptr, flgs);
973 if (has_flag(flgs, TR_BLOWS)) {
974 if ((i == INVEN_RARM || i == INVEN_RIGHT) && !has_two_handed_weapons(creature_ptr))
975 creature_ptr->extra_blows[0] += o_ptr->pval;
976 else if ((i == INVEN_LARM || i == INVEN_LEFT) && !has_two_handed_weapons(creature_ptr))
977 creature_ptr->extra_blows[1] += o_ptr->pval;
979 creature_ptr->extra_blows[0] += o_ptr->pval;
980 creature_ptr->extra_blows[1] += o_ptr->pval;
986 BIT_FLAGS has_resist_acid(player_type *creature_ptr)
988 BIT_FLAGS result = 0L;
990 if (creature_ptr->mimic_form == MIMIC_DEMON_LORD) {
991 result |= 0x01 << FLAG_CAUSE_RACE;
992 } else if (is_specific_player_race(creature_ptr, RACE_YEEK) || is_specific_player_race(creature_ptr, RACE_KLACKON)) {
993 result |= 0x01 << FLAG_CAUSE_RACE;
994 } else if (is_specific_player_race(creature_ptr, RACE_DRACONIAN) && creature_ptr->lev > 14) {
995 result |= 0x01 << FLAG_CAUSE_RACE;
998 if (creature_ptr->special_defense & KAMAE_SEIRYU || creature_ptr->special_defense & KATA_MUSOU) {
999 result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
1002 if (creature_ptr->ult_res) {
1003 result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1006 result |= has_immune_acid(creature_ptr);
1008 result |= check_equipment_flags(creature_ptr, TR_RES_ACID);
1012 BIT_FLAGS has_vuln_acid(player_type *creature_ptr)
1014 BIT_FLAGS result = 0L;
1015 if (creature_ptr->muta3 & MUT3_VULN_ELEM) {
1016 result |= 0x01 << FLAG_CAUSE_MUTATION;
1019 if (creature_ptr->special_defense & KATA_KOUKIJIN) {
1020 result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
1025 BIT_FLAGS has_resist_elec(player_type *creature_ptr)
1027 BIT_FLAGS result = 0L;
1029 if (creature_ptr->mimic_form == MIMIC_DEMON_LORD) {
1030 result |= 0x01 << FLAG_CAUSE_RACE;
1031 } else if (is_specific_player_race(creature_ptr, RACE_DRACONIAN) && creature_ptr->lev > 19) {
1032 result |= 0x01 << FLAG_CAUSE_RACE;
1035 if (creature_ptr->special_defense & KAMAE_SEIRYU || creature_ptr->special_defense & KATA_MUSOU) {
1036 result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
1039 if (creature_ptr->ult_res) {
1040 result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1043 result |= check_equipment_flags(creature_ptr, TR_RES_ELEC);
1044 result |= has_immune_elec(creature_ptr);
1048 BIT_FLAGS has_vuln_elec(player_type *creature_ptr)
1050 BIT_FLAGS result = 0L;
1051 if (creature_ptr->muta3 & MUT3_VULN_ELEM) {
1052 result |= 0x01 << FLAG_CAUSE_MUTATION;
1055 if (is_specific_player_race(creature_ptr, RACE_ANDROID)) {
1056 result |= 0x01 << FLAG_CAUSE_RACE;
1059 if (creature_ptr->special_defense & KATA_KOUKIJIN) {
1060 result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
1065 BIT_FLAGS has_resist_fire(player_type *creature_ptr)
1067 BIT_FLAGS result = 0L;
1069 if (creature_ptr->mimic_form == MIMIC_DEMON || creature_ptr->mimic_form == MIMIC_DEMON_LORD) {
1070 result |= 0x01 << FLAG_CAUSE_RACE;
1073 if (is_specific_player_race(creature_ptr, RACE_DRACONIAN) && creature_ptr->lev > 4) {
1074 result |= 0x01 << FLAG_CAUSE_RACE;
1077 if (!creature_ptr->mimic_form && (creature_ptr->prace == RACE_IMP || creature_ptr->prace == RACE_BALROG)) {
1078 result |= 0x01 << FLAG_CAUSE_RACE;
1081 if (creature_ptr->special_defense & KAMAE_SEIRYU || creature_ptr->special_defense & KATA_MUSOU) {
1082 result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
1085 if (creature_ptr->ult_res) {
1086 result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1089 result |= check_equipment_flags(creature_ptr, TR_RES_FIRE);
1090 result |= has_immune_fire(creature_ptr);
1094 BIT_FLAGS has_vuln_fire(player_type *creature_ptr)
1096 BIT_FLAGS result = 0L;
1097 if (creature_ptr->muta3 & MUT3_VULN_ELEM) {
1098 result |= 0x01 << FLAG_CAUSE_MUTATION;
1101 if (is_specific_player_race(creature_ptr, RACE_ENT)) {
1102 result |= 0x01 << FLAG_CAUSE_RACE;
1105 if (creature_ptr->special_defense & KATA_KOUKIJIN) {
1106 result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
1111 BIT_FLAGS has_resist_cold(player_type *creature_ptr)
1113 BIT_FLAGS result = 0L;
1115 if (creature_ptr->mimic_form == MIMIC_DEMON_LORD || creature_ptr->mimic_form == MIMIC_VAMPIRE) {
1116 result |= 0x01 << FLAG_CAUSE_RACE;
1119 if (!creature_ptr->mimic_form && (creature_ptr->prace == RACE_ZOMBIE) && creature_ptr->lev > 4) {
1120 result |= 0x01 << FLAG_CAUSE_RACE;
1123 if ((is_specific_player_race(creature_ptr, RACE_DRACONIAN) || is_specific_player_race(creature_ptr, RACE_SKELETON)) && creature_ptr->lev > 9) {
1124 result |= 0x01 << FLAG_CAUSE_RACE;
1127 if (!creature_ptr->mimic_form && (creature_ptr->prace == RACE_VAMPIRE || creature_ptr->prace == RACE_SPECTRE)) {
1128 result |= 0x01 << FLAG_CAUSE_RACE;
1131 if (creature_ptr->special_defense & KAMAE_SEIRYU || creature_ptr->special_defense & KATA_MUSOU) {
1132 result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
1135 if (creature_ptr->ult_res) {
1136 result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1139 result |= check_equipment_flags(creature_ptr, TR_RES_COLD);
1140 result |= has_immune_cold(creature_ptr);
1144 BIT_FLAGS has_vuln_cold(player_type *creature_ptr)
1146 BIT_FLAGS result = 0L;
1147 if (creature_ptr->muta3 & MUT3_VULN_ELEM) {
1148 result |= 0x01 << FLAG_CAUSE_MUTATION;
1151 if (creature_ptr->special_defense & KATA_KOUKIJIN) {
1152 result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
1157 BIT_FLAGS has_resist_pois(player_type *creature_ptr)
1159 BIT_FLAGS result = 0L;
1161 if (creature_ptr->pclass == CLASS_NINJA && creature_ptr->lev > 19)
1162 result |= 0x01 << FLAG_CAUSE_CLASS;
1164 if (creature_ptr->mimic_form == MIMIC_VAMPIRE || creature_ptr->mimic_form == MIMIC_DEMON_LORD) {
1165 result |= 0x01 << FLAG_CAUSE_RACE;
1168 if (is_specific_player_race(creature_ptr, RACE_DRACONIAN) && creature_ptr->lev > 34) {
1169 result |= 0x01 << FLAG_CAUSE_RACE;
1172 if (!creature_ptr->mimic_form
1173 && (creature_ptr->prace == RACE_KOBOLD || creature_ptr->prace == RACE_GOLEM || creature_ptr->prace == RACE_SKELETON
1174 || creature_ptr->prace == RACE_VAMPIRE || creature_ptr->prace == RACE_SPECTRE || creature_ptr->prace == RACE_ANDROID)) {
1175 result |= 0x01 << FLAG_CAUSE_RACE;
1178 if (creature_ptr->special_defense & KAMAE_SEIRYU || creature_ptr->special_defense & KATA_MUSOU) {
1179 result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
1182 if (creature_ptr->ult_res) {
1183 result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1186 result |= check_equipment_flags(creature_ptr, TR_RES_POIS);
1190 BIT_FLAGS has_resist_conf(player_type *creature_ptr)
1192 BIT_FLAGS result = 0L;
1194 if (creature_ptr->pclass == CLASS_MINDCRAFTER && creature_ptr->lev > 29)
1195 result |= 0x01 << FLAG_CAUSE_CLASS;
1197 if (creature_ptr->pseikaku == PERSONALITY_CHARGEMAN || creature_ptr->pseikaku == PERSONALITY_MUNCHKIN) {
1198 result |= 0x01 << FLAG_CAUSE_PERSONALITY;
1201 if (!creature_ptr->mimic_form && (creature_ptr->prace == RACE_KLACKON || creature_ptr->prace == RACE_BEASTMAN || creature_ptr->prace == RACE_KUTAR)) {
1202 result |= 0x01 << FLAG_CAUSE_RACE;
1205 if (creature_ptr->mimic_form == MIMIC_DEMON_LORD) {
1206 result |= 0x01 << FLAG_CAUSE_RACE;
1209 if (creature_ptr->ult_res || creature_ptr->magicdef) {
1210 result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1213 if (creature_ptr->special_defense & KATA_MUSOU) {
1214 result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
1217 result |= check_equipment_flags(creature_ptr, TR_RES_CONF);
1221 BIT_FLAGS has_resist_sound(player_type *creature_ptr)
1223 BIT_FLAGS result = 0L;
1225 if (creature_ptr->pclass == CLASS_BARD) {
1226 result |= 0x01 << FLAG_CAUSE_CLASS;
1229 if (!creature_ptr->mimic_form && (creature_ptr->prace == RACE_CYCLOPS || creature_ptr->prace == RACE_BEASTMAN)) {
1230 result |= 0x01 << FLAG_CAUSE_RACE;
1233 if (creature_ptr->special_defense & KATA_MUSOU) {
1234 result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
1237 if (creature_ptr->ult_res) {
1238 result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1241 result |= check_equipment_flags(creature_ptr, TR_RES_SOUND);
1245 BIT_FLAGS has_resist_lite(player_type *creature_ptr)
1247 BIT_FLAGS result = 0L;
1249 if (!creature_ptr->mimic_form && (creature_ptr->prace == RACE_ELF || creature_ptr->prace == RACE_HIGH_ELF || creature_ptr->prace == RACE_SPRITE)) {
1250 result |= 0x01 << FLAG_CAUSE_RACE;
1253 if (creature_ptr->special_defense & KATA_MUSOU) {
1254 result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
1257 if (creature_ptr->ult_res) {
1258 result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1261 result |= check_equipment_flags(creature_ptr, TR_RES_LITE);
1265 BIT_FLAGS has_vuln_lite(player_type *creature_ptr)
1267 BIT_FLAGS result = 0L;
1268 if (is_specific_player_race(creature_ptr, RACE_S_FAIRY) || is_specific_player_race(creature_ptr, RACE_VAMPIRE)
1269 || (creature_ptr->mimic_form == MIMIC_VAMPIRE)) {
1270 result |= 0x01 << FLAG_CAUSE_RACE;
1273 if (creature_ptr->wraith_form) {
1274 result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1280 BIT_FLAGS has_resist_dark(player_type *creature_ptr)
1282 BIT_FLAGS result = 0L;
1284 if (creature_ptr->mimic_form == MIMIC_VAMPIRE) {
1285 result |= 0x01 << FLAG_CAUSE_RACE;
1288 if (!creature_ptr->mimic_form
1289 && (creature_ptr->prace == RACE_HALF_ORC || creature_ptr->prace == RACE_HALF_OGRE || creature_ptr->prace == RACE_NIBELUNG
1290 || creature_ptr->prace == RACE_DARK_ELF || creature_ptr->prace == RACE_VAMPIRE)) {
1291 result |= 0x01 << FLAG_CAUSE_RACE;
1294 if (creature_ptr->special_defense & KATA_MUSOU) {
1295 result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
1298 if (creature_ptr->ult_res) {
1299 result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1302 result |= check_equipment_flags(creature_ptr, TR_RES_DARK);
1306 BIT_FLAGS has_resist_chaos(player_type *creature_ptr)
1308 BIT_FLAGS result = 0L;
1310 if (creature_ptr->pclass == CLASS_CHAOS_WARRIOR && creature_ptr->lev > 29)
1311 result |= 0x01 << FLAG_CAUSE_CLASS;
1313 if (creature_ptr->mimic_form == MIMIC_DEMON || creature_ptr->mimic_form == MIMIC_DEMON_LORD) {
1314 result |= 0x01 << FLAG_CAUSE_RACE;
1317 if (!creature_ptr->mimic_form && creature_ptr->prace == RACE_HALF_TITAN)
1318 result |= 0x01 << FLAG_CAUSE_RACE;
1320 if (creature_ptr->special_defense & KATA_MUSOU) {
1321 result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
1324 if (creature_ptr->ult_res) {
1325 result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1328 result |= check_equipment_flags(creature_ptr, TR_RES_CHAOS);
1332 BIT_FLAGS has_resist_disen(player_type *creature_ptr)
1334 BIT_FLAGS result = 0L;
1336 if (creature_ptr->mimic_form == MIMIC_DEMON_LORD) {
1337 result |= 0x01 << FLAG_CAUSE_RACE;
1340 if (!creature_ptr->mimic_form && creature_ptr->prace == RACE_NIBELUNG)
1341 result |= 0x01 << FLAG_CAUSE_RACE;
1343 if (creature_ptr->special_defense & KATA_MUSOU) {
1344 result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
1347 if (creature_ptr->ult_res) {
1348 result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1351 result |= check_equipment_flags(creature_ptr, TR_RES_DISEN);
1355 BIT_FLAGS has_resist_shard(player_type *creature_ptr)
1357 BIT_FLAGS result = 0L;
1359 if (!creature_ptr->mimic_form && (creature_ptr->prace == RACE_HALF_TITAN || creature_ptr->prace == RACE_SKELETON))
1360 result |= 0x01 << FLAG_CAUSE_RACE;
1362 if (creature_ptr->special_defense & KATA_MUSOU) {
1363 result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
1366 if (creature_ptr->ult_res) {
1367 result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1370 result |= check_equipment_flags(creature_ptr, TR_RES_SHARDS);
1374 BIT_FLAGS has_resist_nexus(player_type *creature_ptr)
1376 BIT_FLAGS result = 0L;
1378 if (creature_ptr->mimic_form == MIMIC_DEMON_LORD) {
1379 result |= 0x01 << FLAG_CAUSE_RACE;
1382 if (creature_ptr->special_defense & KATA_MUSOU) {
1383 result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
1386 if (creature_ptr->ult_res) {
1387 result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1390 result |= check_equipment_flags(creature_ptr, TR_RES_NEXUS);
1394 BIT_FLAGS has_resist_blind(player_type *creature_ptr)
1396 BIT_FLAGS result = 0L;
1398 if (creature_ptr->pseikaku == PERSONALITY_MUNCHKIN) {
1399 result |= 0x01 << FLAG_CAUSE_PERSONALITY;
1402 if (!creature_ptr->mimic_form && creature_ptr->prace == RACE_DWARF)
1403 result |= 0x01 << FLAG_CAUSE_RACE;
1405 if (creature_ptr->special_defense & KATA_MUSOU) {
1406 result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
1409 if (creature_ptr->ult_res || creature_ptr->magicdef) {
1410 result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1413 result |= check_equipment_flags(creature_ptr, TR_RES_BLIND);
1417 BIT_FLAGS has_resist_neth(player_type *creature_ptr)
1419 BIT_FLAGS result = 0L;
1421 if (creature_ptr->mimic_form == MIMIC_DEMON_LORD || creature_ptr->mimic_form == MIMIC_DEMON || creature_ptr->mimic_form == MIMIC_VAMPIRE) {
1422 result |= 0x01 << FLAG_CAUSE_RACE;
1425 if (!creature_ptr->mimic_form
1426 && (creature_ptr->prace == RACE_ZOMBIE || creature_ptr->prace == RACE_VAMPIRE || creature_ptr->prace == RACE_SPECTRE
1427 || creature_ptr->prace == RACE_BALROG))
1428 result |= 0x01 << FLAG_CAUSE_RACE;
1430 if (creature_ptr->special_defense & KATA_MUSOU) {
1431 result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
1434 if (creature_ptr->ult_res || creature_ptr->tim_res_nether) {
1435 result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1438 result |= check_equipment_flags(creature_ptr, TR_RES_NETHER);
1442 BIT_FLAGS has_resist_time(player_type *creature_ptr)
1444 BIT_FLAGS result = 0L;
1446 if (creature_ptr->tim_res_time) {
1447 result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1450 result |= check_equipment_flags(creature_ptr, TR_RES_TIME);
1454 BIT_FLAGS has_resist_water(player_type *creature_ptr)
1456 BIT_FLAGS result = 0L;
1458 if (!creature_ptr->mimic_form && creature_ptr->prace == RACE_MERFOLK)
1459 result |= 0x01 << FLAG_CAUSE_RACE;
1461 result |= check_equipment_flags(creature_ptr, TR_RES_WATER);
1465 BIT_FLAGS has_resist_fear(player_type *creature_ptr)
1467 BIT_FLAGS result = 0L;
1469 if (creature_ptr->muta3 & MUT3_FEARLESS)
1470 result |= 0x01 << FLAG_CAUSE_MUTATION;
1472 switch (creature_ptr->pclass) {
1475 if (creature_ptr->lev > 29)
1476 result |= 0x01 << FLAG_CAUSE_CLASS;
1479 case CLASS_CHAOS_WARRIOR:
1480 if (creature_ptr->lev > 39)
1481 result |= 0x01 << FLAG_CAUSE_CLASS;
1483 case CLASS_MINDCRAFTER:
1484 if (creature_ptr->lev > 9)
1485 result |= 0x01 << FLAG_CAUSE_CLASS;
1488 result |= 0x01 << FLAG_CAUSE_CLASS;
1492 if (creature_ptr->mimic_form == MIMIC_DEMON_LORD) {
1493 result |= 0x01 << FLAG_CAUSE_RACE;
1496 if (!creature_ptr->mimic_form && creature_ptr->prace == RACE_BARBARIAN)
1497 result |= 0x01 << FLAG_CAUSE_RACE;
1499 if ((creature_ptr->special_defense & KATA_MUSOU)) {
1500 result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
1503 if (is_hero(creature_ptr) || is_shero(creature_ptr) || creature_ptr->ult_res) {
1504 result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1507 result |= check_equipment_flags(creature_ptr, TR_RES_FEAR);
1511 BIT_FLAGS has_immune_acid(player_type *creature_ptr)
1513 BIT_FLAGS result = 0L;
1514 if (!creature_ptr->mimic_form && creature_ptr->prace == RACE_YEEK && creature_ptr->lev > 19)
1515 result |= 0x01 << FLAG_CAUSE_RACE;
1517 if (creature_ptr->ele_immune) {
1518 if (creature_ptr->special_defense & DEFENSE_ACID)
1519 result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1522 result |= check_equipment_flags(creature_ptr, TR_IM_ACID);
1526 BIT_FLAGS has_immune_elec(player_type *creature_ptr)
1528 BIT_FLAGS result = 0L;
1530 if (creature_ptr->ele_immune) {
1531 if (creature_ptr->special_defense & DEFENSE_ELEC)
1532 result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1535 result |= check_equipment_flags(creature_ptr, TR_IM_ELEC);
1539 BIT_FLAGS has_immune_fire(player_type *creature_ptr)
1541 BIT_FLAGS result = 0L;
1543 if (creature_ptr->ele_immune) {
1544 if (creature_ptr->special_defense & DEFENSE_FIRE)
1545 result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1548 result |= check_equipment_flags(creature_ptr, TR_IM_FIRE);
1552 BIT_FLAGS has_immune_cold(player_type *creature_ptr)
1554 BIT_FLAGS result = 0L;
1556 if (creature_ptr->ele_immune) {
1557 if (creature_ptr->special_defense & DEFENSE_COLD)
1558 result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1561 result |= check_equipment_flags(creature_ptr, TR_IM_COLD);
1565 BIT_FLAGS has_immune_dark(player_type *creature_ptr)
1567 BIT_FLAGS result = 0L;
1569 if (is_specific_player_race(creature_ptr, RACE_VAMPIRE) || (creature_ptr->mimic_form == MIMIC_VAMPIRE)) {
1570 result |= 0x01 << FLAG_CAUSE_RACE;
1573 if (creature_ptr->wraith_form) {
1574 result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1581 * @brief 右手(利き手)が武器を持っているかどうかを判定する
1582 * @detail Includes martial arts and hand combats as weapons.
1584 bool has_right_hand_weapon(player_type *creature_ptr)
1586 if (has_melee_weapon(creature_ptr, INVEN_RARM))
1589 if ((empty_hands(creature_ptr, TRUE) & EMPTY_HAND_RARM) && !has_left_hand_weapon(creature_ptr))
1596 * @brief 左手(非利き手)が武器を持っているかどうかを判定する
1597 * @detail Exclude martial arts and hand combats from weapons.
1599 bool has_left_hand_weapon(player_type *creature_ptr) { return has_melee_weapon(creature_ptr, INVEN_LARM); }
1601 bool has_two_handed_weapons(player_type *creature_ptr)
1603 if (can_two_hands_wielding(creature_ptr)) {
1604 if (has_right_hand_weapon(creature_ptr) && (empty_hands(creature_ptr, FALSE) == EMPTY_HAND_LARM)
1605 && object_allow_two_hands_wielding(&creature_ptr->inventory_list[INVEN_RARM])) {
1607 } else if (has_left_hand_weapon(creature_ptr) && (empty_hands(creature_ptr, FALSE) == EMPTY_HAND_RARM)
1608 && object_allow_two_hands_wielding(&creature_ptr->inventory_list[INVEN_LARM])) {
1615 BIT_FLAGS has_lite(player_type *creature_ptr)
1617 BIT_FLAGS result = 0L;
1618 if (creature_ptr->pclass == CLASS_NINJA)
1621 if (creature_ptr->pseikaku == PERSONALITY_MUNCHKIN) {
1622 result |= 0x01 << FLAG_CAUSE_PERSONALITY;
1625 if (creature_ptr->mimic_form == MIMIC_VAMPIRE) {
1626 result |= 0x01 << FLAG_CAUSE_RACE;
1629 if (!creature_ptr->mimic_form && creature_ptr->prace == RACE_VAMPIRE)
1630 result |= 0x01 << FLAG_CAUSE_RACE;
1632 if (creature_ptr->ult_res) {
1633 result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1636 if (creature_ptr->special_defense & KATA_MUSOU) {
1637 result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
1640 result |= has_sh_fire(creature_ptr);
1646 * @brief 両手持ちボーナスがもらえないかどうかを判定する。 / Does *not * get two hand wielding bonus.
1648 * Only can get hit bonuses when wieids an enough light weapon which is lighter than 5 times of weight limit.
1649 * If its weight is 10 times heavier or more than weight limit, gets hit penalty in calc_to_hit().
1651 bool has_disable_two_handed_bonus(player_type *creature_ptr, int i)
1653 if (has_melee_weapon(creature_ptr, INVEN_RARM + i) && has_two_handed_weapons(creature_ptr)) {
1654 object_type *o_ptr = &creature_ptr->inventory_list[INVEN_RARM + i];
1655 int limit = calc_weapon_weight_limit(creature_ptr) * 2;
1657 /* Enable when two hand wields an enough light weapon */
1658 if (limit >= o_ptr->weight / 5)
1662 /* Disable when empty hands, one hand wieldings and heavy weapons */
1666 bool has_icky_wield_weapon(player_type *creature_ptr, int i)
1669 BIT_FLAGS flgs[TR_FLAG_SIZE];
1670 o_ptr = &creature_ptr->inventory_list[INVEN_RARM + i];
1671 object_flags(creature_ptr, o_ptr, flgs);
1673 if ((creature_ptr->pclass == CLASS_PRIEST) && (!(has_flag(flgs, TR_BLESSED))) && ((o_ptr->tval == TV_SWORD) || (o_ptr->tval == TV_POLEARM))) {
1675 } else if (creature_ptr->pclass == CLASS_SORCERER) {
1676 if (!((o_ptr->tval == TV_HAFTED) && ((o_ptr->sval == SV_WIZSTAFF) || (o_ptr->sval == SV_NAMAKE_HAMMER)))) {
1680 if (has_not_monk_weapon(creature_ptr, i) || has_not_ninja_weapon(creature_ptr, i)) {
1686 bool has_riding_wield_weapon(player_type *creature_ptr, int i)
1689 BIT_FLAGS flgs[TR_FLAG_SIZE];
1690 o_ptr = &creature_ptr->inventory_list[INVEN_RARM + i];
1691 object_flags(creature_ptr, o_ptr, flgs);
1692 if (creature_ptr->riding != 0 && !(o_ptr->tval == TV_POLEARM) && ((o_ptr->sval == SV_LANCE) || (o_ptr->sval == SV_HEAVY_LANCE))
1693 && !has_flag(flgs, TR_RIDING)) {
1699 bool has_not_ninja_weapon(player_type *creature_ptr, int i)
1701 if (!has_melee_weapon(creature_ptr, INVEN_RARM + i)) {
1704 tval_type tval = creature_ptr->inventory_list[INVEN_RARM + i].tval - TV_WEAPON_BEGIN;
1705 OBJECT_SUBTYPE_VALUE sval = creature_ptr->inventory_list[INVEN_RARM + i].sval;
1706 return creature_ptr->pclass == CLASS_NINJA
1707 && !((s_info[CLASS_NINJA].w_max[tval][sval] > WEAPON_EXP_BEGINNER) && (creature_ptr->inventory_list[INVEN_LARM - i].tval != TV_SHIELD));
1710 bool has_not_monk_weapon(player_type *creature_ptr, int i)
1712 if (!has_melee_weapon(creature_ptr, INVEN_RARM + i)) {
1715 tval_type tval = creature_ptr->inventory_list[INVEN_RARM + i].tval - TV_WEAPON_BEGIN;
1716 OBJECT_SUBTYPE_VALUE sval = creature_ptr->inventory_list[INVEN_RARM + i].sval;
1717 return ((creature_ptr->pclass == CLASS_MONK) || (creature_ptr->pclass == CLASS_FORCETRAINER))
1718 && !(s_info[creature_ptr->pclass].w_max[tval][sval]);
1721 bool has_good_luck(player_type *creature_ptr) { return (creature_ptr->pseikaku == PERSONALITY_LUCKY) || (creature_ptr->muta3 & MUT3_GOOD_LUCK); }