tty-solitaire/lib/display.c

141 lines
4.0 KiB
C
Raw Normal View History

2010-04-03 07:11:27 +00:00
#include <ncurses.h>
#include <malloc.h>
#include <string.h>
#include <locale.h>
2010-04-03 07:11:27 +00:00
#include "display.h"
void init_curses() {
setlocale(LC_ALL, ""); /* supporting unicode characters */
initscr(); /* initialize the terminal in curses mode */
raw(); /* disable line buffers */
noecho(); /* character echo is unnecessary */
keypad(stdscr, TRUE); /* enable F and arrow keys */
2010-04-03 19:34:45 +00:00
start_color();
init_pair(1, COLOR_BLACK, COLOR_WHITE);
init_pair(2, COLOR_RED, COLOR_WHITE);
init_pair(3, COLOR_WHITE, COLOR_BLUE);
}
void draw_empty_stacks() {
WINDOW **empty_stack;
empty_stack = malloc(EMPTY_STACKS_NUMBER * sizeof(**empty_stack));
empty_stack[0] = newwin(FRAME_HEIGHT, FRAME_WIDTH, 1, 1);
empty_stack[1] = newwin(FRAME_HEIGHT, FRAME_WIDTH, 1, 9);
empty_stack[2] = newwin(FRAME_HEIGHT, FRAME_WIDTH, 1, 25);
empty_stack[3] = newwin(FRAME_HEIGHT, FRAME_WIDTH, 1, 33);
empty_stack[4] = newwin(FRAME_HEIGHT, FRAME_WIDTH, 1, 41);
empty_stack[5] = newwin(FRAME_HEIGHT, FRAME_WIDTH, 1, 49);
empty_stack[6] = newwin(FRAME_HEIGHT, FRAME_WIDTH, 7, 1);
empty_stack[7] = newwin(FRAME_HEIGHT, FRAME_WIDTH, 7, 9);
empty_stack[8] = newwin(FRAME_HEIGHT, FRAME_WIDTH, 7, 17);
empty_stack[9] = newwin(FRAME_HEIGHT, FRAME_WIDTH, 7, 25);
empty_stack[10] = newwin(FRAME_HEIGHT, FRAME_WIDTH, 7, 33);
empty_stack[11] = newwin(FRAME_HEIGHT, FRAME_WIDTH, 7, 41);
empty_stack[12] = newwin(FRAME_HEIGHT, FRAME_WIDTH, 7, 49);
for (int i = 0; i < EMPTY_STACKS_NUMBER; i++) {
box(empty_stack[i], 0, 0);
wrefresh(empty_stack[i]);
delwin(empty_stack[i]);
}
return;
}
void init_game() {
draw_empty_stacks();
return;
}
2010-04-03 07:11:27 +00:00
char *card_suit(enum suit suit) {
char *card_suit;
card_suit = malloc(5 * sizeof(*card_suit));
2010-04-03 07:11:27 +00:00
switch(suit) {
2010-04-03 18:24:10 +00:00
case DIAMONDS: strcpy(card_suit, DIAMONDS_SYMBOL); break;
case SPADES: strcpy(card_suit, SPADES_SYMBOL); break;
case HEARTS: strcpy(card_suit, HEARTS_SYMBOL); break;
case CLUBS: strcpy(card_suit, CLUBS_SYMBOL); break;
2010-04-03 07:11:27 +00:00
default: strcpy(card_suit, "?");
}
return(card_suit);
}
2010-04-03 18:49:57 +00:00
char *card_value(enum value value) {
char *card_value;
card_value = malloc(2 * sizeof(*card_value));
2010-04-03 18:49:57 +00:00
switch(value) {
case TWO: card_value = "2"; break;
case THREE: card_value = "3"; break;
case FOUR: card_value = "4"; break;
case FIVE: card_value = "5"; break;
case SIX: card_value = "6"; break;
case SEVEN: card_value = "7"; break;
case EIGHT: card_value = "8"; break;
case NINE: card_value = "9"; break;
case TEN: card_value = "10"; break;
case JACK: card_value = "J"; break;
case QUEEN: card_value = "Q"; break;
case KING: card_value = "K"; break;
case ACE: card_value = "A"; break;
default: card_value = "?";
}
return(card_value);
}
2010-04-03 19:34:45 +00:00
void draw_value(struct card *card) {
mvwprintw(card->frame->shape, 0, 0, card_value(card->value));
mvwprintw(card->frame->shape, 4, 6, card_value(card->value));
return;
}
void draw_suit(struct card *card) {
if (card->suit % 2 == 0) {
wattron(card->frame->shape, COLOR_PAIR(RED_ON_WHITE));
mvwprintw(card->frame->shape, 0, 1, card_suit(card->suit));
mvwprintw(card->frame->shape, 4, 5, card_suit(card->suit));
wattroff(card->frame->shape, COLOR_PAIR(RED_ON_WHITE));
} else {
wattron(card->frame->shape, COLOR_PAIR(BLACK_ON_WHITE));
mvwprintw(card->frame->shape, 0, 1, card_suit(card->suit));
mvwprintw(card->frame->shape, 4, 5, card_suit(card->suit));
wattroff(card->frame->shape, COLOR_PAIR(BLACK_ON_WHITE));
}
return;
}
void draw_front(struct card *card) {
wbkgd(card->frame->shape, COLOR_PAIR(BLACK_ON_WHITE));
draw_value(card);
draw_suit(card);
return;
}
void draw_back(struct card *card) {
wbkgd(card->frame->shape, COLOR_PAIR(WHITE_ON_BLUE));
return;
}
void draw_card(struct card *card) {
if (card->face == EXPOSED) {
draw_front(card);
} else {
draw_back(card);
}
return;
}