From: Laurent MAZET Date: Tue, 17 Dec 2024 16:49:11 +0000 (+0100) Subject: first test X-Git-Tag: v1.0~14 X-Git-Url: https://secure.softndesign.org/git/?a=commitdiff_plain;h=424e825d1dc0a8dc3a61e82131a4a93326db8728;p=sokoban.git first test --- diff --git a/display.c b/display.c index 12ed42b..af167ee 100644 --- 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++) { diff --git a/sokoban.c b/sokoban.c index 2198cc0..49557f1 100644 --- a/sokoban.c +++ b/sokoban.c @@ -16,15 +16,28 @@ 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" + " Move up cursor\n" + " Move left cursor\n" + " Move down cursor\n" + " Move right cursor\n" + " Quit\n" + " 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 index 0000000..1b1a4e9 --- /dev/null +++ b/test.sok @@ -0,0 +1,3 @@ +width: 7 +height: 5 +tab: "##### #@ # # #$#### $ ..########"