154 lines
3.7 KiB
C
154 lines
3.7 KiB
C
#include <errno.h>
|
|
#include <getopt.h>
|
|
#include <libgen.h>
|
|
#include <locale.h>
|
|
#include <ncurses.h>
|
|
#include <stdlib.h>
|
|
|
|
#include "common.h"
|
|
#include "game.h"
|
|
#include "keyboard.h"
|
|
|
|
#ifndef VERSION
|
|
#define VERSION "n/a"
|
|
#endif
|
|
|
|
const char *program_name;
|
|
struct game game;
|
|
|
|
void version();
|
|
void usage(const char *);
|
|
void draw_greeting();
|
|
|
|
int main(int argc, char *argv[]) {
|
|
int option;
|
|
int option_index;
|
|
int passes_through_deck = 3;
|
|
static int four_color_deck;
|
|
static int no_background_color;
|
|
static const struct option options[] = {
|
|
{"help", no_argument, NULL, 'h'},
|
|
{"version", no_argument, NULL, 'v'},
|
|
{"passes", required_argument, NULL, 'p'},
|
|
{"four-color-deck", no_argument, &four_color_deck, 1},
|
|
{"no-background-color", no_argument, &no_background_color, 1},
|
|
{0, 0, 0, 0}};
|
|
|
|
program_name = basename(argv[0]);
|
|
|
|
while ((option = getopt_long(argc, argv, "hvp:", options, &option_index)) !=
|
|
-1) {
|
|
switch (option) {
|
|
case 'v':
|
|
version();
|
|
exit(0);
|
|
case 'p':
|
|
passes_through_deck = atoi(optarg);
|
|
break;
|
|
case 'h':
|
|
case '?':
|
|
usage(program_name);
|
|
exit(0);
|
|
case 0:
|
|
/* If this option set a "no_argument" flag, do nothing else now. */
|
|
printf("options[option_index].name: %s\n", options[option_index].name);
|
|
if (options[option_index].flag != 0)
|
|
break;
|
|
default:
|
|
usage(program_name);
|
|
exit(0);
|
|
}
|
|
}
|
|
|
|
setlocale(LC_ALL, "");
|
|
initscr();
|
|
raw();
|
|
noecho();
|
|
keypad(stdscr, TRUE);
|
|
start_color();
|
|
curs_set(FALSE);
|
|
set_escdelay(0);
|
|
if (no_background_color) {
|
|
use_default_colors();
|
|
} else {
|
|
assume_default_colors(COLOR_WHITE, COLOR_GREEN);
|
|
}
|
|
init_pair(1, COLOR_BLACK, COLOR_WHITE);
|
|
init_pair(2, COLOR_RED, COLOR_WHITE);
|
|
init_pair(3, COLOR_GREEN, COLOR_WHITE);
|
|
init_pair(4, COLOR_YELLOW, COLOR_WHITE);
|
|
init_pair(5, COLOR_WHITE, COLOR_BLUE);
|
|
init_pair(6, COLOR_WHITE, COLOR_GREEN);
|
|
|
|
int key;
|
|
|
|
while (!term_size_ok()) {
|
|
clear();
|
|
mvprintw(1, 1, SMALL_TERM_MSG);
|
|
refresh();
|
|
if ((key = getch()) == 'q' || key == 'Q') {
|
|
endwin();
|
|
return (0);
|
|
}
|
|
}
|
|
|
|
clear();
|
|
draw_greeting();
|
|
refresh();
|
|
|
|
for (;;) {
|
|
if ((key = getch()) == 'q' || key == 'Q') {
|
|
endwin();
|
|
return (0);
|
|
}
|
|
if (term_size_ok()) {
|
|
clear();
|
|
draw_greeting();
|
|
refresh();
|
|
if (key == KEY_SPACEBAR) {
|
|
clear();
|
|
refresh();
|
|
game_init(&game, passes_through_deck, four_color_deck);
|
|
break;
|
|
}
|
|
} else if (key == KEY_RESIZE) {
|
|
clear();
|
|
mvprintw(1, 1, SMALL_TERM_MSG);
|
|
refresh();
|
|
}
|
|
}
|
|
|
|
do {
|
|
keyboard_event(getch());
|
|
} while (!game_won());
|
|
|
|
endwin();
|
|
game_end();
|
|
printf("You won.\n");
|
|
|
|
return (0);
|
|
}
|
|
|
|
void draw_greeting() {
|
|
mvprintw(8, 26, "Welcome to tty-solitaire.");
|
|
mvprintw(10, 21, "Move with the arrow keys or <hjkl>.");
|
|
mvprintw(11, 18, "Use the space bar to select and place cards.");
|
|
mvprintw(12, 13, "After selecting a card you can use <m> to select more");
|
|
mvprintw(13, 13, "and <n> to select less. Press <Shift+M> to select all.");
|
|
mvprintw(15, 19, "Press the space bar to play or q to quit.");
|
|
}
|
|
|
|
void usage(const char *program_name) {
|
|
printf("usage: %s [OPTIONS]\n", program_name);
|
|
printf(" -v, --version Show version\n");
|
|
printf(" -h, --help Show this message\n");
|
|
printf(" -p, --passes Number of passes through the deck "
|
|
"(default: 3)\n");
|
|
printf(" --four-color-deck Draw unique card suit colors "
|
|
"(default: false)\n");
|
|
printf(" --no-background-color Don't draw background color "
|
|
"(default: false)\n");
|
|
}
|
|
|
|
void version() { printf("%s\n", VERSION); }
|