OSDN Git Service

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