/* depend: */
/* cflags: */
-/* linker: debug.o display.o function.o -lcurses */
-/* doslnk: debug.o display.o function.o -lpdc~1 */
-/* winlnk: debug.o display.o function.o -lpdcurses */
+/* linker: constant.o debug.o display.o function.o -lcurses */
+/* doslnk: constant.o debug.o display.o function.o -lpdc~1 */
+/* winlnk: constant.o debug.o display.o function.o -lpdcurses */
#include <curses.h>
#include <stdio.h>
#include <stdlib.h>
+#include "constant.h"
#include "debug.h"
#include "display.h"
#include "function.h"
char *version = "0.1";
char *filename = NULL; /* .sok */
-char *levels = "level.skb";
+int level = 0;
int savelen = 12;
int scale = 1;
int wide = 0;
"<k> Move down cursor\n"
"<l> Move right cursor\n"
"<q> Quit\n"
+ "<r> Restart level\n"
"<s> Save file\n"
;
int usage (int ret)
{
FILE *fd = ret ? stderr : stdout;
- fprintf (fd, "usage: %s [-c] [-f file] [-h] [-l file] [-s int] [-v int] [-w]\n", progname);
+ fprintf (fd, "usage: %s [-c] [-f file] [-h] [-l int] [-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);
+ fprintf (fd, " -l: level (%d)\n", level);
fprintf (fd, " -s: scale [0..3] (%d)\n", scale);
fprintf (fd, " -v: verbose level (%d)\n", verbose);
fprintf (fd, " -w: wide board (%d)\n", wide);
case 'l':
arg = (arg[2]) ? arg + 2 : (--argc > 0) ? *(++argv) : NULL;
if (arg == NULL) {
- VERBOSE (ERROR, fprintf (stderr, "%s: no file specified\n", progname));
+ VERBOSE (ERROR, fprintf (stderr, "%s: no level specified\n", progname));
return usage (1);
}
- levels = arg;
+ level = atoi (arg);
break;
case 's':
arg = (arg[2]) ? arg + 2 : (--argc > 0) ? *(++argv) : NULL;
VERBOSE (ERROR, fprintf (stderr, "incorrect file (%s)\n", filename));
return 1;
}
+ } else {
+ board_t *temp = getlevel (level);
+ if (temp == (board_t *)(-1)) {
+ return 0;
+ }
+ if (temp) {
+ board = copyboard (temp);
+ }
}
if (board == NULL) {
VERBOSE (ERROR, fprintf (stderr, "no board defined\n"));
int mode = 0;
int stop = 0;
int dir = -1;
+ board_t *current = copyboard (board);
while (!stop) {
char *ptr = NULL;
if (dir >= 0) {
- movesokoban (board, dir);
+ movesokoban (current, dir);
dir = -1;
}
- boardwindow (board);
- mode = endofgame (board);
+ boardwindow (current);
+ mode = endofgame (current);
int ch = getch ();
switch (ch) {
case '\n':
case '\r':
if (mode == 1) {
- // load next level
- stop = 1;
+ freeboard (current);
+ level++;
+ board_t *temp = getlevel (level);
+ if (temp) {
+ freeboard (board);
+ board = copyboard (temp);
+ setscale (board, scale);
+ current = copyboard (board);
+ } else {
+ stop = 1;
+ }
}
break;
case KEY_UP:
break;
case KEY_ESC:
case 'q':
+ freeboard (current);
stop = 1;
break;
+ case KEY_BACKSPACE:
+ case KEY_DELETE:
+ case 127:
+ case '\b':
+ case 'r':
+ freeboard (current);
+ current = copyboard (board);
+ break;
case 's':
savename = savewindow (savelen, xsave, ysave);
if (savename != NULL) {
/* test: sokoban.exe -f nofile.sok 2>&1 | grep "can't read file" */
/* test: sokoban.exe -f bogus.sok 2>&1 | grep 'incorrect file' */
/* test: sokoban.exe -h | grep usage */
-/* test_: sokoban.exe -l nofile.skb 2>&1 | grep "can't read library" */
-/* test_: sokoban.exe -l bogus.skb 2>&1 | grep 'incorrect library' */
+/* test: sokoban.exe -l 2>&1 | grep specified */
/* test: sokoban.exe -s 2>&1 | grep specified */
/* test: sokoban.exe -v 2>&1 | grep missing */
/* test: sokoban.exe _ 2>&1 | grep invalid */