From: Laurent Mazet Date: Sat, 29 Jun 2024 05:09:04 +0000 (+0200) Subject: ready for scaling X-Git-Tag: v1.0~6 X-Git-Url: https://secure.softndesign.org/git/?a=commitdiff_plain;h=89eb52c514ec498f1ba6784da0f5dd0d371560c4;p=solitaire.git ready for scaling --- diff --git a/constant.c b/constant.c index d0dcbb2..f5ababd 100644 --- a/constant.c +++ b/constant.c @@ -13,7 +13,7 @@ board_t _board_french = {7, 7, "XXXXXXX" " XXXXX " " XXX ", - 1, 0, 0}; + 0, 0, 0, 0, 0}; board_t _board_german = {9, 9, " XXX " @@ -25,7 +25,7 @@ board_t _board_german = {9, 9, " XXX " " XXX " " XXX ", - 1, 0, 0}; + 0, 0, 0, 0, 0}; board_t _board_assymetric = {8, 9, " XXX " @@ -37,7 +37,7 @@ board_t _board_assymetric = {8, 9, " XXX " " XXX " " XXX ", - 1, 0, 0}; + 0, 0, 0, 0, 0}; board_t _board_english = {7, 7, " XXX " @@ -47,7 +47,7 @@ board_t _board_english = {7, 7, "XXXXXXX" " XXX " " XXX ", - 1, 0, 0}; + 0, 0, 0, 0, 0}; board_t _board_diamond = {9, 9, " X " @@ -59,7 +59,7 @@ board_t _board_diamond = {9, 9, " XXXXX " " XXX " " X ", - 1, 0, 0}; + 0, 0, 0, 0, 0}; board_t *getboard (char *name) { diff --git a/display.c b/display.c index 9ba3e7a..7b097b0 100644 --- a/display.c +++ b/display.c @@ -122,7 +122,7 @@ void _element (board_t *board, int x, int y, int symb) { int element = ' '; switch (board->scale) { - case 1: + case 0: set_color (black); switch (symb) { case 'C': @@ -165,7 +165,7 @@ void boardwindow (board_t *board) int i, j; set_color (black); - _dobound (board->width * board->scale, board->height * board->scale, board->xoffset, board->yoffset); + _dobound (board->xsize, board->ysize, board->xoffset, board->yoffset); set_color (white); for (i = 0; i < board->width; i++) { diff --git a/function.c b/function.c index 6dc23f5..216b3d5 100644 --- a/function.c +++ b/function.c @@ -28,9 +28,9 @@ board_t *initboard (int width, int height) board->tab = (char *) calloc (1, width * height + 1); CHECKALLOC (board->tab); memset (board->tab, ' ', width * height); - board->width = width; - board->height = height; - board->scale = 1; + board->scale = 0; + board->xsize = board->width = width; + board->ysize = board->height = height; board->xoffset = 0; board->yoffset = 0; return board; @@ -47,6 +47,30 @@ board_t *copyboard (board_t *board) return newboard; } +board_t *setscale (board_t *board, int scale) +{ + board->scale = scale; + switch (scale) { + case 0: + board->xsize = board->width; + board->ysize = board->height; + break; + case 1: + board->xsize = board->width * 2; + board->ysize = board->height; + break; + case 2: + board->xsize = board->width * 2; + board->ysize = board->height * 2; + break; + case 3: + board->xsize = board->width * 3; + board->ysize = board->height * 2; + break; + } + return board; +} + void freeboard (board_t *board) { if (board) { diff --git a/function.h b/function.h index 927fb4d..61aa019 100644 --- a/function.h +++ b/function.h @@ -21,6 +21,8 @@ board_t *initboard (int xsize, int ysize); board_t *copyboard (board_t *board); +board_t *setscale (board_t *board, int scale); + void freeboard (board_t *board); char *saveboard (board_t *board); diff --git a/solitaire.c b/solitaire.c index db76c1e..02b5256 100644 --- a/solitaire.c +++ b/solitaire.c @@ -22,6 +22,7 @@ char *version = "0.1"; char *boardname = "french"; char *filename = NULL; +int scale = 0; int xoffset = 1; int yoffset = 1; @@ -45,6 +46,7 @@ int usage (int ret) fprintf (fd, " -b: board name (%s|list)\n", boardname); fprintf (fd, " -h: help message\n"); fprintf (fd, " -f: file name (%s)\n", (filename) ? filename : "none"); + fprintf (fd, " -s: scale [0..3] (%d)\n", scale); fprintf (fd, " -v: verbose level (%d)\n", verbose); fprintf (fd, "%s version %s\n", progname, version); @@ -65,7 +67,7 @@ int main (int argc, char *argv[]) } /* process argument */ - while (argc-- > 1) { + while (argc-- > 1) { char *arg = *(++argv); if (arg[0] != '-') { VERBOSE (ERROR, fprintf (stderr, "%s: invalid option -- %s\n", progname, arg)); @@ -89,6 +91,14 @@ int main (int argc, char *argv[]) } filename = arg; break; + case 's': + arg = (arg[2]) ? arg + 2 : (--argc > 0) ? *(++argv) : NULL; + if (arg == NULL) { + VERBOSE (ERROR, fprintf (stderr, "%s: no scale specified\n", progname)); + return usage (1); + } + scale = atoi (arg); + break; case 'v': arg = (arg[2]) ? arg + 2 : (--argc > 0) ? *(++argv) : NULL; if (arg == NULL) { @@ -103,6 +113,11 @@ int main (int argc, char *argv[]) } } + /* check */ + if ((scale < 0) || (scale > 4)) { + VERBOSE (ERROR, fprintf (stderr, "incorrect scale (%d)\n", scale)); + } + /* load playground */ board_t *board = NULL; if (filename) { @@ -119,6 +134,7 @@ int main (int argc, char *argv[]) if (board == NULL) { return 1; } + setscale (board, scale); /* init curses window */ initscr (); @@ -132,12 +148,12 @@ int main (int argc, char *argv[]) /* window positions */ int xboard = board->xoffset = xoffset + 1; int yboard = board->yoffset = xoffset + 1; - int xhelp = xboard + xoffset + 1 + board->width * board->scale; + int xhelp = xboard + xoffset + 1 + board->xsize; int xcursor = 0; int ycursor = 0; int yhelp = yboard; - int xsave = max (xboard + (board->width * board->scale - savelen) / 2, 1); - int ysave = yboard + (board->height * board->scale - 1) / 2; + int xsave = max (xboard + (board->xsize - savelen) / 2, 1); + int ysave = yboard + (board->ysize - 1) / 2; char *savename = NULL; /* init windows */ @@ -247,6 +263,8 @@ int main (int argc, char *argv[]) /* test: solitaire.exe -f nofile.sol 2>&1 | grep "can't read file" */ /* test: solitaire.exe -f bogus.sol 2>&1 | grep 'incorrect file' */ /* test: solitaire.exe -h | grep usage */ +/* test: solitaire.exe -s 2>&1 | grep missing */ +/* test: solitaire.exe -s 4 2>&1 | grep incorrect */ /* test: solitaire.exe -v 2>&1 | grep missing */ /* test: solitaire.exe _ 2>&1 | grep invalid */ /* test: echo -n q | solitaire.exe */ diff --git a/type.h b/type.h index 46cef0e..34ea365 100644 --- a/type.h +++ b/type.h @@ -6,6 +6,8 @@ typedef struct { int height; char *tab; int scale; + int xsize; + int ysize; int xoffset; int yoffset; } board_t;