not working code
authorLaurent Mazet <mazet@softndesign.org>
Mon, 17 Jun 2024 22:09:01 +0000 (00:09 +0200)
committerLaurent Mazet <mazet@softndesign.org>
Mon, 17 Jun 2024 22:09:01 +0000 (00:09 +0200)
function.c
function.h
scrabble.c

index 6f18edf53efbb0904ba0715121bd84792d00e048..13e398d91a26ae15e17555c2f25686e59b7e044a 100644 (file)
@@ -555,16 +555,17 @@ char *savedata (int nbplayers, char *lang, char *board, play_t *play, draw_t *dr
     CHECKALLOC (buffer);
 
     int l = sprintf (buffer, "nbplayers: %d\n", nbplayers);
-    l += sprintf (buffer + l, "lang: \"%s\"\n", lang);
     l += sprintf (buffer + l, "board: \"%s\"\n", board);
-    l += sprintf (buffer + l, "play: \"%s\"\n", play->tab);
-    l += sprintf (buffer + l, "nbtiles: %d\n", draw->nbtiles);
-    l += sprintf (buffer + l, "tiles: \"%s\"\n", draw->tiles);
+    l += sprintf (buffer + l, "lang: \"%s\"\n", lang);
+    l += sprintf (buffer + l, "play->tab: \"%s\"\n", play->tab);
+    l += sprintf (buffer + l, "draw->nbtiles: %d\n", draw->nbtiles);
+    l += sprintf (buffer + l, "draw->tiles: \"%s\"\n", draw->tiles);
     for (i = 0; i < nbplayers; i++) {
-        l += sprintf (buffer + l, "game[%d]: \"%s\"\n", i, game[i]->tiles);
+        l += sprintf (buffer + l, "game[%d]->nbtiles: %d\n", i, game[i]->nbtiles);
+        l += sprintf (buffer + l, "game[%d]->tiles: \"%s\"\n", i, game[i]->tiles);
     }
     l += sprintf (buffer + l, "current: %d\n", n);
-    l += sprintf (buffer + l, "turn[%d]: \"%s\"\n", n, turn[n]->tab);
+    l += sprintf (buffer + l, "turn[%d]->tab: \"%s\"\n", n, turn[n]->tab);
     for (i = 0; i < nbplayers; i++) {
         l += sprintf (buffer + l, "score[%d]: %d\n", i, score[i]);
     }
@@ -584,6 +585,23 @@ int writedata (char *filename, char *data)
     return ret;
 }
 
+char *loaddata (char *filename)
+{
+    char *buffer = NULL;
+    FILE *fd = fopen (filename, "r");
+    if (fd) {
+        int size = fseek (fd, 0, SEEK_END);
+        buffer = (char *) calloc (size, 1);
+        CHECKALLOC (buffer);
+
+        fseek (fd, 0, SEEK_BEGIN);
+        fread (buffer, 1, size, fd);
+        fclose (fd);
+    }
+
+    return buffer;
+}
+
 char *atos (char *str)
 {
     char *ret = NULL;
@@ -602,7 +620,7 @@ char *atos (char *str)
     return ret;
 }
 
-int loaddata (char *str, int *nbplayers, char *lang, char *board, play_t *play, draw_t *draw, draw_t **game, int *n, play_t **turn, int *score)
+int loaddata (char *str, int *nbplayers, board_t **board, bag_t **bag, play_t *play, draw_t *draw, draw_t **game, int *n, play_t **turn, int *score)
 {
     int ret = 1;
 
@@ -620,33 +638,41 @@ int loaddata (char *str, int *nbplayers, char *lang, char *board, play_t *play,
 
         if (strcmp (name,  "nbplayers") == 0) {
             *nbplayers = atoi (value);
-        } else if (strcmp (name,  "lang") == 0) {
-            strcpy (lang, atos (value));
         } else if (strcmp (name,  "board") == 0) {
-            strcpy (board, atos (value));
-        } else if (strcmp (name,  "play") == 0) {
+            *board = getboard (atos (value));
+        } else if (strcmp (name,  "lang") == 0) {
+            *bag = getbag (atos (value));
+        } else if (strcmp (name,  "play->tab") == 0) {
             strcpy (play->tab, atos (value));
-        } else if (strcmp (name,  "ntiles") == 0) {
+        } else if (strcmp (name,  "draw->ntiles") == 0) {
             draw->nbtiles = atoi (value);
-        } else if (strcmp (name,  "tiles") == 0) {
+        } else if (strcmp (name,  "draw->tiles") == 0) {
             strcpy (draw->tiles, atos (value));
-        } else if (strcmp (name,  "game[0]") == 0) {
+        } else if (strcmp (name,  "game[0]->nbtiles") == 0) {
+            game[0]->nbtiles = atoi (value);
+        } else if (strcmp (name,  "game[0]->tiles") == 0) {
             strcpy (game[0]->tiles, atos (value));
-        } else if (strcmp (name,  "game[1]") == 0) {
+        } else if (strcmp (name,  "game[1]->nbtiles") == 0) {
+            game[1]->nbtiles = atoi (value);
+        } else if (strcmp (name,  "game[1]->tiles") == 0) {
             strcpy (game[1]->tiles, atos (value));
-        } else if (strcmp (name,  "game[2]") == 0) {
+        } else if (strcmp (name,  "game[2]->nbtiles") == 0) {
+            game[2]->nbtiles = atoi (value);
+        } else if (strcmp (name,  "game[2]->tiles") == 0) {
             strcpy (game[2]->tiles, atos (value));
-        } else if (strcmp (name,  "game[3]") == 0) {
+        } else if (strcmp (name,  "game[3]->nbtiles") == 0) {
+            game[3]->nbtiles = atoi (value);
+        } else if (strcmp (name,  "game[3]->tiles") == 0) {
             strcpy (game[3]->tiles, atos (value));
         } else if (strcmp (name,  "current") == 0) {
             *n = atoi (value);
-        } else if (strcmp (name,  "turn[0]") == 0) {
+        } else if (strcmp (name,  "turn[0]->tab") == 0) {
             strcpy (turn[0]->tab, atos (value));
-        } else if (strcmp (name,  "turn[1]") == 0) {
+        } else if (strcmp (name,  "turn[1]->tab") == 0) {
             strcpy (turn[1]->tab, atos (value));
-        } else if (strcmp (name,  "turn[2]") == 0) {
+        } else if (strcmp (name,  "turn[2]->tab") == 0) {
             strcpy (turn[2]->tab, atos (value));
-        } else if (strcmp (name,  "turn[3]") == 0) {
+        } else if (strcmp (name,  "turn[3]->tab") == 0) {
             strcpy (turn[3]->tab, atos (value));
         } else if (strcmp (name,  "score[0]") == 0) {
             score[0] = atoi (value);
@@ -657,12 +683,23 @@ int loaddata (char *str, int *nbplayers, char *lang, char *board, play_t *play,
         } else if (strcmp (name,  "score[3]") == 0) {
             score[3] = atoi (value);
         } else {
-            VERBOSE (WARNING, printf ("unknown key word: %s\n", name));
+            VERBOSE (WARNING, printf ("unknown keyword: %s\n", name));
         }
 
         line = strtok_r (NULL, "\n", &saveptr1);
     }
 
+    if (board) {
+        play->xsize = board->xsize;
+        play->ysize = board->ysize;
+        for (i = 0; i < MAXNBPLAYERS; i++) {
+            turn[i]->xsize = board->xsize;
+            turn[i]->ysize = board->ysize;
+        }
+    } else {
+        ret = 0;
+    }
+
     return ret;
 }
 
index af612d306635806c884f8763fa44e14bcfca8abe..0347e18d3531e584ac2634eccd88c20a4e0a5ba5 100644 (file)
@@ -67,6 +67,10 @@ char *savedata (int nbplayers, char *lang, char *board, play_t *play, draw_t *dr
 
 int writedata (char *filename, char *data);
 
+char *loaddata (char *filename);
+
+int restoredata (char *str, int *nbplayers, board_t **board, bag_t **bag, play_t *play, draw_t *draw, draw_t **game, int *n, play_t **turn, int *score);
+
 #endif /* __FUNCTION_H__ */
 
 /* vim: set ts=4 sw=4 et: */
index 56f051d8daf9a195d47417f12473e689d8773db8..58199e0dc9193b27ff8244b2f2803f5afb6ec24c 100644 (file)
@@ -28,6 +28,7 @@ char *boardname = "15x15-7";
 char *language = "fr";
 int nbplayers = 2;
 char *dict = NULL;
+char *file = NULL;
 int cache = 0;
 
 int xoffset = 4;
@@ -42,6 +43,7 @@ char *help =
     "<l> Move right tile\n"
     "<q> Quit\n"
     "<t> Toggle case legend\n"
+    "<s> Save game\n"
     "<v> Put tile\n"
     "<x> Retrieve tile\n"
     "<J> Move left in line\n"
@@ -58,6 +60,7 @@ int usage (int ret)
     fprintf (fd, " -h: help message\n");
     fprintf (fd, " -l: language (%s)\n", language);
     fprintf (fd, " -n: number of players (%d)\n", nbplayers);
+    fprintf (fd, " -r: restore game (%s)\n", (file) ? file : "none");
     fprintf (fd, " -v: verbose level (%d)\n", verbose);
     fprintf (fd, "%s version %s\n", progname, version);
 
@@ -217,24 +220,40 @@ int main (int argc, char *argv[])
     int xspellwin = xscorewin;
     int yspellwin = yscorewin + 3 + 1;
 
-    int mode = 0;
-    showboard (play, board, xoffset, yoffset, mode);
-
-    int x = (play->xsize + 1)/ 2 - 1;
-    int y = (play->ysize + 1)/ 2 - 1;
-
     int *score = (int *) calloc (MAXNBPLAYERS, sizeof (int));
     CHECKALLOC (score);
     for (n = 0; n < nbplayers; n++) {
         drawwindow (game[n], score[n], xdrawwin[n], ydrawwin[n], 0);
     }
     n = 0;
+
+    if (file) {
+        char *buffer = loaddata (file);
+        if (buffer) {
+            if (!restoredata (buffer, &nbplayers, &board, &bag, play, draw, game, &n, turn, score)) {
+                VERBOSE (ERROR, fprintf (stderr, "incorrect file (%s)\n", file));
+                return 1;
+            }
+        } else {
+            VERBOSE (ERROR, fprintf (stderr, "can't read file (%s)\n", file));
+            return 1;
+        }
+    }
+
+    int mode = 0;
+    showboard (play, board, xoffset, yoffset, mode);
+
+    int x = (play->xsize + 1)/ 2 - 1;
+    int y = (play->ysize + 1)/ 2 - 1;
+
     char current, letter = getnextletter (game[n]);
     drawwindow (game[n], score[n], xdrawwin[n], ydrawwin[n], 1);
     int nbpoints = 0;
     int stop = 0;
     char *data = NULL;
     while (!stop) {
+        showboard (play, board, xoffset, yoffset, mode);
+        nbpoints = evalscore (play, turn[n], board, bag);
         char highlight = current = gessletter (play, x, y);
         if ((current == ' ') && (letter != '\0')) {
             highlight = letter;
@@ -349,8 +368,6 @@ int main (int argc, char *argv[])
         //case ERR:
         //default:
         }
-        showboard (play, board, xoffset, yoffset, mode);
-        nbpoints = evalscore (play, turn[n], board, bag);
     }
 
     endwin ();