OSDN Git Service

[Refactor] #3286 Removed player-redraw-types.h
[hengbandforosx/hengbandosx.git] / src / status / element-resistance.cpp
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"
15
16 /*!
17  * @brief 一時的酸耐性の継続時間をセットする / Set "oppose_acid", notice observable changes
18  * @param v 継続時間
19  * @param do_dec 現在の継続時間より長い値のみ上書きする
20  * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
21  */
22 bool set_oppose_acid(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
23 {
24     bool notice = false;
25     v = (v > 10000) ? 10000 : (v < 0) ? 0
26                                       : v;
27     if (player_ptr->is_dead) {
28         return false;
29     }
30
31     if (v) {
32         if (player_ptr->oppose_acid && !do_dec) {
33             if (player_ptr->oppose_acid > v) {
34                 return false;
35             }
36         } else if (!is_oppose_acid(player_ptr)) {
37             msg_print(_("酸への耐性がついた気がする!", "You feel resistant to acid!"));
38             notice = true;
39         }
40     } else {
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."));
44             notice = true;
45         }
46     }
47
48     player_ptr->oppose_acid = v;
49     if (!notice) {
50         return false;
51     }
52
53     RedrawingFlagsUpdater::get_instance().set_flag(MainWindowRedrawingFlag::TIMED_EFFECT);
54     if (disturb_state) {
55         disturb(player_ptr, false, false);
56     }
57
58     handle_stuff(player_ptr);
59     return true;
60 }
61
62 /*!
63  * @brief 一時的電撃耐性の継続時間をセットする / Set "oppose_elec", notice observable changes
64  * @param v 継続時間
65  * @param do_dec 現在の継続時間より長い値のみ上書きする
66  * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
67  */
68 bool set_oppose_elec(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
69 {
70     bool notice = false;
71     v = (v > 10000) ? 10000 : (v < 0) ? 0
72                                       : v;
73
74     if (player_ptr->is_dead) {
75         return false;
76     }
77
78     if (v) {
79         if (player_ptr->oppose_elec && !do_dec) {
80             if (player_ptr->oppose_elec > v) {
81                 return false;
82             }
83         } else if (!is_oppose_elec(player_ptr)) {
84             msg_print(_("電撃への耐性がついた気がする!", "You feel resistant to electricity!"));
85             notice = true;
86         }
87     } else {
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."));
91             notice = true;
92         }
93     }
94
95     player_ptr->oppose_elec = v;
96     if (!notice) {
97         return false;
98     }
99
100     RedrawingFlagsUpdater::get_instance().set_flag(MainWindowRedrawingFlag::TIMED_EFFECT);
101     if (disturb_state) {
102         disturb(player_ptr, false, false);
103     }
104
105     handle_stuff(player_ptr);
106     return true;
107 }
108
109 /*!
110  * @brief 一時的火炎耐性の継続時間をセットする / Set "oppose_fire", notice observable changes
111  * @param v 継続時間
112  * @param do_dec 現在の継続時間より長い値のみ上書きする
113  * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
114  */
115 bool set_oppose_fire(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
116 {
117     bool notice = false;
118     v = (v > 10000) ? 10000 : (v < 0) ? 0
119                                       : v;
120     if (player_ptr->is_dead) {
121         return false;
122     }
123
124     if ((PlayerRace(player_ptr).equals(PlayerRaceType::BALROG) && (player_ptr->lev > 44)) || (player_ptr->mimic_form == MimicKindType::DEMON)) {
125         v = 1;
126     }
127     if (v) {
128         if (player_ptr->oppose_fire && !do_dec) {
129             if (player_ptr->oppose_fire > v) {
130                 return false;
131             }
132         } else if (!is_oppose_fire(player_ptr)) {
133             msg_print(_("火への耐性がついた気がする!", "You feel resistant to fire!"));
134             notice = true;
135         }
136     } else {
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."));
140             notice = true;
141         }
142     }
143
144     player_ptr->oppose_fire = v;
145     if (!notice) {
146         return false;
147     }
148
149     RedrawingFlagsUpdater::get_instance().set_flag(MainWindowRedrawingFlag::TIMED_EFFECT);
150     if (disturb_state) {
151         disturb(player_ptr, false, false);
152     }
153
154     handle_stuff(player_ptr);
155     return true;
156 }
157
158 /*!
159  * @brief 一時的冷気耐性の継続時間をセットする / Set "oppose_cold", notice observable changes
160  * @param v 継続時間
161  * @param do_dec 現在の継続時間より長い値のみ上書きする
162  * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
163  */
164 bool set_oppose_cold(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
165 {
166     bool notice = false;
167     v = (v > 10000) ? 10000 : (v < 0) ? 0
168                                       : v;
169     if (player_ptr->is_dead) {
170         return false;
171     }
172
173     if (v) {
174         if (player_ptr->oppose_cold && !do_dec) {
175             if (player_ptr->oppose_cold > v) {
176                 return false;
177             }
178         } else if (!is_oppose_cold(player_ptr)) {
179             msg_print(_("冷気への耐性がついた気がする!", "You feel resistant to cold!"));
180             notice = true;
181         }
182     } else {
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."));
186             notice = true;
187         }
188     }
189
190     player_ptr->oppose_cold = v;
191     if (!notice) {
192         return false;
193     }
194
195     RedrawingFlagsUpdater::get_instance().set_flag(MainWindowRedrawingFlag::TIMED_EFFECT);
196     if (disturb_state) {
197         disturb(player_ptr, false, false);
198     }
199
200     handle_stuff(player_ptr);
201     return true;
202 }
203
204 /*!
205  * @brief 一時的毒耐性の継続時間をセットする / Set "oppose_pois", notice observable changes
206  * @param v 継続時間
207  * @param do_dec 現在の継続時間より長い値のみ上書きする
208  * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
209  */
210 bool set_oppose_pois(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
211 {
212     bool notice = false;
213     v = (v > 10000) ? 10000 : (v < 0) ? 0
214                                       : v;
215     PlayerClass pc(player_ptr);
216     if (pc.has_poison_resistance()) {
217         v = 1;
218     }
219     if (player_ptr->is_dead) {
220         return false;
221     }
222
223     if (v) {
224         if (player_ptr->oppose_pois && !do_dec) {
225             if (player_ptr->oppose_pois > v) {
226                 return false;
227             }
228         } else if (!is_oppose_pois(player_ptr)) {
229             msg_print(_("毒への耐性がついた気がする!", "You feel resistant to poison!"));
230             notice = true;
231         }
232     } else {
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."));
236             notice = true;
237         }
238     }
239
240     player_ptr->oppose_pois = v;
241     if (!notice) {
242         return false;
243     }
244
245     RedrawingFlagsUpdater::get_instance().set_flag(MainWindowRedrawingFlag::TIMED_EFFECT);
246     if (disturb_state) {
247         disturb(player_ptr, false, false);
248     }
249
250     handle_stuff(player_ptr);
251     return true;
252 }
253
254 bool is_oppose_acid(PlayerType *player_ptr)
255 {
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;
260 }
261
262 bool is_oppose_elec(PlayerType *player_ptr)
263 {
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;
268 }
269
270 bool is_oppose_fire(PlayerType *player_ptr)
271 {
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;
278 }
279
280 bool is_oppose_cold(PlayerType *player_ptr)
281 {
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;
286 }
287
288 bool is_oppose_pois(PlayerType *player_ptr)
289 {
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;
296 }