1 #include "status/element-resistance.h"
2 #include "core/disturbance.h"
3 #include "core/player-redraw-types.h"
4 #include "core/stuff-handler.h"
5 #include "game-option/disturbance-options.h"
6 #include "player-base/player-class.h"
7 #include "player-base/player-race.h"
8 #include "player-info/race-info.h"
9 #include "player-info/samurai-data-type.h"
10 #include "player/special-defense-types.h"
11 #include "realm/realm-song-numbers.h"
12 #include "spell-realm/spells-song.h"
13 #include "system/player-type-definition.h"
14 #include "system/redrawing-flags-updater.h"
15 #include "view/display-messages.h"
18 * @brief 一時的酸耐性の継続時間をセットする / Set "oppose_acid", notice observable changes
20 * @param do_dec 現在の継続時間より長い値のみ上書きする
21 * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
23 bool set_oppose_acid(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
26 v = (v > 10000) ? 10000 : (v < 0) ? 0
28 if (player_ptr->is_dead) {
33 if (player_ptr->oppose_acid && !do_dec) {
34 if (player_ptr->oppose_acid > v) {
37 } else if (!is_oppose_acid(player_ptr)) {
38 msg_print(_("酸への耐性がついた気がする!", "You feel resistant to acid!"));
42 if (player_ptr->oppose_acid && !music_singing(player_ptr, MUSIC_RESIST) &&
43 !PlayerClass(player_ptr).samurai_stance_is(SamuraiStanceType::MUSOU)) {
44 msg_print(_("酸への耐性が薄れた気がする。", "You feel less resistant to acid."));
49 player_ptr->oppose_acid = v;
54 RedrawingFlagsUpdater::get_instance().set_flag(MainWindowRedrawingFlag::TIMED_EFFECT);
56 disturb(player_ptr, false, false);
59 handle_stuff(player_ptr);
64 * @brief 一時的電撃耐性の継続時間をセットする / Set "oppose_elec", notice observable changes
66 * @param do_dec 現在の継続時間より長い値のみ上書きする
67 * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
69 bool set_oppose_elec(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
72 v = (v > 10000) ? 10000 : (v < 0) ? 0
75 if (player_ptr->is_dead) {
80 if (player_ptr->oppose_elec && !do_dec) {
81 if (player_ptr->oppose_elec > v) {
84 } else if (!is_oppose_elec(player_ptr)) {
85 msg_print(_("電撃への耐性がついた気がする!", "You feel resistant to electricity!"));
89 if (player_ptr->oppose_elec && !music_singing(player_ptr, MUSIC_RESIST) &&
90 !PlayerClass(player_ptr).samurai_stance_is(SamuraiStanceType::MUSOU)) {
91 msg_print(_("電撃への耐性が薄れた気がする。", "You feel less resistant to electricity."));
96 player_ptr->oppose_elec = v;
101 RedrawingFlagsUpdater::get_instance().set_flag(MainWindowRedrawingFlag::TIMED_EFFECT);
103 disturb(player_ptr, false, false);
106 handle_stuff(player_ptr);
111 * @brief 一時的火炎耐性の継続時間をセットする / Set "oppose_fire", notice observable changes
113 * @param do_dec 現在の継続時間より長い値のみ上書きする
114 * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
116 bool set_oppose_fire(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
119 v = (v > 10000) ? 10000 : (v < 0) ? 0
121 if (player_ptr->is_dead) {
125 if ((PlayerRace(player_ptr).equals(PlayerRaceType::BALROG) && (player_ptr->lev > 44)) || (player_ptr->mimic_form == MimicKindType::DEMON)) {
129 if (player_ptr->oppose_fire && !do_dec) {
130 if (player_ptr->oppose_fire > v) {
133 } else if (!is_oppose_fire(player_ptr)) {
134 msg_print(_("火への耐性がついた気がする!", "You feel resistant to fire!"));
138 if (player_ptr->oppose_fire && !music_singing(player_ptr, MUSIC_RESIST) &&
139 !PlayerClass(player_ptr).samurai_stance_is(SamuraiStanceType::MUSOU)) {
140 msg_print(_("火への耐性が薄れた気がする。", "You feel less resistant to fire."));
145 player_ptr->oppose_fire = v;
150 RedrawingFlagsUpdater::get_instance().set_flag(MainWindowRedrawingFlag::TIMED_EFFECT);
152 disturb(player_ptr, false, false);
155 handle_stuff(player_ptr);
160 * @brief 一時的冷気耐性の継続時間をセットする / Set "oppose_cold", notice observable changes
162 * @param do_dec 現在の継続時間より長い値のみ上書きする
163 * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
165 bool set_oppose_cold(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
168 v = (v > 10000) ? 10000 : (v < 0) ? 0
170 if (player_ptr->is_dead) {
175 if (player_ptr->oppose_cold && !do_dec) {
176 if (player_ptr->oppose_cold > v) {
179 } else if (!is_oppose_cold(player_ptr)) {
180 msg_print(_("冷気への耐性がついた気がする!", "You feel resistant to cold!"));
184 if (player_ptr->oppose_cold && !music_singing(player_ptr, MUSIC_RESIST) &&
185 !PlayerClass(player_ptr).samurai_stance_is(SamuraiStanceType::MUSOU)) {
186 msg_print(_("冷気への耐性が薄れた気がする。", "You feel less resistant to cold."));
191 player_ptr->oppose_cold = v;
196 RedrawingFlagsUpdater::get_instance().set_flag(MainWindowRedrawingFlag::TIMED_EFFECT);
198 disturb(player_ptr, false, false);
201 handle_stuff(player_ptr);
206 * @brief 一時的毒耐性の継続時間をセットする / Set "oppose_pois", notice observable changes
208 * @param do_dec 現在の継続時間より長い値のみ上書きする
209 * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
211 bool set_oppose_pois(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
214 v = (v > 10000) ? 10000 : (v < 0) ? 0
216 PlayerClass pc(player_ptr);
217 if (pc.has_poison_resistance()) {
220 if (player_ptr->is_dead) {
225 if (player_ptr->oppose_pois && !do_dec) {
226 if (player_ptr->oppose_pois > v) {
229 } else if (!is_oppose_pois(player_ptr)) {
230 msg_print(_("毒への耐性がついた気がする!", "You feel resistant to poison!"));
234 if (player_ptr->oppose_pois && !music_singing(player_ptr, MUSIC_RESIST) &&
235 !pc.samurai_stance_is(SamuraiStanceType::MUSOU)) {
236 msg_print(_("毒への耐性が薄れた気がする。", "You feel less resistant to poison."));
241 player_ptr->oppose_pois = v;
246 RedrawingFlagsUpdater::get_instance().set_flag(MainWindowRedrawingFlag::TIMED_EFFECT);
248 disturb(player_ptr, false, false);
251 handle_stuff(player_ptr);
255 bool is_oppose_acid(PlayerType *player_ptr)
257 auto can_oppose_acid = player_ptr->oppose_acid != 0;
258 can_oppose_acid |= music_singing(player_ptr, MUSIC_RESIST);
259 can_oppose_acid |= PlayerClass(player_ptr).samurai_stance_is(SamuraiStanceType::MUSOU);
260 return can_oppose_acid;
263 bool is_oppose_elec(PlayerType *player_ptr)
265 auto can_oppose_elec = player_ptr->oppose_elec != 0;
266 can_oppose_elec |= music_singing(player_ptr, MUSIC_RESIST);
267 can_oppose_elec |= PlayerClass(player_ptr).samurai_stance_is(SamuraiStanceType::MUSOU);
268 return can_oppose_elec;
271 bool is_oppose_fire(PlayerType *player_ptr)
273 auto can_oppose_fire = player_ptr->oppose_fire != 0;
274 can_oppose_fire |= music_singing(player_ptr, MUSIC_RESIST);
275 can_oppose_fire |= PlayerClass(player_ptr).samurai_stance_is(SamuraiStanceType::MUSOU);
276 can_oppose_fire |= player_ptr->mimic_form == MimicKindType::DEMON;
277 can_oppose_fire |= (PlayerRace(player_ptr).equals(PlayerRaceType::BALROG) && player_ptr->lev > 44);
278 return can_oppose_fire;
281 bool is_oppose_cold(PlayerType *player_ptr)
283 auto can_oppose_cold = player_ptr->oppose_cold != 0;
284 can_oppose_cold |= music_singing(player_ptr, MUSIC_RESIST);
285 can_oppose_cold |= PlayerClass(player_ptr).samurai_stance_is(SamuraiStanceType::MUSOU);
286 return can_oppose_cold;
289 bool is_oppose_pois(PlayerType *player_ptr)
291 PlayerClass pc(player_ptr);
292 auto can_oppose_pois = player_ptr->oppose_pois != 0;
293 can_oppose_pois |= music_singing(player_ptr, MUSIC_RESIST);
294 can_oppose_pois |= pc.samurai_stance_is(SamuraiStanceType::MUSOU);
295 can_oppose_pois |= pc.has_poison_resistance();
296 return can_oppose_pois;