diff --git a/uttt.c b/uttt.c index e0288b0..35f1a36 100644 --- a/uttt.c +++ b/uttt.c @@ -176,7 +176,6 @@ int ut_dprintf(int fd, const char *restrict format, ...) return n; } -// TODO highlight last placed void ut_drawBoard(void (*mvch)(void*, int, int, char), void *arg, const char *tiles, int offset, int stride, int iy, int ix, char winner, bool highlight) { // 7x7 board display @@ -209,7 +208,7 @@ void ut_drawBoard(void (*mvch)(void*, int, int, char), void *arg, const char *ti } #define DTILES_Y 21 #define DTILES_X 21 -void ut_drawTiles(void (*mvch)(void*, int, int, char), void *arg, const struct ut_state *state, bool numbers) +void ut_drawTiles(void (*mvch)(void*, int, int, char), void *arg, const struct ut_state *state, bool numbers, int lr, int lc) { for(int r = 0; r < 3; r++) for(int c = 0; c < 3; c++) @@ -227,6 +226,10 @@ void ut_drawTiles(void (*mvch)(void*, int, int, char), void *arg, const struct u for(int r = 0; r < 3; r++) mvch(arg, 7 * b + 2 * r + 1, 0, '0' + 3 * b + r); } + if(lr >= 0 && lr < 9 && lc >= 0 && lc < 9) + mvch(arg, 7 * (lr / 3) + 2 * (lr % 3) + 1, + 7 * (lc / 3) + 2 * (lc % 3) + 1, + state->tiles[lr][lc] == 'X' ? '%' : '0'); } #define DBOARDS_Y 7 #define DBOARDS_X 7 @@ -240,12 +243,21 @@ void ut_drawBoards(void (*mvch)(void*, int, int, char), void *arg, const struct void ut_cursmvchc(void *arg, int y, int x, char c) { - if(has_colors()) + bool colorized; + if(colorized = has_colors()) { - color_set(c == 'X' ? 1 : c == 'O' ? 2 : 0, NULL); + color_set((c == 'X' || c == '%') ? 1 : + (c == 'O' || c == '0') ? 2 : 0, NULL); + } + bool bold; + if(c == '%' || c == '0') + { + bold = true; + attr_on(A_BOLD, NULL); } mvaddch(curs_line + y, x, c); - if(has_colors()) {color_set(0, NULL);} + if(bold) {attr_off(A_BOLD, NULL);} + if(colorized) {color_set(0, NULL);} } void ut_tmvch(void *arg, int y, int x, char c) { @@ -256,24 +268,20 @@ void ut_bmvch(void *arg, int y, int x, char c) ((char (*)[DBOARDS_X])arg)[y][x] = c; } -#define DTILES_LINE 1 +int dtiles_line; void ut_cursdraw(const struct ut_state *state) { ut_cursprintf("Turn: %c Play board: %d\n", (int)state->player, state->playBoard); - ut_drawTiles(ut_cursmvchc, NULL, state, false); + dtiles_line = curs_line; + ut_drawTiles(ut_cursmvchc, NULL, state, false, -1, -1); // TODO some kind of move history to know the last move curs_line += DTILES_Y; //ut_drawBoards(ut_cursmvchc, NULL, state); - - if(has_colors()) - { - // TODO set bold on last played character - } } void ut_sockdraw(const struct ut_state *state, int fd) { ut_dprintf(fd, "Turn: %c\nPlay board: %s\n", (int)state->player, PLAY_BOARDS[(state->playBoard + 10) % 10]); char dtiles[DTILES_Y][DTILES_X]; - ut_drawTiles(ut_tmvch, dtiles, state, true); + ut_drawTiles(ut_tmvch, dtiles, state, true, -1, -1); for(int r = 0; r < DTILES_Y; r++) { ut_dprintf(fd, "%.*s\n", DTILES_X, dtiles[r]); @@ -332,7 +340,7 @@ int ut_cursgetpos(const struct ut_state *state, int *r, int *c) *r = 3 * (*r / 3) + 1; *c = 3 * (*c / 3) + 1; }*/ - move(DTILES_LINE + (7 * (*r / 3) + 1) + (2 * (*r % 3)), + move(dtiles_line + (7 * (*r / 3) + 1) + (2 * (*r % 3)), (7 * (*c / 3) + 1) + (2 * (*c % 3))); refresh(); switch(getch()) @@ -340,7 +348,7 @@ int ut_cursgetpos(const struct ut_state *state, int *r, int *c) case KEY_MOUSE: if(getmouse(&event) == OK && (event.bstate & BUTTON1_CLICKED)) { - event.y -= DTILES_LINE; + event.y -= dtiles_line; if(event.y < 0 || event.y >= 21) {break;} if(event.x < 0 || event.x >= 21) {break;} *r = (event.y % 7 - 1) / 2 + 3 * (event.y / 7); @@ -669,13 +677,13 @@ void begin(void) nonl(); // \r instead of \r\n cbreak(); noecho(); + mousemask(BUTTON1_CLICKED, NULL); if (has_colors()) { start_color(); init_pair(1, COLOR_RED, COLOR_BLACK); init_pair(2, COLOR_BLUE, COLOR_BLACK); } - mousemask(BUTTON1_CLICKED, NULL); } int main(int argc, char **argv) {