Commit | Line | Data |
---|---|---|
480acfeb JB |
1 | /* |
2 | * ===================================================================================== | |
3 | * | |
4 | * Filename: ui.c | |
5 | * | |
b5e9ccd0 | 6 | * Description: Routines to handle the user interface |
480acfeb JB |
7 | * |
8 | * Version: 1.0 | |
9 | * Created: 24/04/2017 16:41:15 | |
10 | * Revision: none | |
11 | * Compiler: gcc | |
12 | * | |
13 | * Author: Jerome Benoit (fraggle), jerome.benoit@piment-noir.org | |
14 | * Organization: Piment Noir | |
15 | * | |
16 | * ===================================================================================== | |
17 | */ | |
18 | ||
74e2b93b | 19 | #include <string.h> |
480acfeb JB |
20 | |
21 | #include "ui.h" | |
54f1c58c JB |
22 | #include "othello.h" |
23 | #include "debug.h" | |
480acfeb JB |
24 | |
25 | /* in all print routine, y and x are the coordinates of the first character of the shape | |
26 | * which can be a space ' ' */ | |
27 | ||
28 | /* FIXME: one can split this shape in building blocks and build it using them */ | |
29 | void print_board(int y, int x) { | |
30 | ||
4ddf6f1a JB |
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, " +----+----+----+----+----+----+----+----+"); | |
74e2b93b | 48 | mvprintw(y+17, x, "6| | | | | | | | |"); |
4ddf6f1a JB |
49 | mvprintw(y+18, x, " | | | | | | | | |"); |
50 | mvprintw(y+19, x, " +----+----+----+----+----+----+----+----+"); | |
74e2b93b | 51 | mvprintw(y+20, x, "7| | | | | | | | |"); |
4ddf6f1a | 52 | mvprintw(y+21, x, " | | | | | | | | |"); |
74e2b93b JB |
53 | mvprintw(y+22, x, " +----+----+----+----+----+----+----+----+"); |
54 | mvprintw(y+23, x, "8| | | | | | | | |"); | |
55 | mvprintw(y+24, x, " | | | | | | | | |"); | |
56 | mvprintw(y+25, x, " -----+----+----+----+----+----+----+-----"); | |
480acfeb JB |
57 | } |
58 | ||
a8b54576 JB |
59 | static void set_default_colors() { |
60 | ||
61 | init_pair(1, COLOR_WHITE, COLOR_BLACK); | |
62 | attron(COLOR_PAIR(1)); | |
63 | } | |
64 | ||
74e2b93b | 65 | static void print_o(int y, int x, unsigned int type) { |
480acfeb | 66 | |
74e2b93b JB |
67 | if (type == black) { |
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)); | |
71 | } else { | |
72 | init_pair(3, COLOR_BLACK, COLOR_WHITE); | |
73 | attron(COLOR_PAIR(3)); | |
74 | } | |
480acfeb JB |
75 | mvprintw(y, x, "/\\"); |
76 | mvprintw(y+1, x, "\\/"); | |
74e2b93b | 77 | /* reset to default */ |
a8b54576 | 78 | set_default_colors(); |
480acfeb JB |
79 | } |
80 | ||
2e5c1894 | 81 | /* will be used for pawn placement hints */ |
74e2b93b | 82 | static void print_x(int y, int x, unsigned int type) { |
2e5c1894 | 83 | |
74e2b93b JB |
84 | if (type == hint_allowed) { |
85 | init_pair(4, COLOR_GREEN, COLOR_BLACK); | |
86 | attron(COLOR_PAIR(4)); | |
87 | } else { | |
88 | init_pair(5, COLOR_RED, COLOR_BLACK); | |
89 | attron(COLOR_PAIR(5)); | |
90 | } | |
2e5c1894 JB |
91 | mvprintw(y, x, "\\/"); |
92 | mvprintw(y+1, x,"/\\"); | |
74e2b93b | 93 | /* reset to default */ |
a8b54576 | 94 | set_default_colors(); |
2e5c1894 | 95 | } |
4ddf6f1a | 96 | |
2e5c1894 JB |
97 | /* y = 1: y -> 0 x = 1: 1 -> 1 |
98 | * y > 1: y -> y + 3 x > 1: x -> x + 5 */ | |
480acfeb | 99 | static int remap_y(int y) { |
b5e9ccd0 | 100 | |
480acfeb | 101 | if (y == 1) { |
74e2b93b | 102 | return 2; |
54f1c58c | 103 | } else if (y > 1 && y <= board_size) { |
74e2b93b | 104 | return (remap_y(y - 1) + 3); |
54f1c58c JB |
105 | } else { |
106 | return -1; | |
480acfeb JB |
107 | } |
108 | } | |
109 | ||
110 | static int remap_x(int x) { | |
111 | ||
112 | if (x == 1) { | |
74e2b93b | 113 | return 3; |
54f1c58c | 114 | } else if (x > 1 && x <= board_size) { |
2e5c1894 | 115 | return (remap_x(x - 1) + 5); |
54f1c58c JB |
116 | } else { |
117 | return -1; | |
2e5c1894 JB |
118 | } |
119 | } | |
120 | ||
74e2b93b | 121 | void print_pawns(int base_y, int base_x, unsigned int pawn_array[board_size][board_size]) { |
54f1c58c | 122 | |
a80646b7 JB |
123 | for (int i = 1; i <= board_size; i++) { |
124 | for (int j = 1; j <= board_size; j++) { | |
54f1c58c JB |
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)); | |
74e2b93b | 127 | } |
2e5c1894 | 128 | } |
480acfeb JB |
129 | } |
130 | } | |
74e2b93b | 131 | |
45ce2fe3 | 132 | int map_col_letter_to_index(char c) { |
b5e9ccd0 | 133 | |
74e2b93b JB |
134 | if (c == 'a' || c == 'A') { |
135 | return 1; | |
136 | } else if (c == 'b' || c == 'B') { | |
137 | return 2; | |
138 | } else if (c == 'c' || c == 'C') { | |
139 | return 3; | |
140 | } else if (c == 'd' || c == 'D') { | |
141 | return 4; | |
142 | } else if (c == 'e' || c == 'E') { | |
143 | return 5; | |
144 | } else if (c == 'f' || c == 'F') { | |
145 | return 6; | |
146 | } else if (c == 'g' || c == 'G') { | |
147 | return 7; | |
148 | } else if (c == 'h' || c == 'H') { | |
149 | return 8; | |
54f1c58c JB |
150 | } else { |
151 | return -1; | |
74e2b93b | 152 | } |
74e2b93b JB |
153 | } |
154 | ||
45ce2fe3 JB |
155 | /* return capital letters */ |
156 | char map_col_index_to_letter(int index) { | |
b5e9ccd0 | 157 | |
45ce2fe3 JB |
158 | if (index == 1) { |
159 | return 'A'; | |
160 | } else if (index == 2) { | |
161 | return 'B'; | |
162 | } else if (index == 3) { | |
163 | return 'C'; | |
164 | } else if (index == 4) { | |
165 | return 'D'; | |
166 | } else if (index == 5) { | |
167 | return 'E'; | |
168 | } else if (index == 6) { | |
169 | return 'F'; | |
170 | } else if (index == 7) { | |
171 | return 'G'; | |
172 | } else if (index == 9) { | |
173 | return 'H'; | |
174 | } else { | |
175 | return -1; | |
176 | } | |
177 | } | |
178 | ||
74e2b93b JB |
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); | |
a80646b7 JB |
181 | int retval = mvwscanw(windows, base_y + 1, base_x + strlen(msg)/2, "%d%c", y, x); |
182 | return (retval == 1) ? 0 : 1; | |
74e2b93b | 183 | } |