OSDN Git Service

b735591d0fd9e0ac49dc6ea847b698163365a343
[hengbandforosx/hengbandosx.git] / src / io / cursor.cpp
1 #include "io/cursor.h"
2 #include "core/player-redraw-types.h"
3 #include "core/player-update-types.h"
4 #include "core/stuff-handler.h"
5 #include "effect/effect-characteristics.h"
6 #include "effect/spells-effect-util.h"
7 #include "floor/cave.h"
8 #include "game-option/map-screen-options.h"
9 #include "game-option/special-options.h"
10 #include "grid/feature.h"
11 #include "io/screen-util.h"
12 #include "player/player-status.h"
13 #include "system/floor-type-definition.h"
14 #include "system/grid-type-definition.h"
15 #include "system/monster-entity.h"
16 #include "system/player-type-definition.h"
17 #include "system/redrawing-flags-updater.h"
18 #include "system/terrain-type-definition.h"
19 #include "target/projection-path-calculator.h"
20 #include "term/term-color-types.h"
21 #include "view/display-map.h"
22 #include "window/main-window-util.h"
23 #include "world/world.h"
24
25 /*
26  * Moves the cursor to a given MAP (y,x) location
27  */
28 void move_cursor_relative(int row, int col)
29 {
30     row -= panel_row_prt;
31     term_gotoxy(panel_col_of(col), row);
32 }
33
34 /*
35  * @brief 矢などの軌跡を*で表示する / print project path
36  * @param player_ptr プレイヤーへの参照ポインタ
37  * @param y 目標地点のY座標
38  * @param x 目標地点のX座標
39  */
40 void print_path(PlayerType *player_ptr, POSITION y, POSITION x)
41 {
42     byte default_color = TERM_SLATE;
43
44     if (!display_path || (project_length == -1)) {
45         return;
46     }
47
48     auto *floor_ptr = player_ptr->current_floor_ptr;
49     projection_path path_g(player_ptr, (project_length ? project_length : get_max_range(player_ptr)), player_ptr->y, player_ptr->x, y, x, PROJECT_PATH | PROJECT_THRU);
50     player_ptr->redraw |= (PR_MAP);
51     handle_stuff(player_ptr);
52     for (const auto &[ny, nx] : path_g) {
53         auto *g_ptr = &floor_ptr->grid_array[ny][nx];
54         if (panel_contains(ny, nx)) {
55             TERM_COLOR a = default_color;
56             char c;
57
58             TERM_COLOR ta = default_color;
59             auto tc = '*';
60
61             if (g_ptr->m_idx && floor_ptr->m_list[g_ptr->m_idx].ml) {
62                 map_info(player_ptr, ny, nx, &a, &c, &ta, &tc);
63
64                 if (!is_ascii_graphics(a)) {
65                     a = default_color;
66                 } else if (c == '.' && (a == TERM_WHITE || a == TERM_L_WHITE)) {
67                     a = default_color;
68                 } else if (a == default_color) {
69                     a = TERM_WHITE;
70                 }
71             }
72
73             if (!use_graphics) {
74                 if (w_ptr->timewalk_m_idx) {
75                     a = TERM_DARK;
76                 } else if (is_invuln(player_ptr) || player_ptr->timewalk) {
77                     a = TERM_WHITE;
78                 } else if (player_ptr->wraith_form) {
79                     a = TERM_L_DARK;
80                 }
81             }
82
83             c = '*';
84             term_queue_bigchar(panel_col_of(nx), ny - panel_row_prt, a, c, ta, tc);
85         }
86
87         if (g_ptr->is_mark() && !g_ptr->cave_has_flag(TerrainCharacteristics::PROJECT)) {
88             break;
89         }
90
91         if (nx == x && ny == y) {
92             default_color = TERM_L_DARK;
93         }
94     }
95 }
96
97 /*!
98  * @brief フォーカスを当てるべきマップ描画の基準座標を指定する(サブルーチン)
99  * @param player_ptr プレイヤーへの参照ポインタ
100  * @param dy 変更先のフロアY座標
101  * @param dx 変更先のフロアX座標
102  * Handle a request to change the current panel
103  * Return TRUE if the panel was changed.
104  * Also used in do_cmd_locate
105  * @return 実際に再描画が必要だった場合TRUEを返す
106  */
107 bool change_panel(PlayerType *player_ptr, POSITION dy, POSITION dx)
108 {
109     TERM_LEN wid, hgt;
110     get_screen_size(&wid, &hgt);
111
112     POSITION y = panel_row_min + dy * hgt / 2;
113     POSITION x = panel_col_min + dx * wid / 2;
114
115     auto *floor_ptr = player_ptr->current_floor_ptr;
116     if (y > floor_ptr->height - hgt) {
117         y = floor_ptr->height - hgt;
118     }
119     if (y < 0) {
120         y = 0;
121     }
122
123     if (x > floor_ptr->width - wid) {
124         x = floor_ptr->width - wid;
125     }
126     if (x < 0) {
127         x = 0;
128     }
129
130     if ((y == panel_row_min) && (x == panel_col_min)) {
131         return false;
132     }
133
134     panel_row_min = y;
135     panel_col_min = x;
136     panel_bounds_center();
137     auto &rfu = RedrawingFlagsUpdater::get_instance();
138     rfu.set_flag(StatusRedrawingFlag::MONSTER_STATUSES);
139     player_ptr->redraw |= (PR_MAP);
140     handle_stuff(player_ptr);
141     return true;
142 }
143
144 /*!
145  * @brief コンソール上におけるマップ表示の左上位置を返す /
146  * Calculates current boundaries Called below and from "do_cmd_locate()".
147  */
148 void panel_bounds_center(void)
149 {
150     TERM_LEN wid, hgt;
151     get_screen_size(&wid, &hgt);
152     panel_row_max = panel_row_min + hgt - 1;
153     panel_row_prt = panel_row_min - 1;
154     panel_col_max = panel_col_min + wid - 1;
155     panel_col_prt = panel_col_min - 13;
156 }