OSDN Git Service

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