save is ok
authorLaurent Mazet <mazet@softndesign.org>
Thu, 22 Aug 2024 22:21:35 +0000 (00:21 +0200)
committerLaurent Mazet <mazet@softndesign.org>
Thu, 22 Aug 2024 22:21:35 +0000 (00:21 +0200)
constant.c
function.c
function.h
pentomino.c
type.h

index ac91dd98b0b035ca1c994a1dd94b116691e7a958..630fd006f3f5052d2123e37a1d44e03293ad23e4 100644 (file)
@@ -27,18 +27,18 @@ int yoffset = 1;
 #define _nb_blocks_std 12
 
 block_t _blocks_std[_nb_blocks_std] = {
-    {3, 3, yellow, " ....  . "}, // F
-    {1, 5, blue, "...."},      // I
+    {3, 3, yellow, " ....  . "},       // F
+    {1, 5, blue, "....."},             // I
     {2, 4, lightmagenta, ". . . .."},  // L
-    {2, 4, lightblue, " .... . "},  // N
-    {2, 3, lightgreen, " ....."},    // P
-    {3, 3, lightcyan, "... .  . "}, // T
-    {3, 2, magenta, ". ...."},    // U
-    {3, 3, cyan, ".  .  ..."}, // V
+    {2, 4, lightblue, " .... . "},     // N
+    {2, 3, lightgreen, " ....."},      // P
+    {3, 3, lightcyan, "... .  . "},    // T
+    {3, 2, magenta, ". ...."},         // U
+    {3, 3, cyan, ".  .  ..."},         // V
     {3, 3, lightergreen, ".  ..  .."}, // W
-    {3, 3, red, " . ... . "}, // X
-    {2, 4, darkblue, " ... . ."},  // Y
-    {3, 3, brown, "..  .  .."}, // Z
+    {3, 3, red, " . ... . "},          // X
+    {2, 4, darkblue, " ... . ."},      // Y
+    {3, 3, brown, "..  .  .."},        // Z
 };
 
 blocks_t *getblocks (char *name)
index 8d84e7d6cee74963fffc31a6802873c81da262b5..409b514a39b2b38a62f2f75bf20bede749875109 100644 (file)
@@ -1,3 +1,4 @@
+#include <assert.h>
 #include <stdint.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -34,8 +35,6 @@ board_t *initboard (int width, int height)
     board->ysize = board->height = height;
     board->xoffset = 0;
     board->yoffset = 0;
-    board->current = -1;
-    board->next = -1;
     return board;
 }
 
@@ -84,9 +83,44 @@ int _makecomments (char *buffer, board_t *board)
     return l;
 }
 
-char *saveboard (board_t *board)
+char _itoz (int x)
 {
-    int size = 6 * (8 + 3) + 8 + board->width * board->height + 1;
+    return (x < 10) ? '0' + x : 'A' + x - 10;
+}
+
+int _sprinttab (char *buffer, char *name, int *tab, int nb)
+{
+    int i;
+    int l = sprintf (buffer, "%s: \"", name);
+    for (i = 0; i < nb; i++) {
+        l += sprintf (buffer + l, "%c", _itoz (tab[i]));
+    }
+    l += sprintf (buffer + l, "\"\n");
+    return l;
+}
+
+int _sprintblock (char *buffer, int id, block_t *block)
+{
+    int i;
+    int l = sprintf (buffer, "width[%d]: %d\n", id, block->width);
+    l += sprintf (buffer + l, "height[%d]: %d\n", id, block->height);
+    l += sprintf (buffer + l, "color[%d]: %d\n", id, block->color);
+    l += sprintf (buffer + l, "block[%d]: \"", id);
+    for (i = 0; i < block->width * block->height; i++) {
+        l += sprintf (buffer + l, "%c", block->tab[i]);
+    }
+    l += sprintf (buffer + l, "\"\n");
+    return l;
+}
+
+char *saveboard (board_t *board, blocks_t *blocks)
+{
+    int i;
+    int size = 3 * (8 + 3) + 8 + board->width * board->height + 1;
+    size += 3 * (8 + blocks->nb + 1);
+    for (i = 0; i < blocks->nb; i++) {
+        size += 3 * (13 + 3) + 14 + blocks->block[i]->width * blocks->block[i]->height + 1;
+    }
     VERBOSE (INFO, size += board->height * (8 + board->width));
 
     char *buffer = (char *) calloc (size, 1);
@@ -95,10 +129,14 @@ char *saveboard (board_t *board)
     int l = sprintf (buffer, "width: %d\n", board->width);
     l += sprintf (buffer + l, "height: %d\n", board->height);
     l += sprintf (buffer + l, "tab: \"%s\"\n", board->tab);
-    l += sprintf (buffer + l, "current: %d\n", board->current);
-    l += sprintf (buffer + l, "lines: %d\n", board->lines);
-    l += sprintf (buffer + l, "next: %d\n", board->next);
-    l += sprintf (buffer + l, "score: %d\n", board->score);
+    l += sprintf (buffer + l, "nb: %d\n", blocks->nb);
+    l += _sprinttab (buffer + l, "x", blocks->x, blocks->nb);
+    l += _sprinttab (buffer + l, "y", blocks->y, blocks->nb);
+    l += _sprinttab (buffer + l, "settle", blocks->settle, blocks->nb);
+    for (i = 0; i < blocks->nb; i++) {
+        l += _sprintblock (buffer + l, i, blocks->block[i]);
+    }
+    assert (l <= size);
 
     VERBOSE (INFO, _makecomments (buffer + l, board));
 
@@ -165,10 +203,6 @@ board_t *loadboard (char *str)
     int width = 0;
     int height = 0;
     char *tab = NULL;
-    int current = -1;
-    int lines = 0;
-    int next = -1;
-    int score = 0;
 
     char *saveptr1, *saveptr2;
 
@@ -188,14 +222,6 @@ board_t *loadboard (char *str)
             height = atoi (value);
         } else if (strcmp (keyword,  "tab") == 0) {
             tab = atos (value);
-        } else if (strcmp (keyword,  "current") == 0) {
-            current = atoi (value);
-        } else if (strcmp (keyword,  "lines") == 0) {
-            lines = atoi (value);
-        } else if (strcmp (keyword,  "next") == 0) {
-            next = atoi (value);
-        } else if (strcmp (keyword,  "score") == 0) {
-            score = atoi (value);
         } else if (strcmp (keyword,  "rem") == 0) {
             /* nothing to do with remark */
         } else {
@@ -209,10 +235,6 @@ board_t *loadboard (char *str)
     if ((tab) && (strlen (tab) == (size_t)(width * height))) {
         board = initboard (width, height);
         memcpy (board->tab, tab, width * height);
-        board->current = current;
-        board->lines = lines;
-        board->next = next;
-        board->score = score;
     }
 
     return board;
index 713d8c5244c1afd53bb87a3929bfb250f5724f57..4662089115a1f06fdd3b152358719d5f25754c1f 100644 (file)
@@ -29,7 +29,7 @@ void freeboard (board_t *board);
 
 int _makecomments (char *buffer, board_t *board);
 
-char *saveboard (board_t *board);
+char *saveboard (board_t *board, blocks_t *blocks);
 
 int writedata (char *filename, char *data);
 
index cc7d78afa53fe0ac5e8b9f2799e39f7d48553fcc..703a9f0ac122cfd130b92c92e7e73d9c4e279456 100644 (file)
@@ -178,7 +178,6 @@ int main (int argc, char *argv[])
         }
     }
     VERBOSE (DEBUG, fprintf (stderr, "block: %dx%d\n", wblock, hblock));
-    board_t *bench;
     int n = 0;
     switch (scale) {
     case 0:
@@ -192,13 +191,9 @@ int main (int argc, char *argv[])
         n = 3;
         break;
     }
-    bench = initboard (xoffset + (xoffset + wblock) * (blocks->nb) / n, (n - 1) * yoffset + n * hblock);
+    board_t *bench = initboard (xoffset + (xoffset + wblock) * (blocks->nb) / n, (n - 1) * yoffset + n * hblock);
     VERBOSE (DEBUG, fprintf (stderr, "windows: %dx%d\n", xoffset + (xoffset + wblock) * (blocks->nb + n - 1) / n, (1 + n) * yoffset + n * hblock));
     setscale (bench, scale);
-    for (i = 0; i < blocks->nb; i++) {
-        blocks->x[i] = xoffset + (xoffset + wblock) * (i / n) + (wblock - blocks->block[i]->width + 1) / 2;
-        blocks->y[i] = (yoffset + hblock) * (i % n) + (hblock - blocks->block[i]->height + 1) / 2;
-    }
 
     /* init curses window */
     initscr ();
@@ -222,19 +217,19 @@ int main (int argc, char *argv[])
     int ycursor = (board->height - blocks->block[cursor]->height) / 2;
 
     /* window positions (next) */
-    board_t *next = initboard (wblock + 2 * xoffset, hblock);
+    board_t *next = initboard (max (wblock, hblock) + 2 * xoffset, max (wblock, hblock));
     setscale (next, scale);
     int xnext = next->xoffset = xboard + board->xsize + xoffset + 2;
     int ynext = next->yoffset = yboard;
 
     /* window positions (bench) */
     int xbench = bench->xoffset = xboard;
-    int ybench = bench->yoffset = yboard + max (board->ysize, next->ysize) + 1 + yoffset;
+    int ybench = bench->yoffset = max (yboard + board->ysize, ynext + next->ysize) + 1 + yoffset;
 
     /* window positions (help) */
-    int xhelp = xbench + bench->xsize + xoffset + 1;
+    int xhelp = max (xbench + bench->xsize, xnext + next->xsize) + xoffset + 1;
     int yhelp = yboard - 1;
-    int lhelp = helpwindow (help, xhelp, yhelp);
+    helpwindow (help, xhelp, yhelp);
 
     /* window positions (msg) */
     int xmsg = xbench;
@@ -244,7 +239,9 @@ int main (int argc, char *argv[])
     /* blocks positions */
     boardwindow (bench, 1);
     for (i = 0; i < blocks->nb; i++) {
-        displayblock (bench, blocks->block[i], blocks->x[i], blocks->y[i]);
+        int x = xoffset + (xoffset + wblock) * (i / n) + (wblock - blocks->block[i]->width + 1) / 2;
+        int y = (yoffset + hblock) * (i % n) + (hblock - blocks->block[i]->height + 1) / 2;
+        displayblock (bench, blocks->block[i], x, y);
     }
 
     /* event loop */
@@ -262,7 +259,9 @@ int main (int argc, char *argv[])
                 boardwindow (next, 0);
                 displayblock (board, block, xcursor, ycursor);
             }
-            displayblock (next, block, xoffset + (wblock - block->width) / 2, (hblock - block->height) / 2);
+            int x = xoffset + (max (wblock, hblock) - block->width + 1) / 2;
+            int y = (max (wblock, hblock) - block->height) / 2;
+            displayblock (next, block, x, y);
             msgwindow ("Can you solve this puzzle?", xmsg, ymsg, lmsg);
             break;
         case 1:
@@ -295,7 +294,7 @@ int main (int argc, char *argv[])
         case 's':
             savename = savewindow (savelen, xsave, ysave);
             if (savename != NULL) {
-                char *ptr = saveboard (board);
+                char *ptr = saveboard (board, blocks);
                 if (writedata (savename, ptr)) {
                     VERBOSE (WARNING, printf ("issue writing Board\n"));
                 }
@@ -395,6 +394,8 @@ int main (int argc, char *argv[])
 
     free (rec);
     freeboard (board);
+    freeboard (bench);
+    freeboard (next);
     freeblocks (blocks);
 
     return 0;
diff --git a/type.h b/type.h
index c912717c5c94b2b2309fde56e7b47cce91db2147..e0e2570e8deeef0b4bb1427a345262d19c60b3a6 100644 (file)
--- a/type.h
+++ b/type.h
@@ -10,10 +10,6 @@ typedef struct {
     int ysize;
     int xoffset;
     int yoffset;
-    int current;
-    int lines;
-    int next;
-    int score;
 } board_t;
 
 typedef struct {