xsok-1.02/ 40755 144 62 0 6123003304 10747 5ustar mbimathoptxsok-1.02/Makefile100644 144 62 2175 6122776755 12543 0ustar mbimathopt# Note: Typing 'make' from this level will rebuild xsok from scratch. # Afterwards, type 'make install' or 'make install.fsstnd' # (as root) to install the game in default directories. # A manual is in the doc subdirectory and can be TeXed by 'make manual'. # # You may change src/Imakefile for different configurations. # But then, you're on your own... all: (cd src && xmkmf && $(MAKE) && strip xsok) (cd lib && $(MAKE)) (cd src && $(MAKE) testname) manual: (cd doc && $(MAKE) xsok.dvi) # different install targets: imake default, local, Linux FSSTND install: (cd src && $(MAKE) install) install.local: (cd src && $(MAKE) install.local) install.fsstnd: (cd src && $(MAKE) install.fsstnd) clean: (cd lib && $(MAKE) clean) (cd src && xmkmf && $(MAKE) clean) (cd doc && $(MAKE) clean) (cd solver && $(MAKE) clean) rm -f src/Makefile find . -name "*~" -exec rm \{\} \; distrib: $(MAKE) clean (cd ..; tar cvfz $(HOME)/xsok-1.02-src.tar.gz xsok-1.02) bindistrib: (cd /; tar cvfz $(HOME)/xsok-1.02-bin.tar.gz var/games/xsok/*.score \ usr/games/bin/xsok usr/man/man6/xsok.6x usr/games/lib/xsok \ usr/doc/xsok) xsok-1.02/src/ 40755 144 62 0 6151124576 11556 5ustar mbimathoptxsok-1.02/src/xsok.h100644 144 62 22162 6122601264 13023 0ustar mbimathopt/*****************************************************************************/ /* */ /* */ /* Xsok version 1.00 -- module xsok.h */ /* */ /* This file is included by all sources of xsok. */ /* Written by Michael Bischoff (mbi@mo.math.nat.tu-bs.de) */ /* November-1994 */ /* see COPYRIGHT.xsok for Copyright details */ /* */ /* */ /*****************************************************************************/ #include #include #include #include #include /* defaults for user configurable directories */ #ifndef XSOKDIR /* directory where to get the game data files */ #define XSOKDIR "/usr/games/lib/xsok" #endif #ifndef XSOKSAVE /* directory where to save moves of solved levels */ #define XSOKSAVE "/var/games/xsok" #endif #define MAXSAVEFILELEN 200 /* pathname length including trailing zero */ #define MAXXSOKDIRLEN 99 /* pathname length of the xsok directory */ #define MAXFILENAMELEN 30 /* filename length of keyboard and message file */ /* maximum board dimensions, inclusive outer borders (tunable) */ #define MAXCOL 32 /* max x dim. */ #define MAXROW 22 /* max y dim. */ /* other maximum settings (tunable) */ #define MAXWALLS 32 /* max. different floor types */ #define MAXOBJECTS 32 /* max. different object types */ #define MAXINSTANCES 256 /* max. number of objects */ /* global string variables */ extern char username[256]; /* which user to blame for success */ extern const char *savedir; /* in which directory should saved games be stored (XSOKSAVE) */ extern const char *xsokdir; /* from which directory to read the level files (default: XSOKDIR) */ extern const char *langdir; /* a string (empty?) defining the language */ extern const char *rulepool[16]; extern int highscore[300]; extern int pushcost; extern int movecost; extern void (*lastcmd)(void); extern int numeric_arg; #ifndef EXIT_FAILURE /* poor old SUN's */ #define EXIT_FAILURE (-1) #endif #ifndef max #define max(a, b) ((a) > (b) ? (a) : (b)) #define min(a, b) ((a) < (b) ? (a) : (b)) #endif typedef int boolean; /* just one bit of information */ struct key_action { char *string; void (*action)(void); struct key_action *next; }; #define True 1 #define False 0 #if 0 /* obsolete */ #define XSOK1MAGIC1 0xb5 #define XSOK1MAGIC2 0xa0 #define ARR_UP 0x100 #define ARR_LEFT 0x101 #define ARR_DOWN 0x102 #define ARR_RIGHT 0x103 #endif #define Disable 0 #define Enable 1 #define EnableAndRedraw 2 struct walls { int chr; /* character for representation */ int pic; /* picture number */ int enter; int leave; int mask; int effect; }; /* definitions for the effect field */ /* all effects plus 100: square will turn to normal floor if touched. */ #define E_ONCE 100 /* add this to make one-time effects */ #define E_NOTHING 0 #define E_TURN_CCW 1 #define E_TURN_180 2 #define E_TURN_CW 3 #define E_DEST 4 /* no effect, but required by finished() */ #define E_EXIT 5 /* dito */ #define E_ADDPOWER 6 #define E_SUBPOWER 7 #define E_TELEPORT 8 /* addstrength, teleporters */ struct objects { int chr; /* character for representation */ int pic; /* picture number */ int movedir; int pushdir; int weight; int power; int mask; int score; }; struct game { int numrows; /* game size */ int numcols; int x; /* player pos */ int y; int n_pushes; /* counter */ int n_moves; int stored_moves; int bookmark; int finished; int level; int score; const char *type; int macroStart, macroEnd; int macro_x, macro_y; }; extern char levelcomment[100]; extern char levelauthor[100]; extern int gamegraphic; extern int maxlevel; /* maximum level number for this type of game */ extern int nwalls, nobjects, ninstances; extern struct objects objects[MAXOBJECTS]; extern struct walls walls[MAXWALLS]; /* wall types */ extern struct game game; extern struct walls *map[MAXROW][MAXCOL]; extern struct objects *obj[MAXROW][MAXCOL]; extern struct objects instance[MAXINSTANCES]; extern char *movetab; extern int numalloc; /* function prototypes */ /* parse.c */ void ParseDefinitionFile(void); /* read definitions */ void ParseMapFile(void); /* read a level */ void OrgLevel(void); /* restart game */ /* tools.c */ void fatal(const char *, ...); void *malloc_(size_t); void *calloc_(size_t, size_t); void *realloc_(void *, size_t); void free_(void *); char *strsav(const char *); /* main.c */ void change_rules(const char *); int compute_score(void); int finished(void); /* move.c */ #if 0 void savegame(const char *); int loadgame(const char *); #endif void graphics_control(int); void playermove(int); #if 0 void restart(void); int redo_move(void); int undo_move(void); #endif /* username.c */ void buildusername(const char *); /* messages.c */ void read_message_file(const char *); void add_keybinding(struct key_action **, const char *, const char *); void read_keyboard_file(const char *); void key_pressed(char *); /* loadsave.c */ void cmd_ReadHighscores(void); void WriteHighscores(void); void switch_uid(int); void setlangdir(void); void load_game(const char *); void save_game(const char *); void link_game(const char *, const char *); /* commands.c */ void cmd_Up(void); void cmd_Left(void); void cmd_Down(void); void cmd_Right(void); void cmd_Repeat(void); void cmd_LevelInfo(void); void cmd_NextUnsolved(void); void cmd_NextLevel(void); void cmd_PrevLevel(void); void rq_LeaveSok(void); void rq_RestartGame(void); void rq_PrevLevel(void); void rq_NextLevel(void); void rq_NextUnsolved(void); void cmd_DropBookmark(void); void jumpto_movenr(int); void cmd_RestartGame(void); void cmd_GotoBookmark(void); void cmd_SaveGame(void); void cmd_ShowVersion(void); void cmd_ShowScore(void); void cmd_ShowBestScore(void); void cmd_ShowAuthor(void); void cmd_ReplayGame(void); void cmd_LoadGame(void); void cmd_UndoMove(void); void cmd_RedoMove(void); extern const char *xsok_messages[]; #define TXT_QUIT_CONFIRM (xsok_messages[0]) #define TXT_NEW_CONFIRM (xsok_messages[1]) #define TXT_RESTART_CONFIRM (xsok_messages[2]) #define TXT_NEXT_CONFIRM (xsok_messages[3]) #define TXT_PREV_CONFIRM (xsok_messages[4]) #define TXT_MOVENOTPOSSIBLE (xsok_messages[5]) #define TXT_BOOKMARK_SET (xsok_messages[6]) #define TXT_YOU_WIN (xsok_messages[7]) #define TXT_OK (xsok_messages[8]) #define TXT_VERSION (xsok_messages[9]) #define TXT_SCORE (xsok_messages[10]) #define TXT_NOUNDO (xsok_messages[11]) #define TXT_UNDO (xsok_messages[12]) #define TXT_NOREDO (xsok_messages[13]) #define TXT_REDO (xsok_messages[14]) #define TXT_WELCOME (xsok_messages[15]) #define TXT_SAVE_ERR_BASIC (xsok_messages[16]) #define TXT_LOAD_ERR_BASIC (xsok_messages[17]) #define TXT_SAVE_ERR_OPEN (xsok_messages[18]) #define TXT_LOAD_ERR_OPEN (xsok_messages[19]) #define TXT_SAVE_ERR_HEADER (xsok_messages[20]) #define TXT_LOAD_ERR_HEADER (xsok_messages[21]) #define TXT_SAVE_ERR_MOVES (xsok_messages[22]) #define TXT_LOAD_ERR_MOVES (xsok_messages[23]) #define TXT_SAVE_OK (xsok_messages[24]) #define TXT_LOAD_OK (xsok_messages[25]) #define TXT_LOAD_ERR_BADMAGIC (xsok_messages[26]) #define TXT_NOAUTHOR (xsok_messages[27]) #define TXT_NEWHIGH (xsok_messages[28]) #define TXT_NOLOAD (xsok_messages[29]) #define TXT_HELP_KEYS (xsok_messages[30]) #define TXT_HELP_RULES (xsok_messages[31]) #define TXT_STARTMACRO (xsok_messages[32]) #define TXT_ENDMACRO (xsok_messages[33]) #define TXT_MACRO_BADPOS (xsok_messages[34]) #define TXT_UNSOLVED_CONFIRM (xsok_messages[35]) #define TXT_BEST (xsok_messages[36]) #define TXT_UNSOLVED (xsok_messages[37]) #define TXT_SAVE_ERR_LINK (xsok_messages[38]) #define TXT_NOBOX (xsok_messages[39]) #define TXT_ALREADYBOX (xsok_messages[40]) /* Xaw-help.c */ /* void create_help(Widget); void popup_help(void); void popdown_help(Widget, XtPointer, XtPointer); */ /* Xaw-main.c */ void show_message(const char *str, ...); void SetTitle(void); void cmd_LeaveSok(void); void cmd_Confirm(void); void cmd_Cancel(void); void request_confirm(void (*)(void), const char *); #ifdef SOUND int checksound(void); #endif int main(int argc, char *argv[]); /* void Force_Resize(XSize_t, XSize_t); */ /* X-widget.c */ /* void AskWidgetForResize(XSize_t, XSize_t); */ /* X-events.c */ void refresh_screen(void); /* void button_press(XButtonPressedEvent *); void key_press(XKeyPressedEvent *); */ void cmd_Resize(void); /* void resize_event(XSize_t, XSize_t); */ /* X-gfx.c */ void sync_and_wait(void); void NewLevel(int); void init_layout(void); void init_gfx(const char *); /* void dotPaint(int, int, int, int); */ void doPaint(int, int, int, int); /* void redraw_table(XExposeEvent *); */ #if SOUND /* X-sound_SUN.c */ int checksound(void); void play_sound(const char *); #else #define play_sound(x) #endif /* dummy.c */ void cmd_debug(void); /* xfopen.c */ FILE *zreadopen(const char *filename); void zreadclose(FILE *fp); /* mousemove.c */ void cmd_MouseUndo(void); void cmd_MouseMove(void); void cmd_MousePush(void); void cmd_MouseDrag(void); extern int mouse_x, mouse_y, mouse_x0, mouse_y0; void cmd_StartMacro(void); void cmd_EndMacro(void); void cmd_PlayMacro(void); xsok-1.02/src/xfopen.c100644 144 62 4346 5665071060 13323 0ustar mbimathopt/*****************************************************************************/ /* */ /* */ /* Xsok version 1.00 -- module xfopen.c */ /* */ /* Possible emulation of the popen() / pclose() functions. */ /* Written by Michael Bischoff (mbi@mo.math.nat.tu-bs.de) */ /* November-1994 */ /* see COPYRIGHT.xsok for Copyright details */ /* */ /* */ /*****************************************************************************/ #ifndef _POSIX_SOURCE #define _POSIX_SOURCE #endif #ifdef HAVE_POPEN /* extra prototype (they are not POSIX.1) */ #include "xsok.h" FILE *popen(const char *, const char *); int pclose(FILE *); FILE *zreadopen(const char *filename) { char zcmd[MAXXSOKDIRLEN+20+100]; /* assume strlen(GUNZIP_PATH) <= 100 */ sprintf(zcmd, "%s < %s.gz", GUNZIP_PATH, filename); return popen(zcmd, "r"); } void zreadclose(FILE *fp) { pclose(fp); } #else #include #include #include #include "xsok.h" #ifndef GUNZIP_PATH #define GUNZIP_PATH "gunzip" #endif FILE *zreadopen(const char *filename) { int filedes[2]; char zname[MAXXSOKDIRLEN+17]; FILE *fp; sprintf(zname, "%s.gz", filename); if (access(zname, R_OK)) return NULL; /* simpler and more correct */ if (GUNZIP_PATH[0] == '/') if (access(GUNZIP_PATH, X_OK)) return NULL; /* simpler and more correct */ /* following taken from D. Lewine "POSIX programmers guide, page 104 */ /* try fork and exec. This requires the path of the gzip binary */ /* but it is much faster */ if (pipe(filedes)) return NULL; /* cannot create pipe */ switch (fork()) { case -1: /* cannot fork */ /* close the pipe and return NULL */ close(filedes[0]); close(filedes[1]); return NULL; case 0: /* we are the child. exec the gunzip binary */ close(STDOUT_FILENO); dup(filedes[1]); close(filedes[0]); close(filedes[1]); execlp(GUNZIP_PATH, "gunzip", "-c", zname, NULL); exit(1); /* if exec failed! */ default: /* we are the main process */ fp = fdopen(filedes[0], "r"); close(filedes[1]); } return fp; } void zreadclose(FILE *fp) { int status; fclose(fp); wait(&status); } #endif xsok-1.02/src/Tableau.h100644 144 62 1550 5665071060 13400 0ustar mbimathopt#ifndef _Tableau_h #define _Tableau_h /* define any special resource names here that are not in */ #define XtNruleset "rules" #define XtCRuleset "Rules" #define XtNlevel "level" #define XtCLevel "Level" #define XtNusername "username" #define XtCUsername "Username" #define XtNxsokdir "xsokdir" #define XtCXsokdir "Xsokdir" #define XtNxpmdir "xpmdir" #define XtCXpmdir "Xpmdir" #define XtNsavedir "xsokdir" #define XtCSavedir "Xsokdir" #define XtNmessageFile "messageFile" #define XtCMessageFile "MessageFile" #define XtNkeyboardFile "keyboardFile" #define XtCKeyboardFile "KeyboardFile" /* declare specific TableauWidget class and instance datatypes */ typedef struct _TableauClassRec* TableauWidgetClass; typedef struct _TableauRec* TableauWidget; /* declare the class constant */ extern WidgetClass tableauWidgetClass; #endif /* _Tableau_h */ xsok-1.02/src/TableauP.h100644 144 62 1431 5665071060 13516 0ustar mbimathopt#ifndef _TableauP_h #define _TableauP_h #include "Tableau.h" /* include superclass private header file */ #include /* define unique representation types not found in */ #define XtRTableauResource "TableauResource" typedef struct { int empty; } TableauClassPart; typedef struct _TableauClassRec { CoreClassPart core_class; TableauClassPart tableau_class; } TableauClassRec; extern TableauClassRec tableauClassRec; typedef struct { /* resources */ String rules; int level; String username; String xsokdir; String xpmdir; String savedir; String messageFile; String keyboardFile; } TableauPart; typedef struct _TableauRec { CorePart core; TableauPart tableau; } TableauRec; #endif /* _TableauP_h */ xsok-1.02/src/X-events.c100644 144 62 10453 6122570645 13553 0ustar mbimathopt/*****************************************************************************/ /* */ /* */ /* Xsok version 1.00 -- module X-events.c */ /* */ /* Event handler functions for the X window system. */ /* Written by Michael Bischoff (mbi@mo.math.nat.tu-bs.de) */ /* November-1994 */ /* see COPYRIGHT.xsok for Copyright details */ /* */ /* */ /*****************************************************************************/ #include "X-sok.h" #include /* X11 key code definitions */ void refresh_screen(void) { XClearArea(dpy, table, 0, 0, 0, 0, True); } /* event entry points are: key_press, button_press, button_release, redraw_table */ int mouse_x = 0, mouse_y = 0, mouse_x0 = 0, mouse_y0 = 0; void button_press(XButtonPressedEvent *xev) { mouse_x0 = xev->x / DX; mouse_y0 = xev->y / DY; } void button_release(XButtonPressedEvent *xev) { mouse_x = xev->x / DX; mouse_y = xev->y / DY; switch (xev->button) { case Button1: /* quick move */ key_pressed("Mouse1"); break; case Button2: /* quick move */ key_pressed("Mouse2"); break; case Button3: /* quick move */ key_pressed("Mouse3"); break; case Button4: /* quick move */ key_pressed("Mouse4"); break; case Button5: /* quick move */ key_pressed("Mouse5"); break; } } void key_press(XKeyPressedEvent *xev) { char str[32]; int num; #define get_name_field() get_selection() num = XKeycodeToKeysym(dpy, xev->keycode, 0); if (num & 0xff00) { switch (num) { case XK_Up: key_pressed("Up"); return; case XK_Left: key_pressed("Left"); return; case XK_Down: key_pressed("Down"); return; case XK_Right: key_pressed("Right"); return; case XK_Return: case XK_Linefeed: key_pressed("\n"); return; case XK_BackSpace: case XK_Delete: key_pressed("\b"); return; case XK_Escape: key_pressed("\033"); return; } return; } num = XLookupString(xev, str, 31, NULL, NULL); if (num == 0) return; str[num] = '\0'; /* NULL to terminate it */ key_pressed(str); } /*****************************************************************************/ /* */ /* Functions for resize events and resize requests */ /* */ /*****************************************************************************/ /* 1) hard resizes (i.e. forcing the outer window to change size) */ /* I think these are not liked in the Xaw community */ void cmd_Resize(void) { XSize_t w, h; w = graphic.width; h = graphic.height; Force_Resize(w, h); } /* event handler function. This function is called by the Widget in response to a request from us. In Xaw, this is a resize of the logical area, i.e. of the virtual size of the tableau. */ void resize_event(XSize_t w, XSize_t h) { #ifdef LABER printf("resize event to (%d,%d) called\n", w, h); #endif if (graphic.height == h && graphic.width == w) return; /* no change of size */ /* in xlib, we must clear the new area by hand; there may be illegal data left in the server. This applies to Xaw as well */ { XExposeEvent xev; xev.count = -1; if (gamegraphic) { if (graphic.height < h) { /* window is greater now */ XClearArea(dpy, table, 0, graphic.height, graphic.width, h - graphic.height, True); ++xev.count; } if (graphic.width < w) { /* window is greater now */ XClearArea(dpy, table, graphic.width, 0, w - graphic.width, h, True); ++xev.count; } if (xev.count >= 0) { /* generate synthetic expose events for the new area */ /* this must be done before we possibly change the layout */ if (graphic.height < h) { /* window is greater now */ xev.x = 0; xev.y = graphic.height; xev.width = graphic.width; xev.height = h - graphic.height; redraw_table(&xev); --xev.count; } if (graphic.width < w) { /* window is greater now */ xev.x = graphic.width; xev.y = 0; xev.width = w - graphic.width; xev.height = h; redraw_table(&xev); } } } } graphic.height = h; graphic.width = w; if (!gamegraphic) return; } xsok-1.02/src/xsok.man100644 144 62 17237 6151124521 13354 0ustar mbimathopt.TH XSOK 6 "May 1996" "Handmade" .SH NAME xsok \- generic Sokoban game for X11, Version 1.02 .SH SYNOPSIS .B xsok [ .I options ] .SH DESCRIPTION .B xsok is a single player strategic game, a superset of the well known Sokoban game. This manpage describes only the user interface of \fBxsok\fP. If you want to create own levels, you should consult the \fBxsok\fP manual for more information. The target of \fBSokoban\fP is to push all the objects into the score area of each level using the mouse or the arrow keys. For the other level subsets, there are different kinds of objects, and special effect squares. \fBxsok\fP can be played using only the mouse, or only the keyboard. Keyboard and mouse bindings are defined through a textfile. This manual page describes the default bindings. .SH OPTIONS All standard X toolkit parameters may be given, such as \fB\-display\fP \fIdisplay\fP etc. Additional options are .TP 4 .B \-rules \fIlevel subset\fP This option specifies the initial level subset for \fBxsok\fP. Valid built-in rule names are \fBSokoban\fP, \fBCyberbox\fP, and \fBXsok\fP, but you may implement new level subsets without recompiling the game. Level subsets share common characteristics of the board. In \fBSokoban\fP, for example, all boxes have the same weight. In \fBXsok\fP, the first level is a demo level, where you can experiment with the new objects. .TP 4 .B \-level \fIstartlevel\fP Set the starting level. .TP 4 .B \-username \fIusername\fP In a save-game file, your name, as found in the \fB/etc/passwd\fP file, and the hostname of your computer, will be stored in the file. The default format is \fIrealname (username@hostname.domain)\fP, for example \fBMichael Bischoff (mbi@flawless.ts.rz.tu-bs.de)\fP. You can override this default string with the argument to the username option and provide a different e-mail address, for example .br \fBxsok -username "Michael Bischoff (m.bischoff@tu-bs.de)"\fP. If you break the scores for one level, your solution will be saved automatically. .TP 4 .B \-xsokdir \fIxsokdir\fP This option sets the root of the \fBxsok\fP data file tree. The default is \fB/usr/games/lib/xsok\fP. .TP 4 .B \-xpmdir \fIxpmdir\fP This gives the directory from where to load the graphic data. .TP 4 .B \-savedir \fIsavedir\fP This option sets the directory for save game files and the \fBxsok\fP highscore files. The default is \fB/var/games/xsok\fP. .TP 4 .B \-messageFile \fImessagefile\fP This option sets the name of an alternative message file for \fBxsok\fP. The pathname is relative to \fIxsokdir\fP. The default is \fBmessages\fP, and does not exist, which means to use the internal messages. .TP 4 .B \-keyboardFile \fIkeyboardfile\fP This option sets the name of the file defining the keyboard bindings. The pathname is relative to \fIxsokdir\fP. The default is \fBkeys\fP. The bindings in the default file are described below. All command line options may be abbreviated, or set by the X11 resource manager. The resource name for option \fB\-xyz\fP is \fBTableau.xyz\fP and its class name \fBTableau.Xyz\fP. .SH KEYBOARD BINDINGS The arrow keys will move the man. The default binding is similar to the binding in \fBxsokoban\fP. Some commands accept a numerical prefix (i.e. typing some digits before the command key), which usually is used as an operation count. .TP 8 .B a Display the author of a level (if known). .TP 8 .B b Drops the bookmark. .TP 8 .B g Goto bookmark. .TP 8 .B i Displays the level comment (if any). .TP 8 .B s Saves the current position. .TP 8 .B L Reloads a saved game. .TP 8 .B R Restart this level. With numerical prefix \fIn\fP, jumps to move number \fIn\fP. .TP 8 .B N Proceed to the next level. With numerical prefix \fIn\fP, jumps to level \fIn\fP. .TP 8 .B H Reread the highscore table. .TP 8 .B P Return to the previous level. .TP 8 .B U Proceeds to the next unsolved level. .TP 8 .B q Quits the game. .TP 8 .B v Shows the version of \fBxsok\fP. .TP 8 .B ? Shows the current score. .TP 8 .B b Shows the best score for this level. .TP 8 .B c Drops the bookmark at the current position. .TP 8 .B u Undoes the last elementary move. Accepts numerical prefix. .TP 8 .B r Redoes last move (undoes an undo). Accepts numerical prefix. .TP 8 .B ( Starts recording a macro (sequence of moves) .TP 8 .B ) End a macro. .TP 8 .B Replays a macro. .SH KEYBOARD BINDINGS With the default button assignment, button 1 is bound to the function \fBMouseMove\fP. If pressed on a clear square, the man will move to that location via the optimal path if such a path exists. If pressed on an object that is adjacent to the player, the object will be pushed. Button 2 is bound to \fBMouseDrag\fP. This command requires that you press the mouse button on a location where a box resides, drag the mouse, and release the button on an empty square. The man will then move the box from the first square onto the second with the minimal number of pushes, if it is possible at all. Please note that the man will not move any other object and will only use squares without effects. Button 3 is bound to \fBMouseUndo\fP. This function undoes one of the previous commands, which would possibly require a lot of calls to the atomic undo function. .SH NATIONAL LANGUAGE SUPPORT \fBxsok\fP has simple support for different languages. All messages which appear in the X11 window may be overloaded by files, as well as the key bindings. The typical support consists of an application-defaults file, a message file, and a keyboard file. Possibly translated online-help files are also there. To select a different language, call \fBxsok\fP after setting the environment variable \fBLANG\fP to the desired value. Currently, no translated version is available. .SH FILES (Directories may differ on your system.) \fB/usr/games/bin/xsok\fP \fB/var/games/xsok/\fP\fItype\fP\fB.score\fP \fB/var/games/xsok/\fP\fItype\fP\fB.\fP\fInn\fP\fB.{sv,bs,mp,mm}\fP \fB/usr/doc/xsok/COPYRIGHT.{GNU,xsok,xpm}\fP \fB/usr/doc/xsok/xsok.dvi\fP \fB/usr/doc/xsok/cyberbox.doc\fP \fB/usr/games/lib/xsok/floor.xpm.gz\fP \fB/usr/games/lib/xsok/objects.xpm.gz\fP \fB/usr/games/lib/xsok/keys\fP \fB/usr/games/lib/xsok/keys.help\fP \fB/usr/games/lib/xsok/\fP\fItype\fP\fB.def.gz\fP \fB/usr/games/lib/xsok/\fP\fItype\fP\fB.help\fP Where \fItype\fP is one of \fBSokoban\fP, \fBXsok\fP, \fBCyberbox\fP, and possibly others. .SH CREDITS Inspiration for \fBxsok\fP came from \fBxsokoban\fP, a previous implementation of the \fBSokoban\fP game by Joseph L. Traub. From this game, the wall graphics were taken, and the mouse button assignment. \fBxsokoban\fP's level files can be used without change, but by default, all level files of a level subset are combined into a single file. Of course, credits also go to the unknown author of the curses based game. The \fBCyberbox\fP levels (and a MSDOS game of the same name) are written by Doug Beeferman. .SH BUGS The undo function is too slow. Highscore file handling uses no file locking. \fBCyberbox\fP zappers are implemented as one-way passages, which causes worse scores and easier levels. Please mail bug reports to \fBmbi@mo.math.nat.tu-bs.de\fP. Fixes are especially welcome. .SH SEE ALSO \fBxsokoban(6x)\fP, \fBsokoban(6)\fP .SH AUTHOR Michael Bischoff .SH COPYRIGHT Copyright (c) 1994 by Michael Bischoff (\fBmbi@mo.math.nat.tu-bs.de\fP) .sp 1 Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation. \fBxsok\fP was developed under Linux, the free UNIX for the IBM-PC and compatibles. \fBxsok\fP is distributed by terms of the GNU General public license (GNU Copyleft). xsok-1.02/src/X-gfx.c100644 144 62 11203 6046457411 13025 0ustar mbimathopt/*****************************************************************************/ /* */ /* */ /* Xsok version 1.00 -- module X-gfx.c */ /* */ /* Drawing routines for the X window system. */ /* Written by Michael Bischoff (mbi@mo.math.nat.tu-bs.de) */ /* November-1994 */ /* see COPYRIGHT.xsok for Copyright details */ /* */ /* */ /*****************************************************************************/ #include "X-sok.h" /*#include */ #include #ifndef DELAY #define DELAY 50 /* time to sleep (in ms) between auto-moves & replay */ #endif Display *dpy; Window table = 0; struct graphic graphic; int gamegraphic = 1; static Pixmap floor, objd, objclip; static GC gc; static int resize_pending = 0; #ifndef HAVE_USLEEP #include /* usleep emulation code taken from xboing-2.2 by Justin C. Kibell */ static int usleep(unsigned long usec) { #ifdef SYSV #ifdef __clipper__ struct timeval tv; tv.tv_sec=((usec)/1000); tv.tv_usec=(((usec)%1000)*1000); select(1,NULL,NULL,NULL,&tv); #else poll((struct poll *) 0, (size_t) 0, usec / 1000); /* ms resolution */ #endif #else struct timeval timeout; timeout.tv_usec = usec % (unsigned long) 1000000; timeout.tv_sec = usec / (unsigned long) 1000000; select(0, (void *) 0, (void *) 0, (void *) 0, &timeout); #endif return 0; } #endif void sync_and_wait(void) { XSync(dpy, 0); usleep(DELAY*1000); } void NewLevel(int levelnr) { if (levelnr < 1) levelnr = 1; if (levelnr > maxlevel) levelnr = maxlevel; game.level = levelnr; ParseMapFile(); SetTitle(); if (table) { init_layout(); AskWidgetForResize(graphic.width, graphic.height); cmd_Resize(); if (gamegraphic) refresh_screen(); resize_pending = 1; } } void init_layout(void) { graphic.width = game.numcols * DX; graphic.height = game.numrows * DY; } void init_gfx(const char *xpmdir) { int screen, retcode; char s[MAXXSOKDIRLEN+14]; screen = DefaultScreen(dpy); gc = XDefaultGC(dpy, screen); sprintf(s, "%s/floor.xpm", xpmdir); if ((retcode = XpmReadFileToPixmap(dpy, RootWindow(dpy, screen), s, &floor, 0, NULL)) == XpmSuccess) { sprintf(s, "%s/objects.xpm", xpmdir); retcode = XpmReadFileToPixmap(dpy, RootWindow(dpy, screen), s, &objd, &objclip, NULL); } switch (retcode) { case XpmSuccess: return; /* no error */ case XpmColorFailed: case XpmColorError: fatal("Not enough colors for %s", s); case XpmOpenFailed: fatal("Cannot open %s", s); case XpmFileInvalid: fatal("Invalid File: %s", s); case XpmNoMemory: fatal("Out of memory reading %s", s); default: fatal("Unknown error (code %d) reading %s", s); } } #define ODRAW(c) { \ XSetClipOrigin(dpy, gc, x*DX - ((c)&3)*DX, y*DY - ((c)>>2)*DY);\ XCopyArea(dpy, objd, table, gc, DX*((c)&3), DY*((c)>>2), DX, DY, (x)*DX, (y)*DY); } static void do_redraw(int x, int y) { if (x >= game.numcols || y >= game.numrows || map[y][x]->pic == 16) return; /* x = y = 0; */ #ifndef SIMPLE_WALLS if (!map[y][x]->pic) { int b; b = 0; if (!map[y][x-1]->pic) b += 1; if (!map[y+1][x]->pic) b += 2; if (!map[y][x+1]->pic) b += 4; if (!map[y-1][x]->pic) b += 8; XCopyArea(dpy, floor, table, gc, DX * (b & 7), DY * (b / 8), DX, DY, (x)*DX, (y)*DY); } else #endif XCopyArea(dpy, floor, table, gc, DX * (map[y][x]->pic&7), DY * (map[y][x]->pic >> 3), DX, DY, (x)*DX, (y)*DY); if (obj[y][x]) { int c; XSetClipMask(dpy, gc, objclip); c = obj[y][x]->pic; ODRAW(c); XSetClipMask(dpy, gc, None); } } static void dotPaint(int minx, int miny, int maxx, int maxy) { int x, y; if (minx > maxx || miny > maxy) { int h; h = minx; minx = maxx; maxx = h; h = miny; miny = maxy; maxy = h; } x = minx-1; do { ++x; for (y = miny; y <= maxy; ++y) { do_redraw(x, y); } } while (x != maxx); } /* doPaint: just request it */ void doPaint(int minx, int miny, int maxx, int maxy) { #if 0 XClearArea(dpy, table, minx*DX, miny*DY, (maxx+1)*DX-1, (maxy+1)*DY-1, True); #else dotPaint(minx, miny, maxx, maxy); #endif } void redraw_table(XExposeEvent *xev) { int minx, miny, maxx, maxy; if (resize_pending) { if (xev->count) return; /* after a resize, do a complete redraw */ XClearArea(dpy, table, 0, 0, 0, 0, False); dotPaint(1, 1, game.numcols-2, game.numrows-2); resize_pending = 0; } else { minx = xev->x / DX; miny = xev->y / DY; maxx = (xev->x + xev->width - 1) / DX; maxy = (xev->y + xev->height - 1) / DY; dotPaint(minx, miny, maxx, maxy); } } xsok-1.02/src/score.c100644 144 62 3065 5665071060 13134 0ustar mbimathopt/*****************************************************************************/ /* */ /* */ /* Xsok version 1.00 -- module score.c */ /* */ /* Score computation and checking for finished levels. */ /* Written by Michael Bischoff (mbi@mo.math.nat.tu-bs.de) */ /* November-1994 */ /* see COPYRIGHT.xsok for Copyright details */ /* */ /* */ /*****************************************************************************/ #ifndef _POSIX_SOURCE #define _POSIX_SOURCE #endif #include "xsok.h" void change_rules(const char *type) { game.type = type; game.level = 0; ParseDefinitionFile(); } int compute_score(void) { int x, y; int retval = 1; game.score = 0; for (x = 1; x < game.numcols; ++x) for (y = 1; y < game.numrows; ++y) { int c; c = map[y][x]->effect; if (c == E_EXIT) { if (game.x != x || game.y != y) retval = 0; /* EXIT field with no player on it */ else game.score += obj[y][x]->score; } if (c == E_DEST) if (!obj[y][x] || !(obj[y][x]->mask & ~1)) retval = 0; /* player doesn't score! */ else game.score += obj[y][x]->score; } if (retval && !objects->score) game.score += 10000; /* finished-score if no special EXIT square */ game.score -= movecost * game.n_moves + pushcost * game.n_pushes; if (game.score < 0) game.score = 0; return retval; } int finished(void) { if (!compute_score()) return game.finished = 0; cmd_ShowScore(); return game.finished = 1; } xsok-1.02/src/tools.c100644 144 62 2743 5665071060 13163 0ustar mbimathopt/*****************************************************************************/ /* */ /* */ /* Xsok version 1.00 -- module tools.c */ /* */ /* Miscellaneous utility functions. */ /* Written by Michael Bischoff (mbi@mo.math.nat.tu-bs.de) */ /* November-1994 */ /* see COPYRIGHT.xsok for Copyright details */ /* */ /* */ /*****************************************************************************/ #ifndef _POSIX_SOURCE #define _POSIX_SOURCE #endif #include "xsok.h" void fatal(const char *msg, ...) { va_list args; va_start(args, msg); vfprintf(stderr, msg, args); fprintf (stderr, "\n"); exit (1); } void *malloc_(size_t n) { void *p; if (!n) return NULL; /* since malloc(0) may return NULL */ p = malloc(n); if (!p) fatal("out of memory"); return p; } void *calloc_(size_t n, size_t s) { void *p; if (!n) return NULL; /* WATCOM C says "out of memory" in the case n = 0 */ if (!(p = calloc(n, s))) fatal("out of memory"); return p; } void *realloc_(void *p, size_t n) { if (p == NULL) /* no old block of size > 0 exists */ return malloc_(n); if (!n) { free_(p); return NULL; } if (!(p = realloc(p, n))) fatal("out of memory\n"); return p; } void free_(void *p) { if (p) free(p); } char *strsav(const char *txt) { char *p = malloc_(1 + strlen(txt)); strcpy(p, txt); return p; } xsok-1.02/src/commands.c100644 144 62 14274 5665071060 13646 0ustar mbimathopt/*****************************************************************************/ /* */ /* */ /* Xsok version 1.00 -- module commands.c */ /* */ /* Most of the entries for commands assignable to keys */ /* Written by Michael Bischoff (mbi@mo.math.nat.tu-bs.de) */ /* November-1994 */ /* see COPYRIGHT.xsok for Copyright details */ /* */ /* */ /*****************************************************************************/ #ifndef _POSIX_SOURCE #define _POSIX_SOURCE #endif #include #include #include "xsok.h" #include "version.h" void cmd_Up(void) { playermove(0); } void cmd_Left(void) { playermove(1); } void cmd_Down(void) { playermove(2); } void cmd_Right(void) { playermove(3); } void cmd_Repeat(void) { if (game.n_moves) playermove(movetab[game.n_moves-1]); } void cmd_ShowAuthor(void) { if (*levelauthor) show_message("%s", levelauthor); else show_message("%s", TXT_NOAUTHOR); } void cmd_LevelInfo(void) { if (*levelcomment) { if (highscore[game.level]) show_message("%s (Best Score: %d)", levelcomment, highscore[game.level]); else show_message("%s (Unsolved level)", levelcomment); } else cmd_ShowBestScore(); } void cmd_NextUnsolved(void) { while (game.level < maxlevel) { if (!highscore[++game.level]) { NewLevel(game.level); cmd_LevelInfo(); return; } } } void cmd_NextLevel(void) { if (numeric_arg) if (numeric_arg <= maxlevel) game.level = numeric_arg - 1; /* & fall through */ if (game.level < maxlevel) { if (game.stored_moves && !game.finished) { play_sound("giveup"); } NewLevel(game.level+1); cmd_LevelInfo(); } } void cmd_PrevLevel(void) { if (game.level > 1) { if (game.stored_moves && !game.finished) { play_sound("giveup"); } NewLevel(game.level-1); cmd_LevelInfo(); } } void rq_LeaveSok(void) { request_confirm(cmd_LeaveSok, TXT_QUIT_CONFIRM); } /* unused, since this can be undone */ void rq_RestartGame(void) { request_confirm(cmd_RestartGame, TXT_RESTART_CONFIRM); } void rq_PrevLevel(void) { request_confirm(cmd_PrevLevel, TXT_PREV_CONFIRM); } void rq_NextLevel(void) { request_confirm(cmd_NextLevel, TXT_NEXT_CONFIRM); } void rq_NextUnsolved(void) { request_confirm(cmd_NextUnsolved, TXT_UNSOLVED_CONFIRM); } void cmd_DropBookmark(void) { game.bookmark = game.n_moves; /* easy, isn't it? */ show_message(TXT_BOOKMARK_SET); } void jumpto_movenr(int move_ptr) { int remgraphic = gamegraphic; if (move_ptr == game.n_moves) return; /* assert(move_ptr <= game.stored_moves); */ if (remgraphic) /* graphic was on */ graphics_control(Disable); if (move_ptr < game.n_moves) /* must reset first */ OrgLevel(); while (move_ptr > game.n_moves) { /* printf("doing move %d of %d (%d)\n", game.n_moves, move_ptr, movetab[game.n_moves]); */ int xx; xx = game.n_moves; playermove(movetab[game.n_moves]); if (xx == game.n_moves) fatal("Shit, same old bug again!\n"); } if (remgraphic) graphics_control(EnableAndRedraw); } void cmd_RestartGame(void) { if (numeric_arg <= game.stored_moves) jumpto_movenr(numeric_arg); else jumpto_movenr(game.stored_moves); cmd_LevelInfo(); } void cmd_GotoBookmark(void) { jumpto_movenr(game.bookmark); cmd_ShowScore(); } void cmd_SaveGame(void) { game.finished = compute_score(); save_game("sv"); } void cmd_ShowVersion(void) { show_message(TXT_VERSION, VERSION); } void cmd_ShowScore(void) { compute_score(); show_message(TXT_SCORE, game.n_moves, game.n_pushes, game.score, obj[game.y][game.x]->power - obj[game.y][game.x]->weight); } void cmd_ShowBestScore(void) { if (highscore[game.level]) show_message(TXT_BEST, highscore[game.level+100], highscore[game.level+200], highscore[game.level]); else show_message(TXT_UNSOLVED); } void cmd_ReplayGame(void) { if (game.n_moves) { int rem = game.n_moves; cmd_RestartGame(); sync_and_wait(); sync_and_wait(); do { cmd_RedoMove(); sync_and_wait(); sync_and_wait(); } while (game.n_moves < rem); cmd_ShowScore(); } } void cmd_LoadGame(void) { char filename[MAXSAVEFILELEN]; static const char **p, *extensions[] = { "sv", "bs", "mp", "mm", "sav", "sol", NULL }; for (p = extensions; *p; ++p) { sprintf(filename, "%s/%s.%02d.%s", savedir, game.type, game.level, *p); if (!access(filename, R_OK)) { load_game(filename); return; } } show_message(TXT_NOLOAD); } void cmd_StartMacro(void) { game.macroStart = game.n_moves; game.macroEnd = game.n_moves; game.macro_x = game.x; game.macro_y = game.y; show_message(TXT_STARTMACRO); } void cmd_EndMacro(void) { if (game.macroStart >= 0) { game.macroEnd = game.n_moves; show_message(TXT_ENDMACRO, game.n_moves-game.macroStart); } } void cmd_PlayMacro(void) { /* show_message("Stard %d, End %d, at (%d,%d)", game.macroStart, game.macroEnd, game.macro_x, game.macro_y); */ if (game.macroStart >= 0) { mouse_x = game.macro_x; mouse_y = game.macro_y; cmd_MouseMove(); /* sets the before_move variable */ if (game.x == game.macro_x && game.y == game.macro_y) { int i, base; base = game.n_moves; for (i = game.macroStart; i < game.macroEnd;) { playermove(movetab[i++]); if (game.n_moves != base + i - game.macroStart) break; /* invalid move */ } } else show_message(TXT_MACRO_BADPOS); } } void cmd_UndoMove(void) { if (game.n_moves) { int num = numeric_arg; if (!num) num = 1; if (game.n_moves >= num) jumpto_movenr(game.n_moves-num); else jumpto_movenr(0); show_message(TXT_UNDO); if (game.n_moves < game.macroStart || game.n_moves < game.macroEnd) game.macroStart = -1; } else if (game.stored_moves) { jumpto_movenr(game.stored_moves); show_message(TXT_UNDO); } else show_message(TXT_NOUNDO); } void cmd_RedoMove(void) { if (game.n_moves < game.stored_moves) { int num = numeric_arg; if (!num) num = 1; if (game.n_moves + num <= game.stored_moves) jumpto_movenr(game.n_moves+num); else jumpto_movenr(game.stored_moves); show_message(TXT_REDO); } else show_message(TXT_NOREDO); } xsok-1.02/src/X-sok.h100644 144 62 5254 6122571522 13026 0ustar mbimathopt/*****************************************************************************/ /* */ /* */ /* Xsok version 1.00 -- module X-sok.h */ /* */ /* This file is included by all sources for the X interface. */ /* Written by Michael Bischoff (mbi@mo.math.nat.tu-bs.de) */ /* November-1994 */ /* see COPYRIGHT.xsok for Copyright details */ /* */ /* */ /*****************************************************************************/ #include "xsok.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* in X11R3, XSize_t was int, since R4 we seem to have a mixture of int */ /* and unsigned int! (complain!) */ typedef unsigned int XSize_t; /* type used by X for width and height */ /* this is not consistent used by X11R5 */ extern struct graphic { boolean autolayout; /* automatic new layout at resize events */ XSize_t width; /* the width of the table window */ XSize_t height; /* the height of the table window */ } graphic; extern Display *dpy; extern Window table; extern Widget toplevel; #define DX 32 /* size of one square. we could even read this from the xpm file */ #define DY 32 /* prototypes. some of them may be in xsok.h already */ /* Xaw-help.c */ #ifdef ONLINE_HELP void create_help(void); void popup_help(void); void popdown_help(Widget, XtPointer, XtPointer); #endif /* Xaw-main.c */ void show_message(const char *str, ...); void SetTitle(void); void cmd_LeaveSok(void); void cmd_Confirm(void); void cmd_Cancel(void); void request_confirm(void (*)(void), const char *); #ifdef SOUND int checksound(void); #endif int main(int argc, char *argv[]); void Force_Resize(XSize_t, XSize_t); /* X-widget.c */ void AskWidgetForResize(XSize_t, XSize_t); /* X-events.c */ void refresh_screen(void); void button_press(XButtonPressedEvent *); void button_release(XButtonPressedEvent *); void key_press(XKeyPressedEvent *); void cmd_Resize(void); void resize_event(XSize_t, XSize_t); /* X-gfx.c */ void NewLevel(int); void init_layout(void); void init_gfx(const char *); /* void dotPaint(int, int, int, int); */ void doPaint(int, int, int, int); void redraw_table(XExposeEvent *); xsok-1.02/src/move.c100644 144 62 27271 5665071060 13014 0ustar mbimathopt/*****************************************************************************/ /* */ /* */ /* Xsok version 1.00 -- module move.c */ /* */ /* Detection of valid moves, and effect handling functions. */ /* Written by Michael Bischoff (mbi@mo.math.nat.tu-bs.de) */ /* November-1994 */ /* see COPYRIGHT.xsok for Copyright details */ /* */ /* */ /*****************************************************************************/ #ifndef _POSIX_SOURCE #define _POSIX_SOURCE #endif #include "xsok.h" #define SAVE_STATE /* variant which should flicker less */ #define SELECTOR_HACK /* ugly hack to allow Cyberbox selectors */ static int dxtab[4] = { 0, -1, 0, 1 }; static int dytab[4] = { -1, 0, 1, 0 }; char *movetab = NULL; int numalloc = 0; /* declare the unmovable blocker which prevents race conditions */ static struct objects blocked = { 1, 0, 0, 0, 0, 0, 0, 0 }; static void storemove(int res, int dir) { if (res > 1) ++game.n_pushes; if (game.n_moves == numalloc) movetab = realloc_(movetab, numalloc += 256); if (game.stored_moves > game.n_moves && movetab[game.n_moves] == dir) { /* This is a redo, but the user retyped it. Be nice. */ ++game.n_moves; } else { /* this is a new move: reset number of stored moves (no redo beyond this one) */ if (game.bookmark > game.n_moves) game.bookmark = game.n_moves; movetab[game.n_moves++] = dir; game.stored_moves = game.n_moves; /* reset the redo limit */ } } #define DOPAINT(x1,y1,x2,y2) if (gamegraphic) doPaint(x1,y1,x2,y2); #ifdef SAVE_STATE static struct walls *savemap[MAXROW][MAXCOL]; static struct objects *saveobj[MAXROW][MAXCOL]; static struct objects saveinstance[MAXINSTANCES]; static void save_state(void) { int x, y; gamegraphic = 0; memcpy(savemap, map, sizeof(map)); /* dereferenced objects are readonly */ memcpy(saveinstance, instance, sizeof(instance)); memcpy(saveobj, obj, sizeof(obj)); for (y = 2; y < game.numrows-2; ++y) for (x = 2; x < game.numcols-2; ++x) if (obj[y][x]) { int i; i = obj[y][x] - instance; saveobj[y][x] = saveinstance + i; } } static void update_state(void) { int x, y; gamegraphic = 1; for (y = 2; y < game.numrows-2; ++y) for (x = 2; x < game.numcols-2; ++x) { int pica, picb; pica = obj[y][x] ? obj[y][x]->pic : -1; picb = saveobj[y][x] ? saveobj[y][x]->pic : -1; if (pica != picb || map[y][x] != savemap[y][x]) doPaint(x,y, x,y); #if 0 if (pica != picb) { printf("At (%2d,%2d): pics %d and %d differ\n", x, y, pica, picb); } #endif } } #define SAVE save_state(); #define UPDATE update_state(); #else #define SAVE gamegraphic = 0; #define UPDATE { gamegraphic = 1; doPaint(2,2, game.numcols-3,game.numrows-3); } #endif void graphics_control(int on) { switch (on) { case Disable: SAVE; break; case Enable: gamegraphic = 1; break; case EnableAndRedraw: UPDATE; break; } } /* Check if object on square (x,y) has enough power to move in direction dir */ /* If it has, do the move and return 1 or 2 (1 if object moved alone) */ static int do_move(int x, int y, int dir) { struct objects *ip; struct walls *wp; int dx, dy, tx, ty; int dirbits, power; #ifdef SELECTOR_HACK static struct objects *sel_ip = NULL; struct objects *new_sel_ip; int forbidden = 0; int sel_enter = 0, sel_leave = 0; if (obj[y][x]->pic == 7) sel_leave = 1; #endif dx = dxtab[dir]; dy = dytab[dir]; dirbits = 1 << dir; tx = x; ty = y; wp = map[ty][tx]; ip = obj[ty][tx]; /* what moves? */ power = 0; do { if (ip->chr) /* involves object already moved? */ return 0; if (!(ip->movedir & dirbits)) /* object isn't allowed to go this way */ return 0; if (ip->pushdir & dirbits) /* does this one help pushing? */ power += ip->power; power -= ip->weight; if (power < 0) /* does our power suffice? */ return 0; /* it's not enough to check this at the end of the loop */ /* may we leave from here? */ if (!(wp->leave & dirbits)) return 0; /* nope */ #ifdef SELECTOR_HACK if (ip->mask & forbidden) { /* may not be pushed by THIS object */ switch (obj[ty-dy][tx-dx]->pic) { case 0: /* man: */ case 7: /* man in selector */ if (ip->mask == 0x30010) { /* walkable selector */ sel_enter = 1; new_sel_ip = ip; goto move_ok; } } return 0; } forbidden = (ip->mask & 0xffff) << 16; /* for next object */ #endif tx += dx; ty += dy; wp = map[ty][tx]; if (!(wp->enter & dirbits)) return 0; /* may not enter from here */ if (!(wp->mask & ip->mask)) return 0; /* may not enter square anyway */ ip = obj[ty][tx]; /* next object, if any */ } while (ip); move_ok: ; /* yeah, move is OK, do it! */ /* do the move, count blocks moved */ { int n; n = 0; do { ++n; (obj[ty][tx] = obj[ty-dy][tx-dx])->chr = 1; /* mark object 'moved' */ tx -= dx; ty -= dy; } while (tx != x || ty != y); #ifdef SELECTOR_HACK if (sel_leave) { obj[ty][tx] = sel_ip; obj[ty+dy][tx+dx]->pic = 0; /* normal man again */ sel_ip->chr = 1; sel_ip = NULL; } else { obj[ty][tx] = NULL; } if (sel_enter) { sel_ip = new_sel_ip; obj[ty+n*dy][tx+n*dx]->pic = 7; /* man in a box */ } DOPAINT(x, y, x+n*dx, y+n*dy); if (!sel_leave) obj[ty][tx] = &blocked; #else obj[ty][tx] = NULL; DOPAINT(x, y, x+n*dx, y+n*dy); obj[ty][tx] = &blocked; #endif return n; } } static int automoves(void) { int x, y, flag = 0; for (x = game.numcols-3; x>1; --x) for (y = game.numrows-3; y>1; --y) { struct objects *ip; if ((ip = obj[y][x])) { if ((ip->pushdir & 1) && do_move(x, y, 0)) flag = 1; else if ((ip->pushdir & 2) && do_move(x, y, 1)) flag = 1; } } for (x = 2; x < game.numcols-2; ++x) for (y = 2; y < game.numrows-2; ++y) { struct objects *ip; if ((ip = obj[y][x])) { if ((ip->pushdir & 4) && do_move(x, y, 2)) flag = 1; else if ((ip->pushdir & 8) && do_move(x, y, 3)) flag = 1; } } return flag; /* turn if at least one object was moved */ } #define TURN(object, bits) ((((object) << (bits)) & 0x0f) | ((object) >> (4-(bits)))) static void check_effects(void) { /* check moved objects, if they entered effect squares */ /* if so, apply effect */ /* mark objects unmoved and remove the blockers */ int x, y; for (x = 2; x < game.numcols-2; ++x) for (y = 2; y < game.numrows-2; ++y) if (obj[y][x] && obj[y][x]->chr) { struct objects *ip; ip = obj[y][x]; if (ip == &blocked) { obj[y][x] = NULL; /* square is free now */ if (map[y][x]->effect >= 2*E_ONCE) /* square will change now to other type */ map[y][x] = walls + (map[y][x]->effect / E_ONCE) - 2; } else { int effect; ip->chr = '\0'; if ((effect = map[y][x]->effect)) { if (effect > E_ONCE && effect < 2 * E_ONCE) map[y][x] = walls; /* one-time effect only */ effect %= E_ONCE; switch (effect) { case E_TURN_CCW: case E_TURN_180: case E_TURN_CW: /* does a rotation affect the object? */ if ((ip->movedir != 0 && ip->movedir != 0x0f) || (ip->pushdir != 0 && ip->pushdir != 0x0f)) { /* yes, it does. Are there 2 or 4 pictures for this tile? */ if (TURN(ip->movedir, 2) == ip->movedir && TURN(ip->pushdir, 2) == ip->pushdir) /* only two pictures */ ip->pic ^= (effect & 1); else /* four pictures */ ip->pic = (ip->pic & ~3) | ((ip->pic + effect) & 3); ip->movedir = TURN(ip->movedir, effect); ip->pushdir = TURN(ip->pushdir, effect); DOPAINT(x, y, x, y); } break; case E_ADDPOWER: ++ip->power; break; case E_SUBPOWER: if (ip->power) --ip->power; break; case E_TELEPORT: { int xx, yy; /* find a matching teleporter */ for (xx = 2; xx < game.numcols-2; ++xx) for (yy = 2; yy < game.numrows-2; ++yy) if ((xx != x || yy != y) && (!obj[yy][xx] || obj[yy][xx] == &blocked) && map[yy][xx]->effect % E_ONCE == E_TELEPORT) { /* found a matching free teleporter */ obj[yy][xx] = ip; if (map[yy][xx]->effect == E_TELEPORT+E_ONCE) map[yy][xx] = walls; obj[y][x] = NULL; if (gamegraphic) { doPaint(xx,yy,xx,yy); doPaint(x,y,x,y); } goto done; } } /* fall through if just a single teleporter, */ /* or no other teleporter is free: ignore! */ done: break; } } } /* moved object */ } /* any object at all */ } void playermove(int dir) { /* dir is 0..3 */ int result; struct objects *ip; #if 0 { int x, y; for (x = 2; x < game.numcols-2; ++x) for (y = 2; y < game.numrows-2; ++y) if (obj[y][x] && obj[y][x]->chr) { printf("unclean object at (%d,%d) of chr %x\n", x, y, obj[y][x]->chr); obj[y][x]->chr = '\0'; } } #endif (ip = obj[game.y][game.x])->pushdir = 1 << dir; #ifdef SELECTOR_HACK if (ip->pic == 7) /* no one may push from behind */ result = do_move(game.x, game.y, dir); else #endif { int n = 0; /* check if there are blocks behind us that help pushing */ /* stupid compiler, result IS initialized! */ do ++n; while (obj[game.y-n*dytab[dir]][game.x-n*dxtab[dir]]); do --n; while (!(result = do_move(game.x-n*dxtab[dir], game.y-n*dytab[dir], dir)) && n); if (result && result-1 < n) fatal("internal error\n"); } ip->pushdir = 0; /* this must be reset BEFORE check_effects! */ if (result) { int x, y; storemove(result, dir); do { if (gamegraphic) sync_and_wait(); /* add sound here too! */ check_effects(); } while (automoves()); /* player may get pushed around: search him! */ game.x = game.y = 0; for (x = 2; x < game.numcols-2; ++x) for (y = 2; y < game.numrows-2; ++y) if (obj[y][x] == ip) { game.y = y; game.x = x; break; } /* fatal("Ooops, player has vanished!\n"); */ if (finished()) { int update = 0; cmd_ReadHighscores(); /* read the actual values! TODO: lock the highscore file */ if (highscore[game.level] < game.score) { highscore[game.level] = game.score; update = 1; } if (highscore[game.level+100] > game.n_moves) { highscore[game.level+100] = game.n_moves; update |= 2; } if (highscore[game.level+200] > game.n_pushes) { highscore[game.level+200] = game.n_pushes; update |= 4; } if (update) { const char *firstfile = NULL; WriteHighscores(); #if 0 if (highscore[game.level] == game.score) save_game("sol"); /* optimum score */ else if (highscore[game.level+200] == game.n_pushes) save_game("mp"); /* minimal pushes */ else if (highscore[game.level+100] == game.n_moves) save_game("mm"); /* minimal moves */ /* TODO: should remove obsolete files and rename others. That's hard! */ #else /* possibly save multiple files */ if (highscore[game.level] == game.score) save_game(firstfile = "bs"); /* best score */ if (highscore[game.level+200] == game.n_pushes) firstfile ? link_game(firstfile, "mp") : save_game(firstfile = "mp"); /* minimal pushes */ if (highscore[game.level+100] == game.n_moves) firstfile ? link_game(firstfile, "mm") : save_game(firstfile = "mm"); /* minimal moves */ #endif show_message(TXT_NEWHIGH, game.score); return; } /* TODO: release the highscore file lock */ show_message(TXT_YOU_WIN, game.score, highscore[game.level]); return; } /* if (finished()) */ cmd_ShowScore(); } else if (!game.finished) /* hack to avoid complains on excess moves at the end */ show_message(TXT_MOVENOTPOSSIBLE); } xsok-1.02/src/parse.c100644 144 62 16647 5665071060 13165 0ustar mbimathopt/*****************************************************************************/ /* */ /* */ /* Xsok version 1.00 -- module parse.c */ /* */ /* Parsing of the level subset definition files and level files. */ /* Written by Michael Bischoff (mbi@mo.math.nat.tu-bs.de) */ /* November-1994 */ /* see COPYRIGHT.xsok for Copyright details */ /* */ /* */ /*****************************************************************************/ #ifndef _POSIX_SOURCE #define _POSIX_SOURCE #endif #include "xsok.h" #define MAXABBREVS 32 static char abbrevs[MAXABBREVS][4]; static int numabbrevs; int nwalls, nobjects, ninstances; int pushcost, movecost; const char *xsokdir; struct objects objects[MAXOBJECTS]; struct walls walls[MAXWALLS]; /* wall types */ struct game game; struct walls *map[MAXROW][MAXCOL]; struct objects *obj[MAXROW][MAXCOL]; struct objects instance[MAXINSTANCES]; static struct game init = { 1, 1, -1, -1, 0, 0, 0 }; static struct walls the_void = { '\0', 16, 0,0,0,0 }; static struct walls *omap[MAXROW][MAXCOL]; static struct objects *oobj[MAXROW][MAXCOL]; static struct objects oinstance[MAXINSTANCES]; static struct game ogame; /* restore the game state for initial tableau. No graphics update */ void OrgLevel(void) { memcpy(map, omap, sizeof(map)); memcpy(obj, oobj, sizeof(obj)); memcpy(instance, oinstance, sizeof(instance)); ogame.macroStart = game.macroStart; ogame.macroEnd = game.macroEnd; ogame.macro_x = game.macro_x; ogame.macro_y = game.macro_y; ogame.bookmark = game.bookmark; ogame.stored_moves = game.stored_moves; game = ogame; } int maxlevel; char levelcomment[100]; char levelauthor[100]; static int piped; /* open the level database and read, starting at a given line */ static FILE *def_open(const char *firstline) { FILE *fp; char s[MAXXSOKDIRLEN+14]; char shorttype[8]; strcpy(shorttype, game.type); shorttype[7] = '\0'; sprintf(s, "%s/%s.def", xsokdir, shorttype); if (!(fp = fopen(s, "r"))) { if (!(fp = zreadopen(s))) /* uncompress on-the-fly */ fatal("Cannot open definition file for %s\n", game.type); piped = 1; } while (fgets(s, sizeof(s), fp)) if (!strcmp(s, firstline)) return fp; fatal("No matching line found\n"); /* this end is not reached */ return fp; /* but keep the compiler happy (volatile functions are not ANSI) */ } void ParseDefinitionFile(void) { FILE *fp; int mode = 0; char s[MAXXSOKDIRLEN+22]; piped = 0; maxlevel = 99; pushcost = 10; movecost = 1; sprintf(s, "%s/%s/definitions", xsokdir, game.type); if (!(fp = fopen(s, "r"))) fp = def_open(";WALLS\n"); numabbrevs = nwalls = nobjects = 0; while (fgets(s, sizeof(s), fp)) { int len; len = strlen(s); if (len && s[len-1] == '\n') s[--len] = '\0'; if (!strcmp(s, ";WALLS")) { mode = 0; } else if (!strcmp(s, ";OBJECTS")) { mode = 1; } else if (!strncmp(s, ";MAXLEVEL", 9)) { maxlevel = atoi(s+9); if (maxlevel < 1 || maxlevel > 99) maxlevel = 99; } else if (!strncmp(s, ";PUSHCOST", 9)) { pushcost = atoi(s+9); } else if (!strncmp(s, ";MOVECOST", 9)) { movecost = atoi(s+9); } else if (!strncmp(s, ";ATOP ", 6)) { if (numabbrevs == MAXABBREVS) fatal("Too many abbrevs!\n"); strncpy(abbrevs[numabbrevs++], s+6, 3); } else if (!strncmp(s, ";LEVEL", 6)) break; if (!len || *s == ';') continue; /* comment or empty line */ switch (mode) { case 0: { struct walls *wp; if (nwalls == MAXWALLS) fatal("Too many wall types\n"); wp = walls + nwalls++; wp->chr = *s; if (sscanf(s+1, "%x %x %x %x %d", &wp->pic, &wp->enter, &wp->leave, &wp->mask, &wp->effect) != 5) fatal("Bad line for character '%c':\n%s\n", wp->chr, s); } break; case 1: { struct objects *wp; if (nobjects == MAXOBJECTS) fatal("Too many object types\n"); wp = objects + nobjects++; wp->chr = *s; if (sscanf(s+1, "%x %x %x %d %d %x %d", &wp->pic, &wp->movedir, &wp->pushdir, &wp->weight, &wp->power, &wp->mask, &wp->score) != 7) fatal("Bad line for character '%c':\n%s\n", wp->chr, s); } break; default: ; } } if (piped) zreadclose(fp); else fclose(fp); if (!nwalls || !nobjects) fatal("Definition file is empty\n"); } static void dfs(int x, int y) { if (x < 0 || y < 0 || x >= game.numcols || y >= game.numrows) return; if (map[y][x] != walls) return; map[y][x] = &the_void; dfs(x-1, y); dfs(x, y-1); dfs(x+1, y); dfs(x, y+1); } /* read current level of current game.type */ void ParseMapFile(void) { FILE *fp; int x, y; struct objects *ip; char s[MAXXSOKDIRLEN+20]; piped = 0; sprintf(s, "%s/%s/screen.%02d", xsokdir, game.type, game.level); if (!(fp = fopen(s, "r"))) { sprintf(s, ";LEVEL %d\n", game.level); fp = def_open(s); } ninstances = 0; for (x = 0; x < MAXCOL; ++x) for (y = 0; y < MAXROW; ++y) { map[y][x] = walls; obj[y][x] = NULL; } init.level = game.level; init.type = game.type; *levelcomment = '\0'; *levelauthor = '\0'; game = init; ip = instance; for (y = 1; fgets(s, sizeof(s), fp); ++y) { int c, cc; /* parse s to map */ if (*s == ';') { if (!strncmp(s+1, "LEVEL", 5)) break; --y; /* line doesn't count */ if (!strncmp(s+1, "COMMENT ", 8)) { strncpy(levelcomment, s+9, sizeof(levelcomment)-1); levelcomment[sizeof(levelcomment)-1] = '\0'; if (strchr(levelcomment, '\n')) *strchr(levelcomment, '\n') = '\0'; } if (!strncmp(s+1, "AUTHOR ", 7)) { strncpy(levelauthor, s+8, sizeof(levelauthor)-1); levelauthor[sizeof(levelauthor)-1] = '\0'; if (strchr(levelauthor, '\n')) *strchr(levelauthor, '\n') = '\0'; } continue; /* skip this line (extra comment) */ } if (y == MAXROW-1) fatal("Level is too big\n"); for (x = 1; (c=s[x-1]) && c != '\n'; ++x) { struct objects *op; struct walls *wp; int n; if (x == MAXCOL-1) fatal("Level is too wide\n"); if (x > game.numcols) game.numcols = x; /* check, if c is an abbrev */ cc = walls[0].chr; /* make standard floor below (should be space) */ for (n = 0; n < numabbrevs; ++n) if (abbrevs[n][0] == c) { c = abbrevs[n][1]; cc = abbrevs[n][2]; } for (op = objects, n = nobjects; n; --n, ++op) if (op->chr == c) { /* object found */ if (op == objects) { /* player himself */ if (game.x >= 0) fatal("Multiple player positions\n"); game.x = x; game.y = y; } if (ninstances++ == MAXINSTANCES) fatal("Too many objects\n"); *ip = *op; /* copy object */ ip->chr = '\0'; /* mark unmoved object */ obj[y][x] = ip++; c = cc; /* floor type */ break; } for (wp = walls, n = nwalls; n; --n, ++wp) if (wp->chr == c) { /* wall found */ map[y][x] = wp; break; } if (!n) fatal("No wall type found for character '%c'\n", c); } } if (piped) zreadclose(fp); else fclose(fp); game.numrows = y+1; game.numcols += 2; /* change floor to void */ dfs(0, 0); /* save to orglevel for easy restart */ memcpy(omap, map, sizeof(map)); memcpy(oobj, obj, sizeof(obj)); memcpy(oinstance, instance, sizeof(instance)); game.macroStart = -1; /* no macro available */ ogame = game; cmd_ReadHighscores(); lastcmd = NULL; } xsok-1.02/src/X-widget.c100644 144 62 15337 6122571155 13535 0ustar mbimathopt/*****************************************************************************/ /* */ /* */ /* Xsok version 1.00 -- module X-widget.c */ /* */ /* The tableau widget for Xsok. */ /* written by Michael Bischoff (mbi@mo.math.nat.tu-bs.de) */ /* November-1994 */ /* see COPYRIGHT.xsok for Copyright details */ /* */ /* */ /*****************************************************************************/ #include "X-sok.h" #include #include #include "TableauP.h" static XtResource resources[] = { #define offset(field) XtOffsetOf(TableauRec, tableau.field) /* {name, class, type, size, offset, default_type, default_addr}, */ {XtNruleset, XtCRuleset, XtRString, sizeof(String), offset(rules), XtRString, "Sokoban"}, {XtNlevel, XtCLevel, XtRInt, sizeof(int), offset(level), XtRImmediate, (XtPointer)1}, {XtNusername,XtCUsername,XtRString, sizeof(String), offset(username), XtRString, NULL}, {XtNxsokdir, XtCXsokdir, XtRString, sizeof(String), offset(xsokdir), XtRString, XSOKDIR}, {XtNxpmdir, XtCXpmdir, XtRString, sizeof(String), offset(xpmdir), XtRString, NULL}, {XtNsavedir, XtCSavedir, XtRString, sizeof(String), offset(savedir), XtRString, XSOKSAVE }, {XtNmessageFile,XtCMessageFile,XtRString,sizeof(String), offset(messageFile), XtRString, "messages"}, {XtNkeyboardFile,XtCKeyboardFile,XtRString,sizeof(String),offset(keyboardFile),XtRString, "keys"}, #undef offset }; /* actions on the desktop area */ /*ARGSUSED*/ static void TableauKey(Widget w, XEvent *xev, String *s, Cardinal *num) { key_press((XKeyPressedEvent *)xev); } /*ARGSUSED*/ static void TableauBtn_down(Widget w, XEvent *xev, String *s, Cardinal *num) { button_press((XButtonPressedEvent *)xev); } /*ARGSUSED*/ static void TableauBtn_up(Widget w, XEvent *xev, String *s, Cardinal *num) { button_release((XButtonPressedEvent *)xev); } /*ARGSUSED*/ static void Redisplay(Widget w, XEvent *xev, Region region) { redraw_table((XExposeEvent *)xev); } static XtActionsRec actions[] = { /* {name, procedure}, */ { "tableau_k", TableauKey }, { "tableau_d", TableauBtn_down }, { "tableau_u", TableauBtn_up }, }; static char translations[] = "\ : tableau_k() \n\ : tableau_d() \n\ : tableau_u() \n\ "; static Boolean SetValues(Widget current, Widget request, Widget desired, ArgList args, Cardinal *num_args) { return FALSE; } static void Initialize(Widget request, Widget xnew, ArgList args, Cardinal *n); static void Resize(Widget gw); static void Realize(Widget w, XtValueMask *valuemask, XSetWindowAttributes *winattr) { *valuemask |= CWEventMask | CWBackingStore | CWBitGravity; winattr->backing_store = WhenMapped; winattr->bit_gravity = NorthWestGravity; winattr->event_mask = KeyPressMask | ExposureMask | ButtonPressMask | ButtonReleaseMask | StructureNotifyMask | Button3MotionMask; (*(tableauClassRec.core_class.superclass)->core_class.realize)(w, valuemask, winattr); } TableauClassRec tableauClassRec = { { /* core fields */ /* superclass */ (WidgetClass) &widgetClassRec, /* class_name */ "Tableau", /* widget_size */ sizeof(TableauRec), /* class_initialize */ NULL, /* class_part_initialize */ NULL, /* class_inited */ FALSE, /* initialize */ Initialize, /* initialize_hook */ NULL, /* realize */ Realize, /* actions */ actions, /* num_actions */ XtNumber(actions), /* resources */ resources, /* num_resources */ XtNumber(resources), /* xrm_class */ NULLQUARK, /* compress_motion */ TRUE, /* compress_exposure */ TRUE, /* compress_enterleave */ TRUE, /* visible_interest */ FALSE, /* destroy */ NULL, /* resize */ Resize, /* expose */ Redisplay, /* set_values */ SetValues, /* set_values_hook */ NULL, /* set_values_almost */ XtInheritSetValuesAlmost, /* get_values_hook */ NULL, /* accept_focus */ NULL, /* version */ XtVersion, /* callback_private */ NULL, /* tm_table */ translations, /* query_geometry */ XtInheritQueryGeometry, /* display_accelerator */ XtInheritDisplayAccelerator, /* extension */ NULL }, { /* tableau fields */ /* empty */ 0 } }; WidgetClass tableauWidgetClass = (WidgetClass)&tableauClassRec; static Widget toplev = NULL; static void Resize(Widget gw) { TableauWidget w = (TableauWidget) gw; /* printf("Parent wants me to have size %d,%d\n", w->core.width, w->core.height); */ resize_event(w->core.width, w->core.height); /* (*pileWidgetClass->core_class.superclass->core_class.resize)(gw); */ } void AskWidgetForResize(XSize_t x, XSize_t y) { XtWidgetGeometry Geo; XtGeometryResult r; Geo.width = x; Geo.height = y; do { Geo.request_mode = CWWidth | CWHeight; #ifdef LABER printf("resize to %d %d yielded ", Geo.width, Geo.height); #endif r = XtMakeGeometryRequest(toplev, &Geo, &Geo); #ifdef LABER switch (r) { case XtGeometryYes: printf("YES!\n");break; case XtGeometryNo: printf("NO!\n"); break; case XtGeometryAlmost:printf("Almost!\n"); break; case XtGeometryDone: printf("Done!\n"); break; } #endif } while (r == XtGeometryAlmost); } const char *keyfilename; static void Initialize(Widget request, Widget xnew, ArgList args, Cardinal *n) { static int is_inited = 0; TableauWidget new = (TableauWidget)xnew; TableauPart *p = &new->tableau; toplev = xnew; if (is_inited) { fprintf(stderr, "Sorry, currently only one instance of Tableau is allowed\n"); exit(EXIT_FAILURE); } xsokdir = p->xsokdir; savedir = p->savedir; setlangdir(); if (!p->xpmdir) p->xpmdir = p->xsokdir; if (strlen(savedir) > MAXSAVEFILELEN-16 || strlen(xsokdir) > MAXXSOKDIRLEN || strlen(p->xpmdir) > MAXXSOKDIRLEN) { fprintf(stderr, "directory too long\n"); exit(1); } if (strlen(p->keyboardFile) > MAXFILENAMELEN || strlen(p->messageFile) > MAXFILENAMELEN) { fprintf(stderr, "filename too long\n"); exit(1); } keyfilename = p->keyboardFile; read_message_file(p->messageFile); read_keyboard_file(p->keyboardFile); /* assign global data for old Xlib program */ dpy = XtDisplay(new); buildusername(p->username); /* gamegraphic = 1; */ change_rules(p->rules); NewLevel(p->level); init_gfx(p->xpmdir); /* make GCs, read xpm files */ init_layout(); #ifdef LABER printf("Init widget: res %d grap %d\n", new->core.width, graphic.width); #endif if (new->core.width < graphic.width) new->core.width = graphic.width; if (new->core.height < graphic.height) new->core.height = graphic.height; } xsok-1.02/src/Imakefile100644 144 62 13604 6122776563 13517 0ustar mbimathopt# Imakefile for xsok # # **************************************************************************** # customizing: # # 0.) extra warnings for gcc and development #undef EXTRA_WARNINGS # 1.) specify, if you want online help # affected file(s): Xaw-main.c, Xaw-help.c HELP_OPTION = -DONLINE_HELP # 2.) specify, if you want sound (then, SOUNDOBJ should be one module of # X-sound_*.o, else empty) # Note: for X-sound_SUN.o, /dev/audio must have 666 permissions # affected file(s): (several, you should recompile completely) # note: sound isn't too great at the moment, we better leave it off. SOUND_OPTION = # -DSOUND SOUNDOBJ = # X-sound_SUN.o # 3.) there is a function popen() in sys-V / X/OPEN which opens a pipe. # Define -DHAVE_POPEN if you want to use this function for decompressing # level files. Do not define it if you want to use my emulation, which # does only require a standard POSIX.1 system and is faster, since it does # not spawn a shell. # Attention! In both cases, you need a binary of gunzip in your PATH. # affected file(s): xfopen.c PIPE_DEFINE = # -DHAVE_POPEN # 4.) There is a function gethostbyname() in BSD systems, which will extract # the domain of your host from the /etc/hosts database. The definition of the # relevant structure is in the system include file netdb.h. # This file is availaible on Linux, SUN-OS, HP-UX 9. (But it is not # part of the POSIX standard.) # Remove this define, if you do not have this function. # affected file(s): username.c NET_DEFINE = -DBSD_NETKIT # 5.) For the replay option, we need the possibility to sleep for a short # period of time. This can be done by the usleep() function. # Remove this, if you need usleep() emulation code. # affected file(s): X-gfx.c SLEEP_DEFINE = -DHAVE_USLEEP # BINDIR and LIBDIR should be predefined by the templates # BINDIR = /usr/bin/X11 # LIBDIR = /usr/lib/X11 XSOKLIBDIR = /usr/games/lib/xsok APPDEFSDIR = $(LIBDIR) XSOKMANDIR = /usr/man/man6 XSOKDOCDIR = /usr/doc/xsok # This is the name of the save directory, where solved games are stored: # an alternative path would be $(XSOKLIBDIR)/save # The directory XSOKSAVEDIR must have permissions rwx for world, else # xsok must be installed suid, and XSOKDIR must have write permissions for # the owner of xsok XSOKSAVEDIR = /var/games/xsok # paths for installation in user's home-directory. LXSOKBINDIR = $(HOME)/bin LXSOKMANDIR = $(HOME)/xsok LAPPDEFSDIR = $(HOME) # xsok needs to know where the xpm library resides XPMLIB = -L$(USRLIBDIR) -lXpm XPMINCLUDE = -I $(INCDIR) # ***************************************************************************** # I hope you don't need to change anything below this point # ***************************************************************************** #if defined(HPArchitecture) || defined(AIXArchitecture) CC = c89 CCOPTIONS = #else CC = gcc #ifdef EXTRA_WARNINGS CCOPTIONS = -O2 -pipe -ansi -fno-common -Wall -Wshadow -Wpointer-arith \ -Wcast-qual -Wcast-align -Waggregate-return \ -Wstrict-prototypes -Wmissing-prototypes \ -Wnested-externs -Wwrite-strings #else CCOPTIONS = -O2 -pipe -ansi -Wall -fno-common #endif #endif # Xaw interface (the only one currently available) KIT_LIBS = XawClientLibs KIT_OBJS = Xaw-main.o Xaw-help.o DEPLIBS = XawClientDepLibs LOCAL_LIBRARIES = $(XPMLIB) $(KIT_LIBS) VER=1.02 XOBJS = X-events.o X-gfx.o X-widget.o $(SOUNDOBJ) STDOBJS = messages.o commands.o score.o parse.o tools.o move.o \ loadsave.o username.o xfopen.o mousemove.o OBJS = $(STDOBJS) $(XOBJS) $(KIT_OBJS) MYPROG = xsok ALLTARGETS = username combine showscore mergescores $(MYPROG) DEFINES = $(HELP_OPTION) $(SOUND_OPTION) $(XPMINCLUDE) $(NET_DEFINE) \ $(PIPE_DEFINE) -DXSOKDIR=\"$(XSOKLIBDIR)\" -DXSOKSAVE=\"$(XSOKSAVEDIR)\" \ $(SLEEP_DEFINE) # Dependencies: # *.c require version.h xsok.h # X*.c additionally require X-sok.h and Tableau.h # X-widget.c additionally requires TableauP.h LIBCONTS = *.gz *.help keys all:: $(ALLTARGETS) clean:: rm -f $(ALLTARGETS) testname: @echo @echo "The name used for highscores you break is" @./username @echo "If you do not like this, please set the Tableau.username \ resource explicitly." @echo username: username.c $(CC) $(NET_DEFINE) -DTESTING -s -o username username.c combine: combine.c $(CC) -s -o combine combine.c # the install targets require that make has been run in the lib directory install:: $(MYPROGS) (umask 022 && mkdirhier $(XSOKLIBDIR)) # chmod 755 $(XSOKLIBDIR) (umask 022 && mkdirhier $(XSOKSAVEDIR)) chmod 777 $(XSOKSAVEDIR) (cd ../lib; tar cf - $(LIBCONTS) | (cd $(XSOKLIBDIR); tar xf -)) chown -R root $(XSOKLIBDIR) $(XSOKSAVEDIR) chmod -R a+r $(XSOKLIBDIR) (cd ../lib && ../src/mergescores $(XSOKSAVEDIR)/Xsok.score \ $(XSOKSAVEDIR)/Sokoban.score $(XSOKSAVEDIR)/Cyberbox.score) chmod 666 $(XSOKSAVEDIR)/[A-z]*.score (umask 022 && mkdirhier $(XSOKDOCDIR)) if [ -r ../doc/xsok.dvi ]; then cp ../doc/xsok.dvi $(XSOKDOCDIR); fi cp ../doc/cyberbox.doc $(XSOKDOCDIR) cp ../etc/COPYRIGHT* $(XSOKDOCDIR) chmod -R a+r $(XSOKDOCDIR) mkdirhier $(XSOKMANDIR) cp xsok.man $(XSOKMANDIR)/xsok.6x chmod 644 $(XSOKMANDIR)/xsok.6x ComplexProgramTarget($(MYPROG)) InstallAppDefaults(XSok) install.fsstnd: $(MAKE) install mkdirhier /usr/games/bin chmod 755 /usr/games/bin mv $(BINDIR)/xsok /usr/games/bin install.local: $(MYPROGS) mkdirhier $(LXSOKBINDIR) $(LXSOKMANDIR) $(XSOKLIBDIR) $(XSOKSAVEDIR) \ $(LAPPDEFSDIR)/app-defaults chmod 755 $(XSOKLIBDIR) $(LXSOKMANDIR) $(LAPPDEFSDIR)/app-defaults chmod 777 $(XSOKSAVEDIR) cp XSok.ad $(LAPPDEFSDIR)/app-defaults/XSok chmod 755 $(LAPPDEFSDIR)/app-defaults/XSok (cd ../lib; tar cf - $(LIBCONTS) | (cd $(XSOKLIBDIR); tar xf -)) chmod -R a+r $(XSOKLIBDIR) cp xsok $(LXSOKBINDIR) chmod 755 $(LXSOKBINDIR)/xsok cp xsok.man $(LXSOKMANDIR)/xsok.6x chmod 644 $(LXSOKMANDIR)/xsok.6x (cd ../lib && ../src/mergescores $(XSOKSAVEDIR)/Xsok.score \ $(XSOKSAVEDIR)/Sokoban.score $(XSOKSAVEDIR)/Cyberbox.score) chmod 666 $(XSOKSAVEDIR)/[A-z]*.score xsok-1.02/src/Xaw-main.c100644 144 62 27717 6037770724 13543 0ustar mbimathopt/*****************************************************************************/ /* */ /* */ /* Xsok version 1.00 -- module Xaw-main.c */ /* */ /* main function for the Athena Widget interface. */ /* Written by Michael Bischoff (mbi@mo.math.nat.tu-bs.de) */ /* November-1994 */ /* see COPYRIGHT.xsok for Copyright details */ /* */ /* */ /*****************************************************************************/ #include "X-sok.h" #include "Tableau.h" #include "version.h" Widget toplevel; static XtAppContext app_con; static void (*execfunc)(void) = NULL; static Widget messagebox, container, desktop; static Widget dialog, popup, paned; static Window mainwindow; void show_message(const char *str, ...) { if (gamegraphic) { static char last_message[256]; Arg Args; va_list args; va_start(args, str); if (!str) { memset(last_message, ' ', sizeof(last_message)-1); last_message[sizeof(last_message)-1] = '\0'; } else vsprintf(last_message, str, args); XtSetArg(Args, XtNlabel, last_message); XtSetValues(messagebox, &Args, 1); } } void SetTitle(void) { if (XtWindow(toplevel)) { static char windowname[48]; sprintf(windowname, "%s - Level %d", game.type, game.level); /* printf("SetTitle(): toplevel = %p, window = %x\n", toplev, XtWindow(toplevel)); */ XStoreName(dpy, XtWindow(toplevel), windowname); } } void cmd_LeaveSok(void) { play_sound("goodbye"); XtDestroyApplicationContext(app_con); exit(0); } static void perform_command(Widget widget, XtPointer client_data, XtPointer call_data) { (*(void (*)(void))client_data)(); /* any questions? */ } static void popup_confirm(const char *prompt) { Arg args[2]; Position x, y; Dimension xx, yy, wx, wy; XtSetArg(args[0], XtNlabel, prompt); XtSetValues(dialog, args, 1); XtVaGetValues(dialog, XtNwidth, &xx, XtNheight, &yy, NULL); XtVaGetValues(toplevel, XtNwidth, &wx, XtNheight, &wy, NULL); x = (wx - xx)/2; y = (wy - yy)/2; XtTranslateCoords(toplevel, x, y, &x, &y); XtSetArg(args[0], XtNx, x); XtSetArg(args[1], XtNy, y); XtSetValues(popup, args, 2); XtPopup(popup, XtGrabNone); } void cmd_Confirm(void) { if (execfunc) { void (*execfunc2)(void) = execfunc; /* erase it first! */ execfunc = NULL; XtPopdown(popup); (*execfunc2)(); /* finally execute the desired function */ } } void cmd_Cancel(void) { if (execfunc) { execfunc = NULL; XtPopdown(popup); } } /* type converter functions: */ static void mXtAP_Cancel (Widget w, XEvent *xev, String *params, Cardinal *num) { cmd_Cancel(); } static void mXtAP_Confirm(Widget w, XEvent *xev, String *params, Cardinal *num) { cmd_Confirm(); } static void Cancel(Widget widget, XtPointer client_data, XtPointer call_data) { cmd_Cancel(); } static void Ok(Widget widget, XtPointer client_data, XtPointer call_data) { cmd_Confirm(); } void request_confirm(void (*dofunc)(void), const char *prompt) { if (execfunc) return; /* request pending => deny another one */ if (game.finished || !game.n_moves) { (*dofunc)(); /* perform action without confirmation */ return; } execfunc = dofunc; popup_confirm(prompt); } static String fallback_resources[] = { "*beNiceToColormap: false", "*shapeStyle: Rectangle", "*topShadowContrast: 20", "*bottomShadowContrast: 40", "*Scrollbar*background: Grey70", "*Background: grey85", "*Foreground: black", "*resizeToPreferred: True", "*input: True", "*showGrip: off", "*shadowWidth: 2", "*messages.justify: Left", "*upperbox.orientation: XtorientHorizontal", "*lowerbox.orientation: XtorientHorizontal", "*Tableau.backingStore: WhenMapped", "*Tableau.keyboardFile: keys", "*Tableau.messageFile: messages", "*Tableau.background: black", "*Tableau.rules: Sokoban", "*Viewport.allowHoriz: False", /* scrollbar disable! */ "*Viewport.allowVert: False", /* code is buggy! */ "*Viewport.forceBars: False", "*Viewport.useBottom: True", "*Viewport.useRight: True", "*Label.shadowWidth: 0", "*Label.BorderWidth: 2", "*Dialog*Translations: #override \ny: Ok()\nn: Cancel()\n", "XSok*title: XSok", "XSok.prompt.allowShellResize: True", "XSok.prompt.saveUnder: True", "*Dialog*resizable: True", "*Hint.Translations: #override\n:set()\n:HintNotify()unset()\n", "*Sound.state: True", "XSok.help.width: 403", "XSok.help.height: 200", "XSok.help.title: XSok Help Window", "XSok.help.saveUnder: True", "XSok*Close Help.fromHoriz: Topic", "*helptext*string: Please choose a topic.", "*helptext*displayCaret: False", "*helptext*scrollHorizontal: whenNeeded", "*helptext*scrollVertical: whenNeeded", "*helptext*editType: read", NULL, }; static XrmOptionDescRec options[] = { /* tableau resources */ { "-rules", "*Tableau.rules", XrmoptionSepArg, NULL }, { "-level", "*Tableau.level", XrmoptionSepArg, NULL }, { "-username", "*Tableau.username", XrmoptionSepArg, NULL }, { "-xsokdir", "*Tableau.xsokdir", XrmoptionSepArg, NULL }, { "-xpmdir", "*Tableau.xpmdir", XrmoptionSepArg, NULL }, { "-savedir", "*Tableau.savedir", XrmoptionSepArg, NULL }, { "-messageFile", "*Tableau.messageFile", XrmoptionSepArg, NULL }, { "-keyboardFile", "*Tableau.keyboardFile",XrmoptionSepArg, NULL }, /* non-tableau resources */ #ifdef SOUND { "-sound", "*Sound.state", XrmoptionNoArg, (XtPointer)"True" }, { "-nosound", "*Sound.state", XrmoptionNoArg, (XtPointer)"False" }, #endif }; static XtActionsRec moreActions[] = { { "Cancel", mXtAP_Cancel }, { "Ok", mXtAP_Confirm } }; static void process_extra_args(int argc, char *argv[]) { /* check extra args */ if (argc >= 2) { fprintf(stderr, "xsok: invalid argument: %s\n", argv[1]); fprintf(stderr, "usage: xsok [options]\n" "options are all standard X11 toolkit options and\n" "-rules (ruleset) to initially use specified rules\n" "-level (levelnr) to set the startlevel\n" "-username (username) to set individual username for highscores\n" "-xsokdir (dir) to set the game directory\n" "-xpmdir (dir) to set the directory for xpm files\n" "-savedir (dir) to set the directory for saved games\n" "-messageFile (file) to set the message file name\n" "-keyboardFile (file) define the keyboard assignment\n" #ifdef SOUND "-sound sound toggle on\n" "-nosound sound toggle off\n" #endif ); exit(EXIT_FAILURE); } } const char *rulepool[16] = { "Xsok", "Sokoban", "Cyberbox", NULL }; static void selectrules(Widget w, XtPointer number, XtPointer garbage) { const char *s = XtName(w); /* printf("widget %s has been selected\n", s); */ change_rules(s); NewLevel(1); cmd_LevelInfo(); } #ifdef SOUND static Widget sound; int checksound(void) { Boolean retval; Arg args[1]; XtSetArg(args[0], XtNstate, &retval); XtGetValues(sound, args, 1); return retval & 0xff; } #endif static void read_gametypes(void) { char filename[256], s[80]; FILE *fp; sprintf(filename, "%s/gametypes", xsokdir); if ((fp = fopen(filename, "r"))) { int i; for (i = 3; i < 15; ++i) { if (!fgets(s, sizeof(s), fp)) break; if (*s == ';') { --i; continue; } if (strchr(s, '\n')) *strchr(s, '\n') = '\0'; if (strlen(s) > 8) s[8] = '\0'; rulepool[i] = strsav(s); } rulepool[i] = NULL; fclose(fp); } /* else keep default pool */ } int main(int argc, char *argv[]) { Widget buttonpanel; Widget gamebutton, gamemenu, rulesbutton, rulesmenu; int i; struct button { const char *name; void (*func)(void); } *bp; static struct button buttons[] = { { "Undo", cmd_UndoMove }, { "Redo", cmd_RedoMove }, { "Next Level", cmd_NextLevel }, { "Score", cmd_ShowScore }, #ifdef ONLINE_HELP { "Help", popup_help }, #endif { "Save", cmd_SaveGame }, { "Load", cmd_LoadGame } }, mbuttons[] = { { "Drop Bookmark", cmd_DropBookmark }, { "Goto Bookmark", cmd_GotoBookmark }, { "Replay", cmd_ReplayGame }, { "Restart", cmd_RestartGame }, { "Next Level", cmd_NextLevel }, { "Previous Level", cmd_PrevLevel }, { "Quit", rq_LeaveSok } }; /* use the command line arguments concerning the widgets */ switch_uid(1); toplevel = XtAppInitialize(&app_con, "XSok", options, XtNumber(options), &argc, argv, fallback_resources, NULL, 0); switch_uid(0); process_extra_args(argc, argv); XtAppAddActions(app_con, moreActions, XtNumber(moreActions)); /* basic elements */ paned = XtCreateManagedWidget("paned", panedWidgetClass, toplevel, NULL, 0); buttonpanel = XtCreateManagedWidget("buttonpanel", boxWidgetClass, paned, NULL, 0); messagebox = XtCreateManagedWidget("messages", labelWidgetClass, paned, NULL, 0); show_message(TXT_WELCOME, VERSION); graphics_control(Disable); container = XtCreateManagedWidget("container", viewportWidgetClass, paned, NULL, 0); desktop = XtCreateManagedWidget("desktop", tableauWidgetClass, container, NULL, 0); /* XtAddCallback(container, XtNreportCallback, reportfunc, NULL); */ /* create the button panel and its menus */ gamebutton = XtCreateManagedWidget("Game", menuButtonWidgetClass, buttonpanel, NULL, 0); gamemenu = XtCreatePopupShell("gamemenu", simpleMenuWidgetClass, gamebutton, NULL, 0); for (bp = mbuttons, i = 0; i < XtNumber(mbuttons); ++i) { Widget w; w = XtCreateManagedWidget(bp->name, smeBSBObjectClass, gamemenu, NULL, 0); if (bp->func) XtAddCallback(w, XtNcallback, perform_command, bp->func); ++bp; } XtVaSetValues(gamebutton, XtNmenuName, "gamemenu", NULL); /* create Rules button just right of the Game button */ rulesbutton = XtCreateManagedWidget("Level Subset", menuButtonWidgetClass, buttonpanel, NULL, 0); rulesmenu = XtCreatePopupShell("rulesmenu", simpleMenuWidgetClass, rulesbutton, NULL, 0); XtVaSetValues(rulesbutton, XtNmenuName, "rulesmenu", NULL); /* rest of the buttons */ for (bp = buttons, i = 0; i < XtNumber(buttons); ++i) { Widget w; w = XtCreateManagedWidget(bp->name, commandWidgetClass, buttonpanel, NULL, 0); if (bp->func) XtAddCallback(w, XtNcallback, perform_command, bp->func); ++bp; } #ifdef SOUND sound = XtCreateManagedWidget("Sound", toggleWidgetClass, buttonpanel, NULL, 0); #endif /* OK. Now do the pop-up shells */ popup = XtCreatePopupShell("prompt", transientShellWidgetClass, toplevel, NULL, 0); dialog = XtCreateManagedWidget("dialog", dialogWidgetClass, popup, NULL, 0); XawDialogAddButton(dialog, "ok", Ok, (XtPointer)dialog); XawDialogAddButton(dialog, "cancel", Cancel, (XtPointer)dialog); #ifdef ONLINE_HELP create_help(); #endif graphic.width = graphic.height = 0; graphic.autolayout = 1; XtRealizeWidget(toplevel); XSync(dpy, 0); mainwindow = XtWindow(toplevel); XSetIconName(dpy, mainwindow, "xsok"); SetTitle(); table = XtWindow(desktop); read_gametypes(); { const char **rp; for (rp = rulepool; *rp; ++rp) { Widget w; w = XtCreateManagedWidget(*rp, smeBSBObjectClass, rulesmenu, NULL, 0); XtAddCallback(w, XtNcallback, selectrules, NULL); } } graphics_control(Enable); XtRealizeWidget(popup); XtAppMainLoop(app_con); /* does not return */ return 0; /* keep compiler happy */ } void Force_Resize(XSize_t w, XSize_t h) { Arg args[1]; int hh; Dimension hhh = 0; XtSetArg(args[0], XtNheight, &hhh); XtGetValues(paned, args, 1); hh = hhh; /* unsigned short => int */ XtGetValues(container, args, 1); /* printf("rq %d, paned = %d, container = %d\n", h, hh, hhh); */ h += hh - hhh; /* difference between overall size and Viewport size */ XResizeWindow(dpy, mainwindow, w, h); } xsok-1.02/src/messages.c100644 144 62 20020 6122601321 13622 0ustar mbimathopt/*****************************************************************************/ /* */ /* */ /* Xsok version 1.01 -- module messages.c */ /* */ /* Internationalisation and keyboard translation/customisation. */ /* Written by Michael Bischoff (mbi@mo.math.nat.tu-bs.de) */ /* November-1994 */ /* see COPYRIGHT.xsok for Copyright details */ /* */ /* */ /*****************************************************************************/ #ifndef _POSIX_SOURCE #define _POSIX_SOURCE #endif #include "xsok.h" #include void (*lastcmd)(void); int numeric_arg = 0; const char *xsok_messages[] = { "Quit game?", "Another game?", "Restart game?", "Next level?", "Previous level?", "Not possible", "Bookmark set", "You won! (Score %d, Best score: %d)", "OK", "XSok version %s", "Moves: %d, Pushes: %d, Score: %d. Current strength: %d.", "Already at starting position.", "Move undone.", "Redo not possible.", "Move redone.", "Welcome to XSok version %s!", "Saving of game FAILED.", "Loading the game FAILED.", "Could not open file.", "Could not open file.", "Could not write header.", "Could not read header.", "Could not write moves.", "Could not read moves.", "Saving the game succeeded.", "Loading the game succeeded.", "Magic match failed.", "The author of this level is unknown.", "New record for this level!", "Cannot find a savegame file.", "Help on keys", "Help on the %s level subset", "Starting macro recording.", "Recorded macro has %d moves.", "Wrong position for macro replay.", "Proceed to the next unsolved level?", "Least moves: %d, Least pushes: %d, Best score: %d.", "This level is unsolved.", "Cannot link savegame files.", "There is no box.", "There is already a box.", }; void read_message_file(const char *filename) { FILE *fp; int i; char line[256]; if (*filename != '/') { sprintf(line, "%s/%s/%s", xsokdir, langdir, filename); filename = line; } if (!(fp = fopen(filename, "r"))) return; /* Xt philosophy: ignore error */ for (i = 0; i < sizeof(xsok_messages) / sizeof(const char *); ++i) { char *p; again: if (!fgets(line, sizeof(line), fp)) break; /* EOF */ if (*line == '#') goto again; if ((p = strrchr(line, '\n'))) *p = '\0'; if (*line) /* empty lines => keep old text */ xsok_messages[i] = strsav(line); } fclose(fp); } static void cmd_None(void) {} static void replace_binding(struct key_action *p, const char *name) { int i; static struct translator { const char *name; void (*func)(void); } translator[] = { { "None", cmd_None }, { "rq_LeaveSok", rq_LeaveSok }, { "rq_RestartGame", rq_RestartGame }, { "rq_NextLevel", rq_NextLevel }, { "rq_NextUnsolved", rq_NextUnsolved }, { "rq_PrevLevel", rq_PrevLevel }, { "Up", cmd_Up }, { "Left", cmd_Left }, { "Down", cmd_Down }, { "Right", cmd_Right }, { "NextUnsolved", cmd_NextUnsolved }, { "NextLevel", cmd_NextLevel }, { "PrevLevel", cmd_PrevLevel }, { "UndoMove", cmd_UndoMove }, { "RedoMove", cmd_RedoMove }, { "LeaveSok", cmd_LeaveSok }, { "ShowScore", cmd_ShowScore }, { "ShowBestScore", cmd_ShowBestScore }, { "ShowAuthor", cmd_ShowAuthor }, { "RestartGame", cmd_RestartGame }, { "ReplayGame", cmd_ReplayGame }, { "SaveGame", cmd_SaveGame }, { "LoadGame", cmd_LoadGame }, { "ReadScores", cmd_ReadHighscores }, { "ShowVersion", cmd_ShowVersion }, { "ResizeWindow", cmd_Resize }, { "RepeatMove", cmd_Repeat }, { "MouseMove", cmd_MouseMove }, /* requires x, y */ { "MousePush", cmd_MousePush }, /* requires x, y */ { "MouseUndo", cmd_MouseUndo }, { "MouseDrag", cmd_MouseDrag }, { "LevelInfo", cmd_LevelInfo }, { "DropBookmark", cmd_DropBookmark }, { "GotoBookmark", cmd_GotoBookmark }, { "StartMacro", cmd_StartMacro }, { "EndMacro", cmd_EndMacro }, { "PlayMacro", cmd_PlayMacro }, /* { "Debug", cmd_debug }, */ { "Cancel", cmd_Cancel }, { "Confirm", cmd_Confirm } }; for (i = 0; i < sizeof(translator) / sizeof(translator[0]); ++i) if (!strcmp(name, translator[i].name)) { p->action = translator[i].func; return; } fprintf(stderr, "WARNING: no function corresponds to \"%s\"\n", name); p->action = cmd_None; } static struct key_action *global_bindings = NULL; const char *langdir = ""; void add_keybinding(struct key_action **cp, const char *cmd, const char *function) { /* a NULL pointer for cmd is a wildcard */ int done = 0; struct key_action *p; if (!cp) return; /* bindings for unimplemented rulesets */ while (*cp) { p = *cp; if (!cmd || !strcmp(p->string, cmd)) { /* replace this! */ replace_binding(p, function); done = 1; } cp = &(p->next); } if (!done && cmd) { /* didn't find previous command */ /* add a new entry */ p = *cp = malloc_(sizeof(struct key_action)); p->next = NULL; p->string = strsav(cmd); replace_binding(p, function); } } void read_keyboard_file(const char *filename) { FILE *fp; char line[256]; char buff[32], cmd[2]; struct key_action **cp = &global_bindings; cmd[1] = '\0'; /* 1-char commands currently */ if (*filename != '/') { sprintf(line, "%s/%s/%s", xsokdir, langdir, filename); filename = line; } /* printf("reading keyboard file \"%s\"\n", filename); */ if (!(fp = fopen(filename, "r"))) { /* in xsok, the keyboard file is required, not optional */ /* therefore, we issue an error */ fprintf(stderr, "Cannot read keyboard definition file %s\n", filename); if (*langdir) fprintf(stderr, "Hint: Perhaps unsetting LANG or making a symbolic" " link\nfrom %s/%s to %s helps.\n", xsokdir, langdir, xsokdir); exit(1); } while (fgets(line, sizeof(line), fp)) { char *p; if ((p = strrchr(line, '\n'))) *p = '\0'; if (!*line) continue; if (!strncmp(line, "#c", 2)) /* comment */ continue; if (!strncmp(line, "#include ", 9)) { /* include */ read_keyboard_file(line+9); continue; } if (!strncmp(line, "#x", 2) && strlen(line) < 32) { /* hex number */ int c; sscanf(line+2, "%x %s", &c, buff); cmd[0] = c; add_keybinding(cp, cmd, buff); continue; } /* else assume stringcommandname */ if (strlen(line) >= 3 && strlen(line) < 32) { p = line+1; while (*p && *p != '\t' && *p != ' ') ++p; if (*p) { *p = '\0'; while (*++p && (*p == '\t' || *p == ' ')) ; if (*p) { add_keybinding(cp, line, p); continue; } } } fprintf(stderr, "Warning: cannot parse line in keys file:%s\n", line); } fclose(fp); } void key_pressed(char *str) { struct key_action *p; /* search for global binding */ for (p = global_bindings; p; p = p->next) if (!strcmp(p->string, str)) { (*p->action)(); lastcmd = p->action; numeric_arg = 0; return; } /* not found. break up the string to smaller pieces */ if (strlen(str) > 1) { char s[2]; while (*str) { s[0] = *str++; s[1] = '\0'; key_pressed(s); } return; } /* use hardcoded entries. Note: These can be overridden by assigning them "None" before. */ /* process digits */ if (isdigit(str[0])) { if (numeric_arg >= 3267) numeric_arg = 0; numeric_arg = 10 * numeric_arg + (str[0] - '0'); show_message("%d", numeric_arg); return; } switch (str[0]) { case '\b': if (numeric_arg >= 10) { show_message("%d", numeric_arg /= 10); return; } /* else fall through */ case '\033': /* esc */ numeric_arg = 0; show_message(" "); return; case '\014': /* ctrl-L */ case '\022': /* ctrl-R */ refresh_screen(); return; } if (str[0]) { const char *rulechange = "XCS"; const char *rulename[] = { "Xsok", "Cyberbox", "Sokoban" }; const char *s; if ((s = strchr(rulechange, str[0]))) { /* printf("found %s\n", rulename[s-rulechange]); */ change_rules(rulename[s-rulechange]); NewLevel(1); cmd_LevelInfo(); return; } } } xsok-1.02/src/loadsave.c100644 144 62 15453 6046460626 13647 0ustar mbimathopt/*****************************************************************************/ /* */ /* */ /* Xsok version 1.00 -- module loadsave.c */ /* */ /* Functions for highscores and loading/saving games. */ /* Written by Michael Bischoff (mbi@mo.math.nat.tu-bs.de) */ /* November-1994 */ /* see COPYRIGHT.xsok for Copyright details */ /* */ /* */ /*****************************************************************************/ #ifndef _POSIX_SOURCE #define _POSIX_SOURCE #endif #include #include #include #include "xsok.h" #include "version.h" /* code to switch between real and effective user id */ /* we must use the real user id when saving files */ void switch_uid(int to_real) { #ifdef _POSIX_SAVED_IDS static int uid_state = -1; /* -1 = unknown, 1 = real, 0 = effective */ static uid_t real_uid, effective_uid; if (uid_state < 0) { real_uid = getuid(); effective_uid = geteuid(); uid_state = 0; } if (to_real != uid_state && real_uid != effective_uid) { setuid(to_real ? real_uid : effective_uid); uid_state = to_real; } #endif } void setlangdir(void) { const char *s; char p[100]; if ((s = getenv("LANG"))) { sprintf(p, "%s/%s", xsokdir, s); if (!access(p, F_OK)) { /* langdir does exist */ langdir = s; return; } } langdir = ""; } const char *savedir = NULL; #define NARGS 16 /* score, pushes, moves, time */ #define BUFSIZE 256 /* at least length of longest shortname + 1 */ #define MAGIC1 0x741b /* magic of xsok version 1 */ #define MAGICS 0x741c /* magic of xsok version 1 simple file */ #define MAGICH 0x741d /* magic of xsok version 1 highscore file */ static void read_err(const char *msg) { if (gamegraphic) { show_message("%s %s", TXT_LOAD_ERR_BASIC, msg); cmd_LeaveSok(); /* make it better! */ } fprintf(stderr, "%s %s\n", TXT_LOAD_ERR_BASIC, msg); exit(EXIT_FAILURE); } static void portable_to_internal(long *args, unsigned char *p, int num) { do { int j; *args = 0; for (j = 0; j < 4; ++j) *args += (long)p[3-j] << (j << 3); ++args; p += 4; } while (--num); } static void internal_to_portable(unsigned char *p, long *args, int num) { do { int j; memset(p, (*args < 0 ? -1 : 0), 4); for (j = 0; j < 4; ++j) p[3-j] = (unsigned char)(*args >> (j << 3)); ++args; p += 4; } while (--num); } int highscore[300]; void cmd_ReadHighscores(void) { FILE *fp; char filename[MAXSAVEFILELEN]; int i; memset(highscore, 0, sizeof(highscore)); for (i = 100; i < 300; ++i) highscore[i] = 0x7fffffff; sprintf(filename, "%s/%s.score", savedir, game.type); if ((fp = fopen(filename, "rb"))) { long p[300]; unsigned char s[1200]; fread(s, 4, 300, fp); portable_to_internal(p, s, 300); for (i = 0; i < 300; ++i) highscore[i] = p[i]; fclose(fp); } highscore[0] = MAGICH; } void WriteHighscores(void) { FILE *fp; char filename[MAXSAVEFILELEN]; sprintf(filename, "%s/%s.score", savedir, game.type); if ((fp = fopen(filename, "wb"))) { int i; long p[300]; unsigned char s[1200]; for (i = 0; i < 300; ++i) p[i] = highscore[i]; internal_to_portable(s, p, 300); fwrite(s, 4, 300, fp); fclose(fp); } } void load_game(const char *filename) { FILE *fp; long args[NARGS]; int i, remgraphic = gamegraphic; unsigned char p[NARGS * 4]; if (gamegraphic) /* interactive loading */ graphics_control(Disable); OrgLevel(); if (!(fp = fopen(filename, "rb"))) read_err(TXT_LOAD_ERR_OPEN); if (fread(p, 4, 1, fp) != 1) read_err(TXT_LOAD_ERR_HEADER); portable_to_internal(args, p, 1); if (args[0] == MAGICS) { fseek(fp, 0L, SEEK_END); game.stored_moves = ftell(fp) - 4; game.n_moves = game.bookmark = game.stored_moves; game.macroStart = -1; fseek(fp, 4L, SEEK_SET); goto readmoves; } if (args[0] != MAGIC1) read_err(TXT_LOAD_ERR_BADMAGIC); if (fread(p, 4, NARGS-1, fp) != NARGS-1) read_err(TXT_LOAD_ERR_HEADER); portable_to_internal(args+1, p, NARGS-1); game.n_moves = args[3]; if (args[7] == -1) { /* loading a game from the alpha version */ fseek(fp, 32, SEEK_SET); game.stored_moves = args[3]; game.bookmark = game.n_moves; game.macroStart = -1; } else { game.stored_moves = args[7]; game.macroStart = args[8]; game.macroEnd = args[9]; game.macro_x = args[10]; game.macro_y = args[11]; game.bookmark = args[12]; } /* skip game type and level */ fseek(fp, 8L, SEEK_CUR); /* skip user name */ i = getc(fp); fseek(fp, (long)i, SEEK_CUR); readmoves: if (game.stored_moves > numalloc) { numalloc = 256 + (game.stored_moves & ~255); movetab = realloc_(movetab, numalloc); } if (fread(movetab, 1, game.stored_moves, fp) != game.stored_moves) read_err(TXT_LOAD_ERR_MOVES); fclose(fp); { int rem; rem = game.n_moves; game.n_moves = 0; jumpto_movenr(rem); } if (remgraphic) graphics_control(EnableAndRedraw); cmd_ShowScore(); } void save_game(const char *ext) { FILE *fp; char filename[MAXSAVEFILELEN]; long args[NARGS]; int i; unsigned char p[4 * NARGS]; compute_score(); sprintf(filename, "%s/%s.%02d.%s", savedir, game.type, game.level, ext); remove(filename); /* kill any old one first! */ if (!(fp = fopen(filename, "wb"))) { show_message("%s %s", TXT_SAVE_ERR_BASIC, TXT_SAVE_ERR_OPEN); goto werr2; } args[0] = MAGIC1; args[1] = game.score; args[2] = game.n_pushes; args[3] = game.n_moves; args[4] = time(NULL); args[5] = game.finished; args[6] = game.level; args[7] = game.stored_moves; args[8] = game.macroStart; args[9] = game.macroEnd; args[10] = game.macro_x; args[11] = game.macro_y; args[12] = game.bookmark; args[13] = args[14] = args[15] = -1; internal_to_portable(p, args, NARGS); if (fwrite(p, 4, NARGS, fp) != NARGS) { werr3: show_message("%s %s", TXT_SAVE_ERR_BASIC, TXT_SAVE_ERR_HEADER); goto werr; } strncpy(filename, game.type, 8); if (fwrite(filename, 1, 8, fp) != 8) goto werr3; i = strlen(username); putc(i, fp); if (fwrite(username, 1, i, fp) != i) goto werr3; if (fwrite(movetab, 1, game.stored_moves, fp) != game.stored_moves) goto werr3; fclose(fp); show_message(TXT_SAVE_OK); play_sound("ok"); /* found no sound file for this. maybe later */ return; werr: fclose(fp); werr2: play_sound("cannotsave"); } void link_game(const char *old, const char *ext) { char file1[MAXSAVEFILELEN], file2[MAXSAVEFILELEN]; sprintf(file1, "%s/%s.%02d.%s", savedir, game.type, game.level, old); sprintf(file2, "%s/%s.%02d.%s", savedir, game.type, game.level, ext); remove(file2); /* kill any old one first! */ if (link(file1, file2)) show_message(TXT_SAVE_ERR_LINK); } xsok-1.02/src/username.c100644 144 62 4207 6037671344 13644 0ustar mbimathopt/*****************************************************************************/ /* */ /* */ /* Xsok version 1.01 -- module username.c */ /* */ /* Tries to compute a nice user- and hostname (e-mail address). */ /* Written by Michael Bischoff (mbi@mo.math.nat.tu-bs.de) */ /* November-1994 */ /* changed October 1995 */ /* see COPYRIGHT.xsok for Copyright details */ /* */ /* */ /*****************************************************************************/ #ifndef _POSIX_SOURCE #define _POSIX_SOURCE #endif #include #include #include #include #include "xsok.h" #ifdef BSD_NETKIT #include #endif char username[256]; void buildusername(const char *name) { if (name) { if (strlen(name) > 255) { strncpy(username, name, 255); username[256] = '\0'; } else strcpy(username, name); } else { struct passwd *pp; const char *realname, *loginname; char fqdn[256]; struct utsname buf; #ifdef BSD_NETKIT struct hostent *hp; #endif /* getlogin() fails when xsok is called from the fvwm window manager menu (why?) and cuserid() has disappeared in POSIX 1990. We use getuid() now. */ if ((pp = getpwuid(getuid()))) { if (pp->pw_gecos && strchr(pp->pw_gecos, ',')) *strchr(pp->pw_gecos, ',') = '\0'; realname = pp->pw_gecos; loginname = pp->pw_name; } else { /* unable to obtain passwd entry */ realname = NULL; loginname = "unknown"; } if (uname(&buf)) strcpy(buf.nodename, "unknown"); #ifdef BSD_NETKIT if ((hp = gethostbyname(buf.nodename))) strcpy(fqdn, hp->h_name); else #endif sprintf(fqdn, "%s.(unknown)", buf.nodename); if (realname) sprintf(username, "%s (%s@%s)", realname, loginname, fqdn); else sprintf(username, "%s@%s", loginname, fqdn); } } #ifdef TESTING int main(int argc, char *argv[]) { if (argc == 3 && !strcmp(argv[1], "-u")) buildusername(argv[2]); else buildusername(NULL); printf( /* "Automatically generated username is\n" */ "\"%s\"\n", username); return 0; } #endif xsok-1.02/src/Xaw-help.c100644 144 62 6055 5665071060 13510 0ustar mbimathopt/*****************************************************************************/ /* */ /* */ /* Xsok version 1.00 -- module Xaw-help.c */ /* */ /* Online help functions for the Athena Widget interface. */ /* Written by Michael Bischoff (mbi@mo.math.nat.tu-bs.de) */ /* November-1994 */ /* see COPYRIGHT.xsok for Copyright details */ /* */ /* */ /*****************************************************************************/ #ifdef ONLINE_HELP #include "X-sok.h" #include "Tableau.h" #include #include #include #include #include #include #include #include static int help_active = 0; static Widget help, helppaned, helppanel, helptext, helpclose; extern const char *keyfilename; /* from X-widget.c */ static void selecttopic(Widget w, XtPointer number, XtPointer garbage) { char filename[200]; const char *s = XtName(w); Arg Args[2]; int i = atoi(s+4); sprintf(filename, "%s/%s/%s.help", xsokdir, langdir, i ? rulepool[i-1] : keyfilename); XtSetArg(Args[0], XtNstring, filename); XtSetArg(Args[1], XtNtype, XawAsciiFile); XtSetValues(helptext, Args, 2); } void create_help(void) { Widget topicsmenu, topicsbutton, w; Arg Args[1]; help = XtCreatePopupShell("help", transientShellWidgetClass, toplevel, NULL, 0); helppaned = XtCreateManagedWidget("helppaned", panedWidgetClass, help, NULL, ZERO); helppanel = XtCreateManagedWidget("helppanel", boxWidgetClass, helppaned, NULL, ZERO); helptext = XtCreateManagedWidget("helptext", asciiTextWidgetClass, helppaned, NULL, ZERO); XtSetArg(Args[0], XtNmenuName, "topicsmenu"); topicsbutton = XtCreateManagedWidget("Topic", menuButtonWidgetClass, helppanel, Args, 1); topicsmenu = XtCreatePopupShell("topicsmenu", simpleMenuWidgetClass, topicsbutton, NULL, ZERO); helpclose = XtCreateManagedWidget("Close Help", commandWidgetClass, helppanel, NULL, ZERO); XtAddCallback(helpclose, XtNcallback, popdown_help, NULL); XtSetArg(Args[0], XtNlabel, TXT_HELP_KEYS); w = XtCreateManagedWidget("Help0", smeBSBObjectClass, topicsmenu, Args, 1); XtAddCallback(w, XtNcallback, selecttopic, NULL); { const char **rp; for (rp = rulepool; *rp; ++rp) { char n[8], s[40]; sprintf(n, "Help%d", rp-rulepool+1); XtSetArg(Args[0], XtNlabel, s); sprintf(s, TXT_HELP_RULES, *rp); w = XtCreateManagedWidget(n, smeBSBObjectClass, topicsmenu, Args, 1); XtAddCallback(w, XtNcallback, selecttopic, NULL); } } } void popup_help(void) { if (help_active) return; /* request pending => deny another one */ help_active = 1; XtPopup(help, XtGrabNone); } void popdown_help(Widget w, XtPointer a, XtPointer b) { if (!help_active) return; /* request pending => deny another one */ help_active = 0; XtPopdown(help); } #endif xsok-1.02/src/mousemove.c100644 144 62 22442 6123001237 14045 0ustar mbimathopt/*****************************************************************************/ /* */ /* */ /* Xsok version 1.02 -- module mousemove.c */ /* */ /* Computes paths to squares in the distance. */ /* Written by Michael Bischoff (mbi@mo.math.nat.tu-bs.de) */ /* November 1994 ... March 1996 */ /* see COPYRIGHT.xsok for Copyright details */ /* */ /* */ /*****************************************************************************/ #ifndef _POSIX_SOURCE #define _POSIX_SOURCE #endif #include "xsok.h" #include static int before_move; void cmd_MouseUndo(void) { if (lastcmd != cmd_MouseMove && lastcmd != cmd_MousePush && lastcmd != cmd_MouseDrag && lastcmd != cmd_PlayMacro) { cmd_UndoMove(); /* normal undo */ return; } jumpto_movenr(before_move); cmd_ShowScore(); } #define RBSIZE 1024 /* only powers of 2 will work */ #ifndef sgn #define sgn(x) ((x) < 0 ? -1 : 1) #endif static int noeffect(int eff) { switch(eff) { case E_NOTHING: case E_EXIT: case E_DEST: return 1; default: return 0; } } #define STEP(dx,dy,dir) if ( \ (map[y+(dy)][x+(dx)]->mask & 1) && \ noeffect(map[y+(dy)][x+(dx)]->effect) && \ (map[y+(dy)][x+(dx)]->enter & (1 << dir)) && \ (map[y+(dy)][x+(dx)]->leave & (1 << dir)) && \ !obj[y+(dy)][x+(dx)] && \ dist[y+(dy)][x+(dx)] > d) { \ dist[remy[wr] = y+(dy)][remx[wr]= x+(dx)] = d; \ if ((wr = (wr + 1) & (RBSIZE-1)) == rd) break; } /* search from destination to source */ static int backsteps(unsigned dist[MAXROW][MAXCOL], int x1, int y1, int x2, int y2) { int rd = 0, wr = 1, remx[RBSIZE], remy[RBSIZE]; memset(dist, 0xff, sizeof(unsigned)*MAXROW*MAXCOL); if (!(map[y1][x1]->mask & 1)) return -1; remx[0] = x1; remy[0] = y1; dist[y1][x1] = 0; while (rd != wr) { int x, y, d; if (dist[y2][x2] < 30000) return dist[y2][x2]; x = remx[rd]; y = remy[rd]; rd = (rd+1) & (RBSIZE-1); d = 1 + dist[y][x]; STEP(1,0,1); /* dir is reverse since we do backward search */ STEP(0,1,0); STEP(-1,0,3); STEP(0,-1,2); } /* no path is found */ return -1; } static void subcmd_pushto(int dx, int dy) { int i, dir; if (dx) { i = abs(dx); dir = 2 + sgn(dx); } else { i = abs(dy); dir = 1 + sgn(dy); } while (i--) playermove(dir); } void cmd_MousePush(void) { int dx, dy; before_move = game.n_moves; dx = mouse_x - game.x; dy = mouse_y - game.y; if (dx && dy) cmd_MouseMove(); else subcmd_pushto(dx, dy); } static void subcmd_moveto(int xx, int yy) { unsigned dist[MAXROW][MAXCOL]; struct objects *ip = obj[game.y][game.x]; /* case 1: a distance 1 click will move or push */ if (xx == game.x && yy == game.y) return; /* shortcut! */ if (abs(xx - game.x) + abs(yy - game.y) == 1) { if (xx - game.x) if (xx > game.x) playermove(3); else playermove(1); else if (yy > game.y) playermove(2); else playermove(0); return; } /* for greater distance, only use free space. */ obj[game.y][game.x] = NULL; if (backsteps(dist, xx, yy, game.x, game.y) < 0) { obj[game.y][game.x] = ip; show_message(TXT_MOVENOTPOSSIBLE); return; } obj[game.y][game.x] = ip; while (game.y != yy || game.x != xx) { unsigned length; int omove; length = dist[game.y][game.x] - 1; omove = game.n_moves; if (dist[game.y-1][game.x] == length) playermove(0); else if (dist[game.y][game.x-1] == length) playermove(1); else if (dist[game.y+1][game.x] == length) playermove(2); else if (dist[game.y][game.x+1] == length) playermove(3); if (dist[game.y][game.x] > length) break; /* else may cause cycling (with teleporters) */ if (game.n_moves != omove + 1) break; /* precomputed move not possible any more */ } } void cmd_MouseMove(void) { before_move = game.n_moves; subcmd_moveto(mouse_x, mouse_y); } static int dxtab[4] = { 0, -1, 0, 1 }; static int dytab[4] = { -1, 0, 1, 0 }; void cmd_MouseDrag(void) { struct objects *ip = obj[game.y][game.x], *box; unsigned dist[MAXROW][MAXCOL]; int xx, yy, number[MAXROW][MAXCOL], num = 0; before_move = game.n_moves; if (mouse_x == mouse_x0 && mouse_y == mouse_y0) return; /* this is a no-op */ if (!(box = obj[mouse_y0][mouse_x0])) { show_message(TXT_NOBOX); return; } obj[game.y][game.x] = NULL; /* remove player */ if (obj[mouse_y][mouse_x]) { show_message(TXT_ALREADYBOX); obj[game.y][game.x] = ip; /* restore player */ return; } if (backsteps(dist, mouse_x0, mouse_y0, game.x, game.y) < 0) { notposs: obj[game.y][game.x] = ip; show_message(TXT_MOVENOTPOSSIBLE); return; } /* number the possibilities for the box */ num = 1; for (xx = 0; xx < game.numcols; ++xx) for (yy = 0; yy < game.numrows; ++yy) if ((map[yy][xx]->mask & obj[mouse_y0][mouse_x0]->mask) && !obj[yy][xx]) number[yy][xx] = num++; else number[yy][xx] = -1; number[mouse_y0][mouse_x0] = 0; if (number[mouse_y][mouse_x] < 0) goto notposs; { /* allocate array for the possible box states */ int d; struct boxdist { int pushes; int moves; int x, y; /* box position */ int inqueue; int predecessor; } *boxdist; int *states, rd = 0, wr = 0; boxdist = malloc(4 * num * sizeof(struct boxdist)); states = malloc(4 * num * sizeof(int)); for (xx = 0; xx < 4 * num; ++xx) { boxdist[xx].pushes = boxdist[xx].moves = 30000; boxdist[xx].inqueue = 0; } /* initial positions */ for (xx = 0; xx < 4; ++xx) { d = backsteps(dist, mouse_x0+dxtab[xx], mouse_y0+dytab[xx], game.x, game.y); if (d >= 0) { states[wr++] = xx; boxdist[xx].moves = d; boxdist[xx].pushes = 0; boxdist[xx].x = mouse_x0; boxdist[xx].y = mouse_y0; boxdist[xx].inqueue = 1; boxdist[xx].predecessor = -1; } } /* loop */ obj[mouse_y0][mouse_x0] = NULL; /* remove box */ while (rd < wr) { /* get position */ struct boxdist *now; now = boxdist + (yy = states[rd++]); now->inqueue = 2; #ifdef TESTING printf("Scanning square %d: %d,%d, pushes=%d, moves=%d\n", yy, now->x, now->y, now->pushes, now->moves); #endif obj[now->y][now->x] = box; /* player is at x+dxtab[yy & 3], y+dytab[yy & 3] */ for (xx = 0; xx < 4; ++xx) { int newx, newy, newpos; newy = now->y-dytab[xx]; newx = now->x-dxtab[xx]; newpos = number[newy][newx]; if (newpos < 0) continue; newpos = 4 * newpos + xx; /* is index */ if (boxdist[newpos].pushes <= now->pushes) continue; /* fewer pushes with the old path */ /* shift into dir 2^xx */ if (!(map[newy][newx]->mask & box->mask) || !(map[now->y][now->x]->mask & 1) || obj[newy][newx] || obj[now->y+dytab[xx]][now->x+dxtab[xx]]) continue; d = backsteps(dist, now->x+dxtab[xx], now->y+dytab[xx], now->x+dxtab[yy&3], now->y+dytab[yy&3]); if (d < 0) continue; d += now->moves; if (boxdist[newpos].pushes > now->pushes+1 || (boxdist[newpos].pushes == now->pushes+1 && boxdist[newpos].moves > d)) { boxdist[newpos].pushes = now->pushes+1; boxdist[newpos].moves = d; boxdist[newpos].x = newx; boxdist[newpos].y = newy; boxdist[newpos].predecessor = yy; if (!boxdist[newpos].inqueue) { boxdist[newpos].inqueue = 1; states[wr++] = newpos; /* printf(" adding state %d\n", newpos); } else { printf(" improving state %d\n", newpos); */ } assert(boxdist[newpos].inqueue != 2); } } obj[now->y][now->x] = NULL; } obj[mouse_y0][mouse_x0] = box; /* restore box */ free(states); #ifdef TESTING printf("box move from %d,%d to %d,%d requested, %d reachable\n", mouse_x0, mouse_y0, mouse_x, mouse_y, num); for (xx = 0; xx < 4; ++xx) printf("xx = %d: pushes = %5d, moves = %5d\n", xx, boxdist[4*number[mouse_y][mouse_x]+xx].pushes, boxdist[4*number[mouse_y][mouse_x]+xx].moves); #endif /* find best end place */ d = yy = 4*number[mouse_y][mouse_x]; for (xx = 1; xx < 4; ++xx) { if (boxdist[yy+xx].pushes < boxdist[d].pushes || (boxdist[yy+xx].pushes == boxdist[d].pushes && boxdist[yy+xx].moves < boxdist[d].moves)) { d = yy+xx; } } if (boxdist[d].pushes == 30000) { free(boxdist); goto notposs; /* not possible */ } obj[game.y][game.x] = ip; /* restore player */ /* no the move definitely is possible */ /* compute path by predecessor entries */ xx = -1; /* last */ yy = d; /* current */ do { boxdist[yy].inqueue = xx; /* next */ xx = yy; yy = boxdist[yy].predecessor; } while (yy != -1); /* have path. xx is first position to achieve */ /* first move is different (no push, just setup) */ xx = boxdist[xx].inqueue; while (xx != -1) { #ifdef TESTING mouse_x = boxdist[xx].x + 2*dxtab[xx&3]; mouse_y = boxdist[xx].y + 2*dytab[xx&3]; printf("at %d,%d, xx=%d, require moveto %d,%d, pushto %d,%d\n", game.x, game.y, xx, mouse_x, mouse_y, boxdist[xx].x, boxdist[xx].y); #endif subcmd_moveto(boxdist[xx].x + 2*dxtab[xx&3], boxdist[xx].y + 2*dytab[xx&3]); #if 0 mouse_x = boxdist[xx].x + dxtab[xx&3]; mouse_y = boxdist[xx].y + dytab[xx&3]; cmd_MousePush(); #else subcmd_pushto(-dxtab[xx&3],-dytab[xx&3]); #endif xx = boxdist[xx].inqueue; /* next move */ } free(boxdist); } } xsok-1.02/src/X-sound_SUN.c100644 144 62 2164 5665071060 14102 0ustar mbimathopt/*****************************************************************************/ /* */ /* */ /* Xsok version 1.00 -- module X-sound_SUN.c */ /* */ /* SUN audio functions play_sound(). */ /* Written by Michael Bischoff (mbi@mo.math.nat.tu-bs.de) */ /* November-1994 */ /* see COPYRIGHT.xsok for Copyright details */ /* */ /* */ /*****************************************************************************/ #ifdef SOUND #include "X-sok.h" #ifndef AUDIO_DEVICE #define AUDIO_DEVICE "/dev/audio" #endif void play_sound(const char *filename) { static int audio = 1; if (audio && checksound()) { char fullname[200]; FILE *fp, *fsnd; int c; if (!(fsnd = fopen(AUDIO_DEVICE, "wb"))) { audio = 0; return; /* cannot open /dev/audio */ } XSync(dpy, 0); /* text first! */ sprintf(fullname, "%s/audio/%s.au", xsokdir, filename); if (!(fp = fopen(fullname, "rb"))) { fclose(fsnd); return; } /* yeah, copy data */ while ((c = getc(fp)) != EOF) fputc(c, fsnd); fclose(fsnd); fclose(fp); } } #endif xsok-1.02/src/showscore.c100644 144 62 4764 6055646517 14055 0ustar mbimathopt#include #include #include #include #include #define MAGICH 0x741d /* magic of xsok version 1 highscore file */ static void portable_to_internal(long *args, unsigned char *p, int num) { do { int j; *args = 0; for (j = 0; j < 4; ++j) *args += (long)p[3-j] << (j << 3); ++args; p += 4; } while (--num); } int highscore[300]; static void ReadHighscores(const char *levelfile) { FILE *fp; char filename[256], base_name[32], *s; int i; memset(highscore, 0, sizeof(highscore)); for (i = 100; i < 300; ++i) highscore[i] = 0x7fffffff; strcpy(base_name, levelfile); if (!(s = strchr(base_name, '.'))) return; strcpy(s+1, "score"); sprintf(filename, "%s/%s", XSOKSAVE, base_name); if ((fp = fopen(filename, "rb"))) { long p[300]; unsigned char ss[1200]; fread(ss, 4, 300, fp); portable_to_internal(p, ss, 300); for (i = 0; i < 300; ++i) highscore[i] = p[i]; fclose(fp); } highscore[0] = MAGICH; } static int brief = 1; #define NARGS 16 static void checkfile(const char *filename) { FILE *fp; long p[NARGS]; unsigned char s[256]; char type[10], *z; int namelen, level; if (!(fp = fopen(filename, "rb"))) return; fread(s, 4, NARGS, fp); portable_to_internal(p, s, NARGS); if (p[0] != 0x741b) return; fread(type, 1, 8, fp); level = p[6]; type[8] = '\0'; namelen = getc(fp); fread(s, 1, namelen, fp); s[namelen] = '\0'; if (strrchr(filename, '/')) filename = strrchr(filename, '/') + 1; ReadHighscores(filename); z = ctime(&p[4]); if (strchr(z, '\n')) *strchr(z, '\n') = '\0'; if (!brief) { printf("%-14s %-7s Level %2d: Score: %5ld, Pushes: %4ld, Moves: %4ld\n", filename, type, level, p[1], p[2], p[3]); #if 0 if (!p[5]) /* unsolved */ printf("\n"); else #endif printf("saved %s by %s\n", z, s); } else { int c1, c2, c3; c1 = p[5] && highscore[level] == p[1] ? '*' : ' '; c2 = p[5] && highscore[level+200] == p[2] ? '*' : ' '; c3 = p[5] && highscore[level+100] == p[3] ? '*' : ' '; printf("%2d %5ld%c %4ld%c %4ld%c %s\n", level, p[1], c1, p[2], c2, p[3], c3, s); } } int main(int argc, char *argv[]) { int i; if (argc == 1) { fprintf(stderr, "usage: showscore [-b] (savefiles)\n"); exit(1); } i = 1; if (!strcmp(argv[i], "-b")) { brief = 0; ++i; } else printf("Lv Score Pushes Moves Player\n"); for (; i < argc; ++i) checkfile(argv[i]); return 0; } xsok-1.02/src/combine.c100644 144 62 2026 5665071060 13431 0ustar mbimathopt#define _POSIX_SOURCE #include #include #include static int stripcomments = 0; static int copy(FILE *fout, char *s, int i) { FILE *fp; if (!(fp = fopen(s, "r"))) return 0; if (i) fprintf(fout, ";LEVEL %d\n", i); while (fgets(s, 100, fp)) { if (stripcomments) { if (!strncmp(s, "; ", 2)) continue; if (!strcmp(s, ";\n")) continue; } fprintf(fout, "%s", s); } fclose(fp); return 1; } int main(int argc, char *argv[]) { int c, i; for (c = 1; c < argc; ++c) { FILE *fout; char s[100]; if (!strcmp(argv[c], "-s")) { stripcomments = 1; continue; } sprintf(s, "%s.def", argv[c]); if (!(fout = fopen(s, "w"))) { fprintf(stderr, "Cannot open output file %s\n", s); exit(1); } sprintf(s, "%s/definitions", argv[c]); if (!copy(fout, s, 0)) { fprintf(stderr, "No file %s\n", s); exit(1); } for (i = 1; i < 100; ++i) { sprintf(s, "%s/screen.%02d", argv[c], i); if (!copy(fout, s, i)) break; } } return 0; } xsok-1.02/src/version.h100644 144 62 30 6122776727 13453 0ustar mbimathopt#define VERSION "1.02" xsok-1.02/src/mergescores.c100644 144 62 4030 6055646577 14347 0ustar mbimathopt#include #include #include #include int highscore[300]; int newscore[300]; #define MAGICH 0x741d /* magic of xsok version 1 highscore file */ static void portable_to_internal(long *args, unsigned char *p, int num) { do { int j; *args = 0; for (j = 0; j < 4; ++j) *args += (long)p[3-j] << (j << 3); ++args; p += 4; } while (--num); } static void internal_to_portable(unsigned char *p, long *args, int num) { do { int j; memset(p, (*args < 0 ? -1 : 0), 4); for (j = 0; j < 4; ++j) p[3-j] = (unsigned char)(*args >> (j << 3)); ++args; p += 4; } while (--num); } static void ReadHighscores(const char *filename) { FILE *fp; int i; memset(highscore, 0, sizeof(highscore)); for (i = 100; i < 300; ++i) highscore[i] = 0x7fffffff; if ((fp = fopen(filename, "rb"))) { long p[300]; int num; unsigned char s[1200]; num = fread(s, 4, 300, fp); portable_to_internal(p, s, num); for (i = 0; i < num; ++i) highscore[i] = p[i]; fclose(fp); } highscore[0] = MAGICH; } static void WriteHighscores(const char *filename) { FILE *fp; if ((fp = fopen(filename, "wb"))) { int i; long p[300]; unsigned char s[1200]; for (i = 0; i < 300; ++i) p[i] = highscore[i]; internal_to_portable(s, p, 300); fwrite(s, 1, 1200, fp); fclose(fp); } } static void mergescores(const char *filename) { const char *base_name; int i; base_name = strrchr(filename, '/'); if (!base_name) { fprintf(stderr, "need directory components for %s\n", filename); exit(1); } ++base_name; ReadHighscores(filename); memcpy(newscore, highscore, sizeof(highscore)); ReadHighscores(base_name); for (i = 1; i < 100; ++i) if (newscore[i] > highscore[i]) highscore[i] = newscore[i]; for (i = 100; i < 300; ++i) if (newscore[i] < highscore[i]) highscore[i] = newscore[i]; WriteHighscores(filename); } int main(int argc, char *argv[]) { int i; for (i = 1; i < argc; ++i) mergescores(argv[i]); return 0; } xsok-1.02/src/XSok.ad100644 144 62 2521 5665071060 13043 0ustar mbimathoptXSok*beNiceToColormap: false XSok*shapeStyle: Rectangle XSok*topShadowContrast: 20 XSok*bottomShadowContrast: 40 XSok*Scrollbar*background: Gray70 XSok*Background: grey85 XSok*Foreground: black XSok*resizeToPreferred: True XSok*input: True XSok*showGrip: off XSok*shadowWidth: 2 XSok*messages.justify: Left XSok*upperbox.orientation: XtorientHorizontal XSok*lowerbox.orientation: XtorientHorizontal XSok*Tableau.keyboardFile: keys XSok*Tableau.messageFile: messages XSok*Tableau.background: black XSok*Tableau.rules: Sokoban XSok*Viewport.allowHoriz: False XSok*Viewport.allowVert: False XSok*Viewport.useBottom: True XSok*Viewport.useRight: True XSok*Label.shadowWidth: 0 XSok*Label.BorderWidth: 2 XSok*Dialog*Translations: #override \n\ y: Ok()\n\ n: Cancel()\n XSok*title: XSok XSok.prompt.allowShellResize: True XSok.prompt.saveUnder: True XSok*Dialog*resizable: True XSok*Hint.Translations: #override\n\ :set()\n\ :HintNotify()unset()\n XSok*Sound.state: True XSok.help.width: 403 XSok.help.height: 200 XSok.help.title: XSok Help Window XSok.help.saveUnder: True XSok*Close Help.fromHoriz: Topic XSok*helptext*string: Please choose a topic. XSok*helptext*displayCaret: False XSok*helptext*scrollHorizontal: whenNeeded XSok*helptext*scrollVertical: whenNeeded XSok*helptext*editType: read xsok-1.02/src/convertscore.c100644 144 62 1171 5665071060 14531 0ustar mbimathopt#include #include /* convert a savegame file from the alpha version to the beta version */ int main(void) { long len; unsigned char p[64]; unsigned char s[10000]; memset(p, 0xff, sizeof(p)); fread(p, 32, 1, stdin); len = fread(s, 1, 10000, stdin); memcpy(p+28, p+12, 4); /* stored move */ memset(p+20, 0, 8); p[23] = 1; /* assume it's finished */ p[27] = s[7]; /* level */ memcpy(p+48, p+12, 4); /* bookmark where started */ if (s[0] == 'C') s[7] = 'x'; else s[7] = '\0'; fwrite(p, 1, 64, stdout); fwrite(s, 1, len, stdout); return 0; } xsok-1.02/README100644 144 62 3372 5665071060 11747 0ustar mbimathoptHi, Here is a short checklist of what you need to compile and run xsok-1.00. - an ANSI C compiler - a POSIX.1 conforming system (OK, with some patches, you may do without) - GNU gzip / gunzip binaries somewhere in your PATH (same comment) - X11 R5 or R6 (older ones possibly work, but are untested) - the XPM library (libXpm.*), preferably version 3.2g or newer. I used the dll version of Mitch DSouza (mitchum.dsouza@mrc-apu.cam.ac.uk) found in sunsite.unc.edu:/pub/Linux/libs/X/libXpm-3.4c.tar.gz (28-aug-1994) - LaTeX if you want to print the manual. For a standard installation, type 'make', optionally 'make manual', then (as root) 'make install'. Type 'install.fsstnd' if you want to install the binary in /usr/games/bin instead of X11's bin directory (I prefer this). If you want to install xsok locally, i.e. in your home directory, change XSOKDIR and XSOKSAVE to $(HOME)/xsok in src/Imakefile, then type 'make' and 'make install.local'. There is a patch for this in the diffs subdirectory. Apart from Linux, this software has been tested on a HP 9000/720 (HP-UX 9.01), which required commenting out the HAVE_USLEEP and BSD_NETKIT options in src/Imakefile. Diffs for this can be found in the diffs subdirectory. Compiling on a SUN (SUNOS 4.1.3) produced LOTS of warnings due to missing prototypes in the non-ANSI include files, but the binary worked nevertheless. If the installation succeeds, but you get the error message 'Cannot read floor.xpm', you perhaps have an older version of libXpm. Simply gunzip $(XSOKDIR)/*.xpm.gz and be happy again. (This was the case with both the SUN and the HP machine.) Please report bugs to mbi@mo.math.nat.tu-bs.de. Should you create new levels, I would be glad if you could send them to me. Have fun Michael xsok-1.02/diffs/ 40755 144 62 0 5665071060 12060 5ustar mbimathoptxsok-1.02/diffs/diff.local100644 144 62 2256 5665071060 14106 0ustar mbimathopt*** src/Imakefile Thu Nov 24 15:19:07 1994 --- src/Imakefile.local Thu Nov 24 15:50:41 1994 *************** *** 46,52 **** # BINDIR and LIBDIR should be predefined by the templates # BINDIR = /usr/bin/X11 # LIBDIR = /usr/lib/X11 ! XSOKLIBDIR = /usr/games/lib/xsok APPDEFSDIR = $(LIBDIR) XSOKMANDIR = /usr/man/man6 XSOKDOCDIR = /usr/doc --- 46,52 ---- # BINDIR and LIBDIR should be predefined by the templates # BINDIR = /usr/bin/X11 # LIBDIR = /usr/lib/X11 ! XSOKLIBDIR = $(HOME)/xsok APPDEFSDIR = $(LIBDIR) XSOKMANDIR = /usr/man/man6 XSOKDOCDIR = /usr/doc *************** *** 56,62 **** # The directory XSOKSAVEDIR must have permissions rwx for world, else # xsok must be installed suid, and XSOKDIR must have write permissions for # the owner of xsok ! XSOKSAVEDIR = /var/games/xsok # paths for installation in user's home-directory. LXSOKBINDIR = $(HOME)/bin --- 56,62 ---- # The directory XSOKSAVEDIR must have permissions rwx for world, else # xsok must be installed suid, and XSOKDIR must have write permissions for # the owner of xsok ! XSOKSAVEDIR = $(HOME)/xsok # paths for installation in user's home-directory. LXSOKBINDIR = $(HOME)/bin xsok-1.02/diffs/diff.hpux100644 144 62 2157 5665071060 14000 0ustar mbimathopt*** src/Imakefile Thu Nov 24 15:19:07 1994 --- src/Imakefile.hpux Thu Nov 24 15:50:51 1994 *************** *** 35,47 **** # part of the POSIX standard.) # Remove this define, if you do not have this function. # affected file(s): username.c ! NET_DEFINE = -DBSD_NETKIT # 5.) For the replay option, we need the possibility to sleep for a short # period of time. This can be done by the usleep() function. # Remove this, if you need usleep() emulation code. # affected file(s): X-gfx.c ! SLEEP_DEFINE = -DHAVE_USLEEP # BINDIR and LIBDIR should be predefined by the templates # BINDIR = /usr/bin/X11 --- 35,47 ---- # part of the POSIX standard.) # Remove this define, if you do not have this function. # affected file(s): username.c ! NET_DEFINE = #-DBSD_NETKIT # 5.) For the replay option, we need the possibility to sleep for a short # period of time. This can be done by the usleep() function. # Remove this, if you need usleep() emulation code. # affected file(s): X-gfx.c ! SLEEP_DEFINE = #-DHAVE_USLEEP # BINDIR and LIBDIR should be predefined by the templates # BINDIR = /usr/bin/X11 xsok-1.02/etc/ 40755 144 62 0 6151124576 11542 5ustar mbimathoptxsok-1.02/etc/magic100644 144 62 1057 5665071060 12643 0ustar mbimathopt# /etc/magic values for xpat and xsok as of 13-nov-1994 # 1) for low-endian machines (i386) 0 long 0x19740000 xpat save game file 0 long 0x1a740000 xpat2 save game file 0 long 0x1b740000 xsok save game file 0 long 0x1c740000 xsok simple save game file (autosolver) 0 long 0x1d740000 xsok highscore file # 2) for high-endian machines (SUN, HP-RISC) 0 long 0x00007419 xpat save game file 0 long 0x0000741a xpat2 save game file 0 long 0x0000741b xsok save game file 0 long 0x0000741c xsok simple save game file (autosolver) 0 long 0x0000741d xsok highscore file xsok-1.02/etc/COPYRIGHT.GNU100644 144 62 35433 5665071060 13610 0ustar mbimathopt GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 675 Mass Ave, Cambridge, MA 02139, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS xsok-1.02/etc/COPYRIGHT.xsok100644 144 62 1345 5665071060 14116 0ustar mbimathopt/* This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. (The file COPYRIGHT.GNU) You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ xsok-1.02/etc/xsok.lsm100644 144 62 1055 6151124070 13326 0ustar mbimathoptBegin3 Title: xsok Version: 1.02 Entered-date: 23MAY96 Description: Strategy game for X11, implementation of Sokoban, Cyberbox. Keywords: Sokoban, Cyberbox, puzzle Author: mbi@mo.math.nat.tu-bs.de (Michael Bischoff) Maintained-by: mbi@mo.math.nat.tu-bs.de (Michael Bischoff) Primary-site: sunsite.unc.edu: /pub/Linux/games/x11/strategy 117kB xsok-1.02-src.tar.gz 58kB xsok-1.02-dllbin.tar.gz (X11R5) 64kB xsok-1.02-elfbin.tar.gz (X11R6) Platform: X11, Athena Widgets, Xpm library Copying-policy: GPL2 End xsok-1.02/etc/COPYRIGHT.xpm100644 144 62 3253 5665071060 13736 0ustar mbimathopt/* * Copyright (C) 1989-94 GROUPE BULL * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * GROUPE BULL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Except as contained in this notice, the name of GROUPE BULL shall not be * used in advertising or otherwise to promote the sale, use or other dealings * in this Software without prior written authorization from GROUPE BULL. */ Arnaud LE HORS BULL Research FRANCE -- Koala Project (XPM - X PixMap format version 2 & 3) Internet: lehors@sophia.inria.fr Surface Mail: Arnaud LE HORS, INRIA - Sophia Antipolis, 2004, route des Lucioles, 06565 Valbonne Cedex -- FRANCE Voice phone: (33) 93.65.77.71, Fax: (33) 93 65 77 66, Telex: 97 00 50 F xsok-1.02/etc/Changelog100644 144 62 333 6151123774 13427 0ustar mbimathoptChanges from version 1.01 to version 1.02: - the middle mouse button now acts in a more smart fashion: With this button, you may move the box on a non-linear path with a single click! See the man-page for details. xsok-1.02/doc/ 40755 144 62 0 6123003304 11514 5ustar mbimathoptxsok-1.02/doc/Makefile100644 144 62 246 5665071060 13251 0ustar mbimathoptall: xsok.ps xsok.ps: xsok.dvi dvips -f < xsok.dvi > xsok.ps xsok.dvi: xsok.tex latex xsok latex xsok latex xsok clean: rm -f *~ *.log *.aux *.toc *.dvi *.ps xsok-1.02/doc/xsok.tex100644 144 62 45171 6123003063 13351 0ustar mbimathopt\documentstyle[12pt]{article} \newcommand{\xsok}{{\tt xsok}} \title{\xsok\ Version 1.02 Manual} \author{Michael Bischoff} \date{16-Mar-1996} \begin{document} \maketitle \tableofcontents \newpage \section{Introduction} \subsection{WARNING} Be warned. This manual is under construction. It may currently contain a lot of typos, bad English, bad style, and it's unfinished. The information herein should be correct, however. \subsection{\xsok\ --- A Generic Sokoban Game for X11} Similar to Tetris, almost every operating system has an implementation of the Sokoban game. It baffles by its easy rules, but nevertheless complex strategies. For Linux, I found a textmode implementation and an X11-based version, both written 1992. The X11 version seemed to be based on the textmode version, and both use the same format for the level definition files. \xsok\ is a generalization of the standard Sokoban game. All original Sokoban levels may be played with \xsok\ (again, using the same format for the level definition files). Some levels of a similar MSDOS game, Cyberbox, may be played also. \xsok\ is a one-person game played on a square-tiled board. It has no random elements, and is a pure strategic game. There are different floor types and walls, and objects standing on the floor. The objective is to push certain objects onto marked target squares, and to move onto the EXIT square, if one exists. The objects on the floor, which we will refer to as boxes, have certain attributes, such as weight, value, possible directions of movement, and own power. A special kind of object is the player itself. He has a certain power, which represents the maximal sum of the weights of the boxes he can push in a single move. The default power is one hundred, and equals the weight of a standard box. There are lighter (empty) boxes of weight one, which simply block your way, especially since some of them may be moved either only horizontally or only vertically. Some boxes even show interest in moving themselves into a certain direction, and may even push standard boxes! (I have no explanation for this phenomenon!) Luckily, most boxes are marked with arrows and color, so that you may distinguish them. As well as the boxes, even the floor squares may have attributes. In Sokoban, the only floor attribute was the distinction between normal floor and target spaces. In \xsok, there may be different target spaces, for different box types. Some squares may be passed in only one direction, or restrict the box types which may be moved upon them. There are floor types which turn boxes, by 90 or 180 degrees. Some squares may give you power cookies, others let you suffer from weakness. To manage this zoo, all possible levels are partioned into level sets, which share a common subset of the possible square types. A level set definition file assigns the attributes to characters. The definition table for the floor types must follow a line with the contents ``{\tt ;WALLS}'' in the level subset definition file. For a floor type, there are the following attributes. \begin{center} \begin{tabular}{|l|l|p{8cm}|} \hline field & format & description\\ \hline char & ascii & character, by which this floor type is identified in the level file\\ pic & hex & offset into the graphic data file\\ enter & hex & one bit set for every direction from which any object may enter this square\\ leave & hex & one bit set for every direction to which any object may leave this square\\ mask & hex & one bit set for every object class which is allowed on this square\\ effect & dec & identifies a special effect (rotation, target, exit)\\ \hline \end{tabular} \end{center} The format determines how the entry is interpreted: as ASCII character, as hexadecimal number, or as decimal number. You may not use the ';' sign as ASCII representation of an object or a floor type, since it introduces comments and commands. Picture id 0 is reserved for the standard walls: There are 16 different tiles, from which one is selected depending on the 4 neighbour squares. The effect field has the following meaning. \begin{center} \begin{tabular}{|r|l|} \hline effect mod 100 & description\\ \hline 0 & no effect \\ 1 & rotate counterclockwise by 90 degrees\\ 2 & rotate by 180 degrees\\ 3 & rotate clockwise by 90 degrees\\ 4 & this is a target square for boxes\\ 5 & this is the exit square\\ 6 & increase power by 1\\ 7 & decrease power by 1\\ 8 & teleport\\ \hline \end{tabular} \end{center} If the effect field is less than 100, the effect will affect every object once it enters the square. If the effect is at least 100, but less than 200, the effect will affect the first object which enters the square, and then the square will be substituted by a standard floor square. The standard floor square is the floor type which occurs first in the table. If the effect field is at least 200, the square will change to floor type (effect-200) / 100 once it is free again. A teleporter will teleport any object on it to the first free teleporter available, or do nothing, if all other teleporters are occupied. The definition table for the object types must follow a line with the contents ``{\tt ;OBJECTS}'' in the level subset definition file, and must be behind the floor definition array. For an object, there are the following attributes. \begin{center} \begin{tabular}{|l|l|p{8cm}|} \hline field & format & description\\ \hline char & ascii & character, by which this floor type is identified in the level file\\ pic & hex & offset into the graphic data file\\ movedir & hex & one bit set for every direction in which this object may move\\ pushdir & hex & one bit set for every direction in which this object will move automatically\\ weight & dec & the weight of this object\\ power & dec & the power which the object has for moving\\ mask & hex & defines the object class (multiple classes are possible)\\ score & hex & the bonus you receive if this object is on a target square\\ \hline \end{tabular} \end{center} The object which represents the man is the first object in the table. Its {\tt mask} entry must be 1, since this is hardcoded into the program. The {\tt mask} entry should only use bits 0 to 15. The higher bits are needed for the {\tt Cyberbox} selectors, their coding is subject to change. \section{Adding New Level Subsets} If you want to create new level subsets, create a text file {\tt gametypes} in the directory {\tt /usr/games/lib/xsok}, where every line of this file represents the name of a new level subset. Suppose you want to create the subset {\tt Foo}. Create a description in the file {\tt /usr/games/lib/xsok/Foo.help}. Create a subdirectory {\tt /usr/games/lib/xsok/Foo}, and put in a file {\tt definitions} and the files {\tt screen.??} for the levels. For examples, see the subdirectories of the {\tt lib} directory in the source distribution. Edit the level files until you are satisfied. Then, you may concatenate all the files in the {\tt /usr/games/lib/xsok/Foo} directory using the {\tt combine} program, and create the more compact file {\tt /usr/games/lib/xsok/Foo.def.gz}. The level file simply is an ASCII representation of the floor types and objects. The floor below an object is by default the first floor type which occurs in the {\tt definitions} file. If you need another combination (for example a box already on a target square), you have to dedicate a new character for this combination, and add an {\tt ATOP} command in the {\tt definitions} file. In Sokoban, a box is represented by a dollar sign and a target square by a dot. For a box on a target square, a star is used. The defining line in the Sokoban definitions file is ``{\tt ;ATOP *\$.}''. The possible commands for the level files are the following. \begin{center} \begin{tabular}{|l|l|} \hline command & description\\ \hline {\tt ;AUTHOR} {\em string} & the author of the level\\ {\tt ;COMMENT} {\em string} & a level comment or hint\\ \hline \end{tabular} \end{center} The possible commands for the definition files are the following. They occur after the floor and object definition tables. \begin{center} \begin{tabular}{|l|r|l|} \hline command & default & description\\ \hline {\tt ;MAXLEVEL} {\em no} & 99 & the maximal level number\\ {\tt ;PUSHCOST} {\em no} & 10 & score reduction for every push\\ {\tt ;MOVECOST} {\em no} & 1 & score reduction for every move\\ {\tt ;ATOP} {\em cof} & -- & defines object/floor combinations\\ \hline \end{tabular} \end{center} \section{Keyboard and Mouse Commands} In \xsok, keyboard and mouse commands are bound to functions using an ASCII key definition file. There are two classes of bindings: Built-in assignments have the least priority. Only the following commands are built-in: \begin{center} \begin{tabular}{|c|l|} \hline key & action \\ \hline {\tt Ctrl-L}& redraw the window\\ {\tt Ctrl-R}& redraw the window\\ {\tt } & abort a move\\ ``{\tt C}'' & switch to Cyberbox levels\\ ``{\tt S}'' & switch to Sokoban levels\\ ``{\tt X}'' & switch to Xsok levels\\ \hline \end{tabular} \end{center} These bindings can be extended or overridden by the loadable keyboard table, which may be different for every national language. The default file resides in {\tt /usr/games/lib/xsok/keys}. With this file, you may define one key or mouse button per line. The format is <{\em specifier\/}> {\em \/}. A specifier is a single character, or the string {\tt \#x}, followed by the hex representation of the key, one of the strings {\tt Up}, {\tt Left}, {\tt Down}, or {\tt Right} (which correspond to the arrow keys of your keyboard), or the string {\tt Mouse}$n$, where $n$ is a digit from 1 to 5. It is currently not possible to assign commands to the function keys. The possible command names and their meaning are\\ {\tt None} Do nothing if this key is pressed. Only used to remove built-in bindings.\\ {\tt rq\_LeaveSok} Popup a window and ask whether to leave the game. If you are at the beginning of a level, or finished the game, no confirmation is requested.\\ {\tt rq\_NextLevel} Request to proceed to the next level.\\ {\tt rq\_PrevLevel} Request to go back to the previous level.\\ {\tt rq\_RestartGame} Request to restart the game. Not really needed, since restarting may be undone.\\ {\tt Up}, {\tt Left}, {\tt Down}, {\tt Right} Move the man one square in the specified direction.\\ {\tt NextUnsolved} Proceed to the next unsolved level.\\ {\tt NextLevel} Proceed to the next level.\\ {\tt PrevLevel} Go back to the previous level.\\ {\tt UndoMove} Undo an elementary move, or the restart command. You may undo all moves back until the start. Undoing moves may be slow, however.\\ {\tt RedoMove} Redo a previously undone move.\\ {\tt LeaveSok} Unconditionally quit the game.\\ {\tt ShowScore} Show your current score, and other information. This is automatically done after every succesful move.\\ {\tt ShowBestScore} Show the largest score, minimum number of moves, and minimum number of pushes known for solving this level.\\ {\tt ShowAuthor} Show the name of the author of the current level, as given by the {\tt ;AUTHOR} directive in the level file.\\ {\tt RestartGame} Go back to the starting position.\\ {\tt ReplayGame} Replay the game at about 14 moves per second.\\ {\tt SaveGame} Store the current position in the file\\{\tt /var/games/xsok/{\it Levelset.level\/}.sav}.\\ {\tt LoadGame} Restore a previously saved game. If none exists, restore a solution file {\tt /var/games/xsok/{\it Levelset.level\/}.sol}.\\ {\tt ReadScores} Re-read the highscore table. (It may have been modified by some other player on your machine.) Highscorefiles are reloaded automatically at the beginning of every level, and when you finish a level.\\ {\tt ShowVersion} Will display the current \xsok\ version. {\tt ResizeWindow} Obsolete. Is called automatically, if the level size changes.\\ {\tt RepeatMove} Repeat a move in the previous direction. (In {\tt xsokoban}, this one is assigned to the middle mouse button.)\\ {\tt MouseMove} If pressed on a clear square, the man will move to that location via the optimal path if such a path exists. If pressed on an object that is adjacent to the player, the object will be pushed.\\ Since coordinates are needed, {\bf this function should only be bound to a mouse button}.\\ {\tt MousePush} If you click onto a square with same $x$ or $y$ coordinate as the man, the man will walk straight to this square, possibly pushing any boxes on the path. This is useful for pushing a box multiple squares along a straight path. Since coordinates are needed, {\bf this function should only be bound to a mouse button}.\\ {\tt MouseDrag} This command requires that you press the mouse button on a location where a box resides, drag the mouse, and release the button on an empty square. The man will then move the box from the first square onto the second with the minimal number of pushes, if it is possible at all. Please note that the man will not move any other object and will only use squares without effects. This function may not work when other active components are on the board (pushing boxes etc.).\\ Since coordinates are needed, {\bf this function should only be bound to a mouse button}.\\ {\tt MouseUndo} Undoes one of the previous two compound move operations, or a {\tt PlayMacro} operation. Currently, this is allowed only immediately following the operation to be undone, and only a single compound move may be undone. If this situation does not apply, the command will execute an elementary undo operation.\\ {\tt LevelInfo} Show the level comment, as defined by the {\tt ;COMMENT} directive in the level file. Shows the highscore for this level, if no comment is available.\\ {\tt DropBookmark} Drop the bookmark at the current move number. In some cases, a bookmark is dropped automatically. After a load game operation, the bookmark is set at the end position. If a bookmark becomes invalid, since you undid moves and continued with new ones, the bookmark will be reset to the last common move number.\\ {\tt GotoBookmark} Go to the bookmark.\\ {\tt StartMacro} Start recording a move macro. A move macro is a sequence of moves, which may be re-executed by a single command, if the starting position does match. This is useful for some {\bf Sokoban} levels, which tedious repetition of long sequences.\\ {\tt EndMacro} Define the end of a move macro.\\ {\tt PlayMacro} Reexecute the move macro, i.e. move the man to the starting position of the macro by the {\tt MouseMove} command, then repeat the recorded moves. If the path is blocked, macro replaying stops at that point.\\ {\tt Cancel} Cancel a confirmation.\\ {\tt Confirm} Confirm a confirmation.\\ The default assignment is \begin{center} \begin{tabular}{|c|l|} \hline key & action\\ \hline ``{\tt y}'' & confirm action\\ ``{\tt n}'' & abort action\\ ``{\tt q}'' & quit game (confirmation requested)\\ ``{\tt v}'' & show version number of \xsok\\ ``{\tt a}'' & show author of a level (if known)\\ ``{\tt b}'' & show best scores for this level.\\ ``{\tt i}'' & show witty quote for a level (level comment)\\ ``{\tt u}'' & undo a move\\ ``{\tt r}'' & redo a move\\ ``{\tt ?}'' & show your current score\\ ``{\tt s}'' & save the game\\ ``{\tt L}'' & load a game\\ ``{\tt c}'' & drop the bookmark\\ ``{\tt ctrl-U}'' & goto bookmark\\ ``{\tt R}'' & restart this level\\ ``{\tt N}'' & go to next level\\ ``{\tt P}'' & go to previous level\\ ``{\tt U}'' & go to the next unsolved level\\ ``{\tt W}'' & resize the window\\ \hline \end{tabular} \end{center} \section{Bells, Whistles, and Doodads} %Miscellaneous \subsection{Internationalisation} The Athena widget set allows the redefinition of button labels by resource files. All other texts have also been made reconfigurable. The X-window system uses the contents of the {\tt LANG} environment variable to select the path for the resource file (application defaults file). Currently, the code is there, but there are no example translations. If {\tt xsok} doesn't work, run it with your {\tt LANG} environment variable set to the empty string. \subsection{Saving Games} You can save the current state of the game by pressing the left mouse button on the ``save game'' button. \xsok\ will try to create a file in the directory {\tt /var/games/xsok} with its name consisting of the name of the level subset, the level number, and the extension {\tt .sv}. If you solve a level and break the highscore, the game is saved automatically. There are three different file extensions: {\tt .bs} for {\em best score\/}, {\tt .mp} for {\em minimal number of pushes\/}, and {\tt .mm} for {\em minimal\/} number of moves. If some of them are identical, links will be used to save disk space. \subsection{Format of a Highscore File} A highscore file is organized as array of 300 4-byte integers. The representation is machine-independent, using high-byte-first ordering. This allows exchanging files between workstations and PCs. The first entry holds the magic, 0x741d. Entries 1 to 99 hold the best known score for the respective level. Entry $n + 100$ holds the minimal known number of moves to solve it, and entry $n + 200$ the minimal known number of pushes. Entries 100 and 200 are unused and have value 0x7fffffff. \subsection{Format of a Savegame File} A savegame file starts with a header of 16 4-byte integers in machine-independent representation. The entries are as following. \begin{center} \begin{tabular}{|r|l|} \hline Entry & Description\\ \hline 0 & Magic number, 0x741c\\ 1 & score \\ 2 & number of pushes\\ 3 & current move number\\ 4 & time saved\\ 5 & 1 if level finished, 0 else\\ 6 & level number\\ 7 & number of stored moves\\ 8 & move macro start \\ 9 & move macro end \\ 10 & move macro $x$ \\ 11 & move macro $y$ \\ 12 & position of bookmark \\ 13 & -1\\ 14 & -1\\ 15 & -1\\ \hline \end{tabular} \end{center} After this array, an array of 8 characters, representing the level subset name, is stored. The level and level subset information is currently not checked at load time, this may be done later. After the level subset name, a one-byte charcter count is given, and the username of the player, as string of the given length. The terminating zero byte is not stored. Finally, the array of moves is appended, whose length is given by entry 7 of the header. \subsection{Taking Back Moves} \xsok\ logs every move. This gives you the possibility of unlimited undo. Undoing is done by restarting the level and replaying it. Therefore, undo may be really slow after some hundred moves. For Sokoban rules, a better undo would be possible, but for the general case, a move may involve complicated actions. \end{document}xsok-1.02/doc/cyberbox.doc100644 144 62 17525 5055263252 14164 0ustar mbimathopt C y b e r B o x .... A puzzle game for MS-DOS systems with VGA display ------------------------------------------------------------------------ by Doug Beeferman. August 1991. See end of file for distribution info. O V E R V I E W CyberBox is a game of thinking ahead. Given the simple challenge of getting from one point to another, you will find yourself anticipating the effects of every move you make in between. There are 16 levels ("rooms") for you to solve. The object of the game is to solve each room in the minimum number of moves, so as to attain the highest possible score. S T A R T I N G C Y B E R B O X To run CyberBox from the MS-DOS command line, switch to the directory that contains the file CYBERBOX.EXE and type "CYBERBOX". If your display is monochrome, type "CYBERBOX /m" instead. The "/m" switch forces two-color output and will, of course, work on a color display. Regardless of whether you use the "/m" switch, your machine must have a VGA adaptor capable of 640x480 display in order for CyberBox to run. EGAVGA.BGI must be in the directory from which Cyberbox is executed. P L A Y I N G T H E G A M E CyberBox consists of sixteen (actually I lied; seventeen) unique "rooms." Each room is simply a 15x10 layout of boxes and blank spaces. There are several different kinds of boxes; the title screen which you see when you run the program briefly explains the function of each kind of box. Press any key at the title screen to enter the first room. The robot which you're in control of appears at the bottom center of the screen. Ok, so it looks more like a small circle. It is a small circle. This circle can only make four distinct moves: up, down, left, and right. Make these moves by pressing the arrow keys (or 2,4,6, and 8 on the numeric keypad) in the desired direction. The object of each room is simply to get to the exit. The exit is the passageway located above the very top center tile. Once you reach the exit of a room, you immediately enter the next room. Invariably, you will have to maneuver boxes in such a way that you: 1. avoid trapping yourself, 2. avoid losing access to the exit, and 3. do what is necessary to make the exit accessible. Every room has at least one solution. However, it's easy for the actions of your robot to make winning the room an impossibility. If you trap yourself or lose access to the exit, you have no choice but to hit the "R" key to retry the level from the beginning. The computer will not tell you when you are trapped: this drawback is not only a hard thing to correct in the program, but it adds challenge to the game. When you discover that you cannot possibly get to the exit passageway during a level, hitting "R" will give you another shot. Be careful, though. You only have 5 attempts. The number of remaining attempts is displayed at the top of the screen. Experiment with the sliders and blockers in the first level to get a feel for the game. The boxes are described in detail below: SLIDERS: Sliders appear as boxes with arrowheads pointing in various directions. These boxes can be pushed out of the way by your robot if there's nothing preventing this from happening. There are three kinds of sliders: up/down sliders (yellow), left/right sliders (blue), and up/down/left/right sliders (green). BLOCKERS: Blockers appear as red X'd out boxes. These can not be pushed, and furthermore nothing can be pushed into them. The walls which surround the 15x10 room (except at the exit) act like blockers. PUSHERS: Pushers appear as cyan boxes with inscribed triangles. These boxes make the game more dynamic; they are the only boxes which can move themselves. They exert a constant force in the direction that they point. If it is possible to push the block to which a pusher points, it will do so. Otherwise, it will act like a blocker in that it cannot be moved nor pushed against by other blocks. Sound confusing? Pushers do not appear in the first few rooms. Once you've encountered them you'll understand how they work. ZAPPERS: Zappers appear as purple boxes with inscribed triangles with inscribed circles. These boxes act as blockers, except that when you approach them from behind (the base of the inscribed triangle) and push, you will be transported instantly to the square in front of the zapper IF IT IS EMPTY. These do not appear in the earlier rooms. SELECTORS: These are perhaps the most confusing boxes, but they're not that bad. They appear in the later levels as white frames. Selectors cannot be pushed by your robot, but CAN be pushed by other blocks. In order to move them, then, you will have to use sliders. Normal selectors can be walked through by your robot as if they were blank spaces, but others (X'd out white frames) cannot be walked through and act like blockers in this sense. You can move more than one box at a time only if every box in that series of boxes can be legally moved. Experiment. You'll get the idea. I hope. The following additional rules apply: 1. Boxes cannot be pushed into the exit passage. It's too small, see? 2. Only you (the robot) can be transported via the zappers, not other boxes. Similarly, only tokens can go through normal selector boxes. And remember, the space in front of a zapper must be free in order for you to be able to use it. S C O R I N G The game ends when you 1. finish the sixteenth (actually seventeenth) room, 2. run out of attempts, or 3. hit the ESC key to quit the program. At this time you will be presented with a score report. You earn 200 points for every room completed and 50 points for every attempt you had left when the game ended. For every single move you made during the course of the game, valid or invalid, a point is subtracted. You can therefore maximize your score by finding the absolute shortest path for each room. My highest score is 2492, but I think it's possible to score as high as 2500. S O R T A F R E E W A R E N O T I C E This game can be distributed freely and played free of charge. If you like it, however, I wouldn't mind a small donation for the effort I put into writing the program and (ughh!) in making the levels. I say "ughh!" because making the levels was by far the more time-consuming of the two projects. I'm going to be a freshman computer science major at the University of Illinois (Urbana) in roughly two weeks. A donation to the following address will make photocopying that much easier! :) DOUG BEEFERMAN 542 FOX GLOVE LN. BARRINGTON, IL 60010 A donation of $3 or more will get you: 1. the latest version of CyberBox; 2. another, smaller, less significant VGA puzzle game I made called "Gripple"; 3. the source code in C to each of these programs. This will allow you to edit your own CyberBox levels if you have Borland's Turbo C++; 4. a sheet with the shortest solutions to each of the current CyberBox levels; 5. information on how to cheat; and 6. notification of any other programs I write while at the U of I. Hopefully it'll be better than this. Please specify 5.25" or 3.5" disk format when you donate. If you don't want to donate, please consider sending comments to the address above or to my father's mailbox on GEnie, H.BEEFERMAN. Thanks! O T H E R S T U F F Turbo C++ is copyright (C) 1990 by and is a registered trademark of Borland International, Inc. CyberBox is not copyright (C) 1991 by Doug Beeferman and is not a registered trademark of anyone. Steal it freely. It's a stupid name. xsok-1.02/lib/ 40755 144 62 0 6151124574 11533 5ustar mbimathoptxsok-1.02/lib/Cyberbox/ 40755 144 62 0 5665071060 13310 5ustar mbimathoptxsok-1.02/lib/Cyberbox/screen.02100644 144 62 421 5665071060 15004 0ustar mbimathopt;AUTHOR Doug Beeferman ;COMMENT No problem. ### ########*######## # # ## # # ## # # # -----|--- #|# # # +| ###|# #| - + |# #|+ ## # # #|## #### # # #| | ### # - # #| # +| # -|# # # # # @- # - # ################# xsok-1.02/lib/Cyberbox/screen.01100644 144 62 403 5665071060 15003 0ustar mbimathopt;AUTHOR Doug Beeferman ;COMMENT The lobby. ################# # # * # # # -|-|- # #| + + |# #| # | # |# # # # # # - + - # # # # # #| # # | # # |# #| |# # -- @ -- # ################# xsok-1.02/lib/Cyberbox/screen.03100644 144 62 421 5665071060 15005 0ustar mbimathopt;AUTHOR Doug Beeferman ;COMMENT Think ahead. ### #### #*######## ## # ## # # # |# # || # # # |+######++## # # | - | # # # # ##+# # # # #### #| -- # # # # #|# -- # # #++ # >|# # # || # # + # # # # @# # + ## ################ xsok-1.02/lib/Cyberbox/screen.04100644 144 62 425 5665071060 15012 0ustar mbimathopt;AUTHOR Doug Beeferman ;COMMENT Choices, choices. ### ########*######## # +-+++++v # # # # # -|# # ## ### - # # # #### #|# # # - ## - # # # # #| # - # # #|# #|# #### + # #|<|<|< ---- # # # # #### # # @# ---- # ################# xsok-1.02/lib/Cyberbox/screen.05100644 144 62 422 5665071060 15010 0ustar mbimathopt;AUTHOR Doug Beeferman ;COMMENT You can do it! ### ########*######## # # -- # # # # | - # # ## # | | # # # # ##|# | ### |# ## #vv# | # # # |--- # # # # |# ### # # ### # +# #### --+ # ##|######## +-- # # @# # ################# xsok-1.02/lib/Cyberbox/screen.06100644 144 62 423 5665071060 15012 0ustar mbimathopt;AUTHOR Doug Beeferman ;COMMENT Chain reaction. ### ########*######## # # v # # ---v------|<# # - #+ # # | # # # | # #>---|########|## ##### # # ##| # # - #| # # ######|+- # # @# ^ # ################# xsok-1.02/lib/Cyberbox/screen.08100644 144 62 425 5665071060 15016 0ustar mbimathopt;AUTHOR Doug Beeferman ;COMMENT Go with the flow. ### ########*######## # # # # # ## # u # ## # ## # |-| ## # # d +#+ ## # # # # |#| ## # #u>| ---- # # # ###^#^^ ## # # # # l # ## # # ### l # # # l @# # ################# xsok-1.02/lib/Cyberbox/screen.09100644 144 62 424 5665071060 15016 0ustar mbimathopt;AUTHOR Doug Beeferman ;COMMENT Don't get zapped! ### ########*######## # #vvv -v # #|----+--+ - # # ##d r l # # #u # ## ### # # ### l r # # # # l # # ##u### #u u d # # --- # # l r d#u# v # #r u d #@# -+- # # l l #### ## ####### ####### xsok-1.02/lib/Cyberbox/screen.10100644 144 62 403 5665071060 15003 0ustar mbimathopt;AUTHOR Doug Beeferman ;COMMENT Prioritize! ### ########*### # # # # ## # >| - ##### # +# # ### # # | # - # # | #>|# ## # # #| ## #### # #u -+--- #>>>+++# # #| ##u## # # ## # # @ #### ############## xsok-1.02/lib/Cyberbox/screen.11100644 144 62 364 5665071060 15012 0ustar mbimathopt;AUTHOR Doug Beeferman ;COMMENT Fifty-fifty... ### #*# ####v##### ## ---+- ## # +---- # # ---+-- # # -+--+-- # # ---+-- # #### - #### # # # # # #v#v# # # --@-- # ################ xsok-1.02/lib/Cyberbox/screen.12100644 144 62 424 5665071060 15010 0ustar mbimathopt;AUTHOR Doug Beeferman ;COMMENT Watch your step! ### ########*######## # #v X-- v # # - # | # ##u#| ##+# # # |------< | # # l + #d### # # l + + -- # # l + + ##^uu# # ## ### # # # X - X # # X @ X # ################# xsok-1.02/lib/Cyberbox/screen.07100644 144 62 421 5665071060 15011 0ustar mbimathopt;AUTHOR Doug Beeferman ;COMMENT Your guess... ### ########*######## #--v---- # # # - #+ # # # +>>| # ## # ### +- # # ## # >| + - # # + ^ ## # + ### ### --+----- # # # ## # @ # # ################# xsok-1.02/lib/Cyberbox/screen.13100644 144 62 426 5665071060 15013 0ustar mbimathopt;AUTHOR Doug Beeferman ;COMMENT Move it or lose it. ### ########*######## # XXX # # ##### # # #### l # ###### ## # # #### # ## # # - l # ## ###### # # # # + l # # # # ## - # # @# ##^## ################ xsok-1.02/lib/Cyberbox/screen.14100644 144 62 416 5665071060 15013 0ustar mbimathopt;AUTHOR Doug Beeferman ;COMMENT ZapperLand ### ########*######## # r r r r l l # # r r l l l r l # #u d u u d u d u# # l l r l d l l # #d d u u d l r u# # r l l l r u r # #u d d d d u u d# # l r r l r r r # #d u u u u u d u# # r l l @ r r r # ################# xsok-1.02/lib/Cyberbox/definitions100644 144 62 2717 5665071060 15652 0ustar mbimathopt; xsok-1.00: Definitions for the first 14 Cyberbox levels ; the original Cyberbox was written by Doug Beeferman (unknown e-mail) ; ;WALLS ; hex hex hex hex dec ; char picture enter leave mask effect 12 f f ff 0 standard floor * 14 f f 1 5 EXIT u 18 1 1 1 0 up only, player only l 19 2 2 1 0 left only, player only d 1a 4 4 1 0 down only, player only r 1b 8 8 1 0 right only, player only # 0 0 0 0 0 walls ;OBJECTS ; hex hex hex dec dec hex dec ; char picture movedir pushdir weight power mask score @ 0 f 0 9101 9201 1 200 player (unpushable) - 4 a 0 1 0 4 0 horizontal slider | 5 5 0 1 0 4 0 vertical slider + 6 f 0 1 0 4 0 slider ^ 8 1 1 0 100 8 0 up pusher < 9 2 2 0 100 8 0 left pusher v a 4 4 0 100 8 0 down pusher > b 8 8 0 100 8 0 right pusher X 2 f 0 1 0 10010 0 selector Y 3 f 0 1 0 30010 0 selector, walkable ; Level 17 won't work due to race conditions (It's not a serious level, anyway) ;MAXLEVEL 16 ;PUSHCOST 0 ;MOVECOST 1 ;ATOP `@* xsok-1.02/lib/Cyberbox/screen.15100644 144 62 420 5665071060 15007 0ustar mbimathopt;AUTHOR Doug Beeferman ;COMMENT Logistics... ### ########*######## # + --v--v--v-# # + ###|# X X # # ######|# Y Y # #u ### |# Y Y # # || # X###+ # # ##YYu# Y # #### # || # Y # # # ### ### # ## # # # # # @ # # ################# xsok-1.02/lib/Cyberbox/screen.16100644 144 62 427 5665071060 15017 0ustar mbimathopt;AUTHOR Doug Beeferman ;COMMENT Last but not least. ### ########*######## # # # ### # # #### # # |Y| # # # ## #u X#X# | -Y- # # lY Y # X#### ## ## # Y -Y- # # #dX#### ## # # |r -Y- # # --+- l ##d# ## # ^ ^ #@## # ################# xsok-1.02/lib/Cyberbox/screen.17100644 144 62 421 5665071060 15012 0ustar mbimathopt;AUTHOR Doug Beeferman ;COMMENT (...almost!) ### ########*## ## ## # | | v # # # # | | |+| # # # # | |+| # # # # | |+| # # # # | ^ ## # # # # - - | | | # # - - - | |+ | # # --- | | +| # # - - @ | | # ################# xsok-1.02/lib/Sokoban/ 40755 144 62 0 5665071060 13127 5ustar mbimathoptxsok-1.02/lib/Sokoban/screen.01100644 144 62 244 5665071060 14625 0ustar mbimathopt ##### # # #$ # ### $## # $ $ # ### # ## # ###### # # ## ##### ..# # $ $ ..# ##### ### #@## ..# # ######### ####### xsok-1.02/lib/Sokoban/screen.02100644 144 62 224 5665071060 14624 0ustar mbimathopt############ #.. # ### #.. # $ $ # #.. #$#### # #.. @ ## # #.. # # $ ## ###### ##$ $ # # $ $ $ $ # # # # ############ xsok-1.02/lib/Sokoban/screen.03100644 144 62 244 5665071060 14627 0ustar mbimathopt ######## # @# # $#$ ## # $ $# ##$ $ # ######### $ # ### #.... ## $ $ # ##... $ $ # #.... ########## ######## xsok-1.02/lib/Sokoban/screen.04100644 144 62 346 5665071060 14633 0ustar mbimathopt ######## # ....# ############ ....# # # $ $ ....# # $$$#$ $ # ....# # $ $ # ....# # $$ #$ $ $######## # $ # # ## ######### # # ## # $ ## # $$#$$ @# # # ## ########### xsok-1.02/lib/Sokoban/screen.05100644 144 62 337 5665071060 14634 0ustar mbimathopt ##### # ##### # #$## # # $ # ######### ### # #.... ## $ $### #.... $ $$ ## #.... ##$ $ @# ######### $ ## # $ $ # ### ## # # # ###### xsok-1.02/lib/Sokoban/screen.06100644 144 62 216 5665071060 14631 0ustar mbimathopt###### ### #.. # ##@## #.. ### # #.. $$ # #.. # # $ # #..### # $ # #### $ #$ # # $# $ # # $ $ # # ## # ######### xsok-1.02/lib/Sokoban/screen.07100644 144 62 231 5665071060 14627 0ustar mbimathopt ##### ####### ## ## # @## $$ # # $ # # $ ### # ### #####$### # $ ### ..# # $ $ $ ...# # ###...# # $$ # #...# # ### ##### #### xsok-1.02/lib/Sokoban/screen.08100644 144 62 342 5665071060 14633 0ustar mbimathopt #### # ########### # $ $ $ # # $# $ # $ # # $ $ # # ### $# # #### # #@#$ $ $ ## # # $ #$# # # # $ $ $ $ # ##### ######### # # # # #......# #......# #......# ######## xsok-1.02/lib/Sokoban/screen.09100644 144 62 360 5665071060 14634 0ustar mbimathopt ####### # ...# ##### ...# # . .# # ## ...# ## ## ...# ### ######## # $$$ ## ##### $ $ ##### ## #$ $ # # #@ $ $ $ $ # ###### $$ $ ##### # # ######## xsok-1.02/lib/Sokoban/screen.10100644 144 62 500 5665071060 14620 0ustar mbimathopt ### ############# ##@#### # # # $$ $$ $ $ ...# # $$$# $ #...# # $ # $$ $$ #...# ### # $ #...# # # $ $ $ #...# # ###### ###...# ## # # $ $ #...# # ## # $$ $ $##..# # ..# # $ #.# # ..# # $$$ $$$ #.# ##### # # #.# # ######### #.# # #.# ############### xsok-1.02/lib/Sokoban/screen.11100644 144 62 337 5665071060 14631 0ustar mbimathopt #### #### # # ### @###$ # ## $ # ## $ $$## ## # #$## # # # $ $$ # ### # $ # # $ ##### #### # $$ # # #### ## $ # #. ### ######## #.. ..# #### #...#.# #.....# ####### xsok-1.02/lib/Sokoban/screen.12100644 144 62 342 5665071060 14626 0ustar mbimathopt################ # # # # ###### # # # $ $ $ $# # # # $@$ ## ## # # $ $ $###...# # # $ $ ##...# # ###$$$ $ ##...# # # ## ##...# ##### ## ##...# ##### ### # # ####### xsok-1.02/lib/Sokoban/screen.13100644 144 62 354 5665071060 14632 0ustar mbimathopt ######### ## ## ##### ### # # ### # $ #$ # # ... # # # $#@$## # #.#. # # # #$ # . . # # $ $ # # #.#. # # ## ##$ $ . . # # $ # # #$#.#. # ## $ $ $ $... # #$ ###### ## # # # ########## #### xsok-1.02/lib/Sokoban/screen.14100644 144 62 434 5665071060 14632 0ustar mbimathopt ####### ####### # # # $@$ # #$$ # ######### # ###......## # # $......## # # # ###...... # ## #### ### #$## # #$ # $ # # # $ $$$ # $## # # $ $ ###$$ # # ##### $ # # ### ### # # # # # ######## # #### xsok-1.02/lib/Sokoban/screen.15100644 144 62 345 5665071060 14634 0ustar mbimathopt ######## # # # # $ # ### #$ #### # $ ##$ # # # @ $ # $# # # $ #### ## ####$## # # $#.....# # # # $..**. $# ### ## #.....# # # ### ####### # $$ # # # # # ###### # ##### xsok-1.02/lib/Sokoban/screen.16100644 144 62 271 5665071060 14633 0ustar mbimathopt##### # ## # # #### # $ #### # # $$ $ $# ###@ #$ ## # ## $ $ ## # $ ## ## .# # #$##$ #.# ### $..##.# # #.*...# # $$ #.....# # ######### # # #### xsok-1.02/lib/Sokoban/screen.17100644 144 62 325 5665071060 14634 0ustar mbimathopt ########## #.. # # #.. # #.. # #### ####### # ## # # # # ## # # #### ## #### ## # $ ##### # # # # $ $ # $ # # @$ $ # ## #### ## ####### # # ###### xsok-1.02/lib/Sokoban/screen.18100644 144 62 371 5665071060 14636 0ustar mbimathopt ########### # . # # # #. @ # ##### ##..# #### ## # ..### ### # $ #... $ # $ # # .. ## ## ## # ####$##$# $ # # # ## # #$ $$ # # # $ # # # $## # # # # ########### # #### #### xsok-1.02/lib/Sokoban/screen.19100644 144 62 402 5665071060 14632 0ustar mbimathopt ###### # @#### ##### $ # # ## #### # $ # ## # # $ # ##### # ## $ $ # # ## $ $ ### # # ## # $ # # # ## # #$# # # ## ### # # ###### # $ #### # #....# # $ $ ..#.# ####$ $# $ ....# # # ## ....# ################### xsok-1.02/lib/Sokoban/screen.20100644 144 62 457 5665071060 14634 0ustar mbimathopt ########## ##### #### # # $ #@ # # #######$#### ### # # ## # #$ ..# # # $ # # #.# # # $ # #$ ..# # # ### ## #.# # ### # # #$ ..# # # # #### #.# # #$ $ $ #$ ..# # $ # $ $ # #.# #### $### #$ ..# # $$ ###....# # ## ###### ######## xsok-1.02/lib/Sokoban/screen.21100644 144 62 321 5665071060 14623 0ustar mbimathopt######### # # # #### ## #### # # ## #@## # # $$$ $ $$# # # ## $ # # # ## $ #### #### $$$ $# # # ## ....# # # # #.. .# # # # ##...# ##### $ #...# ## ##### ##### xsok-1.02/lib/Sokoban/screen.22100644 144 62 467 5665071060 14637 0ustar mbimathopt###### #### # ####### ##### # $# # $ # # # $ $ $ # $ $ # ##$ $ # @# $ # # $ ########### ## # # #.......# $# # ## # ......# # # # $........$ # # # $ #.... ..# # # $ $####$#### $# # $ ### $ $ ## # $ $ $ $ # ## ###### $ ##### # # # # ################### xsok-1.02/lib/Sokoban/screen.23100644 144 62 376 5665071060 14637 0ustar mbimathopt ####### # # #### ##### $#$ # ## #.. # # # # #.. # $#$ # $#### #. # #$ # # #.. $# # $ # #..@# #$ #$ # # #.. # $# $# # #.. # #$$#$ # ## #.. # $# # $#$ # #.. # # # # # ##. #### ##### # #### #### ##### xsok-1.02/lib/Sokoban/screen.24100644 144 62 462 5665071060 14634 0ustar mbimathopt############### #.......... .#### #..........$$.# # ###########$ # ## # $ $ $ # ## #### # $ # # # # ## # ## # $# # ## ### ## # $ #$### ### ## ### $ # # ### ## ### $ ## # # ## # $ # $ $ $ # # $ $#$$$ # # # # $ ##### # @## # # # ############## xsok-1.02/lib/Sokoban/screen.25100644 144 62 447 5665071060 14640 0ustar mbimathopt#### # ############## # # ..#......# # # # ##### ...# ##$# ........# # ##$###### #### # $ # ######@ # ##$ # $ ###### # # $ #$$$## # # # #$#$### # #### #$$$$$ # # # $ # # # # ## ### # ######$###### $ # # # # # ########## ##### xsok-1.02/lib/Sokoban/screen.26100644 144 62 261 5665071060 14633 0ustar mbimathopt ####### # # ##### ## # #...### # $# #... # # $ #$$ ... # # $# #... .# # # $######## ##$ $ $ # ## # $$ # # ###### ##$$@# # ## ######## xsok-1.02/lib/Sokoban/screen.27100644 144 62 370 5665071060 14635 0ustar mbimathopt ################# #... # # ## ##..... $## # #$ # #......# $ # # #......# # # # # ######### $ $ $ # # #$##$ ##$## ## $ # $ # # ## ### # ##$ # # $ $$ $ $ # # $ $##$ ###### ####### @ ## ###### xsok-1.02/lib/Sokoban/screen.28100644 144 62 402 5665071060 14632 0ustar mbimathopt ##### ##### # ## $ $ #### ##### $ $ $ ##.# # $$ ##..# # ###### ###.. # ## # # #... # # $ # #... # #@ #$ ## ####...# #### $ $$ ##..# ## $ $ $...# # $$ $ # .# # $ $ #### ###### # ##### xsok-1.02/lib/Sokoban/screen.29100644 144 62 344 5665071060 14640 0ustar mbimathopt##### # ## # $ ######### ## # # ###### ## # $#$#@ # # # # $ # $ # # ### ######### ## # ## ..*..... # ## ## ## *.*..*.* # ## # $########## ##$ # # $ $ $ $ # # # # # # # ################### xsok-1.02/lib/Sokoban/screen.30100644 144 62 416 5665071060 14630 0ustar mbimathopt ########### # # # ##### # $ $ # # ##### $## # ## # $ ## # ## $ # # $ @$$ # ##$$$ # ## ### # ## # ## # ### #####$# ## # $ #....# # ### ## $ #....## # $ $ # #..$. # # ## $ # ##.... # ##### ######...## ##### ##### xsok-1.02/lib/Sokoban/screen.31100644 144 62 354 5665071060 14632 0ustar mbimathopt #### # ######### ## ## # # # $# $@$ #### #$ $ # $ $# ## ## $## #$ $ # # # # # $$$ # # $ $ $## #### # $ $ #$# # # ## ### ###$ # # #.... # ####......#### #....#### #...## #...# ##### xsok-1.02/lib/Sokoban/screen.32100644 144 62 275 5665071060 14635 0ustar mbimathopt #### ##### # ## $# ## $ ## ### #@$ $ # $ # #### ## $# #....#$ $ # #....# $# #.... $$ ## #... # $ # ######$ $ # # ### #$ ### # # #### xsok-1.02/lib/Sokoban/screen.33100644 144 62 303 5665071060 14626 0ustar mbimathopt############ ## ## # ## $ $ # #### ## $$ # # $ # # # $$$ # #### # # # $ ## # # # $ # # $# $# # # ..# #### ####.. $ #@# #.....# $# # ##....# $ # ###..## # ############ xsok-1.02/lib/Sokoban/screen.34100644 144 62 313 5665071060 14630 0ustar mbimathopt ######### #.... ## #.#.# $ ## ##....# # @## # ....# # ## # #$ ##$ # ## ### $ # #$ $ $ $# # # # $ $ ## # # ### ## # # ## ## ## # $ # $ # ###$ $ ### # ##### #### xsok-1.02/lib/Sokoban/screen.35100644 144 62 452 5665071060 14635 0ustar mbimathopt############ ###### # # # ###....# # $$# @ .....# # # ### # ....# ## ## ### # ....# # $ $ # # #### # $ $## # # #### # #### # ## # # # #$ ## # # # $ $ # ## # ## # # $ $ # # # # $ ## ## # ##### # $$ $$ # ## ## ### $ # # # # # ###### ###### xsok-1.02/lib/Sokoban/screen.36100644 144 62 441 5665071060 14634 0ustar mbimathopt ##### ##### ###### # # #### $ $ $ # # $ ## ## ## ## # $ $ $ $ # ### $ ## ## ## # ##### #####$$ # ##$##### @## # # $ ###$### $ ## # $ # ### ### # $$ $ # $$ # # # ## # #######.. .### #.........# #.........# ########### xsok-1.02/lib/Sokoban/screen.37100644 144 62 420 5665071060 14632 0ustar mbimathopt########### #...... ######### #...... # ## # #..### $ $ # #... $ $ # ## # #...#$##### # # ### # #$ #$ # # $$ $ $ $## # # $ #$#$ ##$ # ### ## # ## # # $ $ ## ###### # $ $ # ## # # # #####@##### ### xsok-1.02/lib/Sokoban/screen.38100644 144 62 170 5665071060 14635 0ustar mbimathopt #### ####### @# # $ # # $## $# ##$#...# # # $... # # #. .# ## # # #$ # #$ $ # # ####### #### xsok-1.02/lib/Sokoban/screen.39100644 144 62 443 5665071060 14641 0ustar mbimathopt ###### #############....# ## ## ##....# # $$## $ @##....# # $$ $# ....# # $ ## $$ # # ...# # $ ## $ # ....# ## ##### ### ##.### ## $ $ ## . # # $### # ##### ### # $ # # # $ #$ $ $### # # $$$# $ # #### # # $$ # ###### ### ##### xsok-1.02/lib/Sokoban/screen.40100644 144 62 370 5665071060 14630 0ustar mbimathopt ############ # ## # # #$$ $ # #$ #$# ## @# ## ## # $ # ## # $ #$ # # # # $ # # ## $ $ ## # # # ## $ # # ## $$# # ######$$ # # #....# ######## #.#... ## #.... # #.... # ######### xsok-1.02/lib/Sokoban/screen.41100644 144 62 436 5665071060 14634 0ustar mbimathopt ##### ## ## ## # ## $$ # ## $$ $ # # $ $ # #### # $$ ##### # ######## ## # #. $$$@# #.# ####### ## ## #.# #######. #$ $## #........... # # ############## $ # ## ## #### xsok-1.02/lib/Sokoban/screen.42100644 144 62 351 5665071060 14631 0ustar mbimathopt ######## #### ###### # ## $ $ @# # ## ##$#$ $ $## ### ......# $$ ## # ......# # # # # ......#$ $ # # #$...... $$# $ # # ### ###$ $ ## ### $ $ $ $ # # $ $ $ $ # ###### ###### ##### xsok-1.02/lib/Sokoban/screen.43100644 144 62 325 5665071060 14633 0ustar mbimathopt ####### ##### # #### # # $ # #### #$$ ## ## # ## # # ## ### # ### $#$ $ $ # #... # ## # # #...# @ # ### ## #...# ### $ $ # ######## ## # # ######### xsok-1.02/lib/Sokoban/screen.44100644 144 62 402 5665071060 14630 0ustar mbimathopt ##### # # # # ####### # $@###### # $ ##$ ### # # #### $ $ # # ##### # #$ #### ## #### ##$ # # $# $ # ## ## # # # #...# # ###### ### ... # #### # #...# # # ### # # # # ######### xsok-1.02/lib/Sokoban/screen.45100644 144 62 313 5665071060 14632 0ustar mbimathopt##### #### #...# # #### #...### $ # #....## $ $### ##....## $ # ###... ## $ $ # # ## # $ # # ## # ### #### # $ # #$ $ # # $ @ $ $ # # # $ $$ $ ### # ###### ### # ## #### ### xsok-1.02/lib/Sokoban/screen.46100644 144 62 335 5665071060 14637 0ustar mbimathopt########## # #### # ###### # ## # # $ $ $ $ # # #$ # ###$ $$# ### # ## # $## ##$# $ @# # $ $ ### # # $ # # ## # # ## ##### # # # #.......### #.......# ######### xsok-1.02/lib/Sokoban/screen.47100644 144 62 266 5665071060 14643 0ustar mbimathopt #### ######### ## ## $ $ ##### # ## ## ##...# # #$$ $ $$#$##...# # # @ # ...# # $# ###$$ ...# # $ $$ $ ##....# ###$ ####### # ####### #### xsok-1.02/lib/Sokoban/screen.48100644 144 62 312 5665071060 14634 0ustar mbimathopt ######### #*.*#*.*# #.*.*.*.# #*.*.*.*# #.*.*.*.# #*.*.*.*# ### ### # # ###### ###### # # # $ $ $ $ $ # ## $ $ $ $ ## #$ $ $ $ $# # $@$ # # ##### # #### #### xsok-1.02/lib/Sokoban/screen.49100644 144 62 352 5665071060 14641 0ustar mbimathopt #### # ## # ## # $$ ## ###$ $ ## #### $ # ### # ##### # # # #....$ # # # $ ....# # # $ # #.*..# # ### #### ### # #### @$ ##$## ### $ # # ## # ######### xsok-1.02/lib/Sokoban/screen.50100644 144 62 463 5665071060 14634 0ustar mbimathopt ############ ##.. # # ##..* $ $ # ##..*.# # # $## #..*.# # # $ # ####...# # # # # ## # # # @$ $ ### # ## # $ $ # # # ###$$ # # # # # # $ # # ##### # $# ##### # #$ # # # # # ### ## # # # # ## #### ###### xsok-1.02/lib/Sokoban/screen.51100644 144 62 220 5665071060 14624 0ustar mbimathopt######### # # # $ $# #### # # $ ## #### $ # #.. $ ## #### #.. $## # #.. $ # #.###$### #@# #.# # ### ### ####### xsok-1.02/lib/Sokoban/screen.52100644 144 62 374 5665071060 14637 0ustar mbimathopt#################### # ########## @# # $# # ###### # #### # ### ##### # ### # $ # ### # $#### # # # # # # #..#$### # # # # #$ #..# $ $$ # # #..# # # # # # #..# # # # #################### xsok-1.02/lib/Sokoban/screen.53100644 144 62 374 5665071060 14640 0ustar mbimathopt#################### # ### # $# $ ## $ ## # $### # $$ ## #.### $ $ ## ## #...# # # #$ # #..##$$#### $ # # #...# $ ## ### #...$ ### # # # ##.. $# ## ##@ # ###.# # #################### xsok-1.02/lib/Sokoban/screen.54100644 144 62 374 5665071060 14641 0ustar mbimathopt#################### # # # # #@# # $ $ $ # # ## ###..## ### # # #....#$# $### # # $ #....# $ $ $ # # #....# # # $ $ # # ##..## #$# # ##$## ## # #$## # $ $ # # # # # # # # #################### xsok-1.02/lib/Sokoban/screen.55100644 144 62 374 5665071060 14642 0ustar mbimathopt#################### # @## # ## # ## $ $ ## # ###....# # # ### # #....# # # $ # ### #...# # # ## ##.# $ $ # ## $ $ ### # # ### ## $ # # $ # #### $ $# # # # $ # #### # # ## #################### xsok-1.02/lib/Sokoban/screen.56100644 144 62 374 5665071060 14643 0ustar mbimathopt#################### # # ## # @### ## $ # $### # ##$# $ ##$# $ $ # # $# $ ### # ## $ ### #....# # # $# # # # #....## # $ $ # #....### ##$ ### $ #....#### # # $ ###### # # # ###### #################### xsok-1.02/lib/Sokoban/screen.57100644 144 62 374 5665071060 14644 0ustar mbimathopt#################### #@ ### # # # # # # # $ $ # ##### # $ $#$# # #.#..# ##$ $ # #..... $ # ## #..... ###$##$### #.#..# $ # # ##### # #$ $ # ##### # $ $ $ # ##### # # # # # #################### xsok-1.02/lib/Sokoban/screen.58100644 144 62 374 5665071060 14645 0ustar mbimathopt#################### ##... ## # # # #.... $ ## # #....# # #$###$ # #...# # # # ##.# #$ # $## # # # # $ $ ### $ # # $ $ # # ## # ## # ## #$$# $# # # # # $ $ # ## # # # # @# #################### xsok-1.02/lib/Sokoban/screen.59100644 144 62 374 5665071060 14646 0ustar mbimathopt#################### # # #@# ## ##### # # # $ $ ##### # # ###### $ ### # # #....# $$ # ##$##$##....# # # #....##$##$## # $$ #....# # # $ $ # # ### # ##### $ $ $ # ##### # # # ## #################### xsok-1.02/lib/Sokoban/screen.60100644 144 62 374 5665071060 14636 0ustar mbimathopt#################### # # # # # $ ## ### ## ##### ## $ $ # ##..## # # $ # # # #.... $ ##$# ## #.... $##### #$## ##..# # # # $ # ###.# # $ $ # @# ## $ $ # # #### ## ########### #################### xsok-1.02/lib/Sokoban/screen.61100644 144 62 374 5665071060 14637 0ustar mbimathopt#################### # ###..### # # $$ ###..### $@ # # # ##......# $ # # #......# $ # #### ###..######$ # # $$$ #..# # # # $# $ $ $$ #$ # # # ## $ ## # # # $ $ ## $ $ # # # ## ## # # #################### xsok-1.02/lib/Sokoban/screen.62100644 144 62 374 5665071060 14640 0ustar mbimathopt#################### # # # # # # # # @# # ## $ $ ## #### # # # $ # # # ## #$ ## ## # # $ $ $ # #..###$$## $##$ ## # #..#.# # $ $ # # #....# $$ ##$ #### #....# ##### # #...### ## # #################### xsok-1.02/lib/Sokoban/screen.63100644 144 62 374 5665071060 14641 0ustar mbimathopt#################### #....# # # # #....# # $ $ # #.... ## $# # $#$ # #...# $ $# $ # #..#### # $ $$ # # #### #### ### # # # # # ## # $ # $ $ # # ## $ ## $ $ # # @# # # # #################### xsok-1.02/lib/Sokoban/screen.64100644 144 62 374 5665071060 14642 0ustar mbimathopt#################### #....### # #....##### # #$# ## #....### #$ $ # #....### $ #$$## ## #### $# #$ $ # ## #### $ $ # # #@ ####$###$## $ # ## # # $ # ## ### # $ #### ######## # # # #################### xsok-1.02/lib/Sokoban/screen.65100644 144 62 374 5665071060 14643 0ustar mbimathopt#################### # # @#...### # # ##...## # # # ##$## ## ....# # $ # $$$ ....# ###$### $$ ### ##.# # $ # # #### # $ # ### # # # ## #$## $ $$ # # $ ## # # # # # # # # # #################### xsok-1.02/lib/Sokoban/screen.66100644 144 62 374 5665071060 14644 0ustar mbimathopt#################### # # #...#@ # # # ....# # # $ # #....# # # ##$#### ##....# # # $ $ # #...# # # $$ # # # $$ # ### $$$# $$ $ # # $ # # # $# # # $# # $ # # # # # # # #################### xsok-1.02/lib/Sokoban/screen.67100644 144 62 374 5665071060 14645 0ustar mbimathopt#################### #####@###.##...## # #####$ ..#...# # #### ......# $ # ### $ #.....## # ## ## $$# ##### $ $ # ## $# $ ## $$ # ## # # # $ $ # ## $$ ### #$## # ## $# $ $ $ ## ### # # ### #################### xsok-1.02/lib/Sokoban/screen.68100644 144 62 374 5665071060 14646 0ustar mbimathopt#################### #@ # # # ## ### ## #### # ## # # # $$ # # # # # $ # $ ## ## # $ # #$$ # # # ### # ## ## #..#.# $ # $ # # #..#.# $ # ## $$ # #....## $$ $ # # #.....## # # #################### xsok-1.02/lib/Sokoban/screen.69100644 144 62 374 5665071060 14647 0ustar mbimathopt#################### # # # # ## # $# $ $ ##...$ $ # # $ # ##....# $ # # ## $ ##....# $ # # $ #....## $ # # $## #...# # # $$$##$## ### ## # # # # # # # # $ # $ ## # # # #@ # #################### xsok-1.02/lib/Sokoban/screen.70100644 144 62 374 5665071060 14637 0ustar mbimathopt#################### # # # # # # # # $ $ $ # ## # #$###$## ## # # $ $ # $ # # ###$##$# # $ # # # $ $ ###### $# # $ $$ $ #@#.#...# # # # # #.#...# # ########## #.....# # #.....# #################### xsok-1.02/lib/Sokoban/screen.71100644 144 62 374 5665071060 14640 0ustar mbimathopt#################### # # # ## ## # $# $ # ## # # $ $ #..# $ # # $ $ #....# # ## # $# #......### $ # # # #....# #$ # # $ ####..# # # ## $ ## # # $ $## ### $ $#@$ $# # #### # # # #################### xsok-1.02/lib/Sokoban/screen.72100644 144 62 374 5665071060 14641 0ustar mbimathopt#################### # ....# #### # .... # # # ########## # # #$ # ###..# # $ #$$### #..# # $ ### $ $ #..# # $ # $ $ # ##..# # # $$ # $ ## ## #@## $# $ $ ## ## ## # ### #################### xsok-1.02/lib/Sokoban/screen.73100644 144 62 374 5665071060 14642 0ustar mbimathopt#################### # # #@ # # # $$ #$$# # # ## # # # $ $ #$$ # # ## # # # # # # # # ## # # # # $ # # # # # $ #$ # # $ #..# ##$ # #### #...# # $ #....# # # # #.....# #################### xsok-1.02/lib/Sokoban/screen.74100644 144 62 374 5665071060 14643 0ustar mbimathopt#################### # # ##### # ## $ # #### $ # #### $$ #..# # # # $ $ ##..#### ## # $ ###.... $$ # # #$# ....# # $ # # # # $ ..###$# # # # $ #..# ## # # $# #### # $## # # # @# ## #################### xsok-1.02/lib/Sokoban/screen.75100644 144 62 374 5665071060 14644 0ustar mbimathopt#################### # # # # #@# # $ $ # $ # # ##$# $### # $$# # # # #.### #$ $ # # #$#....# # ### # # $ #.....## # # ##$ #.#....#$$ $ # # ######..## # # # # $ $ ### # # # # # # #################### xsok-1.02/lib/Sokoban/screen.76100644 144 62 374 5665071060 14645 0ustar mbimathopt#################### # # # # #@## # # # $ # # ##$# ##### $ # ## ## ##.....# # # ##$##$#.....###$#$ # # # ##.....# # ## # $ ##..## # # # $ # $ $ $$$ # ## $ $# # # $ # # ## # # # #################### xsok-1.02/lib/Sokoban/screen.77100644 144 62 266 5665071060 14646 0ustar mbimathopt###### ##### # # # # # $ #### $ # # $ $ # # ###@###$ # ########## ### #.. ## # #.. ##$ # #.. ## $ # #.. ## $ # #.. $ $ # ### ######### #### xsok-1.02/lib/Sokoban/screen.78100644 144 62 350 5665071060 14641 0ustar mbimathopt ########### # # # $ $ # ###### # $ ##### # # ##### $ ##$# # $ $ # # ## ## # # ##@##### ## # # #### # ## ## #....# # $ # #....# # # ###### ####### xsok-1.02/lib/Sokoban/screen.79100644 144 62 310 5665071060 14636 0ustar mbimathopt############# # # # ### $$ # # # $ $ # # $####$###### # $ ## ##### # $$ $ ...# ### ## $$# ...# # ## # ...# # # ...# ###@############# ### xsok-1.02/lib/Sokoban/screen.80100644 144 62 314 5665071060 14632 0ustar mbimathopt ################# ###@## ...# # # ...# # $ # ...# # $$ # ...# ## $ ###$########## # ### $ # ## $ $ # # $ # $ # # $ # # # $ # # # # # ########### xsok-1.02/lib/Sokoban/screen.81100644 144 62 364 5665071060 14640 0ustar mbimathopt ##### ########## # # # # # $ $ $$ # # ##### ## $ # #$$ #$## $ # # ### # ##$ # ###### ### $ $ # #.... ## # #.... ###### #.... # ###########@## ### xsok-1.02/lib/Sokoban/screen.82100644 144 62 271 5665071060 14636 0ustar mbimathopt ###### #### # # ## # # $ # ### #### ######## # $ $ ## ...# # $$ $$ ...# # $ $## ...# ##@## ## ## ...# ### $ ######## # $$ # # # # ######### xsok-1.02/lib/Sokoban/screen.83100644 144 62 352 5665071060 14637 0ustar mbimathopt####### ######### # # # ## # # ### # # $ # # # $ ### $ # # $$ ##$ # # #### ## # #@############ ## ###.. #####$ # #.. #### # #.. $$ # #.. #### $ # #.. # # # ######## ##### xsok-1.02/lib/Sokoban/screen.84100644 144 62 303 5665071060 14634 0ustar mbimathopt####### # ########## # # # ## # $ # $ $ # # $ # $ ## # # $$ ##$ $ # ## # ## ####### ## # ## ...# # #$ ...# # $$ ...# # ##@# ...# ################ xsok-1.02/lib/Sokoban/screen.85100644 144 62 470 5665071060 14642 0ustar mbimathopt############ # # ## # $ $ # ###### #### ##### # #.. # #### # #.#### #### # #.... # $ #### # ...# # $$$# ## ###.#### ## $@$ # # ##### $ # # # #.# $ $###$ # # #.######## # $ # # #.. ## $ # # # ####### $ # # # # # # ## ##### ########## xsok-1.02/lib/Sokoban/screen.86100644 144 62 526 5665071060 14645 0ustar mbimathopt;COMMENT Level 18, with one more box. ;AUTHOR Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de) ########### # . # # # #. @ # ##### ##..# #### ## #...### ### # $ #... $ # $ # # .. ## ## ## # ####$##$# $ # # # ## # #$ $$ # # # $ #$# # $## # # # # ########### # #### #### xsok-1.02/lib/Sokoban/definitions100644 144 62 1063 5665071060 15462 0ustar mbimathopt; xsok-1.00: Definitions for the Sokoban levels ; ;WALLS ; hex hex hex hex dec ; char picture enter leave mask effect 12 f f ff 0 standard floor . 13 f f ff 4 target field # 0 0 0 0 0 walls ;OBJECTS ; hex hex hex dec dec hex dec ; char picture movedir pushdir weight power mask score @ 0 f 0 101 201 1 0 player $ 1 f 0 100 0 2 1000 heavy box ;MAXLEVEL 88 ;ATOP *$. xsok-1.02/lib/Sokoban/screen.87100644 144 62 626 5665071060 14647 0ustar mbimathopt;COMMENT ... and two more for level 22. ;AUTHOR Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de) ###### #### # ####### ##### # $# # $ # # # $ $ $ # $ $ # ##$ $ # @# $ # # $ ########### ## # # #.......# $# # ## #.......# # # # *........$ # # # $ #.... ..# # # $ $####$#### $# # $ $ ### $ $ ## # $ $ $ $ $ # ## ###### $ ##### # # # # ################### xsok-1.02/lib/Sokoban/screen.88100644 144 62 607 5665071060 14647 0ustar mbimathopt;COMMENT One more for 35. ;AUTHOR Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de) ############ ###### # # # ###....# # $$# @ .....# # # ### # ....# ## ## ### # ....# # $ $ # #.#### # $ $## # # #### # #### # ## # # # #$ ## # # # $ $ # ## # ## # # $ $ # # # # $ ## ## # ##### # $$ $$ # # ## ## ### $ $ # # # # ##### ###### ###### xsok-1.02/lib/Sokoban/screen.97100644 144 62 1260 5665071060 14663 0ustar mbimathopt;COMMENT This level is under construction ;AUTHOR Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de) ###### #### ###### # ####### ########### # # $# # $ # # # $ $ $ # $ $ ############ ##$ $ # @# $ # # # $ ########### ## # # # #.......# $# $ $$ $ # # ## #.......# # $ $ $ $# # # *........$ # $ $ $ # # # $ #.... ..# # $ $ $ # # $ $####$#### $# $ # # $ $ ### $ $ ######### ## # $ $ $ $ $ ###### ## ## ###### $ ##### # # # # ######## ### # ...... # # .... ### ######## # .. .... # # ##### ################### xsok-1.02/lib/Xsok/ 40755 144 62 0 5665071060 12457 5ustar mbimathoptxsok-1.02/lib/Xsok/screen.01100644 144 62 437 5665071060 14161 0ustar mbimathopt;COMMENT You'll need both strength bonuses. ;AUTHOR Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de) ############# #### #. #.# ? # #P # # # ## ? # # # #$###$<# # # ?# #)! + % ####d### ## ### # p`# # -.X$ . $ ## #P^ ############ ### #### #### xsok-1.02/lib/Xsok/screen.02100644 144 62 374 5665071060 14162 0ustar mbimathopt;COMMENT All pushers must move. ;AUTHOR Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de) ### ####### #### # - @*# ## ^# >+#### # >+# ## ### - .# #.##^# #$# #$. ## #.# #.$$ -- # ## ##+# #$# #.$>$| .# #####^#$### ###.# ### xsok-1.02/lib/Xsok/screen.04100644 144 62 706 5665071060 14163 0ustar mbimathopt;COMMENT One pusher will help you. ;AUTHOR Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de) ##### ### #( (### ################## #+ - @ # .## # ^# >+d### #)$.# ## >+# ## #)(## ### - D.# ##$# #.##^# #$# >+v (# #$. ## #.# +++ # ### #.$$ -- # ^+< # # ## ##+# #$# #>++# #.$>$| .# #v## # # #####^#$### # -+ #$ # ###.# ### #(^ .# ####### ############ xsok-1.02/lib/Xsok/screen.03100644 144 62 355 5665071060 14162 0ustar mbimathopt;COMMENT Don't get trapped! ;AUTHOR Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de) ##### #.$ # ######$ ## #. $.# # # #@ ##### # $+<-|<--<# #.# $# | # # ..# # ## # $.# #$# ###$## #.# #)L |<### ### ^$.# ####### xsok-1.02/lib/Xsok/definitions100644 144 62 3606 5665071060 15017 0ustar mbimathopt; xsok-1.00: Definitions for the Xsok levels ;WALLS ; hex hex hex hex dec ; char picture enter leave mask effect 12 f f ff 0 standard floor . 13 f f 3 4 target field: player and heavy box allowed * 14 f f 1 5 EXIT % 15 f f ff 2 rotate 180 ( 16 f f ff 1 rotate CCW ) 17 f f ff 3 rotate CW u 18 1 1 1 0 up only, player only l 19 2 2 1 0 left only, player only d 1a 4 4 1 0 down only, player only r 1b 8 8 1 0 right only, player only U 1c 1 1 ff 0 up only L 1d 2 2 ff 0 left only D 1e 4 4 ff 0 down only R 1f 8 8 ff 0 right only ! 20 f f fe 6 forbidden for player X 25 f f 1 0 no boxes here P 22 f f ff 106 add power! (once only) p 23 f f ff 7 remove power! ? 26 f f ff 8 teleporter # 0 0 0 0 0 walls ;OBJECTS ; hex hex hex dec dec hex dec ; char picture movedir pushdir weight power mask score @ 0 f 0 9101 9201 1 0 player (unpushable) $ 1 f 0 100 0 2 1000 heavy box - 4 a 0 1 0 4 100 horizontal light box | 5 5 0 1 0 4 100 vertical light box + 6 f 0 1 0 4 100 light box ^ 8 1 1 0 100 8 10 up pushbox < 9 2 2 0 100 8 10 left pushbox v a 4 4 0 100 8 10 down pushbox > b 8 8 0 100 8 10 right pushbox ;MAXLEVEL 5 ;PUSHCOST 10 ;MOVECOST 1 ;ATOP `@* xsok-1.02/lib/Xsok/screen.99100644 144 62 431 5665071060 14174 0ustar mbimathopt;COMMENT Just a single box... ;AUTHOR Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de) ############ #@ +-+ # # ++++++- # ##++ ++ ++ # #++++-+ | #### #++>+v+++++ # # ++ ++| # ### #++^+<++ # # #++++++ +#>++# #+ ++#v## # # # # -+ #$ # # # #(^ .# ############## xsok-1.02/lib/Xsok/screen.05100644 144 62 441 5665071060 14160 0ustar mbimathopt;COMMENT Just a single box... ;AUTHOR Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de) ############ #@ +-+ # # ++++++- # ##++ ++ ++ # #++++-+ | #### #++>+v+++++ # # ++ ++| # ### ##++^+<++ # # #* +++++ +#>++# ##+ ++#v## # # # # -+ #$ # # # #(^ .# #### ######### ### xsok-1.02/lib/floor.xpm100644 144 62 141720 5665071060 13544 0ustar mbimathopt/* XPM */ static char * floor_xpm[] = { "256 192 9 1", " c white", ". c #55558E38AAAA", "X c black", "o c #A69928A228A2", "O c yellow", "+ c magenta", "@ c green", "# c #BEFBBEFBBEFB", "$ c #A2892081F3CE", " .............................. ............................... .............................. ............................... ............................................................... ...............................................................", ". ............................ ............................... .. ............................ ............................... .. ............................................................... ..............................................................", ".. .......................... . ............................. . .. .......................... . ............................. . .. ............................................................... .............................................................", "... ........................ . ............................. . .... ........................ . ............................. . .... ............................................................... ............................................................", ".... . . . . .... . . . . .... .... ", ".... ...................... . ............................ . ..... ...................... . ............................ . ..... ............................................................... ...........................................................", ".... ...................... . . ........................... . . .... ...................... . . ........................... . . .... ............................................................... ...........................................................", ".... ...................... . ............................ . ..... ...................... . ............................ . ..... ............................................................... ...........................................................", ".... ...................... . . ........................... . . .... ...................... . . ........................... . . .... ............................................................... ...........................................................", ".... ...................... . ............................ . ..... ...................... . ............................ . ..... ............................................................... ...........................................................", ".... ...................... . . ........................... . . .... ...................... . . ........................... . . .... ............................................................... ...........................................................", ".... ...................... . ............................ . ..... ...................... . ............................ . ..... ............................................................... ...........................................................", ".... ...................... . . ........................... . . .... ...................... . . ........................... . . .... ............................................................... ...........................................................", ".... ...................... . ............................ . ..... ...................... . ............................ . ..... ............................................................... ...........................................................", ".... ...................... . . ........................... . . .... ...................... . . ........................... . . .... ............................................................... ...........................................................", ".... ...................... . ............................ . ..... ...................... . ............................ . ..... ............................................................... ...........................................................", ".... ...................... . . ........................... . . .... ...................... . . ........................... . . .... ............................................................... ...........................................................", ".... ...................... . ............................ . ..... ...................... . ............................ . ..... ............................................................... ...........................................................", ".... ...................... . . ........................... . . .... ...................... . . ........................... . . .... ............................................................... ...........................................................", ".... ...................... . ............................ . ..... ...................... . ............................ . ..... ............................................................... ...........................................................", ".... ...................... . . ........................... . . .... ...................... . . ........................... . . .... ............................................................... ...........................................................", ".... ...................... . ............................ . ..... ...................... . ............................ . ..... ............................................................... ...........................................................", ".... ...................... . . ........................... . . .... ...................... . . ........................... . . .... ............................................................... ...........................................................", ".... ...................... . ............................ . ..... ...................... . ............................ . ..... ............................................................... ...........................................................", ".... ...................... . . ........................... . . .... ...................... . . ........................... . . .... ............................................................... ...........................................................", ".... ...................... . ............................ . ..... ...................... . ............................ . ..... ............................................................... ...........................................................", ".... ...................... . . ........................... . . .... ...................... . . ........................... . . .... ............................................................... ...........................................................", ".... . . . ..... ...................... . . ...................... . ..... .... ...................... ...................... ", "... . . . . . . . . . . . . . . . . . . . . . . . . . . . . .... ...................... . . . . ...................... . . ... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .... ...................... . . . ...................... . ", ".. . . . . . . . . . . . . . . . . . . . . . . . . . . . . ..... ...................... . . . . ...................... . ... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ..... ...................... . . . ...................... .", ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .... ...................... . . . .. ...................... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .... ...................... . . .. ...................... . ", " . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .... ...................... . . ... ...................... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ..... ...................... . ... ...................... . ", ".... ...................... . . ... ...................... . . .... ...................... . . ... ...................... . . .... ...................... . . ... ...................... . . .... ...................... . . ... ...................... . . ", ".... ...................... . .. .. ...................... . ..... ...................... . .. .. ...................... . ..... ...................... . .. .. ...................... . ..... ...................... . .. .. ...................... . .", ".... ...................... . . .. . ...................... . . .... ...................... . . .. . ...................... . . .... ...................... . .... . ...................... . ...... ...................... . .... . ...................... . ..", ".... ...................... . .... ...................... . ..... ...................... . .... ...................... . ..... ...................... ...... ...................... ....... ...................... ...... ...................... ...", ".... ...................... . . ...................... . . .... ...................... . . ...................... . . .... ...................... ...................... .... ...................... ...................... ", ".... ...................... . ............................ . ..... ...................... . ............................ . ..... ............................................................... ...........................................................", ".... ...................... . . ........................... . . .... ...................... . . ........................... . . .... ............................................................... ...........................................................", ".... ...................... . ............................ . ..... ...................... . ............................ . ..... ............................................................... ...........................................................", ".... ...................... . . ........................... . . .... ...................... . . ........................... . . .... ............................................................... ...........................................................", ".... ...................... . ............................ . ..... ...................... . ............................ . ..... ............................................................... ...........................................................", ".... ...................... . . ........................... . . .... ...................... . . ........................... . . .... ............................................................... ...........................................................", ".... ...................... . ............................ . ..... ...................... . ............................ . ..... ............................................................... ...........................................................", ".... ...................... . . ........................... . . .... ...................... . . ........................... . . .... ............................................................... ...........................................................", ".... ...................... . ............................ . ..... ...................... . ............................ . ..... ............................................................... ...........................................................", ".... ...................... . . ........................... . . .... ...................... . . ........................... . . .... ............................................................... ...........................................................", ".... ...................... . ............................ . ..... ...................... . ............................ . ..... ............................................................... ...........................................................", ".... ...................... . . ........................... . . .... ...................... . . ........................... . . .... ............................................................... ...........................................................", ".... ...................... . ............................ . ..... ...................... . ............................ . ..... ............................................................... ...........................................................", ".... ...................... . . ........................... . . .... ...................... . . ........................... . . .... ............................................................... ...........................................................", ".... ...................... . ............................ . ..... ...................... . ............................ . ..... ............................................................... ...........................................................", ".... ...................... . . ........................... . . .... ...................... . . ........................... . . .... ............................................................... ...........................................................", ".... ...................... . ............................ . ..... ...................... . ............................ . ..... ............................................................... ...........................................................", ".... ...................... . . ........................... . . .... ...................... . . ........................... . . .... ............................................................... ...........................................................", ".... ...................... . ............................ . ..... ...................... . ............................ . ..... ............................................................... ...........................................................", ".... ...................... . . ........................... . . .... ...................... . . ........................... . . .... ............................................................... ...........................................................", ".... ...................... . ............................ . ..... ...................... . ............................ . ..... ............................................................... ...........................................................", ".... ...................... . . ........................... . . .... ...................... . . ........................... . . .... ............................................................... ...........................................................", ".... . . . ..... ...................... . . ...................... . ..... .... ...................... ...................... ", "... . . . . . . . . . . . . . . . . . . . . . . . . . . . . .... ...................... . . . . ...................... . . ... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .... ...................... . . . ...................... . ", ".. . . . . . . . . . . . . . . . . . . . . . . . . . . . . ..... ...................... . . . . ...................... . ... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ..... ...................... . . . ...................... .", ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .... ...................... . . . .. ...................... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .... ...................... . . .. ...................... . ", " . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .... ...................... . . ... ...................... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ..... ...................... . ... ...................... . ", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXoooooooo ooooooooooooooo oooooooXXXXXX XXXXXXXXXXXX XXXXXXXXXXXX XXXXXXXXXXXX XXXXXXXXXXXX XXXXXXXXXXXX XXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXoooooooo ooooooooooooooo ooooooo XXX XXX XXX XXX XXX ooooo XXX XXX XXX XXX XXX XXX XXX ", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXoooooooo ooooooooooooooo ooooooo XXX XXX XXX XXX XXX ooooooooooo XXX XXX XXX XXX XXXXXXX XXX XXX XXXXXXX XXX ", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXoooooooo ooooooooooooooo ooooooo XXX XXX XXX XXX XXoooooooooooooooXXX XXX XX XXX XX XXXXXXXXXXX XX XX XXXXXXXXXXX XX ", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXoooooooo ooooooooooooooo ooooooo XXX XXX XXX XXX oooooooooooooooooX XXX XXXX XXX XXXX XXX XXX XXXX ", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXoooooooo ooooooooooooooo ooooooo XXX XXX XXX XXX ooooooooooooooooooooo XXX XXXXXX XXX XXX XX XX XXX ", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXoooooooo ooooooooooooooo ooooooo XXX XXX XXX XXX ooooooooooooooooooooo X XXXXXXXX X XXX XXX ", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXX XXXXXXXXXXXX ooooooooooooooooooooooo XXXXXXXXXX XX XXXXXX XXXXXX XX ", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ooooooooooooooo ooooooooooooooo XXXXXXXXXXXX XXXXXXXXXXXX ooooooooooooooooooooooooo XXXX XX XXXX XX XXXXXX XXXXXX XX ", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ooooooooooooooo ooooooooooooooo XXX XXX XXXOOOOOOOOXXX ooo o ooo o o ooo XX XX XXX XXX XX ", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ooooooooooooooo ooooooooooooooo XXX XXX XXXOOOOOOOOOOXXX oooo ooooo ooo o ooo oooooo XX XX XX XX XX XX XX ", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ooooooooooooooo ooooooooooooooo XXX XXX XXXOOOOOOOOOOOOXXX oooo oooooo o oo ooo oooooo X XX X XX XX XX XX XX XX ", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ooooooooooooooo ooooooooooooooo XXX XXX XXXOOOOOOOOOOOOOOXXX oooo oooooo o oo ooo oooooo XX XX XX XX XX XX XX XX XX ", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ooooooooooooooo ooooooooooooooo XXX XXX XXXOOOOOOOOOOOOOOOOXXX ooooo oooooo o oo ooo ooooooo XXX XX XXX XX XX XX XX ", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ooooooooooooooo ooooooooooooooo XXX XXX XXXOOOOOOOOOOOOOOOOOOXXX ooooo ooooooo ooo ooo ooooooo XXX XX XXX XX XX XX XX ", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXX XXXXXXXXXXXXOOOOOOOOOOOOOOOOOOOOXXXXXXXooooo oooo ooo ooo oooooooXXX XXXXXXXXXXXXXXXXXXXXXXXXXX XXX XX XX XX XX XX XX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXoooooooo ooooooooooooooo oooooooXXXXXX XXXXXXXXXXXXOOOOOOOOOOOOOOOOOOOOXXXXXXXooooo ooooooo ooo ooo oooooooXXX XXXXXXXXXXXXXXXXXXXXXXXXXX XXX XX XX XX XX XX XX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXoooooooo ooooooooooooooo ooooooo XXX XXX XXXOOOOOOOOOOOOOOOOOOXXX ooooo oooooo o oo ooo ooooooo XXX XX XXX XX XX XX XX ", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXoooooooo ooooooooooooooo ooooooo XXX XXX XXXOOOOOOOOOOOOOOOOXXX oooo oooooo o oo ooo oooooo XXX XX XXX XX XX XX XX ", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXoooooooo ooooooooooooooo ooooooo XXX XXX XXXOOOOOOOOOOOOOOXXX oooo oooooo o oo ooo oooooo XX XX XX XX XX XX XX ", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXoooooooo ooooooooooooooo ooooooo XXX XXX XXXOOOOOOOOOOOOXXX oooo ooooo ooo o ooo oooooo X XX X XX XX XX XX ", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXoooooooo ooooooooooooooo ooooooo XXX XXX XXXOOOOOOOOOOXXX ooo o ooo o ooo ooooo XX XX XX XX XX ", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXoooooooo ooooooooooooooo ooooooo XXX XXX XXXOOOOOOOOXXX ooooooooooooooooooooooooo XX XX XX XX XX ", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXX XXXXXXXXXXXX ooooooooooooooooooooooo XXXX XX XXXX XX XX XX XX ", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ooooooooooooooo ooooooooooooooo XXXXXXXXXXXX XXXXXXXXXXXX ooooooooooooooooooooo XXXXXXXXXX XX XX XX XX ", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ooooooooooooooo ooooooooooooooo XXX XXX XXX XXX ooooooooooooooooooooo X XXXXXXXX X XXX XXX XXX XXX ", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ooooooooooooooo ooooooooooooooo XXX XXX XXX XXX ooooooooooooooooo XXX XXXXXX XXX XXXX XXXX XXXX XXXX ", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ooooooooooooooo ooooooooooooooo XXX XXX XXX XXX XoooooooooooooooXX XXX XXXX XXX XX XXXXXXXXXXXX X X XXXXXXXXXXXX XX ", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ooooooooooooooo ooooooooooooooo XXX XXX XXX XXX XXX ooooooooooo XXX XXX XX XXX XXX XXXXXXX XXX XXX XXXXXXX XXX ", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ooooooooooooooo ooooooooooooooo XXX XXX XXX XXX XXX ooooo XXX XXX XXX XXX XXX XXX XXX ", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ooooooooooooooo ooooooooooooooo XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX ", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXX XXXXXXXXXXXX XXXXXXXXXXXX XXXXXXXXXXXX XXXXXXXXXXXX XXXXXXXXXXXX XXXXXX", "XXXXXX XXXXXXXXXXXX XXXXXXXXXXXX XXXXXXXXXXXX XXXXXXXXXXXX XXXXXXXXXXXX XXXXXXXXXXXX XXXXXXXXXXXX XXXXXX", " XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX ", " XXX ++ XXX XXX XXX+++ ++++++++++++++++++++++++++++ +++XXX XXX XXX ++ XXX XXX XXX XXX ++++ XXX XXX XXX ", " XXX ++++ XXX XXX XX+++++ ++++++++++++++++++++++++++++ +++++XX XXX XXX +@@+ XXX XXX XXX XXX +@@+ XXX XXX XXX ", " XXX ++++ XXX XXX X++++#++ ++###$$$############$$$###++ ++#++++X XXX XXX +@@@@+ XXX XXX XXX XXX +@@+ XXX XXX XXX ", " XXX ++##++ XXX XXX ++++###++ ++###$$$##########$$$###++ ++###++++ XXX XXX +@@@@@@+ XXX XXX XXX XXX +@@+ XXX XXX XXX ", " XXX ++##++ XXX XXX ++++#####++ ++####$$$########$$$####++ ++#####++++ XXX X +@@@@@@@@+ X XXX XXX XXX +@@+ XXX XXX XXX ", " XX++$$$$++XX XXXXXXX++++$######++ ++####$$$$$$$$$$$$####++ ++######$++++XXXXXXX +@@@+@@+@@@+ ++XXXXXXXXXX XXXX+@@+XXXX XXXXXXXXXX++ ", " XX++$$$$++XX XXXXX++++$$$######++ ++####$$$$$$$$$$$$####++ ++######$$$++++XXXXX +@@@++@@++@@@+ +@@+XXXXXXXXX XXXX+@@+XXXX XXXXXXXXX+@@+ ", " XX++######++XX XXX ++++###$$$#####++ ++##$$$########$$$##++ ++#####$$$###++++ XXX +@@@+ +@@+ +@@@+ +@@@+ XXX XXX +@@+ XXX XXX +@@@+ ", " XXX++######++XXX XXX++++######$$$####++ ++#$$$##########$$$#++ ++####$$$######++++XXX +@@@+ +@@+ +@@@+ +@@@+ XXX XXX +@@+ XXX XXX +@@@+ ", " XXX++########++XXX XX++++#########$$$###++ ++$$############$$++ ++###$$$#########++++XX +@@+ +@@+ +@@+ +@@@+ XXX XXX +@@+ XXX XXX +@@@+ ", " XXX ++########++ XXX X++++############$$$##++ ++$##############$++ ++##$$$############++++X X ++ +@@+ ++ X +@@@+ XXX XXX +@@+ XXX XXX +@@@+ ", " XXX ++##########++ XXX ++++###############$$$#++ XX++##############++XX ++#$$$###############++++ XXX +@@+ XXX +@@@+ XXX XXX +@@+ XXX XXX +@@@+ ", " XXX ++##########++ XXX ++++##################$$$++ XXX++##############++XXX ++$$$##################++++ XXX +@@+ XXX +@@@+++++++++++++++++++++++ XXX +@@+ XXX +++++++++++++++++++++++@@@+ ", "XXXXXX ++############++ XXXXXXXX+++$####################$$++XXXXXXXX ++############++ XXXXXXXX++$$####################$+++XXXXXXXX +@@+ XXXXXXXX+@@@@@@@@@@@@@@@@@@@@@@@@@@+XXXXXXXX +@@+ XXXXXXXX+@@@@@@@@@@@@@@@@@@@@@@@@@@+XX", "XXXXXX ++############++ XXXXXXXX+++$####################$$++XXXXXXXX ++############++ XXXXXXXX++$$####################$+++XXXXXXXX +@@+ XXXXXXXX+@@@@@@@@@@@@@@@@@@@@@@@@@@+XXXXXXXX +@@+ XXXXXXXX+@@@@@@@@@@@@@@@@@@@@@@@@@@+XX", " XXX++##############++XXX ++++##################$$$++ XXX ++##########++ XXX ++$$$##################++++ XXX +@@+ XXX +@@@+++++++++++++++++++++++ XXX +@@+ XXX +++++++++++++++++++++++@@@+ ", " XX++##############++XX ++++###############$$$#++ XXX ++##########++ XXX ++#$$$###############++++ XXX +@@+ XXX +@@@+ XXX XXX +@@+ XXX XXX +@@@+ ", " ++$##############$++ X++++############$$$##++ XXX ++########++ XXX ++##$$$############++++X XXX +@@+ XXX +@@@+ XXX X ++ +@@+ ++ X XXX +@@@+ ", " ++$$############$$++ XX++++#########$$$###++ XXX++########++XXX ++###$$$#########++++XX XXX +@@+ XXX +@@@+ XXX +@@+ +@@+ +@@+ XXX +@@@+ ", " ++#$$$##########$$$#++ XXX++++######$$$####++ XXX++######++XXX ++####$$$######++++XXX XXX +@@+ XXX +@@@+ XXX +@@@+ +@@+ +@@@+ XXX +@@@+ ", " ++##$$$########$$$##++ XXX ++++###$$$#####++ XX++######++XX ++#####$$$###++++ XXX XXX +@@+ XXX +@@@+ XXX +@@@+ +@@+ +@@@+ XXX +@@@+ ", " ++####$$$$$$$$$$$$####++ XXXXX++++$$$######++ XX++$$$$++XX ++######$$$++++XXXXX XXXX+@@+XXXX +@@+XXXXXXXXX +@@@++@@++@@@+ XXXXXXXXX+@@+ ", " ++####$$$$$$$$$$$$####++ XXXXXXX++++$######++ XX++$$$$++XX ++######$++++XXXXXXX XXXX+@@+XXXX ++XXXXXXXXXX +@@@+@@+@@@+ XXXXXXXXXX++ ", " ++####$$$########$$$####++ XXX ++++#####++ XXX ++##++ XXX ++#####++++ XXX XXX +@@+ XXX XXX XXX X +@@@@@@@@+ X XXX XXX ", " ++###$$$##########$$$###++ XXX ++++###++ XXX ++##++ XXX ++###++++ XXX XXX +@@+ XXX XXX XXX XXX +@@@@@@+ XXX XXX XXX ", " ++###$$$############$$$###++ XXX X++++#++ XXX ++++ XXX ++#++++X XXX XXX +@@+ XXX XXX XXX XXX +@@@@+ XXX XXX XXX ", " ++++++++++++++++++++++++++++ XXX XX+++++ XXX ++++ XXX +++++XX XXX XXX +@@+ XXX XXX XXX XXX +@@+ XXX XXX XXX ", " ++++++++++++++++++++++++++++ XXX XXX+++ XXX ++ XXX +++XXX XXX XXX ++++ XXX XXX XXX XXX ++ XXX XXX XXX ", " XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX ", "XXXXXX XXXXXXXXXXXX XXXXXXXXXXXX XXXXXXXXXXXX XXXXXXXXXXXX XXXXXXXXXXXX XXXXXXXXXXXX XXXXXXXXXXXX XXXXXX", "XXXXXX XXXXXXXXXXXX XXXXXXXXXXXX XXXXXXXXXXXX XXXXXXXXXXXX XXXXXXXXXXXX XXXXXXXXXXXX XXXXXXXXXXXX XXXXXX", " XXX ooooo XXX XXX ooooo XXX XXX XXX XXX XXX XXX ooooo XXX XXX ooooo XXX XXX $$$$$ XXX XXX XXX ", " XXX ooooooooooo XXX XXX ooooooooooo XXX XXX XXX XXX XXX XXX ooooooooooo XXX XXX ooooooooooo XXX XXX $$$$$$$$$$$ XXX XXX XXX ", " XXoooooooooooooooXXX XXoooooooooooooooXXX XXX XXX XXX XXX XXoooooooooooooooXXX XXoooooooooooooooXXX XX$$$$$$$$$$$$$$$XXX XXX XXX ", " oooooooooooooooooX oooooooooooooooooX XXX XXX XXX XXX oooooooooooooooooX oooooooooooooooooX $$$$$$$$$$$$$$$$$X XXX XXX ", " ooooooo ooooooo ooooooo ooooooo XXX XXX XXX XXX ooooooooooooooooooooo ooooooo ooooooo $$$$$$$ $$$$$$$ XXX XXX ", " ooooo ooooo ooooo ooooo XXX XXX XXX XXX ooooooooooooooooooooo ooooo ooooo $$$$$ $$$$$ XXX XXX ", " oooo ooooo oooo oooo XXXXXXXXXXXX XXXXXXXXXXXX ooooooooooooooooooooooo oooo ooooo $$$$ o $$$$ XXXXXXXXXXXX ", " oooo XXX ooooo oooo oooo XXXXXXXXXXXX XXXXXXXXXXXX ooooooooooooooooooooooooo oooo ooooo $$$$ ooo $$$$ XXXXXXXXXXXX ", " ooo X X oooooo ooo ooo XXX XXX XXX XXX ooo o ooo o o ooo ooo oooooo $$$ ooo $$$ XXXOOOOOOOOXXX ", " oooo X X ooooooooo oooo oooo XXX XXX XXX XXX oooo ooooo ooo o ooo oooooo oooo XXXXXXXXXXXXooooooooo $$$$ ooo $$$$ XXXOOOOOOOOOOXXX ", " oooo X X ooooooooooo oooo oooo XXX oo XXX XXX XXX oooo oooooo o oo ooo oooooo oooo XOOOOOOOOOooooooooooo $$$$ ooo oooo $$$$ XXXOOOOOXXOOOOOXXX ", " ooo X XXXooooooooooooo ooo ooo XXX oo XXX XXX XXX oooo oooooo o oo ooo oooooo ooo XOOOOOOOooooooooooooo $$$ ooo oooooo $$$ XXXOOOOOXXXXOOOOOXXX ", " oooo XXX XXooooooooo oooo oooo oooo XXX oo XXX XXX XXX ooooo oooooo o oo ooo ooooooo oooo XOOOOOOooooooooo oooo $$$$ oooooooooo $$$$ XXXOOOOOOOXXOOOOOOOXXX ", " oooo XXXooooooooo oooo oooo oooo XXX oo XXX XXX XXX ooooo ooooooo ooo ooo ooooooo oooo XOOOOoooooooooX oooo $$$$ oooooo ooo $$$$ XXXOOOOOXOOXXOOXOOOOOXXX ", "Xoooo ooooooooo ooooXXXoooo ooooXXXXXXXX oooooooooo XXXXXXXXXXXX oooooooooo XXXXXXXooooo oooo ooo ooo oooooooXXXoooo XOOoooooooooXOX ooooXXX$$$$ oooo ooo $$$$XXXXXXXXOOOOOXXXXXXXXXXOOOOOXXXXXX", "Xoooo oooooooooXXX ooooXXXoooo ooooXXXXXXXX oooooooooo XXXXXXXXXXXX oooooooooo XXXXXXXooooo ooooooo ooo ooo oooooooXXXoooo XoooooooooOOXOX ooooXXX$$$$ ooo $$$$XXXXXXXXOOOOOXXXXXXXXXXOOOOOXXXXXX", " oooo oooooooooo XXXX oooo oooo oooo XXX oo XXX XXX XXX ooooo oooooo o oo ooo ooooooo oooo ooooooooooOOOXOX oooo $$$$ o ooo $$$$ XXXOOOOOXOOXXOOXOOOOOXXX ", " ooo ooooooooo X XX ooo ooo ooo XXX oo XXX XXX XXX oooo oooooo o oo ooo oooooo ooo oooooooooOOOOOXOX ooo $$$ o ooo $$$ XXXOOOOOOOXXOOOOOOOXXX ", " oooooooooooX X oooo oooo oooo XXX oo XXX XXX XXX oooo oooooo o oo ooo oooooo oooooooooooOOOOOOOXOX oooo $$$$ oo ooo $$$$ XXXOOOOOXXXXOOOOOXXX ", " ooooooooo X X oooo oooo oooo XXX oo XXX XXX XXX oooo ooooo ooo o ooo oooooo oooooooooOOOOOOOOOXOX oooo $$$$ ooooo $$$$ XXXOOOOOXXOOOOOXXX ", " oooooo X X oooo ooo oooo XXX XXX XXX XXX ooo o ooo o ooo ooooo ooooooXXXXXXXXXXXXOX oooo $$$ oooo $$$$ XXXOOOOOOOOOOXXX ", " ooooo XXXXXXXX oooo oooo oooo XXX XXX XXX XXX ooooooooooooooooooooooooo ooooo XOOOOOOOOOOOXX oooo $$$$ ooooooo $$$$ XXXOOOOOOOOXXX ", " oooooo XXX XX oooo oooo oooo XXXXXXXXXXXX XXXXXXXXXXXX ooooooooooooooooooooooo ooooooXXXXXXXXXXXXXoooo $$$$ ooooo $$$$ XXXXXXXXXXXX ", " ooooo XXX XXX ooooo ooooo ooooo XXXXXXXXXXXX XXXXXXXXXXXX ooooooooooooooooooooo ooooo ooooo $$$$$ $$$$$ XXXXXXXXXXXX ", " ooooooo ooooooo ooooooo ooooooo XXX XXX XXX XXX ooooooooooooooooooooo ooooooo ooooooo $$$$$$$ $$$$$$$ XXX XXX ", " ooooooooooooooooo ooooooooooooooooo XXX XXX XXX XXX ooooooooooooooooo ooooooooooooooooo $$$$$$$$$$$$$$$$$ XXX XXX ", " XoooooooooooooooXX XoooooooooooooooXX XXX XXX XXX XXX XoooooooooooooooXX XoooooooooooooooXX X$$$$$$$$$$$$$$$XX XXX XXX ", " XXX ooooooooooo XXX XXX ooooooooooo XXX XXX XXX XXX XXX XXX ooooooooooo XXX XXX ooooooooooo XXX XXX $$$$$$$$$$$ XXX XXX XXX ", " XXX ooooo XXX XXX ooooo XXX XXX XXX XXX XXX XXX ooooo XXX XXX ooooo XXX XXX $$$$$ XXX XXX XXX ", " XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX ", "XXXXXX XXXXXXXXXXXX XXXXXXXXXXXX XXXXXXXXXXXX XXXXXXXXXXXX XXXXXXXXXXXX XXXXXXXXXXXX XXXXXXXXXXXX XXXXXX", "###### ###### ", " ### ### ", " ### ### ", " ### ### ", " ### ### ", " ### ### ", " ### ### ", " ############ ", " ############ ", " ### ### ", " ### ### ", " ### ### ", " ### ### ", " ### ### ", " ### ### ", "###### ###### ", "###### ###### ", " ### ### ", " ### ### ", " ### ### ", " ### ### ", " ### ### ", " ### ### ", " ############ ", " ############ ", " ### ### ", " ### ### ", " ### ### ", " ### ### ", " ### ### ", " ### ### ", "###### ###### "}; xsok-1.02/lib/objects.xpm100644 144 62 30777 5665071060 14045 0ustar mbimathopt/* XPM */ static char * objects_xpm[] = { "128 96 5 1", " s None c None", ". c black", "X c yellow", "o c white", "O c red", " ............................. ............................. ", " .XXXXXXXXXXXXXXXXXXXXXXXXXXX. .XXXXXXXXXXXXXXXXXXXXXXXXXXX. ", " .XXXXXXXXXXXXXXXXXXXXXXXXXXX.. .XXXXXXXXXXXXXXXXXXXXXXXXXXX.. ......XXXXXXXXXXXXXXXX...... ", " oooooooo .XXXXXXXXXXXXXXXXXXXXXXXXXXX.. .XXXXXXXXXXXXXXXXXXXXXXXXXXX.. ......XXXXXXXXXXXXXXXX...... ", " o......o .XXXXXXXXXXXXXXXXXXXXXXXXXXX.X. .XXXX...XXXXXXXXXXXXX...XXXX.X. ..XXXXXXXXXXXXXXXXXXXXXXXX.. ", " o.oooooo.o .XXXXXXXXXXXXXXXXXXXXXXXXXXX.X. .XXXXX...XXXXXXXXXXX...XXXXX.X. ..XXXXXXXXXXXXXXXXXXXXXXXX.. ", " o.oooooo.o .XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX..XXXXXX...XXXXXXXXX...XXXXXX.XX. ..XX XX.. ", " o.oooooooo.o .XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX..XXXXXXX...XXXXXXX...XXXXXXX.XX. ..XX XX.. ", " o.o..oo..o.o .XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX..XXXXXXXX...XXXXX...XXXXXXXX.XX. XXXX XXXX ", " o.oooooooo.o .XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX..XXXXXXXXX...XXX...XXXXXXXXX.XX. XXXX XXXX ", " oo.o....o.oo .XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX..XXXXXXXXXX...X...XXXXXXXXXX.XX. XXXX XXXX ", " oo..oo..oo..oo .XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX..XXXXXXXXXXX.....XXXXXXXXXXX.XX. XXXX XXXX ", " o....o..o....o .XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX..XXXXXXXXXXXX...XXXXXXXXXXXX.XX. XXXX XXXX ", " o.o..o..o..o.o .XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX..XXXXXXXXXXX.....XXXXXXXXXXX.XX. XXXX XXXX ", " o.o...oo...o.o .XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX..XXXXXXXXXX...X...XXXXXXXXXX.XX. XXXX XXXX ", " o.oo........oo.o .XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX..XXXXXXXXX...XXX...XXXXXXXXX.XX. XXXX XXXX ", " o.oo........oo.o .XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX..XXXXXXXX...XXXXX...XXXXXXXX.XX. XXXX XXXX ", " o.ooo........ooo.o .XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX..XXXXXXX...XXXXXXX...XXXXXXX.XX. XXXX XXXX ", " o.ooo........ooo.o .XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX..XXXXXX...XXXXXXXXX...XXXXXX.XX. XXXX XXXX ", " o.ooo........ooo.o .XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX..XXXXX...XXXXXXXXXXX...XXXXX.XX. XXXX XXXX ", " o.oo........oo.o .XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX..XXXX...XXXXXXXXXXXXX...XXXX.XX. XXXX XXXX ", " o.oo........oo.o .XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX..XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX. XXXX XXXX ", " o.o..........o.o .XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX..XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX. XXXX XXXX ", " o............o .XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX..XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX. XXXX XXXX ", " o..........o .............................XX..............................XX. ..XX XX.. ", " o........oo .XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX..XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX. ..XX XX.. ", " o.o.oooo.o.o .XXXXXXXXXXXXXXXXXXXXXXXXXXX.X. .XXXXXXXXXXXXXXXXXXXXXXXXXXX.X. ..XXXXXXXXXXXXXXXXXXXXXXXX.. ", " o.....oo.....o .XXXXXXXXXXXXXXXXXXXXXXXXXXX.X. .XXXXXXXXXXXXXXXXXXXXXXXXXXX.X. ..XXXXXXXXXXXXXXXXXXXXXXXX.. ", " o......oo......o .XXXXXXXXXXXXXXXXXXXXXXXXXXX.. .XXXXXXXXXXXXXXXXXXXXXXXXXXX.. ......XXXXXXXXXXXXXXXX...... ", " o.......oo.......o .XXXXXXXXXXXXXXXXXXXXXXXXXXX.. .XXXXXXXXXXXXXXXXXXXXXXXXXXX.. ......XXXXXXXXXXXXXXXX...... ", " o..o..o..oo.oo..o..o .XXXXXXXXXXXXXXXXXXXXXXXXXXX. .XXXXXXXXXXXXXXXXXXXXXXXXXXX. ", " oooooooooooooooooooo ............................. ............................. ", "............................. ............................. ............................. ", ".XXXXXXXXXXXXXXXXXXXXXXXXXXX. .XXXXXXXXXXXXXXXXXXXXXXXXXXX. .XXXXXXXXXXXXXXXXXXXXXXXXXXX. ", ".XXXXXXXXXXXXXXXXXXXXXXXXXXX.. .XXXXXXXXXXXXXXXXXXXXXXXXXXX.. .XXXXXXXXXXXXXXXXXXXXXXXXXXX.. ......XXXXXXXXXXXXXXXX...... ", ".XXXXXXXXXXXXXXXXXXXXXXXXXXX.. .XXXXXXXXXXXXX.XXXXXXXXXXXXX.. .XXXXXXXXXXXXX.XXXXXXXXXXXXX.. ......XXXXXXXXXXXXXXXX...... ", ".XXXXXXXXXXXXXXXXXXXXXXXXXXX.X. .XXXXXXXXXXXX...XXXXXXXXXXXX.X. .XXXXXXXXXXXX...XXXXXXXXXXXX.X. ..XXXXXXXXX......XXXXXXXXX.. ", ".XXXXXXXXXXXXXXXXXXXXXXXXXXX.X. .XXXXXXXXXXX.....XXXXXXXXXXX.X. .XXXXXXXXXXX.....XXXXXXXXXXX.X. ..XXXXXXXX.oooooo.XXXXXXXX.. ", ".XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX..XXXXXXXXXX.......XXXXXXXXXX.XX..XXXXXXXXXX.......XXXXXXXXXX.XX. ..XX o.oooooo.o XX.. ", ".XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX..XXXXXXXXX.........XXXXXXXXX.XX..XXXXXXXXX.........XXXXXXXXX.XX. ..XX o.oooooooo.o XX.. ", ".XXXXXX.XXXXXXXXXXXXX.XXXXXX.XX..XXXXXXXXXXXXX.XXXXXXXXXXXXX.XX..XXXXXX.XXXXXX.XXXXXX.XXXXXX.XX. XXXX o.o..oo..o.o XXXX ", ".XXXXX..XXXXXXXXXXXXX..XXXXX.XX..XXXXXXXXXXXXX.XXXXXXXXXXXXX.XX..XXXXX..XXXXXX.XXXXXX..XXXXX.XX. XXXX o.oooooooo.o XXXX ", ".XXXX...XXXXXXXXXXXXX...XXXX.XX..XXXXXXXXXXXXX.XXXXXXXXXXXXX.XX..XXXX...XXXXXX.XXXXXX...XXXX.XX. XXXX oo.o....o.oo XXXX ", ".XXX....XXXXXXXXXXXXX....XXX.XX..XXXXXXXXXXXXX.XXXXXXXXXXXXX.XX..XXX....XXXXXX.XXXXXX....XXX.XX. XXXX oo..oo..oo..oo XXXX ", ".XX.......................XX.XX..XXXXXXXXXXXXX.XXXXXXXXXXXXX.XX..XX.......................XX.XX. XXXX o....o..o....o XXXX ", ".XXX....XXXXXXXXXXXXX....XXX.XX..XXXXXXXXXXXXX.XXXXXXXXXXXXX.XX..XXX....XXXXXX.XXXXXX....XXX.XX. XXXX o.o..o..o..o.o XXXX ", ".XXXX...XXXXXXXXXXXXX...XXXX.XX..XXXXXXXXXXXXX.XXXXXXXXXXXXX.XX..XXXX...XXXXXX.XXXXXX...XXXX.XX. XXXX o.o...oo...o.o XXXX ", ".XXXXX..XXXXXXXXXXXXX..XXXXX.XX..XXXXXXXXXXXXX.XXXXXXXXXXXXX.XX..XXXXX..XXXXXX.XXXXXX..XXXXX.XX. XXXX o.oo........oo.o XXXX ", ".XXXXXX.XXXXXXXXXXXXX.XXXXXX.XX..XXXXXXXXXXXXX.XXXXXXXXXXXXX.XX..XXXXXX.XXXXXX.XXXXXX.XXXXXX.XX. XXXX o.oo........oo.o XXXX ", ".XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX..XXXXXXXXX.........XXXXXXXXX.XX..XXXXXXXXX.........XXXXXXXXX.XX. XXXX o.ooo........ooo.o XXXX ", ".XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX..XXXXXXXXXX.......XXXXXXXXXX.XX..XXXXXXXXXX.......XXXXXXXXXX.XX. XXXX o.ooo........ooo.o XXXX ", ".XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX..XXXXXXXXXXX.....XXXXXXXXXXX.XX..XXXXXXXXXXX.....XXXXXXXXXXX.XX. XXXX o.ooo........ooo.o XXXX ", ".XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX..XXXXXXXXXXXX...XXXXXXXXXXXX.XX..XXXXXXXXXXXX...XXXXXXXXXXXX.XX. XXXX o.oo........oo.o XXXX ", ".XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX..XXXXXXXXXXXXX.XXXXXXXXXXXXX.XX..XXXXXXXXXXXXX.XXXXXXXXXXXXX.XX. XXXX o.oo........oo.o XXXX ", ".XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX..XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX..XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX. XXXX o.o..........o.o XXXX ", ".XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX..XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX..XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX. XXXX o............o XXXX ", ".............................XX..............................XX..............................XX. ..XX o..........o XX.. ", ".XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX..XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX..XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX. ..XX o........oo XX.. ", " .XXXXXXXXXXXXXXXXXXXXXXXXXXX.X. .XXXXXXXXXXXXXXXXXXXXXXXXXXX.X. .XXXXXXXXXXXXXXXXXXXXXXXXXXX.X. ..XXXXXXX.o.XXXX.o.XXXXXXX.. ", " .XXXXXXXXXXXXXXXXXXXXXXXXXXX.X. .XXXXXXXXXXXXXXXXXXXXXXXXXXX.X. .XXXXXXXXXXXXXXXXXXXXXXXXXXX.X. ..XXXXXX.....XX.....XXXXXX.. ", " .XXXXXXXXXXXXXXXXXXXXXXXXXXX.. .XXXXXXXXXXXXXXXXXXXXXXXXXXX.. .XXXXXXXXXXXXXXXXXXXXXXXXXXX.. .....XX......XX......XX..... ", " .XXXXXXXXXXXXXXXXXXXXXXXXXXX.. .XXXXXXXXXXXXXXXXXXXXXXXXXXX.. .XXXXXXXXXXXXXXXXXXXXXXXXXXX.. .....X.......XX.......X..... ", " .XXXXXXXXXXXXXXXXXXXXXXXXXXX. .XXXXXXXXXXXXXXXXXXXXXXXXXXX. .XXXXXXXXXXXXXXXXXXXXXXXXXXX. .. .. . . .. .. ", " ............................. ............................. ............................. ", "............................. ............................. ............................. ............................. ", ".OOOOOOOOOOOOOOOOOOOOOOOOOOO. .OOOOOOOOOOOOOOOOOOOOOOOOOOO. .OOOOOOOOOOOOOOOOOOOOOOOOOOO. .OOOOOOOOOOOOOOOOOOOOOOOOOOO. ", ".OOOOOOOOOOOOOOOOOOOOOOOOOOO.. .OOOOOOOOOOOOOOOOOOOOOOOOOOO.. .OOOOOOOOOOOOOOOOOOOOOOOOOOO.. .OOOOOOOOOOOOOOOOOOOOOOOOOOO.. ", ".OOOOOOOOOOOOO.OOOOOOOOOOOOO.. .OOOOOOOOOOOOOOOOOOOOOOOOOOO.. .OOOOOOOOOOOOOOOOOOOOOOOOOOO.. .OOOOOOOOOOOOOOOOOOOOOOOOOOO.. ", ".OOOOOOOOOOOO...OOOOOOOOOOOO.X. .OOOOOOOOOOOOOOOOOOOOOOOOOOO.X. .OOOOOOOOOOOOO.OOOOOOOOOOOOO.X. .OOOOOOOOOOOOOOOOOOOOOOOOOOO.X. ", ".OOOOOOOOOOO.....OOOOOOOOOOO.X. .OOOOOOOOOOOOOOOOOOOOOOOOOOO.X. .OOOOOOOOOOOOO.OOOOOOOOOOOOO.X. .OOOOOOOOOOOOOOOOOOOOOOOOOOO.X. ", ".OOOOOOOOOO.......OOOOOOOOOO.XX..OOOOOOOOOOOOOOOOOOOOOOOOOOO.XX..OOOOOOOOOOOOO.OOOOOOOOOOOOO.XX..OOOOOOOOOOOOOOOOOOOOOOOOOOO.XX.", ".OOOOOOOOO.........OOOOOOOOO.XX..OOOOOOOOOOOOOOOOOOOOOOOOOOO.XX..OOOOOOOOOOOOO.OOOOOOOOOOOOO.XX..OOOOOOOOOOOOOOOOOOOOOOOOOOO.XX.", ".OOOOOOOOOOOOO.OOOOOOOOOOOOO.XX..OOOOOO.OOOOOOOOOOOOOOOOOOOO.XX..OOOOOOOOOOOOO.OOOOOOOOOOOOO.XX..OOOOOOOOOOOOOOOOOOOO.OOOOOO.XX.", ".OOOOOOOOOOOOO.OOOOOOOOOOOOO.XX..OOOOO..OOOOOOOOOOOOOOOOOOOO.XX..OOOOOOOOOOOOO.OOOOOOOOOOOOO.XX..OOOOOOOOOOOOOOOOOOOO..OOOOO.XX.", ".OOOOOOOOOOOOO.OOOOOOOOOOOOO.XX..OOOO...OOOOOOOOOOOOOOOOOOOO.XX..OOOOOOOOOOOOO.OOOOOOOOOOOOO.XX..OOOOOOOOOOOOOOOOOOOO...OOOO.XX.", ".OOOOOOOOOOOOO.OOOOOOOOOOOOO.XX..OOO....OOOOOOOOOOOOOOOOOOOO.XX..OOOOOOOOOOOOO.OOOOOOOOOOOOO.XX..OOOOOOOOOOOOOOOOOOOO....OOO.XX.", ".OOOOOOOOOOOOO.OOOOOOOOOOOOO.XX..OO.....................OOOO.XX..OOOOOOOOOOOOO.OOOOOOOOOOOOO.XX..OOO......................OO.XX.", ".OOOOOOOOOOOOO.OOOOOOOOOOOOO.XX..OOO....OOOOOOOOOOOOOOOOOOOO.XX..OOOOOOOOOOOOO.OOOOOOOOOOOOO.XX..OOOOOOOOOOOOOOOOOOOO....OOO.XX.", ".OOOOOOOOOOOOO.OOOOOOOOOOOOO.XX..OOOO...OOOOOOOOOOOOOOOOOOOO.XX..OOOOOOOOOOOOO.OOOOOOOOOOOOO.XX..OOOOOOOOOOOOOOOOOOOO...OOOO.XX.", ".OOOOOOOOOOOOO.OOOOOOOOOOOOO.XX..OOOOO..OOOOOOOOOOOOOOOOOOOO.XX..OOOOOOOOOOOOO.OOOOOOOOOOOOO.XX..OOOOOOOOOOOOOOOOOOOO..OOOOO.XX.", ".OOOOOOOOOOOOO.OOOOOOOOOOOOO.XX..OOOOOO.OOOOOOOOOOOOOOOOOOOO.XX..OOOOOOOOOOOOO.OOOOOOOOOOOOO.XX..OOOOOOOOOOOOOOOOOOOO.OOOOOO.XX.", ".OOOOOOOOOOOOO.OOOOOOOOOOOOO.XX..OOOOOOOOOOOOOOOOOOOOOOOOOOO.XX..OOOOOOOOO.........OOOOOOOOO.XX..OOOOOOOOOOOOOOOOOOOOOOOOOOO.XX.", ".OOOOOOOOOOOOO.OOOOOOOOOOOOO.XX..OOOOOOOOOOOOOOOOOOOOOOOOOOO.XX..OOOOOOOOOO.......OOOOOOOOOO.XX..OOOOOOOOOOOOOOOOOOOOOOOOOOO.XX.", ".OOOOOOOOOOOOO.OOOOOOOOOOOOO.XX..OOOOOOOOOOOOOOOOOOOOOOOOOOO.XX..OOOOOOOOOOO.....OOOOOOOOOOO.XX..OOOOOOOOOOOOOOOOOOOOOOOOOOO.XX.", ".OOOOOOOOOOOOO.OOOOOOOOOOOOO.XX..OOOOOOOOOOOOOOOOOOOOOOOOOOO.XX..OOOOOOOOOOOO...OOOOOOOOOOOO.XX..OOOOOOOOOOOOOOOOOOOOOOOOOOO.XX.", ".OOOOOOOOOOOOOOOOOOOOOOOOOOO.XX..OOOOOOOOOOOOOOOOOOOOOOOOOOO.XX..OOOOOOOOOOOOO.OOOOOOOOOOOOO.XX..OOOOOOOOOOOOOOOOOOOOOOOOOOO.XX.", ".OOOOOOOOOOOOOOOOOOOOOOOOOOO.XX..OOOOOOOOOOOOOOOOOOOOOOOOOOO.XX..OOOOOOOOOOOOOOOOOOOOOOOOOOO.XX..OOOOOOOOOOOOOOOOOOOOOOOOOOO.XX.", ".OOOOOOOOOOOOOOOOOOOOOOOOOOO.XX..OOOOOOOOOOOOOOOOOOOOOOOOOOO.XX..OOOOOOOOOOOOOOOOOOOOOOOOOOO.XX..OOOOOOOOOOOOOOOOOOOOOOOOOOO.XX.", ".............................XX..............................XX..............................XX..............................XX.", ".XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX..XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX..XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX..XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX.", " .XXXXXXXXXXXXXXXXXXXXXXXXXXX.X. .XXXXXXXXXXXXXXXXXXXXXXXXXXX.X. .XXXXXXXXXXXXXXXXXXXXXXXXXXX.X. .XXXXXXXXXXXXXXXXXXXXXXXXXXX.X.", " .XXXXXXXXXXXXXXXXXXXXXXXXXXX.X. .XXXXXXXXXXXXXXXXXXXXXXXXXXX.X. .XXXXXXXXXXXXXXXXXXXXXXXXXXX.X. .XXXXXXXXXXXXXXXXXXXXXXXXXXX.X.", " .XXXXXXXXXXXXXXXXXXXXXXXXXXX.. .XXXXXXXXXXXXXXXXXXXXXXXXXXX.. .XXXXXXXXXXXXXXXXXXXXXXXXXXX.. .XXXXXXXXXXXXXXXXXXXXXXXXXXX..", " .XXXXXXXXXXXXXXXXXXXXXXXXXXX.. .XXXXXXXXXXXXXXXXXXXXXXXXXXX.. .XXXXXXXXXXXXXXXXXXXXXXXXXXX.. .XXXXXXXXXXXXXXXXXXXXXXXXXXX..", " .XXXXXXXXXXXXXXXXXXXXXXXXXXX. .XXXXXXXXXXXXXXXXXXXXXXXXXXX. .XXXXXXXXXXXXXXXXXXXXXXXXXXX. .XXXXXXXXXXXXXXXXXXXXXXXXXXX.", " ............................. ............................. ............................. ............................."}; xsok-1.02/lib/keys100644 144 62 1005 6123002161 12504 0ustar mbimathopt#c This file does contain the key definitions for xsok version 1.0 y Confirm n Cancel q rq_LeaveSok k Up h Left j Down l Right v ShowVersion a ShowAuthor i LevelInfo u UndoMove r RedoMove ? ShowScore b ShowBestScore s SaveGame c DropBookmark d DropBookmark #x15 GotoBookmark g GotoBookmark R RestartGame H ReadScores N NextLevel P PrevLevel L LoadGame W ResizeWindow U rq_NextUnsolved ( StartMacro ) EndMacro #x0a PlayMacro Up Up Left Left Down Down Right Right Mouse1 MouseMove Mouse2 MouseDrag Mouse3 MouseUndo xsok-1.02/lib/Makefile100644 144 62 1162 5665071060 13270 0ustar mbimathopt# Makefile for xsok-1.00 XSOKZIP = gzip -f -9 TARGETS = Sokoban.def.gz Xsok.def.gz Cyberbo.def.gz \ floor.xpm.gz objects.xpm.gz all: $(TARGETS) Sokoban.def.gz: Sokoban ../src/combine -s Sokoban && $(XSOKZIP) Sokoban.def # truncate filename to 14 chars Cyberbo.def.gz: Cyberbox ../src/combine -s Cyberbox && mv Cyberbox.def Cyberbo.def \ && $(XSOKZIP) Cyberbo.def Xsok.def.gz: Xsok ../src/combine -s Xsok && $(XSOKZIP) Xsok.def floor.xpm.gz: floor.xpm $(XSOKZIP) -c floor.xpm > floor.xpm.gz objects.xpm.gz: objects.xpm $(XSOKZIP) -c objects.xpm > objects.xpm.gz # clean target: clean: rm -f *~ */*~ $(TARGETS) xsok-1.02/lib/keys.help100644 144 62 1406 6123002267 13447 0ustar mbimathoptStandard xsok key bindings ========================== a Display the author of a level (if known). b Drops the bookmark. g Goto bookmark. i Displays the level comment (if any). s Saves the current position. L Reloads a saved game. R Restart this level. H Reread the highscore table. N Proceed to the next level. P Return to the previous level. U Proceeds to the next unsolved level. q Quits the game. v Shows the version of xsok. ? Shows the current score. c Drops the bookmark at the current position. u Undoes the last move. r Redoes last move. (undoes an undo) ( Start macro recording ) End macro recording Replay recorded macro Mouse Bindings ============== button1 move man to specified square button2 drag box button3 undo xsok-1.02/lib/Sokoban.score100644 144 62 2260 5751517056 14267 0ustar mbimathoptt9ЦFеKc{NЩH’LOaЧR‰ЋPwUЕXђ_зYJUЦ4I:R‘SQј~RV‹a@\!OѕaОe—[CTыgдZOWNTVUŒ^{b‰@&g.S}UСu1B@uYMP#Z8Ё­MAPЛCƒ@ѓW‰[‰NсZXYœUŠW_P fЃXмRQћV[W`юLyQы[б\іV/GYљWk\?EŒ?9LvJ/KN‘CоMмNЎLэ…YVјџџџ№ts‘BEw`)З[*3ЊrKЎњžЄУ10iG\зкžˆЯpњ/}_X%ПЇЂ'ЉБwUгnži“вO;ПšHЉSQжmWЏ/еДŸJku"Ъфџбџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџa‡Žmnrшэѕмђя’ие’.м—\д6ŠХm8ИыРЎŠ |yЈJё –У>џпЮž6mФХ†сящЖ§Я‰лЋ™ЇSB2Нфc АŒИяЫ•аЁOškЛџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџxsok-1.02/lib/Xsok.score100644 144 62 2260 5665071060 13611 0ustar mbimathoptt56D§I(P)UџџџvcRДOџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ"џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџxsok-1.02/lib/Sokoban.help100644 144 62 317 5665071060 14057 0ustar mbimathoptA Short Overview on Sokoban =========================== There are yellow boxes, and yellow marked target squares. The goal is to push all boxes onto the target squares. You can only push one box at a time. xsok-1.02/lib/Cyberbox.help100644 144 62 142 5665071060 14234 0ustar mbimathoptA Short Overview on Cyberbox ============================ How volunteers to write this doc file? xsok-1.02/lib/Xsok.help100644 144 62 132 5665071060 13402 0ustar mbimathoptA Short Overview on Xsok ======================== How volunteers to write this doc file? xsok-1.02/lib/Cyberbox.score100644 144 62 2260 5665071060 14442 0ustar mbimathopttЗŒrœЎ˜ ІƒlpŽ<št`џџџ<V,0("E\X:Œ.Thџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ    & џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџxsok-1.02/solver/ 40755 144 62 0 5665071060 12277 5ustar mbimathoptxsok-1.02/solver/Makefile100644 144 62 154 5665071060 14014 0ustar mbimathoptCFLAGS = -g -Wall -O2 LDFLAGS = -s -N all: solve solve: solve.o BFS.o crc16.o clean: rm -f *~ *.o solve xsok-1.02/solver/Sokoban.01.txt100644 144 62 102043 5665071060 15010 0ustar mbimathoptHP-UX uglybit A.09.01 A 9000/715 2009311111 two-user license Sun Nov 13 11:17:28 MET 1994 ################### #####. .########### #####$ ########### ##### $########### ###. $ $.########## ### # ## ########## #. # ## #####. # #.$ $ # ##### ### #.##. # #####. .######### ################### 45 squares for boxes, 6 boxes, 56 total squares 8.145060e+06 possibilities solpos has 6 targets: 19 20 35 36 40 41 mem = 201326592, mem for hash = 50331648 Using 24 hashbits and 12582912 data entries (6 boxes) BFS memory usage: 50331645 byte for hashtable 138412032 byte for data 1 items stored at level 0 ( 1 total), (1 searches, 0 misses) 3 items stored at level 1 ( 4 total), (3 searches, 0 misses) 5 items stored at level 2 ( 9 total), (7 searches, 0 misses) 8 items stored at level 3 ( 17 total), (10 searches, 0 misses) 17 items stored at level 4 ( 34 total), (22 searches, 0 misses) 36 items stored at level 5 ( 70 total), (56 searches, 0 misses) 79 items stored at level 6 ( 149 total), (155 searches, 0 misses) 156 items stored at level 7 ( 305 total), (352 searches, 0 misses) 259 items stored at level 8 ( 564 total), (631 searches, 1 misses) 375 items stored at level 9 ( 939 total), (965 searches, 12 misses) 487 items stored at level 10 ( 1426 total), (1309 searches, 56 misses) 617 items stored at level 11 ( 2043 total), (1691 searches, 91 misses) 775 items stored at level 12 ( 2818 total), (2180 searches, 189 misses) 971 items stored at level 13 ( 3789 total), (2805 searches, 359 misses) 1208 items stored at level 14 ( 4997 total), (3601 searches, 595 misses) 1524 items stored at level 15 ( 6521 total), (4686 searches, 899 misses) 1940 items stored at level 16 ( 8461 total), (6194 searches, 1369 misses) 2473 items stored at level 17 ( 10934 total), (8170 searches, 2074 misses) 3153 items stored at level 18 ( 14087 total), (10602 searches, 3050 misses) 3969 items stored at level 19 ( 18056 total), (13498 searches, 4418 misses) 4934 items stored at level 20 ( 22990 total), (16903 searches, 6425 misses) 6029 items stored at level 21 ( 29019 total), (20846 searches, 9240 misses) 7237 items stored at level 22 ( 36256 total), (25199 searches, 13287 misses) 8542 items stored at level 23 ( 44798 total), (29821 searches, 18984 misses) 9886 items stored at level 24 ( 54684 total), (34360 searches, 26305 misses) 11231 items stored at level 25 ( 65915 total), (38547 searches, 35118 misses) 12471 items stored at level 26 ( 78386 total), (42307 searches, 45721 misses) 13618 items stored at level 27 ( 92004 total), (45938 searches, 58718 misses) 14701 items stored at level 28 (106705 total), (49847 searches, 74504 misses) 15834 items stored at level 29 (122539 total), (54561 searches, 94740 misses) 17128 items stored at level 30 (139667 total), (60365 searches, 120965 misses) 18670 items stored at level 31 (158337 total), (67523 searches, 152969 misses) 20349 items stored at level 32 (178686 total), (75658 searches, 193669 misses) 22047 items stored at level 33 (200733 total), (84055 searches, 240987 misses) 23682 items stored at level 34 (224415 total), (92135 searches, 295413 misses) 25261 items stored at level 35 (249676 total), (99790 searches, 357481 misses) 26816 items stored at level 36 (276492 total), (106853 searches, 425103 misses) 28408 items stored at level 37 (304900 total), (113799 searches, 502407 misses) 30011 items stored at level 38 (334911 total), (120509 searches, 587645 misses) 31480 items stored at level 39 (366391 total), (125904 searches, 676367 misses) 32581 items stored at level 40 (398972 total), (128735 searches, 757374 misses) 33148 items stored at level 41 (432120 total), (128807 searches, 823149 misses) 33198 items stored at level 42 (465318 total), (127077 searches, 874864 misses) 32908 items stored at level 43 (498226 total), (124994 searches, 922178 misses) 32412 items stored at level 44 (530638 total), (123316 searches, 968653 misses) 31784 items stored at level 45 (562422 total), (122437 searches, 1020480 misses) 31151 items stored at level 46 (593573 total), (122306 searches, 1079098 misses) 30582 items stored at level 47 (624155 total), (122393 searches, 1145713 misses) 30122 items stored at level 48 (654277 total), (122404 searches, 1216098 misses) 29689 items stored at level 49 (683966 total), (121790 searches, 1280608 misses) 29223 items stored at level 50 (713189 total), (120356 searches, 1334069 misses) 28722 items stored at level 51 (741911 total), (117897 searches, 1367469 misses) 28210 items stored at level 52 (770121 total), (114933 searches, 1393731 misses) 27595 items stored at level 53 (797716 total), (111484 searches, 1409948 misses) 26912 items stored at level 54 (824628 total), (107296 searches, 1412897 misses) 26135 items stored at level 55 (850763 total), (102317 searches, 1400819 misses) 25190 items stored at level 56 (875953 total), (96710 searches, 1371566 misses) 23949 items stored at level 57 (899902 total), (90356 searches, 1324099 misses) 22418 items stored at level 58 (922320 total), (83564 searches, 1263061 misses) 20636 items stored at level 59 (942956 total), (76761 searches, 1190802 misses) 18637 items stored at level 60 (961593 total), (69855 searches, 1110852 misses) 16638 items stored at level 61 (978231 total), (63161 searches, 1028775 misses) 14744 items stored at level 62 (992975 total), (56944 searches, 946538 misses) 13041 items stored at level 63 (1006016 total), (51334 searches, 868080 misses) 11503 items stored at level 64 (1017519 total), (46020 searches, 787330 misses) 10192 items stored at level 65 (1027711 total), (40884 searches, 708634 misses) 9059 items stored at level 66 (1036770 total), (35863 searches, 629236 misses) 8104 items stored at level 67 (1044874 total), (31270 searches, 554430 misses) 7313 items stored at level 68 (1052187 total), (27179 searches, 486699 misses) 6637 items stored at level 69 (1058824 total), (23529 searches, 424967 misses) 6007 items stored at level 70 (1064831 total), (20321 searches, 368975 misses) 5398 items stored at level 71 (1070229 total), (17434 searches, 319805 misses) 4819 items stored at level 72 (1075048 total), (14796 searches, 273935 misses) 4248 items stored at level 73 (1079296 total), (12471 searches, 233047 misses) 3675 items stored at level 74 (1082971 total), (10436 searches, 195965 misses) 3133 items stored at level 75 (1086104 total), (8747 searches, 164782 misses) 2597 items stored at level 76 (1088701 total), (7353 searches, 138137 misses) 2079 items stored at level 77 (1090780 total), (6104 searches, 113664 misses) 1637 items stored at level 78 (1092417 total), (4966 searches, 91650 misses) 1283 items stored at level 79 (1093700 total), (3951 searches, 72572 misses) 1027 items stored at level 80 (1094727 total), (3137 searches, 57885 misses) 832 items stored at level 81 (1095559 total), (2448 searches, 45404 misses) 685 items stored at level 82 (1096244 total), (1891 searches, 35388 misses) 568 items stored at level 83 (1096812 total), (1438 searches, 27083 misses) 467 items stored at level 84 (1097279 total), (1071 searches, 19888 misses) 385 items stored at level 85 (1097664 total), (799 searches, 14695 misses) 325 items stored at level 86 (1097989 total), (592 searches, 10921 misses) 265 items stored at level 87 (1098254 total), (424 searches, 7643 misses) 205 items stored at level 88 (1098459 total), (293 searches, 5159 misses) 163 items stored at level 89 (1098622 total), (202 searches, 3623 misses) 128 items stored at level 90 (1098750 total), (155 searches, 2706 misses) 89 items stored at level 91 (1098839 total), (119 searches, 2068 misses) 52 items stored at level 92 (1098891 total), (72 searches, 1292 misses) 27 items stored at level 93 (1098918 total), (33 searches, 586 misses) 16 items stored at level 94 (1098934 total), (22 searches, 358 misses) 8 items stored at level 95 (1098942 total), (20 searches, 373 misses) 7 items stored at level 96 (1098949 total), (11 searches, 171 misses) found the solution with 97 pushes! Position after 97 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####:::########### ###.::::.########## ###:#:##:########## #.::#:##:#####.:$$# #.::::::::::::::$$# #####:###:#.##.:$$# #####.:::.######### ################### Position after 96 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####:::########### ###.::::.########## ###:#:##:########## #.::#:##:#####.:$$# #.:::::::::::::$ $# #####:###:#.##.:$$# #####.:::.######### ################### Position after 95 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####:::########### ###.::::.########## ###:#:##:########## #.::#:##:#####. $$# #.::::::::::::$ $# #####:###:#.##. $$# #####.:::.######### ################### Position after 94 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####:::########### ###.::::.########## ###:#:##:########## #.::#:##:#####. $$# #.:::::::::::$ $# #####:###:#.##. $$# #####.:::.######### ################### Position after 93 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####:::########### ###.::::.########## ###:#:##:########## #.::#:##:#####. $$# #.::::::::::$ $# #####:###:#.##. $$# #####.:::.######### ################### Position after 92 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####:::########### ###.::::.########## ###:#:##:########## #.::#:##:#####. $$# #.:::::::::$ $# #####:###:#.##. $$# #####.:::.######### ################### Position after 91 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####:::########### ###.::::.########## ###:#:##:########## #.::#:##:#####. $$# #.::::::::$ $# #####:###:#.##. $$# #####.:::.######### ################### Position after 90 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####:::########### ###.::::.########## ###:#:##:########## #.::#:##:#####. $$# #.:::::::$ $# #####:###:#.##. $$# #####.:::.######### ################### Position after 89 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####:::########### ###.::::.########## ###:#:##:########## #.::#:##:#####.:$$# #.::::::$::::::::$# #####:###:#.##.:$$# #####.:::.######### ################### Position after 88 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####:::########### ###.::::.########## ###:#:##:########## #.::#:##:#####.:$$# #.::::::$:::::::$ # #####:###:#.##.:$$# #####.:::.######### ################### Position after 87 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####:::########### ###.::::.########## ###:#:##:########## #.::#:##:#####.$ $# #.::::::$:::::::$ # #####:###:#.##.:$$# #####.:::.######### ################### Position after 86 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####:::########### ###.::::.########## ###:#:##:########## #.::#:##:#####.::$# #.::::::$::::::$$ # #####:###:#.##.:$$# #####.:::.######### ################### Position after 85 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####:::########### ###.::::.########## ###:#:##:########## #.::#:##:#####. $# #.::::::$:::::$ $ # #####:###:#.##. $$# #####.:::.######### ################### Position after 84 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####:::########### ###.::::.########## ###:#:##:########## #.::#:##:#####. $# #.::::::$::::$ $ # #####:###:#.##. $$# #####.:::.######### ################### Position after 83 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####:::########### ###.::::.########## ###:#:##:########## #.::#:##:#####. $# #.::::::$:::$ $ # #####:###:#.##. $$# #####.:::.######### ################### Position after 82 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####:::########### ###.::::.########## ###:#:##:########## #.::#:##:#####. $# #.::::::$::$ $ # #####:###:#.##. $$# #####.:::.######### ################### Position after 81 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####:::########### ###.::::.########## ###:#:##:########## #.::#:##:#####. $# #.::::::$:$ $ # #####:###:#.##. $$# #####.:::.######### ################### Position after 80 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####:::########### ###.::::.########## ###:#:##:########## #.::#:##:#####. $# #.:::::$::$ $ # #####:###:#.##. $$# #####.:::.######### ################### Position after 79 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####:::########### ###.::::.########## ###:#:##:########## #.::#:##:#####. $# #.:::::$:$ $ # #####:###:#.##. $$# #####.:::.######### ################### Position after 78 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####:::########### ###.::::.########## ###:#:##:########## #.::#:##:#####. $# #.::::$::$ $ # #####:###:#.##. $$# #####.:::.######### ################### Position after 77 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####:::########### ###.::::.########## ###:#:##:########## #.::#:##:#####. $# #.:::$:::$ $ # ##### ### #.##. $$# #####. .######### ################### Position after 76 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####:::########### ###.::::.########## ###:#:##:########## #.::#$##:#####. $# #.:::::::$ $ # #####:###:#.##. $$# #####.:::.######### ################### Position after 75 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####:::########### ###.::::.########## ###:#:##:########## #.::#$##:#####.::$# #.::::::$:::::::$ # #####:###:#.##.:$$# #####.:::.######### ################### Position after 74 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####:::########### ###.::::.########## ###:#:##:########## #.::#$##:#####.:$ # #.::::::$:::::::$ # #####:###:#.##.:$$# #####.:::.######### ################### Position after 73 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####:::########### ###.::::.########## ###:#:##:########## #.::#$##:#####.$ # #.::::::$:::::::$ # #####:###:#.##.:$$# #####.:::.######### ################### Position after 72 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####:::########### ###.::::.########## ###:#:##:########## #.::#$##:#####.:::# #.::::::$::::::$$:# #####:###:#.##.:$$# #####.:::.######### ################### Position after 71 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####:::########### ###.::::.########## ###:#:##:########## #.::#$##:#####.:::# #.::::::$::::::$$:# #####:###:#.##.$ $# #####.:::.######### ################### Position after 70 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####:::########### ###.::::.########## ###:#:##:########## #.::#$##:#####. # #.::::::$:::::$ $ # #####:###:#.##.$ $# #####.:::.######### ################### Position after 69 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####:::########### ###.::::.########## ###:#:##:########## #.::#$##:#####. # #.::::::$::::$ $ # #####:###:#.##.$ $# #####.:::.######### ################### Position after 68 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####:::########### ###.::::.########## ###:#:##:########## #.::#$##:#####. # #.::::::$:::$ $ # #####:###:#.##.$ $# #####.:::.######### ################### Position after 67 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####:::########### ###.::::.########## ###:#:##:########## #.::#$##:#####. # #.::::::$::$ $ # #####:###:#.##.$ $# #####.:::.######### ################### Position after 66 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####:::########### ###.::::.########## ###:#:##:########## #.::#$##:#####. # #.::::::$:$ $ # #####:###:#.##.$ $# #####.:::.######### ################### Position after 65 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####:::########### ###.::::.########## ###:#:##:########## #.::#$##:#####. # #.:::::$::$ $ # #####:###:#.##.$ $# #####.:::.######### ################### Position after 64 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####:::########### ###.::::.########## ###:#:##:########## #.::#$##:#####. # #.:::::$:$ $ # #####:###:#.##.$ $# #####.:::.######### ################### Position after 63 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####:::########### ###.::::.########## ###:#:##:########## #.::#$##:#####. # #.::::$::$ $ # #####:###:#.##.$ $# #####.:::.######### ################### Position after 62 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####:::########### ###.::::.########## ###:#:##:########## #.::#$##:#####. # #.:::$:::$ $ # ##### ### #.##.$ $# #####. .######### ################### Position after 61 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####:::########### ###.::::.########## ###:#$##:########## #.::# ##:#####. # #.:::$:::$ $ # ##### ### #.##.$ $# #####. .######### ################### Position after 60 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####:::########### ###. $::.########## ### # ##:########## #. # ##:#####. # #. $:::$ $ # ##### ### #.##.$ $# #####. .######### ################### Position after 59 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####:::########### ###.::$:.########## ###:#:##:########## #.::#:##:#####. # #.:::$:::$ $ # ##### ### #.##.$ $# #####. .######### ################### Position after 58 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####:::########### ###.::$:.########## ###:#:##:########## #.::#$##:#####. # #.:::::::$ $ # #####:###:#.##.$ $# #####.:::.######### ################### Position after 57 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####:::########### ###.::$:.########## ###:#:##:########## #.::#$##:#####.:::# #.::::::$:::::::$:# #####:###:#.##.$ $# #####.:::.######### ################### Position after 56 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####:::########### ###.::$:.########## ###:#:##:########## #.::#$##:#####.:::# #.::::::$::::::$$:# #####:###:#.##.::$# #####.:::.######### ################### Position after 55 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####:::########### ###.::$:.########## ###:#:##:########## #.::#$##:#####.:::# #.::::::$::::::$$:# #####:###:#.##.:$:# #####.:::.######### ################### Position after 54 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####:::########### ###.::$:.########## ###:#:##:########## #.::#$##:#####.:::# #.::::::$::::::$$:# #####:###:#.##.$::# #####.:::.######### ################### Position after 53 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####:::########### ###.::$:.########## ###:#:##:########## #.::#$##:#####. # #.::::::$:::::$ $ # #####:###:#.##.$ # #####.:::.######### ################### Position after 52 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####:::########### ###.::$:.########## ###:#:##:########## #.::#$##:#####. # #.::::::$::::$ $ # #####:###:#.##.$ # #####.:::.######### ################### Position after 51 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####:::########### ###.::$:.########## ###:#:##:########## #.::#$##:#####. # #.::::::$:::$ $ # #####:###:#.##.$ # #####.:::.######### ################### Position after 50 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####:::########### ###.::$:.########## ###:#:##:########## #.::#$##:#####. # #.::::::$::$ $ # #####:###:#.##.$ # #####.:::.######### ################### Position after 49 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####:::########### ###.::$:.########## ###:#:##:########## #.::#$##:#####. # #.::::::$:$ $ # #####:###:#.##.$ # #####.:::.######### ################### Position after 48 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####:::########### ###.::$:.########## ###:#:##:########## #.::#$##:#####. # #.:::::$::$ $ # #####:###:#.##.$ # #####.:::.######### ################### Position after 47 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####:::########### ###.::$:.########## ###:#:##:########## #.::#$##:#####. # #.:::::$:$ $ # #####:###:#.##.$ # #####.:::.######### ################### Position after 46 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####:::########### ###.::$:.########## ###:#:##:########## #.::#$##:#####. # #.::::$::$ $ # #####:###:#.##.$ # #####.:::.######### ################### Position after 45 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####:::########### ###.::$:.########## ###:#:##:########## #.::#$##:#####. # #.:::$:::$ $ # ##### ### #.##.$ # #####. .######### ################### Position after 44 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####:::########### ###.::$:.########## ###:#:##:########## #.::#$##:#####. # #.::$::::$ $ # #####:###:#.##.$ # #####.:::.######### ################### Position after 43 pushes: player at 15,7 ################### #####. .########### ##### ########### ##### ########### ###. $ .########## ### # ## ########## #. #$## #####.:::# #. $:::$:::::::$:# #####:###:#.##.$::# #####.:::.######### ################### Position after 42 pushes: player at 15,7 ################### #####. .########### ##### ########### ##### ########### ###. $ .########## ### # ## ########## #. #$## #####.:::# #. $:::$::::::$::# #####:###:#.##.$::# #####.:::.######### ################### Position after 41 pushes: player at 6,8 ################### #####. .########### ##### ########### ##### ########### ###. $ .########## ### # ## ########## #. #$## #####. # #. $:::$:::::$ # #####:###:#.##.$ # #####.:::.######### ################### Position after 40 pushes: player at 6,8 ################### #####. .########### ##### ########### ##### ########### ###. $ .########## ### # ## ########## #. #$## #####. # #. $:::$::::$ # #####:###:#.##.$ # #####.:::.######### ################### Position after 39 pushes: player at 6,8 ################### #####. .########### ##### ########### ##### ########### ###. $ .########## ### # ## ########## #. #$## #####. # #. $:::$:::$ # #####:###:#.##.$ # #####.:::.######### ################### Position after 38 pushes: player at 6,8 ################### #####. .########### ##### ########### ##### ########### ###. $ .########## ### # ## ########## #. #$## #####. # #. $:::$::$ # #####:###:#.##.$ # #####.:::.######### ################### Position after 37 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####:::########### ###.::$:.########## ###:#:##:########## #.::#$##:#####. # #.::$::$:::$ # #####:###:#.##.$ # #####.:::.######### ################### Position after 36 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####:::########### ###.::$:.########## ###:#:##:########## #.::#$##:#####. # #.::$::$::$ # #####:###:#.##.$ # #####.:::.######### ################### Position after 35 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####:::########### ###.::$:.########## ###:#:##:########## #.::#$##:#####. # #.::$:$:::$ # #####:###:#.##.$ # #####.:::.######### ################### Position after 34 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####:::########### ###.::$:.########## ###:#:##:########## #.::#$##:#####. # #.:$::$:::$ # #####:###:#.##.$ # #####.:::.######### ################### Position after 33 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####:::########### ###.::$:.########## ###:#:##:########## #.::#$##:#####. # #.$:::$:::$ # #####:###:#.##.$ # #####.:::.######### ################### Position after 32 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####:::########### ###.:::$.########## ###:#:##:########## #.::#$##:#####. # #.$:::$:::$ # #####:###:#.##.$ # #####.:::.######### ################### Position after 31 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####:::########### ###.:::$.########## ###:#$##:########## #.::#:##:#####. # #.$:::$:::$ # #####:###:#.##.$ # #####.:::.######### ################### Position after 30 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####:::########### ###. $:$.########## ### # ## ########## #. # ## #####. # #.$ $ $ # ##### ### #.##.$ # #####. .######### ################### Position after 29 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####::$########### ###.:$::.########## ###:#:##:########## #.::#:##:#####. # #.$:::$:::$ # #####:###:#.##.$ # #####.:::.######### ################### Position after 28 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####::$########### ###.::$:.########## ###:#:##:########## #.::#:##:#####. # #.$:::$:::$ # #####:###:#.##.$ # #####.:::.######### ################### Position after 27 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####::$########### ###.::$ .########## ###:#:## ########## #.::#:## #####. # #.$::$ $ # ##### ### #.##.$ # #####. .######### ################### Position after 26 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####::$########### ###.::$:.########## ###:#:##:########## #.::#$##:#####. # #.$:::::::$ # #####:###:#.##.$ # #####.:::.######### ################### Position after 25 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####::$########### ###.::$:.########## ###:#:##:########## #.::#$##:#####. # #.$::::::$ # #####:###:#.##.$ # #####.:::.######### ################### Position after 24 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####::$########### ###.::$ .########## ###:#:## ########## #.::#$## #####.:::# #.$:::::$:::::::::# #####:###:#.##.$::# #####.:::.######### ################### Position after 23 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####::$########### ###.::$ .########## ###:#:## ########## #.::#$## #####.:::# #.$:::::$::::::$::# #####:###:#.##.:::# #####.:::.######### ################### Position after 22 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####::$########### ###.::$ .########## ###:#:## ########## #.::#$## #####. # #.$:::::$:::::$ # #####:###:#.##. # #####.:::.######### ################### Position after 21 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####::$########### ###.::$ .########## ###:#:## ########## #.::#$## #####. # #.$:::::$::::$ # #####:###:#.##. # #####.:::.######### ################### Position after 20 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####::$########### ###.::$ .########## ###:#:## ########## #.::#$## #####. # #.$:::::$:::$ # #####:###:#.##. # #####.:::.######### ################### Position after 19 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####::$########### ###.::$ .########## ###:#:## ########## #.::#$## #####. # #.$:::::$::$ # #####:###:#.##. # #####.:::.######### ################### Position after 18 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####::$########### ###.::$ .########## ###:#:## ########## #.::#$## #####. # #.$:::::$:$ # #####:###:#.##. # #####.:::.######### ################### Position after 17 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####::$########### ###.::$:.########## ###:#:##:########## #.::#$##:#####. # #.$::::$::$ # #####:###:#.##. # #####.:::.######### ################### Position after 16 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####::$########### ###.::$:.########## ###:#:##:########## #.::#$##:#####. # #.$:::$:::$ # #####:###:#.##. # #####.:::.######### ################### Position after 15 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####::$########### ###.::$ .########## ###:#:## ########## #.::#$## #####. # #.$::$ $ # ##### ### #.##. # #####. .######### ################### Position after 14 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####::$########### ###.::$ .########## ###:#$## ########## #.::# ## #####. # #.$::$ $ # ##### ### #.##. # #####. .######### ################### Position after 13 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####::$########### ###. $$ .########## ### # ## ########## #. # ## #####. # #.$ $ $ # ##### ### #.##. # #####. .######### ################### Position after 12 pushes: player at 6,2 ################### #####.:.########### #####:::########### #####$:$########### ###. $ .########## ### # ## ########## #. # ## #####. # #.$ $ $ # ##### ### #.##. # #####. .######### ################### Position after 11 pushes: player at 6,2 ################### #####.:.########### #####$::########### #####::$########### ###.::$ .########## ###:#:## ########## #.::#:## #####. # #.$::$ $ # ##### ### #.##. # #####. .######### ################### Position after 10 pushes: player at 6,2 ################### #####.:.########### #####$::########### #####::$########### ###.::$:.########## ###:#:##:########## #.::#$##:#####. # #.$:::::::$ # #####:###:#.##. # #####.:::.######### ################### Position after 9 pushes: player at 6,2 ################### #####.:.########### #####$::########### #####::$########### ###.::$:.########## ###:#:##:########## #.::#$##:#####. # #.$::::::$ # #####:###:#.##. # #####.:::.######### ################### Position after 8 pushes: player at 6,2 ################### #####.:.########### #####$::########### #####::$########### ###.::$ .########## ###:#:## ########## #.::#$## #####.:::# #.$:::::$:::::::::# #####:###:#.##.:::# #####.:::.######### ################### Position after 7 pushes: player at 6,2 ################### #####.:.########### #####$::########### #####::$########### ###.::$:.########## ###:#:##:########## #.::#$##:#####.:::# #.$::::$::::::::::# #####:###:#.##.:::# #####.:::.######### ################### Position after 6 pushes: player at 6,2 ################### #####.:.########### #####$::########### #####::$########### ###.::$:.########## ###:#:##:########## #.::#$##:#####.:::# #.$:::$:::::::::::# #####:###:#.##.:::# #####.:::.######### ################### Position after 5 pushes: player at 6,2 ################### #####.:.########### #####$::########### #####::$########### ###.::$ .########## ###:#:## ########## #.::#$## #####. # #.$::$ # ##### ### #.##. # #####. .######### ################### Position after 4 pushes: player at 6,2 ################### #####.:.########### #####$::########### #####::$########### ###.::$ .########## ###:#$## ########## #.::# ## #####. # #.$::$ # ##### ### #.##. # #####. .######### ################### Position after 3 pushes: player at 6,2 ################### #####.:.########### #####$::########### #####::$########### ###. $$ .########## ### # ## ########## #. # ## #####. # #.$ $ # ##### ### #.##. # #####. .######### ################### Position after 2 pushes: player at 6,2 ################### #####.:.########### #####$:$########### #####:::########### ###. $$:.########## ### # ##:########## #. # ##:#####.:::# #.$ $::::::::::::# #####:###:#.##.:::# #####.:::.######### ################### Position after 1 pushes: player at 8,5 ################### #####. .########### #####$ ########### ##### $########### ###. $$:.########## ### # ##:########## #. # ##:#####.:::# #.$ $::::::::::::# #####:###:#.##.:::# #####.:::.######### ################### Position after 0 pushes: player at 9,5 ################### #####. .########### #####$ ########### ##### $########### ###. $ $.########## ### # ##:########## #. # ##:#####.:::# #.$ $::::::::::::# #####:###:#.##.:::# #####.:::.######### ################### xsok-1.02/solver/README100644 144 62 1105 5665071060 13251 0ustar mbimathoptHi, this is an automatic solver for Sokoban levels. It computes a solution with a minimal number of pushes. Move numbers are far from beeing optimal. Upon success, it will generate a simple save-game file, which can be read by xsok. There is no documentation. There is no warranty. There is no hope at all. Solution of level 1 required 14 MB of memory, for levels with more boxes, the memory requirement seems to reach a Gigabyte. Since hashing is used, the size of the hash table must be given. Currently, this is hardcoded into solve.c. It's a quickhack, anyway. Michael xsok-1.02/solver/solve.c100644 144 62 32226 5665071060 13715 0ustar mbimathopt#include #include #include "BFS.h" #ifdef HP #define HASHBITS 24 /* 16 M entries => 48 MB RAM */ #define MEM 201326592 /* 192 MB total */ #else #define HASHBITS 20 /* 1 M entries => 3 MB RAM */ #define MEM (13152*1024) /* 14 MB total */ #endif #define MAXBOXES 32 typedef unsigned char zchar; int xlevel; void fatal(const char *msg, ...) { va_list args; va_start(args, msg); vfprintf(stderr, msg, args); fprintf (stderr, "\n"); exit (1); } void *malloc_(size_t n) { void *p; if (!n) return NULL; /* since malloc(0) may return NULL */ p = malloc(n); if (!p) fatal("out of memory"); return p; } /* const char *xsokdir = "/usr/games/lib/xsok/Sokoban"; */ const char *xsokdir = "../lib/Sokoban"; #define MAXROW 22 #define MAXCOL 32 int numrows, numcols, plx, ply, orgplx, orgply; unsigned char map[MAXROW][MAXCOL], map2[MAXROW][MAXCOL], dist[MAXROW][MAXCOL]; static void dfs(int x, int y) { if (x < 0 || y < 0 || x >= numcols || y >= numrows) return; if (!(map[y][x] & 4) || (map[y][x] & 0x10)) return; map[y][x] |= 0x10; dfs(x-1, y); dfs(x, y-1); dfs(x+1, y); dfs(x, y+1); } /* Bits in map: 0 = box there, 1 = target square, 2 = player allowed, 3 = box allowed */ #define BOX 1 #define TARGET 2 #define MAYGO 4 #define MAYBOX 8 #define DONE 0x10 #define MAXILL 2000 int pairs = 0; int mbx[256], mby[256]; struct illegal { int x1, y1, x2, y2; } illpairs[MAXILL]; static void add_illegal(int x1, int y1, int x2, int y2) { int i; struct illegal *ip; if (pairs == MAXILL) return; /* cannot store more illegal pairs */ if (!(map[y1][x1] & map[y2][x2] & MAYBOX)) return; /* cannot happen at all */ ip = illpairs; for (i = 0; i < pairs; ++i, ++ip) { if (ip->x1 == x1 && ip->y1 == y1 && ip->x2 == x2 && ip->y2 == y2) return; if (ip->x1 == x2 && ip->y1 == y2 && ip->x2 == x1 && ip->y2 == y1) return; } ip->x1 = x1; ip->y1 = y1; ip->x2 = x2; ip->y2 = y2; printf("illegal pair: (%d,%d) with (%d,%d)\n", x1, y1, x2, y2); ++pairs; } static int check_pairs(void) { int i; struct illegal *ip; ip = illpairs; for (i = 0; i < pairs; ++i, ++ip) if (map[ip->y1][ip->x1] & map[ip->y2][ip->x2] & BOX) return 0; return 1; /* cannot see a reason to reject */ } void collect_illegal_pairs(void) { int x, y; for (y = 1; y < numrows-1; ++y) for (x = 1; x < numcols-1; ++x) if (!(map[y][x] & MAYGO)) { /* there is a wall */ if (map[y+1][x] & MAYGO) { if (x > 1 && (map[y][x-2] & MAYGO) && !(map[y+1][x-2] & MAYGO)) add_illegal(x-1, y, x-1, y+1); if (x < numcols-2 && (map[y][x+2] & MAYGO) && !(map[y+1][x+2] & MAYGO)) add_illegal(x+1, y, x+1, y+1); } if (y < numcols-2 && (map[y+2][x] & MAYGO)) { if (!(map[y+2][x-1] & MAYGO) && (map[y][x-1] & MAYGO)) add_illegal(x-1, y+1, x, y+1); if (!(map[y+2][x+1] & MAYGO) && (map[y][x+1] & MAYGO)) add_illegal(x+1, y+1, x, y+1); } } } void ParseMapFile(int level) { FILE *fp; int x, y; char s[256]; sprintf(s, "%s/screen.%02d", xsokdir, level); if (!(fp = fopen(s, "r"))) fatal("cannot open level\n"); memset(map, 0, sizeof(map)); for (y = 1; fgets(s, sizeof(s), fp); ++y) { /* parse s to map */ int c; if (*s == ';') { --y; continue; } if (y == MAXROW-1) fatal("Level is too big\n"); for (x = 1; (c=s[x-1]) && c != '\n'; ++x) { if (x == MAXCOL-1) fatal("Level is too wide\n"); if (x > numcols) numcols = x; switch (c) { case '#': map[y][x] = 0; /* no go */ break; case '.': map[y][x] = 0x0f-BOX; /* no go */ break; case '*': map[y][x] = 0x0f; /* target + box! */ break; case '$': map[y][x] = 0x0f-TARGET; /* no go */ break; case '@': orgplx = plx = x; orgply = ply = y; case ' ': map[y][x] = 0x0f-TARGET-BOX; /* player & box allowed */ break; default: fatal("Cannot handle character 0x%02x\n", c); } } } fclose(fp); numrows = y+1; numcols += 2; /* change floor to void */ dfs(plx, ply); for (x = 0; x < MAXCOL; ++x) for (y = 0; y < MAXROW; ++y) { if (!(map[y][x] & 0x10)) map[y][x] = 0; else map[y][x] &= 0x0f; } } void mask_map(void) { int x, y; for (y = 2; y < numrows-2; ++y) for (x = 2; x < numcols-2; ++x) if ((map[y][x] & 6) == MAYGO) { /* not dest, player allowed */ if (!(MAYGO & (map[y-1][x]|map[y][x-1]))) map[y][x] &= ~8; /* no box allowed here */ if (!(MAYGO & (map[y+1][x]|map[y][x-1]))) map[y][x] &= ~8; /* no box allowed here */ if (!(MAYGO & (map[y-1][x]|map[y][x+1]))) map[y][x] &= ~8; /* no box allowed here */ if (!(MAYGO & (map[y+1][x]|map[y][x+1]))) map[y][x] &= ~8; /* no box allowed here */ } } void print_map(void) { int x, y; for (y = 1; y < numrows-1; ++y) { for (x = 1; x < numcols-1; ++x) if (map[y][x] & MAYBOX) { if (map[y][x] & BOX) putchar('$'); else if (map[y][x] & DONE) putchar(':'); else putchar(' '); } else { if (map[y][x] & MAYGO) putchar('.'); else putchar('#'); } putchar('\n'); } } int maygo = 0, maybox = 0, boxes = 0; void statistics(void) { int x, y; for (y = 1; y < numrows-1; ++y) for (x = 1; x < numcols-1; ++x) { if (map[y][x] & MAYBOX) { mbx[maybox] = x; mby[maybox] = y; ++maybox; } else if (map[y][x] & MAYGO) ++maygo; if (map[y][x] & BOX) ++boxes; } maygo += maybox; printf("%d squares for boxes, %d boxes, %d total squares\n", maybox, boxes, maygo); { double num; num = maybox; for (x = 2; x <= boxes; ++x) { num *= maybox - (x-1); num /= x; } printf("%e possibilities\n", num); } if (boxes > MAXBOXES || maybox > 256) fatal("Level too large"); } zchar bitpos[2+MAXBOXES]; zchar solpos[MAXBOXES]; int level = 1; static void reset_done(void) { int x, y; for (y = 1; y < numrows-1; ++y) for (x = 1; x < numcols-1; ++x) map[y][x] &= ~DONE; } static void pldfs(int x, int y) { if (!(map[y][x] & MAYGO) || (map[y][x] & BOX) || (map[y][x] & DONE)) return; map[y][x] |= DONE; pldfs(x-1, y); pldfs(x, y-1); pldfs(x+1, y); pldfs(x, y+1); } static void norm_playerpos(void) { int x, y; reset_done(); pldfs(plx, ply); for (y = 1; y < numrows-1; ++y) for (x = 1; x < numcols-1; ++x) if (map[y][x] & DONE) { plx = x; ply = y; return; } } void sol_to_bits(void) { int i, j, x, y; j = 0; for (i = 0; i < maybox; ++i) { x = mbx[i]; y = mby[i]; if (map[y][x] & TARGET) solpos[j++] = i; } printf("solpos has %d targets:", j); for (i = 0; i < j; ++i) printf(" %2d", solpos[i]); printf("\n"); if (j != boxes) fatal("different tnumber of targets and boxes!\n"); } void pos_to_bits(void) { int i, j, x, y; norm_playerpos(); memset(bitpos, 0, sizeof(bitpos)); bitpos[0] = plx; bitpos[1] = ply; j = 2; for (i = 0; i < maybox; ++i) { x = mbx[i]; y = mby[i]; if (map[y][x] & BOX) bitpos[j++] = i; } } void bits_to_pos(void) { int i, j, x, y; for (y = 1; y < numrows-1; ++y) for (x = 1; x < numcols-1; ++x) map[y][x] &= ~BOX; plx = bitpos[0]; ply = bitpos[1]; for (j = 2; j < boxes + 2; ++j) { i = bitpos[j]; map[mby[i]][mbx[i]] |= BOX; } reset_done(); pldfs(plx, ply); } unsigned char smap[MAXROW][MAXCOL]; #if 0 int best = 0; static int count_good(void) { int x, y, good; good = 0; for (y = 2; y < numrows-2; ++y) for (x = 2; x < numcols-2; ++x) if ((map[y][x] & (BOX|TARGET)) == (BOX|TARGET)) ++good; if (good <= best) return good; best = good; printf("%d boxes good!\n", best); good = 0; for (y = 2; y < numrows-2; ++y) for (x = 2; x < numcols-2; ++x) if ((map[y][x] & (BOX)) == (BOX)) ++good; printf("%d boxes total!\n", good); good = 0; for (y = 2; y < numrows-2; ++y) for (x = 2; x < numcols-2; ++x) if ((map[y][x] & TARGET)) ++good; printf("%d targets total!\n", good); } #else #define count_good() #endif #define NOT(c) (!(c & MAYGO) || (c & BOX)) #define TEST(dx,dy,dir) \ if (!(map2[y+dy][x+dx]&BOX) && (map[y+dy][x+dx]&BOX)) { \ /* d+dx,y+dy is the new posn. */ \ move_player_to(x-(dx),y-(dy), fp); \ putc(dir,fp); orgplx = x; orgply=y; goto naus;} #define STEP(dx,dy) if ((map2[y+dy][x+dx] & (MAYGO|BOX)) == MAYGO && dist[y+dy][x+dx] > d) \ (dist[remy[wr] = y+dy][remx[wr]= x+dx] = d), ++wr; void move_player_to(int xx, int yy, FILE *fp) { unsigned char rem[100]; int length, i; int rd = 0, wr = 1, remx[1000], remy[1000]; memset(dist, 0xff, sizeof(dist)); dist[remy[0] = ply][remx[0] = plx] = 0; while (rd < wr) { int x, y, d; x = remx[rd]; y = remy[rd++]; d = 1 + dist[y][x]; STEP(1,0); STEP(0,1); STEP(-1,0); STEP(0,-1); } if (dist[yy][xx] == 0xff) { fclose(fp); fatal("ile #1\n"); } length = dist[yy][xx]; for (i = length-1; i>= 0; --i) { if (dist[yy-1][xx] == i) { --yy; rem[i] = 2; } else if (dist[yy][xx-1] == i) { --xx; rem[i] = 3; } else if (dist[yy+1][xx] == i) { ++yy; rem[i] = 0; } else if (dist[yy][xx+1] == i) { ++xx; rem[i] = 1; } else fatal("ile #2"); } for (i = 0; i < length; ++i) putc(rem[i], fp); } void write_solution(long entrynr) { long *positions; char fname[100]; FILE *fp; int i; positions = malloc_(sizeof(long) * (level+1)); for (i = level; i >= 0; --i) { positions[i] = entrynr; entrynr = BFS_getentry(entrynr, bitpos); bits_to_pos(); printf("Position after %d pushes: player at %d,%d\n", i, plx, ply); print_map(); fflush(stdout); if (i > 0) assert(entrynr >= 0); else assert(entrynr < 0); } sprintf(fname, "Sokoban.%02d.sol", xlevel); fp = fopen(fname, "wb"); /* write the "simple" magic */ putc(0, fp); putc(0, fp); putc(0x74, fp); putc(0x1c, fp); plx = orgplx; ply = orgply; BFS_getentry(positions[0], &bitpos); bits_to_pos(); for (i = 1; i <= level; ++i) { int x, y; memcpy(map2, map, sizeof(map)); /* the current state */ BFS_getentry(positions[i], &bitpos); bits_to_pos(); /* make a diff map2 => map and move the player */ for (y = 2; y < numrows-2; ++y) for (x = 2; x < numcols-2; ++x) /* map2 is old and map is new */ if ((map2[y][x]&BOX) && !(map[y][x]&BOX)) { /* there are 4 possibilities... (x,y) is the new player pos */ plx = orgplx; ply = orgply; TEST( 0,-1,0); TEST(-1, 0,1); TEST( 0, 1,2); TEST( 1, 0,3); } fatal("ile 3"); naus: ; } fclose(fp); } static void printtime(void) { fflush(stdout); system("date"); } #ifndef HP inline #endif static void try_possible_state(x, y, dx, dy) { if (!(map[y][x] & TARGET)) { if (!dx) { if (NOT(map[y+dy][x]) && ( (NOT(map[y][x-1]) && NOT(map[y+dy][x-1])) || (NOT(map[y][x+1]) && NOT(map[y+dy][x+1])) )) return; /* no new forbidden square */ } else { if (NOT(map[y][x+dx]) && ( (NOT(map[y-1][x]) && NOT(map[y-1][x+dx])) || (NOT(map[y+1][x]) && NOT(map[y+1][x+dx])) )) return; /* no new forbidden square */ } } if (!check_pairs()) /* is this position stuck? */ return; pos_to_bits(); #if 0 if (level < 3) { printf("Storing new pos:\n"); print_map(); printf("%04lx %04lx\n", ((long *)bitpos)[1], ((long *)bitpos)[0]); } #endif if (!memcmp(solpos, bitpos+2, boxes)) { printf("found the solution with %d pushes!\n", level); printtime(); write_solution(BFS_store(bitpos)); exit(0); } count_good(); BFS_store(bitpos); } #define TRY(dx,dy) { \ if ((map[y+dy][x+dx] & BOX) && (map[y+dy+dy][x+dx+dx] & (MAYBOX|BOX)) == MAYBOX) { \ map[y+dy][x+dx] &= ~BOX; map[y+dy+dy][x+dx+dx] |= BOX; \ try_possible_state(x+dx+dx,y+dy+dy, dx, dy); \ memcpy(map, smap, sizeof(map)); \ }} static void try_all_pushes(void) { int x, y; memcpy(smap, map, sizeof(map)); for (y = 2; y < numrows-2; ++y) for (x = 2; x < numcols-2; ++x) if (map[y][x] & DONE) { /* we may push from here */ plx = x; ply = y; TRY(-1,0); TRY(1,0); TRY(0,1); TRY(0,-1); } } int main(int argc, char *argv[]) { size_t ndata; if (argc == 2) level = atoi(argv[1]); else level =1; xlevel = level; ParseMapFile(level); /* mask out squares not allowed for a box */ system("uname -a"); printtime(); mask_map(); print_map(); statistics(); collect_illegal_pairs(); sol_to_bits(); printf("mem = %ld, mem for hash = %ld\n", MEM, (3UL << HASHBITS)); ndata = (MEM - (3UL << HASHBITS)) / (boxes + 5); if (ndata >= (3UL << (HASHBITS-2))) ndata = (3UL << (HASHBITS-2)); printf("Using %d hashbits and %ld data entries (%d boxes)\n", HASHBITS, ndata, boxes); BFS_init(2 + boxes, 2 + boxes, HASHBITS, ndata, 1); /* set keylength */ pos_to_bits(); BFS_store(bitpos); level = 0; while (BFS_newlevel()) { /* there are some entries */ ++level; /* fprintf(stderr, "searching at level %d\n", level); */ while (BFS_retrieve(bitpos)) { bits_to_pos(); try_all_pushes(); } } printf("no solution found\n"); printtime(); return 0; } xsok-1.02/solver/BFS.h100644 144 62 2220 5665071060 13153 0ustar mbimathopt#include #include #include #include #include void fatal(const char *msg, ...); void *malloc_(size_t); /* this is BFS.h, prototypes for generic Breadth-First-Search lib. */ struct BFS { size_t keylength; /* number of bytes for the key of the data 2..4 */ size_t datalength; /* total number of user bytes */ size_t ptrsize; /* number of bytes for backptrs */ size_t totallength; int hashbits; /* has table has size 1 << hashbits */ int level; unsigned char *hashtable; unsigned char *data; unsigned char *endhash; unsigned long ndata; unsigned long hashmask; /* is equal to nr. of entries */ unsigned long read; /* data item to read */ unsigned long write; /* data item to write */ unsigned long stop; /* helps for level wrap */ }; void BFS_init(size_t keylength, size_t datalength, int hashbits, unsigned long ndata, int backtrack); long BFS_store(void *data); /* store data, return entrynr */ int BFS_newlevel(void); /* request new level */ int BFS_retrieve(void *data); long BFS_getentry(long entrynr, void *data); /* returns predecessor */ xsok-1.02/solver/BFS.c100644 144 62 7343 5665071060 13161 0ustar mbimathopt#include #include "BFS.h" #include "crc16.h" #define STATISTICS static struct BFS bfs; #ifdef STATISTICS static unsigned long searches, misses; #endif void BFS_init(size_t keylength, size_t datalength, int hashbits, unsigned long ndata, int backtrack) { if (hashbits < 9 || hashbits > 24) fatal("only 9..24 bits hashsize allowed!"); /* copy args */ bfs.keylength = keylength; bfs.datalength = datalength; bfs.hashbits = hashbits; bfs.ndata = ndata; /* compute rest */ bfs.ptrsize = (hashbits+7) >> 3; bfs.hashmask = (1UL << hashbits) - 1UL; bfs.totallength = bfs.datalength; if (backtrack) bfs.totallength += bfs.ptrsize; bfs.level = 0; if (ndata >= bfs.hashmask) fatal("BFS: cannot hold that much data\n"); printf("BFS memory usage:\n%ld byte for hashtable\n%ld byte for data\n", bfs.ptrsize * bfs.hashmask, bfs.ndata * bfs.totallength); bfs.hashtable = malloc_(bfs.ptrsize * bfs.hashmask + 2); /* 2 for trick */ memset(bfs.hashtable, 0xff, bfs.ptrsize * bfs.hashmask); /* free hash */ bfs.data = malloc_(bfs.ndata * bfs.totallength); bfs.endhash = bfs.hashtable + bfs.ptrsize * bfs.hashmask; bfs.read = 0; bfs.write = 0; bfs.stop = 0; } int BFS_retrieve(void *data) { if (bfs.read == bfs.stop) return 0; memcpy(data, bfs.data + bfs.totallength * bfs.read++, bfs.datalength); return 1; } int BFS_newlevel(void) { if (bfs.stop == bfs.write) return 0; /* no items were stored in this level */ /* if (bfs.read == bfs.stop), the old level has been read out completely */ bfs.read = bfs.stop; bfs.stop = bfs.write; #ifdef STATISTICS printf("%6ld items stored at level %3d (%6lu total), " "(%ld searches, %ld misses)\n", bfs.stop - bfs.read, bfs.level, bfs.write, searches, misses); searches = 0; misses = 0; #endif ++bfs.level; return 1; } long BFS_store(void *data) { unsigned long hashcode; unsigned char *ptr; #ifdef STATISTICS ++searches; #endif CRC16_reset(); hashcode = ((unsigned long)CRC16_add(data, bfs.keylength) << (bfs.hashbits-16)) & bfs.hashmask; ptr = bfs.hashtable + bfs.ptrsize * hashcode; /* printf("searching code %x\n", hashcode); */ /* search a free entry in the hashtable */ for (;;) { unsigned long entrynr; if (ptr == bfs.endhash) /* wrap around */ ptr = bfs.hashtable; entrynr = ((unsigned long)ptr[0] | ((unsigned long)ptr[1] << 8) | ((unsigned long)ptr[2] << 16)) & bfs.hashmask; if (entrynr == bfs.hashmask) break; /* found a free entry */ if (!memcmp(bfs.data+bfs.totallength*entrynr, data, bfs.keylength)) { /* merge the entries */ return (long)entrynr; } #ifdef STATISTICS ++misses; #endif ptr += bfs.ptrsize; } /* there was no matching entry => create a new one */ if (bfs.write == bfs.ndata) fatal("BFS: data table full\n"); ptr[0] = (unsigned char)bfs.write; ptr[1] = (unsigned char)(bfs.write >> 8); if (bfs.hashbits > 16) ptr[2] = (unsigned char)(bfs.write >> 16); ptr = bfs.data+bfs.totallength*bfs.write; memcpy(ptr, data, bfs.datalength); if (bfs.totallength > bfs.datalength) { /* now store the backtrack-pointer */ ptr += bfs.datalength; ptr[0] = (unsigned char)bfs.read; ptr[1] = (unsigned char)(bfs.read >> 8); if (bfs.hashbits > 16) ptr[2] = (unsigned char)(bfs.read >> 16); } return (long)(bfs.write++); } long BFS_getentry(long entrynr, void *data) { unsigned char *ptr = bfs.data + bfs.totallength * entrynr; memcpy(data, ptr, bfs.datalength); if (bfs.totallength == bfs.datalength) return -1L; ptr += bfs.datalength; entrynr = ((long)ptr[0] | ((long)ptr[1] << 8) | ((long)ptr[2] << 16)) & bfs.hashmask; return entrynr - 1L; } xsok-1.02/solver/Sokoban.17.txt100644 144 62 16524 5665071060 15007 0ustar mbimathoptHP-UX uglybit A.09.01 A 9000/715 2009311111 two-user license Mon Nov 14 13:57:33 MET 1994 ################ #### .#. .#### #### .#### #### .# ##### ######### #..## ###. .# ###. #. ##..# .# #### ##..#### ## #. $ .#####.# .# # # $ $ .# $ .# #. $ $ .#. .## #### ## ######## ####. .######## ################ 59 squares for boxes, 6 boxes, 87 total squares 4.505747e+07 possibilities solpos has 6 targets: 0 1 4 5 11 12 mem = 201326592, mem for hash = 50331648 Using 24 hashbits and 12582912 data entries (6 boxes) BFS memory usage: 50331645 byte for hashtable 138412032 byte for data 1 items stored at level 0 ( 1 total), (1 searches, 0 misses) 2 items stored at level 1 ( 3 total), (2 searches, 0 misses) 3 items stored at level 2 ( 6 total), (4 searches, 0 misses) 10 items stored at level 3 ( 16 total), (12 searches, 0 misses) 29 items stored at level 4 ( 45 total), (45 searches, 0 misses) 68 items stored at level 5 ( 113 total), (113 searches, 0 misses) 193 items stored at level 6 ( 306 total), (330 searches, 1 misses) 484 items stored at level 7 ( 790 total), (1009 searches, 14 misses) 960 items stored at level 8 ( 1750 total), (2359 searches, 48 misses) 1568 items stored at level 9 ( 3318 total), (4161 searches, 176 misses) 2266 items stored at level 10 ( 5584 total), (6160 searches, 399 misses) 3013 items stored at level 11 ( 8597 total), (8292 searches, 788 misses) 3765 items stored at level 12 ( 12362 total), (10558 searches, 1409 misses) 4560 items stored at level 13 ( 16922 total), (13081 searches, 2535 misses) 5411 items stored at level 14 ( 22333 total), (15968 searches, 4302 misses) 6343 items stored at level 15 ( 28676 total), (19124 searches, 6717 misses) 7416 items stored at level 16 ( 36092 total), (22695 searches, 10366 misses) 8693 items stored at level 17 ( 44785 total), (27108 searches, 15775 misses) 10261 items stored at level 18 ( 55046 total), (32639 searches, 24409 misses) 12187 items stored at level 19 ( 67233 total), (39555 searches, 37030 misses) 14468 items stored at level 20 ( 81701 total), (48058 searches, 57425 misses) 16982 items stored at level 21 ( 98683 total), (57887 searches, 86052 misses) 19674 items stored at level 22 (118357 total), (68716 searches, 125004 misses) 22714 items stored at level 23 (141071 total), (80770 searches, 177800 misses) 26153 items stored at level 24 (167224 total), (94641 searches, 252418 misses) 29871 items stored at level 25 (197095 total), (110079 searches, 348105 misses) 33825 items stored at level 26 (230920 total), (126579 searches, 466734 misses) 37932 items stored at level 27 (268852 total), (143990 searches, 612810 misses) 42261 items stored at level 28 (311113 total), (162471 searches, 793158 misses) 47023 items stored at level 29 (358136 total), (182667 searches, 1018026 misses) 52489 items stored at level 30 (410625 total), (206177 searches, 1316805 misses) 58662 items stored at level 31 (469287 total), (233807 searches, 1702233 misses) 65509 items stored at level 32 (534796 total), (264822 searches, 2180586 misses) 72974 items stored at level 33 (607770 total), (298996 searches, 2767105 misses) 80960 items stored at level 34 (688730 total), (336150 searches, 3489551 misses) 89427 items stored at level 35 (778157 total), (376069 searches, 4379659 misses) 98218 items stored at level 36 (876375 total), (418357 searches, 5458613 misses) 106929 items stored at level 37 (983304 total), (461845 searches, 6736187 misses) 115037 items stored at level 38 (1098341 total), (503928 searches, 8181222 misses) 122820 items stored at level 39 (1221161 total), (543019 searches, 9784171 misses) 130758 items stored at level 40 (1351919 total), (579945 searches, 11555718 misses) 139244 items stored at level 41 (1491163 total), (616765 searches, 13534402 misses) 148172 items stored at level 42 (1639335 total), (654629 searches, 15765653 misses) 157280 items stored at level 43 (1796615 total), (692612 searches, 18255035 misses) 166451 items stored at level 44 (1963066 total), (729173 searches, 21019648 misses) 175784 items stored at level 45 (2138850 total), (763790 searches, 24041578 misses) 185302 items stored at level 46 (2324152 total), (796888 searches, 27301481 misses) 194585 items stored at level 47 (2518737 total), (827836 searches, 30752674 misses) 203545 items stored at level 48 (2722282 total), (856670 searches, 34391756 misses) 211941 items stored at level 49 (2934223 total), (883497 searches, 38255505 misses) 219653 items stored at level 50 (3153876 total), (908203 searches, 42335420 misses) 226403 items stored at level 51 (3380279 total), (930176 searches, 46573912 misses) 232219 items stored at level 52 (3612498 total), (949262 searches, 50913087 misses) 237379 items stored at level 53 (3849877 total), (966549 searches, 55408333 misses) 241793 items stored at level 54 (4091670 total), (982938 searches, 60071969 misses) 245212 items stored at level 55 (4336882 total), (997785 searches, 64762231 misses) 247887 items stored at level 56 (4584769 total), (1011424 searches, 69433383 misses) 250394 items stored at level 57 (4835163 total), (1026101 searches, 74220249 misses) 253214 items stored at level 58 (5088377 total), (1043604 searches, 79276101 misses) 256362 items stored at level 59 (5344739 total), (1063924 searches, 84683394 misses) 259695 items stored at level 60 (5604434 total), (1085818 searches, 90441556 misses) 263168 items stored at level 61 (5867602 total), (1108369 searches, 96576844 misses) 266527 items stored at level 62 (6134129 total), (1130025 searches, 102944342 misses) 269294 items stored at level 63 (6403423 total), (1148210 searches, 109163978 misses) 271209 items stored at level 64 (6674632 total), (1161110 searches, 114959609 misses) 272652 items stored at level 65 (6947284 total), (1170313 searches, 120447756 misses) 273969 items stored at level 66 (7221253 total), (1178779 searches, 125908924 misses) 275015 items stored at level 67 (7496268 total), (1187902 searches, 131520115 misses) 275910 items stored at level 68 (7772178 total), (1197240 searches, 137222658 misses) 277089 items stored at level 69 (8049267 total), (1207446 searches, 143092749 misses) 279000 items stored at level 70 (8328267 total), (1220610 searches, 149356064 misses) 281586 items stored at level 71 (8609853 total), (1237252 searches, 156149362 misses) 285233 items stored at level 72 (8895086 total), (1257987 searches, 163659383 misses) 290825 items stored at level 73 (9185911 total), (1285311 searches, 172334022 misses) 299253 items stored at level 74 (9485164 total), (1321467 searches, 182664565 misses) 310821 items stored at level 75 (9795985 total), (1366472 searches, 194824071 misses) 325169 items stored at level 76 (10121154 total), (1417680 searches, 208741157 misses) 341537 items stored at level 77 (10462691 total), (1472142 searches, 224184987 misses) 359063 items stored at level 78 (10821754 total), (1526266 searches, 240748843 misses) 377158 items stored at level 79 (11198912 total), (1576513 searches, 257873141 misses) 395247 items stored at level 80 (11594159 total), (1619348 searches, 274935874 misses) 412389 items stored at level 81 (12006548 total), (1650442 searches, 291251788 misses) 427448 items stored at level 82 (12433996 total), (1665756 searches, 306701587 misses) BFS table full xsok-1.02/solver/Sokoban.38.txt100644 144 62 5501 5665071060 14763 0ustar mbimathoptHP-UX uglybit A.09.01 A 9000/715 2009311111 two-user license Tue Nov 15 13:17:08 MET 1994 BFS: data table full ########### #######..## #. $ ## #. $## $## ##$# # ## ## $ ## ## # # ## ## # #$.# ##$ $ .# ##..####### ########### 41 squares for boxes, 8 boxes, 49 total squares 9.554825e+07 possibilities solpos has 8 targets: 13 14 15 19 20 21 25 27 mem = 201326592, mem for hash = 50331648 Using 24 hashbits and 11614995 data entries (8 boxes) BFS memory usage: 50331645 byte for hashtable 150994935 byte for data 1 items stored at level 0 ( 1 total), (1 searches, 0 misses) 2 items stored at level 1 ( 3 total), (2 searches, 0 misses) 3 items stored at level 2 ( 6 total), (4 searches, 0 misses) 3 items stored at level 3 ( 9 total), (5 searches, 0 misses) 4 items stored at level 4 ( 13 total), (6 searches, 0 misses) 9 items stored at level 5 ( 22 total), (13 searches, 0 misses) 27 items stored at level 6 ( 49 total), (42 searches, 0 misses) 104 items stored at level 7 ( 153 total), (198 searches, 1 misses) 372 items stored at level 8 ( 525 total), (912 searches, 15 misses) 1122 items stored at level 9 ( 1647 total), (3202 searches, 75 misses) 2913 items stored at level 10 ( 4560 total), (8955 searches, 425 misses) 6780 items stored at level 11 ( 11340 total), (21619 searches, 2350 misses) 14513 items stored at level 12 ( 25853 total), (47714 searches, 11765 misses) 28771 items stored at level 13 ( 54624 total), (98308 searches, 51626 misses) 52891 items stored at level 14 (107515 total), (189369 searches, 197466 misses) 90278 items stored at level 15 (197793 total), (340085 searches, 659716 misses) 143542 items stored at level 16 (341335 total), (568350 searches, 1937766 misses) 213496 items stored at level 17 (554831 total), (884291 searches, 4976130 misses) 298940 items stored at level 18 (853771 total), (1287224 searches, 11381322 misses) 397920 items stored at level 19 (1251691 total), (1771077 searches, 23481029 misses) 509564 items stored at level 20 (1761255 total), (2332978 searches, 44533878 misses) 634258 items stored at level 21 (2395513 total), (2975683 searches, 78910450 misses) 772106 items stored at level 22 (3167619 total), (3700774 searches, 132232804 misses) 920752 items stored at level 23 (4088371 total), (4500468 searches, 211123321 misses) 1073567 items stored at level 24 (5161938 total), (5351497 searches, 321808816 misses) 1221804 items stored at level 25 (6383742 total), (6218312 searches, 469037412 misses) 1357815 items stored at level 26 (7741557 total), (7062412 searches, 654903826 misses) 1478295 items stored at level 27 (9219852 total), (7858853 searches, 879268918 misses) 1584852 items stored at level 28 (10804704 total), (8602391 searches, 1141790404 misses) BFS table full xsok-1.02/solver/Sokoban.01.asl100644 144 62 1017 5665071060 14707 0ustar mbimathopttxsok-1.02/solver/crc16.c100644 144 62 5062 5665071060 13461 0ustar mbimathopt#include #include "crc16.h" static unsigned short crc16tab[] = { 0x0000, 0xc0c1, 0xc181, 0x0140, 0xc301, 0x03c0, 0x0280, 0xc241, 0xc601, 0x06c0, 0x0780, 0xc741, 0x0500, 0xc5c1, 0xc481, 0x0440, 0xcc01, 0x0cc0, 0x0d80, 0xcd41, 0x0F00, 0xcFc1, 0xce81, 0x0e40, 0x0a00, 0xcac1, 0xcb81, 0x0b40, 0xc901, 0x09c0, 0x0880, 0xc841, 0xd801, 0x18c0, 0x1980, 0xd941, 0x1b00, 0xdbc1, 0xda81, 0x1a40, 0x1e00, 0xdec1, 0xdF81, 0x1F40, 0xdd01, 0x1dc0, 0x1c80, 0xdc41, 0x1400, 0xd4c1, 0xd581, 0x1540, 0xd701, 0x17c0, 0x1680, 0xd641, 0xd201, 0x12c0, 0x1380, 0xd341, 0x1100, 0xd1c1, 0xd081, 0x1040, 0xF001, 0x30c0, 0x3180, 0xF141, 0x3300, 0xF3c1, 0xF281, 0x3240, 0x3600, 0xF6c1, 0xF781, 0x3740, 0xF501, 0x35c0, 0x3480, 0xF441, 0x3c00, 0xFcc1, 0xFd81, 0x3d40, 0xFF01, 0x3Fc0, 0x3e80, 0xFe41, 0xFa01, 0x3ac0, 0x3b80, 0xFb41, 0x3900, 0xF9c1, 0xF881, 0x3840, 0x2800, 0xe8c1, 0xe981, 0x2940, 0xeb01, 0x2bc0, 0x2a80, 0xea41, 0xee01, 0x2ec0, 0x2F80, 0xeF41, 0x2d00, 0xedc1, 0xec81, 0x2c40, 0xe401, 0x24c0, 0x2580, 0xe541, 0x2700, 0xe7c1, 0xe681, 0x2640, 0x2200, 0xe2c1, 0xe381, 0x2340, 0xe101, 0x21c0, 0x2080, 0xe041, 0xa001, 0x60c0, 0x6180, 0xa141, 0x6300, 0xa3c1, 0xa281, 0x6240, 0x6600, 0xa6c1, 0xa781, 0x6740, 0xa501, 0x65c0, 0x6480, 0xa441, 0x6c00, 0xacc1, 0xad81, 0x6d40, 0xaF01, 0x6Fc0, 0x6e80, 0xae41, 0xaa01, 0x6ac0, 0x6b80, 0xab41, 0x6900, 0xa9c1, 0xa881, 0x6840, 0x7800, 0xb8c1, 0xb981, 0x7940, 0xbb01, 0x7bc0, 0x7a80, 0xba41, 0xbe01, 0x7ec0, 0x7F80, 0xbF41, 0x7d00, 0xbdc1, 0xbc81, 0x7c40, 0xb401, 0x74c0, 0x7580, 0xb541, 0x7700, 0xb7c1, 0xb681, 0x7640, 0x7200, 0xb2c1, 0xb381, 0x7340, 0xb101, 0x71c0, 0x7080, 0xb041, 0x5000, 0x90c1, 0x9181, 0x5140, 0x9301, 0x53c0, 0x5280, 0x9241, 0x9601, 0x56c0, 0x5780, 0x9741, 0x5500, 0x95c1, 0x9481, 0x5440, 0x9c01, 0x5cc0, 0x5d80, 0x9d41, 0x5F00, 0x9Fc1, 0x9e81, 0x5e40, 0x5a00, 0x9ac1, 0x9b81, 0x5b40, 0x9901, 0x59c0, 0x5880, 0x9841, 0x8801, 0x48c0, 0x4980, 0x8941, 0x4b00, 0x8bc1, 0x8a81, 0x4a40, 0x4e00, 0x8ec1, 0x8F81, 0x4F40, 0x8d01, 0x4dc0, 0x4c80, 0x8c41, 0x4400, 0x84c1, 0x8581, 0x4540, 0x8701, 0x47c0, 0x4680, 0x8641, 0x8201, 0x42c0, 0x4380, 0x8341, 0x4100, 0x81c1, 0x8081, 0x4040 }; static unsigned short crc16 = 0; unsigned short CRC16_reset(void) { unsigned short oldcrc; oldcrc = crc16; crc16 = 0; return oldcrc; } unsigned short CRC16_add(const void *buffer, size_t n) { const unsigned char *s = (const unsigned char *)buffer; register unsigned short localcrc; localcrc = crc16; while (n--) localcrc = (localcrc>>8) ^ crc16tab[(localcrc ^ (*s++)) & 0x00ff]; return crc16 = localcrc; } xsok-1.02/solver/crc16.h100644 144 62 132 5665071060 13437 0ustar mbimathoptunsigned short CRC16_reset(void); unsigned short CRC16_add(const void *buffer, size_t n); xsok-1.02/solutions/ 40755 144 62 0 6037666556 13042 5ustar mbimathoptxsok-1.02/solutions/Cyberbox.01.bs100644 144 62 210 5664414616 15423 0ustar mbimathopttЗ.вŽџџџџџџџџџџџџџџџџџџџџџџџџџџџџCyberbox.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Cyberbox.01.mm100644 144 62 0 5664414616 23307 1xsok-1.02/solutions/Cyberbox.01.bsustar mbimathoptxsok-1.02/solutions/Cyberbox.01.mp100644 144 62 0 5664414616 23312 1xsok-1.02/solutions/Cyberbox.01.bsustar mbimathoptxsok-1.02/solutions/Cyberbox.02.bs100644 144 62 263 5664414654 15436 0ustar mbimathopttŒ<.вЌ<џџџџџџџџџџџџџџџџ<џџџџџџџџџџџџCyberbox.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Cyberbox.02.mm100644 144 62 0 5664414654 23313 1xsok-1.02/solutions/Cyberbox.02.bsustar mbimathoptxsok-1.02/solutions/Cyberbox.02.mp100644 144 62 0 5664414654 23316 1xsok-1.02/solutions/Cyberbox.02.bsustar mbimathoptxsok-1.02/solutions/Cyberbox.03.bs100644 144 62 315 5664414661 15433 0ustar mbimathopttrV.вБVџџџџџџџџџџџџџџџџVџџџџџџџџџџџџCyberbox.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Cyberbox.03.mm100644 144 62 0 5664414661 23313 1xsok-1.02/solutions/Cyberbox.03.bsustar mbimathoptxsok-1.02/solutions/Cyberbox.03.mp100644 144 62 0 5664414661 23316 1xsok-1.02/solutions/Cyberbox.03.bsustar mbimathoptxsok-1.02/solutions/Cyberbox.04.bs100644 144 62 243 5664414663 15436 0ustar mbimathopttœ,.вГ,џџџџџџџџџџџџџџџџ,џџџџџџџџџџџџCyberbox.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Cyberbox.04.mm100644 144 62 0 5664414663 23317 1xsok-1.02/solutions/Cyberbox.04.bsustar mbimathoptxsok-1.02/solutions/Cyberbox.04.mp100644 144 62 0 5664414663 23322 1xsok-1.02/solutions/Cyberbox.04.bsustar mbimathoptxsok-1.02/solutions/Cyberbox.05.bs100644 144 62 221 5664414670 15431 0ustar mbimathopttЎ.вИџџџџџџџџџџџџџџџџџџџџџџџџџџџџCyberbox.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Cyberbox.05.mm100644 144 62 0 5664414670 23317 1xsok-1.02/solutions/Cyberbox.05.bsustar mbimathoptxsok-1.02/solutions/Cyberbox.05.mp100644 144 62 0 5664414670 23322 1xsok-1.02/solutions/Cyberbox.05.bsustar mbimathoptxsok-1.02/solutions/Cyberbox.06.bs100644 144 62 247 5664414672 15444 0ustar mbimathoptt˜ 0.вК0џџџџџџџџџџџџџџџџ0џџџџџџџџџџџџCyberbox.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Cyberbox.06.mm100644 144 62 0 5664414672 23323 1xsok-1.02/solutions/Cyberbox.06.bsustar mbimathoptxsok-1.02/solutions/Cyberbox.06.mp100644 144 62 0 5664414672 23326 1xsok-1.02/solutions/Cyberbox.06.bsustar mbimathoptxsok-1.02/solutions/Cyberbox.07.bs100644 144 62 237 5664414676 15450 0ustar mbimathoptt (.вО(џџџџџџџџџџџџџџџџ(џџџџџџџџџџџџCyberbox.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Cyberbox.07.mm100644 144 62 0 5664414676 23331 1xsok-1.02/solutions/Cyberbox.07.bsustar mbimathoptxsok-1.02/solutions/Cyberbox.07.mp100644 144 62 0 5664414676 23334 1xsok-1.02/solutions/Cyberbox.07.bsustar mbimathoptxsok-1.02/solutions/Cyberbox.08.bs100644 144 62 231 5664414725 15436 0ustar mbimathopttІ ".ве"џџџџџџџџџџџџџџџџ"џџџџџџџџџџџџCyberbox.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Cyberbox.08.mm100644 144 62 0 5664414725 23326 1xsok-1.02/solutions/Cyberbox.08.bsustar mbimathoptxsok-1.02/solutions/Cyberbox.08.mp100644 144 62 0 5664414725 23331 1xsok-1.02/solutions/Cyberbox.08.bsustar mbimathoptxsok-1.02/solutions/Cyberbox.09.bs100644 144 62 274 5664414757 15453 0ustar mbimathopttƒE.вя EџџџџџџџџџџџџџџџџEџџџџџџџџџџџџCyberbox.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Cyberbox.09.mm100644 144 62 0 5664414757 23335 1xsok-1.02/solutions/Cyberbox.09.bsustar mbimathoptxsok-1.02/solutions/Cyberbox.09.mp100644 144 62 0 5664414757 23340 1xsok-1.02/solutions/Cyberbox.09.bsustar mbimathoptxsok-1.02/solutions/Cyberbox.10.bs100644 144 62 323 5664414766 15436 0ustar mbimathopttl \.ві \џџџџџџџџџџџџџџџџ\џџџџџџџџџџџџCyberbox.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Cyberbox.10.mm100644 144 62 0 5664414766 23315 1xsok-1.02/solutions/Cyberbox.10.bsustar mbimathoptxsok-1.02/solutions/Cyberbox.10.mp100644 144 62 0 5664414766 23320 1xsok-1.02/solutions/Cyberbox.10.bsustar mbimathoptxsok-1.02/solutions/Cyberbox.11.bs100644 144 62 317 5664415212 15425 0ustar mbimathopttpX.вŠ Xџџџџџџџџџџџџџџџџ;џџџџџџџџџџџџCyberbox.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Cyberbox.11.mm100644 144 62 0 5664415212 23302 1xsok-1.02/solutions/Cyberbox.11.bsustar mbimathoptxsok-1.02/solutions/Cyberbox.11.mp100644 144 62 0 5664415212 23305 1xsok-1.02/solutions/Cyberbox.11.bsustar mbimathoptxsok-1.02/solutions/Cyberbox.12.bs100644 144 62 261 5664416303 15426 0ustar mbimathopttŽ :.вУ :џџџџџџџџџџџџџџџџCyberbox.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Cyberbox.12.mm100644 144 62 0 5664416303 23306 1xsok-1.02/solutions/Cyberbox.12.bsustar mbimathoptxsok-1.02/solutions/Cyberbox.12.mp100644 144 62 0 5664416303 23311 1xsok-1.02/solutions/Cyberbox.12.bsustar mbimathoptxsok-1.02/solutions/Cyberbox.13.bs100644 144 62 403 5664417062 15430 0ustar mbimathoptt<&Œ.в2 ŒџџџџџџџџџџџџџџџџCyberbox.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Cyberbox.13.mm100644 144 62 0 5664417062 23313 1xsok-1.02/solutions/Cyberbox.13.bsustar mbimathoptxsok-1.02/solutions/Cyberbox.13.mp100644 144 62 0 5664417062 23316 1xsok-1.02/solutions/Cyberbox.13.bsustar mbimathoptxsok-1.02/solutions/Cyberbox.14.bs100644 144 62 245 5664417073 15437 0ustar mbimathopttš..в;.џџџџџџџџџџџџџџџџ.џџџџџџџџџџџџCyberbox.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Cyberbox.14.mm100644 144 62 0 5664417073 23317 1xsok-1.02/solutions/Cyberbox.14.bsustar mbimathoptxsok-1.02/solutions/README100640 144 62 224 5751511743 13756 0ustar mbimathopt Hi, Here's a couple of solutions to Sokoban. See what you can do with them. Thanks for a nice game. BJ bjdouma@xs4all.nl (Bauke Jan Douma) xsok-1.02/solutions/Cyberbox.14.mp100644 144 62 0 5664417073 23322 1xsok-1.02/solutions/Cyberbox.14.bsustar mbimathoptxsok-1.02/solutions/Cyberbox.15.bs100644 144 62 313 5664603300 15422 0ustar mbimathoptttT.гРTџџџџџџџџџџџџџџџџCyberbox.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Cyberbox.15.mm100644 144 62 0 5664603300 23307 1xsok-1.02/solutions/Cyberbox.15.bsustar mbimathoptxsok-1.02/solutions/Cyberbox.15.mp100644 144 62 0 5664603300 23312 1xsok-1.02/solutions/Cyberbox.15.bsustar mbimathoptxsok-1.02/solutions/Cyberbox.16.bs100644 144 62 337 5664650167 15446 0ustar mbimathoptt` h.гPwhџџџџџџџџџџџџџџџџCyberbox.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Cyberbox.16.mm100644 144 62 0 5664650167 23326 1xsok-1.02/solutions/Cyberbox.16.bsustar mbimathoptxsok-1.02/solutions/Cyberbox.16.mp100644 144 62 343 5664603522 15444 0ustar mbimathoptt\ l.гRlџџџџџџџџџџџџџџџџCyberbox.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Cyberbox.score100644 144 62 2260 5665171403 15735 0ustar mbimathopttЗŒrœЎ˜ ІƒlpŽ<št`џџџ<V,0("E\X:Œ.Thџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ    & џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџxsok-1.02/solutions/Sokoban.01.asl100644 144 62 1017 5661370454 15441 0ustar mbimathopttxsok-1.02/solutions/Sokoban.01.bs100644 144 62 547 5663625747 15267 0ustar mbimathoptt9Цa№.Юeџ№џџџџџџџџџџџџџџџџ№џџџџџџџџџџџџSokoban.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Sokoban.01.mm100644 144 62 0 5663625747 22755 1xsok-1.02/solutions/Sokoban.01.bsustar mbimathoptxsok-1.02/solutions/Sokoban.01.mp100644 144 62 0 5663625747 22760 1xsok-1.02/solutions/Sokoban.01.bsustar mbimathoptxsok-1.02/solutions/Sokoban.02.bs100644 144 62 1174 5663625750 15277 0ustar mbimathopttFе‡.ЮŸ?џџџџџџџџџџџџџџџџџџџџџџџџџџџџSokoban.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Sokoban.02.mm100644 144 62 0 5663625750 22751 1xsok-1.02/solutions/Sokoban.02.bsustar mbimathoptxsok-1.02/solutions/Sokoban.02.mp100644 144 62 0 5663625750 22754 1xsok-1.02/solutions/Sokoban.02.bsustar mbimathoptxsok-1.02/solutions/Sokoban.03.bs100644 144 62 753 5663625750 15262 0ustar mbimathopttKŽt.ЮftџџџџџџџџџџџџџџџџtџџџџџџџџџџџџSokoban.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Sokoban.03.mm100644 144 62 0 5663625750 22753 1xsok-1.02/solutions/Sokoban.03.bsustar mbimathoptxsok-1.02/solutions/Sokoban.03.mp100644 144 62 0 5663625750 22756 1xsok-1.02/solutions/Sokoban.03.bsustar mbimathoptxsok-1.02/solutions/Sokoban.04.bs100644 144 62 1752 5663625750 15303 0ustar mbimathopttc{ms.ЮfsџџџџџџџџџџџџџџџџsџџџџџџџџџџџџSokoban.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Sokoban.04.mm100644 144 62 0 5663625750 22755 1xsok-1.02/solutions/Sokoban.04.bsustar mbimathoptxsok-1.02/solutions/Sokoban.04.mp100644 144 62 0 5663625750 22760 1xsok-1.02/solutions/Sokoban.04.bsustar mbimathoptxsok-1.02/solutions/Sokoban.05.bs100644 144 62 1010 5663625750 15267 0ustar mbimathopttNЩ‘.Юf‘џџџџџџџџџџџџџџџџ‘џџџџџџџџџџџџSokoban.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Sokoban.05.mm100644 144 62 0 5663625750 22757 1xsok-1.02/solutions/Sokoban.05.bsustar mbimathoptxsok-1.02/solutions/Sokoban.05.mp100644 144 62 0 5663625750 22762 1xsok-1.02/solutions/Sokoban.05.bsustar mbimathoptxsok-1.02/solutions/Sokoban.06.bs100644 144 62 671 5663625750 15264 0ustar mbimathopttH’nB.ЮŸ›BџџџџџџџџџџџџџџџџBџџџџџџџџџџџџSokoban.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Sokoban.06.mm100644 144 62 0 5663625750 22761 1xsok-1.02/solutions/Sokoban.06.bsustar mbimathoptxsok-1.02/solutions/Sokoban.06.mp100644 144 62 0 5663625750 22764 1xsok-1.02/solutions/Sokoban.06.bsustar mbimathoptxsok-1.02/solutions/Sokoban.07.bs100644 144 62 674 5663625750 15270 0ustar mbimathopttLOrE.ЮfEџџџџџџџџџџџџџџџџEџџџџџџџџџџџџSokoban.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Sokoban.07.mm100644 144 62 0 5663625750 22763 1xsok-1.02/solutions/Sokoban.07.bsustar mbimathoptxsok-1.02/solutions/Sokoban.07.mp100644 144 62 0 5663625750 22766 1xsok-1.02/solutions/Sokoban.07.bsustar mbimathoptxsok-1.02/solutions/Sokoban.08.bs100644 144 62 1400 5663625750 15275 0ustar mbimathopttaЧш‰.Ю j‰џџџџџџџџџџџџџџџџ‰џџџџџџџџџџџџSokoban.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Sokoban.08.mm100644 144 62 1356 5663625672 15317 0ustar mbimathopttaюw.Ю жwџџџџџџџџџџџџџџџџwџџџџџџџџџџџџSokoban.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Sokoban.08.mp100644 144 62 0 5663625750 22770 1xsok-1.02/solutions/Sokoban.08.bsustar mbimathoptxsok-1.02/solutions/Sokoban.09.bs100644 144 62 1327 5663625750 15306 0ustar mbimathopttRэ`.Юf `џџџџџџџџџџџџџџџџ`џџџџџџџџџџџџSokoban.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Sokoban.09.mm100644 144 62 0 5663625750 22767 1xsok-1.02/solutions/Sokoban.09.bsustar mbimathoptxsok-1.02/solutions/Sokoban.09.mp100644 144 62 0 5663625750 22772 1xsok-1.02/solutions/Sokoban.09.bsustar mbimathoptxsok-1.02/solutions/Sokoban.10.bs100644 144 62 3240 5663625750 15272 0ustar mbimathoptt‰Ћ).Юf )џџџџџџџџџџџџџџџџ)џџџџџџџџџџџџSokoban.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Sokoban.10.mm100644 144 62 0 5663625750 22747 1xsok-1.02/solutions/Sokoban.10.bsustar mbimathoptxsok-1.02/solutions/Sokoban.10.mp100644 144 62 0 5663625750 22752 1xsok-1.02/solutions/Sokoban.10.bsustar mbimathoptxsok-1.02/solutions/Sokoban.11.bs100644 144 62 2056 5663625750 15277 0ustar mbimathopttPwѕЗ.Юf ЗџџџџџџџџџџџџџџџџЗџџџџџџџџџџџџSokoban.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Sokoban.11.mm100644 144 62 0 5663625750 22751 1xsok-1.02/solutions/Sokoban.11.bsustar mbimathoptxsok-1.02/solutions/Sokoban.11.mp100644 144 62 0 5663625750 22754 1xsok-1.02/solutions/Sokoban.11.bsustar mbimathoptxsok-1.02/solutions/Sokoban.12.bs100644 144 62 1722 5663625750 15277 0ustar mbimathopttUЕм[.Юf [џџџџџџџџџџџџџџџџ[џџџџџџџџџџџџSokoban.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Sokoban.12.mm100644 144 62 0 5663625750 22753 1xsok-1.02/solutions/Sokoban.12.bsustar mbimathoptxsok-1.02/solutions/Sokoban.12.mp100644 144 62 0 5663625750 22756 1xsok-1.02/solutions/Sokoban.12.bsustar mbimathoptxsok-1.02/solutions/Sokoban.13.bs100644 144 62 1641 5663625750 15300 0ustar mbimathopttXђђ*.Юf *џџџџџџџџџџџџџџџџ*џџџџџџџџџџџџSokoban.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Sokoban.13.mm100644 144 62 0 5663625750 22755 1xsok-1.02/solutions/Sokoban.13.bsustar mbimathoptxsok-1.02/solutions/Sokoban.13.mp100644 144 62 0 5663625750 22760 1xsok-1.02/solutions/Sokoban.13.bsustar mbimathoptxsok-1.02/solutions/Sokoban.14.bs100644 144 62 2252 5663625750 15300 0ustar mbimathoptt_зя3.Юf3џџџџџџџџџџџџџџџџ3џџџџџџџџџџџџSokoban.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Sokoban.14.mm100644 144 62 0 5663625750 22757 1xsok-1.02/solutions/Sokoban.14.bsustar mbimathoptxsok-1.02/solutions/Sokoban.14.mp100644 144 62 0 5663625750 22762 1xsok-1.02/solutions/Sokoban.14.bsustar mbimathoptxsok-1.02/solutions/Sokoban.15.bs100644 144 62 1441 5663625750 15300 0ustar mbimathopttYJ’Њ.ЮfЊџџџџџџџџџџџџџџџџЊџџџџџџџџџџџџSokoban.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Sokoban.15.mm100644 144 62 0 5663625750 22761 1xsok-1.02/solutions/Sokoban.15.bsustar mbimathoptxsok-1.02/solutions/Sokoban.15.mp100644 144 62 0 5663625750 22764 1xsok-1.02/solutions/Sokoban.15.bsustar mbimathoptxsok-1.02/solutions/Sokoban.16.bs100644 144 62 1751 5663625751 15306 0ustar mbimathopttUЦиr.Юf rџџџџџџџџџџџџџџџџrџџџџџџџџџџџџSokoban.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Sokoban.16.mm100644 144 62 0 5663625751 22764 1xsok-1.02/solutions/Sokoban.16.bsustar mbimathoptxsok-1.02/solutions/Sokoban.16.mp100644 144 62 0 5663625751 22767 1xsok-1.02/solutions/Sokoban.16.bsustar mbimathoptxsok-1.02/solutions/Sokoban.17.bs100644 144 62 1226 5663625751 15304 0ustar mbimathoptt4е.Юf!џџџџџџџџџџџџџџџџџџџџџџџџџџџџSokoban.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Sokoban.17.mm100644 144 62 0 5663625751 22766 1xsok-1.02/solutions/Sokoban.17.bsustar mbimathoptxsok-1.02/solutions/Sokoban.17.mp100644 144 62 0 5663625751 22771 1xsok-1.02/solutions/Sokoban.17.bsustar mbimathoptxsok-1.02/solutions/Sokoban.18.bs100644 144 62 1621 5663625751 15304 0ustar mbimathopttI:’.Юf!џџџџџџџџџџџџџџџџџџџџџџџџџџџџSokoban.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Sokoban.18.mm100644 144 62 0 5663625751 22770 1xsok-1.02/solutions/Sokoban.18.bsustar mbimathoptxsok-1.02/solutions/Sokoban.18.mp100644 144 62 0 5663625751 22773 1xsok-1.02/solutions/Sokoban.18.bsustar mbimathoptxsok-1.02/solutions/Sokoban.19.bs100644 144 62 1702 5663625751 15305 0ustar mbimathopttR‘.K.Юf"KџџџџџџџџџџџџџџџџKџџџџџџџџџџџџSokoban.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Sokoban.19.mm100644 144 62 0 5663625751 22772 1xsok-1.02/solutions/Sokoban.19.bsustar mbimathoptxsok-1.02/solutions/Sokoban.19.mp100644 144 62 0 5663625751 22775 1xsok-1.02/solutions/Sokoban.19.bsustar mbimathoptxsok-1.02/solutions/Sokoban.20.bs100644 144 62 4045 5663625751 15300 0ustar mbimathopttSмЎ.Юf$ЎџџџџџџџџџџџџџџџџЎџџџџџџџџџџџџSokoban.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Sokoban.20.mm100644 144 62 0 5663625751 22752 1xsok-1.02/solutions/Sokoban.20.bsustar mbimathoptxsok-1.02/solutions/Sokoban.20.mp100644 144 62 0 5663625751 22755 1xsok-1.02/solutions/Sokoban.20.bsustar mbimathoptxsok-1.02/solutions/Sokoban.21.bs100644 144 62 1161 5663625751 15275 0ustar mbimathopttQј—њ.Юf%њџџџџџџџџџџџџџџџџњџџџџџџџџџџџџSokoban.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Sokoban.21.mm100644 144 62 0 5663625751 22754 1xsok-1.02/solutions/Sokoban.21.bsustar mbimathoptxsok-1.02/solutions/Sokoban.21.mp100644 144 62 0 5663625751 22757 1xsok-1.02/solutions/Sokoban.21.bsustar mbimathoptxsok-1.02/solutions/Sokoban.22.bs100644 144 62 2425 5663625751 15302 0ustar mbimathoptt~R\ž.Юf&žџџџџџџџџџџџџџџџџžџџџџџџџџџџџџSokoban.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Sokoban.22.mm100644 144 62 0 5663625751 22756 1xsok-1.02/solutions/Sokoban.22.bsustar mbimathoptxsok-1.02/solutions/Sokoban.22.mp100644 144 62 0 5663625751 22761 1xsok-1.02/solutions/Sokoban.22.bsustar mbimathoptxsok-1.02/solutions/Sokoban.23.bs100644 144 62 2404 5663625751 15300 0ustar mbimathopttV‹д.Юf'џџџџџџџџџџџџџџџџџџџџџџџџџџџџSokoban.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Sokoban.23.mm100644 144 62 0 5663625751 22760 1xsok-1.02/solutions/Sokoban.23.bsustar mbimathoptxsok-1.02/solutions/Sokoban.23.mp100644 144 62 0 5663625751 22763 1xsok-1.02/solutions/Sokoban.23.bsustar mbimathoptxsok-1.02/solutions/Sokoban.24.bs100644 144 62 3033 5663625751 15300 0ustar mbimathoptta@6Є.Юf(ЄџџџџџџџџџџџџџџџџЄџџџџџџџџџџџџSokoban.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Sokoban.24.mm100644 144 62 0 5663625751 22762 1xsok-1.02/solutions/Sokoban.24.bsustar mbimathoptxsok-1.02/solutions/Sokoban.24.mp100644 144 62 0 5663625751 22765 1xsok-1.02/solutions/Sokoban.24.bsustar mbimathoptxsok-1.02/solutions/Sokoban.25.bs100644 144 62 3072 5663625751 15304 0ustar mbimathoptt\!ŠУ.Юf)УџџџџџџџџџџџџџџџџУџџџџџџџџџџџџSokoban.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Sokoban.25.mm100644 144 62 0 5663625751 22764 1xsok-1.02/solutions/Sokoban.25.bsustar mbimathoptxsok-1.02/solutions/Sokoban.25.mp100644 144 62 0 5663625751 22767 1xsok-1.02/solutions/Sokoban.25.bsustar mbimathoptxsok-1.02/solutions/Sokoban.26.bs100644 144 62 1250 5663625751 15301 0ustar mbimathopttOѕХ1.Юf*1џџџџџџџџџџџџџџџџ1џџџџџџџџџџџџSokoban.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Sokoban.26.mm100644 144 62 0 5663625751 22766 1xsok-1.02/solutions/Sokoban.26.bsustar mbimathoptxsok-1.02/solutions/Sokoban.26.mp100644 144 62 0 5663625751 22771 1xsok-1.02/solutions/Sokoban.26.bsustar mbimathoptxsok-1.02/solutions/Sokoban.27.bs100644 144 62 2647 5663625751 15315 0ustar mbimathopttaОm0.Юf+0џџџџџџџџџџџџџџџџ0џџџџџџџџџџџџSokoban.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Sokoban.27.mm100644 144 62 0 5663625751 22770 1xsok-1.02/solutions/Sokoban.27.bsustar mbimathoptxsok-1.02/solutions/Sokoban.27.mp100644 144 62 0 5663625751 22773 1xsok-1.02/solutions/Sokoban.27.bsustar mbimathoptxsok-1.02/solutions/Sokoban.28.bs100644 144 62 1740 5663625751 15307 0ustar mbimathoptte—8i.Юf,iџџџџџџџџџџџџџџџџiџџџџџџџџџџџџSokoban.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Sokoban.28.mm100644 144 62 0 5663625751 22772 1xsok-1.02/solutions/Sokoban.28.bsustar mbimathoptxsok-1.02/solutions/Sokoban.28.mp100644 144 62 0 5663625751 22775 1xsok-1.02/solutions/Sokoban.28.bsustar mbimathoptxsok-1.02/solutions/Sokoban.29.bs100644 144 62 1624 5663625751 15311 0ustar mbimathopttИ.Юf-џџџџџџџџџџџџџџџџџџџџџџџџџџџџSokoban.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Sokoban.29.mm100644 144 62 0 5663625751 22774 1xsok-1.02/solutions/Sokoban.29.bsustar mbimathoptxsok-1.02/solutions/Sokoban.29.mp100644 144 62 0 5663625751 22777 1xsok-1.02/solutions/Sokoban.29.bsustar mbimathoptxsok-1.02/solutions/Sokoban.30.bs100644 144 62 2676 5664211754 15304 0ustar mbimathopttTыыG.бьGя џџџџџџџџџџџџSokoban.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Sokoban.30.mm100644 144 62 0 5664211754 22747 1xsok-1.02/solutions/Sokoban.30.bsustar mbimathoptxsok-1.02/solutions/Sokoban.30.mp100644 144 62 0 5664211754 22752 1xsok-1.02/solutions/Sokoban.30.bsustar mbimathoptxsok-1.02/solutions/Sokoban.31.bs100644 144 62 1723 5663625751 15302 0ustar mbimathopttgд\.Юf.\џџџџџџџџџџџџџџџџ\џџџџџџџџџџџџSokoban.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Sokoban.31.mm100644 144 62 0 5663625751 22756 1xsok-1.02/solutions/Sokoban.31.bsustar mbimathoptxsok-1.02/solutions/Sokoban.31.mp100644 144 62 0 5663625751 22761 1xsok-1.02/solutions/Sokoban.31.bsustar mbimathoptxsok-1.02/solutions/Sokoban.32.bs100644 144 62 1116 5663625752 15300 0ustar mbimathopttZOз.Юsѓ зџџџџџџџџџџџџџџџџзџџџџџџџџџџџџSokoban.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Sokoban.32.mm100644 144 62 0 5663625752 22761 1xsok-1.02/solutions/Sokoban.32.bsustar mbimathoptxsok-1.02/solutions/Sokoban.32.mp100644 144 62 0 5663625752 22764 1xsok-1.02/solutions/Sokoban.32.bsustar mbimathoptxsok-1.02/solutions/Sokoban.33.bs100644 144 62 1521 5663625752 15301 0ustar mbimathopttWNРк.Ю_!кџџџџџџџџџџџџџџџџкџџџџџџџџџџџџSokoban.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Sokoban.33.mm100644 144 62 0 5663625752 22763 1xsok-1.02/solutions/Sokoban.33.bsustar mbimathoptxsok-1.02/solutions/Sokoban.33.mp100644 144 62 0 5663625752 22766 1xsok-1.02/solutions/Sokoban.33.bsustar mbimathoptxsok-1.02/solutions/Sokoban.34.bs100644 144 62 1415 5663625752 15304 0ustar mbimathopttTVЎž.Юƒ "žџџџџџџџџџџџџџџџџžџџџџџџџџџџџџSokoban&Michael Bischoff (m.bischoff@tu-bs.de)xsok-1.02/solutions/Sokoban.34.mm100644 144 62 0 5663625752 22765 1xsok-1.02/solutions/Sokoban.34.bsustar mbimathoptxsok-1.02/solutions/Sokoban.34.mp100644 144 62 0 5663625752 22770 1xsok-1.02/solutions/Sokoban.34.bsustar mbimathoptxsok-1.02/solutions/Sokoban.35.bs100644 144 62 2377 5663644007 15307 0ustar mbimathopttUŒŠˆ.ЯH#ˆџџџџџџџџџџџџџџџџSokoban.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Sokoban.35.mm100644 144 62 0 5663644007 22761 1xsok-1.02/solutions/Sokoban.35.bsustar mbimathoptxsok-1.02/solutions/Sokoban.35.mp100644 144 62 0 5663644007 22764 1xsok-1.02/solutions/Sokoban.35.bsustar mbimathoptxsok-1.02/solutions/Sokoban.36.bs100644 144 62 3222 5664071004 15266 0ustar mbimathoptt^{ .аr$с бџџџџџџџџџџџџSokoban.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Sokoban.36.mm100644 144 62 0 5664071004 22753 1xsok-1.02/solutions/Sokoban.36.bsustar mbimathoptxsok-1.02/solutions/Sokoban.36.mp100644 144 62 0 5664071004 22756 1xsok-1.02/solutions/Sokoban.36.bsustar mbimathoptxsok-1.02/solutions/Sokoban.37.bs100644 144 62 2106 5664675761 15313 0ustar mbimathopttb‰|Я.г{ё%Я* џџџџџџџџџџџџSokoban.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Sokoban.37.mm100644 144 62 0 5664675761 23001 1xsok-1.02/solutions/Sokoban.37.bsustar mbimathoptxsok-1.02/solutions/Sokoban.37.mp100644 144 62 0 5664675761 23004 1xsok-1.02/solutions/Sokoban.37.bsustar mbimathoptxsok-1.02/solutions/Sokoban.38.bs100644 144 62 747 5663625752 15277 0ustar mbimathoptt@&yp.ЮІC&pџџџџџџџџџџџџџџџџpџџџџџџџџџџџџSokoban.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Sokoban.38.mm100644 144 62 0 5663625752 22775 1xsok-1.02/solutions/Sokoban.38.bsustar mbimathoptxsok-1.02/solutions/Sokoban.38.mp100644 144 62 0 5663625752 23000 1xsok-1.02/solutions/Sokoban.38.bsustar mbimathoptxsok-1.02/solutions/Sokoban.39.bs100644 144 62 3561 5664701060 15301 0ustar mbimathopttg.Јњ.г‚0'њƒІ џџџџџџџџџџџџSokoban.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Sokoban.39.mm100644 144 62 0 5664701060 22763 1xsok-1.02/solutions/Sokoban.39.bsustar mbimathoptxsok-1.02/solutions/Sokoban.39.mp100644 144 62 0 5664701060 22766 1xsok-1.02/solutions/Sokoban.39.bsustar mbimathoptxsok-1.02/solutions/Sokoban.40.bs100644 144 62 2646 5665215612 15300 0ustar mbimathopttS}J/.еŠ(/kџџџџџџџџџџџџSokoban.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Sokoban.40.mm100644 144 62 0 5665215612 22747 1xsok-1.02/solutions/Sokoban.40.bsustar mbimathoptxsok-1.02/solutions/Sokoban.40.mp100644 144 62 0 5665215612 22752 1xsok-1.02/solutions/Sokoban.40.bsustar mbimathoptxsok-1.02/solutions/Sokoban.41.bs100644 144 62 1364 5664706232 15277 0ustar mbimathopttUСё}.гŒš)}џџџџџџџџџџџџџџџџSokoban.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Sokoban.41.mm100644 144 62 0 5664706232 22753 1xsok-1.02/solutions/Sokoban.41.bsustar mbimathoptxsok-1.02/solutions/Sokoban.41.mp100644 144 62 0 5664706232 22756 1xsok-1.02/solutions/Sokoban.41.bsustar mbimathoptxsok-1.02/solutions/Sokoban.42.bs100644 144 62 2304 5747513072 15273 0ustar mbimathopttu1 _/ž–:*_џџџџџџџџџџџџџџџџSokoban(null)@Sagittarius.xs4all.nlxsok-1.02/solutions/Sokoban.42.mm100644 144 62 0 5747513072 22755 1xsok-1.02/solutions/Sokoban.42.bsustar mbimathoptxsok-1.02/solutions/Sokoban.42.mp100644 144 62 0 5747513072 22760 1xsok-1.02/solutions/Sokoban.42.bsustar mbimathoptxsok-1.02/solutions/Sokoban.43.bs100644 144 62 1275 5751162363 15300 0ustar mbimathopttB–X/Єфѓ+XџџџџџџџџџџџџџџџџSokoban(null)@Sagittarius.xs4all.nlxsok-1.02/solutions/Sokoban.43.mm100644 144 62 0 5751162363 22755 1xsok-1.02/solutions/Sokoban.43.bsustar mbimathoptxsok-1.02/solutions/Sokoban.43.mp100644 144 62 0 5751162363 22760 1xsok-1.02/solutions/Sokoban.43.bsustar mbimathoptxsok-1.02/solutions/Sokoban.44.bs100644 144 62 1212 5751165630 15270 0ustar mbimathoptt@uУ%/Єы˜,%џџџџџџџџџџџџџџџџSokoban(null)@Sagittarius.xs4all.nlxsok-1.02/solutions/Sokoban.44.mm100644 144 62 0 5751165630 22757 1xsok-1.02/solutions/Sokoban.44.bsustar mbimathoptxsok-1.02/solutions/Sokoban.44.mp100644 144 62 0 5751165630 22762 1xsok-1.02/solutions/Sokoban.44.bsustar mbimathoptxsok-1.02/solutions/Sokoban.45.bs100644 144 62 2044 5750247737 15305 0ustar mbimathopttYM>П/ЁOп-ПџџџџџџџџџџџџџџџџSokoban(null)@Sagittarius.xs4all.nlxsok-1.02/solutions/Sokoban.45.mm100644 144 62 0 5750247737 22771 1xsok-1.02/solutions/Sokoban.45.bsustar mbimathoptxsok-1.02/solutions/Sokoban.45.mp100644 144 62 0 5750247737 22774 1xsok-1.02/solutions/Sokoban.45.bsustar mbimathoptxsok-1.02/solutions/Sokoban.46.bs100644 144 62 2014 5750766402 15276 0ustar mbimathopttP#џЇ/Ѓэ.ЇџџџџџџџџџџџџџџџџSokoban(null)@Sagittarius.xs4all.nlxsok-1.02/solutions/Sokoban.46.mm100644 144 62 0 5750766402 22766 1xsok-1.02/solutions/Sokoban.46.bsustar mbimathoptxsok-1.02/solutions/Sokoban.46.mp100644 144 62 0 5750766402 22771 1xsok-1.02/solutions/Sokoban.46.bsustar mbimathoptxsok-1.02/solutions/Sokoban.47.bs100644 144 62 1407 5750465462 15306 0ustar mbimathopttZ8пЂ/Ђk2/ЂџџџџџџџџџџџџџџџџSokoban(null)@Sagittarius.xs4all.nlxsok-1.02/solutions/Sokoban.47.mm100644 144 62 0 5750465462 22772 1xsok-1.02/solutions/Sokoban.47.bsustar mbimathoptxsok-1.02/solutions/Sokoban.47.mp100644 144 62 0 5750465462 22775 1xsok-1.02/solutions/Sokoban.47.bsustar mbimathoptxsok-1.02/solutions/Sokoban.48.bs100644 144 62 1214 5750467764 15312 0ustar mbimathopttЁ­Ю'/Ђoє0'џџџџџџџџџџџџџџџџSokoban(null)@Sagittarius.xs4all.nlxsok-1.02/solutions/Sokoban.48.mm100644 144 62 0 5750467764 23003 1xsok-1.02/solutions/Sokoban.48.bsustar mbimathoptxsok-1.02/solutions/Sokoban.48.mp100644 144 62 0 5750467764 23006 1xsok-1.02/solutions/Sokoban.48.bsustar mbimathoptxsok-1.02/solutions/Sokoban.49.bs100644 144 62 1564 5750474030 15303 0ustar mbimathopttMA/Ђx1џџџџџџџџџџџџџџџџSokoban(null)@Sagittarius.xs4all.nlxsok-1.02/solutions/Sokoban.49.mm100644 144 62 0 5750474030 22765 1xsok-1.02/solutions/Sokoban.49.bsustar mbimathoptxsok-1.02/solutions/Sokoban.49.mp100644 144 62 0 5750474030 22770 1xsok-1.02/solutions/Sokoban.49.bsustar mbimathoptxsok-1.02/solutions/Sokoban.50.bs100644 144 62 2416 5751176234 15276 0ustar mbimathopttPЛžЉ/Єќœ2ЉџџџџџџџџџџџџџџџџSokoban(null)@Sagittarius.xs4all.nlxsok-1.02/solutions/Sokoban.50.mm100644 144 62 0 5751176234 22753 1xsok-1.02/solutions/Sokoban.50.bsustar mbimathoptxsok-1.02/solutions/Sokoban.50.mp100644 144 62 0 5751176234 22756 1xsok-1.02/solutions/Sokoban.50.bsustar mbimathoptxsok-1.02/solutions/Sokoban.51.bs100644 144 62 450 5663644367 15264 0ustar mbimathopttCƒ6Б.ЯHї3БџџџџџџџџџџџџџџџџSokoban.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Sokoban.51.mm100644 144 62 0 5663644367 22766 1xsok-1.02/solutions/Sokoban.51.bsustar mbimathoptxsok-1.02/solutions/Sokoban.51.mp100644 144 62 0 5663644367 22771 1xsok-1.02/solutions/Sokoban.51.bsustar mbimathoptxsok-1.02/solutions/Sokoban.52.bs100644 144 62 622 5663644604 15260 0ustar mbimathoptt@ѓm.ЯI„4џџџџџџџџџџџџџџџџSokoban.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Sokoban.52.mm100644 144 62 0 5663644604 22762 1xsok-1.02/solutions/Sokoban.52.bsustar mbimathoptxsok-1.02/solutions/Sokoban.52.mp100644 144 62 0 5663644604 22765 1xsok-1.02/solutions/Sokoban.52.bsustar mbimathoptxsok-1.02/solutions/Sokoban.53.bs100644 144 62 1356 5663645303 15303 0ustar mbimathopttW‰Фw.ЯJУ5wџџџџџџџџџџџџџџџџSokoban.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Sokoban.53.mm100644 144 62 0 5663645303 22761 1xsok-1.02/solutions/Sokoban.53.bsustar mbimathoptxsok-1.02/solutions/Sokoban.53.mp100644 144 62 0 5663645303 22764 1xsok-1.02/solutions/Sokoban.53.bsustar mbimathoptxsok-1.02/solutions/Sokoban.54.bs100644 144 62 1314 5663646144 15302 0ustar mbimathoptt[‰ХU.ЯLd6UџџџџџџџџџџџџџџџџSokoban.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Sokoban.54.mm100644 144 62 0 5663646144 22767 1xsok-1.02/solutions/Sokoban.54.bsustar mbimathoptxsok-1.02/solutions/Sokoban.54.mp100644 144 62 0 5663646144 22772 1xsok-1.02/solutions/Sokoban.54.bsustar mbimathoptxsok-1.02/solutions/Sokoban.55.bs100644 144 62 1070 5751177362 15301 0ustar mbimathopttNс†г/Єўђ7гџџџџџџџџџџџџџџџџSokoban(null)@Sagittarius.xs4all.nlxsok-1.02/solutions/Sokoban.55.mm100644 144 62 0 5751177362 22770 1xsok-1.02/solutions/Sokoban.55.bsustar mbimathoptxsok-1.02/solutions/Sokoban.55.mp100644 144 62 0 5751177362 22773 1xsok-1.02/solutions/Sokoban.55.bsustar mbimathoptxsok-1.02/solutions/Sokoban.56.bs100644 144 62 1323 5751202141 15263 0ustar mbimathopttZXсn/Ѕa8nџџџџџџџџџџџџџџџџSokoban(null)@Sagittarius.xs4all.nlxsok-1.02/solutions/Sokoban.56.mm100644 144 62 0 5751202141 22752 1xsok-1.02/solutions/Sokoban.56.bsustar mbimathoptxsok-1.02/solutions/Sokoban.56.mp100644 144 62 0 5751202141 22755 1xsok-1.02/solutions/Sokoban.56.bsustar mbimathoptxsok-1.02/solutions/Sokoban.57.bs100644 144 62 1403 5750706012 15270 0ustar mbimathopttYœяž/ЃŒ 9žџџџџџџџџџџџџџџџџSokoban(null)@Sagittarius.xs4all.nlxsok-1.02/solutions/Sokoban.57.mm100644 144 62 0 5750706012 22761 1xsok-1.02/solutions/Sokoban.57.bsustar mbimathoptxsok-1.02/solutions/Sokoban.57.mp100644 144 62 0 5750706012 22764 1xsok-1.02/solutions/Sokoban.57.bsustar mbimathoptxsok-1.02/solutions/Sokoban.58.bs100644 144 62 1551 5750706776 15316 0ustar mbimathopttUŠщ/Ѓў:џџџџџџџџџџџџџџџџSokoban(null)@Sagittarius.xs4all.nlxsok-1.02/solutions/Sokoban.58.mm100644 144 62 0 5750706776 23004 1xsok-1.02/solutions/Sokoban.58.bsustar mbimathoptxsok-1.02/solutions/Sokoban.58.mp100644 144 62 0 5750706776 23007 1xsok-1.02/solutions/Sokoban.58.bsustar mbimathoptxsok-1.02/solutions/Sokoban.59.bs100644 144 62 1716 5750711041 15277 0ustar mbimathopttW_i/Ѓ’!;iџџџџџџџџџџџџџџџџSokoban(null)@Sagittarius.xs4all.nlxsok-1.02/solutions/Sokoban.59.mm100644 144 62 0 5750711041 22763 1xsok-1.02/solutions/Sokoban.59.bsustar mbimathoptxsok-1.02/solutions/Sokoban.59.mp100644 144 62 0 5750711041 22766 1xsok-1.02/solutions/Sokoban.59.bsustar mbimathoptxsok-1.02/solutions/Sokoban.60.bs100644 144 62 1201 5750711571 15264 0ustar mbimathopttP Ж/Ѓ“y<џџџџџџџџџџџџџџџџSokoban(null)@Sagittarius.xs4all.nlxsok-1.02/solutions/Sokoban.60.mm100644 144 62 0 5750711571 22753 1xsok-1.02/solutions/Sokoban.60.bsustar mbimathoptxsok-1.02/solutions/Sokoban.60.mp100644 144 62 0 5750711571 22756 1xsok-1.02/solutions/Sokoban.60.bsustar mbimathoptxsok-1.02/solutions/Sokoban.61.bs100644 144 62 1770 5750712355 15301 0ustar mbimathopttfЃ“/Ѓ”э=“џџџџџџџџџџџџџџџџSokoban(null)@Sagittarius.xs4all.nlxsok-1.02/solutions/Sokoban.61.mm100644 144 62 0 5750712355 22756 1xsok-1.02/solutions/Sokoban.61.bsustar mbimathoptxsok-1.02/solutions/Sokoban.61.mp100644 144 62 0 5750712355 22761 1xsok-1.02/solutions/Sokoban.61.bsustar mbimathoptxsok-1.02/solutions/Sokoban.62.bs100644 144 62 1467 5750715254 15306 0ustar mbimathopttXм§в/ЃšЌ>вџџџџџџџџџџџџџџџџSokoban(null)@Sagittarius.xs4all.nlxsok-1.02/solutions/Sokoban.62.mm100644 144 62 0 5750715254 22761 1xsok-1.02/solutions/Sokoban.62.bsustar mbimathoptxsok-1.02/solutions/Sokoban.62.mp100644 144 62 0 5750715254 22764 1xsok-1.02/solutions/Sokoban.62.bsustar mbimathoptxsok-1.02/solutions/Sokoban.63.bs100644 144 62 2664 5750717534 15312 0ustar mbimathopttRЯO/ЃŸ\?OџџџџџџџџџџџџџџџџSokoban(null)@Sagittarius.xs4all.nlxsok-1.02/solutions/Sokoban.63.mm100644 144 62 0 5750717534 22766 1xsok-1.02/solutions/Sokoban.63.bsustar mbimathoptxsok-1.02/solutions/Sokoban.63.mp100644 144 62 0 5750717534 22771 1xsok-1.02/solutions/Sokoban.63.bsustar mbimathoptxsok-1.02/solutions/Sokoban.64.bs100644 144 62 2240 5750720371 15272 0ustar mbimathopttQћ‰;/Ѓ љ@;џџџџџџџџџџџџџџџџSokoban(null)@Sagittarius.xs4all.nlxsok-1.02/solutions/Sokoban.64.mm100644 144 62 0 5750720371 22761 1xsok-1.02/solutions/Sokoban.64.bsustar mbimathoptxsok-1.02/solutions/Sokoban.64.mp100644 144 62 0 5750720371 22764 1xsok-1.02/solutions/Sokoban.64.bsustar mbimathoptxsok-1.02/solutions/Sokoban.65.bs100644 144 62 1444 5750726323 15303 0ustar mbimathopttV[лП/ЃЌгAПџџџџџџџџџџџџџџџџSokoban(null)@Sagittarius.xs4all.nlxsok-1.02/solutions/Sokoban.65.mm100644 144 62 0 5750726323 22766 1xsok-1.02/solutions/Sokoban.65.bsustar mbimathoptxsok-1.02/solutions/Sokoban.65.mp100644 144 62 0 5750726323 22771 1xsok-1.02/solutions/Sokoban.65.bsustar mbimathoptxsok-1.02/solutions/Sokoban.66.bs100644 144 62 2777 5751231045 15307 0ustar mbimathopttWЋš/Ѕ2%BšџџџџџџџџџџџџџџџџSokoban(null)@Sagittarius.xs4all.nlxsok-1.02/solutions/Sokoban.66.mm100644 144 62 0 5751231045 22761 1xsok-1.02/solutions/Sokoban.66.bsustar mbimathoptxsok-1.02/solutions/Sokoban.66.mp100644 144 62 0 5751231045 22764 1xsok-1.02/solutions/Sokoban.66.bsustar mbimathoptxsok-1.02/solutions/Sokoban.67.bs100644 144 62 2255 5750737226 15312 0ustar mbimathoptt`ю™H/ЃО–CHџџџџџџџџџџџџџџџџSokoban(null)@Sagittarius.xs4all.nlxsok-1.02/solutions/Sokoban.67.mm100644 144 62 0 5750737226 22776 1xsok-1.02/solutions/Sokoban.67.bsustar mbimathoptxsok-1.02/solutions/Sokoban.67.mp100644 144 62 0 5750737226 23001 1xsok-1.02/solutions/Sokoban.67.bsustar mbimathoptxsok-1.02/solutions/Sokoban.68.bs100644 144 62 2416 5750740312 15300 0ustar mbimathopttLyЇЉ/ЃРЪDЉџџџџџџџџџџџџџџџџSokoban(null)@Sagittarius.xs4all.nlxsok-1.02/solutions/Sokoban.68.mm100644 144 62 0 5750740312 22766 1xsok-1.02/solutions/Sokoban.68.bsustar mbimathoptxsok-1.02/solutions/Sokoban.68.mp100644 144 62 0 5750740312 22771 1xsok-1.02/solutions/Sokoban.68.bsustar mbimathoptxsok-1.02/solutions/Sokoban.69.bs100644 144 62 3270 5751207671 15307 0ustar mbimathopttQыS/ЅЙESџџџџџџџџџџџџџџџџSokoban(null)@Sagittarius.xs4all.nlxsok-1.02/solutions/Sokoban.69.mm100644 144 62 0 5751207671 22777 1xsok-1.02/solutions/Sokoban.69.bsustar mbimathoptxsok-1.02/solutions/Sokoban.69.mp100644 144 62 0 5751207671 23002 1xsok-1.02/solutions/Sokoban.69.bsustar mbimathoptxsok-1.02/solutions/Sokoban.70.bs100644 144 62 2266 5751222003 15265 0ustar mbimathoptt[бSQ/Ѕ$FQџџџџџџџџџџџџџџџџSokoban(null)@Sagittarius.xs4all.nlxsok-1.02/solutions/Sokoban.70.mm100644 144 62 0 5751222003 22741 1xsok-1.02/solutions/Sokoban.70.bsustar mbimathoptxsok-1.02/solutions/Sokoban.70.mp100644 144 62 0 5751222003 22744 1xsok-1.02/solutions/Sokoban.70.bsustar mbimathoptxsok-1.02/solutions/Sokoban.71.bs100644 144 62 2073 5751215153 15272 0ustar mbimathoptt\іBж/ЅkGжџџџџџџџџџџџџџџџџSokoban(null)@Sagittarius.xs4all.nlxsok-1.02/solutions/Sokoban.71.mm100644 144 62 0 5751215153 22753 1xsok-1.02/solutions/Sokoban.71.bsustar mbimathoptxsok-1.02/solutions/Sokoban.71.mp100644 144 62 0 5751215153 22756 1xsok-1.02/solutions/Sokoban.71.bsustar mbimathoptxsok-1.02/solutions/Sokoban.72.bs100644 144 62 1722 5750752160 15276 0ustar mbimathopttV/2m/ЃдpHmџџџџџџџџџџџџџџџџSokoban(null)@Sagittarius.xs4all.nlxsok-1.02/solutions/Sokoban.72.mm100644 144 62 0 5750752160 22760 1xsok-1.02/solutions/Sokoban.72.bsustar mbimathoptxsok-1.02/solutions/Sokoban.72.mp100644 144 62 0 5750752160 22763 1xsok-1.02/solutions/Sokoban.72.bsustar mbimathoptxsok-1.02/solutions/Sokoban.73.bs100644 144 62 2674 5750753206 15310 0ustar mbimathopttGНW/Ѓж†IWџџџџџџџџџџџџџџџџSokoban(null)@Sagittarius.xs4all.nlxsok-1.02/solutions/Sokoban.73.mm100644 144 62 0 5750753206 22764 1xsok-1.02/solutions/Sokoban.73.bsustar mbimathoptxsok-1.02/solutions/Sokoban.73.mp100644 144 62 0 5750753206 22767 1xsok-1.02/solutions/Sokoban.73.bsustar mbimathoptxsok-1.02/solutions/Sokoban.74.bs100644 144 62 1424 5750756110 15276 0ustar mbimathopttYљфЏ/ЃмHJЏџџџџџџџџџџџџџџџџSokoban(null)@Sagittarius.xs4all.nlxsok-1.02/solutions/Sokoban.74.mm100644 144 62 0 5750756110 22763 1xsok-1.02/solutions/Sokoban.74.bsustar mbimathoptxsok-1.02/solutions/Sokoban.74.mp100644 144 62 0 5750756110 22766 1xsok-1.02/solutions/Sokoban.74.bsustar mbimathoptxsok-1.02/solutions/Sokoban.75.bs100644 144 62 2224 5751217530 15275 0ustar mbimathopttWkc//ЅXK/џџџџџџџџџџџџџџџџSokoban(null)@Sagittarius.xs4all.nlxsok-1.02/solutions/Sokoban.75.mm100644 144 62 0 5751217530 22764 1xsok-1.02/solutions/Sokoban.75.bsustar mbimathoptxsok-1.02/solutions/Sokoban.75.mp100644 144 62 0 5751217530 22767 1xsok-1.02/solutions/Sokoban.75.bsustar mbimathoptxsok-1.02/solutions/Sokoban.76.bs100644 144 62 1472 5750757730 15314 0ustar mbimathoptt\? е/ЃпиLеџџџџџџџџџџџџџџџџSokoban(null)@Sagittarius.xs4all.nlxsok-1.02/solutions/Sokoban.76.mm100644 144 62 0 5750757730 23000 1xsok-1.02/solutions/Sokoban.76.bsustar mbimathoptxsok-1.02/solutions/Sokoban.76.mp100644 144 62 0 5750757730 23003 1xsok-1.02/solutions/Sokoban.76.bsustar mbimathoptxsok-1.02/solutions/Sokoban.77.bs100644 144 62 1031 5750475347 15305 0ustar mbimathopttEŒАД/ЂzчMДџџџџџџџџџџџџџџџџSokoban(null)@Sagittarius.xs4all.nlxsok-1.02/solutions/Sokoban.77.mm100644 144 62 0 5750475347 23003 1xsok-1.02/solutions/Sokoban.77.bsustar mbimathoptxsok-1.02/solutions/Sokoban.77.mp100644 144 62 0 5750475347 23006 1xsok-1.02/solutions/Sokoban.77.bsustar mbimathoptxsok-1.02/solutions/Sokoban.78.bs100644 144 62 1004 5750476337 15306 0ustar mbimathoptt?9ŒŸ/Ђ|пNŸџџџџџџџџџџџџџџџџSokoban(null)@Sagittarius.xs4all.nlxsok-1.02/solutions/Sokoban.78.mm100644 144 62 0 5750476337 23005 1xsok-1.02/solutions/Sokoban.78.bsustar mbimathoptxsok-1.02/solutions/Sokoban.78.mp100644 144 62 0 5750476337 23010 1xsok-1.02/solutions/Sokoban.78.bsustar mbimathoptxsok-1.02/solutions/Sokoban.79.bs100644 144 62 1257 5750477427 15322 0ustar mbimathopttLvИJ/ЂOJџџџџџџџџџџџџџџџџSokoban(null)@Sagittarius.xs4all.nlxsok-1.02/solutions/Sokoban.79.mm100644 144 62 0 5750477427 23010 1xsok-1.02/solutions/Sokoban.79.bsustar mbimathoptxsok-1.02/solutions/Sokoban.79.mp100644 144 62 0 5750477427 23013 1xsok-1.02/solutions/Sokoban.79.bsustar mbimathoptxsok-1.02/solutions/Sokoban.80.bs100644 144 62 1320 5750500075 15263 0ustar mbimathopttJ/яk/Ђ€=PkџџџџџџџџџџџџџџџџSokoban(null)@Sagittarius.xs4all.nlxsok-1.02/solutions/Sokoban.80.mm100644 144 62 0 5750500075 22752 1xsok-1.02/solutions/Sokoban.80.bsustar mbimathoptxsok-1.02/solutions/Sokoban.80.mp100644 144 62 0 5750500075 22755 1xsok-1.02/solutions/Sokoban.80.bsustar mbimathoptxsok-1.02/solutions/Sokoban.81.bs100644 144 62 1332 5750501336 15270 0ustar mbimathopttKЫu/Ђ‚оQuџџџџџџџџџџџџџџџџSokoban(null)@Sagittarius.xs4all.nlxsok-1.02/solutions/Sokoban.81.mm100644 144 62 0 5750501336 22755 1xsok-1.02/solutions/Sokoban.81.bsustar mbimathoptxsok-1.02/solutions/Sokoban.81.mp100644 144 62 0 5750501336 22760 1xsok-1.02/solutions/Sokoban.81.bsustar mbimathoptxsok-1.02/solutions/Sokoban.82.bs100644 144 62 762 5750503431 15255 0ustar mbimathopttN‘•/Ђ‡RџџџџџџџџџџџџџџџџSokoban(null)@Sagittarius.xs4all.nlxsok-1.02/solutions/Sokoban.82.mm100644 144 62 0 5750503431 22755 1xsok-1.02/solutions/Sokoban.82.bsustar mbimathoptxsok-1.02/solutions/Sokoban.82.mp100644 144 62 0 5750503431 22760 1xsok-1.02/solutions/Sokoban.82.bsustar mbimathoptxsok-1.02/solutions/Sokoban.83.bs100644 144 62 1207 5750504123 15270 0ustar mbimathopttCоа"/ЂˆSS"џџџџџџџџџџџџџџџџSokoban(null)@Sagittarius.xs4all.nlxsok-1.02/solutions/Sokoban.83.mm100644 144 62 0 5750504123 22756 1xsok-1.02/solutions/Sokoban.83.bsustar mbimathoptxsok-1.02/solutions/Sokoban.83.mp100644 144 62 0 5750504123 22761 1xsok-1.02/solutions/Sokoban.83.bsustar mbimathoptxsok-1.02/solutions/Sokoban.84.bs100644 144 62 1057 5750505053 15277 0ustar mbimathopttMмЁЪ/ЂŠ+TЪџџџџџџџџџџџџџџџџSokoban(null)@Sagittarius.xs4all.nlxsok-1.02/solutions/Sokoban.84.mm100644 144 62 0 5750505053 22763 1xsok-1.02/solutions/Sokoban.84.bsustar mbimathoptxsok-1.02/solutions/Sokoban.84.mp100644 144 62 0 5750505053 22766 1xsok-1.02/solutions/Sokoban.84.bsustar mbimathoptxsok-1.02/solutions/Sokoban.85.bs100644 144 62 3111 5750514436 15276 0ustar mbimathopttNЎOф/Ђ™UфџџџџџџџџџџџџџџџџSokoban(null)@Sagittarius.xs4all.nlxsok-1.02/solutions/Sokoban.85.mm100644 144 62 0 5750514436 22772 1xsok-1.02/solutions/Sokoban.85.bsustar mbimathoptxsok-1.02/solutions/Sokoban.85.mp100644 144 62 0 5750514436 22775 1xsok-1.02/solutions/Sokoban.85.bsustar mbimathoptxsok-1.02/solutions/Sokoban.86.bs100644 144 62 1566 5663625752 15322 0ustar mbimathopttLэšџ.ЮfЩVџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџSokoban.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Sokoban.86.mm100644 144 62 0 5663625752 23003 1xsok-1.02/solutions/Sokoban.86.bsustar mbimathoptxsok-1.02/solutions/Sokoban.86.mp100644 144 62 0 5663625752 23006 1xsok-1.02/solutions/Sokoban.86.bsustar mbimathoptxsok-1.02/solutions/Sokoban.87.bs100644 144 62 2510 5663625752 15311 0ustar mbimathoptt…Ykб.ЮfЬWбџџџџџџџџџџџџџџџџбџџџџџџџџџџџџSokoban.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Sokoban.87.mm100644 144 62 0 5663625752 23005 1xsok-1.02/solutions/Sokoban.87.bsustar mbimathoptxsok-1.02/solutions/Sokoban.87.mp100644 144 62 0 5663625752 23010 1xsok-1.02/solutions/Sokoban.87.bsustar mbimathoptxsok-1.02/solutions/Sokoban.88.bs100644 144 62 2621 5663643224 15307 0ustar mbimathopttVјЛ.ЯF”XџџџџџџџџџџџџџџџџSokoban.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Sokoban.88.mm100644 144 62 0 5663643224 23001 1xsok-1.02/solutions/Sokoban.88.bsustar mbimathoptxsok-1.02/solutions/Sokoban.88.mp100644 144 62 0 5663643224 23004 1xsok-1.02/solutions/Sokoban.88.bsustar mbimathoptxsok-1.02/solutions/Sokoban.score100644 144 62 2260 5751517056 15560 0ustar mbimathoptt9ЦFеKc{NЩH’LOaЧR‰ЋPwUЕXђ_зYJUЦ4I:R‘SQј~RV‹a@\!OѕaОe—[CTыgдZOWNTVUŒ^{b‰@&g.S}UСu1B@uYMP#Z8Ё­MAPЛCƒ@ѓW‰[‰NсZXYœUŠW_P fЃXмRQћV[W`юLyQы[б\іV/GYљWk\?EŒ?9LvJ/KN‘CоMмNЎLэ…YVјџџџ№ts‘BEw`)З[*3ЊrKЎњžЄУ10iG\зкžˆЯpњ/}_X%ПЇЂ'ЉБwUгnži“вO;ПšHЉSQжmWЏ/еДŸJku"Ъфџбџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџa‡Žmnrшэѕмђя’ие’.м—\д6ŠХm8ИыРЎŠ |yЈJё –У>џпЮž6mФХ†сящЖ§Я‰лЋ™ЇSB2Нфc АŒИяЫ•аЁOškЛџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџxsok-1.02/solutions/Xsok.01.bs100644 144 62 355 5663625752 14610 0ustar mbimathoptt56v.Юf8vџџџџџџџџџџџџџџџџvџџџџџџџџџџџџXsok.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Xsok.01.mm100644 144 62 0 5663625752 21631 1xsok-1.02/solutions/Xsok.01.bsustar mbimathoptxsok-1.02/solutions/Xsok.01.mp100644 144 62 0 5663625752 21634 1xsok-1.02/solutions/Xsok.01.bsustar mbimathoptxsok-1.02/solutions/Xsok.02.bs100644 144 62 332 5663625752 14604 0ustar mbimathopttD§c.Юf9cџџџџџџџџџџџџџџџџcџџџџџџџџџџџџXsok.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Xsok.02.mm100644 144 62 0 5663625752 21633 1xsok-1.02/solutions/Xsok.02.bsustar mbimathoptxsok-1.02/solutions/Xsok.02.mp100644 144 62 0 5663625752 21636 1xsok-1.02/solutions/Xsok.02.bsustar mbimathoptxsok-1.02/solutions/Xsok.03.bs100644 144 62 311 5663625752 14602 0ustar mbimathopttI(R.Юf9RџџџџџџџџџџџџџџџџRџџџџџџџџџџџџXsok.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Xsok.03.mm100644 144 62 0 5663625752 21635 1xsok-1.02/solutions/Xsok.03.bsustar mbimathoptxsok-1.02/solutions/Xsok.03.mp100644 144 62 0 5663625752 21640 1xsok-1.02/solutions/Xsok.03.bsustar mbimathoptxsok-1.02/solutions/Xsok.04.bs100644 144 62 453 5663625752 14612 0ustar mbimathopttPД.Юf;ДџџџџџџџџџџџџџџџџДџџџџџџџџџџџџXsok.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Xsok.04.mm100644 144 62 0 5663625752 21637 1xsok-1.02/solutions/Xsok.04.bsustar mbimathoptxsok-1.02/solutions/Xsok.04.mp100644 144 62 0 5663625752 21642 1xsok-1.02/solutions/Xsok.04.bsustar mbimathoptxsok-1.02/solutions/Xsok.05.bs100644 144 62 306 5663625752 14610 0ustar mbimathoptt)U"O.Ю‘NOџџџџџџџџџџџџџџџџOџџџџџџџџџџџџXsok.Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)xsok-1.02/solutions/Xsok.05.mm100644 144 62 0 5663625752 21641 1xsok-1.02/solutions/Xsok.05.bsustar mbimathoptxsok-1.02/solutions/Xsok.05.mp100644 144 62 0 5663625752 21644 1xsok-1.02/solutions/Xsok.05.bsustar mbimathoptxsok-1.02/solutions/Xsok.score100644 144 62 2260 5665171403 15104 0ustar mbimathoptt56D§I(P)UџџџvcRДOџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ"џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ