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);
952 BIT_FLAGS has_impact(player_type *creature_ptr)
954 return check_equipment_flags(creature_ptr, TR_IMPACT);
957 void has_extra_blow(player_type *creature_ptr)
960 BIT_FLAGS flgs[TR_FLAG_SIZE];
961 creature_ptr->extra_blows[0] = creature_ptr->extra_blows[1] = 0;
963 for (inventory_slot_type i = INVEN_RARM; i < INVEN_TOTAL; i++) {
964 o_ptr = &creature_ptr->inventory_list[i];
968 object_flags(creature_ptr, o_ptr, flgs);
969 if (has_flag(flgs, TR_BLOWS)) {
970 if ((i == INVEN_RARM || i == INVEN_RIGHT) && !has_two_handed_weapons(creature_ptr))
971 creature_ptr->extra_blows[0] += o_ptr->pval;
972 else if ((i == INVEN_LARM || i == INVEN_LEFT) && !has_two_handed_weapons(creature_ptr))
973 creature_ptr->extra_blows[1] += o_ptr->pval;
975 creature_ptr->extra_blows[0] += o_ptr->pval;
976 creature_ptr->extra_blows[1] += o_ptr->pval;
982 BIT_FLAGS has_resist_acid(player_type *creature_ptr)
984 BIT_FLAGS result = 0L;
986 if (creature_ptr->mimic_form == MIMIC_DEMON_LORD) {
987 result |= 0x01 << FLAG_CAUSE_RACE;
988 } else if (is_specific_player_race(creature_ptr, RACE_YEEK) || is_specific_player_race(creature_ptr, RACE_KLACKON)) {
989 result |= 0x01 << FLAG_CAUSE_RACE;
990 } else if (is_specific_player_race(creature_ptr, RACE_DRACONIAN) && creature_ptr->lev > 14) {
991 result |= 0x01 << FLAG_CAUSE_RACE;
994 if (creature_ptr->special_defense & KAMAE_SEIRYU || creature_ptr->special_defense & KATA_MUSOU) {
995 result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
998 if (creature_ptr->ult_res) {
999 result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1002 result |= has_immune_acid(creature_ptr);
1004 result |= check_equipment_flags(creature_ptr, TR_RES_ACID);
1008 BIT_FLAGS has_vuln_acid(player_type *creature_ptr)
1010 BIT_FLAGS result = 0L;
1011 if (creature_ptr->muta3 & MUT3_VULN_ELEM) {
1012 result |= 0x01 << FLAG_CAUSE_MUTATION;
1015 if (creature_ptr->special_defense & KATA_KOUKIJIN) {
1016 result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
1021 BIT_FLAGS has_resist_elec(player_type *creature_ptr)
1023 BIT_FLAGS result = 0L;
1025 if (creature_ptr->mimic_form == MIMIC_DEMON_LORD) {
1026 result |= 0x01 << FLAG_CAUSE_RACE;
1027 } else if (is_specific_player_race(creature_ptr, RACE_DRACONIAN) && creature_ptr->lev > 19) {
1028 result |= 0x01 << FLAG_CAUSE_RACE;
1031 if (creature_ptr->special_defense & KAMAE_SEIRYU || creature_ptr->special_defense & KATA_MUSOU) {
1032 result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
1035 if (creature_ptr->ult_res) {
1036 result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1039 result |= check_equipment_flags(creature_ptr, TR_RES_ELEC);
1040 result |= has_immune_elec(creature_ptr);
1044 BIT_FLAGS has_vuln_elec(player_type *creature_ptr)
1046 BIT_FLAGS result = 0L;
1047 if (creature_ptr->muta3 & MUT3_VULN_ELEM) {
1048 result |= 0x01 << FLAG_CAUSE_MUTATION;
1051 if (is_specific_player_race(creature_ptr, RACE_ANDROID)) {
1052 result |= 0x01 << FLAG_CAUSE_RACE;
1055 if (creature_ptr->special_defense & KATA_KOUKIJIN) {
1056 result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
1061 BIT_FLAGS has_resist_fire(player_type *creature_ptr)
1063 BIT_FLAGS result = 0L;
1065 if (creature_ptr->mimic_form == MIMIC_DEMON || creature_ptr->mimic_form == MIMIC_DEMON_LORD) {
1066 result |= 0x01 << FLAG_CAUSE_RACE;
1069 if (is_specific_player_race(creature_ptr, RACE_DRACONIAN) && creature_ptr->lev > 4) {
1070 result |= 0x01 << FLAG_CAUSE_RACE;
1073 if (!creature_ptr->mimic_form && (creature_ptr->prace == RACE_IMP || creature_ptr->prace == RACE_BALROG)) {
1074 result |= 0x01 << FLAG_CAUSE_RACE;
1077 if (creature_ptr->special_defense & KAMAE_SEIRYU || creature_ptr->special_defense & KATA_MUSOU) {
1078 result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
1081 if (creature_ptr->ult_res) {
1082 result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1085 result |= check_equipment_flags(creature_ptr, TR_RES_FIRE);
1086 result |= has_immune_fire(creature_ptr);
1090 BIT_FLAGS has_vuln_fire(player_type *creature_ptr)
1092 BIT_FLAGS result = 0L;
1093 if (creature_ptr->muta3 & MUT3_VULN_ELEM) {
1094 result |= 0x01 << FLAG_CAUSE_MUTATION;
1097 if (is_specific_player_race(creature_ptr, RACE_ENT)) {
1098 result |= 0x01 << FLAG_CAUSE_RACE;
1101 if (creature_ptr->special_defense & KATA_KOUKIJIN) {
1102 result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
1107 BIT_FLAGS has_resist_cold(player_type *creature_ptr)
1109 BIT_FLAGS result = 0L;
1111 if (creature_ptr->mimic_form == MIMIC_DEMON_LORD || creature_ptr->mimic_form == MIMIC_VAMPIRE) {
1112 result |= 0x01 << FLAG_CAUSE_RACE;
1115 if (!creature_ptr->mimic_form && (creature_ptr->prace == RACE_ZOMBIE) && creature_ptr->lev > 4) {
1116 result |= 0x01 << FLAG_CAUSE_RACE;
1119 if ((is_specific_player_race(creature_ptr, RACE_DRACONIAN) || is_specific_player_race(creature_ptr, RACE_SKELETON)) && creature_ptr->lev > 9) {
1120 result |= 0x01 << FLAG_CAUSE_RACE;
1123 if (!creature_ptr->mimic_form && (creature_ptr->prace == RACE_VAMPIRE || creature_ptr->prace == RACE_SPECTRE)) {
1124 result |= 0x01 << FLAG_CAUSE_RACE;
1127 if (creature_ptr->special_defense & KAMAE_SEIRYU || creature_ptr->special_defense & KATA_MUSOU) {
1128 result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
1131 if (creature_ptr->ult_res) {
1132 result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1135 result |= check_equipment_flags(creature_ptr, TR_RES_COLD);
1136 result |= has_immune_cold(creature_ptr);
1140 BIT_FLAGS has_vuln_cold(player_type *creature_ptr)
1142 BIT_FLAGS result = 0L;
1143 if (creature_ptr->muta3 & MUT3_VULN_ELEM) {
1144 result |= 0x01 << FLAG_CAUSE_MUTATION;
1147 if (creature_ptr->special_defense & KATA_KOUKIJIN) {
1148 result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
1153 BIT_FLAGS has_resist_pois(player_type *creature_ptr)
1155 BIT_FLAGS result = 0L;
1157 if (creature_ptr->pclass == CLASS_NINJA && creature_ptr->lev > 19)
1158 result |= 0x01 << FLAG_CAUSE_CLASS;
1160 if (creature_ptr->mimic_form == MIMIC_VAMPIRE || creature_ptr->mimic_form == MIMIC_DEMON_LORD) {
1161 result |= 0x01 << FLAG_CAUSE_RACE;
1164 if (is_specific_player_race(creature_ptr, RACE_DRACONIAN) && creature_ptr->lev > 34) {
1165 result |= 0x01 << FLAG_CAUSE_RACE;
1168 if (!creature_ptr->mimic_form
1169 && (creature_ptr->prace == RACE_KOBOLD || creature_ptr->prace == RACE_GOLEM || creature_ptr->prace == RACE_SKELETON
1170 || creature_ptr->prace == RACE_VAMPIRE || creature_ptr->prace == RACE_SPECTRE || creature_ptr->prace == RACE_ANDROID)) {
1171 result |= 0x01 << FLAG_CAUSE_RACE;
1174 if (creature_ptr->special_defense & KAMAE_SEIRYU || creature_ptr->special_defense & KATA_MUSOU) {
1175 result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
1178 if (creature_ptr->ult_res) {
1179 result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1182 result |= check_equipment_flags(creature_ptr, TR_RES_POIS);
1186 BIT_FLAGS has_resist_conf(player_type *creature_ptr)
1188 BIT_FLAGS result = 0L;
1190 if (creature_ptr->pclass == CLASS_MINDCRAFTER && creature_ptr->lev > 29)
1191 result |= 0x01 << FLAG_CAUSE_CLASS;
1193 if (creature_ptr->pseikaku == PERSONALITY_CHARGEMAN || creature_ptr->pseikaku == PERSONALITY_MUNCHKIN) {
1194 result |= 0x01 << FLAG_CAUSE_PERSONALITY;
1197 if (!creature_ptr->mimic_form && (creature_ptr->prace == RACE_KLACKON || creature_ptr->prace == RACE_BEASTMAN || creature_ptr->prace == RACE_KUTAR)) {
1198 result |= 0x01 << FLAG_CAUSE_RACE;
1201 if (creature_ptr->mimic_form == MIMIC_DEMON_LORD) {
1202 result |= 0x01 << FLAG_CAUSE_RACE;
1205 if (creature_ptr->ult_res || creature_ptr->magicdef) {
1206 result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1209 if (creature_ptr->special_defense & KATA_MUSOU) {
1210 result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
1213 result |= check_equipment_flags(creature_ptr, TR_RES_CONF);
1217 BIT_FLAGS has_resist_sound(player_type *creature_ptr)
1219 BIT_FLAGS result = 0L;
1221 if (creature_ptr->pclass == CLASS_BARD) {
1222 result |= 0x01 << FLAG_CAUSE_CLASS;
1225 if (!creature_ptr->mimic_form && (creature_ptr->prace == RACE_CYCLOPS || creature_ptr->prace == RACE_BEASTMAN)) {
1226 result |= 0x01 << FLAG_CAUSE_RACE;
1229 if (creature_ptr->special_defense & KATA_MUSOU) {
1230 result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
1233 if (creature_ptr->ult_res) {
1234 result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1237 result |= check_equipment_flags(creature_ptr, TR_RES_SOUND);
1241 BIT_FLAGS has_resist_lite(player_type *creature_ptr)
1243 BIT_FLAGS result = 0L;
1245 if (!creature_ptr->mimic_form && (creature_ptr->prace == RACE_ELF || creature_ptr->prace == RACE_HIGH_ELF || creature_ptr->prace == RACE_SPRITE)) {
1246 result |= 0x01 << FLAG_CAUSE_RACE;
1249 if (creature_ptr->special_defense & KATA_MUSOU) {
1250 result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
1253 if (creature_ptr->ult_res) {
1254 result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1257 result |= check_equipment_flags(creature_ptr, TR_RES_LITE);
1261 BIT_FLAGS has_vuln_lite(player_type *creature_ptr)
1263 BIT_FLAGS result = 0L;
1264 if (is_specific_player_race(creature_ptr, RACE_S_FAIRY) || is_specific_player_race(creature_ptr, RACE_VAMPIRE)
1265 || (creature_ptr->mimic_form == MIMIC_VAMPIRE)) {
1266 result |= 0x01 << FLAG_CAUSE_RACE;
1269 if (creature_ptr->wraith_form) {
1270 result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1276 BIT_FLAGS has_resist_dark(player_type *creature_ptr)
1278 BIT_FLAGS result = 0L;
1280 if (creature_ptr->mimic_form == MIMIC_VAMPIRE) {
1281 result |= 0x01 << FLAG_CAUSE_RACE;
1284 if (!creature_ptr->mimic_form
1285 && (creature_ptr->prace == RACE_HALF_ORC || creature_ptr->prace == RACE_HALF_OGRE || creature_ptr->prace == RACE_NIBELUNG
1286 || creature_ptr->prace == RACE_DARK_ELF || creature_ptr->prace == RACE_VAMPIRE)) {
1287 result |= 0x01 << FLAG_CAUSE_RACE;
1290 if (creature_ptr->special_defense & KATA_MUSOU) {
1291 result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
1294 if (creature_ptr->ult_res) {
1295 result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1298 result |= check_equipment_flags(creature_ptr, TR_RES_DARK);
1302 BIT_FLAGS has_resist_chaos(player_type *creature_ptr)
1304 BIT_FLAGS result = 0L;
1306 if (creature_ptr->pclass == CLASS_CHAOS_WARRIOR && creature_ptr->lev > 29)
1307 result |= 0x01 << FLAG_CAUSE_CLASS;
1309 if (creature_ptr->mimic_form == MIMIC_DEMON || creature_ptr->mimic_form == MIMIC_DEMON_LORD) {
1310 result |= 0x01 << FLAG_CAUSE_RACE;
1313 if (!creature_ptr->mimic_form && creature_ptr->prace == RACE_HALF_TITAN)
1314 result |= 0x01 << FLAG_CAUSE_RACE;
1316 if (creature_ptr->special_defense & KATA_MUSOU) {
1317 result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
1320 if (creature_ptr->ult_res) {
1321 result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1324 result |= check_equipment_flags(creature_ptr, TR_RES_CHAOS);
1328 BIT_FLAGS has_resist_disen(player_type *creature_ptr)
1330 BIT_FLAGS result = 0L;
1332 if (creature_ptr->mimic_form == MIMIC_DEMON_LORD) {
1333 result |= 0x01 << FLAG_CAUSE_RACE;
1336 if (!creature_ptr->mimic_form && creature_ptr->prace == RACE_NIBELUNG)
1337 result |= 0x01 << FLAG_CAUSE_RACE;
1339 if (creature_ptr->special_defense & KATA_MUSOU) {
1340 result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
1343 if (creature_ptr->ult_res) {
1344 result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1347 result |= check_equipment_flags(creature_ptr, TR_RES_DISEN);
1351 BIT_FLAGS has_resist_shard(player_type *creature_ptr)
1353 BIT_FLAGS result = 0L;
1355 if (!creature_ptr->mimic_form && (creature_ptr->prace == RACE_HALF_TITAN || creature_ptr->prace == RACE_SKELETON))
1356 result |= 0x01 << FLAG_CAUSE_RACE;
1358 if (creature_ptr->special_defense & KATA_MUSOU) {
1359 result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
1362 if (creature_ptr->ult_res) {
1363 result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1366 result |= check_equipment_flags(creature_ptr, TR_RES_SHARDS);
1370 BIT_FLAGS has_resist_nexus(player_type *creature_ptr)
1372 BIT_FLAGS result = 0L;
1374 if (creature_ptr->mimic_form == MIMIC_DEMON_LORD) {
1375 result |= 0x01 << FLAG_CAUSE_RACE;
1378 if (creature_ptr->special_defense & KATA_MUSOU) {
1379 result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
1382 if (creature_ptr->ult_res) {
1383 result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1386 result |= check_equipment_flags(creature_ptr, TR_RES_NEXUS);
1390 BIT_FLAGS has_resist_blind(player_type *creature_ptr)
1392 BIT_FLAGS result = 0L;
1394 if (creature_ptr->pseikaku == PERSONALITY_MUNCHKIN) {
1395 result |= 0x01 << FLAG_CAUSE_PERSONALITY;
1398 if (!creature_ptr->mimic_form && creature_ptr->prace == RACE_DWARF)
1399 result |= 0x01 << FLAG_CAUSE_RACE;
1401 if (creature_ptr->special_defense & KATA_MUSOU) {
1402 result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
1405 if (creature_ptr->ult_res || creature_ptr->magicdef) {
1406 result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1409 result |= check_equipment_flags(creature_ptr, TR_RES_BLIND);
1413 BIT_FLAGS has_resist_neth(player_type *creature_ptr)
1415 BIT_FLAGS result = 0L;
1417 if (creature_ptr->mimic_form == MIMIC_DEMON_LORD || creature_ptr->mimic_form == MIMIC_DEMON || creature_ptr->mimic_form == MIMIC_VAMPIRE) {
1418 result |= 0x01 << FLAG_CAUSE_RACE;
1421 if (!creature_ptr->mimic_form
1422 && (creature_ptr->prace == RACE_ZOMBIE || creature_ptr->prace == RACE_VAMPIRE || creature_ptr->prace == RACE_SPECTRE
1423 || creature_ptr->prace == RACE_BALROG))
1424 result |= 0x01 << FLAG_CAUSE_RACE;
1426 if (creature_ptr->special_defense & KATA_MUSOU) {
1427 result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
1430 if (creature_ptr->ult_res || creature_ptr->tim_res_nether) {
1431 result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1434 result |= check_equipment_flags(creature_ptr, TR_RES_NETHER);
1438 BIT_FLAGS has_resist_time(player_type *creature_ptr)
1440 BIT_FLAGS result = 0L;
1442 if (creature_ptr->tim_res_time) {
1443 result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1446 result |= check_equipment_flags(creature_ptr, TR_RES_TIME);
1450 BIT_FLAGS has_resist_water(player_type *creature_ptr)
1452 BIT_FLAGS result = 0L;
1454 if (!creature_ptr->mimic_form && creature_ptr->prace == RACE_MERFOLK)
1455 result |= 0x01 << FLAG_CAUSE_RACE;
1457 result |= check_equipment_flags(creature_ptr, TR_RES_WATER);
1461 BIT_FLAGS has_resist_fear(player_type *creature_ptr)
1463 BIT_FLAGS result = 0L;
1465 if (creature_ptr->muta3 & MUT3_FEARLESS)
1466 result |= 0x01 << FLAG_CAUSE_MUTATION;
1468 switch (creature_ptr->pclass) {
1471 if (creature_ptr->lev > 29)
1472 result |= 0x01 << FLAG_CAUSE_CLASS;
1475 case CLASS_CHAOS_WARRIOR:
1476 if (creature_ptr->lev > 39)
1477 result |= 0x01 << FLAG_CAUSE_CLASS;
1479 case CLASS_MINDCRAFTER:
1480 if (creature_ptr->lev > 9)
1481 result |= 0x01 << FLAG_CAUSE_CLASS;
1484 result |= 0x01 << FLAG_CAUSE_CLASS;
1488 if (creature_ptr->mimic_form == MIMIC_DEMON_LORD) {
1489 result |= 0x01 << FLAG_CAUSE_RACE;
1492 if (!creature_ptr->mimic_form && creature_ptr->prace == RACE_BARBARIAN)
1493 result |= 0x01 << FLAG_CAUSE_RACE;
1495 if ((creature_ptr->special_defense & KATA_MUSOU)) {
1496 result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
1499 if (is_hero(creature_ptr) || is_shero(creature_ptr) || creature_ptr->ult_res) {
1500 result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1503 result |= check_equipment_flags(creature_ptr, TR_RES_FEAR);
1507 BIT_FLAGS has_immune_acid(player_type *creature_ptr)
1509 BIT_FLAGS result = 0L;
1510 if (!creature_ptr->mimic_form && creature_ptr->prace == RACE_YEEK && creature_ptr->lev > 19)
1511 result |= 0x01 << FLAG_CAUSE_RACE;
1513 if (creature_ptr->ele_immune) {
1514 if (creature_ptr->special_defense & DEFENSE_ACID)
1515 result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1518 result |= check_equipment_flags(creature_ptr, TR_IM_ACID);
1522 BIT_FLAGS has_immune_elec(player_type *creature_ptr)
1524 BIT_FLAGS result = 0L;
1526 if (creature_ptr->ele_immune) {
1527 if (creature_ptr->special_defense & DEFENSE_ELEC)
1528 result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1531 result |= check_equipment_flags(creature_ptr, TR_IM_ELEC);
1535 BIT_FLAGS has_immune_fire(player_type *creature_ptr)
1537 BIT_FLAGS result = 0L;
1539 if (creature_ptr->ele_immune) {
1540 if (creature_ptr->special_defense & DEFENSE_FIRE)
1541 result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1544 result |= check_equipment_flags(creature_ptr, TR_IM_FIRE);
1548 BIT_FLAGS has_immune_cold(player_type *creature_ptr)
1550 BIT_FLAGS result = 0L;
1552 if (creature_ptr->ele_immune) {
1553 if (creature_ptr->special_defense & DEFENSE_COLD)
1554 result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1557 result |= check_equipment_flags(creature_ptr, TR_IM_COLD);
1561 BIT_FLAGS has_immune_dark(player_type *creature_ptr)
1563 BIT_FLAGS result = 0L;
1565 if (is_specific_player_race(creature_ptr, RACE_VAMPIRE) || (creature_ptr->mimic_form == MIMIC_VAMPIRE)) {
1566 result |= 0x01 << FLAG_CAUSE_RACE;
1569 if (creature_ptr->wraith_form) {
1570 result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1577 * @brief 右手(利き手)が武器を持っているかどうかを判定する
1578 * @detail Includes martial arts and hand combats as weapons.
1580 bool has_right_hand_weapon(player_type *creature_ptr)
1582 if (has_melee_weapon(creature_ptr, INVEN_RARM))
1585 if ((empty_hands(creature_ptr, TRUE) & EMPTY_HAND_RARM) && !has_left_hand_weapon(creature_ptr))
1592 * @brief 左手(非利き手)が武器を持っているかどうかを判定する
1593 * @detail Exclude martial arts and hand combats from weapons.
1595 bool has_left_hand_weapon(player_type *creature_ptr) { return has_melee_weapon(creature_ptr, INVEN_LARM); }
1597 bool has_two_handed_weapons(player_type *creature_ptr)
1599 if (can_two_hands_wielding(creature_ptr)) {
1600 if (has_right_hand_weapon(creature_ptr) && (empty_hands(creature_ptr, FALSE) == EMPTY_HAND_LARM)
1601 && object_allow_two_hands_wielding(&creature_ptr->inventory_list[INVEN_RARM])) {
1603 } else if (has_left_hand_weapon(creature_ptr) && (empty_hands(creature_ptr, FALSE) == EMPTY_HAND_RARM)
1604 && object_allow_two_hands_wielding(&creature_ptr->inventory_list[INVEN_LARM])) {
1611 BIT_FLAGS has_lite(player_type *creature_ptr)
1613 BIT_FLAGS result = 0L;
1614 if (creature_ptr->pclass == CLASS_NINJA)
1617 if (creature_ptr->pseikaku == PERSONALITY_MUNCHKIN) {
1618 result |= 0x01 << FLAG_CAUSE_PERSONALITY;
1621 if (creature_ptr->mimic_form == MIMIC_VAMPIRE) {
1622 result |= 0x01 << FLAG_CAUSE_RACE;
1625 if (!creature_ptr->mimic_form && creature_ptr->prace == RACE_VAMPIRE)
1626 result |= 0x01 << FLAG_CAUSE_RACE;
1628 if (creature_ptr->ult_res) {
1629 result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1632 if (creature_ptr->special_defense & KATA_MUSOU) {
1633 result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
1636 result |= has_sh_fire(creature_ptr);
1642 * @brief 両手持ちボーナスがもらえないかどうかを判定する。 / Does *not * get two hand wielding bonus.
1644 * Only can get hit bonuses when wieids an enough light weapon which is lighter than 5 times of weight limit.
1645 * If its weight is 10 times heavier or more than weight limit, gets hit penalty in calc_to_hit().
1647 bool has_disable_two_handed_bonus(player_type *creature_ptr, int i)
1649 if (has_melee_weapon(creature_ptr, INVEN_RARM + i) && has_two_handed_weapons(creature_ptr)) {
1650 object_type *o_ptr = &creature_ptr->inventory_list[INVEN_RARM + i];
1651 int limit = calc_weapon_weight_limit(creature_ptr) * 2;
1653 /* Enable when two hand wields an enough light weapon */
1654 if (limit >= o_ptr->weight / 5)
1658 /* Disable when empty hands, one hand wieldings and heavy weapons */
1662 bool has_icky_wield_weapon(player_type *creature_ptr, int i)
1665 BIT_FLAGS flgs[TR_FLAG_SIZE];
1666 o_ptr = &creature_ptr->inventory_list[INVEN_RARM + i];
1667 object_flags(creature_ptr, o_ptr, flgs);
1669 if ((creature_ptr->pclass == CLASS_PRIEST) && (!(has_flag(flgs, TR_BLESSED))) && ((o_ptr->tval == TV_SWORD) || (o_ptr->tval == TV_POLEARM))) {
1671 } else if (creature_ptr->pclass == CLASS_SORCERER) {
1672 if (!((o_ptr->tval == TV_HAFTED) && ((o_ptr->sval == SV_WIZSTAFF) || (o_ptr->sval == SV_NAMAKE_HAMMER)))) {
1676 if (has_not_monk_weapon(creature_ptr, i) || has_not_ninja_weapon(creature_ptr, i)) {
1682 bool has_riding_wield_weapon(player_type *creature_ptr, int i)
1685 BIT_FLAGS flgs[TR_FLAG_SIZE];
1686 o_ptr = &creature_ptr->inventory_list[INVEN_RARM + i];
1687 object_flags(creature_ptr, o_ptr, flgs);
1688 if (creature_ptr->riding != 0 && !(o_ptr->tval == TV_POLEARM) && ((o_ptr->sval == SV_LANCE) || (o_ptr->sval == SV_HEAVY_LANCE))
1689 && !has_flag(flgs, TR_RIDING)) {
1695 bool has_not_ninja_weapon(player_type *creature_ptr, int i)
1697 if (!has_melee_weapon(creature_ptr, INVEN_RARM + i)) {
1700 tval_type tval = creature_ptr->inventory_list[INVEN_RARM + i].tval - TV_WEAPON_BEGIN;
1701 OBJECT_SUBTYPE_VALUE sval = creature_ptr->inventory_list[INVEN_RARM + i].sval;
1702 return creature_ptr->pclass == CLASS_NINJA
1703 && !((s_info[CLASS_NINJA].w_max[tval][sval] > WEAPON_EXP_BEGINNER) && (creature_ptr->inventory_list[INVEN_LARM - i].tval != TV_SHIELD));
1706 bool has_not_monk_weapon(player_type *creature_ptr, int i)
1708 if (!has_melee_weapon(creature_ptr, INVEN_RARM + i)) {
1711 tval_type tval = creature_ptr->inventory_list[INVEN_RARM + i].tval - TV_WEAPON_BEGIN;
1712 OBJECT_SUBTYPE_VALUE sval = creature_ptr->inventory_list[INVEN_RARM + i].sval;
1713 return ((creature_ptr->pclass == CLASS_MONK) || (creature_ptr->pclass == CLASS_FORCETRAINER))
1714 && !(s_info[creature_ptr->pclass].w_max[tval][sval]);
1717 bool has_good_luck(player_type *creature_ptr) { return (creature_ptr->pseikaku == PERSONALITY_LUCKY) || (creature_ptr->muta3 & MUT3_GOOD_LUCK); }
1719 BIT_FLAGS has_aggravate(player_type *creature_ptr)
1721 if (creature_ptr->cursed & TRC_AGGRAVATE) {
1722 if ((is_specific_player_race(creature_ptr, RACE_S_FAIRY)) && (creature_ptr->pseikaku != PERSONALITY_SEXY)) {
1723 return AGGRAVATE_S_FAIRY;
1725 return AGGRAVATE_NORMAL;
1728 return AGGRAVATE_NONE;