[comp.sources.games] v06i001: sokoban - curses based, get the money game

games@tekred.TEK.COM (01/04/89)

Submitted by: "H.Bernau" <pyramid!tub!astbe!ber>
Comp.sources.games: Volume 6, Issue 1
Archive-name: sokoban

	[This started out like a simplified game of wanderer with an
	 easy screen 1.  Then up popped screen 2 - I still haven't
	 figured this one out.  -br]

	From the author:
	[[Here comes one of my favourit games. There are no monsters,
	  no traps, no reason to die, no chance to win.  But as soon as
	  you play, it captures you.

	   Feel free to reply
	   (Within Europe use astbe!ber)
	   (From elsewhere try to use ...!pyramid!tub!astbe!ber)]]

#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of shell archive."
# Contents:  README Makefile play.c readscreen.c save.c score.c
#   showscreen.c sok.c sokoban.h sokoban.help screen.1 screen.10
#   screen.11 screen.12 screen.13 screen.14 screen.15 screen.16
#   screen.17 screen.18 screen.19 screen.2 screen.20 screen.21
#   screen.22 screen.23 screen.24 screen.25 screen.26 screen.27
#   screen.28 screen.29 screen.3 screen.30 screen.31 screen.32
#   screen.33 screen.34 screen.35 screen.36 screen.37 screen.38
#   screen.39 screen.4 screen.40 screen.41 screen.42 screen.5 screen.6
#   screen.7 screen.8 screen.9
# Wrapped by billr@saab on Tue Jan  3 12:13:05 1989
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'README' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'README'\"
else
echo shar: Extracting \"'README'\" \(1607 characters\)
sed "s/^X//" >'README' <<'END_OF_FILE'
XThis is SOKOBAN.
X
XI saw this game first on a PC running MSDOS. I found the idea of the game so
Xclever, that I made up my mind to make it run with an ascii terminal using
Xcurses so that we can play it on our MicroVAX/ULTRIX. 
X
XAlong with this package there are alot of screen files describing the various
Xplay levels. So what you need to do to install it on your own machine is:
X
X-   Edit the header file sokoban.h to alter the given defines
X
XYou have to note the following restrictions
X
X-   The screen files must be readable for everyone who should be able to play
X    this game
X-   The score file should have read/write permission only for the owner
X    of the executable program. If you do so sokoban must run with setuid.
X
XYou can now compile it (just type 'make').
XIf compilation is succesful you must initialize the score file (just type
X'sokoban -c'). If you have forgotten the password, examine sokoban.h.
X
XThere is no manual page. All you have to know when you first play the game is
Xthe command '?'. This gives you one screenful of information.
X
XAfter you have solved all the given screens (this will take a while) you will
Xfind the game boring (sure you will). I hope there will be a lot of players who
Xwill think out some new screens.
XTo test your own screens copy them to the screen directory (with a new level
Xnumber <nn>) and type sokoban -<nn>.
X
XPLEASE DO SO AND POST NEW SCREENS TO THE NET.
XOTHERWISE IT GETS BORING !!!!!!!!!!!!!!!!!!!!
X
XComments are welcome.
X
XWithin Europe reply to astbe!ber
X
XFrom other continents try to use ...!pyramid!tub!astbe!ber
X   (otherwise it would be expensive)
END_OF_FILE
if test 1607 -ne `wc -c <'README'`; then
    echo shar: \"'README'\" unpacked with wrong size!
fi
# end of 'README'
fi
if test -f 'Makefile' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'Makefile'\"
else
echo shar: Extracting \"'Makefile'\" \(477 characters\)
sed "s/^X//" >'Makefile' <<'END_OF_FILE'
XCCOPT= -g
XOBJECTS= sok.o readscreen.o showscreen.o play.o save.o score.o
X
Xsokoban: $(OBJECTS)
X	cc $(CCOPT) -o sokoban $(OBJECTS) -lcurses -ltermcap
Xsok.o: sok.c sokoban.h
X	cc $(CCOPT) -c sok.c
X
Xreadscreen.o: readscreen.c sokoban.h
X	cc $(CCOPT) -c readscreen.c
X
Xshowscreen.o: showscreen.c sokoban.h
X	cc $(CCOPT) -c showscreen.c
X
Xplay.o: play.c sokoban.h
X	cc $(CCOPT) -c play.c
X
Xsave.o: save.c sokoban.h
X	cc $(CCOPT) -c save.c
X
Xscore.o: score.c sokoban.h
X	cc $(CCOPT) -c score.c
END_OF_FILE
if test 477 -ne `wc -c <'Makefile'`; then
    echo shar: \"'Makefile'\" unpacked with wrong size!
fi
# end of 'Makefile'
fi
if test -f 'play.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'play.c'\"
else
echo shar: Extracting \"'play.c'\" \(6884 characters\)
sed "s/^X//" >'play.c' <<'END_OF_FILE'
X#include <stdio.h>
X#include <ctype.h>
X#include <curses.h>
X#include "sokoban.h"
X
X/* defining the types of move */
X#define MOVE 		1
X#define PUSH 		2
X#define SAVE 		3
X#define UNSAVE 		4
X#define STOREMOVE 	5
X#define STOREPUSH 	6
X
X/* defines for control characters */
X#define CNTL_L		'\014'
X#define CNTL_K		'\013'
X#define CNTL_H		'\010'
X#define CNTL_J		'\012'
X#define CNTL_R		'\022'
X#define CNTL_U		'\025'
X
Xextern char map[MAXROW+1][MAXCOL+1];
Xextern short rows, cols, level, moves, pushes, savepack, packets;
Xextern short scorelevel, scoremoves, scorepushes;
Xextern POS ppos;
X
XPOS tpos1, tpos2,	/* test positions: 1/2 pos. over/under/left/right */
X    lastppos,		/* the last player position (for undo) */
X    lasttpos1, lasttpos2; /* last test positions (for undo) */
Xchar lppc, ltp1c, ltp2c;  /* the char for these positions (for undo) */
Xshort action, lastaction;
X
Xchar tmp_map[MAXROW+1][MAXCOL+1];
Xshort tmp_pushes, tmp_moves, tmp_savepack;
XPOS tmp_ppos;
X
Xint play() {
X
X   short c;
X   short ret;
X   short testmove();
X   short undolock = 1;		/* locked for undo */
X
X   showscreen();
X   tmpsave();
X   ret = 0;
X   while( ret == 0) {
X      switch( (c = getchar())) {
X	 case 'q':    /* quit the game 					*/
X	              ret = E_ENDGAME; 
X	              break;
X	 case 's':    /* save the games					*/
X		      if( (ret = savegame()) == 0)
X			 ret = E_SAVED;
X		      break;
X	 case '?':    /* show the help file				*/
X		      showhelp();
X		      showscreen();
X		      break;
X	 case CNTL_R: /* refresh the screen 				*/
X		      clear();
X		      showscreen();
X		      break;
X	 case 'c':    /* temporary save					*/
X		      tmpsave();
X		      break;
X	 case CNTL_U: /* reset to temporary save 			*/
X		      tmpreset();
X		      undolock = 1;
X		      showscreen();
X		      break;
X	 case 'U':    /* undo this level 				*/
X		      moves = pushes = 0;
X		      if( (ret = readscreen()) == 0) {
X		         showscreen();
X			 undolock = 1;
X		      }
X		      break;
X	 case 'u':    /* undo last move 				*/
X		      if( ! undolock) {
X		         undomove();
X		         undolock = 1;
X		      }
X		      break;
X	 case 'k':    /* up 						*/
X	 case 'K':    /* run up 					*/
X	 case CNTL_K: /* run up, stop before object 			*/
X	 case 'j':    /* down 						*/
X	 case 'J':    /* run down 					*/
X	 case CNTL_J: /* run down, stop before object 			*/
X	 case 'l':    /* right 						*/
X	 case 'L':    /* run right 					*/
X	 case CNTL_L: /* run right, stop before object 			*/
X	 case 'h':    /* left 						*/
X	 case 'H':    /* run left 					*/
X	 case CNTL_H: /* run left, stop before object 			*/
X		      do {
X		         if( (action = testmove( c)) != 0) {
X			    lastaction = action;
X		            lastppos.x = ppos.x; lastppos.y = ppos.y;
X		            lppc = map[ppos.x][ppos.y];
X		            lasttpos1.x = tpos1.x; lasttpos1.y = tpos1.y; 
X		            ltp1c = map[tpos1.x][tpos1.y];
X		            lasttpos2.x = tpos2.x; lasttpos2.y = tpos2.y; 
X		            ltp2c = map[tpos2.x][tpos2.y];
X		            domove( lastaction); 
X		            undolock = 0;
X		         }
X		      } while( (action != 0) && (! islower( c))
X			      && (packets != savepack));
X		      break;
X	 default:     helpmessage(); break;
X      }
X      if( (ret == 0) && (packets == savepack)) {
X	 scorelevel = level;
X	 scoremoves = moves;
X	 scorepushes = pushes;
X	 break;
X      }
X   }
X   return( ret);
X}
X
Xshort testmove( action)
Xshort action;
X{
X   short ret;
X   char tc;
X   short stop_at_object;
X
X   if( (stop_at_object = iscntrl( action))) action = action + 'A' - 1;
X   action = (isupper(action) ? tolower( action) : action);
X   if( (action == 'k') || (action == 'j')) {
X      tpos1.x = (action == 'k') ? ppos.x-1 : ppos.x+1;
X      tpos2.x = (action == 'k') ? ppos.x-2 : ppos.x+2;
X      tpos1.y = tpos2.y = ppos.y;
X   }
X   else {
X      tpos1.y = (action == 'h') ? ppos.y-1 : ppos.y+1;
X      tpos2.y = (action == 'h') ? ppos.y-2 : ppos.y+2;
X      tpos1.x = tpos2.x = ppos.x;
X   }
X   tc = map[tpos1.x][tpos1.y];
X   switch( tc) {
X      case C_PACKET:
X      case C_SAVE:   if( ! stop_at_object) {
X			if( map[tpos2.x][tpos2.y] == C_GROUND)
X			   ret = (tc == C_SAVE) ? UNSAVE : PUSH;
X                        else if( map[tpos2.x][tpos2.y] == C_STORE)
X			   ret = (tc == C_SAVE) ? STOREPUSH : SAVE;
X		        else ret = 0;
X		     }
X		     else ret = 0; 					break;
X      case C_GROUND: ret = MOVE; 					break;
X      case C_STORE:  ret = STOREMOVE; 					break;
X      default:       ret = 0; 						break;
X   }
X   return( ret);
X}
X
Xdomove( moveaction) 
Xshort moveaction;
X{
X   map[ppos.x][ppos.y] = (map[ppos.x][ppos.y] == C_PLAYER) 
X			       ? C_GROUND 
X			       : C_STORE;
X   switch( moveaction) {
X      case MOVE:      map[tpos1.x][tpos1.y] = C_PLAYER; 		break;
X      case STOREMOVE: map[tpos1.x][tpos1.y] = C_PLAYERSTORE; 		break;
X      case PUSH:      map[tpos2.x][tpos2.y] = map[tpos1.x][tpos1.y];
X		      map[tpos1.x][tpos1.y] = C_PLAYER;	
X		      pushes++;						break;
X      case UNSAVE:    map[tpos2.x][tpos2.y] = C_PACKET;
X		      map[tpos1.x][tpos1.y] = C_PLAYERSTORE;		
X		      pushes++; savepack--;			 	break;
X      case SAVE:      map[tpos2.x][tpos2.y] = C_SAVE;
X		      map[tpos1.x][tpos1.y] = C_PLAYER;			
X		      savepack++; pushes++;				break;
X      case STOREPUSH: map[tpos2.x][tpos2.y] = C_SAVE;
X		      map[tpos1.x][tpos1.y] = C_PLAYERSTORE;		
X		      pushes++;						break;
X   }
X   moves++;
X   dispmoves(); disppushes(); dispsave();
X   mapchar( map[ppos.x][ppos.y], ppos.x, ppos.y);
X   mapchar( map[tpos1.x][tpos1.y], tpos1.x, tpos1.y);
X   mapchar( map[tpos2.x][tpos2.y], tpos2.x, tpos2.y);
X   move( MAXROW+1, 0);
X   refresh();
X   ppos.x = tpos1.x; ppos.y = tpos1.y;
X}
X
Xundomove() {
X
X   map[lastppos.x][lastppos.y] = lppc;
X   map[lasttpos1.x][lasttpos1.y] = ltp1c;
X   map[lasttpos2.x][lasttpos2.y] = ltp2c;
X   ppos.x = lastppos.x; ppos.y = lastppos.y;
X   switch( lastaction) {
X      case MOVE:      moves--;				break;
X      case STOREMOVE: moves--;				break;
X      case PUSH:      moves--; pushes--;		break;
X      case UNSAVE:    moves--; pushes--; savepack++;	break;
X      case SAVE:      moves--; pushes--; savepack--;	break;
X      case STOREPUSH: moves--; pushes--;		break;
X   }
X   dispmoves(); disppushes(); dispsave();
X   mapchar( map[ppos.x][ppos.y], ppos.x, ppos.y);
X   mapchar( map[lasttpos1.x][lasttpos1.y], lasttpos1.x, lasttpos1.y);
X   mapchar( map[lasttpos2.x][lasttpos2.y], lasttpos2.x, lasttpos2.y);
X   move( MAXROW+1, 0);
X   refresh();
X}
X
Xtmpsave() {
X
X   short i, j;
X
X   for( i = 0; i < rows; i++) for( j = 0; j < cols; j++)
X      tmp_map[i][j] = map[i][j];
X   tmp_pushes = pushes;
X   tmp_moves = moves;
X   tmp_savepack = savepack;
X   tmp_ppos.x = ppos.x; tmp_ppos.y = ppos.y;
X}
X
Xtmpreset() {
X
X   short i, j;
X
X   for( i = 0; i < rows; i++) for( j = 0; j < cols; j++)
X      map[i][j] = tmp_map[i][j];
X   pushes = tmp_pushes;
X   moves = tmp_moves;
X   savepack = tmp_savepack;
X   ppos.x = tmp_ppos.x; ppos.y = tmp_ppos.y;
X}
END_OF_FILE
if test 6884 -ne `wc -c <'play.c'`; then
    echo shar: \"'play.c'\" unpacked with wrong size!
fi
# end of 'play.c'
fi
if test -f 'readscreen.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'readscreen.c'\"
else
echo shar: Extracting \"'readscreen.c'\" \(1364 characters\)
sed "s/^X//" >'readscreen.c' <<'END_OF_FILE'
X#include <stdio.h>
X#include "sokoban.h"
X
Xextern short level, packets, savepack, rows, cols;
Xextern char map[MAXROW+1][MAXCOL+1];
Xextern POS ppos;
X
Xreadscreen() 
X{
X   FILE *screen;
X   char *fnam;
X   short j, c, ret = 0;
X
X   fnam = malloc( strlen( SCREENPATH) + 11);
X   sprintf( fnam, "%s/screen.%d", SCREENPATH, level);
X   if( (screen = fopen( fnam, "r")) == NULL) 
X      ret = E_FOPENSCREEN;
X   else {
X      packets = savepack = rows = j = cols  = 0;
X      storepos( ppos, -1, -1);
X      while( (ret == 0) && ((c = getc( screen)) != EOF)) {
X         switch( c) {
X	    case '\n':     map[rows++][j] = '\0';
X			   if( rows > MAXROW) 
X			      ret = E_TOMUCHROWS;
X			   else {
X			      if( j > cols) cols = j;
X			      j = 0;
X			   }
X			   break;
X	    case C_PLAYERSTORE:
X	    case C_PLAYER: if( ppos.x != -1) 
X			      ret = E_PLAYPOS1;
X	                   else { 
X		              storepos( ppos, rows, j); 
X			      map[rows][j++] = c;
X			      if( j > MAXCOL) ret = E_TOMUCHCOLS;
X			   }
X	                   break;
X	    case C_SAVE:   savepack++;
X	    case C_PACKET: packets++;
X	    case C_WALL:
X	    case C_STORE:
X	    case C_GROUND: map[rows][j++] = c;
X			   if( j > MAXCOL) ret = E_TOMUCHCOLS;
X			   break;
X	    default:       ret = E_ILLCHAR;
X	 }
X      }
X      fclose( screen);
X      if( (ret == 0) && (ppos.x == -1)) ret = E_PLAYPOS2;
X   }
X   return( ret);
X}
END_OF_FILE
if test 1364 -ne `wc -c <'readscreen.c'`; then
    echo shar: \"'readscreen.c'\" unpacked with wrong size!
fi
# end of 'readscreen.c'
fi
if test -f 'save.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'save.c'\"
else
echo shar: Extracting \"'save.c'\" \(3405 characters\)
sed "s/^X//" >'save.c' <<'END_OF_FILE'
X#include <stdio.h>
X#include <sys/types.h>
X#include <sys/stat.h>
X#include <signal.h>
X#include "sokoban.h"
X
Xextern char *username;
Xextern char map[MAXROW+1][MAXCOL+1];
Xextern short level, moves, pushes, packets, savepack, rows, cols;
Xextern POS ppos;
X
Xlong  savedbn;
Xchar *sfname;
XFILE *savefile;
Xstruct stat sfstat;
X
Xshort savegame() {
X
X   short ret = 0;
X
X   signal( SIGINT, SIG_IGN);
X   sfname = malloc( strlen( SAVEPATH) + strlen( username) + 5);
X   sprintf( sfname, "%s/%s.sav", SAVEPATH, username);
X   if( (savefile = fopen( sfname, "w")) == NULL)
X      ret = E_FOPENSAVE;
X   else {
X      savedbn = fileno( savefile);
X      if( write( savedbn, &(map[0][0]), MAXROW*MAXCOL) != MAXROW*MAXCOL)
X	 ret = E_WRITESAVE;
X      else if( write( savedbn, &ppos, sizeof( POS)) != sizeof( POS))     
X	 ret = E_WRITESAVE;
X      else if( write( savedbn, &level, 2) != 2)    ret = E_WRITESAVE;
X      else if( write( savedbn, &moves, 2) != 2)    ret = E_WRITESAVE;
X      else if( write( savedbn, &pushes, 2) != 2)   ret = E_WRITESAVE;
X      else if( write( savedbn, &packets, 2) != 2)  ret = E_WRITESAVE;
X      else if( write( savedbn, &savepack, 2) != 2) ret = E_WRITESAVE;
X      else if( write( savedbn, &rows, 2) != 2)     ret = E_WRITESAVE;
X      else if( write( savedbn, &cols, 2) != 2)     ret = E_WRITESAVE;
X      else {
X	 fclose( savefile);
X	 if( stat( sfname, &sfstat) != 0) ret = E_STATSAVE;
X	 else if( (savefile = fopen( sfname, "a")) == NULL)
X            ret = E_FOPENSAVE;
X         else {
X	    if( write( savedbn, &sfstat, sizeof( sfstat)) != sizeof( sfstat))
X	       ret = E_WRITESAVE;
X	    fclose( savefile);
X	 }
X      }
X   }
X   if( (ret == E_WRITESAVE) || (ret == E_STATSAVE)) unlink( sfname);
X   signal( SIGINT, SIG_DFL);
X
X   return( ret);
X}
X
Xshort restoregame() {
X
X   short ret = 0;
X   struct stat oldsfstat;
X
X   signal( SIGINT, SIG_IGN);
X   sfname = malloc( strlen( SAVEPATH) + strlen( username) + 5);
X   sprintf( sfname, "%s/%s.sav", SAVEPATH, username);
X   if( stat( sfname, &oldsfstat) < -1) 
X      ret = E_NOSAVEFILE;
X   else {
X      if( (savefile = fopen( sfname, "r")) == NULL)
X	 ret = E_FOPENSAVE;
X      else {
X         savedbn = fileno( savefile);
X         if( read( savedbn, &(map[0][0]), MAXROW*MAXCOL) != MAXROW*MAXCOL)
X	    ret = E_READSAVE;
X         else if( read( savedbn, &ppos, sizeof( POS)) != sizeof( POS))     
X	    ret = E_READSAVE;
X         else if( read( savedbn, &level, 2) != 2)    ret = E_READSAVE;
X         else if( read( savedbn, &moves, 2) != 2)    ret = E_READSAVE;
X         else if( read( savedbn, &pushes, 2) != 2)   ret = E_READSAVE;
X         else if( read( savedbn, &packets, 2) != 2)  ret = E_READSAVE;
X         else if( read( savedbn, &savepack, 2) != 2) ret = E_READSAVE;
X         else if( read( savedbn, &rows, 2) != 2)     ret = E_READSAVE;
X         else if( read( savedbn, &cols, 2) != 2)     ret = E_READSAVE;
X	 else if( read( savedbn, &sfstat, sizeof( sfstat)) != sizeof( sfstat))
X	    ret = E_READSAVE;
X	 else if( (sfstat.st_dev != oldsfstat.st_dev) ||
X                  (sfstat.st_ino != oldsfstat.st_ino) ||
X                  (sfstat.st_nlink != oldsfstat.st_nlink) ||
X                  (sfstat.st_uid != oldsfstat.st_uid) ||
X                  (sfstat.st_gid != oldsfstat.st_gid) ||
X                  (sfstat.st_mtime != oldsfstat.st_mtime))
X            ret = E_ALTERSAVE;
X      }
X      unlink( sfname);
X   }
X   signal( SIGINT, SIG_DFL);
X   return( ret);
X}
END_OF_FILE
if test 3405 -ne `wc -c <'save.c'`; then
    echo shar: \"'save.c'\" unpacked with wrong size!
fi
# end of 'save.c'
fi
if test -f 'score.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'score.c'\"
else
echo shar: Extracting \"'score.c'\" \(4947 characters\)
sed "s/^X//" >'score.c' <<'END_OF_FILE'
X#include <stdio.h>
X#include <signal.h>
X#include "sokoban.h"
X
Xextern char *username;
Xextern short scorelevel, scoremoves, scorepushes;
X
Xshort scoreentries;
Xstruct {
X   char user[MAXUSERNAME];
X   short lv, mv, ps;
X} scoretable[MAXSCOREENTRIES];
X
XFILE *scorefile;
Xlong sfdbn;
X
Xshort outputscore() {
X
X   short ret;
X
X   while( creat( LOCKFILE) < 0);	/* lock the score file */
X   if( (ret = readscore()) == 0)
X      showscore();
X   unlink( LOCKFILE);
X   return( (ret == 0) ? E_ENDGAME : ret);
X}
X
Xshort makenewscore() {
X
X   short ret = 0;
X
X   while( creat( LOCKFILE) < 0) ;
X   scoreentries = 0;
X   if( (scorefile = fopen( SCOREFILE, "w")) == NULL)
X      ret = E_FOPENSCORE;
X   else {
X      sfdbn = fileno( scorefile);
X      write( sfdbn, &scoreentries, 2);
X      fclose( scorefile);
X   }
X   unlink( LOCKFILE);
X   return( (ret == 0) ? E_ENDGAME : ret);
X}
X
Xshort getuserlevel( lv)
Xshort *lv;
X{
X   short ret = 0, pos;
X
X   while( creat( LOCKFILE) < 0);
X   if( (scorefile = fopen( SCOREFILE, "r")) == NULL)
X      ret = E_FOPENSCORE;
X   else {
X      if( (ret = readscore()) == 0)
X	 *lv = ( (pos = finduser()) > -1) ? scoretable[pos].lv+1 : 1;
X   }
X   unlink( LOCKFILE);
X   return( ret);
X}
X
Xshort score() {
X   
X   short ret;
X
X   while( creat( LOCKFILE) < 0);	/* lock the score file */
X   if( (ret = readscore()) == 0)
X      if( (ret = makescore()) == 0)
X	 if( (ret = writescore()) == 0)
X	    showscore();
X   unlink( LOCKFILE);
X   return( (ret == 0) ? E_ENDGAME : ret);
X}
X
Xreadscore() {
X
X   short ret = 0;
X   long tmp;
X
X   if( (scorefile = fopen( SCOREFILE, "r")) == NULL)
X      ret = E_FOPENSCORE;
X   else {
X      sfdbn = fileno( scorefile);
X      if( read( sfdbn, &scoreentries, 2) != 2) ret = E_READSCORE;
X      else {
X	 tmp = scoreentries * sizeof( scoretable[0]);
X	 if( read( sfdbn, &(scoretable[0]), tmp) != tmp) ret = E_READSCORE;
X      }
X      fclose( scorefile);
X   }
X   return( ret);
X}
X
Xmakescore() {
X
X   short ret = 0, pos, i, build = 1, insert;
X
X   if( (pos = finduser()) > -1) {	/* user already in score file */
X      insert =    (scorelevel > scoretable[pos].lv)
X	       || ( (scorelevel == scoretable[pos].lv) &&
X                    (scoremoves < scoretable[pos].mv)
X		  )
X	       || ( (scorelevel == scoretable[pos].lv) &&
X		    (scoremoves == scoretable[pos].mv) &&
X		    (scorepushes < scoretable[pos].ps)
X		  );
X      if( insert) { 			/* delete existing entry */
X	 for( i = pos; i < scoreentries-1; i++)
X	    cp_entry( i, i+1);
X	 scoreentries--;
X      }
X      else build = 0;
X   }
X   else if( scoreentries == MAXSCOREENTRIES)
X      ret = E_TOMUCHSE;
X   if( (ret == 0) && build) {
X      pos = findpos();			/* find the new score position */
X      if( pos > -1) {			/* score table not empty */
X	 for( i = scoreentries; i > pos; i--)
X	    cp_entry( i, i-1);
X      }
X      else pos = scoreentries;
X
X      strcpy( scoretable[pos].user, username);
X      scoretable[pos].lv = scorelevel;
X      scoretable[pos].mv = scoremoves;
X      scoretable[pos].ps = scorepushes;
X      scoreentries++;
X   }
X   return( ret);
X}
X
Xfinduser() {
X
X   short i, found;
X
X   for( i = 0; (i < scoreentries) && (! found); i++)
X      found = (strcmp( scoretable[i].user, username) == 0);
X   return( (found) ? i-1 : -1);
X}
X
Xfindpos() {
X 
X   short i, found;
X
X   for( i = 0; (i < scoreentries) && (! found); i++)
X      found =    (scorelevel > scoretable[i].lv)
X	      || ( (scorelevel == scoretable[i].lv) &&
X                   (scoremoves < scoretable[i].mv)
X		 )
X	      || ( (scorelevel == scoretable[i].lv) &&
X		   (scoremoves == scoretable[i].mv) &&
X		   (scorepushes < scoretable[i].ps)
X		 );
X   return( (found) ? i-1 : -1);
X}
X
Xwritescore() {
X
X   short ret = 0;
X   long tmp;
X
X   if( (scorefile = fopen( SCOREFILE, "w")) == NULL)
X      ret = E_FOPENSCORE;
X   else {
X      sfdbn = fileno( scorefile);
X      if( write( sfdbn, &scoreentries, 2) != 2) ret = E_WRITESCORE;
X      else {
X	 tmp = scoreentries * sizeof( scoretable[0]);
X	 if( write( sfdbn, &(scoretable[0]), tmp) != tmp) ret = E_WRITESCORE;
X      }
X      fclose( scorefile);
X   }
X   return( ret);
X}
X
Xshowscore() {
X
X   short lastlv = 0, lastmv, lastps, i;
X
X   fprintf( stdout, "Rank        User       Level       Moves      Pushes\n");
X   fprintf( stdout, "====================================================\n");
X   for( i = 0; i < scoreentries; i++) {
X      if( (scoretable[i].lv == lastlv)&& 
X	  (scoretable[i].mv == lastmv) && 
X	  (scoretable[i].ps == lastps))
X	 fprintf( stdout, "      ");
X      else {
X         lastlv = scoretable[i].lv;
X         lastmv = scoretable[i].mv;
X         lastps = scoretable[i].ps;
X         fprintf( stdout, "%4d  ", i+1);
X      }
X      fprintf( stdout, "%10s  %10d  %10d  %10d\n", scoretable[i].user, 
X		scoretable[i].lv, scoretable[i].mv, scoretable[i].ps);
X   }
X}
X
Xcp_entry( i1, i2)
Xshort i1, i2;
X{
X   strcpy( scoretable[i1].user, scoretable[i2].user);
X   scoretable[i1].lv = scoretable[i2].lv;
X   scoretable[i1].mv = scoretable[i2].mv;
X   scoretable[i1].ps = scoretable[i2].ps;
X}
END_OF_FILE
if test 4947 -ne `wc -c <'score.c'`; then
    echo shar: \"'score.c'\" unpacked with wrong size!
fi
# end of 'score.c'
fi
if test -f 'showscreen.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'showscreen.c'\"
else
echo shar: Extracting \"'showscreen.c'\" \(2273 characters\)
sed "s/^X//" >'showscreen.c' <<'END_OF_FILE'
X#include <curses.h>
X#include "sokoban.h"
X
Xextern short rows, cols, level, moves, pushes, packets, savepack;
Xextern char map[MAXROW+1][MAXCOL+1];
X
Xshowscreen() {
X
X   short i, j;
X
X   move( 0, 0); clrtobot();
X   for( i = 0; i < rows; i++)
X      for( j = 0; map[i][j] != '\0'; j++)
X         mapchar( map[i][j], i, j);
X   move( MAXROW, 0);
X   printw( "Level:      Packets:      Saved:      Moves:             Pushes:");
X   displevel();
X   disppackets();
X   dispsave();
X   dispmoves();
X   disppushes();
X   move( MAXROW+2,0);
X   refresh();
X}
X
Xmapchar( c, i, j) 
Xchar c; 
Xshort i, j;
X{
X   short offset_row = (MAXROW - rows) / 2;
X   short offset_col = MAXCOL - cols;
X
X   move( i + offset_row, 2*j + offset_col);     addch( c);
X   move( i + offset_row, 2*j + 1 + offset_col); addch( c);
X}
X
Xdisplevel() { 
X   move( MAXROW, 7); printw( "%3d", level); 
X}
X   
Xdisppackets() { 
X   move( MAXROW, 21); printw( "%3d", packets); 
X}
X   
Xdispsave() { 
X   move( MAXROW, 33); printw( "%3d", savepack); 
X}
X   
Xdispmoves() { 
X   move( MAXROW, 45); printw( "%10d", moves); 
X}
X      
Xdisppushes() { 
X   move( MAXROW, 65); printw( "%10d", pushes); 
X}
X
Xhelpmessage() {
X   move( MAXROW+2, 0); printw( "Press ? for help.%c", '\007');
X   refresh();
X   raw();				/* no input allowed while sleeping */
X   sleep( 2);
X   move( MAXROW+2, 0); deleteln();
X   refresh();
X   noraw();				/* end raw mode */
X}
X
Xshowhelp() {
X
X   FILE *helpfile;
X   char buf[80];
X   short i, ret = 0, endhelp = 0, c;
X
X   if( (helpfile = fopen( HELPFILE, "r")) == NULL)
X      ret = E_FOPENHELP;
X   else {
X      raw();
X      move( 0, 0); clrtobot();
X      i = 0;
X      while( fgets( buf, 80, helpfile) && (! endhelp)) {
X	 if( strncmp( buf, "+=", 2) == 0) {		/* page eject */
X	    move( 23, 0);
X	    addstr( "(Press space to continue, return to exit help)");
X	    refresh();
X	    noraw();
X	    if( (c = getchar()) == '\n') 
X	       endhelp = 1;
X	    else {
X	       i = 0;
X	       move( 0, 0); clrtobot();
X	       refresh();
X	       raw();
X	    }
X	 }
X	 else if( strncmp( buf, "==", 2) == 0) {	/* end of helpfile */
X	    move( 23, 0);
X	    addstr( "(Press any key to continue)");
X	    refresh();
X	    noraw();
X	    getchar();
X	    endhelp = 1;
X	 }
X	 else {
X	    move( i, 0);
X	    addstr( buf);
X	    i++;
X	 }
X      }
X   }
X   return( ret);
X}
END_OF_FILE
if test 2273 -ne `wc -c <'showscreen.c'`; then
    echo shar: \"'showscreen.c'\" unpacked with wrong size!
fi
# end of 'showscreen.c'
fi
if test -f 'sok.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'sok.c'\"
else
echo shar: Extracting \"'sok.c'\" \(4668 characters\)
sed "s/^X//" >'sok.c' <<'END_OF_FILE'
X#include <stdio.h>
X#include <curses.h>
X#include "sokoban.h"
X
Xshort level, packets, savepack, moves, pushes, rows, cols;
Xshort scorelevel, scoremoves, scorepushes;
Xchar  map[MAXROW+1][MAXCOL+1];
XPOS   ppos;
Xchar  *username, *prgname;
X
Xshort optshowscore = 0, optmakescore = 0, optrestore = 0, optlevel = 0; 
Xshort scoring = 1, superuser = 0;
Xshort userlevel;
X
Xmain( argc, argv) 
Xshort argc; 
Xchar *argv[];
X{
X   short ret, ret2;
X   char *strrchr(), *getlogin();
X
X   scorelevel = 0;
X   moves = pushes = packets = savepack = 0;
X   if( (prgname = strrchr( argv[0], '/')) == NULL)
X      prgname = argv[0];
X   else prgname++;
X   if( (username = getlogin("SOKNAM")) == NULL)
X      ret = E_NOUSER;
X   else {
X      superuser = (strcmp( username, SUPERUSER) == 0);
X      if( (ret = checkcmdline( argc, argv)) == 0) {
X         if( optshowscore)
X	    ret = outputscore();
X         else if( optmakescore) {
X	    if( superuser) {
X	       if( (ret = getpassword()) == 0)
X	          ret = makenewscore();
X	    }
X	    else ret = E_NOSUPER;
X	 }
X	 else if( optrestore) {
X	    ret = restoregame();
X	 }
X         else if( (ret = getuserlevel( &userlevel)) == 0) {
X            if( optlevel > 0) {
X	       if( superuser) {
X	          level = optlevel;
X		  scoring = 0;
X	       }
X	       else if( userlevel < optlevel)
X	          ret = E_LEVELTOOHIGH;
X	       else level = optlevel;
X	    }
X	    else level = userlevel;
X         }
X      }
X   }
X   if( ret == 0)
X      ret = gameloop();
X   errmess( ret);
X   if( scorelevel && scoring) {
X      ret2 = score();
X      errmess( ret2);
X   }
X   exit( ret);
X}
X
Xcheckcmdline( argc, argv) 
Xshort argc; 
Xchar *argv[];
X{
X   short ret = 0;
X
X   if( argc > 1)
X      if( (argc == 2) && (argv[1][0] == '-')) {
X	 if( (argv[1][1] == 's') && (argv[1][2] == '\0'))
X	    optshowscore = 1;
X	 else if( (argv[1][1] == 'c') && (argv[1][2] == '\0'))
X	    optmakescore = 1;
X	 else if( (argv[1][1] == 'r') && (argv[1][2] == '\0'))
X	    optrestore = 1;
X	 else if( (optlevel = atoi( &(argv[1][1]))) == 0)
X	    ret = E_USAGE;
X      }
X      else ret = E_USAGE;
X   return( ret);
X}
X
Xgameloop() {
X
X   short ret = 0;
X
X   initscr(); crmode(); noecho();
X   if( ! optrestore) ret = readscreen();
X   while( ret == 0) {
X      if( (ret = play()) == 0) {
X         level++;
X         moves = pushes = packets = savepack = 0;
X         ret = readscreen();
X      }
X   }
X   move( 0, 0); clrtobot(); refresh(); 
X   nocrmode(); echo(); erase(); endwin();
X   return( ret);
X}
X
Xgetpassword() {
X
X   short c, i;
X   char *p, *getpass();
X
X   p = getpass( "Password: ");
X   return( (strcmp( p, PASSWORD) == 0) ? 0 : E_ILLPASSWORD);
X}
X
Xchar *message[] = {
X   "illegal error number",
X   "cannot open screen file",
X   "more than one player position in screen file",
X   "illegal char in screen file",
X   "no player position in screenfile",
X   "too much rows in screen file",
X   "too much columns in screenfile",
X   "quit the game",
X   "cannot open the help file",
X   "cannot get your username",
X   "cannot open savefile",
X   "error writing to savefile",
X   "cannot stat savefile",
X   "error reading savefile",
X   "cannot restore, your savefile has been altered",
X   "game saved",
X   "too much users in score table",
X   "cannot open score file",
X   "error reading scorefile",
X   "error writing scorefile",
X   "illegal command line syntax",
X   "illegal password",
X   "level number too big in command line",
X   "only superuser is allowed to make a new score table",
X   "cannot find file to restore"
X};
X
Xerrmess( ret) 
Xshort ret;
X{
X   if( ret != E_ENDGAME) {
X      fprintf( stderr, "%s: ", prgname);
X      switch( ret) {
X         case E_FOPENSCREEN: case E_PLAYPOS1:   case E_ILLCHAR: 
X	 case E_PLAYPOS2:    case E_TOMUCHROWS: case E_TOMUCHCOLS: 
X	 case E_ENDGAME:     case E_FOPENHELP:  case E_NOUSER:      
X	 case E_FOPENSAVE:   case E_WRITESAVE:  case E_STATSAVE:    
X	 case E_READSAVE:    case E_ALTERSAVE:  case E_SAVED:       
X	 case E_TOMUCHSE:    case E_FOPENSCORE: case E_READSCORE: 
X	 case E_WRITESCORE:  case E_USAGE:	case E_ILLPASSWORD:
X	 case E_LEVELTOOHIGH: case E_NOSUPER:	case E_NOSAVEFILE:
X			     fprintf( stderr, "%s\n", message[ret]);
X                             break;
X         default:            fprintf( stderr, "%s\n", message[0]);
X                             break;
X      }
X      if( ret == E_USAGE) usage();
X   }
X}
X
Xusage() {
X
X   fprintf( stderr, "Usage: %s [-{s|c|r|<nn>}]\n\n", prgname);
X   fprintf( stderr, "           -c:    create new score table (superuser only)\n");
X   fprintf( stderr, "           -r:    restore saved game\n");
X   fprintf( stderr, "           -s:    show score table\n");
X   fprintf( stderr, "           -<nn>: play this level (<nn> must be greater 0)\n");
X}
END_OF_FILE
if test 4668 -ne `wc -c <'sok.c'`; then
    echo shar: \"'sok.c'\" unpacked with wrong size!
fi
# end of 'sok.c'
fi
if test -f 'sokoban.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'sokoban.h'\"
else
echo shar: Extracting \"'sokoban.h'\" \(2518 characters\)
sed "s/^X//" >'sokoban.h' <<'END_OF_FILE'
X/***********************************************************************
X   You may wish to alter the following directory paths
X***********************************************************************/
X/**/
X/* SCREENPATH: the name of the directioy where the screen file are held */
X/**/
X#define SCREENPATH 	"/usr/games/lib/sokoban/screens"
X
X/**/
X/* HELPFILE: the full pathname of the helpfile */
X/**/
X#define HELPFILE	"/usr/games/lib/sokoban/sokoban.help"
X
X/**/
X/* SAVEPATH: the name of the path where save files are held */
X/*           Attention: Be sure that there are no other files with */
X/*                      the name <username>.sav                    */
X/**/
X#define SAVEPATH	"/usr/games/lib/sokoban"
X
X/**/
X/* LOCKPATH: temporary file which is created to ensure that no users */
X/*           work with the scorefile at the same time                */
X/**/
X#define LOCKFILE	"/tmp/sok.lock"
X
X/**/
X/* SCOREFILE: the full pathname of the score file */
X/**/
X#define SCOREFILE	"/usr/games/lib/sokoban/sok.score"
X
X/**/
X/* MAXUSERNAME: defines the maximum length of a system's user name */
X/**/
X#define MAXUSERNAME	10
X
X/**/
X/* MAXSCOREENTRIES: defines the maximum numner of entries in the scoretable */
X/**/
X#define MAXSCOREENTRIES	50
X
X/**/
X/* SUPERUSER: defines the name of the game superuser */
X/**/
X#define SUPERUSER "root"
X
X/**/
X/* PASSWORD: defines the password necessary for creating a new score file */
X/**/
X#define PASSWORD "nabokos"
X
X/*************************************************************************
X********************** DO NOT CHANGE BELOW THIS LINE *********************
X*************************************************************************/
X#define C_PLAYER	'@'
X#define C_PLAYERSTORE   '+'
X#define C_WALL		'#'
X#define C_GROUND	' '
X#define C_STORE		'.'
X#define C_PACKET	'$'
X#define C_SAVE		'*'
X
X#define MAXROW		20
X#define MAXCOL		40
X
Xtypedef struct {
X   short x, y;
X} POS;
X
Xchar *malloc();
XFILE *fopen();
X
X#define storepos( p, a, b)    p.x = a; p.y = b;
X
X#define E_FOPENSCREEN	1
X#define E_PLAYPOS1	2
X#define E_ILLCHAR	3
X#define E_PLAYPOS2	4
X#define E_TOMUCHROWS	5
X#define E_TOMUCHCOLS	6
X#define E_ENDGAME	7
X#define E_FOPENHELP	8
X#define E_NOUSER	9
X#define E_FOPENSAVE	10
X#define E_WRITESAVE	11
X#define E_STATSAVE	12
X#define E_READSAVE	13
X#define E_ALTERSAVE	14
X#define E_SAVED		15
X#define E_TOMUCHSE	16
X#define E_FOPENSCORE	17
X#define E_READSCORE	18
X#define E_WRITESCORE	19
X#define E_USAGE		20
X#define E_ILLPASSWORD	21
X#define E_LEVELTOOHIGH	22
X#define E_NOSUPER	23
X#define E_NOSAVEFILE	24
END_OF_FILE
if test 2518 -ne `wc -c <'sokoban.h'`; then
    echo shar: \"'sokoban.h'\" unpacked with wrong size!
fi
# end of 'sokoban.h'
fi
if test -f 'sokoban.help' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'sokoban.help'\"
else
echo shar: Extracting \"'sokoban.help'\" \(1236 characters\)
sed "s/^X//" >'sokoban.help' <<'END_OF_FILE'
X
X			S O K O B A N
X
X The problem is to push packets to saving positions by moving around
X and pushing only one packet at a time if possible.
X
X
X Available Commands are:
X
X h:  move/push left 	  H:  run/push left	^H:  run left to object
X l:  move/push right 	  L:  run/push right	^L:  run right to object
X j:  move/push down 	  J:  run/push down	^J:  run down to object
X k:  move/push up 	  K:  run/push up	^K:  run up to object
X
X u:  undo last move/push  U:  undo all 		
X 
X c:  temporary save      ^U:  reset to temporary save
X 
X ^R: Refresh screen
X
X q:  quit 		  s:  save the game	 ?:  this help screen
X+= (DO NOT CHANGE OR DELETE THIS LINE)
X
X Characters on screen are:
X
X    @@	player				++	player on saving position
X    ..	saving position for packet	$$   	packets
X    **	saved packet 			##	wall
X
X
X As you could see you can make a temporary save. This is useful if you think
X that all the moves/pushes you have made are correct, but you don't know how
X to go on. In this case you can temporary save (using the c command). If you
X then get stucked you need not undo all (using U), you can reset to you
X temporary save.
X
X If you have restored a saved game, a temporary save is automatically made
X at the start.
X== (DO NOT CHANGE THIS LINE)
END_OF_FILE
if test 1236 -ne `wc -c <'sokoban.help'`; then
    echo shar: \"'sokoban.help'\" unpacked with wrong size!
fi
# end of 'sokoban.help'
fi
if test -f 'screen.1' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'screen.1'\"
else
echo shar: Extracting \"'screen.1'\" \(164 characters\)
sed "s/^X//" >'screen.1' <<'END_OF_FILE'
X    #####
X    #   #
X    #$  #
X  ###  $##
X  #  $ $ #
X### # ## #   ######
X#   # ## #####  ..#
X# $  $          ..#
X##### ### #@##  ..#
X    #     #########
X    #######
END_OF_FILE
if test 164 -ne `wc -c <'screen.1'`; then
    echo shar: \"'screen.1'\" unpacked with wrong size!
fi
# end of 'screen.1'
fi
if test -f 'screen.10' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'screen.10'\"
else
echo shar: Extracting \"'screen.10'\" \(320 characters\)
sed "s/^X//" >'screen.10' <<'END_OF_FILE'
X ###  #############
X##@####       #   #
X# $$   $$  $ $ ...#
X#  $$$#    $  #...#
X# $   # $$ $$ #...#
X###   #  $    #...#
X#     # $ $ $ #...#
X#    ###### ###...#
X## #  #  $ $  #...#
X#  ## # $$ $ $##..#
X# ..# #  $      #.#
X# ..# # $$$ $$$ #.#
X##### #       # #.#
X    # ######### #.#
X    #           #.#
X    ###############
END_OF_FILE
if test 320 -ne `wc -c <'screen.10'`; then
    echo shar: \"'screen.10'\" unpacked with wrong size!
fi
# end of 'screen.10'
fi
if test -f 'screen.11' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'screen.11'\"
else
echo shar: Extracting \"'screen.11'\" \(223 characters\)
sed "s/^X//" >'screen.11' <<'END_OF_FILE'
X          ####
X     #### #  #
X   ### @###$ #
X  ##      $  #
X ##  $ $$## ##
X #  #$##     #
X # # $ $$ # ###
X #   $ #  # $ #####
X####    #  $$ #   #
X#### ## $         #
X#.    ###  ########
X#.. ..# ####
X#...#.#
X#.....#
X#######
END_OF_FILE
if test 223 -ne `wc -c <'screen.11'`; then
    echo shar: \"'screen.11'\" unpacked with wrong size!
fi
# end of 'screen.11'
fi
if test -f 'screen.12' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'screen.12'\"
else
echo shar: Extracting \"'screen.12'\" \(226 characters\)
sed "s/^X//" >'screen.12' <<'END_OF_FILE'
X################
X#              #
X# # ######     #
X# #  $ $ $ $#  #
X# #   $@$   ## ##
X# #  $ $ $###...#
X# #   $ $  ##...#
X# ###$$$ $ ##...#
X#     # ## ##...#
X#####   ## ##...#
X    #####     ###
X        #     #
X        #######
END_OF_FILE
if test 226 -ne `wc -c <'screen.12'`; then
    echo shar: \"'screen.12'\" unpacked with wrong size!
fi
# end of 'screen.12'
fi
if test -f 'screen.13' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'screen.13'\"
else
echo shar: Extracting \"'screen.13'\" \(236 characters\)
sed "s/^X//" >'screen.13' <<'END_OF_FILE'
X   #########
X  ##   ##  #####
X###     #  #    ###
X#  $ #$ #  #  ... #
X# # $#@$## # #.#. #
X#  # #$  #    . . #
X# $    $ # # #.#. #
X#   ##  ##$ $ . . #
X# $ #   #  #$#.#. #
X## $  $   $  $... #
X #$ ######    ##  #
X #  #    ##########
X ####
END_OF_FILE
if test 236 -ne `wc -c <'screen.13'`; then
    echo shar: \"'screen.13'\" unpacked with wrong size!
fi
# end of 'screen.13'
fi
if test -f 'screen.14' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'screen.14'\"
else
echo shar: Extracting \"'screen.14'\" \(284 characters\)
sed "s/^X//" >'screen.14' <<'END_OF_FILE'
X       #######
X #######     #
X #     # $@$ #
X #$$ #   #########
X # ###......##   #
X #   $......## # #
X # ###......     #
X##   #### ### #$##
X#  #$   #  $  # #
X#  $ $$$  # $## #
X#   $ $ ###$$ # #
X#####     $   # #
X    ### ###   # #
X      #     #   #
X      ########  #
X             ####
END_OF_FILE
if test 284 -ne `wc -c <'screen.14'`; then
    echo shar: \"'screen.14'\" unpacked with wrong size!
fi
# end of 'screen.14'
fi
if test -f 'screen.15' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'screen.15'\"
else
echo shar: Extracting \"'screen.15'\" \(229 characters\)
sed "s/^X//" >'screen.15' <<'END_OF_FILE'
X    #######
X   #   #  #
X   #  $   #
X ### #$   ####
X #  $  ##$   #
X #  # @ $ # $#
X #  #      $ ####
X ## ####$##     #
X # $#.....# #   #
X #  $..**. $# ###
X##  #.....#   #
X#   ### #######
X# $$  #  #
X#  #     #
X######   #
X     #####
END_OF_FILE
if test 229 -ne `wc -c <'screen.15'`; then
    echo shar: \"'screen.15'\" unpacked with wrong size!
fi
# end of 'screen.15'
fi
if test -f 'screen.16' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'screen.16'\"
else
echo shar: Extracting \"'screen.16'\" \(185 characters\)
sed "s/^X//" >'screen.16' <<'END_OF_FILE'
X#####
X#   ##
X#    #  ####
X# $  ####  #
X#  $$ $   $#
X###@ #$    ##
X #  ##  $ $ ##
X # $  ## ## .#
X #  #$##$  #.#
X ###   $..##.#
X  #    #.*...#
X  # $$ #.....#
X  #  #########
X  #  #
X  ####
END_OF_FILE
if test 185 -ne `wc -c <'screen.16'`; then
    echo shar: \"'screen.16'\" unpacked with wrong size!
fi
# end of 'screen.16'
fi
if test -f 'screen.17' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'screen.17'\"
else
echo shar: Extracting \"'screen.17'\" \(213 characters\)
sed "s/^X//" >'screen.17' <<'END_OF_FILE'
X   ##########
X   #..  #   #
X   #..      #
X   #..  #  ####
X  #######  #  ##
X  #            #
X  #  #  ##  #  #
X#### ##  #### ##
X#  $  ##### #  #
X# # $  $  # $  #
X# @$  $   #   ##
X#### ## #######
X   #    #
X   ######
END_OF_FILE
if test 213 -ne `wc -c <'screen.17'`; then
    echo shar: \"'screen.17'\" unpacked with wrong size!
fi
# end of 'screen.17'
fi
if test -f 'screen.18' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'screen.18'\"
else
echo shar: Extracting \"'screen.18'\" \(249 characters\)
sed "s/^X//" >'screen.18' <<'END_OF_FILE'
X     ###########
X     #  .  #   #
X     # #.    @ #
X ##### ##..# ####
X##  # ..###     ###
X# $ #...   $ #  $ #
X#    .. ##  ## ## #
X####$##$# $ #   # #
X  ## #    #$ $$ # #
X  #  $ # #  # $## #
X  #               #
X  #  ###########  #
X  ####         ####
END_OF_FILE
if test 249 -ne `wc -c <'screen.18'`; then
    echo shar: \"'screen.18'\" unpacked with wrong size!
fi
# end of 'screen.18'
fi
if test -f 'screen.19' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'screen.19'\"
else
echo shar: Extracting \"'screen.19'\" \(258 characters\)
sed "s/^X//" >'screen.19' <<'END_OF_FILE'
X  ######
X  #   @####
X##### $   #
X#   ##    ####
X# $ #  ##    #
X# $ #  ##### #
X## $  $    # #
X## $ $ ### # #
X## #  $  # # #
X## # #$#   # #
X## ###   # # ######
X#  $  #### # #....#
X#    $    $   ..#.#
X####$  $# $   ....#
X#       #  ## ....#
X###################
END_OF_FILE
if test 258 -ne `wc -c <'screen.19'`; then
    echo shar: \"'screen.19'\" unpacked with wrong size!
fi
# end of 'screen.19'
fi
if test -f 'screen.2' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'screen.2'\"
else
echo shar: Extracting \"'screen.2'\" \(148 characters\)
sed "s/^X//" >'screen.2' <<'END_OF_FILE'
X############
X#..  #     ###
X#..  # $  $  #
X#..  #$####  #
X#..    @ ##  #
X#..  # #  $ ##
X###### ##$ $ #
X  # $  $ $ $ #
X  #    #     #
X  ############
END_OF_FILE
if test 148 -ne `wc -c <'screen.2'`; then
    echo shar: \"'screen.2'\" unpacked with wrong size!
fi
# end of 'screen.2'
fi
if test -f 'screen.20' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'screen.20'\"
else
echo shar: Extracting \"'screen.20'\" \(303 characters\)
sed "s/^X//" >'screen.20' <<'END_OF_FILE'
X    ##########
X#####        ####
X#     #   $  #@ #
X# #######$####  ###
X# #    ## #  #$ ..#
X# # $     #  #  #.#
X# # $  #     #$ ..#
X# #  ### ##     #.#
X# ###  #  #  #$ ..#
X# #    #  ####  #.#
X# #$   $  $  #$ ..#
X#    $ # $ $ #  #.#
X#### $###    #$ ..#
X   #    $$ ###....#
X   #      ## ######
X   ########
END_OF_FILE
if test 303 -ne `wc -c <'screen.20'`; then
    echo shar: \"'screen.20'\" unpacked with wrong size!
fi
# end of 'screen.20'
fi
if test -f 'screen.21' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'screen.21'\"
else
echo shar: Extracting \"'screen.21'\" \(209 characters\)
sed "s/^X//" >'screen.21' <<'END_OF_FILE'
X#########
X#       #
X#       ####
X## #### #  #
X## #@##    #
X# $$$ $  $$#
X#  # ## $  #
X#  # ##  $ ####
X####  $$$ $#  #
X #   ##   ....#
X # #   # #.. .#
X #   # # ##...#
X ##### $  #...#
X     ##   #####
X      #####
END_OF_FILE
if test 209 -ne `wc -c <'screen.21'`; then
    echo shar: \"'screen.21'\" unpacked with wrong size!
fi
# end of 'screen.21'
fi
if test -f 'screen.22' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'screen.22'\"
else
echo shar: Extracting \"'screen.22'\" \(311 characters\)
sed "s/^X//" >'screen.22' <<'END_OF_FILE'
X#####      ####
X#    #######  #####
X#   $#  #  $  #   #
X#  $  $  $ # $ $  #
X##$ $   # @# $    #
X#  $ ########### ##
X# #   #.......# $#
X# ##  # ......#  #
X# #   $........$ #
X# # $ #.... ..#  #
X#  $ $####$#### $#
X# $   ### $   $  ##
X# $     $ $  $    #
X## ###### $ ##### #
X#         #       #
X###################
END_OF_FILE
if test 311 -ne `wc -c <'screen.22'`; then
    echo shar: \"'screen.22'\" unpacked with wrong size!
fi
# end of 'screen.22'
fi
if test -f 'screen.23' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'screen.23'\"
else
echo shar: Extracting \"'screen.23'\" \(254 characters\)
sed "s/^X//" >'screen.23' <<'END_OF_FILE'
X    #######
X    #  #  ####
X##### $#$ #  ##
X#.. #  #  #   #
X#.. # $#$ #  $####
X#.  #     #$  #  #
X#..   $#  # $    #
X#..@#  #$ #$  #  #
X#.. # $#     $#  #
X#.. #  #$$#$  #  ##
X#.. # $#  #  $#$  #
X#.. #  #  #   #   #
X##. ####  #####   #
X ####  ####   #####
END_OF_FILE
if test 254 -ne `wc -c <'screen.23'`; then
    echo shar: \"'screen.23'\" unpacked with wrong size!
fi
# end of 'screen.23'
fi
if test -f 'screen.24' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'screen.24'\"
else
echo shar: Extracting \"'screen.24'\" \(305 characters\)
sed "s/^X//" >'screen.24' <<'END_OF_FILE'
X###############
X#..........  .####
X#..........$$.#  #
X###########$ #   ##
X#      $  $     $ #
X## ####   #  $ #  #
X#      #   ##  # ##
X#  $#  # ##  ### ##
X# $ #$###    ### ##
X###  $ #  #  ### ##
X###    $ ## #  # ##
X # $  #  $  $ $   #
X #  $  $#$$$  #   #
X #  #  $      #####
X # @##  #  #  #
X #############
END_OF_FILE
if test 305 -ne `wc -c <'screen.24'`; then
    echo shar: \"'screen.24'\" unpacked with wrong size!
fi
# end of 'screen.24'
fi
if test -f 'screen.25' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'screen.25'\"
else
echo shar: Extracting \"'screen.25'\" \(295 characters\)
sed "s/^X//" >'screen.25' <<'END_OF_FILE'
X####
X#  ##############
X#  #   ..#......#
X#  # # ##### ...#
X##$#    ........#
X#   ##$######  ####
X# $ #     ######@ #
X##$ # $   ######  #
X#  $ #$$$##       #
X#      #    #$#$###
X# #### #$$$$$    #
X# #    $     #   #
X# #   ##        ###
X# ######$###### $ #
X#        #    #   #
X##########    #####
END_OF_FILE
if test 295 -ne `wc -c <'screen.25'`; then
    echo shar: \"'screen.25'\" unpacked with wrong size!
fi
# end of 'screen.25'
fi
if test -f 'screen.26' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'screen.26'\"
else
echo shar: Extracting \"'screen.26'\" \(177 characters\)
sed "s/^X//" >'screen.26' <<'END_OF_FILE'
X #######
X #  #  #####
X##  #  #...###
X#  $#  #...  #
X# $ #$$ ...  #
X#  $#  #... .#
X#   # $########
X##$       $ $ #
X##  #  $$ #   #
X ######  ##$$@#
X      #      ##
X      ########
END_OF_FILE
if test 177 -ne `wc -c <'screen.26'`; then
    echo shar: \"'screen.26'\" unpacked with wrong size!
fi
# end of 'screen.26'
fi
if test -f 'screen.27' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'screen.27'\"
else
echo shar: Extracting \"'screen.27'\" \(248 characters\)
sed "s/^X//" >'screen.27' <<'END_OF_FILE'
X #################
X #...   #    #   ##
X##.....  $## # #$ #
X#......#  $  #    #
X#......#  #  # #  #
X######### $  $ $  #
X  #     #$##$ ##$##
X ##   $    # $    #
X #  ## ### #  ##$ #
X # $ $$     $  $  #
X # $    $##$ ######
X #######  @ ##
X       ######
END_OF_FILE
if test 248 -ne `wc -c <'screen.27'`; then
    echo shar: \"'screen.27'\" unpacked with wrong size!
fi
# end of 'screen.27'
fi
if test -f 'screen.28' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'screen.28'\"
else
echo shar: Extracting \"'screen.28'\" \(258 characters\)
sed "s/^X//" >'screen.28' <<'END_OF_FILE'
X         #####
X     #####   #
X    ## $  $  ####
X##### $  $ $ ##.#
X#       $$  ##..#
X#  ###### ###.. #
X## #  #    #... #
X# $   #    #... #
X#@ #$ ## ####...#
X####  $ $$  ##..#
X   ##  $ $  $...#
X    # $$  $ #  .#
X    #   $ $  ####
X    ######   #
X         #####
END_OF_FILE
if test 258 -ne `wc -c <'screen.28'`; then
    echo shar: \"'screen.28'\" unpacked with wrong size!
fi
# end of 'screen.28'
fi
if test -f 'screen.29' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'screen.29'\"
else
echo shar: Extracting \"'screen.29'\" \(228 characters\)
sed "s/^X//" >'screen.29' <<'END_OF_FILE'
X#####
X#   ##
X# $  #########
X## # #       ######
X## #   $#$#@  #   #
X#  #      $ #   $ #
X#  ### ######### ##
X#  ## ..*..... # ##
X## ## *.*..*.* # ##
X# $########## ##$ #
X#  $   $  $    $  #
X#  #   #   #   #  #
X###################
END_OF_FILE
if test 228 -ne `wc -c <'screen.29'`; then
    echo shar: \"'screen.29'\" unpacked with wrong size!
fi
# end of 'screen.29'
fi
if test -f 'screen.3' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'screen.3'\"
else
echo shar: Extracting \"'screen.3'\" \(164 characters\)
sed "s/^X//" >'screen.3' <<'END_OF_FILE'
X        ########
X        #     @#
X        # $#$ ##
X        # $  $#
X        ##$ $ #
X######### $ # ###
X#....  ## $  $  #
X##...    $  $   #
X#....  ##########
X########
END_OF_FILE
if test 164 -ne `wc -c <'screen.3'`; then
    echo shar: \"'screen.3'\" unpacked with wrong size!
fi
# end of 'screen.3'
fi
if test -f 'screen.30' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'screen.30'\"
else
echo shar: Extracting \"'screen.30'\" \(270 characters\)
sed "s/^X//" >'screen.30' <<'END_OF_FILE'
X       ###########
X       #   #     #
X#####  #     $ $ #
X#   ##### $## # ##
X# $ ##   # ## $  #
X# $  @$$ # ##$$$ #
X## ###   # ##    #
X## #   ### #####$#
X## #     $  #....#
X#  ### ## $ #....##
X# $   $ #   #..$. #
X#  ## $ #  ##.... #
X#####   ######...##
X    #####    #####
END_OF_FILE
if test 270 -ne `wc -c <'screen.30'`; then
    echo shar: \"'screen.30'\" unpacked with wrong size!
fi
# end of 'screen.30'
fi
if test -f 'screen.31' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'screen.31'\"
else
echo shar: Extracting \"'screen.31'\" \(236 characters\)
sed "s/^X//" >'screen.31' <<'END_OF_FILE'
X  ####
X  #  #########
X ##  ##  #   #
X #  $# $@$   ####
X #$  $  # $ $#  ##
X##  $## #$ $     #
X#  #  # #   $$$  #
X# $    $  $## ####
X# $ $ #$#  #  #
X##  ###  ###$ #
X #  #....     #
X ####......####
X   #....####
X   #...##
X   #...#
X   #####
END_OF_FILE
if test 236 -ne `wc -c <'screen.31'`; then
    echo shar: \"'screen.31'\" unpacked with wrong size!
fi
# end of 'screen.31'
fi
if test -f 'screen.32' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'screen.32'\"
else
echo shar: Extracting \"'screen.32'\" \(189 characters\)
sed "s/^X//" >'screen.32' <<'END_OF_FILE'
X      ####
X  #####  #
X ##     $#
X## $  ## ###
X#@$ $ # $  #
X#### ##   $#
X #....#$ $ #
X #....#   $#
X #....  $$ ##
X #... # $   #
X ######$ $  #
X      #   ###
X      #$ ###
X      #  #
X      ####
END_OF_FILE
if test 189 -ne `wc -c <'screen.32'`; then
    echo shar: \"'screen.32'\" unpacked with wrong size!
fi
# end of 'screen.32'
fi
if test -f 'screen.33' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'screen.33'\"
else
echo shar: Extracting \"'screen.33'\" \(195 characters\)
sed "s/^X//" >'screen.33' <<'END_OF_FILE'
X############
X##     ##  #
X##   $   $ #
X#### ## $$ #
X#   $ #    #
X# $$$ # ####
X#   # # $ ##
X#  #  #  $ #
X# $# $#    #
X#   ..# ####
X####.. $ #@#
X#.....# $# #
X##....#  $ #
X###..##    #
X############
END_OF_FILE
if test 195 -ne `wc -c <'screen.33'`; then
    echo shar: \"'screen.33'\" unpacked with wrong size!
fi
# end of 'screen.33'
fi
if test -f 'screen.34' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'screen.34'\"
else
echo shar: Extracting \"'screen.34'\" \(203 characters\)
sed "s/^X//" >'screen.34' <<'END_OF_FILE'
X #########
X #....   ##
X #.#.#  $ ##
X##....# # @##
X# ....#  #  ##
X#     #$ ##$ #
X## ###  $    #
X #$  $ $ $#  #
X # #  $ $ ## #
X #  ###  ##  #
X #    ## ## ##
X #  $ #  $  #
X ###$ $   ###
X   #  #####
X   ####
END_OF_FILE
if test 203 -ne `wc -c <'screen.34'`; then
    echo shar: \"'screen.34'\" unpacked with wrong size!
fi
# end of 'screen.34'
fi
if test -f 'screen.35' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'screen.35'\"
else
echo shar: Extracting \"'screen.35'\" \(298 characters\)
sed "s/^X//" >'screen.35' <<'END_OF_FILE'
X############ ######
X#   #    # ###....#
X#   $$#   @  .....#
X#   # ###   # ....#
X## ## ###  #  ....#
X # $ $     # # ####
X #  $ $##  #      #
X#### #  #### # ## #
X#  # #$   ## #    #
X# $  $  # ## #   ##
X# # $ $    # #   #
X#  $ ## ## # #####
X# $$     $$  #
X## ## ### $  #
X #    # #    #
X ###### ######
END_OF_FILE
if test 298 -ne `wc -c <'screen.35'`; then
    echo shar: \"'screen.35'\" unpacked with wrong size!
fi
# end of 'screen.35'
fi
if test -f 'screen.36' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'screen.36'\"
else
echo shar: Extracting \"'screen.36'\" \(289 characters\)
sed "s/^X//" >'screen.36' <<'END_OF_FILE'
X            #####
X#####  ######   #
X#   ####  $ $ $ #
X# $   ## ## ##  ##
X#   $ $     $  $ #
X### $  ## ##     ##
X  # ##### #####$$ #
X ##$##### @##     #
X # $  ###$### $  ##
X # $  #   ###  ###
X # $$ $ #   $$ #
X #     #   ##  #
X #######.. .###
X    #.........#
X    #.........#
X    ###########
END_OF_FILE
if test 289 -ne `wc -c <'screen.36'`; then
    echo shar: \"'screen.36'\" unpacked with wrong size!
fi
# end of 'screen.36'
fi
if test -f 'screen.37' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'screen.37'\"
else
echo shar: Extracting \"'screen.37'\" \(272 characters\)
sed "s/^X//" >'screen.37' <<'END_OF_FILE'
X###########
X#......   #########
X#......   #  ##   #
X#..### $    $     #
X#... $ $ #   ##   #
X#...#$#####    #  #
X###    #   #$  #$ #
X  #  $$ $ $  $##  #
X  #  $   #$#$ ##$ #
X  ### ## #    ##  #
X   #  $ $ ## ######
X   #    $  $  #
X   ##   # #   #
X    #####@#####
X        ###
END_OF_FILE
if test 272 -ne `wc -c <'screen.37'`; then
    echo shar: \"'screen.37'\" unpacked with wrong size!
fi
# end of 'screen.37'
fi
if test -f 'screen.38' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'screen.38'\"
else
echo shar: Extracting \"'screen.38'\" \(120 characters\)
sed "s/^X//" >'screen.38' <<'END_OF_FILE'
X      ####
X####### @#
X#     $  #
X#   $## $#
X##$#...# #
X # $...  #
X # #. .# ##
X #   # #$ #
X #$  $    #
X #  #######
X ####
END_OF_FILE
if test 120 -ne `wc -c <'screen.38'`; then
    echo shar: \"'screen.38'\" unpacked with wrong size!
fi
# end of 'screen.38'
fi
if test -f 'screen.39' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'screen.39'\"
else
echo shar: Extracting \"'screen.39'\" \(291 characters\)
sed "s/^X//" >'screen.39' <<'END_OF_FILE'
X             ######
X #############....#
X##   ##     ##....#
X#  $$##  $ @##....#
X#      $$ $#  ....#
X#  $ ## $$ # # ...#
X#  $ ## $  #  ....#
X## ##### ### ##.###
X##   $  $ ##   .  #
X# $###  # ##### ###
X#   $   #       #
X#  $ #$ $ $###  #
X# $$$# $   # ####
X#    #  $$ #
X######   ###
X     #####
END_OF_FILE
if test 291 -ne `wc -c <'screen.39'`; then
    echo shar: \"'screen.39'\" unpacked with wrong size!
fi
# end of 'screen.39'
fi
if test -f 'screen.4' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'screen.4'\"
else
echo shar: Extracting \"'screen.4'\" \(230 characters\)
sed "s/^X//" >'screen.4' <<'END_OF_FILE'
X           ########
X           #  ....#
X############  ....#
X#    #  $ $   ....#
X# $$$#$  $ #  ....#
X#  $     $ #  ....#
X# $$ #$ $ $########
X#  $ #     #
X## #########
X#    #    ##
X#     $   ##
X#  $$#$$  @#
X#    #    ##
X###########
END_OF_FILE
if test 230 -ne `wc -c <'screen.4'`; then
    echo shar: \"'screen.4'\" unpacked with wrong size!
fi
# end of 'screen.4'
fi
if test -f 'screen.40' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'screen.40'\"
else
echo shar: Extracting \"'screen.40'\" \(248 characters\)
sed "s/^X//" >'screen.40' <<'END_OF_FILE'
X    ############
X    #          ##
X    #  # #$$ $  #
X    #$ #$#  ## @#
X   ## ## # $ # ##
X   #   $ #$  # #
X   #   # $   # #
X   ## $ $   ## #
X   #  #  ##  $ #
X   #    ## $$# #
X######$$   #   #
X#....#  ########
X#.#... ##
X#....   #
X#....   #
X#########
END_OF_FILE
if test 248 -ne `wc -c <'screen.40'`; then
    echo shar: \"'screen.40'\" unpacked with wrong size!
fi
# end of 'screen.40'
fi
if test -f 'screen.41' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'screen.41'\"
else
echo shar: Extracting \"'screen.41'\" \(286 characters\)
sed "s/^X//" >'screen.41' <<'END_OF_FILE'
X           #####
X          ##   ##
X         ##     #
X        ##  $$  #
X       ## $$  $ #
X       # $    $ #
X####   #   $$ #####
X#  ######## ##    #
X#.            $$$@#
X#.# ####### ##   ##
X#.# #######. #$ $##
X#........... #    #
X##############  $ #
X             ##  ##
X              ####
END_OF_FILE
if test 286 -ne `wc -c <'screen.41'`; then
    echo shar: \"'screen.41'\" unpacked with wrong size!
fi
# end of 'screen.41'
fi
if test -f 'screen.42' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'screen.42'\"
else
echo shar: Extracting \"'screen.42'\" \(233 characters\)
sed "s/^X//" >'screen.42' <<'END_OF_FILE'
X     ########
X  ####      ######
X  #    ## $ $   @#
X  # ## ##$#$ $ $##
X### ......#  $$ ##
X#   ......#  #   #
X# # ......#$  $  #
X# #$...... $$# $ #
X#   ### ###$  $ ##
X###  $  $  $  $ #
X  #  $  $  $  $ #
X  ######   ######
X       #####
END_OF_FILE
if test 233 -ne `wc -c <'screen.42'`; then
    echo shar: \"'screen.42'\" unpacked with wrong size!
fi
# end of 'screen.42'
fi
if test -f 'screen.5' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'screen.5'\"
else
echo shar: Extracting \"'screen.5'\" \(223 characters\)
sed "s/^X//" >'screen.5' <<'END_OF_FILE'
X        #####
X        #   #####
X        # #$##  #
X        #     $ #
X######### ###   #
X#....  ## $  $###
X#....    $ $$ ##
X#....  ##$  $ @#
X#########  $  ##
X        # $ $  #
X        ### ## #
X          #    #
X          ######
END_OF_FILE
if test 223 -ne `wc -c <'screen.5'`; then
    echo shar: \"'screen.5'\" unpacked with wrong size!
fi
# end of 'screen.5'
fi
if test -f 'screen.6' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'screen.6'\"
else
echo shar: Extracting \"'screen.6'\" \(142 characters\)
sed "s/^X//" >'screen.6' <<'END_OF_FILE'
X######  ###
X#..  # ##@##
X#..  ###   #
X#..     $$ #
X#..  # # $ #
X#..### # $ #
X#### $ #$  #
X   #  $# $ #
X   # $  $  #
X   #  ##   #
X   #########
END_OF_FILE
if test 142 -ne `wc -c <'screen.6'`; then
    echo shar: \"'screen.6'\" unpacked with wrong size!
fi
# end of 'screen.6'
fi
if test -f 'screen.7' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'screen.7'\"
else
echo shar: Extracting \"'screen.7'\" \(153 characters\)
sed "s/^X//" >'screen.7' <<'END_OF_FILE'
X       #####
X #######   ##
X## # @## $$ #
X#    $      #
X#  $  ###   #
X### #####$###
X# $  ### ..#
X# $ $ $ ...#
X#    ###...#
X# $$ # #...#
X#  ### #####
X####
END_OF_FILE
if test 153 -ne `wc -c <'screen.7'`; then
    echo shar: \"'screen.7'\" unpacked with wrong size!
fi
# end of 'screen.7'
fi
if test -f 'screen.8' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'screen.8'\"
else
echo shar: Extracting \"'screen.8'\" \(226 characters\)
sed "s/^X//" >'screen.8' <<'END_OF_FILE'
X  ####
X  #  ###########
X  #    $   $ $ #
X  # $# $ #  $  #
X  #  $ $  #    #
X### $# #  #### #
X#@#$ $ $  ##   #
X#    $ #$#   # #
X#   $    $ $ $ #
X ####  #########
X  #      #
X  #      #
X  #......#
X  #......#
X  #......#
X  ########
END_OF_FILE
if test 226 -ne `wc -c <'screen.8'`; then
    echo shar: \"'screen.8'\" unpacked with wrong size!
fi
# end of 'screen.8'
fi
if test -f 'screen.9' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'screen.9'\"
else
echo shar: Extracting \"'screen.9'\" \(240 characters\)
sed "s/^X//" >'screen.9' <<'END_OF_FILE'
X          #######
X          #  ...#
X      #####  ...#
X      #      . .#
X      #  ##  ...#
X      ## ##  ...#
X     ### ########
X     # $$$ ##
X #####  $ $ #####
X##   #$ $   #   #
X#@ $  $    $  $ #
X###### $$ $ #####
X     #      #
X     ########
END_OF_FILE
if test 240 -ne `wc -c <'screen.9'`; then
    echo shar: \"'screen.9'\" unpacked with wrong size!
fi
# end of 'screen.9'
fi
echo shar: End of shell archive.
exit 0