2 * =====================================================================================
6 * Description: Routines to handle the user interface
9 * Created: 24/04/2017 16:41:15
13 * Author: Jerome Benoit (fraggle), jerome.benoit@piment-noir.org
14 * Organization: Piment Noir
16 * =====================================================================================
25 /* in all print routine, y and x are the coordinates of the first character of the shape
26 * which can be a space ' ' */
28 /* FIXME: one can split this shape in building blocks and build it using them */
29 void print_board(int y
, int x
) {
31 mvprintw(y
, x
, " A | B | C | D | E | F | G | H");
32 mvprintw(y
+1, x
, " -----+----+----+----+----+----+----+-----");
33 mvprintw(y
+2, x
, "1| | | | | | | | |");
34 mvprintw(y
+3, x
, " | | | | | | | | |");
35 mvprintw(y
+4, x
, " +----+----+----+----+----+----+----+----+");
36 mvprintw(y
+5, x
, "2| | | | | | | | |");
37 mvprintw(y
+6, x
, " | | | | | | | | |");
38 mvprintw(y
+7, x
, " +----+----+----+----+----+----+----+----+");
39 mvprintw(y
+8, x
, "3| | | | | | | | |");
40 mvprintw(y
+9, x
, " | | | | | | | | |");
41 mvprintw(y
+10, x
, " +----+----+----+----+----+----+----+----+");
42 mvprintw(y
+11, x
, "4| | | | | | | | |");
43 mvprintw(y
+12, x
, " | | | | | | | | |");
44 mvprintw(y
+13, x
, " +----+----+----+----+----+----+----+----+");
45 mvprintw(y
+14, x
, "5| | | | | | | | |");
46 mvprintw(y
+15, x
, " | | | | | | | | |");
47 mvprintw(y
+16, x
, " +----+----+----+----+----+----+----+----+");
48 mvprintw(y
+17, x
, "6| | | | | | | | |");
49 mvprintw(y
+18, x
, " | | | | | | | | |");
50 mvprintw(y
+19, x
, " +----+----+----+----+----+----+----+----+");
51 mvprintw(y
+20, x
, "7| | | | | | | | |");
52 mvprintw(y
+21, x
, " | | | | | | | | |");
53 mvprintw(y
+22, x
, " +----+----+----+----+----+----+----+----+");
54 mvprintw(y
+23, x
, "8| | | | | | | | |");
55 mvprintw(y
+24, x
, " | | | | | | | | |");
56 mvprintw(y
+25, x
, " -----+----+----+----+----+----+----+-----");
59 static void set_default_colors() {
61 init_pair(1, COLOR_WHITE
, COLOR_BLACK
);
62 attron(COLOR_PAIR(1));
65 static void print_o(int y
, int x
, unsigned int type
) {
68 init_color(COLOR_CYAN
, 0, 0, 0); /* redefine to a dark black color */
69 init_pair(2, COLOR_WHITE
, COLOR_CYAN
);
70 attron(COLOR_PAIR(2));
72 init_pair(3, COLOR_BLACK
, COLOR_WHITE
);
73 attron(COLOR_PAIR(3));
75 mvprintw(y
, x
, "/\\");
76 mvprintw(y
+1, x
, "\\/");
77 /* reset to default */
81 /* will be used for pawn placement hints */
82 static void print_x(int y
, int x
, unsigned int type
) {
84 if (type
== hint_allowed
) {
85 init_pair(4, COLOR_GREEN
, COLOR_BLACK
);
86 attron(COLOR_PAIR(4));
88 init_pair(5, COLOR_RED
, COLOR_BLACK
);
89 attron(COLOR_PAIR(5));
91 mvprintw(y
, x
, "\\/");
92 mvprintw(y
+1, x
,"/\\");
93 /* reset to default */
97 /* y = 1: y -> 0 x = 1: 1 -> 1
98 * y > 1: y -> y + 3 x > 1: x -> x + 5 */
99 static int remap_y(int y
) {
103 } else if (y
> 1 && y
<= board_size
) {
104 return (remap_y(y
- 1) + 3);
110 static int remap_x(int x
) {
114 } else if (x
> 1 && x
<= board_size
) {
115 return (remap_x(x
- 1) + 5);
121 void print_pawns(int base_y
, int base_x
, unsigned int pawn_array
[board_size
][board_size
]) {
123 for (int i
= 1; i
<= board_size
; i
++) {
124 for (int j
= 1; j
<= board_size
; j
++) {
125 if (!is_box_type(i
, j
, pawn_array
, empty
)) {
126 print_o(base_y
+ remap_y(i
), base_x
+ remap_x(j
), get_box_value(i
, j
, pawn_array
));
132 int map_col_letter_to_index(char c
) {
134 if (c
== 'a' || c
== 'A') {
136 } else if (c
== 'b' || c
== 'B') {
138 } else if (c
== 'c' || c
== 'C') {
140 } else if (c
== 'd' || c
== 'D') {
142 } else if (c
== 'e' || c
== 'E') {
144 } else if (c
== 'f' || c
== 'F') {
146 } else if (c
== 'g' || c
== 'G') {
148 } else if (c
== 'h' || c
== 'H') {
155 /* return capital letters */
156 char map_col_index_to_letter(int index
) {
160 } else if (index
== 2) {
162 } else if (index
== 3) {
164 } else if (index
== 4) {
166 } else if (index
== 5) {
168 } else if (index
== 6) {
170 } else if (index
== 7) {
172 } else if (index
== 9) {
179 int prompt_values(WINDOW
* windows
, int base_y
, int base_x
, const char* msg
, int* y
, char* x
) {
180 mvwprintw(windows
, base_y
, base_x
, "%s\n", msg
);
181 int retval
= mvwscanw(windows
, base_y
+ 1, base_x
+ strlen(msg
)/2, "%d%c", y
, x
);
182 return (retval
== 1) ? 0 : 1;