OSDN Git Service

[Refactor] #3286 Removed player-redraw-types.h
[hengbandforosx/hengbandosx.git] / src / status / sight-setter.cpp
1 #include "status/sight-setter.h"
2 #include "core/disturbance.h"
3 #include "core/stuff-handler.h"
4 #include "game-option/disturbance-options.h"
5 #include "player/player-status.h"
6 #include "realm/realm-song-numbers.h"
7 #include "spell-realm/spells-song.h"
8 #include "system/player-type-definition.h"
9 #include "system/redrawing-flags-updater.h"
10 #include "view/display-messages.h"
11
12 static bool update_sight(PlayerType *player_ptr, const bool notice)
13 {
14     auto &rfu = RedrawingFlagsUpdater::get_instance();
15     rfu.set_flag(MainWindowRedrawingFlag::TIMED_EFFECT);
16     if (!notice) {
17         return false;
18     }
19
20     if (disturb_state) {
21         disturb(player_ptr, false, false);
22     }
23
24     const auto flags = {
25         StatusRedrawingFlag::BONUS,
26         StatusRedrawingFlag::MONSTER_STATUSES,
27     };
28     rfu.set_flags(flags);
29     handle_stuff(player_ptr);
30     return true;
31 }
32
33 /*!
34  * @brief 時限ESPの継続時間をセットする / Set "tim_esp", notice observable changes
35  * @param v 継続時間
36  * @param do_dec 現在の継続時間より長い値のみ上書きする
37  * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
38  */
39 bool set_tim_esp(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
40 {
41     bool notice = false;
42     v = (v > 10000) ? 10000 : (v < 0) ? 0
43                                       : v;
44
45     if (player_ptr->is_dead) {
46         return false;
47     }
48
49     if (v) {
50         if (player_ptr->tim_esp && !do_dec) {
51             if (player_ptr->tim_esp > v) {
52                 return false;
53             }
54         } else if (!is_time_limit_esp(player_ptr)) {
55             msg_print(_("意識が広がった気がする!", "You feel your consciousness expand!"));
56             notice = true;
57         }
58     } else {
59         if (player_ptr->tim_esp && !music_singing(player_ptr, MUSIC_MIND)) {
60             msg_print(_("意識は元に戻った。", "Your consciousness contracts again."));
61             notice = true;
62         }
63     }
64
65     player_ptr->tim_esp = v;
66     return update_sight(player_ptr, notice);
67 }
68
69 /*!
70  * @brief 時限透明視の継続時間をセットする / Set "tim_invis", notice observable changes
71  * @param v 継続時間
72  * @param do_dec 現在の継続時間より長い値のみ上書きする
73  * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
74  */
75 bool set_tim_invis(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
76 {
77     bool notice = false;
78     v = (v > 10000) ? 10000 : (v < 0) ? 0
79                                       : v;
80
81     if (player_ptr->is_dead) {
82         return false;
83     }
84
85     if (v) {
86         if (player_ptr->tim_invis && !do_dec) {
87             if (player_ptr->tim_invis > v) {
88                 return false;
89             }
90         } else if (!player_ptr->tim_invis) {
91             msg_print(_("目が非常に敏感になった気がする!", "Your eyes feel very sensitive!"));
92             notice = true;
93         }
94     } else {
95         if (player_ptr->tim_invis) {
96             msg_print(_("目の敏感さがなくなったようだ。", "Your eyes feel less sensitive."));
97             notice = true;
98         }
99     }
100
101     player_ptr->tim_invis = v;
102     return update_sight(player_ptr, notice);
103 }
104
105 /*!
106  * @brief 時限赤外線視力の継続時間をセットする / Set "tim_infra", notice observable changes
107  * @param v 継続時間
108  * @param do_dec 現在の継続時間より長い値のみ上書きする
109  * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
110  */
111 bool set_tim_infra(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
112 {
113     bool notice = false;
114     v = (v > 10000) ? 10000 : (v < 0) ? 0
115                                       : v;
116
117     if (player_ptr->is_dead) {
118         return false;
119     }
120
121     if (v) {
122         if (player_ptr->tim_infra && !do_dec) {
123             if (player_ptr->tim_infra > v) {
124                 return false;
125             }
126         } else if (!player_ptr->tim_infra) {
127             msg_print(_("目がランランと輝き始めた!", "Your eyes begin to tingle!"));
128             notice = true;
129         }
130     } else {
131         if (player_ptr->tim_infra) {
132             msg_print(_("目の輝きがなくなった。", "Your eyes stop tingling."));
133             notice = true;
134         }
135     }
136
137     player_ptr->tim_infra = v;
138     return update_sight(player_ptr, notice);
139 }