1 #include "status/body-improvement.h"
2 #include "avatar/avatar.h"
3 #include "core/disturbance.h"
4 #include "core/speed-table.h"
5 #include "core/stuff-handler.h"
6 #include "core/window-redrawer.h"
7 #include "game-option/disturbance-options.h"
8 #include "player/player-status.h"
9 #include "realm/realm-song-numbers.h"
10 #include "spell-realm/spells-song.h"
11 #include "system/player-type-definition.h"
12 #include "system/redrawing-flags-updater.h"
13 #include "view/display-messages.h"
16 * @brief 対邪悪結界の継続時間をセットする / Set "protevil", notice observable changes
18 * @param do_dec 現在の継続時間より長い値のみ上書きする
19 * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
21 bool set_protevil(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
24 v = (v > 10000) ? 10000 : (v < 0) ? 0
27 if (player_ptr->is_dead) {
32 if (player_ptr->protevil && !do_dec) {
33 if (player_ptr->protevil > v) {
36 } else if (!player_ptr->protevil) {
37 msg_print(_("邪悪なる存在から守られているような感じがする!", "You feel safe from evil!"));
41 if (player_ptr->protevil) {
42 msg_print(_("邪悪なる存在から守られている感じがなくなった。", "You no longer feel safe from evil."));
47 player_ptr->protevil = v;
48 RedrawingFlagsUpdater::get_instance().set_flag(MainWindowRedrawingFlag::TIMED_EFFECT);
55 disturb(player_ptr, false, false);
58 handle_stuff(player_ptr);
63 * @brief 無傷球の継続時間をセットする / Set "invuln", notice observable changes
65 * @param do_dec 現在の継続時間より長い値のみ上書きする
66 * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
68 bool set_invuln(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
71 v = (v > 10000) ? 10000 : (v < 0) ? 0
74 if (player_ptr->is_dead) {
78 auto &rfu = RedrawingFlagsUpdater::get_instance();
79 static constexpr auto flags_swrf = {
80 SubWindowRedrawingFlag::OVERHEAD,
81 SubWindowRedrawingFlag::DUNGEON,
84 if (player_ptr->invuln && !do_dec) {
85 if (player_ptr->invuln > v) {
88 } else if (!is_invuln(player_ptr)) {
89 msg_print(_("無敵だ!", "Invulnerability!"));
91 chg_virtue(player_ptr, Virtue::UNLIFE, -2);
92 chg_virtue(player_ptr, Virtue::HONOUR, -2);
93 chg_virtue(player_ptr, Virtue::SACRIFICE, -3);
94 chg_virtue(player_ptr, Virtue::VALOUR, -5);
95 rfu.set_flag(MainWindowRedrawingFlag::MAP);
96 rfu.set_flag(StatusRecalculatingFlag::MONSTER_STATUSES);
97 rfu.set_flags(flags_swrf);
100 if (player_ptr->invuln && !music_singing(player_ptr, MUSIC_INVULN)) {
101 msg_print(_("無敵ではなくなった。", "The invulnerability wears off."));
103 rfu.set_flag(MainWindowRedrawingFlag::MAP);
104 rfu.set_flag(StatusRecalculatingFlag::MONSTER_STATUSES);
105 rfu.set_flags(flags_swrf);
106 player_ptr->energy_need += ENERGY_NEED();
110 player_ptr->invuln = v;
111 rfu.set_flag(MainWindowRedrawingFlag::TIMED_EFFECT);
118 disturb(player_ptr, false, false);
121 rfu.set_flag(StatusRecalculatingFlag::BONUS);
122 handle_stuff(player_ptr);
127 * @brief 時限急回復の継続時間をセットする / Set "tim_regen", notice observable changes
129 * @param do_dec 現在の継続時間より長い値のみ上書きする
130 * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
132 bool set_tim_regen(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
135 v = (v > 10000) ? 10000 : (v < 0) ? 0
138 if (player_ptr->is_dead) {
143 if (player_ptr->tim_regen && !do_dec) {
144 if (player_ptr->tim_regen > v) {
147 } else if (!player_ptr->tim_regen) {
148 msg_print(_("回復力が上がった!", "You feel yourself regenerating quickly!"));
152 if (player_ptr->tim_regen) {
153 msg_print(_("素早く回復する感じがなくなった。", "You feel you are no longer regenerating quickly."));
158 player_ptr->tim_regen = v;
159 auto &rfu = RedrawingFlagsUpdater::get_instance();
160 rfu.set_flag(MainWindowRedrawingFlag::TIMED_EFFECT);
166 disturb(player_ptr, false, false);
169 rfu.set_flag(StatusRecalculatingFlag::BONUS);
170 handle_stuff(player_ptr);
175 * @brief 一時的反射の継続時間をセットする / Set "tim_reflect", notice observable changes
177 * @param do_dec 現在の継続時間より長い値のみ上書きする
178 * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
180 bool set_tim_reflect(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
183 v = (v > 10000) ? 10000 : (v < 0) ? 0
186 if (player_ptr->is_dead) {
191 if (player_ptr->tim_reflect && !do_dec) {
192 if (player_ptr->tim_reflect > v) {
195 } else if (!player_ptr->tim_reflect) {
196 msg_print(_("体の表面が滑かになった気がする。", "Your body becames smooth."));
200 if (player_ptr->tim_reflect) {
201 msg_print(_("体の表面が滑かでなくなった。", "Your body is no longer smooth."));
206 player_ptr->tim_reflect = v;
207 auto &rfu = RedrawingFlagsUpdater::get_instance();
208 rfu.set_flag(MainWindowRedrawingFlag::TIMED_EFFECT);
214 disturb(player_ptr, false, false);
217 rfu.set_flag(StatusRecalculatingFlag::BONUS);
218 handle_stuff(player_ptr);
223 * @brief 一時的壁抜けの継続時間をセットする / Set "tim_pass_wall", notice observable changes
225 * @param do_dec 現在の継続時間より長い値のみ上書きする
226 * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
228 bool set_pass_wall(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
231 v = (v > 10000) ? 10000 : (v < 0) ? 0
234 if (player_ptr->is_dead) {
239 if (player_ptr->tim_pass_wall && !do_dec) {
240 if (player_ptr->tim_pass_wall > v) {
243 } else if (!player_ptr->tim_pass_wall) {
244 msg_print(_("体が半物質の状態になった。", "You became ethereal."));
248 if (player_ptr->tim_pass_wall) {
249 msg_print(_("体が物質化した。", "You are no longer ethereal."));
254 player_ptr->tim_pass_wall = v;
255 auto &rfu = RedrawingFlagsUpdater::get_instance();
256 rfu.set_flag(MainWindowRedrawingFlag::TIMED_EFFECT);
262 disturb(player_ptr, false, false);
265 rfu.set_flag(StatusRecalculatingFlag::BONUS);
266 handle_stuff(player_ptr);