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);
}
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) {
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' */