[comp.sources.games] v06i041: ega-sokoban - sokoban V2 for MS-DOS w/EGA graphics, Part02/02

games@tekred.CNA.TEK.COM (04/02/89)

Submitted-by: ching@pepsi.amd.com (Mike Ching)
Posting-number: Volume 6, Issue 41
Archive-name: ega-sokoban/Part02


#! /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 archive 2 (of 2)."
# Contents:  makefile readscre.c sok.c
# Wrapped by billr@saab on Sat Apr  1 09:45:57 1989
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'makefile' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'makefile'\"
else
echo shar: Extracting \"'makefile'\" \(517 characters\)
sed "s/^X//" >'makefile' <<'END_OF_FILE'
XCCOPT= -O -ml
XOBJECTS= sok.obj readscrn.obj showscrn.obj play.obj save.obj score.obj
X
Xsok.exe: $(OBJECTS)
X	tcc -ml $(OBJECTS) lcurses.lib graphics.lib \tc\lib\egavgaf.obj
X
Xsok.obj: sok.c sokoban.h
X	tcc $(CCOPT) -c sok.c
X
Xreadscrn.obj: readscrn.c sokoban.h
X	tcc $(CCOPT) -c readscrn.c
X
Xshowscrn.obj: showscrn.c sokoban.h bitmaps.h
X	tcc $(CCOPT) -c showscrn.c
X
Xplay.obj: play.c sokoban.h
X	tcc $(CCOPT) -c play.c
X
Xsave.obj: save.c sokoban.h
X	tcc $(CCOPT) -c save.c
X
Xscore.obj: score.c sokoban.h
X	tcc $(CCOPT) -c score.c
END_OF_FILE
if test 517 -ne `wc -c <'makefile'`; then
    echo shar: \"'makefile'\" unpacked with wrong size!
fi
# end of 'makefile'
fi
if test -f 'readscre.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'readscre.c'\"
else
echo shar: Extracting \"'readscre.c'\" \(1492 characters\)
sed "s/^X//" >'readscre.c' <<'END_OF_FILE'
X#include <stdio.h>
X#include "sokoban.h"
X
Xextern char *malloc();
Xextern FILE *fopen();
X
Xextern short level, packets, savepack, rows, cols;
Xextern char  map[MAXROW+1][MAXCOL+1];
Xextern POS   ppos;
X
Xshort readscreen() {
X
X   FILE *screen;
X   char *fnam;
X   short j, c, ret = 0;
X
X   fnam = malloc( strlen( SCREENPATH) + 12);
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      ppos.x = -1; ppos.y = -1;
X      while( (ret == 0) && ((c = getc( screen)) != EOF)) {
X         if( c == '\n') {
X	    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	 }
X	 else if( (c == player.obj_intern) || (c == playerstore.obj_intern)) {
X	    if( ppos.x != -1) 
X	       ret = E_PLAYPOS1;
X	    else { 
X	       ppos.x = rows; ppos.y = j;
X	       map[rows][j++] = c;
X	       if( j > MAXCOL) ret = E_TOMUCHCOLS;
X	    }
X	 }
X	 else if( (c == save.obj_intern) || (c == packet.obj_intern) ||
X		  (c == wall.obj_intern) || (c == store.obj_intern) ||
X		  (c == ground.obj_intern)) {
X	    if( c == save.obj_intern)   { savepack++; packets++; }
X	    if( c == packet.obj_intern) packets++;
X	    map[rows][j++] = c;
X	    if( j > MAXCOL) ret = E_TOMUCHCOLS;
X	 }
X	 else ret = E_ILLCHAR;
X      }
X      fclose( screen);
X      if( (ret == 0) && (ppos.x == -1)) ret = E_PLAYPOS2;
X   }
X   return( ret);
X}
END_OF_FILE
if test 1492 -ne `wc -c <'readscre.c'`; then
    echo shar: \"'readscre.c'\" unpacked with wrong size!
fi
# end of 'readscre.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'\" \(5450 characters\)
sed "s/^X//" >'sok.c' <<'END_OF_FILE'
X#include <stdio.h>
X#include <curses.h>
X#include "sokoban.h"
X#ifdef __MSDOS__
X#if __TURBOC__
X#include <graphics.h>
X#endif
Xchar * getlogin()
X{	static char loginname[MAXUSERNAME];
X	fputs("\nName? ", stdout);
X	fgets(loginname, MAXUSERNAME, stdin);
X	loginname[strlen(loginname)-1] = 0;
X	return(loginname);
X}
X#endif
X
Xextern char  *strrchr(), *getlogin(), *getpass();
Xextern short readscreen(), play(), outputscore(), getuserlevel(),
X	     makenewscore(), restoregame(), score();
X
Xshort curses = 1;
Xshort scoring = 1;
Xshort level, packets, savepack, moves, pushes, rows, cols;
Xshort scorelevel, scoremoves, scorepushes;
Xchar  map[MAXROW+1][MAXCOL+1];
XPOS   ppos;
Xchar  *username, *prgname;
X
Xstatic short optshowscore = 0, 
X	     optmakescore = 0, 
X             optrestore = 0, 
X	     optlevel = 0; 
Xstatic short superuser = 0;
X
Xstatic short userlevel;
X
Xmain( argc, argv) 
Xshort argc; 
Xchar *argv[];
X{
X   short ret, ret2;
X#if __TURBOC__
X   static int gd = DETECT, gm;
X   detectgraph(&gd, &gm);
X   if (gd != -2)
X   	curses = 0;
X   if (registerfarbgidriver(EGAVGA_driver_far) < 0)
X   	curses = 1;
X#endif
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( (ret = checkcmdline( argc, argv)) == 0) {
X      if( optshowscore)
X	 ret = outputscore();
X      else {
X	 if( (username = getlogin()) == NULL)
X	    ret = E_NOUSER;
X	 else {
X	    superuser = (strcmp( username, SUPERUSER) == 0);
X	    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   }
X#if __TURBOC__
X   if( ret == 0)
X   {  if (!curses)
X   	 initgraph(&gd, &gm, "");
X      ret = gameloop();
X      if (!curses)
X      	 closegraph();
X   }
X#else
X   if( ret == 0)
X      ret = gameloop();
X#endif
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   clear();
X   if (curses)
X   	refresh(); 
X   nocrmode(); echo(); endwin();
X   return( ret);
X}
X
Xgetpassword() {
X
X   return( (strcmp(getpass("Password: "), 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   NULL,			/* errmessage deleted */
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) 
Xregister short 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_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
Xstatic char *usagestr[] = {
X   "           -c:    create new score table (superuser only)\n",
X   "           -r:    restore saved game\n",
X   "           -s:    show score table\n",
X   "           -<nn>: play this level (<nn> must be greater 0)\n",
X   NULL
X};
X
Xusage() {
X
X   register short i;
X
X   fprintf( stderr, "Usage: %s [-{s|c|r|<nn>}]\n\n", prgname);
X   for( i = 0; usagestr[i] != NULL; i++)
X      fprintf( stderr, "%s", usagestr[i]);
X}
END_OF_FILE
if test 5450 -ne `wc -c <'sok.c'`; then
    echo shar: \"'sok.c'\" unpacked with wrong size!
fi
# end of 'sok.c'
fi
echo shar: End of archive 2 \(of 2\).
cp /dev/null ark2isdone
MISSING=""
for I in 1 2 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked both archives.
    rm -f ark[1-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0