1 #include "status/body-improvement.h"
2 #include "avatar/avatar.h"
3 #include "core/disturbance.h"
4 #include "core/player-redraw-types.h"
5 #include "core/speed-table.h"
6 #include "core/stuff-handler.h"
7 #include "core/window-redrawer.h"
8 #include "game-option/disturbance-options.h"
9 #include "player/player-status.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 "protevil", notice observable changes
19 * @param do_dec 現在の継続時間より長い値のみ上書きする
20 * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
22 bool set_protevil(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
25 v = (v > 10000) ? 10000 : (v < 0) ? 0
28 if (player_ptr->is_dead) {
33 if (player_ptr->protevil && !do_dec) {
34 if (player_ptr->protevil > v) {
37 } else if (!player_ptr->protevil) {
38 msg_print(_("邪悪なる存在から守られているような感じがする!", "You feel safe from evil!"));
42 if (player_ptr->protevil) {
43 msg_print(_("邪悪なる存在から守られている感じがなくなった。", "You no longer feel safe from evil."));
48 player_ptr->protevil = v;
49 RedrawingFlagsUpdater::get_instance().set_flag(MainWindowRedrawingFlag::TIMED_EFFECT);
56 disturb(player_ptr, false, false);
59 handle_stuff(player_ptr);
64 * @brief 無傷球の継続時間をセットする / Set "invuln", notice observable changes
66 * @param do_dec 現在の継続時間より長い値のみ上書きする
67 * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
69 bool set_invuln(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
72 v = (v > 10000) ? 10000 : (v < 0) ? 0
75 if (player_ptr->is_dead) {
79 auto &rfu = RedrawingFlagsUpdater::get_instance();
81 if (player_ptr->invuln && !do_dec) {
82 if (player_ptr->invuln > v) {
85 } else if (!is_invuln(player_ptr)) {
86 msg_print(_("無敵だ!", "Invulnerability!"));
88 chg_virtue(player_ptr, Virtue::UNLIFE, -2);
89 chg_virtue(player_ptr, Virtue::HONOUR, -2);
90 chg_virtue(player_ptr, Virtue::SACRIFICE, -3);
91 chg_virtue(player_ptr, Virtue::VALOUR, -5);
92 rfu.set_flag(MainWindowRedrawingFlag::MAP);
93 rfu.set_flag(StatusRedrawingFlag::MONSTER_STATUSES);
94 player_ptr->window_flags |= (PW_OVERHEAD | PW_DUNGEON);
97 if (player_ptr->invuln && !music_singing(player_ptr, MUSIC_INVULN)) {
98 msg_print(_("無敵ではなくなった。", "The invulnerability wears off."));
100 rfu.set_flag(MainWindowRedrawingFlag::MAP);
101 rfu.set_flag(StatusRedrawingFlag::MONSTER_STATUSES);
102 player_ptr->window_flags |= (PW_OVERHEAD | PW_DUNGEON);
103 player_ptr->energy_need += ENERGY_NEED();
107 player_ptr->invuln = v;
108 rfu.set_flag(MainWindowRedrawingFlag::TIMED_EFFECT);
115 disturb(player_ptr, false, false);
118 rfu.set_flag(StatusRedrawingFlag::BONUS);
119 handle_stuff(player_ptr);
124 * @brief 時限急回復の継続時間をセットする / Set "tim_regen", notice observable changes
126 * @param do_dec 現在の継続時間より長い値のみ上書きする
127 * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
129 bool set_tim_regen(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
132 v = (v > 10000) ? 10000 : (v < 0) ? 0
135 if (player_ptr->is_dead) {
140 if (player_ptr->tim_regen && !do_dec) {
141 if (player_ptr->tim_regen > v) {
144 } else if (!player_ptr->tim_regen) {
145 msg_print(_("回復力が上がった!", "You feel yourself regenerating quickly!"));
149 if (player_ptr->tim_regen) {
150 msg_print(_("素早く回復する感じがなくなった。", "You feel you are no longer regenerating quickly."));
155 player_ptr->tim_regen = v;
156 auto &rfu = RedrawingFlagsUpdater::get_instance();
157 rfu.set_flag(MainWindowRedrawingFlag::TIMED_EFFECT);
163 disturb(player_ptr, false, false);
166 rfu.set_flag(StatusRedrawingFlag::BONUS);
167 handle_stuff(player_ptr);
172 * @brief 一時的反射の継続時間をセットする / Set "tim_reflect", notice observable changes
174 * @param do_dec 現在の継続時間より長い値のみ上書きする
175 * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
177 bool set_tim_reflect(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
180 v = (v > 10000) ? 10000 : (v < 0) ? 0
183 if (player_ptr->is_dead) {
188 if (player_ptr->tim_reflect && !do_dec) {
189 if (player_ptr->tim_reflect > v) {
192 } else if (!player_ptr->tim_reflect) {
193 msg_print(_("体の表面が滑かになった気がする。", "Your body becames smooth."));
197 if (player_ptr->tim_reflect) {
198 msg_print(_("体の表面が滑かでなくなった。", "Your body is no longer smooth."));
203 player_ptr->tim_reflect = v;
204 auto &rfu = RedrawingFlagsUpdater::get_instance();
205 rfu.set_flag(MainWindowRedrawingFlag::TIMED_EFFECT);
211 disturb(player_ptr, false, false);
214 rfu.set_flag(StatusRedrawingFlag::BONUS);
215 handle_stuff(player_ptr);
220 * @brief 一時的壁抜けの継続時間をセットする / Set "tim_pass_wall", notice observable changes
222 * @param do_dec 現在の継続時間より長い値のみ上書きする
223 * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
225 bool set_pass_wall(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
228 v = (v > 10000) ? 10000 : (v < 0) ? 0
231 if (player_ptr->is_dead) {
236 if (player_ptr->tim_pass_wall && !do_dec) {
237 if (player_ptr->tim_pass_wall > v) {
240 } else if (!player_ptr->tim_pass_wall) {
241 msg_print(_("体が半物質の状態になった。", "You became ethereal."));
245 if (player_ptr->tim_pass_wall) {
246 msg_print(_("体が物質化した。", "You are no longer ethereal."));
251 player_ptr->tim_pass_wall = v;
252 auto &rfu = RedrawingFlagsUpdater::get_instance();
253 rfu.set_flag(MainWindowRedrawingFlag::TIMED_EFFECT);
259 disturb(player_ptr, false, false);
262 rfu.set_flag(StatusRedrawingFlag::BONUS);
263 handle_stuff(player_ptr);