OSDN Git Service

da2164edc37fad49b78137952402c320c10fddde
[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     if ((is_specific_player_race(creature_ptr, RACE_S_FAIRY)) && (creature_ptr->pseikaku != PERSONALITY_SEXY) && (creature_ptr->cursed & TRC_AGGRAVATE)) {
952         creature_ptr->cursed &= ~(TRC_AGGRAVATE);
953     }
954 }
955
956 BIT_FLAGS has_impact(player_type *creature_ptr)
957 {
958     return check_equipment_flags(creature_ptr, TR_IMPACT);
959 }
960
961 void has_extra_blow(player_type *creature_ptr)
962 {
963     object_type *o_ptr;
964     BIT_FLAGS flgs[TR_FLAG_SIZE];
965     creature_ptr->extra_blows[0] = creature_ptr->extra_blows[1] = 0;
966
967     for (inventory_slot_type i = INVEN_RARM; i < INVEN_TOTAL; i++) {
968         o_ptr = &creature_ptr->inventory_list[i];
969         if (!o_ptr->k_idx)
970             continue;
971
972         object_flags(creature_ptr, o_ptr, flgs);
973         if (has_flag(flgs, TR_BLOWS)) {
974             if ((i == INVEN_RARM || i == INVEN_RIGHT) && !has_two_handed_weapons(creature_ptr))
975                 creature_ptr->extra_blows[0] += o_ptr->pval;
976             else if ((i == INVEN_LARM || i == INVEN_LEFT) && !has_two_handed_weapons(creature_ptr))
977                 creature_ptr->extra_blows[1] += o_ptr->pval;
978             else {
979                 creature_ptr->extra_blows[0] += o_ptr->pval;
980                 creature_ptr->extra_blows[1] += o_ptr->pval;
981             }
982         }
983     }
984 }
985
986 BIT_FLAGS has_resist_acid(player_type *creature_ptr)
987 {
988     BIT_FLAGS result = 0L;
989
990     if (creature_ptr->mimic_form == MIMIC_DEMON_LORD) {
991         result |= 0x01 << FLAG_CAUSE_RACE;
992     } else if (is_specific_player_race(creature_ptr, RACE_YEEK) || is_specific_player_race(creature_ptr, RACE_KLACKON)) {
993         result |= 0x01 << FLAG_CAUSE_RACE;
994     } else if (is_specific_player_race(creature_ptr, RACE_DRACONIAN) && creature_ptr->lev > 14) {
995         result |= 0x01 << FLAG_CAUSE_RACE;
996     }
997
998     if (creature_ptr->special_defense & KAMAE_SEIRYU || creature_ptr->special_defense & KATA_MUSOU) {
999         result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
1000     }
1001
1002     if (creature_ptr->ult_res) {
1003         result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1004     }
1005
1006     result |= has_immune_acid(creature_ptr);
1007
1008     result |= check_equipment_flags(creature_ptr, TR_RES_ACID);
1009     return result;
1010 }
1011
1012 BIT_FLAGS has_vuln_acid(player_type *creature_ptr)
1013 {
1014     BIT_FLAGS result = 0L;
1015     if (creature_ptr->muta3 & MUT3_VULN_ELEM) {
1016         result |= 0x01 << FLAG_CAUSE_MUTATION;
1017     }
1018
1019     if (creature_ptr->special_defense & KATA_KOUKIJIN) {
1020         result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
1021     }
1022     return result;
1023 }
1024
1025 BIT_FLAGS has_resist_elec(player_type *creature_ptr)
1026 {
1027     BIT_FLAGS result = 0L;
1028
1029     if (creature_ptr->mimic_form == MIMIC_DEMON_LORD) {
1030         result |= 0x01 << FLAG_CAUSE_RACE;
1031     } else if (is_specific_player_race(creature_ptr, RACE_DRACONIAN) && creature_ptr->lev > 19) {
1032         result |= 0x01 << FLAG_CAUSE_RACE;
1033     }
1034
1035     if (creature_ptr->special_defense & KAMAE_SEIRYU || creature_ptr->special_defense & KATA_MUSOU) {
1036         result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
1037     }
1038
1039     if (creature_ptr->ult_res) {
1040         result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1041     }
1042
1043     result |= check_equipment_flags(creature_ptr, TR_RES_ELEC);
1044     result |= has_immune_elec(creature_ptr);
1045     return result;
1046 }
1047
1048 BIT_FLAGS has_vuln_elec(player_type *creature_ptr)
1049 {
1050     BIT_FLAGS result = 0L;
1051     if (creature_ptr->muta3 & MUT3_VULN_ELEM) {
1052         result |= 0x01 << FLAG_CAUSE_MUTATION;
1053     }
1054
1055     if (is_specific_player_race(creature_ptr, RACE_ANDROID)) {
1056         result |= 0x01 << FLAG_CAUSE_RACE;
1057     }
1058
1059     if (creature_ptr->special_defense & KATA_KOUKIJIN) {
1060         result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
1061     }
1062     return result;
1063 }
1064
1065 BIT_FLAGS has_resist_fire(player_type *creature_ptr)
1066 {
1067     BIT_FLAGS result = 0L;
1068
1069     if (creature_ptr->mimic_form == MIMIC_DEMON || creature_ptr->mimic_form == MIMIC_DEMON_LORD) {
1070         result |= 0x01 << FLAG_CAUSE_RACE;
1071     }
1072
1073     if (is_specific_player_race(creature_ptr, RACE_DRACONIAN) && creature_ptr->lev > 4) {
1074         result |= 0x01 << FLAG_CAUSE_RACE;
1075     }
1076
1077     if (!creature_ptr->mimic_form && (creature_ptr->prace == RACE_IMP || creature_ptr->prace == RACE_BALROG)) {
1078         result |= 0x01 << FLAG_CAUSE_RACE;
1079     }
1080
1081     if (creature_ptr->special_defense & KAMAE_SEIRYU || creature_ptr->special_defense & KATA_MUSOU) {
1082         result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
1083     }
1084
1085     if (creature_ptr->ult_res) {
1086         result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1087     }
1088
1089     result |= check_equipment_flags(creature_ptr, TR_RES_FIRE);
1090     result |= has_immune_fire(creature_ptr);
1091     return result;
1092 }
1093
1094 BIT_FLAGS has_vuln_fire(player_type *creature_ptr)
1095 {
1096     BIT_FLAGS result = 0L;
1097     if (creature_ptr->muta3 & MUT3_VULN_ELEM) {
1098         result |= 0x01 << FLAG_CAUSE_MUTATION;
1099     }
1100
1101     if (is_specific_player_race(creature_ptr, RACE_ENT)) {
1102         result |= 0x01 << FLAG_CAUSE_RACE;
1103     }
1104
1105     if (creature_ptr->special_defense & KATA_KOUKIJIN) {
1106         result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
1107     }
1108     return result;
1109 }
1110
1111 BIT_FLAGS has_resist_cold(player_type *creature_ptr)
1112 {
1113     BIT_FLAGS result = 0L;
1114
1115     if (creature_ptr->mimic_form == MIMIC_DEMON_LORD || creature_ptr->mimic_form == MIMIC_VAMPIRE) {
1116         result |= 0x01 << FLAG_CAUSE_RACE;
1117     }
1118
1119     if (!creature_ptr->mimic_form && (creature_ptr->prace == RACE_ZOMBIE) && creature_ptr->lev > 4) {
1120         result |= 0x01 << FLAG_CAUSE_RACE;
1121     }
1122
1123     if ((is_specific_player_race(creature_ptr, RACE_DRACONIAN) || is_specific_player_race(creature_ptr, RACE_SKELETON)) && creature_ptr->lev > 9) {
1124         result |= 0x01 << FLAG_CAUSE_RACE;
1125     }
1126
1127     if (!creature_ptr->mimic_form && (creature_ptr->prace == RACE_VAMPIRE || creature_ptr->prace == RACE_SPECTRE)) {
1128         result |= 0x01 << FLAG_CAUSE_RACE;
1129     }
1130
1131     if (creature_ptr->special_defense & KAMAE_SEIRYU || creature_ptr->special_defense & KATA_MUSOU) {
1132         result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
1133     }
1134
1135     if (creature_ptr->ult_res) {
1136         result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1137     }
1138
1139     result |= check_equipment_flags(creature_ptr, TR_RES_COLD);
1140     result |= has_immune_cold(creature_ptr);
1141     return result;
1142 }
1143
1144 BIT_FLAGS has_vuln_cold(player_type *creature_ptr)
1145 {
1146     BIT_FLAGS result = 0L;
1147     if (creature_ptr->muta3 & MUT3_VULN_ELEM) {
1148         result |= 0x01 << FLAG_CAUSE_MUTATION;
1149     }
1150
1151     if (creature_ptr->special_defense & KATA_KOUKIJIN) {
1152         result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
1153     }
1154     return result;
1155 }
1156
1157 BIT_FLAGS has_resist_pois(player_type *creature_ptr)
1158 {
1159     BIT_FLAGS result = 0L;
1160
1161     if (creature_ptr->pclass == CLASS_NINJA && creature_ptr->lev > 19)
1162         result |= 0x01 << FLAG_CAUSE_CLASS;
1163
1164     if (creature_ptr->mimic_form == MIMIC_VAMPIRE || creature_ptr->mimic_form == MIMIC_DEMON_LORD) {
1165         result |= 0x01 << FLAG_CAUSE_RACE;
1166     }
1167
1168     if (is_specific_player_race(creature_ptr, RACE_DRACONIAN) && creature_ptr->lev > 34) {
1169         result |= 0x01 << FLAG_CAUSE_RACE;
1170     }
1171
1172     if (!creature_ptr->mimic_form
1173         && (creature_ptr->prace == RACE_KOBOLD || creature_ptr->prace == RACE_GOLEM || creature_ptr->prace == RACE_SKELETON
1174             || creature_ptr->prace == RACE_VAMPIRE || creature_ptr->prace == RACE_SPECTRE || creature_ptr->prace == RACE_ANDROID)) {
1175         result |= 0x01 << FLAG_CAUSE_RACE;
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_POIS);
1187     return result;
1188 }
1189
1190 BIT_FLAGS has_resist_conf(player_type *creature_ptr)
1191 {
1192     BIT_FLAGS result = 0L;
1193
1194     if (creature_ptr->pclass == CLASS_MINDCRAFTER && creature_ptr->lev > 29)
1195         result |= 0x01 << FLAG_CAUSE_CLASS;
1196
1197     if (creature_ptr->pseikaku == PERSONALITY_CHARGEMAN || creature_ptr->pseikaku == PERSONALITY_MUNCHKIN) {
1198         result |= 0x01 << FLAG_CAUSE_PERSONALITY;
1199     }
1200
1201     if (!creature_ptr->mimic_form && (creature_ptr->prace == RACE_KLACKON || creature_ptr->prace == RACE_BEASTMAN || creature_ptr->prace == RACE_KUTAR)) {
1202         result |= 0x01 << FLAG_CAUSE_RACE;
1203     }
1204
1205     if (creature_ptr->mimic_form == MIMIC_DEMON_LORD) {
1206         result |= 0x01 << FLAG_CAUSE_RACE;
1207     }
1208
1209     if (creature_ptr->ult_res || creature_ptr->magicdef) {
1210         result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1211     }
1212
1213     if (creature_ptr->special_defense & KATA_MUSOU) {
1214         result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
1215     }
1216
1217     result |= check_equipment_flags(creature_ptr, TR_RES_CONF);
1218     return result;
1219 }
1220
1221 BIT_FLAGS has_resist_sound(player_type *creature_ptr)
1222 {
1223     BIT_FLAGS result = 0L;
1224
1225     if (creature_ptr->pclass == CLASS_BARD) {
1226         result |= 0x01 << FLAG_CAUSE_CLASS;
1227     }
1228
1229     if (!creature_ptr->mimic_form && (creature_ptr->prace == RACE_CYCLOPS || creature_ptr->prace == RACE_BEASTMAN)) {
1230         result |= 0x01 << FLAG_CAUSE_RACE;
1231     }
1232
1233     if (creature_ptr->special_defense & KATA_MUSOU) {
1234         result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
1235     }
1236
1237     if (creature_ptr->ult_res) {
1238         result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1239     }
1240
1241     result |= check_equipment_flags(creature_ptr, TR_RES_SOUND);
1242     return result;
1243 }
1244
1245 BIT_FLAGS has_resist_lite(player_type *creature_ptr)
1246 {
1247     BIT_FLAGS result = 0L;
1248
1249     if (!creature_ptr->mimic_form && (creature_ptr->prace == RACE_ELF || creature_ptr->prace == RACE_HIGH_ELF || creature_ptr->prace == RACE_SPRITE)) {
1250         result |= 0x01 << FLAG_CAUSE_RACE;
1251     }
1252
1253     if (creature_ptr->special_defense & KATA_MUSOU) {
1254         result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
1255     }
1256
1257     if (creature_ptr->ult_res) {
1258         result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1259     }
1260
1261     result |= check_equipment_flags(creature_ptr, TR_RES_LITE);
1262     return result;
1263 }
1264
1265 BIT_FLAGS has_vuln_lite(player_type *creature_ptr)
1266 {
1267     BIT_FLAGS result = 0L;
1268     if (is_specific_player_race(creature_ptr, RACE_S_FAIRY) || is_specific_player_race(creature_ptr, RACE_VAMPIRE)
1269         || (creature_ptr->mimic_form == MIMIC_VAMPIRE)) {
1270         result |= 0x01 << FLAG_CAUSE_RACE;
1271     }
1272
1273     if (creature_ptr->wraith_form) {
1274         result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1275     }
1276
1277     return result;
1278 }
1279
1280 BIT_FLAGS has_resist_dark(player_type *creature_ptr)
1281 {
1282     BIT_FLAGS result = 0L;
1283
1284     if (creature_ptr->mimic_form == MIMIC_VAMPIRE) {
1285         result |= 0x01 << FLAG_CAUSE_RACE;
1286     }
1287
1288     if (!creature_ptr->mimic_form
1289         && (creature_ptr->prace == RACE_HALF_ORC || creature_ptr->prace == RACE_HALF_OGRE || creature_ptr->prace == RACE_NIBELUNG
1290             || creature_ptr->prace == RACE_DARK_ELF || creature_ptr->prace == RACE_VAMPIRE)) {
1291         result |= 0x01 << FLAG_CAUSE_RACE;
1292     }
1293
1294     if (creature_ptr->special_defense & KATA_MUSOU) {
1295         result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
1296     }
1297
1298     if (creature_ptr->ult_res) {
1299         result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1300     }
1301
1302     result |= check_equipment_flags(creature_ptr, TR_RES_DARK);
1303     return result;
1304 }
1305
1306 BIT_FLAGS has_resist_chaos(player_type *creature_ptr)
1307 {
1308     BIT_FLAGS result = 0L;
1309
1310     if (creature_ptr->pclass == CLASS_CHAOS_WARRIOR && creature_ptr->lev > 29)
1311         result |= 0x01 << FLAG_CAUSE_CLASS;
1312
1313     if (creature_ptr->mimic_form == MIMIC_DEMON || creature_ptr->mimic_form == MIMIC_DEMON_LORD) {
1314         result |= 0x01 << FLAG_CAUSE_RACE;
1315     }
1316
1317     if (!creature_ptr->mimic_form && creature_ptr->prace == RACE_HALF_TITAN)
1318         result |= 0x01 << FLAG_CAUSE_RACE;
1319
1320     if (creature_ptr->special_defense & KATA_MUSOU) {
1321         result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
1322     }
1323
1324     if (creature_ptr->ult_res) {
1325         result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1326     }
1327
1328     result |= check_equipment_flags(creature_ptr, TR_RES_CHAOS);
1329     return result;
1330 }
1331
1332 BIT_FLAGS has_resist_disen(player_type *creature_ptr)
1333 {
1334     BIT_FLAGS result = 0L;
1335
1336     if (creature_ptr->mimic_form == MIMIC_DEMON_LORD) {
1337         result |= 0x01 << FLAG_CAUSE_RACE;
1338     }
1339
1340     if (!creature_ptr->mimic_form && creature_ptr->prace == RACE_NIBELUNG)
1341         result |= 0x01 << FLAG_CAUSE_RACE;
1342
1343     if (creature_ptr->special_defense & KATA_MUSOU) {
1344         result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
1345     }
1346
1347     if (creature_ptr->ult_res) {
1348         result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1349     }
1350
1351     result |= check_equipment_flags(creature_ptr, TR_RES_DISEN);
1352     return result;
1353 }
1354
1355 BIT_FLAGS has_resist_shard(player_type *creature_ptr)
1356 {
1357     BIT_FLAGS result = 0L;
1358
1359     if (!creature_ptr->mimic_form && (creature_ptr->prace == RACE_HALF_TITAN || creature_ptr->prace == RACE_SKELETON))
1360         result |= 0x01 << FLAG_CAUSE_RACE;
1361
1362     if (creature_ptr->special_defense & KATA_MUSOU) {
1363         result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
1364     }
1365
1366     if (creature_ptr->ult_res) {
1367         result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1368     }
1369
1370     result |= check_equipment_flags(creature_ptr, TR_RES_SHARDS);
1371     return result;
1372 }
1373
1374 BIT_FLAGS has_resist_nexus(player_type *creature_ptr)
1375 {
1376     BIT_FLAGS result = 0L;
1377
1378     if (creature_ptr->mimic_form == MIMIC_DEMON_LORD) {
1379         result |= 0x01 << FLAG_CAUSE_RACE;
1380     }
1381
1382     if (creature_ptr->special_defense & KATA_MUSOU) {
1383         result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
1384     }
1385
1386     if (creature_ptr->ult_res) {
1387         result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1388     }
1389
1390     result |= check_equipment_flags(creature_ptr, TR_RES_NEXUS);
1391     return result;
1392 }
1393
1394 BIT_FLAGS has_resist_blind(player_type *creature_ptr)
1395 {
1396     BIT_FLAGS result = 0L;
1397
1398     if (creature_ptr->pseikaku == PERSONALITY_MUNCHKIN) {
1399         result |= 0x01 << FLAG_CAUSE_PERSONALITY;
1400     }
1401
1402     if (!creature_ptr->mimic_form && creature_ptr->prace == RACE_DWARF)
1403         result |= 0x01 << FLAG_CAUSE_RACE;
1404
1405     if (creature_ptr->special_defense & KATA_MUSOU) {
1406         result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
1407     }
1408
1409     if (creature_ptr->ult_res || creature_ptr->magicdef) {
1410         result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1411     }
1412
1413     result |= check_equipment_flags(creature_ptr, TR_RES_BLIND);
1414     return result;
1415 }
1416
1417 BIT_FLAGS has_resist_neth(player_type *creature_ptr)
1418 {
1419     BIT_FLAGS result = 0L;
1420
1421     if (creature_ptr->mimic_form == MIMIC_DEMON_LORD || creature_ptr->mimic_form == MIMIC_DEMON || creature_ptr->mimic_form == MIMIC_VAMPIRE) {
1422         result |= 0x01 << FLAG_CAUSE_RACE;
1423     }
1424
1425     if (!creature_ptr->mimic_form
1426         && (creature_ptr->prace == RACE_ZOMBIE || creature_ptr->prace == RACE_VAMPIRE || creature_ptr->prace == RACE_SPECTRE
1427             || creature_ptr->prace == RACE_BALROG))
1428         result |= 0x01 << FLAG_CAUSE_RACE;
1429
1430     if (creature_ptr->special_defense & KATA_MUSOU) {
1431         result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
1432     }
1433
1434     if (creature_ptr->ult_res || creature_ptr->tim_res_nether) {
1435         result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1436     }
1437
1438     result |= check_equipment_flags(creature_ptr, TR_RES_NETHER);
1439     return result;
1440 }
1441
1442 BIT_FLAGS has_resist_time(player_type *creature_ptr)
1443 {
1444     BIT_FLAGS result = 0L;
1445
1446     if (creature_ptr->tim_res_time) {
1447         result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1448     }
1449
1450     result |= check_equipment_flags(creature_ptr, TR_RES_TIME);
1451     return result;
1452 }
1453
1454 BIT_FLAGS has_resist_water(player_type *creature_ptr)
1455 {
1456     BIT_FLAGS result = 0L;
1457
1458     if (!creature_ptr->mimic_form && creature_ptr->prace == RACE_MERFOLK)
1459         result |= 0x01 << FLAG_CAUSE_RACE;
1460
1461     result |= check_equipment_flags(creature_ptr, TR_RES_WATER);
1462     return result;
1463 }
1464
1465 BIT_FLAGS has_resist_fear(player_type *creature_ptr)
1466 {
1467     BIT_FLAGS result = 0L;
1468
1469     if (creature_ptr->muta3 & MUT3_FEARLESS)
1470         result |= 0x01 << FLAG_CAUSE_MUTATION;
1471
1472     switch (creature_ptr->pclass) {
1473     case CLASS_WARRIOR:
1474     case CLASS_SAMURAI:
1475         if (creature_ptr->lev > 29)
1476             result |= 0x01 << FLAG_CAUSE_CLASS;
1477         break;
1478     case CLASS_PALADIN:
1479     case CLASS_CHAOS_WARRIOR:
1480         if (creature_ptr->lev > 39)
1481             result |= 0x01 << FLAG_CAUSE_CLASS;
1482         break;
1483     case CLASS_MINDCRAFTER:
1484         if (creature_ptr->lev > 9)
1485             result |= 0x01 << FLAG_CAUSE_CLASS;
1486         break;
1487     case CLASS_NINJA:
1488         result |= 0x01 << FLAG_CAUSE_CLASS;
1489         break;
1490     }
1491
1492     if (creature_ptr->mimic_form == MIMIC_DEMON_LORD) {
1493         result |= 0x01 << FLAG_CAUSE_RACE;
1494     }
1495
1496     if (!creature_ptr->mimic_form && creature_ptr->prace == RACE_BARBARIAN)
1497         result |= 0x01 << FLAG_CAUSE_RACE;
1498
1499     if ((creature_ptr->special_defense & KATA_MUSOU)) {
1500         result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
1501     }
1502
1503     if (is_hero(creature_ptr) || is_shero(creature_ptr) || creature_ptr->ult_res) {
1504         result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1505     }
1506
1507     result |= check_equipment_flags(creature_ptr, TR_RES_FEAR);
1508     return result;
1509 }
1510
1511 BIT_FLAGS has_immune_acid(player_type *creature_ptr)
1512 {
1513     BIT_FLAGS result = 0L;
1514     if (!creature_ptr->mimic_form && creature_ptr->prace == RACE_YEEK && creature_ptr->lev > 19)
1515         result |= 0x01 << FLAG_CAUSE_RACE;
1516
1517     if (creature_ptr->ele_immune) {
1518         if (creature_ptr->special_defense & DEFENSE_ACID)
1519             result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1520     }
1521
1522     result |= check_equipment_flags(creature_ptr, TR_IM_ACID);
1523     return result;
1524 }
1525
1526 BIT_FLAGS has_immune_elec(player_type *creature_ptr)
1527 {
1528     BIT_FLAGS result = 0L;
1529
1530     if (creature_ptr->ele_immune) {
1531         if (creature_ptr->special_defense & DEFENSE_ELEC)
1532             result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1533     }
1534
1535     result |= check_equipment_flags(creature_ptr, TR_IM_ELEC);
1536     return result;
1537 }
1538
1539 BIT_FLAGS has_immune_fire(player_type *creature_ptr)
1540 {
1541     BIT_FLAGS result = 0L;
1542
1543     if (creature_ptr->ele_immune) {
1544         if (creature_ptr->special_defense & DEFENSE_FIRE)
1545             result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1546     }
1547
1548     result |= check_equipment_flags(creature_ptr, TR_IM_FIRE);
1549     return result;
1550 }
1551
1552 BIT_FLAGS has_immune_cold(player_type *creature_ptr)
1553 {
1554     BIT_FLAGS result = 0L;
1555
1556     if (creature_ptr->ele_immune) {
1557         if (creature_ptr->special_defense & DEFENSE_COLD)
1558             result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1559     }
1560
1561     result |= check_equipment_flags(creature_ptr, TR_IM_COLD);
1562     return result;
1563 }
1564
1565 BIT_FLAGS has_immune_dark(player_type *creature_ptr)
1566 {
1567     BIT_FLAGS result = 0L;
1568
1569     if (is_specific_player_race(creature_ptr, RACE_VAMPIRE) || (creature_ptr->mimic_form == MIMIC_VAMPIRE)) {
1570         result |= 0x01 << FLAG_CAUSE_RACE;
1571     }
1572
1573     if (creature_ptr->wraith_form) {
1574         result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1575     }
1576
1577     return result;
1578 }
1579
1580 /*
1581  * @brief 右手(利き手)が武器を持っているかどうかを判定する
1582  * @detail Includes martial arts and hand combats as weapons.
1583  */
1584 bool has_right_hand_weapon(player_type *creature_ptr)
1585 {
1586     if (has_melee_weapon(creature_ptr, INVEN_RARM))
1587         return TRUE;
1588
1589     if ((empty_hands(creature_ptr, TRUE) & EMPTY_HAND_RARM) && !has_left_hand_weapon(creature_ptr))
1590         return TRUE;
1591
1592     return FALSE;
1593 }
1594
1595 /*
1596  * @brief 左手(非利き手)が武器を持っているかどうかを判定する
1597  * @detail Exclude martial arts and hand combats from weapons.
1598  */
1599 bool has_left_hand_weapon(player_type *creature_ptr) { return has_melee_weapon(creature_ptr, INVEN_LARM); }
1600
1601 bool has_two_handed_weapons(player_type *creature_ptr)
1602 {
1603     if (can_two_hands_wielding(creature_ptr)) {
1604         if (has_right_hand_weapon(creature_ptr) && (empty_hands(creature_ptr, FALSE) == EMPTY_HAND_LARM)
1605             && object_allow_two_hands_wielding(&creature_ptr->inventory_list[INVEN_RARM])) {
1606             return TRUE;
1607         } else if (has_left_hand_weapon(creature_ptr) && (empty_hands(creature_ptr, FALSE) == EMPTY_HAND_RARM)
1608             && object_allow_two_hands_wielding(&creature_ptr->inventory_list[INVEN_LARM])) {
1609             return TRUE;
1610         }
1611     }
1612     return FALSE;
1613 }
1614
1615 BIT_FLAGS has_lite(player_type *creature_ptr)
1616 {
1617     BIT_FLAGS result = 0L;
1618     if (creature_ptr->pclass == CLASS_NINJA)
1619         return 0L;
1620
1621     if (creature_ptr->pseikaku == PERSONALITY_MUNCHKIN) {
1622         result |= 0x01 << FLAG_CAUSE_PERSONALITY;
1623     }
1624
1625     if (creature_ptr->mimic_form == MIMIC_VAMPIRE) {
1626         result |= 0x01 << FLAG_CAUSE_RACE;
1627     }
1628
1629     if (!creature_ptr->mimic_form && creature_ptr->prace == RACE_VAMPIRE)
1630         result |= 0x01 << FLAG_CAUSE_RACE;
1631
1632     if (creature_ptr->ult_res) {
1633         result |= 0x01 << FLAG_CAUSE_MAGIC_TIME_EFFECT;
1634     }
1635
1636     if (creature_ptr->special_defense & KATA_MUSOU) {
1637         result |= 0x01 << FLAG_CAUSE_BATTLE_FORM;
1638     }
1639
1640     result |= has_sh_fire(creature_ptr);
1641
1642     return result;
1643 }
1644
1645 /*
1646  * @brief 両手持ちボーナスがもらえないかどうかを判定する。 / Does *not * get two hand wielding bonus.
1647  * @detail
1648  *  Only can get hit bonuses when wieids an enough light weapon which is lighter than 5 times of weight limit.
1649  *  If its weight is 10 times heavier or more than weight limit, gets hit penalty in calc_to_hit().
1650  */
1651 bool has_disable_two_handed_bonus(player_type *creature_ptr, int i)
1652 {
1653     if (has_melee_weapon(creature_ptr, INVEN_RARM + i) && has_two_handed_weapons(creature_ptr)) {
1654         object_type *o_ptr = &creature_ptr->inventory_list[INVEN_RARM + i];
1655         int limit = calc_weapon_weight_limit(creature_ptr) * 2;
1656
1657         /* Enable when two hand wields an enough light weapon */
1658         if (limit >= o_ptr->weight / 5)
1659             return FALSE;
1660     }
1661
1662     /* Disable when empty hands, one hand wieldings and heavy weapons */
1663     return TRUE;
1664 }
1665
1666 bool has_icky_wield_weapon(player_type *creature_ptr, int i)
1667 {
1668     object_type *o_ptr;
1669     BIT_FLAGS flgs[TR_FLAG_SIZE];
1670     o_ptr = &creature_ptr->inventory_list[INVEN_RARM + i];
1671     object_flags(creature_ptr, o_ptr, flgs);
1672
1673     if ((creature_ptr->pclass == CLASS_PRIEST) && (!(has_flag(flgs, TR_BLESSED))) && ((o_ptr->tval == TV_SWORD) || (o_ptr->tval == TV_POLEARM))) {
1674         return TRUE;
1675     } else if (creature_ptr->pclass == CLASS_SORCERER) {
1676         if (!((o_ptr->tval == TV_HAFTED) && ((o_ptr->sval == SV_WIZSTAFF) || (o_ptr->sval == SV_NAMAKE_HAMMER)))) {
1677             return TRUE;
1678         }
1679     }
1680     if (has_not_monk_weapon(creature_ptr, i) || has_not_ninja_weapon(creature_ptr, i)) {
1681         return TRUE;
1682     }
1683     return FALSE;
1684 }
1685
1686 bool has_riding_wield_weapon(player_type *creature_ptr, int i)
1687 {
1688     object_type *o_ptr;
1689     BIT_FLAGS flgs[TR_FLAG_SIZE];
1690     o_ptr = &creature_ptr->inventory_list[INVEN_RARM + i];
1691     object_flags(creature_ptr, o_ptr, flgs);
1692     if (creature_ptr->riding != 0 && !(o_ptr->tval == TV_POLEARM) && ((o_ptr->sval == SV_LANCE) || (o_ptr->sval == SV_HEAVY_LANCE))
1693         && !has_flag(flgs, TR_RIDING)) {
1694         return TRUE;
1695     }
1696     return FALSE;
1697 }
1698
1699 bool has_not_ninja_weapon(player_type *creature_ptr, int i)
1700 {
1701     if (!has_melee_weapon(creature_ptr, INVEN_RARM + i)) {
1702         return FALSE;
1703     }
1704     tval_type tval = creature_ptr->inventory_list[INVEN_RARM + i].tval - TV_WEAPON_BEGIN;
1705     OBJECT_SUBTYPE_VALUE sval = creature_ptr->inventory_list[INVEN_RARM + i].sval;
1706     return creature_ptr->pclass == CLASS_NINJA
1707         && !((s_info[CLASS_NINJA].w_max[tval][sval] > WEAPON_EXP_BEGINNER) && (creature_ptr->inventory_list[INVEN_LARM - i].tval != TV_SHIELD));
1708 }
1709
1710 bool has_not_monk_weapon(player_type *creature_ptr, int i)
1711 {
1712     if (!has_melee_weapon(creature_ptr, INVEN_RARM + i)) {
1713         return FALSE;
1714     }
1715     tval_type tval = creature_ptr->inventory_list[INVEN_RARM + i].tval - TV_WEAPON_BEGIN;
1716     OBJECT_SUBTYPE_VALUE sval = creature_ptr->inventory_list[INVEN_RARM + i].sval;
1717     return ((creature_ptr->pclass == CLASS_MONK) || (creature_ptr->pclass == CLASS_FORCETRAINER))
1718         && !(s_info[creature_ptr->pclass].w_max[tval][sval]);
1719 }
1720
1721 bool has_good_luck(player_type *creature_ptr) { return (creature_ptr->pseikaku == PERSONALITY_LUCKY) || (creature_ptr->muta3 & MUT3_GOOD_LUCK); }