first test
authorLaurent MAZET <laurent.mazet@thalesgroup.com>
Tue, 17 Dec 2024 16:49:11 +0000 (17:49 +0100)
committerLaurent MAZET <laurent.mazet@thalesgroup.com>
Tue, 17 Dec 2024 16:49:11 +0000 (17:49 +0100)
display.c
sokoban.c
test.sok [new file with mode: 0644]

index 12ed42be949a3e1fec6ed4cbd1547184b6666148..af167ee945bd15d2cc76b2e7bbba97711858d30c 100644 (file)
--- a/display.c
+++ b/display.c
@@ -262,9 +262,8 @@ void boardwindow (board_t *board)
 {
     int i, j;
 
-    set_color (black);
-    _dobound (board->xsize, board->ysize, board->xoffset, board->yoffset);
     set_color (white);
+    _dobound (board->xsize, board->ysize, board->xoffset, board->yoffset);
 
    for (i = 0; i < board->width; i++) {
         for (j = 0; j < board->height; j++) {
index 2198cc09272955f03bbdf0452cc350cc2bd0f897..49557f16d121948218866754e73716cfeccf9a3f 100644 (file)
--- a/sokoban.c
+++ b/sokoban.c
 char *progname = NULL;
 char *version = "0.1";
 
-char *filename = NULL;
+char *filename = NULL; /* .sok */
 char *levels = "level.skb";
+int savelen = 12;
 int scale = 1;
 int wide = 0;
+int xoffset = 1;
+int yoffset = 1;
+
+char *help =
+    "< > Go to next level\n"
+    "<i> Move up cursor\n"
+    "<j> Move left cursor\n"
+    "<k> Move down cursor\n"
+    "<l> Move right cursor\n"
+    "<q> Quit\n"
+    "<s> Save file\n"
+    ;
 
 int usage (int ret)
 {
     FILE *fd = ret ? stderr : stdout;
-    fprintf (fd, "usage: %s [-c] [-f file] [-h] [-l file] [-v int]\n", progname);
+    fprintf (fd, "usage: %s [-c] [-f file] [-h] [-l file] [-s int] [-v int] [-w]\n", progname);
     fprintf (fd, " -f: file name (%s)\n", (filename) ? filename : "none");
     fprintf (fd, " -h: help message\n");
     fprintf (fd, " -l: level library (%s)\n", levels);
@@ -74,6 +87,14 @@ int main (int argc, char *argv[])
             }
             levels = 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) {
@@ -97,9 +118,108 @@ int main (int argc, char *argv[])
         return 1;
     }
 
-    int ret = -1;
+    /* load saved level */
+    board_t *board = NULL;
+    if (filename) {
+        char *buffer = readdata (filename);
+        if (buffer == NULL) {
+            VERBOSE (ERROR, fprintf (stderr, "can't read file (%s)\n", filename));
+            return 1;
+        }
+        board = loadboard (buffer);
+        free (buffer);
+        if (board == NULL) {
+            VERBOSE (ERROR, fprintf (stderr, "incorrect file (%s)\n", filename));
+            return 1;
+        }
+    }
+    if (board == NULL) {
+        VERBOSE (ERROR, fprintf (stderr, "no board defined"));
+        return 1;
+    }
+    setscale (board, scale);
 
-    return ret;
+    /* init curses window */
+    initscr ();
+    noecho ();
+    cbreak ();
+    nonl ();
+    keypad (stdscr, TRUE);
+    curs_set (0);
+    start_color ();
+
+    /* window positions */
+    int xboard = board->xoffset = xoffset + 1;
+    int yboard = board->yoffset = xoffset + 1;
+    int xhelp = xboard + xoffset + 1 + board->xsize;
+    int xcursor = 0;
+    int ycursor = 0;
+    int yhelp = yboard - 1;
+    int xsave = max (xboard + (board->xsize - savelen) / 2, 1);
+    int ysave = yboard + (board->ysize - 1) / 2;
+    char *savename = NULL;
+
+    /* help window */
+    int lhelp = helpwindow (help, xhelp, yhelp);
+
+    /* window positions */
+    int xmsg = xboard;
+    int ymsg = max (yboard + xoffset + 1 + board->ysize, yhelp + lhelp + yoffset + 1);
+    int lmsg = xhelp - xmsg + strmaxlen (help, '\n');
+
+    /* event loop */
+    int mode = 0;
+    int stop = 0;
+    while (!stop) {
+        char *ptr = NULL;
+
+        boardwindow (board);
+
+        int ch = getch ();
+        switch (ch) {
+        case ' ':
+        case '\n':
+        case '\r':
+            if (mode == 1) {
+                // load next level
+                mode = 0;
+            }
+            break;
+        case KEY_UP:
+        case 'i':
+            break;
+        case KEY_LEFT:
+        case 'j':
+            break;
+        case KEY_DOWN:
+        case 'k':
+            break;
+        case KEY_RIGHT:
+        case 'l':
+            break;
+        case KEY_ESC:
+        case 'q':
+            stop = 1;
+            break;
+        case 's':
+            savename = savewindow (savelen, xsave, ysave);
+            if (savename != NULL) {
+                ptr = saveboard (board);
+                if (writedata (savename, ptr)) {
+                    VERBOSE (WARNING, printf ("issue writing Board\n"));
+                }
+                free (ptr);
+                free (savename);
+            }
+            break;
+        }
+    }
+
+    endwin ();
+
+    freeboard (board);
+
+    return 0;
 }
 
 /* test: sokoban.exe -f 2>&1 | grep 'no file' */
diff --git a/test.sok b/test.sok
new file mode 100644 (file)
index 0000000..1b1a4e9
--- /dev/null
+++ b/test.sok
@@ -0,0 +1,3 @@
+width: 7
+height: 5
+tab: "#####  #@  #  # #$#### $ ..########"