OSDN Git Service

Merge pull request #248 from dis-/feature/Refactor-resistance-checker
[hengbandforosx/hengbandosx.git] / src / player / player-status-flags.c
1 #include "player/player-status-flags.h"
2 #include "artifact/fixed-art-types.h"
3 #include "grid/grid.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"
34
35 static BIT_FLAGS check_equipment_flags(player_type *creature_ptr, tr_type tr_flag);
36
37 /*!
38  * @brief 装備による所定の特性フラグを得ているかを一括して取得する関数。
39  */
40 static BIT_FLAGS check_equipment_flags(player_type *creature_ptr, tr_type tr_flag)
41 {
42     object_type *o_ptr;
43     BIT_FLAGS flgs[TR_FLAG_SIZE];
44     BIT_FLAGS result = 0L;
45     for (inventory_slot_type i = INVEN_MAIN_HAND; i < INVEN_TOTAL; i++) {
46         o_ptr = &creature_ptr->inventory_list[i];
47         if (!o_ptr->k_idx)
48             continue;
49
50         object_flags(creature_ptr, o_ptr, flgs);
51
52         if (has_flag(flgs, tr_flag))
53             result |= 0x01U << (i - INVEN_MAIN_HAND);
54     }
55     return result;
56 }
57
58 /*!
59  * @brief クリーチャーが壁破壊進行を持っているかを返す。
60  */
61 bool has_kill_wall(player_type *creature_ptr)
62 {
63     if (creature_ptr->mimic_form == MIMIC_DEMON_LORD || music_singing(creature_ptr, MUSIC_WALL)) {
64         return TRUE;
65     }
66
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)
71             return TRUE;
72     }
73
74     return FALSE;
75 }
76
77 /*!
78  * @brief クリーチャーが壁通過を持っているかを返す。
79  * @param creature_ptr 判定対象のクリーチャー参照ポインタ
80  * @return 持っていたらTRUE
81  * @details
82  * * 時限で幽体化、壁抜けをもつか種族幽霊ならばひとまずTRUE。
83  * * 但し騎乗中は乗騎が壁抜けを持っていなければ不能になる。
84  */
85 bool has_pass_wall(player_type *creature_ptr)
86 {
87     bool pow = FALSE;
88
89     if (creature_ptr->wraith_form || creature_ptr->tim_pass_wall || (!creature_ptr->mimic_form && creature_ptr->prace == RACE_SPECTRE)) {
90         pow = TRUE;
91     }
92
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))
97             pow = FALSE;
98     }
99
100     return pow;
101 }
102
103 /*!
104  * @brief クリーチャーが強力射を持っているかを返す。
105  * @param creature_ptr 判定対象のクリーチャー参照ポインタ
106  * @return 持っていたら所持前提ビットフラグを返す。
107  */
108 BIT_FLAGS has_xtra_might(player_type *creature_ptr)
109 {
110     BIT_FLAGS result = 0L;
111     result |= check_equipment_flags(creature_ptr, TR_XTRA_MIGHT);
112     return result;
113 }
114
115 /*!
116  * @brief クリーチャーが赤外線視力修正を持っているかを返す。
117  * @param creature_ptr 判定対象のクリーチャー参照ポインタ
118  * @return 持っていたら所持前提ビットフラグを返す。
119  * @details 種族修正は0より大きければTRUEとする。
120  */
121 BIT_FLAGS has_infra_vision(player_type *creature_ptr)
122 {
123     BIT_FLAGS result = 0L;
124     const player_race *tmp_rp_ptr;
125
126     if (creature_ptr->mimic_form)
127         tmp_rp_ptr = &mimic_info[creature_ptr->mimic_form];
128     else
129         tmp_rp_ptr = &race_info[creature_ptr->prace];
130
131     if (tmp_rp_ptr->infra > 0)
132         result |= FLAG_CAUSE_RACE;
133
134     if (creature_ptr->muta3 & MUT3_INFRAVIS)
135         result |= FLAG_CAUSE_MUTATION;
136
137     if (creature_ptr->tim_infra)
138         result |= FLAG_CAUSE_MAGIC_TIME_EFFECT;
139
140     result |= check_equipment_flags(creature_ptr, TR_INFRA);
141     return result;
142 }
143
144 /*!
145  * @brief クリーチャーが邪悪感知を持っているかを返す。
146  * @param creature_ptr 判定対象のクリーチャー参照ポインタ
147  * @return 持っていたら所持前提ビットフラグを返す。
148  */
149 BIT_FLAGS has_esp_evil(player_type *creature_ptr)
150 {
151     BIT_FLAGS result = 0L;
152     if (creature_ptr->realm1 == REALM_HEX) {
153         if (hex_spelling(creature_ptr, HEX_DETECT_EVIL))
154             result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
155     }
156     result |= check_equipment_flags(creature_ptr, TR_ESP_EVIL);
157     return result;
158 }
159
160 /*!
161  * @brief クリーチャーが自然界の動物感知を持っているかを返す。
162  * @param creature_ptr 判定対象のクリーチャー参照ポインタ
163  * @return 持っていたら所持前提ビットフラグを返す。
164  */
165 BIT_FLAGS has_esp_animal(player_type *creature_ptr) { return check_equipment_flags(creature_ptr, TR_ESP_ANIMAL); }
166
167 /*!
168  * @brief クリーチャーがアンデッド感知を持っているかを返す。
169  * @param creature_ptr 判定対象のクリーチャー参照ポインタ
170  * @return 持っていたら所持前提ビットフラグを返す。
171  */
172 BIT_FLAGS has_esp_undead(player_type *creature_ptr) { return check_equipment_flags(creature_ptr, TR_ESP_UNDEAD); }
173
174 /*!
175  * @brief クリーチャーが悪魔感知を持っているかを返す。
176  * @param creature_ptr 判定対象のクリーチャー参照ポインタ
177  * @return 持っていたら所持前提ビットフラグを返す。
178  */
179 BIT_FLAGS has_esp_demon(player_type *creature_ptr) { return check_equipment_flags(creature_ptr, TR_ESP_DEMON); }
180
181 /*!
182  * @brief クリーチャーがオーク感知を持っているかを返す。
183  * @param creature_ptr 判定対象のクリーチャー参照ポインタ
184  * @return 持っていたら所持前提ビットフラグを返す。
185  */
186 BIT_FLAGS has_esp_orc(player_type *creature_ptr) { return check_equipment_flags(creature_ptr, TR_ESP_ORC); }
187
188 /*!
189  * @brief クリーチャーがトロル感知を持っているかを返す。
190  * @param creature_ptr 判定対象のクリーチャー参照ポインタ
191  * @return 持っていたら所持前提ビットフラグを返す。
192  */
193 BIT_FLAGS has_esp_troll(player_type *creature_ptr) { return check_equipment_flags(creature_ptr, TR_ESP_TROLL); }
194
195 /*!
196  * @brief クリーチャーが巨人感知を持っているかを返す。
197  * @param creature_ptr 判定対象のクリーチャー参照ポインタ
198  * @return 持っていたら所持前提ビットフラグを返す。
199  */
200 BIT_FLAGS has_esp_giant(player_type *creature_ptr) { return check_equipment_flags(creature_ptr, TR_ESP_GIANT); }
201
202 /*!
203  * @brief クリーチャーがドラゴン感知を持っているかを返す。
204  * @param creature_ptr 判定対象のクリーチャー参照ポインタ
205  * @return 持っていたら所持前提ビットフラグを返す。
206  */
207 BIT_FLAGS has_esp_dragon(player_type *creature_ptr) { return check_equipment_flags(creature_ptr, TR_ESP_DRAGON); }
208
209 /*!
210  * @brief クリーチャーが人間感知を持っているかを返す。
211  * @param creature_ptr 判定対象のクリーチャー参照ポインタ
212  * @return 持っていたら所持前提ビットフラグを返す。
213  */
214 BIT_FLAGS has_esp_human(player_type *creature_ptr) { return check_equipment_flags(creature_ptr, TR_ESP_HUMAN); }
215
216 /*!
217  * @brief クリーチャーが善良感知を持っているかを返す。
218  * @param creature_ptr 判定対象のクリーチャー参照ポインタ
219  * @return 持っていたら所持前提ビットフラグを返す。
220  */
221 BIT_FLAGS has_esp_good(player_type *creature_ptr) { return check_equipment_flags(creature_ptr, TR_ESP_GOOD); }
222
223 /*!
224  * @brief クリーチャーが無生物感知を持っているかを返す。
225  * @param creature_ptr 判定対象のクリーチャー参照ポインタ
226  * @return 持っていたら所持前提ビットフラグを返す。
227  */
228 BIT_FLAGS has_esp_nonliving(player_type *creature_ptr) { return check_equipment_flags(creature_ptr, TR_ESP_NONLIVING); }
229
230 /*!
231  * @brief クリーチャーがユニーク感知を持っているかを返す。
232  * @param creature_ptr 判定対象のクリーチャー参照ポインタ
233  * @return 持っていたら所持前提ビットフラグを返す。
234  */
235 BIT_FLAGS has_esp_unique(player_type *creature_ptr) { return check_equipment_flags(creature_ptr, TR_ESP_UNIQUE); }
236
237 /*!
238  * @brief クリーチャーがテレパシーを持っているかを返す。
239  * @param creature_ptr 判定対象のクリーチャー参照ポインタ
240  * @return 持っていたら所持前提ビットフラグを返す。
241  */
242 BIT_FLAGS has_esp_telepathy(player_type *creature_ptr)
243 {
244     BIT_FLAGS result = 0L;
245
246     if (is_time_limit_esp(creature_ptr) || creature_ptr->ult_res || (creature_ptr->special_defense & KATA_MUSOU)) {
247         result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
248     }
249
250     if (creature_ptr->muta3 & MUT3_ESP) {
251         result |= 0x01U << FLAG_CAUSE_MUTATION;
252     }
253
254     if (is_specific_player_race(creature_ptr, RACE_MIND_FLAYER) && creature_ptr->lev > 29)
255         result |= 0x01U << FLAG_CAUSE_RACE;
256
257     if (is_specific_player_race(creature_ptr, RACE_SPECTRE) && creature_ptr->lev > 34)
258         result |= 0x01U << FLAG_CAUSE_RACE;
259
260     if (creature_ptr->pclass == CLASS_MINDCRAFTER && creature_ptr->lev > 39)
261         result |= 0x01U << FLAG_CAUSE_CLASS;
262
263     if (creature_ptr->mimic_form == MIMIC_DEMON_LORD) {
264         result |= 0x01U << FLAG_CAUSE_RACE;
265     }
266
267     result |= check_equipment_flags(creature_ptr, TR_TELEPATHY);
268     return result;
269 }
270
271 BIT_FLAGS has_bless_blade(player_type *creature_ptr) { return check_equipment_flags(creature_ptr, TR_BLESSED); }
272
273 BIT_FLAGS has_easy2_weapon(player_type *creature_ptr) { return check_equipment_flags(creature_ptr, TR_EASY2_WEAPON); }
274
275 BIT_FLAGS has_down_saving(player_type *creature_ptr) { return check_equipment_flags(creature_ptr, TR_DOWN_SAVING); }
276
277 BIT_FLAGS has_no_ac(player_type *creature_ptr) { return check_equipment_flags(creature_ptr, TR_NO_AC); }
278
279 BIT_FLAGS has_invuln_arrow(player_type *creature_ptr)
280 {
281     BIT_FLAGS result = 0L;
282     if (creature_ptr->blind)
283         return result;
284     result |= check_equipment_flags(creature_ptr, TR_INVULN_ARROW);
285     return result;
286 }
287
288 void check_no_flowed(player_type *creature_ptr)
289 {
290     object_type *o_ptr;
291     bool has_sw = FALSE, has_kabe = FALSE;
292     OBJECT_IDX this_o_idx, next_o_idx = 0;
293
294     creature_ptr->no_flowed = FALSE;
295
296     if (has_pass_wall(creature_ptr) && !has_kill_wall(creature_ptr))
297         creature_ptr->no_flowed = TRUE;
298
299     for (int i = 0; i < INVEN_PACK; i++) {
300         if ((creature_ptr->inventory_list[i].tval == TV_NATURE_BOOK) && (creature_ptr->inventory_list[i].sval == 2))
301             has_sw = TRUE;
302         if ((creature_ptr->inventory_list[i].tval == TV_CRAFT_BOOK) && (creature_ptr->inventory_list[i].sval == 2))
303             has_kabe = TRUE;
304     }
305
306     for (this_o_idx = creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x].o_idx; this_o_idx; this_o_idx = next_o_idx) {
307         o_ptr = &creature_ptr->current_floor_ptr->o_list[this_o_idx];
308         next_o_idx = o_ptr->next_o_idx;
309
310         if ((o_ptr->tval == TV_NATURE_BOOK) && (o_ptr->sval == 2))
311             has_sw = TRUE;
312         if ((o_ptr->tval == TV_CRAFT_BOOK) && (o_ptr->sval == 2))
313             has_kabe = TRUE;
314     }
315
316     if (has_sw && ((creature_ptr->realm1 == REALM_NATURE) || (creature_ptr->realm2 == REALM_NATURE) || (creature_ptr->pclass == CLASS_SORCERER))) {
317         const magic_type *s_ptr = &mp_ptr->info[REALM_NATURE - 1][SPELL_SW];
318         if (creature_ptr->lev >= s_ptr->slevel)
319             creature_ptr->no_flowed = TRUE;
320     }
321
322     if (has_kabe && ((creature_ptr->realm1 == REALM_CRAFT) || (creature_ptr->realm2 == REALM_CRAFT) || (creature_ptr->pclass == CLASS_SORCERER))) {
323         const magic_type *s_ptr = &mp_ptr->info[REALM_CRAFT - 1][SPELL_WALL];
324         if (creature_ptr->lev >= s_ptr->slevel)
325             creature_ptr->no_flowed = TRUE;
326     }
327 }
328
329 BIT_FLAGS has_mighty_throw(player_type *creature_ptr) { return check_equipment_flags(creature_ptr, TR_MIGHTY_THROW); }
330
331 BIT_FLAGS has_dec_mana(player_type *creature_ptr) { return check_equipment_flags(creature_ptr, TR_DEC_MANA); }
332
333 BIT_FLAGS has_reflect(player_type *creature_ptr)
334 {
335     BIT_FLAGS result = 0L;
336
337     if (creature_ptr->pclass == CLASS_BERSERKER && creature_ptr->lev > 39)
338         result |= 0x01U << FLAG_CAUSE_CLASS;
339
340     if (creature_ptr->pclass == CLASS_MIRROR_MASTER && creature_ptr->lev > 39)
341         result |= 0x01U << FLAG_CAUSE_CLASS;
342
343     if (creature_ptr->special_defense & KAMAE_GENBU || creature_ptr->special_defense & KATA_MUSOU) {
344         result |= 0x01U << FLAG_CAUSE_BATTLE_FORM;
345     }
346
347     if (creature_ptr->ult_res || creature_ptr->wraith_form || creature_ptr->magicdef || creature_ptr->tim_reflect) {
348         result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
349     }
350
351     result |= check_equipment_flags(creature_ptr, TR_REFLECT);
352     return result;
353 }
354
355 BIT_FLAGS has_see_nocto(player_type *creature_ptr) { return creature_ptr->pclass == CLASS_NINJA ? FLAG_CAUSE_CLASS : 0L; }
356
357 BIT_FLAGS has_warning(player_type *creature_ptr)
358 {
359     BIT_FLAGS result = 0L;
360     object_type *o_ptr;
361     BIT_FLAGS flgs[TR_FLAG_SIZE];
362
363     for (inventory_slot_type i = INVEN_MAIN_HAND; i < INVEN_TOTAL; i++) {
364         o_ptr = &creature_ptr->inventory_list[i];
365         if (!o_ptr->k_idx)
366             continue;
367
368         object_flags(creature_ptr, o_ptr, flgs);
369
370         if (has_flag(flgs, TR_WARNING)) {
371             if (!o_ptr->inscription || !(angband_strchr(quark_str(o_ptr->inscription), '$')))
372                 result |= 0x01U << (i - INVEN_MAIN_HAND);
373         }
374     }
375     return result;
376 }
377
378 BIT_FLAGS has_anti_magic(player_type *creature_ptr) { return check_equipment_flags(creature_ptr, TR_NO_MAGIC); }
379
380 BIT_FLAGS has_anti_tele(player_type *creature_ptr) { return check_equipment_flags(creature_ptr, TR_NO_TELE); }
381
382 BIT_FLAGS has_sh_fire(player_type *creature_ptr)
383 {
384     BIT_FLAGS result = 0L;
385
386     if (creature_ptr->muta3 & MUT3_FIRE_BODY) {
387         result |= 0x01U << FLAG_CAUSE_MUTATION;
388     }
389
390     if (creature_ptr->mimic_form == MIMIC_DEMON_LORD) {
391         result |= 0x01U << FLAG_CAUSE_RACE;
392     }
393
394     if (creature_ptr->special_defense & KAMAE_SEIRYU || creature_ptr->special_defense & KATA_MUSOU) {
395         result |= 0x01U << FLAG_CAUSE_BATTLE_FORM;
396     }
397
398     if (hex_spelling(creature_ptr, HEX_DEMON_AURA) || creature_ptr->ult_res || creature_ptr->tim_sh_fire) {
399         result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
400     }
401
402     result |= check_equipment_flags(creature_ptr, TR_SH_FIRE);
403     return result;
404 }
405
406 BIT_FLAGS has_sh_elec(player_type *creature_ptr)
407 {
408     BIT_FLAGS result = 0L;
409
410     if (creature_ptr->muta3 & MUT3_ELEC_TOUC)
411         result |= 0x01U << FLAG_CAUSE_MUTATION;
412
413     if (hex_spelling(creature_ptr, HEX_SHOCK_CLOAK) || creature_ptr->ult_res) {
414         result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
415     }
416
417     if (creature_ptr->special_defense & KAMAE_SEIRYU || (creature_ptr->special_defense & KATA_MUSOU)) {
418         result |= 0x01U << FLAG_CAUSE_BATTLE_FORM;
419     }
420
421     result |= check_equipment_flags(creature_ptr, TR_SH_ELEC);
422     return result;
423 }
424
425 BIT_FLAGS has_sh_cold(player_type *creature_ptr)
426 {
427     BIT_FLAGS result = 0L;
428
429     if (creature_ptr->special_defense & KAMAE_SEIRYU || creature_ptr->special_defense & KATA_MUSOU) {
430         result |= 0x01U << FLAG_CAUSE_BATTLE_FORM;
431     }
432
433     if (creature_ptr->ult_res || hex_spelling(creature_ptr, HEX_ICE_ARMOR)) {
434         result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
435     }
436
437     result |= check_equipment_flags(creature_ptr, TR_SH_COLD);
438     return result;
439 }
440
441 BIT_FLAGS has_easy_spell(player_type *creature_ptr) { return check_equipment_flags(creature_ptr, TR_EASY_SPELL); }
442
443 BIT_FLAGS has_heavy_spell(player_type *creature_ptr) { return check_equipment_flags(creature_ptr, TR_HEAVY_SPELL); }
444
445 BIT_FLAGS has_hold_exp(player_type *creature_ptr)
446 {
447     BIT_FLAGS result = 0L;
448
449     if (creature_ptr->pseikaku == PERSONALITY_MUNCHKIN) {
450         result |= 0x01U << FLAG_CAUSE_PERSONALITY;
451     }
452
453     if (creature_ptr->mimic_form == MIMIC_DEMON || creature_ptr->mimic_form == MIMIC_DEMON_LORD || creature_ptr->mimic_form == MIMIC_VAMPIRE) {
454         result |= 0x01U << FLAG_CAUSE_RACE;
455     }
456
457     if (is_specific_player_race(creature_ptr, RACE_HOBBIT) || is_specific_player_race(creature_ptr, RACE_SKELETON)
458         || is_specific_player_race(creature_ptr, RACE_ZOMBIE) || is_specific_player_race(creature_ptr, RACE_VAMPIRE)
459         || is_specific_player_race(creature_ptr, RACE_SPECTRE) || is_specific_player_race(creature_ptr, RACE_BALROG)
460         || is_specific_player_race(creature_ptr, RACE_ANDROID)) {
461         result |= 0x01U << FLAG_CAUSE_RACE;
462     }
463
464     if (is_specific_player_race(creature_ptr, RACE_GOLEM)) {
465         if (creature_ptr->lev > 34)
466             result |= 0x01U << FLAG_CAUSE_RACE;
467     }
468
469     if (creature_ptr->special_defense & KATA_MUSOU) {
470         result |= 0x01U << FLAG_CAUSE_BATTLE_FORM;
471     }
472
473     if (creature_ptr->ult_res) {
474         result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
475     }
476
477     result |= check_equipment_flags(creature_ptr, TR_HOLD_EXP);
478     return result;
479 }
480
481 BIT_FLAGS has_see_inv(player_type *creature_ptr)
482 {
483     BIT_FLAGS result = 0L;
484
485     if (creature_ptr->pclass == CLASS_NINJA && creature_ptr->lev > 29)
486         result |= 0x01U << FLAG_CAUSE_CLASS;
487
488     if (creature_ptr->mimic_form == MIMIC_DEMON || creature_ptr->mimic_form == MIMIC_DEMON_LORD || creature_ptr->mimic_form == MIMIC_VAMPIRE) {
489         result |= 0x01U << FLAG_CAUSE_RACE;
490     } else if (is_specific_player_race(creature_ptr, RACE_HIGH_ELF) || is_specific_player_race(creature_ptr, RACE_GOLEM)
491         || is_specific_player_race(creature_ptr, RACE_SKELETON) || is_specific_player_race(creature_ptr, RACE_ZOMBIE)
492         || is_specific_player_race(creature_ptr, RACE_SPECTRE) || is_specific_player_race(creature_ptr, RACE_ARCHON)) {
493         result |= 0x01U << FLAG_CAUSE_RACE;
494     } else if (is_specific_player_race(creature_ptr, RACE_DARK_ELF) && creature_ptr->lev > 19) {
495         result |= 0x01U << FLAG_CAUSE_RACE;
496     } else if (is_specific_player_race(creature_ptr, RACE_MIND_FLAYER) && creature_ptr->lev > 14) {
497         result |= 0x01U << FLAG_CAUSE_RACE;
498     } else if ((is_specific_player_race(creature_ptr, RACE_IMP) || is_specific_player_race(creature_ptr, RACE_BALROG)) && creature_ptr->lev > 9) {
499         result |= 0x01U << FLAG_CAUSE_RACE;
500     }
501
502     if (creature_ptr->special_defense & KATA_MUSOU) {
503         result |= 0x01U << FLAG_CAUSE_BATTLE_FORM;
504     }
505
506     if (creature_ptr->ult_res || creature_ptr->tim_invis) {
507         result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
508     }
509
510     result |= check_equipment_flags(creature_ptr, TR_SEE_INVIS);
511     return result;
512 }
513
514 BIT_FLAGS has_magic_mastery(player_type *creature_ptr) { return check_equipment_flags(creature_ptr, TR_MAGIC_MASTERY); }
515
516 BIT_FLAGS has_free_act(player_type *creature_ptr)
517 {
518     BIT_FLAGS result = 0L;
519
520     if (creature_ptr->muta3 & MUT3_MOTION)
521         result |= 0x01U << FLAG_CAUSE_MUTATION;
522
523     if (is_specific_player_race(creature_ptr, RACE_GNOME) || is_specific_player_race(creature_ptr, RACE_GOLEM)
524         || is_specific_player_race(creature_ptr, RACE_SPECTRE) || is_specific_player_race(creature_ptr, RACE_ANDROID)) {
525         result |= 0x01U << FLAG_CAUSE_RACE;
526     }
527
528     if (creature_ptr->pclass == CLASS_NINJA && !heavy_armor(creature_ptr)
529         && (!creature_ptr->inventory_list[INVEN_MAIN_HAND].k_idx || can_attack_with_main_hand(creature_ptr))
530         && (!creature_ptr->inventory_list[INVEN_SUB_HAND].k_idx || can_attack_with_sub_hand(creature_ptr))) {
531         if (creature_ptr->lev > 24)
532             result |= 0x01U << FLAG_CAUSE_CLASS;
533     }
534
535     if (creature_ptr->pclass == CLASS_MONK || creature_ptr->pclass == CLASS_FORCETRAINER) {
536         if (!(heavy_armor(creature_ptr))) {
537             if (creature_ptr->lev > 24)
538                 result |= 0x01U << FLAG_CAUSE_CLASS;
539         }
540     }
541
542     if (creature_ptr->pclass == CLASS_BERSERKER) {
543         result |= 0x01U << FLAG_CAUSE_CLASS;
544     }
545
546     if (creature_ptr->ult_res || creature_ptr->magicdef) {
547         result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
548     }
549
550     if (creature_ptr->special_defense & KATA_MUSOU) {
551         result |= 0x01U << FLAG_CAUSE_BATTLE_FORM;
552     }
553
554     result |= check_equipment_flags(creature_ptr, TR_FREE_ACT);
555     return result;
556 }
557
558 BIT_FLAGS has_sustain_str(player_type *creature_ptr)
559 {
560     BIT_FLAGS result = 0L;
561
562     if (creature_ptr->pclass == CLASS_BERSERKER) {
563         result |= 0x01U << FLAG_CAUSE_CLASS;
564     }
565     if (is_specific_player_race(creature_ptr, RACE_HALF_TROLL) || is_specific_player_race(creature_ptr, RACE_HALF_OGRE)
566         || is_specific_player_race(creature_ptr, RACE_HALF_GIANT)) {
567         result |= 0x01U << FLAG_CAUSE_RACE;
568     }
569
570     if (creature_ptr->ult_res) {
571         result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
572     }
573
574     if (creature_ptr->special_defense & KATA_MUSOU) {
575         result |= 0x01U << FLAG_CAUSE_BATTLE_FORM;
576     }
577
578     result |= check_equipment_flags(creature_ptr, TR_SUST_STR);
579     return result;
580 }
581
582 BIT_FLAGS has_sustain_int(player_type *creature_ptr)
583 {
584     BIT_FLAGS result = 0L;
585
586     if (is_specific_player_race(creature_ptr, RACE_MIND_FLAYER)) {
587         result |= 0x01U << FLAG_CAUSE_RACE;
588     }
589
590     if (creature_ptr->ult_res) {
591         result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
592     }
593
594     if (creature_ptr->special_defense & KATA_MUSOU) {
595         result |= 0x01U << FLAG_CAUSE_BATTLE_FORM;
596     }
597
598     result |= check_equipment_flags(creature_ptr, TR_SUST_INT);
599     return result;
600 }
601
602 BIT_FLAGS has_sustain_wis(player_type *creature_ptr)
603 {
604     BIT_FLAGS result = 0L;
605
606     result = FALSE;
607     if (creature_ptr->pclass == CLASS_MINDCRAFTER && creature_ptr->lev > 19)
608         result |= 0x01U << FLAG_CAUSE_CLASS;
609
610     if (!creature_ptr->mimic_form && (creature_ptr->prace == RACE_MIND_FLAYER)) {
611         result |= 0x01U << FLAG_CAUSE_RACE;
612     }
613
614     if (creature_ptr->ult_res) {
615         result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
616     }
617
618     if (creature_ptr->special_defense & KATA_MUSOU) {
619         result |= 0x01U << FLAG_CAUSE_BATTLE_FORM;
620     }
621
622     result |= check_equipment_flags(creature_ptr, TR_SUST_WIS);
623     return result;
624 }
625
626 BIT_FLAGS has_sustain_dex(player_type *creature_ptr)
627 {
628     BIT_FLAGS result = 0L;
629     if (creature_ptr->pclass == CLASS_BERSERKER) {
630         result |= 0x01U << FLAG_CAUSE_CLASS;
631     }
632
633     if (creature_ptr->pclass == CLASS_NINJA && creature_ptr->lev > 24)
634         result |= 0x01U << FLAG_CAUSE_CLASS;
635
636     if (creature_ptr->ult_res) {
637         result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
638     }
639
640     if (creature_ptr->special_defense & KATA_MUSOU) {
641         result |= 0x01U << FLAG_CAUSE_BATTLE_FORM;
642     }
643
644     result |= check_equipment_flags(creature_ptr, TR_SUST_DEX);
645     return result;
646 }
647
648 BIT_FLAGS has_sustain_con(player_type *creature_ptr)
649 {
650     BIT_FLAGS result = 0L;
651     if (creature_ptr->pclass == CLASS_BERSERKER) {
652         result |= 0x01U << FLAG_CAUSE_CLASS;
653     }
654
655     if (!creature_ptr->mimic_form && (creature_ptr->prace == RACE_AMBERITE || creature_ptr->prace == RACE_DUNADAN)) {
656         result |= 0x01U << FLAG_CAUSE_RACE;
657     }
658
659     if (creature_ptr->ult_res) {
660         result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
661     }
662
663     if (creature_ptr->special_defense & KATA_MUSOU) {
664         result |= 0x01U << FLAG_CAUSE_BATTLE_FORM;
665     }
666
667     result |= check_equipment_flags(creature_ptr, TR_SUST_CON);
668     return result;
669 }
670
671 BIT_FLAGS has_sustain_chr(player_type *creature_ptr)
672 {
673     BIT_FLAGS result = 0L;
674
675     if (creature_ptr->ult_res) {
676         result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
677     }
678
679     if (creature_ptr->special_defense & KATA_MUSOU) {
680         result |= 0x01U << FLAG_CAUSE_BATTLE_FORM;
681     }
682
683     result |= check_equipment_flags(creature_ptr, TR_SUST_CHR);
684     return result;
685 }
686
687 BIT_FLAGS has_levitation(player_type *creature_ptr)
688 {
689     BIT_FLAGS result = 0L;
690
691     if (creature_ptr->muta3 & MUT3_WINGS)
692         result = FLAG_CAUSE_MUTATION;
693
694     if (creature_ptr->mimic_form == MIMIC_DEMON_LORD) {
695         result = FLAG_CAUSE_RACE;
696     }
697
698     if (is_specific_player_race(creature_ptr, RACE_DRACONIAN) || is_specific_player_race(creature_ptr, RACE_SPECTRE)
699         || is_specific_player_race(creature_ptr, RACE_SPRITE) || is_specific_player_race(creature_ptr, RACE_ARCHON)
700         || is_specific_player_race(creature_ptr, RACE_S_FAIRY)) {
701         result = FLAG_CAUSE_RACE;
702     }
703
704     if (creature_ptr->special_defense & KAMAE_SEIRYU || creature_ptr->special_defense & KAMAE_SUZAKU || (creature_ptr->special_defense & KATA_MUSOU)) {
705         result = FLAG_CAUSE_BATTLE_FORM;
706     }
707
708     if (creature_ptr->ult_res || creature_ptr->magicdef) {
709         result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
710     }
711
712     if (creature_ptr->riding) {
713         monster_type *riding_m_ptr = &creature_ptr->current_floor_ptr->m_list[creature_ptr->riding];
714         monster_race *riding_r_ptr = &r_info[riding_m_ptr->r_idx];
715         result = (riding_r_ptr->flags7 & RF7_CAN_FLY) ? result : 0;
716     }
717
718     if (creature_ptr->tim_levitation) {
719         result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
720     }
721
722     result |= check_equipment_flags(creature_ptr, TR_LEVITATION);
723     return result;
724 }
725
726 void has_can_swim(player_type *creature_ptr)
727 {
728     creature_ptr->can_swim = FALSE;
729     if (creature_ptr->riding) {
730         monster_type *riding_m_ptr = &creature_ptr->current_floor_ptr->m_list[creature_ptr->riding];
731         monster_race *riding_r_ptr = &r_info[riding_m_ptr->r_idx];
732         if (riding_r_ptr->flags7 & (RF7_CAN_SWIM | RF7_AQUATIC))
733             creature_ptr->can_swim = TRUE;
734     }
735 }
736
737 BIT_FLAGS has_slow_digest(player_type *creature_ptr)
738 {
739     BIT_FLAGS result = 0L;
740
741     if (creature_ptr->pclass == CLASS_NINJA) {
742         result = FLAG_CAUSE_CLASS;
743     }
744
745     if (creature_ptr->lev > 14 && !creature_ptr->mimic_form && creature_ptr->prace == RACE_HALF_TROLL) {
746         if (creature_ptr->pclass == CLASS_WARRIOR || creature_ptr->pclass == CLASS_BERSERKER) {
747             result = FLAG_CAUSE_CLASS;
748             /* Let's not make Regeneration
749              * a disadvantage for the poor warriors who can
750              * never learn a spell that satisfies hunger (actually
751              * neither can rogues, but half-trolls are not
752              * supposed to play rogues) */
753         }
754     }
755
756     if (creature_ptr->special_defense & KATA_MUSOU) {
757         result = FLAG_CAUSE_BATTLE_FORM;
758     }
759
760     if (creature_ptr->ult_res) {
761         result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
762     }
763
764     if (!creature_ptr->mimic_form
765         && (creature_ptr->prace == RACE_GOLEM || creature_ptr->prace == RACE_ZOMBIE || creature_ptr->prace == RACE_SPECTRE
766             || creature_ptr->prace == RACE_ANDROID)) {
767         result = FLAG_CAUSE_RACE;
768     }
769
770     result |= check_equipment_flags(creature_ptr, TR_SLOW_DIGEST);
771     return result;
772 }
773
774 BIT_FLAGS has_regenerate(player_type *creature_ptr)
775 {
776     BIT_FLAGS result = 0L;
777
778     if (is_specific_player_race(creature_ptr, RACE_HALF_TROLL) && creature_ptr->lev > 14) {
779         result |= 0x01U << FLAG_CAUSE_RACE;
780     }
781
782     if (is_specific_player_race(creature_ptr, RACE_AMBERITE)) {
783         result |= 0x01U << FLAG_CAUSE_RACE;
784     }
785
786     if (creature_ptr->pclass == CLASS_WARRIOR && creature_ptr->lev > 44) {
787         result |= 0x01U << FLAG_CAUSE_RACE;
788     }
789
790     if (creature_ptr->pclass == CLASS_BERSERKER) {
791         result |= 0x01U << FLAG_CAUSE_RACE;
792     }
793
794     if (creature_ptr->muta3 & MUT3_REGEN)
795         result |= 0x01U << FLAG_CAUSE_MUTATION;
796
797     if (creature_ptr->special_defense & KATA_MUSOU) {
798         result |= 0x01U << FLAG_CAUSE_MUTATION;
799     }
800
801     if (hex_spelling(creature_ptr, HEX_DEMON_AURA) || creature_ptr->ult_res || creature_ptr->tim_regen) {
802         result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
803     }
804
805     result |= check_equipment_flags(creature_ptr, TR_REGEN);
806
807     if (creature_ptr->muta3 & MUT3_FLESH_ROT)
808         result = 0L;
809
810     return result;
811 }
812
813 void has_curses(player_type *creature_ptr)
814 {
815     object_type *o_ptr;
816     BIT_FLAGS flgs[TR_FLAG_SIZE];
817     creature_ptr->cursed = 0L;
818
819     if (creature_ptr->pseikaku == PERSONALITY_SEXY)
820         creature_ptr->cursed |= (TRC_AGGRAVATE);
821
822     for (inventory_slot_type i = INVEN_MAIN_HAND; i < INVEN_TOTAL; i++) {
823         o_ptr = &creature_ptr->inventory_list[i];
824         if (!o_ptr->k_idx)
825             continue;
826         object_flags(creature_ptr, o_ptr, flgs);
827         if (has_flag(flgs, TR_AGGRAVATE))
828             creature_ptr->cursed |= TRC_AGGRAVATE;
829         if (has_flag(flgs, TR_DRAIN_EXP))
830             creature_ptr->cursed |= TRC_DRAIN_EXP;
831         if (has_flag(flgs, TR_TY_CURSE))
832             creature_ptr->cursed |= TRC_TY_CURSE;
833         if (has_flag(flgs, TR_ADD_L_CURSE))
834             creature_ptr->cursed |= TRC_ADD_L_CURSE;
835         if (has_flag(flgs, TR_ADD_H_CURSE))
836             creature_ptr->cursed |= TRC_ADD_H_CURSE;
837         if (has_flag(flgs, TR_DRAIN_HP))
838             creature_ptr->cursed |= TRC_DRAIN_HP;
839         if (has_flag(flgs, TR_DRAIN_MANA))
840             creature_ptr->cursed |= TRC_DRAIN_MANA;
841         if (has_flag(flgs, TR_CALL_ANIMAL))
842             creature_ptr->cursed |= TRC_CALL_ANIMAL;
843         if (has_flag(flgs, TR_CALL_DEMON))
844             creature_ptr->cursed |= TRC_CALL_DEMON;
845         if (has_flag(flgs, TR_CALL_DRAGON))
846             creature_ptr->cursed |= TRC_CALL_DRAGON;
847         if (has_flag(flgs, TR_CALL_UNDEAD))
848             creature_ptr->cursed |= TRC_CALL_UNDEAD;
849         if (has_flag(flgs, TR_COWARDICE))
850             creature_ptr->cursed |= TRC_COWARDICE;
851         if (has_flag(flgs, TR_LOW_MELEE))
852             creature_ptr->cursed |= TRC_LOW_MELEE;
853         if (has_flag(flgs, TR_LOW_AC))
854             creature_ptr->cursed |= TRC_LOW_AC;
855         if (has_flag(flgs, TR_LOW_MAGIC))
856             creature_ptr->cursed |= TRC_LOW_MAGIC;
857         if (has_flag(flgs, TR_FAST_DIGEST))
858             creature_ptr->cursed |= TRC_FAST_DIGEST;
859         if (has_flag(flgs, TR_SLOW_REGEN))
860             creature_ptr->cursed |= TRC_SLOW_REGEN;
861
862         creature_ptr->cursed |= (o_ptr->curse_flags & (0xFFFFFFF0L));
863         if (o_ptr->name1 == ART_CHAINSWORD)
864             creature_ptr->cursed |= TRC_CHAINSWORD;
865
866         if (has_flag(flgs, TR_TELEPORT)) {
867             if (object_is_cursed(o_ptr))
868                 creature_ptr->cursed |= TRC_TELEPORT;
869             else {
870                 concptr insc = quark_str(o_ptr->inscription);
871
872                 /* {.} will stop random teleportation. */
873                 if (o_ptr->inscription && angband_strchr(insc, '.')) {
874                 } else {
875                     creature_ptr->cursed |= TRC_TELEPORT_SELF;
876                 }
877             }
878         }
879     }
880
881     if (creature_ptr->cursed & TRC_TELEPORT)
882         creature_ptr->cursed &= ~(TRC_TELEPORT_SELF);
883 }
884
885 BIT_FLAGS has_impact(player_type *creature_ptr) { return check_equipment_flags(creature_ptr, TR_IMPACT); }
886
887 void has_extra_blow(player_type *creature_ptr)
888 {
889     object_type *o_ptr;
890     BIT_FLAGS flgs[TR_FLAG_SIZE];
891     creature_ptr->extra_blows[0] = creature_ptr->extra_blows[1] = 0;
892
893     for (inventory_slot_type i = INVEN_MAIN_HAND; i < INVEN_TOTAL; i++) {
894         o_ptr = &creature_ptr->inventory_list[i];
895         if (!o_ptr->k_idx)
896             continue;
897
898         object_flags(creature_ptr, o_ptr, flgs);
899         if (has_flag(flgs, TR_BLOWS)) {
900             if ((i == INVEN_MAIN_HAND || i == INVEN_MAIN_RING) && !has_two_handed_weapons(creature_ptr))
901                 creature_ptr->extra_blows[0] += o_ptr->pval;
902             else if ((i == INVEN_SUB_HAND || i == INVEN_SUB_RING) && !has_two_handed_weapons(creature_ptr))
903                 creature_ptr->extra_blows[1] += o_ptr->pval;
904             else {
905                 creature_ptr->extra_blows[0] += o_ptr->pval;
906                 creature_ptr->extra_blows[1] += o_ptr->pval;
907             }
908         }
909     }
910 }
911
912 BIT_FLAGS has_resist_acid(player_type *creature_ptr)
913 {
914     BIT_FLAGS result = 0L;
915
916     if (creature_ptr->mimic_form == MIMIC_DEMON_LORD) {
917         result |= 0x01U << FLAG_CAUSE_RACE;
918     } else if (is_specific_player_race(creature_ptr, RACE_YEEK) || is_specific_player_race(creature_ptr, RACE_KLACKON)) {
919         result |= 0x01U << FLAG_CAUSE_RACE;
920     } else if (is_specific_player_race(creature_ptr, RACE_DRACONIAN) && creature_ptr->lev > 14) {
921         result |= 0x01U << FLAG_CAUSE_RACE;
922     }
923
924     if (creature_ptr->special_defense & KAMAE_SEIRYU || creature_ptr->special_defense & KATA_MUSOU) {
925         result |= 0x01U << FLAG_CAUSE_BATTLE_FORM;
926     }
927
928     if (creature_ptr->ult_res) {
929         result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
930     }
931
932     result |= has_immune_acid(creature_ptr);
933
934     result |= check_equipment_flags(creature_ptr, TR_RES_ACID);
935     return result;
936 }
937
938 BIT_FLAGS has_vuln_acid(player_type *creature_ptr)
939 {
940     BIT_FLAGS result = 0L;
941     if (creature_ptr->muta3 & MUT3_VULN_ELEM) {
942         result |= 0x01U << FLAG_CAUSE_MUTATION;
943     }
944
945     if (creature_ptr->special_defense & KATA_KOUKIJIN) {
946         result |= 0x01U << FLAG_CAUSE_BATTLE_FORM;
947     }
948     return result;
949 }
950
951 BIT_FLAGS has_resist_elec(player_type *creature_ptr)
952 {
953     BIT_FLAGS result = 0L;
954
955     if (creature_ptr->mimic_form == MIMIC_DEMON_LORD) {
956         result |= 0x01U << FLAG_CAUSE_RACE;
957     } else if (is_specific_player_race(creature_ptr, RACE_DRACONIAN) && creature_ptr->lev > 19) {
958         result |= 0x01U << FLAG_CAUSE_RACE;
959     }
960
961     if (creature_ptr->special_defense & KAMAE_SEIRYU || creature_ptr->special_defense & KATA_MUSOU) {
962         result |= 0x01U << FLAG_CAUSE_BATTLE_FORM;
963     }
964
965     if (creature_ptr->ult_res) {
966         result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
967     }
968
969     result |= check_equipment_flags(creature_ptr, TR_RES_ELEC);
970     result |= has_immune_elec(creature_ptr);
971     return result;
972 }
973
974 BIT_FLAGS has_vuln_elec(player_type *creature_ptr)
975 {
976     BIT_FLAGS result = 0L;
977     if (creature_ptr->muta3 & MUT3_VULN_ELEM) {
978         result |= 0x01U << FLAG_CAUSE_MUTATION;
979     }
980
981     if (is_specific_player_race(creature_ptr, RACE_ANDROID)) {
982         result |= 0x01U << FLAG_CAUSE_RACE;
983     }
984
985     if (creature_ptr->special_defense & KATA_KOUKIJIN) {
986         result |= 0x01U << FLAG_CAUSE_BATTLE_FORM;
987     }
988     return result;
989 }
990
991 BIT_FLAGS has_resist_fire(player_type *creature_ptr)
992 {
993     BIT_FLAGS result = 0L;
994
995     if (creature_ptr->mimic_form == MIMIC_DEMON || creature_ptr->mimic_form == MIMIC_DEMON_LORD) {
996         result |= 0x01U << FLAG_CAUSE_RACE;
997     }
998
999     if (is_specific_player_race(creature_ptr, RACE_DRACONIAN) && creature_ptr->lev > 4) {
1000         result |= 0x01U << FLAG_CAUSE_RACE;
1001     }
1002
1003     if (!creature_ptr->mimic_form && (creature_ptr->prace == RACE_IMP || creature_ptr->prace == RACE_BALROG)) {
1004         result |= 0x01U << FLAG_CAUSE_RACE;
1005     }
1006
1007     if (creature_ptr->special_defense & KAMAE_SEIRYU || creature_ptr->special_defense & KATA_MUSOU) {
1008         result |= 0x01U << FLAG_CAUSE_BATTLE_FORM;
1009     }
1010
1011     if (creature_ptr->ult_res) {
1012         result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1013     }
1014
1015     result |= check_equipment_flags(creature_ptr, TR_RES_FIRE);
1016     result |= has_immune_fire(creature_ptr);
1017     return result;
1018 }
1019
1020 BIT_FLAGS has_vuln_fire(player_type *creature_ptr)
1021 {
1022     BIT_FLAGS result = 0L;
1023     if (creature_ptr->muta3 & MUT3_VULN_ELEM) {
1024         result |= 0x01U << FLAG_CAUSE_MUTATION;
1025     }
1026
1027     if (is_specific_player_race(creature_ptr, RACE_ENT)) {
1028         result |= 0x01U << FLAG_CAUSE_RACE;
1029     }
1030
1031     if (creature_ptr->special_defense & KATA_KOUKIJIN) {
1032         result |= 0x01U << FLAG_CAUSE_BATTLE_FORM;
1033     }
1034     return result;
1035 }
1036
1037 BIT_FLAGS has_resist_cold(player_type *creature_ptr)
1038 {
1039     BIT_FLAGS result = 0L;
1040
1041     if (creature_ptr->mimic_form == MIMIC_DEMON_LORD || creature_ptr->mimic_form == MIMIC_VAMPIRE) {
1042         result |= 0x01U << FLAG_CAUSE_RACE;
1043     }
1044
1045     if (!creature_ptr->mimic_form && (creature_ptr->prace == RACE_ZOMBIE) && creature_ptr->lev > 4) {
1046         result |= 0x01U << FLAG_CAUSE_RACE;
1047     }
1048
1049     if ((is_specific_player_race(creature_ptr, RACE_DRACONIAN) || is_specific_player_race(creature_ptr, RACE_SKELETON)) && creature_ptr->lev > 9) {
1050         result |= 0x01U << FLAG_CAUSE_RACE;
1051     }
1052
1053     if (!creature_ptr->mimic_form && (creature_ptr->prace == RACE_VAMPIRE || creature_ptr->prace == RACE_SPECTRE)) {
1054         result |= 0x01U << FLAG_CAUSE_RACE;
1055     }
1056
1057     if (creature_ptr->special_defense & KAMAE_SEIRYU || creature_ptr->special_defense & KATA_MUSOU) {
1058         result |= 0x01U << FLAG_CAUSE_BATTLE_FORM;
1059     }
1060
1061     if (creature_ptr->ult_res) {
1062         result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1063     }
1064
1065     result |= check_equipment_flags(creature_ptr, TR_RES_COLD);
1066     result |= has_immune_cold(creature_ptr);
1067     return result;
1068 }
1069
1070 BIT_FLAGS has_vuln_cold(player_type *creature_ptr)
1071 {
1072     BIT_FLAGS result = 0L;
1073     if (creature_ptr->muta3 & MUT3_VULN_ELEM) {
1074         result |= 0x01U << FLAG_CAUSE_MUTATION;
1075     }
1076
1077     if (creature_ptr->special_defense & KATA_KOUKIJIN) {
1078         result |= 0x01U << FLAG_CAUSE_BATTLE_FORM;
1079     }
1080     return result;
1081 }
1082
1083 BIT_FLAGS has_resist_pois(player_type *creature_ptr)
1084 {
1085     BIT_FLAGS result = 0L;
1086
1087     if (creature_ptr->pclass == CLASS_NINJA && creature_ptr->lev > 19)
1088         result |= 0x01U << FLAG_CAUSE_CLASS;
1089
1090     if (creature_ptr->mimic_form == MIMIC_VAMPIRE || creature_ptr->mimic_form == MIMIC_DEMON_LORD) {
1091         result |= 0x01U << FLAG_CAUSE_RACE;
1092     }
1093
1094     if (is_specific_player_race(creature_ptr, RACE_DRACONIAN) && creature_ptr->lev > 34) {
1095         result |= 0x01U << FLAG_CAUSE_RACE;
1096     }
1097
1098     if (!creature_ptr->mimic_form
1099         && (creature_ptr->prace == RACE_KOBOLD || creature_ptr->prace == RACE_GOLEM || creature_ptr->prace == RACE_SKELETON
1100             || creature_ptr->prace == RACE_VAMPIRE || creature_ptr->prace == RACE_SPECTRE || creature_ptr->prace == RACE_ANDROID)) {
1101         result |= 0x01U << FLAG_CAUSE_RACE;
1102     }
1103
1104     if (creature_ptr->special_defense & KAMAE_SEIRYU || creature_ptr->special_defense & KATA_MUSOU) {
1105         result |= 0x01U << FLAG_CAUSE_BATTLE_FORM;
1106     }
1107
1108     if (creature_ptr->ult_res) {
1109         result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1110     }
1111
1112     result |= check_equipment_flags(creature_ptr, TR_RES_POIS);
1113     return result;
1114 }
1115
1116 BIT_FLAGS has_resist_conf(player_type *creature_ptr)
1117 {
1118     BIT_FLAGS result = 0L;
1119
1120     if (creature_ptr->pclass == CLASS_MINDCRAFTER && creature_ptr->lev > 29)
1121         result |= 0x01U << FLAG_CAUSE_CLASS;
1122
1123     if (creature_ptr->pseikaku == PERSONALITY_CHARGEMAN || creature_ptr->pseikaku == PERSONALITY_MUNCHKIN) {
1124         result |= 0x01U << FLAG_CAUSE_PERSONALITY;
1125     }
1126
1127     if (!creature_ptr->mimic_form && (creature_ptr->prace == RACE_KLACKON || creature_ptr->prace == RACE_BEASTMAN || creature_ptr->prace == RACE_KUTAR)) {
1128         result |= 0x01U << FLAG_CAUSE_RACE;
1129     }
1130
1131     if (creature_ptr->mimic_form == MIMIC_DEMON_LORD) {
1132         result |= 0x01U << FLAG_CAUSE_RACE;
1133     }
1134
1135     if (creature_ptr->ult_res || creature_ptr->magicdef) {
1136         result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1137     }
1138
1139     if (creature_ptr->special_defense & KATA_MUSOU) {
1140         result |= 0x01U << FLAG_CAUSE_BATTLE_FORM;
1141     }
1142
1143     result |= check_equipment_flags(creature_ptr, TR_RES_CONF);
1144     return result;
1145 }
1146
1147 BIT_FLAGS has_resist_sound(player_type *creature_ptr)
1148 {
1149     BIT_FLAGS result = 0L;
1150
1151     if (creature_ptr->pclass == CLASS_BARD) {
1152         result |= 0x01U << FLAG_CAUSE_CLASS;
1153     }
1154
1155     if (!creature_ptr->mimic_form && (creature_ptr->prace == RACE_CYCLOPS || creature_ptr->prace == RACE_BEASTMAN)) {
1156         result |= 0x01U << FLAG_CAUSE_RACE;
1157     }
1158
1159     if (creature_ptr->special_defense & KATA_MUSOU) {
1160         result |= 0x01U << FLAG_CAUSE_BATTLE_FORM;
1161     }
1162
1163     if (creature_ptr->ult_res) {
1164         result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1165     }
1166
1167     result |= check_equipment_flags(creature_ptr, TR_RES_SOUND);
1168     return result;
1169 }
1170
1171 BIT_FLAGS has_resist_lite(player_type *creature_ptr)
1172 {
1173     BIT_FLAGS result = 0L;
1174
1175     if (!creature_ptr->mimic_form && (creature_ptr->prace == RACE_ELF || creature_ptr->prace == RACE_HIGH_ELF || creature_ptr->prace == RACE_SPRITE)) {
1176         result |= 0x01U << FLAG_CAUSE_RACE;
1177     }
1178
1179     if (creature_ptr->special_defense & KATA_MUSOU) {
1180         result |= 0x01U << FLAG_CAUSE_BATTLE_FORM;
1181     }
1182
1183     if (creature_ptr->ult_res) {
1184         result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1185     }
1186
1187     result |= check_equipment_flags(creature_ptr, TR_RES_LITE);
1188     return result;
1189 }
1190
1191 BIT_FLAGS has_vuln_lite(player_type *creature_ptr)
1192 {
1193     BIT_FLAGS result = 0L;
1194     if (is_specific_player_race(creature_ptr, RACE_S_FAIRY) || is_specific_player_race(creature_ptr, RACE_VAMPIRE)
1195         || (creature_ptr->mimic_form == MIMIC_VAMPIRE)) {
1196         result |= 0x01U << FLAG_CAUSE_RACE;
1197     }
1198
1199     if (creature_ptr->wraith_form) {
1200         result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1201     }
1202
1203     return result;
1204 }
1205
1206 BIT_FLAGS has_resist_dark(player_type *creature_ptr)
1207 {
1208     BIT_FLAGS result = 0L;
1209
1210     if (creature_ptr->mimic_form == MIMIC_VAMPIRE) {
1211         result |= 0x01U << FLAG_CAUSE_RACE;
1212     }
1213
1214     if (!creature_ptr->mimic_form
1215         && (creature_ptr->prace == RACE_HALF_ORC || creature_ptr->prace == RACE_HALF_OGRE || creature_ptr->prace == RACE_NIBELUNG
1216             || creature_ptr->prace == RACE_DARK_ELF || creature_ptr->prace == RACE_VAMPIRE)) {
1217         result |= 0x01U << FLAG_CAUSE_RACE;
1218     }
1219
1220     if (creature_ptr->special_defense & KATA_MUSOU) {
1221         result |= 0x01U << FLAG_CAUSE_BATTLE_FORM;
1222     }
1223
1224     if (creature_ptr->ult_res) {
1225         result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1226     }
1227
1228     result |= check_equipment_flags(creature_ptr, TR_RES_DARK);
1229     return result;
1230 }
1231
1232 BIT_FLAGS has_resist_chaos(player_type *creature_ptr)
1233 {
1234     BIT_FLAGS result = 0L;
1235
1236     if (creature_ptr->pclass == CLASS_CHAOS_WARRIOR && creature_ptr->lev > 29)
1237         result |= 0x01U << FLAG_CAUSE_CLASS;
1238
1239     if (creature_ptr->mimic_form == MIMIC_DEMON || creature_ptr->mimic_form == MIMIC_DEMON_LORD) {
1240         result |= 0x01U << FLAG_CAUSE_RACE;
1241     }
1242
1243     if (!creature_ptr->mimic_form && creature_ptr->prace == RACE_HALF_TITAN)
1244         result |= 0x01U << FLAG_CAUSE_RACE;
1245
1246     if (creature_ptr->special_defense & KATA_MUSOU) {
1247         result |= 0x01U << FLAG_CAUSE_BATTLE_FORM;
1248     }
1249
1250     if (creature_ptr->ult_res) {
1251         result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1252     }
1253
1254     result |= check_equipment_flags(creature_ptr, TR_RES_CHAOS);
1255     return result;
1256 }
1257
1258 BIT_FLAGS has_resist_disen(player_type *creature_ptr)
1259 {
1260     BIT_FLAGS result = 0L;
1261
1262     if (creature_ptr->mimic_form == MIMIC_DEMON_LORD) {
1263         result |= 0x01U << FLAG_CAUSE_RACE;
1264     }
1265
1266     if (!creature_ptr->mimic_form && creature_ptr->prace == RACE_NIBELUNG)
1267         result |= 0x01U << FLAG_CAUSE_RACE;
1268
1269     if (creature_ptr->special_defense & KATA_MUSOU) {
1270         result |= 0x01U << FLAG_CAUSE_BATTLE_FORM;
1271     }
1272
1273     if (creature_ptr->ult_res) {
1274         result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1275     }
1276
1277     result |= check_equipment_flags(creature_ptr, TR_RES_DISEN);
1278     return result;
1279 }
1280
1281 BIT_FLAGS has_resist_shard(player_type *creature_ptr)
1282 {
1283     BIT_FLAGS result = 0L;
1284
1285     if (!creature_ptr->mimic_form && (creature_ptr->prace == RACE_HALF_GIANT || creature_ptr->prace == RACE_SKELETON))
1286         result |= 0x01U << FLAG_CAUSE_RACE;
1287
1288     if (creature_ptr->special_defense & KATA_MUSOU) {
1289         result |= 0x01U << FLAG_CAUSE_BATTLE_FORM;
1290     }
1291
1292     if (creature_ptr->ult_res) {
1293         result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1294     }
1295
1296     result |= check_equipment_flags(creature_ptr, TR_RES_SHARDS);
1297     return result;
1298 }
1299
1300 BIT_FLAGS has_resist_nexus(player_type *creature_ptr)
1301 {
1302     BIT_FLAGS result = 0L;
1303
1304     if (creature_ptr->mimic_form == MIMIC_DEMON_LORD) {
1305         result |= 0x01U << FLAG_CAUSE_RACE;
1306     }
1307
1308     if (creature_ptr->special_defense & KATA_MUSOU) {
1309         result |= 0x01U << FLAG_CAUSE_BATTLE_FORM;
1310     }
1311
1312     if (creature_ptr->ult_res) {
1313         result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1314     }
1315
1316     result |= check_equipment_flags(creature_ptr, TR_RES_NEXUS);
1317     return result;
1318 }
1319
1320 BIT_FLAGS has_resist_blind(player_type *creature_ptr)
1321 {
1322     BIT_FLAGS result = 0L;
1323
1324     if (creature_ptr->pseikaku == PERSONALITY_MUNCHKIN) {
1325         result |= 0x01U << FLAG_CAUSE_PERSONALITY;
1326     }
1327
1328     if (!creature_ptr->mimic_form && creature_ptr->prace == RACE_DWARF)
1329         result |= 0x01U << FLAG_CAUSE_RACE;
1330
1331     if (creature_ptr->special_defense & KATA_MUSOU) {
1332         result |= 0x01U << FLAG_CAUSE_BATTLE_FORM;
1333     }
1334
1335     if (creature_ptr->ult_res || creature_ptr->magicdef) {
1336         result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1337     }
1338
1339     result |= check_equipment_flags(creature_ptr, TR_RES_BLIND);
1340     return result;
1341 }
1342
1343 BIT_FLAGS has_resist_neth(player_type *creature_ptr)
1344 {
1345     BIT_FLAGS result = 0L;
1346
1347     if (creature_ptr->mimic_form == MIMIC_DEMON_LORD || creature_ptr->mimic_form == MIMIC_DEMON || creature_ptr->mimic_form == MIMIC_VAMPIRE) {
1348         result |= 0x01U << FLAG_CAUSE_RACE;
1349     }
1350
1351     if (!creature_ptr->mimic_form
1352         && (creature_ptr->prace == RACE_ZOMBIE || creature_ptr->prace == RACE_VAMPIRE || creature_ptr->prace == RACE_SPECTRE
1353             || creature_ptr->prace == RACE_BALROG))
1354         result |= 0x01U << FLAG_CAUSE_RACE;
1355
1356     if (creature_ptr->special_defense & KATA_MUSOU) {
1357         result |= 0x01U << FLAG_CAUSE_BATTLE_FORM;
1358     }
1359
1360     if (creature_ptr->ult_res || creature_ptr->tim_res_nether) {
1361         result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1362     }
1363
1364     result |= check_equipment_flags(creature_ptr, TR_RES_NETHER);
1365     return result;
1366 }
1367
1368 BIT_FLAGS has_resist_time(player_type *creature_ptr)
1369 {
1370     BIT_FLAGS result = 0L;
1371
1372     if (creature_ptr->tim_res_time) {
1373         result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1374     }
1375
1376     result |= check_equipment_flags(creature_ptr, TR_RES_TIME);
1377     return result;
1378 }
1379
1380 BIT_FLAGS has_resist_water(player_type *creature_ptr)
1381 {
1382     BIT_FLAGS result = 0L;
1383
1384     if (!creature_ptr->mimic_form && creature_ptr->prace == RACE_MERFOLK)
1385         result |= 0x01U << FLAG_CAUSE_RACE;
1386
1387     result |= check_equipment_flags(creature_ptr, TR_RES_WATER);
1388     return result;
1389 }
1390
1391 BIT_FLAGS has_resist_fear(player_type *creature_ptr)
1392 {
1393     BIT_FLAGS result = 0L;
1394
1395     if (creature_ptr->muta3 & MUT3_FEARLESS)
1396         result |= 0x01U << FLAG_CAUSE_MUTATION;
1397
1398     switch (creature_ptr->pclass) {
1399     case CLASS_WARRIOR:
1400     case CLASS_SAMURAI:
1401         if (creature_ptr->lev > 29)
1402             result |= 0x01U << FLAG_CAUSE_CLASS;
1403         break;
1404     case CLASS_PALADIN:
1405     case CLASS_CHAOS_WARRIOR:
1406         if (creature_ptr->lev > 39)
1407             result |= 0x01U << FLAG_CAUSE_CLASS;
1408         break;
1409     case CLASS_MINDCRAFTER:
1410         if (creature_ptr->lev > 9)
1411             result |= 0x01U << FLAG_CAUSE_CLASS;
1412         break;
1413     case CLASS_NINJA:
1414         result |= 0x01U << FLAG_CAUSE_CLASS;
1415         break;
1416     }
1417
1418     if (creature_ptr->mimic_form == MIMIC_DEMON_LORD) {
1419         result |= 0x01U << FLAG_CAUSE_RACE;
1420     }
1421
1422     if (!creature_ptr->mimic_form && creature_ptr->prace == RACE_BARBARIAN)
1423         result |= 0x01U << FLAG_CAUSE_RACE;
1424
1425     if ((creature_ptr->special_defense & KATA_MUSOU)) {
1426         result |= 0x01U << FLAG_CAUSE_BATTLE_FORM;
1427     }
1428
1429     if (is_hero(creature_ptr) || is_shero(creature_ptr) || creature_ptr->ult_res) {
1430         result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1431     }
1432
1433     result |= check_equipment_flags(creature_ptr, TR_RES_FEAR);
1434     return result;
1435 }
1436
1437 BIT_FLAGS has_immune_acid(player_type *creature_ptr)
1438 {
1439     BIT_FLAGS result = 0L;
1440     if (!creature_ptr->mimic_form && creature_ptr->prace == RACE_YEEK && creature_ptr->lev > 19)
1441         result |= 0x01U << FLAG_CAUSE_RACE;
1442
1443     if (creature_ptr->ele_immune) {
1444         if (creature_ptr->special_defense & DEFENSE_ACID)
1445             result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1446     }
1447
1448     result |= check_equipment_flags(creature_ptr, TR_IM_ACID);
1449     return result;
1450 }
1451
1452 BIT_FLAGS has_immune_elec(player_type *creature_ptr)
1453 {
1454     BIT_FLAGS result = 0L;
1455
1456     if (creature_ptr->ele_immune) {
1457         if (creature_ptr->special_defense & DEFENSE_ELEC)
1458             result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1459     }
1460
1461     result |= check_equipment_flags(creature_ptr, TR_IM_ELEC);
1462     return result;
1463 }
1464
1465 BIT_FLAGS has_immune_fire(player_type *creature_ptr)
1466 {
1467     BIT_FLAGS result = 0L;
1468
1469     if (creature_ptr->ele_immune) {
1470         if (creature_ptr->special_defense & DEFENSE_FIRE)
1471             result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1472     }
1473
1474     result |= check_equipment_flags(creature_ptr, TR_IM_FIRE);
1475     return result;
1476 }
1477
1478 BIT_FLAGS has_immune_cold(player_type *creature_ptr)
1479 {
1480     BIT_FLAGS result = 0L;
1481
1482     if (creature_ptr->ele_immune) {
1483         if (creature_ptr->special_defense & DEFENSE_COLD)
1484             result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1485     }
1486
1487     result |= check_equipment_flags(creature_ptr, TR_IM_COLD);
1488     return result;
1489 }
1490
1491 BIT_FLAGS has_immune_dark(player_type *creature_ptr)
1492 {
1493     BIT_FLAGS result = 0L;
1494
1495     if (is_specific_player_race(creature_ptr, RACE_VAMPIRE) || (creature_ptr->mimic_form == MIMIC_VAMPIRE)) {
1496         result |= 0x01U << FLAG_CAUSE_RACE;
1497     }
1498
1499     if (creature_ptr->wraith_form) {
1500         result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1501     }
1502
1503     return result;
1504 }
1505
1506 melee_type player_melee_type(player_type *creature_ptr)
1507 {
1508     if (has_two_handed_weapons(creature_ptr))
1509         return MELEE_TYPE_WEAPON_TWOHAND;
1510
1511     if (has_melee_weapon(creature_ptr, INVEN_MAIN_HAND)) {
1512         if (has_melee_weapon(creature_ptr, INVEN_SUB_HAND)) {
1513             return MELEE_TYPE_WEAPON_DOUBLE;
1514         }
1515         return MELEE_TYPE_WEAPON_MAIN;
1516     }
1517
1518     if (has_melee_weapon(creature_ptr, INVEN_SUB_HAND))
1519         return MELEE_TYPE_WEAPON_SUB;
1520
1521     if (empty_hands(creature_ptr, FALSE) == (EMPTY_HAND_MAIN | EMPTY_HAND_SUB))
1522         return MELEE_TYPE_BAREHAND_TWO;
1523
1524     if (empty_hands(creature_ptr, FALSE) == EMPTY_HAND_MAIN)
1525         return MELEE_TYPE_BAREHAND_MAIN;
1526
1527     if (empty_hands(creature_ptr, FALSE) == EMPTY_HAND_SUB)
1528         return MELEE_TYPE_BAREHAND_SUB;
1529
1530     return MELEE_TYPE_SHIELD_DOUBLE;
1531 }
1532
1533 /*
1534  * @brief 利き手で攻撃可能かどうかを判定する
1535  *        利き手で攻撃可能とは、利き手に武器を持っているか、
1536  *        利き手が素手かつ左手も素手もしくは盾を装備している事を意味する。
1537  * @detail Includes martial arts and hand combats as weapons.
1538  */
1539 bool can_attack_with_main_hand(player_type *creature_ptr)
1540 {
1541     if (has_melee_weapon(creature_ptr, INVEN_MAIN_HAND))
1542         return TRUE;
1543
1544     if ((empty_hands(creature_ptr, TRUE) & EMPTY_HAND_MAIN) && !can_attack_with_sub_hand(creature_ptr))
1545         return TRUE;
1546
1547     return FALSE;
1548 }
1549
1550 /*
1551  * @brief 非利き手で攻撃可能かどうかを判定する
1552  *        非利き手で攻撃可能とは、非利き手に武器を持っている事に等しい
1553  * @detail Exclude martial arts and hand combats from weapons.
1554  */
1555 bool can_attack_with_sub_hand(player_type *creature_ptr) { return has_melee_weapon(creature_ptr, INVEN_SUB_HAND); }
1556
1557 /*
1558  * @brief 両手持ち状態かどうかを判定する
1559  */
1560 bool has_two_handed_weapons(player_type *creature_ptr)
1561 {
1562     if (can_two_hands_wielding(creature_ptr)) {
1563         if (can_attack_with_main_hand(creature_ptr) && (empty_hands(creature_ptr, FALSE) == EMPTY_HAND_SUB)
1564             && object_allow_two_hands_wielding(&creature_ptr->inventory_list[INVEN_MAIN_HAND])) {
1565             return TRUE;
1566         } else if (can_attack_with_sub_hand(creature_ptr) && (empty_hands(creature_ptr, FALSE) == EMPTY_HAND_MAIN)
1567             && object_allow_two_hands_wielding(&creature_ptr->inventory_list[INVEN_SUB_HAND])) {
1568             return TRUE;
1569         }
1570     }
1571     return FALSE;
1572 }
1573
1574 BIT_FLAGS has_lite(player_type *creature_ptr)
1575 {
1576     BIT_FLAGS result = 0L;
1577     if (creature_ptr->pclass == CLASS_NINJA)
1578         return 0L;
1579
1580     if (creature_ptr->pseikaku == PERSONALITY_MUNCHKIN) {
1581         result |= 0x01U << FLAG_CAUSE_PERSONALITY;
1582     }
1583
1584     if (creature_ptr->mimic_form == MIMIC_VAMPIRE) {
1585         result |= 0x01U << FLAG_CAUSE_RACE;
1586     }
1587
1588     if (!creature_ptr->mimic_form && creature_ptr->prace == RACE_VAMPIRE)
1589         result |= 0x01U << FLAG_CAUSE_RACE;
1590
1591     if (creature_ptr->ult_res) {
1592         result |= 0x01U << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1593     }
1594
1595     if (creature_ptr->special_defense & KATA_MUSOU) {
1596         result |= 0x01U << FLAG_CAUSE_BATTLE_FORM;
1597     }
1598
1599     result |= has_sh_fire(creature_ptr);
1600
1601     return result;
1602 }
1603
1604 /*
1605  * @brief 両手持ちボーナスがもらえないかどうかを判定する。 / Does *not * get two hand wielding bonus.
1606  * @detail
1607  *  Only can get hit bonuses when wieids an enough light weapon which is lighter than 5 times of weight limit.
1608  *  If its weight is 10 times heavier or more than weight limit, gets hit penalty in calc_to_hit().
1609  */
1610 bool has_disable_two_handed_bonus(player_type *creature_ptr, int i)
1611 {
1612     if (has_melee_weapon(creature_ptr, INVEN_MAIN_HAND + i) && has_two_handed_weapons(creature_ptr)) {
1613         object_type *o_ptr = &creature_ptr->inventory_list[INVEN_MAIN_HAND + i];
1614         int limit = calc_weapon_weight_limit(creature_ptr) * 2;
1615
1616         /* Enable when two hand wields an enough light weapon */
1617         if (limit >= o_ptr->weight / 5)
1618             return FALSE;
1619     }
1620
1621     /* Disable when empty hands, one hand wieldings and heavy weapons */
1622     return TRUE;
1623 }
1624
1625 /*
1626  * todo 相応しい時にFALSEで相応しくない時にTRUEという負論理は良くない、後で修正する
1627  */
1628 bool has_icky_wield_weapon(player_type *creature_ptr, int i)
1629 {
1630     BIT_FLAGS flgs[TR_FLAG_SIZE];
1631     object_type *o_ptr = &creature_ptr->inventory_list[INVEN_MAIN_HAND + i];
1632     object_flags(creature_ptr, o_ptr, flgs);
1633
1634     bool has_no_weapon = (o_ptr->tval == TV_NONE) || (o_ptr->tval == TV_SHIELD);
1635     if (creature_ptr->pclass == CLASS_PRIEST) {
1636         bool is_suitable_weapon = has_flag(flgs, TR_BLESSED);
1637         is_suitable_weapon |= (o_ptr->tval != TV_SWORD) && (o_ptr->tval != TV_POLEARM);
1638         return !has_no_weapon && !is_suitable_weapon;
1639     }
1640
1641     if (creature_ptr->pclass == CLASS_SORCERER) {
1642         bool is_suitable_weapon = o_ptr->tval == TV_HAFTED;
1643         is_suitable_weapon &= (o_ptr->sval == SV_WIZSTAFF) || (o_ptr->sval == SV_NAMAKE_HAMMER);
1644         return !has_no_weapon && !is_suitable_weapon;
1645     }
1646
1647     if (has_not_monk_weapon(creature_ptr, i) || has_not_ninja_weapon(creature_ptr, i))
1648         return TRUE;
1649
1650     return FALSE;
1651 }
1652
1653 bool has_riding_wield_weapon(player_type *creature_ptr, int i)
1654 {
1655     object_type *o_ptr;
1656     BIT_FLAGS flgs[TR_FLAG_SIZE];
1657     o_ptr = &creature_ptr->inventory_list[INVEN_MAIN_HAND + i];
1658     object_flags(creature_ptr, o_ptr, flgs);
1659     if (creature_ptr->riding != 0 && !(o_ptr->tval == TV_POLEARM) && ((o_ptr->sval == SV_LANCE) || (o_ptr->sval == SV_HEAVY_LANCE))
1660         && !has_flag(flgs, TR_RIDING)) {
1661         return TRUE;
1662     }
1663     return FALSE;
1664 }
1665
1666 bool has_not_ninja_weapon(player_type *creature_ptr, int i)
1667 {
1668     if (!has_melee_weapon(creature_ptr, INVEN_MAIN_HAND + i)) {
1669         return FALSE;
1670     }
1671     tval_type tval = creature_ptr->inventory_list[INVEN_MAIN_HAND + i].tval - TV_WEAPON_BEGIN;
1672     OBJECT_SUBTYPE_VALUE sval = creature_ptr->inventory_list[INVEN_MAIN_HAND + i].sval;
1673     return creature_ptr->pclass == CLASS_NINJA
1674         && !((s_info[CLASS_NINJA].w_max[tval][sval] > WEAPON_EXP_BEGINNER) && (creature_ptr->inventory_list[INVEN_SUB_HAND - i].tval != TV_SHIELD));
1675 }
1676
1677 bool has_not_monk_weapon(player_type *creature_ptr, int i)
1678 {
1679     if (!has_melee_weapon(creature_ptr, INVEN_MAIN_HAND + i)) {
1680         return FALSE;
1681     }
1682     tval_type tval = creature_ptr->inventory_list[INVEN_MAIN_HAND + i].tval - TV_WEAPON_BEGIN;
1683     OBJECT_SUBTYPE_VALUE sval = creature_ptr->inventory_list[INVEN_MAIN_HAND + i].sval;
1684     return ((creature_ptr->pclass == CLASS_MONK) || (creature_ptr->pclass == CLASS_FORCETRAINER)) && !(s_info[creature_ptr->pclass].w_max[tval][sval]);
1685 }
1686
1687 bool has_good_luck(player_type *creature_ptr) { return (creature_ptr->pseikaku == PERSONALITY_LUCKY) || (creature_ptr->muta3 & MUT3_GOOD_LUCK); }
1688
1689 BIT_FLAGS player_aggravate_state(player_type *creature_ptr)
1690 {
1691     if (creature_ptr->cursed & TRC_AGGRAVATE) {
1692         if ((is_specific_player_race(creature_ptr, RACE_S_FAIRY)) && (creature_ptr->pseikaku != PERSONALITY_SEXY)) {
1693             return AGGRAVATE_S_FAIRY;
1694         }
1695         return AGGRAVATE_NORMAL;
1696     }
1697
1698     return AGGRAVATE_NONE;
1699 }
1700
1701 bool has_aggravate(player_type *creature_ptr) { return player_aggravate_state(creature_ptr) == AGGRAVATE_NORMAL; }