1 #include "status/element-resistance.h"
2 #include "core/disturbance.h"
3 #include "core/stuff-handler.h"
4 #include "game-option/disturbance-options.h"
5 #include "player-base/player-class.h"
6 #include "player-base/player-race.h"
7 #include "player-info/race-info.h"
8 #include "player-info/samurai-data-type.h"
9 #include "player/special-defense-types.h"
10 #include "realm/realm-song-numbers.h"
11 #include "spell-realm/spells-song.h"
12 #include "system/player-type-definition.h"
13 #include "system/redrawing-flags-updater.h"
14 #include "view/display-messages.h"
17 * @brief 一時的酸耐性の継続時間をセットする / Set "oppose_acid", notice observable changes
19 * @param do_dec 現在の継続時間より長い値のみ上書きする
20 * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
22 bool set_oppose_acid(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
25 v = (v > 10000) ? 10000 : (v < 0) ? 0
27 if (player_ptr->is_dead) {
32 if (player_ptr->oppose_acid && !do_dec) {
33 if (player_ptr->oppose_acid > v) {
36 } else if (!is_oppose_acid(player_ptr)) {
37 msg_print(_("酸への耐性がついた気がする!", "You feel resistant to acid!"));
41 if (player_ptr->oppose_acid && !music_singing(player_ptr, MUSIC_RESIST) &&
42 !PlayerClass(player_ptr).samurai_stance_is(SamuraiStanceType::MUSOU)) {
43 msg_print(_("酸への耐性が薄れた気がする。", "You feel less resistant to acid."));
48 player_ptr->oppose_acid = v;
53 RedrawingFlagsUpdater::get_instance().set_flag(MainWindowRedrawingFlag::TIMED_EFFECT);
55 disturb(player_ptr, false, false);
58 handle_stuff(player_ptr);
63 * @brief 一時的電撃耐性の継続時間をセットする / Set "oppose_elec", notice observable changes
65 * @param do_dec 現在の継続時間より長い値のみ上書きする
66 * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
68 bool set_oppose_elec(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
71 v = (v > 10000) ? 10000 : (v < 0) ? 0
74 if (player_ptr->is_dead) {
79 if (player_ptr->oppose_elec && !do_dec) {
80 if (player_ptr->oppose_elec > v) {
83 } else if (!is_oppose_elec(player_ptr)) {
84 msg_print(_("電撃への耐性がついた気がする!", "You feel resistant to electricity!"));
88 if (player_ptr->oppose_elec && !music_singing(player_ptr, MUSIC_RESIST) &&
89 !PlayerClass(player_ptr).samurai_stance_is(SamuraiStanceType::MUSOU)) {
90 msg_print(_("電撃への耐性が薄れた気がする。", "You feel less resistant to electricity."));
95 player_ptr->oppose_elec = v;
100 RedrawingFlagsUpdater::get_instance().set_flag(MainWindowRedrawingFlag::TIMED_EFFECT);
102 disturb(player_ptr, false, false);
105 handle_stuff(player_ptr);
110 * @brief 一時的火炎耐性の継続時間をセットする / Set "oppose_fire", notice observable changes
112 * @param do_dec 現在の継続時間より長い値のみ上書きする
113 * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
115 bool set_oppose_fire(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
118 v = (v > 10000) ? 10000 : (v < 0) ? 0
120 if (player_ptr->is_dead) {
124 if ((PlayerRace(player_ptr).equals(PlayerRaceType::BALROG) && (player_ptr->lev > 44)) || (player_ptr->mimic_form == MimicKindType::DEMON)) {
128 if (player_ptr->oppose_fire && !do_dec) {
129 if (player_ptr->oppose_fire > v) {
132 } else if (!is_oppose_fire(player_ptr)) {
133 msg_print(_("火への耐性がついた気がする!", "You feel resistant to fire!"));
137 if (player_ptr->oppose_fire && !music_singing(player_ptr, MUSIC_RESIST) &&
138 !PlayerClass(player_ptr).samurai_stance_is(SamuraiStanceType::MUSOU)) {
139 msg_print(_("火への耐性が薄れた気がする。", "You feel less resistant to fire."));
144 player_ptr->oppose_fire = v;
149 RedrawingFlagsUpdater::get_instance().set_flag(MainWindowRedrawingFlag::TIMED_EFFECT);
151 disturb(player_ptr, false, false);
154 handle_stuff(player_ptr);
159 * @brief 一時的冷気耐性の継続時間をセットする / Set "oppose_cold", notice observable changes
161 * @param do_dec 現在の継続時間より長い値のみ上書きする
162 * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
164 bool set_oppose_cold(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
167 v = (v > 10000) ? 10000 : (v < 0) ? 0
169 if (player_ptr->is_dead) {
174 if (player_ptr->oppose_cold && !do_dec) {
175 if (player_ptr->oppose_cold > v) {
178 } else if (!is_oppose_cold(player_ptr)) {
179 msg_print(_("冷気への耐性がついた気がする!", "You feel resistant to cold!"));
183 if (player_ptr->oppose_cold && !music_singing(player_ptr, MUSIC_RESIST) &&
184 !PlayerClass(player_ptr).samurai_stance_is(SamuraiStanceType::MUSOU)) {
185 msg_print(_("冷気への耐性が薄れた気がする。", "You feel less resistant to cold."));
190 player_ptr->oppose_cold = v;
195 RedrawingFlagsUpdater::get_instance().set_flag(MainWindowRedrawingFlag::TIMED_EFFECT);
197 disturb(player_ptr, false, false);
200 handle_stuff(player_ptr);
205 * @brief 一時的毒耐性の継続時間をセットする / Set "oppose_pois", notice observable changes
207 * @param do_dec 現在の継続時間より長い値のみ上書きする
208 * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
210 bool set_oppose_pois(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
213 v = (v > 10000) ? 10000 : (v < 0) ? 0
215 PlayerClass pc(player_ptr);
216 if (pc.has_poison_resistance()) {
219 if (player_ptr->is_dead) {
224 if (player_ptr->oppose_pois && !do_dec) {
225 if (player_ptr->oppose_pois > v) {
228 } else if (!is_oppose_pois(player_ptr)) {
229 msg_print(_("毒への耐性がついた気がする!", "You feel resistant to poison!"));
233 if (player_ptr->oppose_pois && !music_singing(player_ptr, MUSIC_RESIST) &&
234 !pc.samurai_stance_is(SamuraiStanceType::MUSOU)) {
235 msg_print(_("毒への耐性が薄れた気がする。", "You feel less resistant to poison."));
240 player_ptr->oppose_pois = v;
245 RedrawingFlagsUpdater::get_instance().set_flag(MainWindowRedrawingFlag::TIMED_EFFECT);
247 disturb(player_ptr, false, false);
250 handle_stuff(player_ptr);
254 bool is_oppose_acid(PlayerType *player_ptr)
256 auto can_oppose_acid = player_ptr->oppose_acid != 0;
257 can_oppose_acid |= music_singing(player_ptr, MUSIC_RESIST);
258 can_oppose_acid |= PlayerClass(player_ptr).samurai_stance_is(SamuraiStanceType::MUSOU);
259 return can_oppose_acid;
262 bool is_oppose_elec(PlayerType *player_ptr)
264 auto can_oppose_elec = player_ptr->oppose_elec != 0;
265 can_oppose_elec |= music_singing(player_ptr, MUSIC_RESIST);
266 can_oppose_elec |= PlayerClass(player_ptr).samurai_stance_is(SamuraiStanceType::MUSOU);
267 return can_oppose_elec;
270 bool is_oppose_fire(PlayerType *player_ptr)
272 auto can_oppose_fire = player_ptr->oppose_fire != 0;
273 can_oppose_fire |= music_singing(player_ptr, MUSIC_RESIST);
274 can_oppose_fire |= PlayerClass(player_ptr).samurai_stance_is(SamuraiStanceType::MUSOU);
275 can_oppose_fire |= player_ptr->mimic_form == MimicKindType::DEMON;
276 can_oppose_fire |= (PlayerRace(player_ptr).equals(PlayerRaceType::BALROG) && player_ptr->lev > 44);
277 return can_oppose_fire;
280 bool is_oppose_cold(PlayerType *player_ptr)
282 auto can_oppose_cold = player_ptr->oppose_cold != 0;
283 can_oppose_cold |= music_singing(player_ptr, MUSIC_RESIST);
284 can_oppose_cold |= PlayerClass(player_ptr).samurai_stance_is(SamuraiStanceType::MUSOU);
285 return can_oppose_cold;
288 bool is_oppose_pois(PlayerType *player_ptr)
290 PlayerClass pc(player_ptr);
291 auto can_oppose_pois = player_ptr->oppose_pois != 0;
292 can_oppose_pois |= music_singing(player_ptr, MUSIC_RESIST);
293 can_oppose_pois |= pc.samurai_stance_is(SamuraiStanceType::MUSOU);
294 can_oppose_pois |= pc.has_poison_resistance();
295 return can_oppose_pois;