#include "display.h" // Definition of ncurses color pair identifiers #define CP_WHITE_ON_BLACK 1 #define CP_YELLOW_ON_BLACK 2 #define CP_BLUE_ON_BLACK 3 #define CP_MAGENTA_ON_BLACK 4 #define CP_RED_ON_BLACK 5 static bool colors = false; void display_draw_card(WINDOW *w, const uint32_t row, const uint32_t col, const card c) { unsigned color_pair = 0; if (colors) { switch (card_get_points(c)) { case 7: color_pair = CP_MAGENTA_ON_BLACK; break; case 5: color_pair = CP_RED_ON_BLACK; break; case 3: color_pair = CP_YELLOW_ON_BLACK; break; case 2: color_pair = CP_BLUE_ON_BLACK; break; default: color_pair = CP_WHITE_ON_BLACK; } attron(COLOR_PAIR(color_pair)); } mvwaddch(w, row, col, ACS_ULCORNER); // Upper left corner mvwhline(w, row, col+1, ACS_HLINE, 5); // Upper horizontal line mvwaddch(w, row, col+6, ACS_URCORNER); // Upper right corner mvwvline(w, row+1, col, ACS_VLINE, 3); // Left vertical line mvwvline(w, row+1, col+6, ACS_VLINE, 3); // Right vertical line mvwaddch(w, row+4, col, ACS_LLCORNER); // Lower left corner mvwhline(w, row+4, col+1, ACS_HLINE, 5); // Lower horizontal line mvwaddch(w, row+4, col+6, ACS_LRCORNER); // Lower right corner mvwprintw(w, row+1, col+1, " %3d ", c); // Card number, 3 digits wide, filled with spaces, if number has fewer digits // Clear the rest of the card first mvwprintw(w, row+2, col+1, " "); mvwprintw(w, row+3, col+1, " "); switch (card_get_points(c)) { case 7: // "** **" // " *** " mvwhline(w, row+2, col+1, ACS_DIAMOND, 2); mvwhline(w, row+2, col+4, ACS_DIAMOND, 2); mvwhline(w, row+3, col+2, ACS_DIAMOND, 3); break; case 5: // "* * *" // " * * " mvwaddch(w, row+2, col+1, ACS_DIAMOND); mvwaddch(w, row+2, col+3, ACS_DIAMOND); mvwaddch(w, row+2, col+5, ACS_DIAMOND); mvwaddch(w, row+3, col+2, ACS_DIAMOND); mvwaddch(w, row+3, col+4, ACS_DIAMOND); break; case 3: // " * * " // " * " mvwaddch(w, row+2, col+2, ACS_DIAMOND); mvwaddch(w, row+2, col+4, ACS_DIAMOND); mvwaddch(w, row+3, col+3, ACS_DIAMOND); break; case 2: // " * * " // " " mvwaddch(w, row+2, col+2, ACS_DIAMOND); mvwaddch(w, row+2, col+4, ACS_DIAMOND); break; default: // " * " // " " mvwaddch(w, row+2, col+3, ACS_DIAMOND); } if (colors) { attroff(COLOR_PAIR(color_pair)); } } void display_init(void) { initscr(); // Start curses mode if (TRUE == has_colors()) { colors = true; start_color(); init_pair(CP_WHITE_ON_BLACK, COLOR_WHITE, COLOR_BLACK); init_pair(CP_YELLOW_ON_BLACK, COLOR_YELLOW, COLOR_BLACK); init_pair(CP_BLUE_ON_BLACK, COLOR_BLUE, COLOR_BLACK); init_pair(CP_MAGENTA_ON_BLACK, COLOR_MAGENTA, COLOR_BLACK); init_pair(CP_RED_ON_BLACK, COLOR_RED, COLOR_BLACK); bkgd(COLOR_PAIR(0)); } raw(); // Line buffering disabled keypad(stdscr, true); // We get F1, F2 etc.. nodelay(stdscr, true); // Non-blocking input noecho(); // Don't echo() while we do getch curs_set(0); // Make the cursor invisible clear(); refresh(); int j = 0; for (int i = 45; i < 70; i++) { display_draw_card(stdscr, 0, j++*2, i+1); usleep(750000); refresh(); } } void display_fini(void) { endwin(); // End curses mode }