OSDN Git Service

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