OSDN Git Service

Merge branch 'master' of https://github.com/hengband/hengband
[hengbandforosx/hengbandosx.git] / src / status / temporary-resistance.cpp
1 #include "status/temporary-resistance.h"
2 #include "core/disturbance.h"
3 #include "core/stuff-handler.h"
4 #include "game-option/disturbance-options.h"
5 #include "system/player-type-definition.h"
6 #include "system/redrawing-flags-updater.h"
7 #include "view/display-messages.h"
8
9 /*!
10  * @brief 一時的浮遊の継続時間をセットする / Set "tim_levitation", notice observable changes
11  * @param v 継続時間
12  * @param do_dec 現在の継続時間より長い値のみ上書きする
13  * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
14  */
15 bool set_tim_levitation(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
16 {
17     bool notice = false;
18     v = (v > 10000) ? 10000 : (v < 0) ? 0
19                                       : v;
20
21     if (player_ptr->is_dead) {
22         return false;
23     }
24
25     if (v) {
26         if (player_ptr->tim_levitation && !do_dec) {
27             if (player_ptr->tim_levitation > v) {
28                 return false;
29             }
30         } else if (!player_ptr->tim_levitation) {
31             msg_print(_("体が宙に浮き始めた。", "You begin to fly!"));
32             notice = true;
33         }
34     } else {
35         if (player_ptr->tim_levitation) {
36             msg_print(_("もう宙に浮かべなくなった。", "You stop flying."));
37             notice = true;
38         }
39     }
40
41     player_ptr->tim_levitation = v;
42     auto &rfu = RedrawingFlagsUpdater::get_instance();
43     rfu.set_flag(MainWindowRedrawingFlag::TIMED_EFFECT);
44     if (!notice) {
45         return false;
46     }
47
48     if (disturb_state) {
49         disturb(player_ptr, false, false);
50     }
51
52     rfu.set_flag(StatusRedrawingFlag::BONUS);
53     handle_stuff(player_ptr);
54     return true;
55 }
56
57 bool set_ultimate_res(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
58 {
59     bool notice = false;
60     v = (v > 10000) ? 10000 : (v < 0) ? 0
61                                       : v;
62
63     if (player_ptr->is_dead) {
64         return false;
65     }
66
67     if (v) {
68         if (player_ptr->ult_res && !do_dec) {
69             if (player_ptr->ult_res > v) {
70                 return false;
71             }
72         } else if (!player_ptr->ult_res) {
73             msg_print(_("あらゆることに対して耐性がついた気がする!", "You feel resistant!"));
74             notice = true;
75         }
76     } else {
77         if (player_ptr->ult_res) {
78             msg_print(_("あらゆることに対する耐性が薄れた気がする。", "You feel less resistant"));
79             notice = true;
80         }
81     }
82
83     player_ptr->ult_res = v;
84     auto &rfu = RedrawingFlagsUpdater::get_instance();
85     rfu.set_flag(MainWindowRedrawingFlag::TIMED_EFFECT);
86     if (!notice) {
87         return false;
88     }
89
90     if (disturb_state) {
91         disturb(player_ptr, false, false);
92     }
93
94     rfu.set_flag(StatusRedrawingFlag::BONUS);
95     handle_stuff(player_ptr);
96     return true;
97 }
98
99 bool set_tim_res_nether(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
100 {
101     bool notice = false;
102     v = (v > 10000) ? 10000 : (v < 0) ? 0
103                                       : v;
104
105     if (player_ptr->is_dead) {
106         return false;
107     }
108
109     if (v) {
110         if (player_ptr->tim_res_nether && !do_dec) {
111             if (player_ptr->tim_res_nether > v) {
112                 return false;
113             }
114         } else if (!player_ptr->tim_res_nether) {
115             msg_print(_("地獄の力に対して耐性がついた気がする!", "You feel nether-resistant!"));
116             notice = true;
117         }
118     }
119
120     else {
121         if (player_ptr->tim_res_nether) {
122             msg_print(_("地獄の力に対する耐性が薄れた気がする。", "You feel less nether-resistant"));
123             notice = true;
124         }
125     }
126
127     player_ptr->tim_res_nether = v;
128     auto &rfu = RedrawingFlagsUpdater::get_instance();
129     rfu.set_flag(MainWindowRedrawingFlag::TIMED_EFFECT);
130     if (!notice) {
131         return false;
132     }
133
134     if (disturb_state) {
135         disturb(player_ptr, false, false);
136     }
137
138     rfu.set_flag(StatusRedrawingFlag::BONUS);
139     handle_stuff(player_ptr);
140     return true;
141 }
142
143 bool set_tim_res_time(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
144 {
145     bool notice = false;
146     v = (v > 10000) ? 10000 : (v < 0) ? 0
147                                       : v;
148     if (player_ptr->is_dead) {
149         return false;
150     }
151
152     if (v) {
153         if (player_ptr->tim_res_time && !do_dec) {
154             if (player_ptr->tim_res_time > v) {
155                 return false;
156             }
157         } else if (!player_ptr->tim_res_time) {
158             msg_print(_("時間逆転の力に対して耐性がついた気がする!", "You feel time-resistant!"));
159             notice = true;
160         }
161     } else {
162         if (player_ptr->tim_res_time) {
163             msg_print(_("時間逆転の力に対する耐性が薄れた気がする。", "You feel less time-resistant"));
164             notice = true;
165         }
166     }
167
168     player_ptr->tim_res_time = v;
169     auto &rfu = RedrawingFlagsUpdater::get_instance();
170     rfu.set_flag(MainWindowRedrawingFlag::TIMED_EFFECT);
171     if (!notice) {
172         return false;
173     }
174
175     if (disturb_state) {
176         disturb(player_ptr, false, false);
177     }
178
179     rfu.set_flag(StatusRedrawingFlag::BONUS);
180     handle_stuff(player_ptr);
181     return true;
182 }