ready for scaling
authorLaurent Mazet <mazet@softndesign.org>
Sat, 29 Jun 2024 05:09:04 +0000 (07:09 +0200)
committerLaurent Mazet <mazet@softndesign.org>
Sat, 29 Jun 2024 05:09:04 +0000 (07:09 +0200)
constant.c
display.c
function.c
function.h
solitaire.c
type.h

index d0dcbb269f30e47665d49407914e838335293303..f5ababd030d60f9013a3524de49b6b772ab8c72a 100644 (file)
@@ -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)
 {
index 9ba3e7ab04adcaa4b62ed328f759d1c75a3913ea..7b097b0e9d11d03f5934a218da9786c39e999014 100644 (file)
--- 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++) {
index 6dc23f5bbd152e83002be49036743b75239fd047..216b3d53ccc9538d78131403da6b82e6f9ffe46b 100644 (file)
@@ -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) {
index 927fb4d721f070508dd9fc4812a3f746089127af..61aa01940a13ac6384c678ac86e23c84d679cb85 100644 (file)
@@ -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);
index db76c1ebf73fa90db1c0714349f6c892db988d4e..02b5256b6065b5d15a2910c17b52d22b93c799e1 100644 (file)
@@ -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 46cef0e786fd4f855f5b77d59cb28427f583c835..34ea36521c6194f96303fe65152f755cb4c37555 100644 (file)
--- 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;