1 #include "mspell/high-resistance-checker.h"
2 #include "monster-race/race-ability-flags.h"
3 #include "monster/smart-learn-types.h"
4 #include "mspell/smart-mspell-util.h"
5 #include "player-base/player-race.h"
6 #include "player/player-status-flags.h"
7 #include "system/player-type-definition.h"
8 #include "util/bit-flags-calculator.h"
10 void add_cheat_remove_flags_others(PlayerType *player_ptr, msr_type *msr_ptr)
12 if (has_resist_neth(player_ptr)) {
13 msr_ptr->smart.set(MonsterSmartLearnType::RES_NETH);
16 if (has_resist_lite(player_ptr)) {
17 msr_ptr->smart.set(MonsterSmartLearnType::RES_LITE);
20 if (has_resist_dark(player_ptr)) {
21 msr_ptr->smart.set(MonsterSmartLearnType::RES_DARK);
24 if (has_resist_fear(player_ptr)) {
25 msr_ptr->smart.set(MonsterSmartLearnType::RES_FEAR);
28 if (has_resist_conf(player_ptr)) {
29 msr_ptr->smart.set(MonsterSmartLearnType::RES_CONF);
32 if (has_resist_chaos(player_ptr)) {
33 msr_ptr->smart.set(MonsterSmartLearnType::RES_CHAOS);
36 if (has_resist_disen(player_ptr)) {
37 msr_ptr->smart.set(MonsterSmartLearnType::RES_DISEN);
40 if (has_resist_blind(player_ptr)) {
41 msr_ptr->smart.set(MonsterSmartLearnType::RES_BLIND);
44 if (has_resist_nexus(player_ptr)) {
45 msr_ptr->smart.set(MonsterSmartLearnType::RES_NEXUS);
48 if (has_resist_sound(player_ptr)) {
49 msr_ptr->smart.set(MonsterSmartLearnType::RES_SOUND);
52 if (has_resist_shard(player_ptr)) {
53 msr_ptr->smart.set(MonsterSmartLearnType::RES_SHARD);
56 if (has_reflect(player_ptr)) {
57 msr_ptr->smart.set(MonsterSmartLearnType::IMM_REFLECT);
60 if (player_ptr->free_act) {
61 msr_ptr->smart.set(MonsterSmartLearnType::IMM_FREE);
64 if (!player_ptr->msp) {
65 msr_ptr->smart.set(MonsterSmartLearnType::IMM_MANA);
69 static void check_nether_resistance(PlayerType *player_ptr, msr_type *msr_ptr)
71 if (msr_ptr->smart.has_not(MonsterSmartLearnType::RES_NETH)) {
75 if (PlayerRace(player_ptr).equals(PlayerRaceType::SPECTRE)) {
76 msr_ptr->ability_flags.reset(MonsterAbilityType::BR_NETH);
77 msr_ptr->ability_flags.reset(MonsterAbilityType::BA_NETH);
78 msr_ptr->ability_flags.reset(MonsterAbilityType::BO_NETH);
82 if (int_outof(msr_ptr->r_ptr, 20)) {
83 msr_ptr->ability_flags.reset(MonsterAbilityType::BR_NETH);
86 if (int_outof(msr_ptr->r_ptr, 50)) {
87 msr_ptr->ability_flags.reset(MonsterAbilityType::BA_NETH);
90 if (int_outof(msr_ptr->r_ptr, 50)) {
91 msr_ptr->ability_flags.reset(MonsterAbilityType::BO_NETH);
95 static void check_lite_resistance(msr_type *msr_ptr)
97 if (msr_ptr->smart.has_not(MonsterSmartLearnType::RES_LITE)) {
101 if (int_outof(msr_ptr->r_ptr, 50)) {
102 msr_ptr->ability_flags.reset(MonsterAbilityType::BR_LITE);
105 if (int_outof(msr_ptr->r_ptr, 50)) {
106 msr_ptr->ability_flags.reset(MonsterAbilityType::BA_LITE);
110 static void check_dark_resistance(PlayerType *player_ptr, msr_type *msr_ptr)
112 if (msr_ptr->smart.has_not(MonsterSmartLearnType::RES_DARK)) {
116 if (has_immune_dark(player_ptr)) {
117 msr_ptr->ability_flags.reset(MonsterAbilityType::BR_DARK);
118 msr_ptr->ability_flags.reset(MonsterAbilityType::BA_DARK);
122 if (int_outof(msr_ptr->r_ptr, 50)) {
123 msr_ptr->ability_flags.reset(MonsterAbilityType::BR_DARK);
126 if (int_outof(msr_ptr->r_ptr, 50)) {
127 msr_ptr->ability_flags.reset(MonsterAbilityType::BA_DARK);
131 static void check_conf_resistance(msr_type *msr_ptr)
133 if (msr_ptr->smart.has_not(MonsterSmartLearnType::RES_CONF)) {
137 msr_ptr->ability_flags.reset(MonsterAbilityType::CONF);
138 if (int_outof(msr_ptr->r_ptr, 50)) {
139 msr_ptr->ability_flags.reset(MonsterAbilityType::BR_CONF);
143 static void check_chaos_resistance(msr_type *msr_ptr)
145 if (msr_ptr->smart.has_not(MonsterSmartLearnType::RES_CHAOS)) {
149 if (int_outof(msr_ptr->r_ptr, 20)) {
150 msr_ptr->ability_flags.reset(MonsterAbilityType::BR_CHAO);
153 if (int_outof(msr_ptr->r_ptr, 50)) {
154 msr_ptr->ability_flags.reset(MonsterAbilityType::BA_CHAO);
158 static void check_nexus_resistance(msr_type *msr_ptr)
160 if (msr_ptr->smart.has_not(MonsterSmartLearnType::RES_NEXUS)) {
164 if (int_outof(msr_ptr->r_ptr, 50)) {
165 msr_ptr->ability_flags.reset(MonsterAbilityType::BR_NEXU);
168 msr_ptr->ability_flags.reset(MonsterAbilityType::TELE_LEVEL);
171 static void check_reflection(msr_type *msr_ptr)
173 if (msr_ptr->smart.has_not(MonsterSmartLearnType::IMM_REFLECT)) {
177 if (int_outof(msr_ptr->r_ptr, 150)) {
178 msr_ptr->ability_flags.reset(MonsterAbilityType::BO_COLD);
181 if (int_outof(msr_ptr->r_ptr, 150)) {
182 msr_ptr->ability_flags.reset(MonsterAbilityType::BO_FIRE);
185 if (int_outof(msr_ptr->r_ptr, 150)) {
186 msr_ptr->ability_flags.reset(MonsterAbilityType::BO_ACID);
189 if (int_outof(msr_ptr->r_ptr, 150)) {
190 msr_ptr->ability_flags.reset(MonsterAbilityType::BO_ELEC);
193 if (int_outof(msr_ptr->r_ptr, 150)) {
194 msr_ptr->ability_flags.reset(MonsterAbilityType::BO_NETH);
197 if (int_outof(msr_ptr->r_ptr, 150)) {
198 msr_ptr->ability_flags.reset(MonsterAbilityType::BO_WATE);
201 if (int_outof(msr_ptr->r_ptr, 150)) {
202 msr_ptr->ability_flags.reset(MonsterAbilityType::BO_MANA);
205 if (int_outof(msr_ptr->r_ptr, 150)) {
206 msr_ptr->ability_flags.reset(MonsterAbilityType::BO_PLAS);
209 if (int_outof(msr_ptr->r_ptr, 150)) {
210 msr_ptr->ability_flags.reset(MonsterAbilityType::BO_ICEE);
213 if (int_outof(msr_ptr->r_ptr, 150)) {
214 msr_ptr->ability_flags.reset(MonsterAbilityType::BO_VOID);
217 if (int_outof(msr_ptr->r_ptr, 150)) {
218 msr_ptr->ability_flags.reset(MonsterAbilityType::BO_ABYSS);
221 if (int_outof(msr_ptr->r_ptr, 150)) {
222 msr_ptr->ability_flags.reset(MonsterAbilityType::MISSILE);
226 void check_high_resistances(PlayerType *player_ptr, msr_type *msr_ptr)
228 check_nether_resistance(player_ptr, msr_ptr);
229 check_lite_resistance(msr_ptr);
230 check_dark_resistance(player_ptr, msr_ptr);
231 if (msr_ptr->smart.has(MonsterSmartLearnType::RES_FEAR)) {
232 msr_ptr->ability_flags.reset(MonsterAbilityType::SCARE);
235 check_conf_resistance(msr_ptr);
236 check_chaos_resistance(msr_ptr);
237 if (msr_ptr->smart.has(MonsterSmartLearnType::RES_DISEN) && int_outof(msr_ptr->r_ptr, 40)) {
238 msr_ptr->ability_flags.reset(MonsterAbilityType::BR_DISE);
241 if (msr_ptr->smart.has(MonsterSmartLearnType::RES_BLIND)) {
242 msr_ptr->ability_flags.reset(MonsterAbilityType::BLIND);
245 check_nexus_resistance(msr_ptr);
246 if (msr_ptr->smart.has(MonsterSmartLearnType::RES_SOUND) && int_outof(msr_ptr->r_ptr, 50)) {
247 msr_ptr->ability_flags.reset(MonsterAbilityType::BR_SOUN);
250 if (msr_ptr->smart.has(MonsterSmartLearnType::RES_SHARD) && int_outof(msr_ptr->r_ptr, 40)) {
251 msr_ptr->ability_flags.reset(MonsterAbilityType::BR_SHAR);
254 check_reflection(msr_ptr);
255 if (msr_ptr->smart.has(MonsterSmartLearnType::IMM_FREE)) {
256 msr_ptr->ability_flags.reset(MonsterAbilityType::HOLD);
257 msr_ptr->ability_flags.reset(MonsterAbilityType::SLOW);
260 if (msr_ptr->smart.has(MonsterSmartLearnType::IMM_MANA)) {
261 msr_ptr->ability_flags.reset(MonsterAbilityType::DRAIN_MANA);