6 #include "core/window-redrawer.h"
7 #include "core/player-redraw-types.h"
8 #include "core/stuff-handler.h"
9 #include "floor/floor-util.h"
10 #include "game-option/option-flags.h"
11 #include "object/item-tester-hooker.h"
12 #include "player-base/player-class.h"
13 #include "player-info/race-info.h"
14 #include "system/player-type-definition.h"
15 #include "system/redrawing-flags-updater.h"
16 #include "term/gameterm.h"
17 #include "term/screen-processor.h"
18 #include "term/term-color-types.h"
19 #include "util/bit-flags-calculator.h"
20 #include "view/display-messages.h"
21 #include "view/display-player.h"
22 #include "window/display-sub-windows.h"
23 #include "window/main-window-left-frame.h"
24 #include "window/main-window-row-column.h"
25 #include "window/main-window-stat-poster.h"
26 #include "window/main-window-util.h"
27 #include "world/world-turn-processor.h"
28 #include "world/world.h"
31 * @brief コンソールを再描画する /
32 * Redraw a term when it is resized
33 * @todo ここにPlayerType を追加するとz-termに影響が行くので保留
35 void redraw_window(void)
37 if (!w_ptr->character_dungeon) {
41 p_ptr->window_flags = PW_ALL;
48 * @brief 現在のマップ名を描画する / Print dungeon
49 * @param player_ptr プレイヤーへの参照ポインタ
51 static void print_dungeon(PlayerType *player_ptr)
53 TERM_LEN width, height;
54 term_get_size(&width, &height);
56 c_put_str(TERM_WHITE, " ", height + ROW_DUNGEON, COL_DUNGEON);
57 const auto dungeon_name = map_name(player_ptr);
58 TERM_LEN col = COL_DUNGEON + 6 - dungeon_name.length() / 2;
63 c_put_str(TERM_L_UMBER, dungeon_name, height + ROW_DUNGEON, col);
67 * @brief redraw のフラグに応じた更新をまとめて行う / Handle "redraw"
68 * @details 更新処理の対象はゲーム中の全描画処理
70 void redraw_stuff(PlayerType *player_ptr)
72 auto &rfu = RedrawingFlagsUpdater::get_instance();
73 if (!rfu.any_main()) {
77 if (!w_ptr->character_generated) {
81 if (w_ptr->character_icky_depth > 0) {
85 if (rfu.has(MainWindowRedrawingFlag::WIPE)) {
86 rfu.reset_flag(MainWindowRedrawingFlag::WIPE);
91 if (rfu.has(MainWindowRedrawingFlag::MAP)) {
92 rfu.reset_flag(MainWindowRedrawingFlag::MAP);
93 print_map(player_ptr);
96 if (rfu.has(MainWindowRedrawingFlag::BASIC)) {
98 MainWindowRedrawingFlag::BASIC,
99 MainWindowRedrawingFlag::TITLE,
100 MainWindowRedrawingFlag::ABILITY_SCORE,
101 MainWindowRedrawingFlag::LEVEL,
102 MainWindowRedrawingFlag::EXP,
103 MainWindowRedrawingFlag::GOLD,
104 MainWindowRedrawingFlag::AC,
105 MainWindowRedrawingFlag::HP,
106 MainWindowRedrawingFlag::MP,
107 MainWindowRedrawingFlag::DEPTH,
108 MainWindowRedrawingFlag::HEALTH,
109 MainWindowRedrawingFlag::UHEALTH,
111 rfu.reset_flags(flags);
112 print_frame_basic(player_ptr);
113 WorldTurnProcessor(player_ptr).print_time();
114 print_dungeon(player_ptr);
117 if (rfu.has(MainWindowRedrawingFlag::EQUIPPY)) {
118 rfu.reset_flag(MainWindowRedrawingFlag::EQUIPPY);
119 display_player_equippy(player_ptr, ROW_EQUIPPY, COL_EQUIPPY, 0);
122 if (rfu.has(MainWindowRedrawingFlag::TITLE)) {
123 rfu.reset_flag(MainWindowRedrawingFlag::TITLE);
124 print_title(player_ptr);
127 if (rfu.has(MainWindowRedrawingFlag::LEVEL)) {
128 rfu.reset_flag(MainWindowRedrawingFlag::LEVEL);
129 print_level(player_ptr);
132 if (rfu.has(MainWindowRedrawingFlag::EXP)) {
133 rfu.reset_flag(MainWindowRedrawingFlag::EXP);
134 print_exp(player_ptr);
137 if (rfu.has(MainWindowRedrawingFlag::ABILITY_SCORE)) {
138 rfu.reset_flag(MainWindowRedrawingFlag::ABILITY_SCORE);
139 print_stat(player_ptr, A_STR);
140 print_stat(player_ptr, A_INT);
141 print_stat(player_ptr, A_WIS);
142 print_stat(player_ptr, A_DEX);
143 print_stat(player_ptr, A_CON);
144 print_stat(player_ptr, A_CHR);
147 if (rfu.has(MainWindowRedrawingFlag::TIMED_EFFECT)) {
148 rfu.reset_flag(MainWindowRedrawingFlag::TIMED_EFFECT);
149 print_status(player_ptr);
152 if (rfu.has(MainWindowRedrawingFlag::AC)) {
153 rfu.reset_flag(MainWindowRedrawingFlag::AC);
154 print_ac(player_ptr);
157 if (rfu.has(MainWindowRedrawingFlag::HP)) {
158 rfu.reset_flag(MainWindowRedrawingFlag::HP);
159 print_hp(player_ptr);
162 if (rfu.has(MainWindowRedrawingFlag::MP)) {
163 rfu.reset_flag(MainWindowRedrawingFlag::MP);
164 print_sp(player_ptr);
167 if (rfu.has(MainWindowRedrawingFlag::GOLD)) {
168 rfu.reset_flag(MainWindowRedrawingFlag::GOLD);
169 print_gold(player_ptr);
172 if (rfu.has(MainWindowRedrawingFlag::DEPTH)) {
173 rfu.reset_flag(MainWindowRedrawingFlag::DEPTH);
174 print_depth(player_ptr);
177 if (rfu.has(MainWindowRedrawingFlag::UHEALTH)) {
178 rfu.reset_flag(MainWindowRedrawingFlag::UHEALTH);
179 print_health(player_ptr, true);
182 if (rfu.has(MainWindowRedrawingFlag::HEALTH)) {
183 rfu.reset_flag(MainWindowRedrawingFlag::HEALTH);
184 print_health(player_ptr, false);
187 if (rfu.has(MainWindowRedrawingFlag::EXTRA)) {
189 MainWindowRedrawingFlag::EXTRA,
190 MainWindowRedrawingFlag::CUT,
191 MainWindowRedrawingFlag::STUN,
192 MainWindowRedrawingFlag::HUNGER,
193 MainWindowRedrawingFlag::ACTION,
194 MainWindowRedrawingFlag::SPEED,
195 MainWindowRedrawingFlag::STUDY,
196 MainWindowRedrawingFlag::IMITATION,
197 MainWindowRedrawingFlag::TIMED_EFFECT,
199 rfu.reset_flags(flags);
200 print_frame_extra(player_ptr);
203 if (rfu.has(MainWindowRedrawingFlag::CUT)) {
204 rfu.reset_flag(MainWindowRedrawingFlag::CUT);
205 print_cut(player_ptr);
208 if (rfu.has(MainWindowRedrawingFlag::STUN)) {
209 rfu.reset_flag(MainWindowRedrawingFlag::STUN);
210 print_stun(player_ptr);
213 if (rfu.has(MainWindowRedrawingFlag::HUNGER)) {
214 rfu.reset_flag(MainWindowRedrawingFlag::HUNGER);
215 print_hunger(player_ptr);
218 if (rfu.has(MainWindowRedrawingFlag::ACTION)) {
219 rfu.reset_flag(MainWindowRedrawingFlag::ACTION);
220 print_state(player_ptr);
223 if (rfu.has(MainWindowRedrawingFlag::SPEED)) {
224 rfu.reset_flag(MainWindowRedrawingFlag::SPEED);
225 print_speed(player_ptr);
228 if (PlayerClass(player_ptr).equals(PlayerClassType::IMITATOR)) {
229 if (rfu.has(MainWindowRedrawingFlag::IMITATION)) {
230 rfu.reset_flag(MainWindowRedrawingFlag::IMITATION);
231 print_imitation(player_ptr);
237 if (rfu.has(MainWindowRedrawingFlag::STUDY)) {
238 rfu.reset_flag(MainWindowRedrawingFlag::STUDY);
239 print_study(player_ptr);
244 * @brief player_ptr->window のフラグに応じた更新をまとめて行う / Handle "player_ptr->window"
245 * @param player_ptr プレイヤーへの参照ポインタ
246 * @details 更新処理の対象はサブウィンドウ全般
248 void window_stuff(PlayerType *player_ptr)
250 if (!player_ptr->window_flags) {
255 for (auto i = 0U; i < angband_terms.size(); ++i) {
256 if (angband_terms[i] && !angband_terms[i]->never_fresh) {
257 mask |= window_flag[i];
260 BIT_FLAGS window_flags = player_ptr->window_flags & mask;
262 if (window_flags & (PW_INVENTORY)) {
263 player_ptr->window_flags &= ~(PW_INVENTORY);
264 fix_inventory(player_ptr);
267 if (window_flags & (PW_EQUIPMENT)) {
268 player_ptr->window_flags &= ~(PW_EQUIPMENT);
269 fix_equip(player_ptr);
272 if (window_flags & (PW_SPELL)) {
273 player_ptr->window_flags &= ~(PW_SPELL);
274 fix_spell(player_ptr);
277 if (window_flags & (PW_PLAYER)) {
278 player_ptr->window_flags &= ~(PW_PLAYER);
279 fix_player(player_ptr);
282 // モンスターBGM対応のため、視界内モンスター表示のサブウインドウなし時も処理を行う
283 if (player_ptr->window_flags & (PW_SIGHT_MONSTERS)) {
284 player_ptr->window_flags &= ~(PW_SIGHT_MONSTERS);
285 fix_monster_list(player_ptr);
288 if (window_flags & (PW_MESSAGE)) {
289 player_ptr->window_flags &= ~(PW_MESSAGE);
293 if (window_flags & (PW_OVERHEAD)) {
294 player_ptr->window_flags &= ~(PW_OVERHEAD);
295 fix_overhead(player_ptr);
298 if (window_flags & (PW_DUNGEON)) {
299 player_ptr->window_flags &= ~(PW_DUNGEON);
300 fix_dungeon(player_ptr);
303 if (window_flags & (PW_MONSTER_LORE)) {
304 player_ptr->window_flags &= ~(PW_MONSTER_LORE);
305 fix_monster(player_ptr);
308 if (window_flags & (PW_ITEM_KNOWLEDGTE)) {
309 player_ptr->window_flags &= ~(PW_ITEM_KNOWLEDGTE);
310 fix_object(player_ptr);
313 if (any_bits(window_flags, PW_FLOOR_ITEMS)) {
314 reset_bits(player_ptr->window_flags, PW_FLOOR_ITEMS);
315 // ウィンドウサイズ変更に対応できず。カーソル位置を取る必要がある。
316 fix_floor_item_list(player_ptr, player_ptr->y, player_ptr->x);
319 if (any_bits(window_flags, PW_FOUND_ITEMS)) {
320 reset_bits(player_ptr->window_flags, PW_FOUND_ITEMS);
321 fix_found_item_list(player_ptr);