[comp.sources.games] v06i012: ega-wanderer - wanderer 2.2 for Microport V/AT w/EGA or curses, Part04/05

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

Submitted by: Dave Bodenstab <att!iwsl8!imdave>
Comp.sources.games: Volume 6, Issue 12
Archive-name: ega-wanderer/Part04



#! /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 4 (of 5)."
# Contents:  16x16.c Makefile display.c fall.c icons/48x48/backslide_bm
#   icons/48x48/landmine_bm icons/48x48/teleport_bm icons/bmtoBM.c
#   jump.c m.c save.c wand_head.h
# Wrapped by billr@saab on Tue Feb 14 15:28:02 1989
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f '16x16.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'16x16.c'\"
else
echo shar: Extracting \"'16x16.c'\" \(5506 characters\)
sed "s/^X//" >'16x16.c' <<'END_OF_FILE'
X#include "bitmap.h"
X
Xstatic BM(16,16) arrival ={ 16, 16,
X  0x00, 0x00, 0x0f, 0xf8, 0x10, 0x04, 0x27, 0xf2, 0x48, 0x0a, 0x53, 0xea,
X  0x54, 0x2a, 0x55, 0xca, 0x55, 0x92, 0x54, 0x24, 0x53, 0xc8, 0x48, 0x10,
X  0x27, 0xe2, 0x10, 0x04, 0x0f, 0xf8, 0x00, 0x00, };
X
Xstatic BM(16,16) backslide ={ 16, 16,
X  0x00, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 
X  0x02, 0x00, 0x01, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 
X  0x00, 0x08, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, };
X
Xstatic BM(16,16) balloon ={ 16, 16,
X  0x00, 0x00, 0x03, 0xc0, 0x0c, 0x30, 0x10, 0x08, 0x10, 0x08, 0x20, 0x04, 
X  0x20, 0x04, 0x20, 0x04, 0x20, 0x04, 0x10, 0x08, 0x10, 0x08, 0x0c, 0x30, 
X  0x03, 0xce, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x00, };
X
Xstatic BM(16,16) brick ={ 16, 16,
X  0x77, 0x77, 0x5d, 0xdd, 0x3b, 0xbb, 0x6e, 0xee, 0x77, 0x77, 0x00, 0x00, 
X  0xbb, 0x3b, 0xee, 0x6e, 0x77, 0x77, 0xdd, 0x5d, 0xbb, 0x3b, 0xee, 0x6e, 
X  0x77, 0x77, 0x00, 0x00, 0x3b, 0xbb, 0x6e, 0xee, };
X
Xstatic BM(16,16) cage ={ 16, 16,
X  0x00, 0x00, 0xff, 0xfe, 0x49, 0x24, 0x49, 0x24, 0x49, 0x24, 0x49, 0x24, 
X  0x4b, 0x24, 0x4b, 0x24, 0x4b, 0x24, 0x49, 0x24, 0x49, 0x24, 0x49, 0x24, 
X  0x49, 0x24, 0x49, 0x24, 0xff, 0xfe, 0x00, 0x00, };
X
Xstatic BM(16,16) diamond ={ 16, 16,
X  0x00, 0x00, 0x00, 0x00, 0x1f, 0xe0, 0x0f, 0xe0, 0x07, 0xc0, 0x02, 0x80, 
X  0x07, 0xc0, 0x0f, 0xf0, 0x0e, 0xf0, 0x1c, 0x70, 0x1b, 0xf8, 0x3c, 0x78, 
X  0x3f, 0xb8, 0x3c, 0x78, 0x3e, 0xf0, 0x1f, 0xf0, };
X
Xstatic BM(16,16) dirt ={ 16, 16,
X  0x88, 0x88, 0x22, 0x22, 0x4c, 0x44, 0x11, 0x31, 0x88, 0x08, 0x22, 0x02, 
X  0x58, 0x5c, 0x11, 0x11, 0x88, 0x88, 0x22, 0x32, 0x54, 0x44, 0x10, 0x11, 
X  0x88, 0xa8, 0x02, 0x22, 0x44, 0x44, 0x11, 0x11, };
X
Xstatic BM(16,16) fwdslide ={ 16, 16,
X  0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 
X  0x00, 0x40, 0x00, 0x80, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 
X  0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x00, 0x00, };
X
Xstatic BM(16,16) landmine ={ 16, 16,
X  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x14, 0x00, 0x00, 0x00, 
X  0x17, 0x00, 0x00, 0xf8, 0x09, 0xc4, 0x00, 0xaa, 0x00, 0x92, 0x00, 0xaa, 
X  0x00, 0x44, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, };
X
Xstatic BM(16,16) larrow ={ 16, 16,
X  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
X  0x08, 0x0a, 0x10, 0x14, 0x3f, 0xfc, 0x10, 0x14, 0x08, 0x0a, 0x00, 0x00, 
X  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, };
X
Xstatic BM(16,16) monster ={ 16, 16,
X  0x00, 0x00, 0x0e, 0x00, 0x0a, 0xe0, 0x04, 0xa2, 0x44, 0x42, 0x4f, 0xe2, 
X  0x5f, 0xf2, 0x5f, 0xf2, 0x7c, 0xfe, 0x1b, 0x60, 0x18, 0x60, 0x1f, 0xe0, 
X  0x02, 0x40, 0x06, 0x40, 0x04, 0x40, 0x3c, 0x78, };
X
Xstatic BM(16,16) player ={ 16, 16,
X  0x00, 0x00, 0x01, 0x80, 0x03, 0xc0, 0x03, 0xc0, 0x03, 0xc0, 0x00, 0x00, 
X  0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x03, 0xc0, 
X  0x01, 0x80, 0x01, 0x80, 0x07, 0xe0, 0x00, 0x00, };
X
Xstatic BM(16,16) rarrow ={ 16, 16,
X  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x08, 
X  0x28, 0x04, 0x3f, 0xfe, 0x28, 0x04, 0x50, 0x08, 0x00, 0x00, 0x00, 0x00, 
X  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, };
X
Xstatic BM(16,16) rock ={ 16, 16,
X  0x00, 0x00, 0x01, 0xc0, 0x07, 0xf0, 0x1f, 0xf8, 0x37, 0xf6, 0x7f, 0xfa, 
X  0x7f, 0xfe, 0x7f, 0xfe, 0x7f, 0xfe, 0x7f, 0xfc, 0x37, 0xfc, 0x2b, 0xf8, 
X  0x18, 0xf8, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x00, };
X
Xstatic BM(16,16) space ={ 16, 16,
X  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
X  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
X  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, };
X
Xstatic BM(16,16) sprite ={ 16, 16,
X  0x00, 0x00, 0x3c, 0x04, 0x22, 0x4a, 0x01, 0x10, 0x08, 0xa8, 0x02, 0x20, 
X  0x05, 0x44, 0x11, 0x10, 0x08, 0x88, 0x02, 0x60, 0x04, 0x60, 0x19, 0x10, 
X  0x20, 0x88, 0x40, 0x08, 0x00, 0x18, 0x00, 0x00, };
X
Xstatic BM(16,16) teleport ={ 16, 16,
X  0x00, 0x00, 0x01, 0x00, 0x0f, 0xe0, 0x3f, 0xf8, 0x10, 0x10, 0x16, 0xd0, 
X  0x16, 0xd0, 0x10, 0x10, 0x14, 0xd0, 0x10, 0x10, 0x16, 0xd0, 0x10, 0x10, 
X  0x16, 0xd0, 0x10, 0x10, 0x3f, 0xf8, 0x00, 0x00, };
X
Xstatic BM(16,16) timecapsule ={ 16, 16,
X  0x00, 0x00, 0x03, 0x80, 0x03, 0x80, 0x03, 0x80, 0x04, 0x40, 0x09, 0x20, 
X  0x11, 0x10, 0x11, 0xd0, 0x10, 0x10, 0x08, 0x20, 0x04, 0x40, 0x03, 0x80, 
X  0x03, 0x80, 0x03, 0x80, 0x03, 0x80, 0x00, 0x00, };
X
Xstatic BM(16,16) wall ={ 16, 16,
X  0xaa, 0xaa, 0x54, 0x55, 0xaa, 0xaa, 0x55, 0x55, 0xae, 0xba, 0x15, 0x55, 
X  0xaa, 0xaa, 0x75, 0x55, 0xa8, 0xea, 0x55, 0x55, 0x8a, 0xa2, 0x55, 0x55, 
X  0xaa, 0xa2, 0x75, 0xd5, 0xaa, 0xaa, 0x55, 0x55, };
X
Xstatic BM(16,16) wayout ={ 16, 16,
X  0x00, 0x00, 0x7f, 0xfe, 0x7f, 0xfe, 0x6f, 0xf6, 0x77, 0xee, 0x7b, 0xde, 
X  0x7d, 0xbe, 0x7e, 0x7e, 0x7e, 0x7e, 0x7d, 0xbe, 0x7b, 0xde, 0x77, 0xee, 
X  0x6f, 0xf6, 0x7f, 0xfe, 0x7f, 0xfe, 0x00, 0x00, };
X
Xstatic BM(16,16) whoops ={ 16, 16,
X  0xff, 0xff, 0x80, 0x01, 0x80, 0x01, 0x81, 0x81, 0x82, 0x41, 0x80, 0x41, 
X  0x81, 0x99, 0x80, 0x25, 0x99, 0x05, 0xa4, 0x19, 0x84, 0x01, 0x98, 0x11, 
X  0x80, 0x01, 0x90, 0x01, 0x80, 0x01, 0xff, 0xff, };
X
Xbitmap *b16x16[] ={ (bitmap*) &backslide, (bitmap*) &balloon,
X			(bitmap*) &brick, (bitmap*) &cage,
X			(bitmap*) &diamond, (bitmap*) &dirt,
X			(bitmap*) &fwdslide, (bitmap*) &landmine,
X			(bitmap*) &larrow, (bitmap*) &monster,
X			(bitmap*) &player, (bitmap*) &rarrow,
X			(bitmap*) &rock, (bitmap*) &space,
X			(bitmap*) &sprite, (bitmap*) &teleport,
X			(bitmap*) &timecapsule, (bitmap*) &wall,
X			(bitmap*) &wayout, (bitmap*) &whoops,
X			(bitmap*) &arrival, };
END_OF_FILE
if test 5506 -ne `wc -c <'16x16.c'`; then
    echo shar: \"'16x16.c'\" unpacked with wrong size!
fi
# end of '16x16.c'
fi
if test -f 'Makefile' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'Makefile'\"
else
echo shar: Extracting \"'Makefile'\" \(1430 characters\)
sed "s/^X//" >'Makefile' <<'END_OF_FILE'
X# Makefile for wanderer
X
XCURSESO = m.o save.o jump.o display.o icon.o game.o read.o help.o fall.o \
X	scores.o edit.o
XEGAO = 159x174.o 16x16.o 48x48.o iAPX286.o
X
X# For the EGA version, use the following
XEGA = -DEGA
XOBJ = $(CURSESO) $(EGAO)
XMODEL = -Ml
XSTACK =
X
X# If you just want the curses version, then use
X#EGA =
X#OBJ = $(CURSESO)
X#MODEL =
X#STACK = -k 0x4000
X
X# You're on your own here...
XG = #-g
XO = -O
XS = -s
XCFLAGS = $(MODEL) $G $O $(EGA)
XLDFLAGS = $(MODEL) $G $S $(STACK)
XLIBS = -lcurses
X
XDEST = /usr/games
XSCORE = $(DEST)/lib/.wanderer
XSCREENS = $(DEST)/lib/wanderer
X
Xwanderer: $(OBJ)
X	$(CC) $(LDFLAGS) -o wanderer $(OBJ) $(LIBS)
X
Xinstall: wanderer
X	cpset wanderer $(DEST) 2755		# sgid
X	touch $(SCORE)				# score file
X	chmod 660 $(SCORE)
X	cp screens/screen.[1-9]* $(SCREENS)	# screens
X
Xclean:
X	rm -f *.o core tags
Xclobber: clean
X	rm -f wanderer
X
Xdepend:
X	mkdepend -mMakefile *.c
X
X# DO NOT DELETE THIS LINE - make depend DEPENDS ON IT
X# Dependencies generated at: Mon Jan 2 12:08:35 CST 1989
X
Xm.o:	bitmap.h  wand_head.h  
Xsave.o:	wand_head.h  
Xjump.o:	wand_head.h  
Xdisplay.o:	bitmap.h  wand_head.h  
Xicon.o:	bitmap.h  wand_head.h  
Xgame.o:	bitmap.h  wand_head.h  
Xread.o:	wand_head.h  
Xhelp.o:	wand_head.h  
Xfall.o:	bitmap.h  wand_head.h  
Xscores.o:	wand_head.h  
Xedit.o:	bitmap.h  wand_head.h  
X159x174.o:	bitmap.h  
X16x16.o:	bitmap.h  
X48x48.o:	bitmap.h  
XiAPX286.o:	bitmap.h  
X
X# DO NOT ADD ANYTHING HERE - WILL GO AWAY
END_OF_FILE
if test 1430 -ne `wc -c <'Makefile'`; then
    echo shar: \"'Makefile'\" unpacked with wrong size!
fi
# end of 'Makefile'
fi
if test -f 'display.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'display.c'\"
else
echo shar: Extracting \"'display.c'\" \(5616 characters\)
sed "s/^X//" >'display.c' <<'END_OF_FILE'
X#include "wand_head.h"
X
X#ifdef	EGA
X#include "bitmap.h"
X
Xextern	bitmap	*b48x48[];
Xextern	bitmap	*b16x16[];
Xextern	char	*EGAaddr;
Xint		EGAmode;
X
Xvoid	egamap();
X#endif
X
Xextern	int	debug_disp;
Xextern	char	(*screen)[ROWLEN+1+1];
X
X
X/*
X * Draw the complete map
X */
Xvoid map()
X{
Xint  x,y;
Xchar ch;
Xchar (*row_ptr)[ROWLEN+1+1] = screen;
X
X#ifdef	EGA
Xif(EGAaddr) {
X    egamap();
X    return;
X    }
X#endif
X
Xmvaddch(0,0,'+');
Xfor(x = 0;x < ROWLEN; x++)
X    addch('-');
Xaddch('+');
Xfor(y = 0;y < NOOFROWS; y++)
X    {
X    mvaddch(y+1,0,'|');
X    for(x = 0; x < ROWLEN; x++)
X	{
X	ch = (*row_ptr)[x];
X	if(!debug_disp)
X	    {
X	    if((ch == 'M')||(ch == 'S'))
X		ch = ' ';
X	    addch(ch);
X	    }
X	else
X            if(ch==' '||ch=='#'||ch=='<'||ch=='>'||ch=='O'||ch==':'||
X	       ch=='/'||ch=='\\'||ch=='*'||ch=='='||ch=='@'||ch=='T'||
X	       ch=='X'||ch=='!'||ch=='M'||ch=='S'||ch=='C'||ch=='+'||
X               ch=='A'||ch=='^')
X		addch(ch);
X	    else
X		addch('"');
X	}
X    addch('|');
X    row_ptr++;
X    }
Xmvaddch(y+1,0,'+');
Xfor(x = 0;x < ROWLEN; x++)
X    addch('-');
Xaddch('+');
Xif(!debug_disp)
X    {
X    mvaddstr(18,0,"Press any key to return to the game.");
X    refresh();
X    (void) getch();
X    mvaddstr(18,0,"                                    ");
X    refresh();
X    for(y=0;y<=(NOOFROWS+1);y++)
X        {
X        move(y,0);
X        for(x=0;x<=(ROWLEN+2);x++)
X	    addch(' ');
X	}
X    }
Xelse
X    refresh();
X}
X
X#ifdef	EGA
Xstatic void egamap()
X{
Xint  x,y;
Xbitmap *map;
Xchar ch;
Xchar (*row_ptr)[ROWLEN+1+1] = screen;
X
XClear();
XEGAmode = 16;
X
Xfor(y = 0;y < NOOFROWS; y++)
X    {
X    for(x = 0; x < ROWLEN; x++)
X	{
X	map = b16x16[ symbol( ch = (*row_ptr)[x] ) ];
X
X	if(!debug_disp)
X	    {
X	    if((ch == 'M')||(ch == 'S'))
X		map = b16x16[ SPACE ];
X	    }
X	egapaint( x * map->width, y * map->height, map );
X	}
X    row_ptr++;
X    }
X
Xegaline( 0, NOOFROWS * map->height, ROWLEN * map->width - 1, NOOFROWS * map->height );
X
Xif(!debug_disp)
X    {
X    egaputs(4,341,"Press any key to return to the game.");
X    (void) Getch();
X    egaclear(4,341,639,349);
X    }
X}
X#endif
X
X
X/*
X * Draw the map centered on (cx,cy)
X */
Xvoid display(cx,cy)
Xint  cx,cy;
X{
X    int  x,y = 0,x_coord,y_coord;
X    char (*row_ptr)[ROWLEN+1+1] = screen;
X
X    while(y<(cy-3))
X    {
X        y++;
X        row_ptr++;
X    }
X
X#ifdef	EGA
X    if(EGAaddr) {
X	egabox( 0, 0, 4+11*48+3, 4+7*48+3 );
X	egabox( 1, 1, 4+11*48+2, 4+7*48+2 );
X	}
X    else
X#endif
X	{
X	mvaddstr(0,0,"+---------------------------------+");
X	mvaddstr(15,0,"+---------------------------------+");
X	}
X
X    for(y=(cy-3);y<=(cy+3);y++) {
X        y_coord = (y+3-cy)*2;
X
X        if ((y<0) || (y>=NOOFROWS)) {
X#ifdef	EGA
X	    if(EGAaddr) {
X		for( x = 0; x <= 10; ++x )
X		    draw_symbol( x * 3, y_coord, '#' );
X		}
X	    else
X#endif
X		{
X		mvaddstr(y_coord+1,0,"|#################################|");
X		mvaddstr(y_coord+2,0,"|#################################|");
X		}
X        }
X        else {
X#ifdef	EGA
X	    if(!EGAaddr)
X#endif
X		{
X		mvaddch(y_coord+1,0,'|');
X		mvaddch(y_coord+1,34,'|');
X		mvaddch(y_coord+2,0,'|');
X		mvaddch(y_coord+2,34,'|');
X		}
X
X            for(x=(cx-5);x<=(cx+5);x++)
X            {
X                x_coord = (x+5-cx)*3;
X                if ((x<0) || (x>ROWLEN-1))
X		    draw_symbol(x_coord,y_coord,'#');
X                else
X		    draw_symbol(x_coord,y_coord,(*row_ptr)[x]);
X            }
X	    row_ptr++;
X        }                   /*   end if   */
X    }                       /* end y loop */
X
X#ifdef	EGA
X    if(!EGAaddr)
X#endif
X	{
X	move(16,0);
X	refresh();
X	}
X}
X
Xvoid redraw_screen(maxmoves,num,score,nf,diamonds,mx,sx,sy)
Xint *maxmoves,num,nf,diamonds,mx,sx,sy;
Xlong score;
X{
X#ifdef	EGA
Xif(EGAaddr) {
X    EGAmode = 0;
X
X    if(!debug_disp) {
X
X	Clear();
X
X	egaprintf( 540, 4, "Score %ld", score );
X
X	egaputs( 540,24, "Diamonds" );
X	egaprintf( 540,34, "   found %3d", nf );
X	egaprintf( 540,44, "   total %3d", diamonds );
X
X	egaprintf( 540,64, "Screen %d", num );
X
X	if(*maxmoves > 0)
X	    egaprintf( 540,84, "Moves %6d", *maxmoves );
X	else
X	    *maxmoves = -1;
X
X	if(mx != -1)                        /* tell player if monster exists */
X	    egapaint( 566,130, b48x48[MONSTER] );
X
X	display(sx,sy);
X	}
X    else
X	{
X	map();
X
X	egaputs( 4,274, "Score" );
X	egaprintf( 4,284, "%ld", score );
X
X	egaprintf( 4+10*8,270, "  Diamonds           Current screen %d", num );
X	egaputs( 4+10*8,279, "found   total" );
X	egaprintf( 4+10*8,288, " %3d     %3d", nf, diamonds );
X
X	if(*maxmoves > 0)
X	    egaprintf( 4+28*8,288, "Remaining moves %6d", *maxmoves );
X	else
X	    *maxmoves = -1;
X
X	if(mx != -1)                        /* tell player if monster exists */
X	    egapaint( 480,289, b48x48[MONSTER] );
X	}
X    }
Xelse
X#endif
X    {
X    clear();
X    mvaddstr(0,48,"Score\t   Diamonds");
X    mvaddstr(1,48,"\tFound\tTotal");
X    mvprintw(3,48,"%ld\t %d\t %d  ",score,nf,diamonds);
X    mvprintw(6,48,"Current screen %d",num);
X    if(*maxmoves > 0)
X	mvprintw(15,48,"Moves remaining = %d   ",*maxmoves);
X    else {
X	mvaddstr(15,48,"     Unlimited moves     ");
X	*maxmoves = -1;
X    }
X    if(mx != -1)                            /* tell player if monster exists */
X	draw_symbol(48,10,'M');
X    else
X	draw_symbol(48,10,' ');
X    if(!debug_disp)
X	display(sx,sy);
X    else
X	map();
X    }
X}
X
X
X/*
X * Update score
X */
Xvoid
Xupdate_score(score,nf,diamonds)
Xlong score;
X{
X#ifdef	EGA
Xif(EGAaddr) {
X    if(debug_disp) {
X	egaprintf( 4,284, "%-6ld", score );
X	egaprintf( 4+10*8,288, " %3d     %3d", nf, diamonds );
X	}
X    else {
X	egaprintf( 540, 4, "Score %-6ld", score );
X	egaprintf( 540,34, "   found %3d", nf );
X	egaprintf( 540,44, "   total %3d", diamonds );
X	}
X    }
Xelse
X#endif
X    mvprintw(3,48,"%ld\t %d\t %d ",score,nf,diamonds);
X}
END_OF_FILE
if test 5616 -ne `wc -c <'display.c'`; then
    echo shar: \"'display.c'\" unpacked with wrong size!
fi
# end of 'display.c'
fi
if test -f 'fall.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'fall.c'\"
else
echo shar: Extracting \"'fall.c'\" \(7429 characters\)
sed "s/^X//" >'fall.c' <<'END_OF_FILE'
X#include "wand_head.h"
X#ifdef	EGA
X#include "bitmap.h"
X
Xextern	bitmap	*b16x16[];
Xextern	char	*EGAaddr;
X#endif
Xextern int debug_disp;
Xextern char (*screen)[ROWLEN+1+1];
Xextern void draw_symbol();
X
Xint check(mx,my,x,y,dx,dy,sx,sy,howdead)
X/* check for any falling caused by something moving out of x,y along
X   vector dx,dy. All the others are constant and should really have
X   been global... 						    */
Xint x,y,sx,sy,dx,dy, *mx, *my;
Xchar howdead[25];
X{
Xint ret=0;
Xret+=fall(mx,my,x,y,sx,sy,howdead);
Xret+=fall(mx,my,x-dx,y-dy,sx,sy,howdead);
Xret+=fall(mx,my,x-dy,y-dx,sx,sy,howdead);
Xret+=fall(mx,my,x+dy,y+dx,sx,sy,howdead);
Xret+=fall(mx,my,x-dx-dy,y-dy-dx,sx,sy,howdead);
Xret+=fall(mx,my,x-dx+dy,y-dy+dx,sx,sy,howdead);
Xreturn ret;
X}
X
Xint fall(mx,my,x,y,sx,sy,howdead)  /* recursive function for falling */
X				   /* boulders and arrows */
Xint  x,y,sx,sy, *mx, *my;
Xchar howdead[25];
X{
Xint nx = x,nxu = x,nyl = y,nyr = y,retval = 0;
Xif ((y>(NOOFROWS-1))||(y<0)||(x<0)||(x>(ROWLEN-1)))
X    return(0);
Xif((screen[y][x] != 'O') && (screen[y][x] != ' ') && (screen[y][x] != 'M') &&
X   (screen[y][x] !='\\') && (screen[y][x] != '/') && (screen[y][x] != '@') &&
X   (screen[y][x] != '^'))
X    return(0);
Xif(screen[y][x] == 'O') {
X    if((screen[y][x-1] == ' ') && (screen[y-1][x-1] == ' '))
X        nx--;
X    else {
X        if((screen[y][x+1] == ' ') && (screen[y-1][x+1] == ' '))
X            nx++;
X	else
X	    nx = -1;
X	}
X    if((screen[y][x-1] == ' ') && (screen[y+1][x-1] == ' '))
X        nxu--;
X    else {
X        if((screen[y][x+1] == ' ') && (screen[y+1][x+1] == ' '))
X            nxu++;
X	else
X	    nxu = -1;
X	}
X    if((screen[y-1][x] == ' ') && (screen[y-1][x+1] == ' '))
X        nyr--;
X    else {
X        if((screen[y+1][x] == ' ') && (screen[y+1][x+1] == ' '))
X            nyr++;
X	else
X	    nyr = -1;
X	}
X    if((screen[y-1][x] == ' ') && (screen[y-1][x-1] == ' '))
X        nyl--;
X    else {
X        if((screen[y+1][x] == ' ') && (screen[y+1][x-1] == ' '))
X            nyl++;
X	else
X	    nyl = -1;
X	}
X    }
Xif(screen[y][x] == '\\') {
X    if(screen[y-1][++nx] != ' ')
X	nx = -1;
X    if(screen[y+1][--nxu] != ' ')
X        nxu = -1;
X    if(screen[--nyr][x+1] != ' ')
X        nyr = -1;
X    if(screen[++nyl][x-1] != ' ')
X        nyl = -1;
X    }
Xif(screen[y][x] == '/') {
X    if(screen[y-1][--nx] != ' ')
X	nx = -1;
X    if(screen[y+1][++nxu] != ' ')
X        nxu = -1;
X    if(screen[++nyr][x+1] != ' ')
X	nyr = -1;
X    if(screen[--nyl][x-1] != ' ')
X	nyl = -1;
X    }
Xif((screen[y][nx] != ' ') && (screen[y][nx] != 'M'))
X    nx = -1;
Xif((screen[y-1][x] == 'O') && (nx >= 0) && (y > 0) &&
X   (screen[y][nx] != '^')) /* boulder falls ? */
X    {
X    screen[y-1][x] = ' ';
X    if(screen[y][nx] == '@') {
X    	strcpy(howdead,"a falling boulder");
X    	retval=1;
X    	}
X    if(screen[y][nx] == 'M') {
X    	*mx = *my = -2;
X	screen[y][nx] = ' ';
X    	}
X    screen[y][nx] = 'O';
X    if(!debug_disp) {
X        if((y<(sy+5)) && (y>(sy-3)) && (x>(sx-6)) && (x<(sx+6)))
X            draw_symbol((x-sx+5)*3,(y-sy+2)*2,' ');
X        if((y<(sy+4)) && (y>(sy-4)) && (nx>(sx-6)) && (nx<(sx+6)))
X            draw_symbol((nx-sx+5)*3,(y-sy+3)*2,'O');
X	}
X    else {
X#ifdef	EGA
X	if(EGAaddr) {
X	    bitmap *map;
X	    map = b16x16[SPACE];
X	    egapaint( x * map->width, (y-1) * map->height, map );
X	    map = b16x16[ROCK];
X	    egapaint( nx * map->width, y * map->height, map );
X	    }
X	else
X#endif
X	    {
X	    move(y,x+1);
X	    addch(' ');;
X	    move(y+1,nx+1);
X	    addch('O');
X	    }
X	}
X    refresh();
X    retval+=fall(mx,my,nx ,y+1,sx,sy,howdead);
X    retval+=check(mx,my,x,y-1,0,1,sx,sy,howdead);
X    if(screen[y+1][nx] == '@') {
X    	strcpy(howdead,"a falling boulder");
X    	return(1);
X    	}
X    if(screen[y+1][nx] == 'M')
X        {
X    	*mx = *my = -2;
X	screen[y+1][nx] = ' ';
X    	}
X    }
Xif((screen[nyr][x] != '^')&&(screen[nyr][x] != ' ')&&(screen[nyr][x] != 'M'))
X    nyr = -1;
Xif((screen[y][x+1] == '<')&&(nyr>=0)&&(x+1<ROWLEN)) /* arrow moves ( < ) ? */
X    {
X    screen[y][x+1] = ' ';
X    if(screen[nyr][x] == '@')
X        {
X    	strcpy(howdead,"a speeding arrow");
X    	retval = 1;
X    	}
X    if(screen[nyr][x] == 'M')
X        {
X    	*mx = *my = -2;
X	screen[nyr][x] = ' ';
X    	}
X    screen[nyr][x] = '<';
X    if(!debug_disp)
X	{
X        if((y<(sy+4)) && (y>(sy-4)) && (x<(sx+5)) && (x>(sx-7)))
X            draw_symbol((x-sx+6)*3,(y-sy+3)*2,' ');
X        if((nyr<(sy+4)) && (nyr>(sy-4)) && (x<(sx+6)) && (x>(sx-6)))
X            draw_symbol((x-sx+5)*3,(nyr-sy+3)*2,'<');
X	}
X    else
X	{
X#ifdef	EGA
X	if(EGAaddr) {
X	    bitmap *map;
X	    map = b16x16[SPACE];
X	    egapaint( (x+1) * map->width, y * map->height, map );
X	    map = b16x16[LARROW];
X	    egapaint( x * map->width, nyr * map->height, map );
X	    }
X	else
X#endif
X	    {
X	    move(y+1,x+2);
X	    addch(' ');
X	    move(nyr+1,x+1);
X	    addch('<');
X	    }
X	}
X    refresh();
X    retval+=fall(mx,my,x-1,nyr,sx,sy,howdead);
X    retval+=check(mx,my,x+1,y,-1,0,sx,sy,howdead);
X    if(screen[nyr][x-1] == '@')
X        {
X    	strcpy(howdead,"a speeding arrow");
X    	return(1);
X    	}
X    if(screen[nyr][x-1] == 'M')
X        {
X    	*mx = *my = -2;
X	screen[nyr][x-1] = ' ';
X    	}
X    }
Xif((screen[nyl][x] != ' ')&&(screen[nyl][x] != '^')&&(screen[nyl][x] != 'M'))
X    nyl = -1;
Xif((screen[y][x-1] == '>')&&(nyl>=0)&&(x>0))       /* arrow moves ( > ) ? */
X    {
X    screen[y][x-1] = ' ';
X    if(screen[nyl][x] == '@')
X        {
X    	strcpy(howdead,"a speeding arrow");
X    	retval = 1;
X    	}
X    if(screen[nyl][x] == 'M')
X        {
X    	*mx = *my = -2;
X	screen[nyl][x] = ' ';
X    	}
X    screen[nyl][x] = '>';
X    if(!debug_disp)
X	{
X        if((y<(sy+4)) && (y>(sy-4)) && (x<(sx+7)) && (x>(sx-5)))
X            draw_symbol((x-sx+4)*3,(y-sy+3)*2,' ');
X        if((nyl<(sy+4)) && (nyl>(sy-4)) && (x<(sx+6)) && (x>(sx-6)))
X            draw_symbol((x-sx+5)*3,(nyl-sy+3)*2,'>');
X	}
X    else
X	{
X#ifdef	EGA
X	if(EGAaddr) {
X	    bitmap *map;
X	    map = b16x16[SPACE];
X	    egapaint( (x-1) * map->width, y * map->height, map );
X	    map = b16x16[RARROW];
X	    egapaint( x * map->width, nyl * map->height, map );
X	    }
X	else
X#endif
X	    {
X	    move(y+1,x);
X	    addch(' ');
X	    move(nyl+1,x+1);
X	    addch('>');
X	    }
X	}
X    refresh();
X    retval+=fall(mx,my,x+1,nyl,sx,sy,howdead);
X    retval+=check(mx,my,x-1,y,1,0,sx,sy,howdead);
X    if(screen[nyl][x+1] == '@')
X        {
X    	strcpy(howdead,"a speeding arrow");
X    	return(1);
X    	}
X    if(screen[nyl][x+1] == 'M')
X        {
X    	*mx = *my = -2;
X	screen[nyl][x+1] = ' ';
X    	}
X    }
Xif(screen[y][nxu] != ' ')
X    nxu = -1;
Xif((screen[y+1][x] == '^') && (nxu >= 0) && (y < NOOFROWS) &&
X   (screen[y][x] != '^')) /* balloon rises? */
X    {
X    screen[y+1][x] = ' ';
X    screen[y][nxu] = '^';
X    if(!debug_disp)
X	{
X        if((y<(sy+3)) && (y>(sy-5)) && (x>(sx-6)) && (x<(sx+6)))
X            draw_symbol((x-sx+5)*3,(y-sy+4)*2,' ');
X        if((y<(sy+4)) && (y>(sy-4)) && (nxu>(sx-6)) && (nxu<(sx+6)))
X            draw_symbol((nxu-sx+5)*3,(y-sy+3)*2,'^');
X	}
X    else
X	{
X#ifdef	EGA
X	if(EGAaddr) {
X	    bitmap *map;
X	    map = b16x16[SPACE];
X	    egapaint( x * map->width, (y+1) * map->height, map );
X	    map = b16x16[BALLOON];
X	    egapaint( nxu * map->width, y * map->height, map );
X	    }
X	else
X#endif
X	    {
X	    move(y+2,x+1);
X	    addch(' ');
X	    move(y+1,nxu+1);
X	    addch('^');
X	    }
X	}
X    refresh();
X    retval+=fall(mx,my,nxu ,y-1,sx,sy,howdead);
X    retval+=check(mx,my,x,y+1,0,-1,sx,sy,howdead);
X    }
Xif(retval>0)
X    return(1);
Xreturn(0);
X}
END_OF_FILE
if test 7429 -ne `wc -c <'fall.c'`; then
    echo shar: \"'fall.c'\" unpacked with wrong size!
fi
# end of 'fall.c'
fi
if test -f 'icons/48x48/backslide_bm' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'icons/48x48/backslide_bm'\"
else
echo shar: Extracting \"'icons/48x48/backslide_bm'\" \(1899 characters\)
sed "s/^X//" >'icons/48x48/backslide_bm' <<'END_OF_FILE'
X#define backslide_bm_width 48
X#define backslide_bm_height 48
Xstatic char backslide_bm_bits[] = {
X  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
X  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 
X  0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 
X  0xf0, 0x01, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x00, 0x00, 0x00, 
X  0xc0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x00, 0x00, 
X  0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 
X  0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 
X  0x00, 0xf0, 0x01, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x00, 0x00, 
X  0x00, 0xc0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x00, 
X  0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 
X  0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 
X  0x00, 0x00, 0xf0, 0x01, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x00, 
X  0x00, 0x00, 0xc0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0f, 0x00, 0x00, 
X  0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 
X  0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 
X  0x00, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x03, 0x00, 
X  0x00, 0x00, 0x00, 0xc0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0f, 0x00, 
X  0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 
X  0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 
X  0x00, 0x00, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x03, 
X  0x00, 0x00, 0x00, 0x00, 0xc0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0f, 
X  0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 
X  0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
X  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, };
END_OF_FILE
if test 1899 -ne `wc -c <'icons/48x48/backslide_bm'`; then
    echo shar: \"'icons/48x48/backslide_bm'\" unpacked with wrong size!
fi
# end of 'icons/48x48/backslide_bm'
fi
if test -f 'icons/48x48/landmine_bm' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'icons/48x48/landmine_bm'\"
else
echo shar: Extracting \"'icons/48x48/landmine_bm'\" \(1896 characters\)
sed "s/^X//" >'icons/48x48/landmine_bm' <<'END_OF_FILE'
X#define landmine_bm_width 48
X#define landmine_bm_height 48
Xstatic char landmine_bm_bits[] = {
X  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
X  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
X  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 
X  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x00, 0x00, 
X  0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 
X  0x20, 0x14, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x01, 0x00, 0x00, 0x00, 0x00, 
X  0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 
X  0xc8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 
X  0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x60, 0x00, 0x00, 0x00, 0x00, 
X  0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x01, 0x00, 0x00, 0x00, 
X  0x00, 0x09, 0x01, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x01, 0x00, 0x00, 0x00, 
X  0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 
X  0x00, 0x10, 0x00, 0xe0, 0x0f, 0x00, 0x00, 0xe0, 0x01, 0xfc, 0x7f, 0x00, 
X  0x00, 0x00, 0xf2, 0x1e, 0xf0, 0x00, 0x00, 0x00, 0x9c, 0x07, 0xc0, 0x03, 
X  0x00, 0x00, 0x8c, 0x00, 0x00, 0x06, 0x00, 0x00, 0xc6, 0x00, 0x00, 0x1c, 
X  0x00, 0x00, 0x66, 0x00, 0x00, 0x38, 0x00, 0x00, 0x3c, 0xb6, 0x6d, 0x33, 
X  0x00, 0x00, 0xb8, 0x14, 0x45, 0x31, 0x00, 0x00, 0x30, 0x08, 0x82, 0x30, 
X  0x00, 0x00, 0xb0, 0x14, 0x45, 0x31, 0x00, 0x00, 0x30, 0xb6, 0x6d, 0x33, 
X  0x00, 0x00, 0xb0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x60, 0x01, 0x00, 0x30, 
X  0x00, 0x00, 0xe0, 0x01, 0x00, 0x18, 0x00, 0x00, 0x80, 0x06, 0x00, 0x0e, 
X  0x00, 0x00, 0x80, 0xb9, 0x1d, 0x07, 0x00, 0x00, 0x00, 0xf7, 0xf3, 0x03, 
X  0x00, 0x00, 0x00, 0x1e, 0xf8, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x0f, 0x00, 
X  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
X  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, };
END_OF_FILE
if test 1896 -ne `wc -c <'icons/48x48/landmine_bm'`; then
    echo shar: \"'icons/48x48/landmine_bm'\" unpacked with wrong size!
fi
# end of 'icons/48x48/landmine_bm'
fi
if test -f 'icons/48x48/teleport_bm' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'icons/48x48/teleport_bm'\"
else
echo shar: Extracting \"'icons/48x48/teleport_bm'\" \(1896 characters\)
sed "s/^X//" >'icons/48x48/teleport_bm' <<'END_OF_FILE'
X#define teleport_bm_width 48
X#define teleport_bm_height 48
Xstatic char teleport_bm_bits[] = {
X  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
X  0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 
X  0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0x3f, 0x00, 
X  0x00, 0x54, 0x55, 0x55, 0x55, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0x03, 
X  0x80, 0x55, 0x55, 0x55, 0x55, 0x03, 0x80, 0xff, 0xff, 0xff, 0xff, 0x03, 
X  0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x06, 0x00, 0x00, 0xc0, 0x00, 
X  0x00, 0x72, 0x77, 0xdd, 0x9d, 0x00, 0x00, 0x76, 0x77, 0xdc, 0xdd, 0x00, 
X  0x00, 0x02, 0x00, 0x01, 0x80, 0x00, 0x00, 0x76, 0x77, 0xdc, 0xdd, 0x00, 
X  0x00, 0x72, 0x77, 0xdd, 0x9d, 0x00, 0x00, 0x06, 0x00, 0x00, 0xc0, 0x00, 
X  0x00, 0xaa, 0xaa, 0xab, 0xaa, 0x00, 0x00, 0x56, 0x55, 0x55, 0xd5, 0x00, 
X  0x00, 0xaa, 0xaa, 0x0b, 0xa0, 0x00, 0x00, 0x16, 0x50, 0xa5, 0xd2, 0x00, 
X  0x00, 0x2a, 0xa0, 0x4b, 0xa5, 0x00, 0x00, 0x16, 0x50, 0xa5, 0xd2, 0x00, 
X  0x00, 0x2a, 0xa0, 0x4b, 0xa5, 0x00, 0x00, 0x16, 0x50, 0xa5, 0xd2, 0x00, 
X  0x00, 0x2a, 0xa0, 0x4b, 0xa5, 0x00, 0x00, 0x56, 0x55, 0x05, 0xd0, 0x00, 
X  0x00, 0xaa, 0xaa, 0xab, 0xaa, 0x00, 0x00, 0x56, 0x55, 0x55, 0xd5, 0x00, 
X  0x00, 0x0a, 0xa0, 0x0b, 0xa0, 0x00, 0x00, 0x46, 0x45, 0xa5, 0xd2, 0x00, 
X  0x00, 0xaa, 0xaa, 0x4b, 0xa5, 0x00, 0x00, 0x46, 0x45, 0xa5, 0xd2, 0x00, 
X  0x00, 0x0a, 0xa0, 0x0b, 0xa0, 0x00, 0x00, 0x56, 0x55, 0x55, 0xd5, 0x00, 
X  0x00, 0xaa, 0xaa, 0xab, 0xaa, 0x00, 0x00, 0x06, 0x40, 0x05, 0xd0, 0x00, 
X  0x00, 0xaa, 0xaa, 0x4b, 0xa5, 0x00, 0x00, 0x46, 0x45, 0xa5, 0xd2, 0x00, 
X  0x00, 0xaa, 0xaa, 0x4b, 0xa5, 0x00, 0x00, 0x06, 0x40, 0x05, 0xd0, 0x00, 
X  0x00, 0xaa, 0xaa, 0xab, 0xaa, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0x03, 
X  0x80, 0xaa, 0xaa, 0xaa, 0xaa, 0x02, 0x80, 0xff, 0xff, 0xff, 0xff, 0x03, 
X  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, };
END_OF_FILE
if test 1896 -ne `wc -c <'icons/48x48/teleport_bm'`; then
    echo shar: \"'icons/48x48/teleport_bm'\" unpacked with wrong size!
fi
# end of 'icons/48x48/teleport_bm'
fi
if test -f 'icons/bmtoBM.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'icons/bmtoBM.c'\"
else
echo shar: Extracting \"'icons/bmtoBM.c'\" \(2231 characters\)
sed "s/^X//" >'icons/bmtoBM.c' <<'END_OF_FILE'
X/*
X * bmtoBM file...
X *
X * Converts X windows (I think) bitmaps to the bitmap format used by
X * the EGA version of the wanderer game.
X */
X#include <stdio.h>
X#include <sys/types.h>
X#include <sys/stat.h>
X
X#define	MAXBITS	200
X
Xtypedef	unsigned char	uchar;
X
Xtypedef	struct	{
X		int	width, height;
X		uchar	bits[MAXBITS*MAXBITS/8];
X		}	bitmap;
X
Xextern bitmap readmap();
X
Xvoid
Xusage( name )
Xchar *name;
X	{
X	fprintf( stderr, "Usage:\t%s files...\n", name );
X	exit( 1 );
X	}
X
Xmain( argc, argv )
Xchar **argv;
X	{
X	bitmap map;
X
X	if ( argc <= 1 )
X		usage( argv[0] );
X
X	while( ++argv, --argc > 0 )
X		writemap( *argv, &readmap(*argv) );
X	}
X
X
X bitmap
Xreadmap( file )
Xchar *file;
X	{
X	FILE *fp;
X	int i, j, width, height;
X	bitmap map;
X
X	fp = fopen( file, "r" );
X
X	fscanf( fp, "#define %*s %d\n", &width );
X	fscanf( fp, "#define %*s %d\n", &height );
X
X	for( i = 0; i < height; ++i )
X		for( j = 0; j < (width+7)/8; ++j )
X			map.bits[i*((width+7)/8)+j] = byte( fp );
X	fclose( fp );
X
X	map.width = width;
X	map.height = height;
X
X	return( map );
X	}
X
X int
Xbyte( fp )
XFILE *fp;
X	{
X	unsigned b, x, y;
X
X	for( ; ; )
X		if ( getc(fp) == '0' && getc(fp) == 'x' )
X			{
X			fscanf( fp, "%x", &x );
X
X			for( b = 0x80, y = 0; b != 0; b >>= 1, y >>= 1 )
X				if ( x & b )
X					y |= 0x100;
X
X			return( y );
X			}
X	}
X
X
Xwritemap( file, map )
Xchar *file;
Xbitmap *map;
X	{
X	FILE *fp;
X	int width, height, i, j, c;
X	char buffer[100];
X	struct stat o, n;
X
X	strcpy( buffer, file );
X
X	/* change 'bm' to 'BM' if possible */
X	if ( strcmp("bm",buffer+strlen(buffer)-2) == 0 )
X		strcpy( buffer+strlen(buffer)-2, "BM" );
X	else
X		sprintf( buffer, "%s.BM", file );
X
X	if ( stat(file,&o) != -1 && stat(buffer,&n) != -1 )
X		if ( o.st_ino == n.st_ino )
X			{
X			fprintf( stderr, "Output file \"%s\" would overwrite input file \"%s\"\nFile \"%s\" not converted\n",
X					buffer, file, file );
X			return;
X			}
X
X	fp = fopen( buffer, "w" );
X
X	fprintf( fp, "BM(%d,%d) %s ={ %d, %d,", map->height, map->width, file, map->height, map->width );
X
X	for( c = i = 0; i < map->height; ++i )
X		for( j = 0; j < (map->width+7)/8; ++j )
X			{
X			if ( (c++ % 12) == 0 )
X				fprintf( fp, "\n  " );
X
X			fprintf( fp, "0x%02x, ", map->bits[i*((map->width+7)/8)+j] & 0xff );
X			}
X
X	fprintf( fp, "};\n" );
X
X	fclose( fp );
X	}
END_OF_FILE
if test 2231 -ne `wc -c <'icons/bmtoBM.c'`; then
    echo shar: \"'icons/bmtoBM.c'\" unpacked with wrong size!
fi
# end of 'icons/bmtoBM.c'
fi
if test -f 'jump.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'jump.c'\"
else
echo shar: Extracting \"'jump.c'\" \(7485 characters\)
sed "s/^X//" >'jump.c' <<'END_OF_FILE'
X#include "wand_head.h"
X#include <sys/types.h>
X#include <sys/stat.h>
X
Xextern int debug_disp;
Xextern int no_passwords;
Xextern int maxscreens;
X#ifdef	EGA
Xextern char *EGAaddr;
X#endif
X
Xint scrn_passwd(num, passwd)    /* reads password num into passwd */
Xint num;
Xchar *passwd;
X{
X	long position;
X	struct stat statbuf;
X	FILE *fp;
X
X	if (stat(DICTIONARY,&statbuf) == -1)
X		return 0;
X	position = PASSWD;
X	position %= statbuf.st_size;
X	if((fp = fopen(DICTIONARY,"r")) == NULL)
X		return 0;
X	fseek(fp,position,0);
X	while(fgetc(fp) != '\n')
X		continue;
X	/* read a word into passwd */
X	fscanf(fp,"%s\n",passwd);
X	passwd[12] = '\0';
X	fclose(fp);
X	return (1);
X}
X
Xvoid showpass(num)
Xint num;
X{
Xchar correct[20];
Xchar buffer[100];
Xint Y = debug_disp? 20 : 18;
X
Xif(no_passwords)
X    return;
Xmove(Y,0);
Xif(!scrn_passwd(num,correct))
X    return;
X(void) sprintf(buffer,"The password to jump to level %d ( using ~ ) is : %s        ",(num+1),correct);
X#ifdef	EGA
Xif(EGAaddr) {
X    if(debug_disp) {
X	egaputs(4,341,buffer);
X	egaputs(4+79*8-11*8,341,"Hit any key");
X	}
X    else {
X	egaprintf(540,200,"Level %d",num+1);
X	egaputs(540,210,"password is");
X	egaputs(540,220,correct);
X
X	egaputs(540,341,"Hit any key");
X	}
X    (void) Getch();
X    }
Xelse
X#endif
X    {
X    addstr(buffer);
X    addch('\n');
X    addstr("Press any key to erase it and continue                          \n");
X    refresh();
X    (void) getch();
X    move(Y,0);
X    addstr("                                                                        \n");
X    addstr("                                              ");
X    move(Y,0);
X    refresh();
X    }
X}
X
Xint jumpscreen(num)
Xint num;
X{
Xchar word[20],
X     buffer[100],
X     correct[20];
Xint index;
Xint Y = debug_disp? 18 : 16;
Xchar ch;
Xint  scrn;
X
Xif(no_passwords == 1) {
X    /*
X     * No passwords are required.  Just get the level number and return.
X     */
X    if(num == maxscreens) {
X#ifdef	EGA
X	if(EGAaddr) {
X	    if(debug_disp) {
X		egaputs(4,          341,"This is the last screen!");
X		egaputs(4+79*8-11*8,341,"Hit any key");
X		}
X	    else {
X		egaputs(540,200,"Last screen!");
X
X		egaputs(540,341,"Hit any key");
X		}
X	    (void) Getch();
X	    if(debug_disp)
X		egaclear(4,341, 639,349);
X	    else
X		egaclear(540,200, 639,349);
X	    }
X	else
X#endif
X	    {
X	    move(Y,0);
X	    addstr("This is the last screen!");
X	    refresh();
X	    }
X	return num;
X	}
X
X#ifdef	EGA
X    if(EGAaddr) {
X	if(debug_disp) {
X	    egaputs(4,     341,"Enter the number of the desired level: ");
X	    egagets(4+39*8,341,buffer);
X	    }
X	else {
X	    egaputs(540,    200,"What level?");
X	    egagets(540+2*8,210,buffer);
X	    }
X	sscanf(buffer,"%d",&scrn);
X	}
X    else
X#endif
X	{
X	move(Y,0);
X	addstr("Enter number of desired level.\n");
X	refresh();
X	echo();
X	scanw("%d",&scrn);
X	noecho();
X	}
X    if(scrn > num && scrn <= maxscreens) {
X	move(Y,0);
X#ifdef	EGA
X	if(!EGAaddr)
X#endif
X	    addstr("                                                ");
X	return scrn;
X	}
X
X#ifdef	EGA
X    if(EGAaddr) {
X	if(scrn <= num)
X	    if(debug_disp) {
X		egaputs(4,          341,"No way, Jose!  Back-jumping is prohibited!");
X		egaputs(4+79*8-11*8,341,"Hit any key");
X		}
X	    else {
X		egaputs(540,230,"Sorry! No");
X		egaputs(540,240,"back-jumping");
X		egaputs(540,250,"allowed!");
X
X		egaputs(540,341,"Hit any key");
X		}
X	else
X	    if(debug_disp) {
X		egaputs(4,341,"No way, Jose!  There are not that many screens!");
X		egaputs(4+79*8-11*8,341,"Hit any key");
X		}
X	    else {
X		egaputs(540,230,"Sorry! Not");
X		egaputs(540,240,"that many");
X		egaputs(540,250,"screens!");
X
X		egaputs(540,341,"Hit any key");
X		}
X	(void) Getch();
X	if(debug_disp)
X	    egaclear(4,341, 639,349);
X	else
X	    egaclear(540,200, 639,349);
X	}
X    else
X#endif
X	{
X	move(Y,0);
X	if(scrn <= num)
X	    addstr("No way, Jose! Back-jumping is prohibited!");
X	else
X	    addstr("No way, Jose! There are not that many screens!");
X	refresh();
X	}
X    return num;
X    }
X
X/*
X * Passwords are required
X */
X#ifdef	EGA
Xif(EGAaddr) {
X    if(debug_disp)
X	egaputs(4,341,"Enter the password of the screen to jump to:");
X    else
X	egaputs(540,200,"Password?");
X    }
Xelse
X#endif
X    {
X    move(Y,0);
X    addstr("Please enter password of screen to jump to:");
X    refresh();
X    }
Xfor( index = 0; index < 12; ++index ) {
X    if((ch = getch()) == '\n')
X	break;
X    else {
X#ifdef	EGA
X	if(!EGAaddr)
X#endif
X	    {
X	    addch('*');
X	    refresh();
X	    }
X	word[index] = ch;
X	}
X    }
Xword[index]='\0';
X#ifdef	EGA
Xif(EGAaddr) {
X    if(debug_disp)
X	egaputs(4,341,"Validating...                               ");
X    else
X	egaputs(540,200,"Checking...");
X    }
Xelse
X#endif
X    {
X    move(Y,0);
X    addstr("Validating...                                             \n");
X    refresh();
X    }
X
X/*
X * Check for Wizard Mode
X */
Xif(strcmp(word,MASTERPASSWORD) == 0)
X    {
X#ifdef	EGA
X    if(EGAaddr) {
X	if(debug_disp) {
X	    egaputs(4,     341,"Enter the number of the desired level: ");
X	    egagets(4+39*8,341,buffer);
X	    }
X	else {
X	    egaputs(540,    200,"What level?");
X	    egagets(540+2*8,210,buffer);
X	    }
X	sscanf(buffer,"%d",&num);
X	}
X    else
X#endif
X	{
X	move(Y,0);
X	addstr("Enter number of desired level: ");
X	refresh();
X	echo();
X	scanw("%d",&num);
X	noecho();
X	}
X    (void) scrn_passwd(num-1,correct);
X    sprintf(buffer,"Certainly master, but the correct word is %s.",correct);
X#ifdef	EGA
X    if(EGAaddr) {
X	if(debug_disp) {
X	    egaputs(4,          341,buffer);
X	    egaputs(4+79*8-11*8,341,"Hit any key");
X	    }
X	else {
X	    egaputs(540,230,"Certainly!");
X	    egaprintf(540,240,"Level %d",num);
X	    egaputs(540,250,"password is");
X	    egaputs(540,260,correct);
X
X	    egaputs(540,341,"Hit any key");
X	    }
X	(void) Getch();
X	    if(debug_disp)
X		egaclear(4,341, 639,349);
X	    else
X		egaclear(540,200, 639,349);
X	}
X    else
X#endif
X	{
X	move(Y,0);
X	addstr(buffer);
X	addch('\n');
X	addstr("Press any key to continue");
X	refresh();
X	(void) getch();
X	move(Y,0);
X	addstr("                                                             ");
X	move(Y+1,0);
X	addstr("                                                             ");
X	refresh();
X	}
X    return num;
X    }
Xelse
X    if(num == maxscreens) {
X#ifdef	EGA
X	if(EGAaddr) {
X	    if(debug_disp) {
X		egaputs(4,          341,"This is the last screen!");
X		egaputs(4+79*8-11*8,341,"Hit any key");
X		}
X	    else {
X		egaputs(540,200,"Last screen!");
X
X		egaputs(540,341,"Hit any key");
X		}
X	    (void) Getch();
X	    if(debug_disp)
X		egaclear(4,341, 639,349);
X	    else
X		egaclear(540,200, 639,349);
X	    }
X	else
X#endif
X	    {
X	    move(Y,0);
X	    addstr("This is the last screen!");
X	    refresh();
X	    }
X	return num;
X	}
X
X/*
X * Get level corresponding to the password
X */
Xfor(scrn = num;scrn < maxscreens;scrn++) {
X    if(!scrn_passwd(scrn,correct))
X	break;
X    if(strcmp(correct,word) == 0)
X        {
X	move(Y,0);
X#ifdef	EGA
X	if(!EGAaddr)
X#endif
X	    addstr("Password Validated..... Jumping to desired screen.        ");
X        refresh();
X        return ++scrn;
X        }
X    }
X
X#ifdef	EGA
Xif(EGAaddr) {
X    if(debug_disp) {
X	egaputs(4,          341,"Password is incorrect!");
X	egaputs(4+79*8-11*8,341,"Hit any key");
X	}
X    else {
X	egaputs(540,220,"Password is");
X	egaputs(540,230,"not correct!");
X
X	egaputs(540,341,"Hit any key");
X	}
X    (void) Getch();
X    if(debug_disp)
X	egaclear(4,341, 639,349);
X    else
X	egaclear(540,200, 639,349);
X    }
Xelse
X#endif
X    {
X    move(Y,0);
X    addstr("Password is incorrect!                    ");
X    refresh();
X    move(Y,0);
X    addstr("                                                          ");
X    }
X
Xreturn num;
X}
END_OF_FILE
if test 7485 -ne `wc -c <'jump.c'`; then
    echo shar: \"'jump.c'\" unpacked with wrong size!
fi
# end of 'jump.c'
fi
if test -f 'm.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'m.c'\"
else
echo shar: Extracting \"'m.c'\" \(4477 characters\)
sed "s/^X//" >'m.c' <<'END_OF_FILE'
X#include "wand_head.h"
X#include <sys/types.h>
X#include <sys/stat.h>
X#ifdef	EGA
X#include "bitmap.h"
X
Xstruct termio sav;
X#endif
X
Xint debug_disp = 0;
Xint no_passwords = 0;
Xint maxscreens;
Xint edit_mode = 0;
Xint saved_game = 0;
Xchar *edit_screen;
Xchar *screenpath;
X/* Screen[NOOFROWS][ROWLEN] is centered inside area[NOOFROWS+2][ROWLEN+2].
X * This prevents fall() from accessing some random characters outside of
X * screen[][] that happen to match a boulder, etc.
X */
Xchar area[1+NOOFROWS+1][1+ROWLEN+1];
Xchar (*screen)[ROWLEN+1+1] = &area[1][1];
X
Xmain(argc,argv)
Xint  argc;
Xchar *argv[];
X{
Xstruct stat statbuf;
Xint num,bell = 0,maxmoves = 0,x,y;
Xlong score = 0;
Xchar howdead[25],buffer[100], *name,*keys,*dead;
Xchar *malloc();
Xchar *getenv();
X#ifdef	EGA
Xextern char *EGAaddr;
Xextern bitmap wanderer;
X#endif
X
Xif((screenpath = getenv("SCREENPATH")) == NULL)
X    screenpath = SCREENPATH;
X
Xif(argc == 2)
X    {
X    if(!strcmp(argv[1], "-e"))
X	{
X	edit_mode = 1;
X	edit_screen = NULL;
X	}
X    else if(!strcmp(argv[1], "-m"))
X	{
X	erase_scores();
X	return 0;
X	}
X    else if(!strcmp(argv[1], "-c"))
X	{
X	char ch;
X	int fp;
X	/* show credits */
X	sprintf(buffer,"%s/credits",screenpath);
X	if((fp = open(buffer,O_RDONLY)) == -1) {
X            printf(" Sorry - credits unavailable!\n");
X	    exit(1);
X	    }
X	while(read(fp,&ch,1) == 1)
X	    putchar(ch);
X	putchar('\n');
X	exit(0);
X        }
X    else if(!strcmp(argv[1], "-s"))
X	{
X        savescore("",0L,0,NULL);
X        return 0;
X	}
X    else if(!strcmp(argv[1], "-f"))
X        {
X	debug_disp = 1;
X	}
X    else
X	{
X	fprintf(stderr,"Usage: %s [ -e [file] | -m | -c | -s | -f ]\n",argv[0]);
X	exit(1);
X        }
X    }
Xif(argc > 2)
X    {
X    if(!strcmp(argv[1],"-e"))
X	{
X	edit_mode = 1;
X	edit_screen = argv[2];
X	}
X    else
X	{
X	fprintf(stderr,"Usage: %s [ -e [file] | -m | -c | -s | -f ]\n",argv[0]);
X        exit(1);
X	}
X    }
X
X/* use passwords?  if file "no_pws" exists and is readable, then no pws! */
Xsprintf(buffer,"%s/no_pws",screenpath);
Xif(access(buffer,4) == 0)
X    no_passwords = 1;
X
X/* count available screens */
Xfor(maxscreens = 0;;maxscreens++) {
X    sprintf(buffer,"%s/screen.%d",screenpath,(maxscreens+1));
X    if(stat(buffer,&statbuf) == -1)
X	break;
X}
X
Xif((name = getenv("NEWNAME")) == NULL)
X    if((name = getenv("NAME")) == NULL)
X        if((name = getenv("FULLNAME")) == NULL)
X            if((name = getenv("USER")) == NULL)
X		if((name = getenv("LOGNAME")) == NULL)
X#ifdef	ASKNAME	/* M001 */
X		{
X		    name = malloc(80);
X		    if (name == NULL) {
X			printf("malloc error\n");
X			exit(1);
X		    }
X		    printf("Name? "); fflush(stdout);
X		    gets(name);
X		    if (name[0] == '\0')
X			    name = "noname";
X		}
X#else
X	            name = "noname";
X#endif
X
Xif((keys = getenv("NEWKEYS")) == NULL)
X    keys = "kjhl";
X
X#ifdef	EGA
Xif(egainit()) {
X	struct termio cb;
X
X	/* 
X	 * set stdin to raw mode
X	 */
X	ioctl(0, TCGETA, &sav);
X	cb = sav;
X	cb.c_cc[VMIN] = 1;
X	cb.c_cc[VTIME] = 255;
X	cb.c_lflag &= ~(ECHO | ICANON);
X	ioctl(0, TCSETAW, &cb);
X
X	egapaint( 233,95, &wanderer );
X	sleep( 3 );
X	}
X    else
X#endif
X	{
X	initscr();
X	keypad(stdscr, TRUE);
X	CBON;
X	noecho();
X	}
X
X/* MAIN PROGRAM HERE */
X
Xplay_again:
X
Xif(!edit_mode) {
X    howdead[0] = 0;
X    for (num=1; num <= maxscreens; ++num) {
X        if (rscreen(num,&maxmoves)) {
X	    strcpy(howdead,"a non-existant screen");
X	    break;
X	    }
X        dead = playscreen(&num,&score,&bell,maxmoves,keys);
X        if ((dead != NULL) && (*dead == '~')) {
X	    num = (int)(dead[1]) - 1;
X	    dead = NULL;
X	    }
X        if (dead != NULL)
X	    {
X	    strcpy(howdead,dead);
X            break;
X            }
X        }
X    }
Xelse
X    {
X    if(rscreen(num,&maxmoves))
X	{
X	for(x=0;x<ROWLEN;x++)
X	    for(y=0;y<NOOFROWS;y++)
X		screen[y][x] =  ' ';
X	}
X    edit(num,&score,&bell,maxmoves,keys);
X    }
X/* END OF MAIN PROGRAM */
X
X#ifdef	EGA
Xif(!EGAaddr)
X#endif
X    {
X    echo();
X    CBOFF;
X    endwin();
X    }
X
Xif(!edit_mode) {
X    /* SAVE ROUTINES FOR SCORES */
X
X#ifdef NO_RESTORED_GAME_HISCORES
X    if(saved_game) {
X#ifdef	EGA
X	if(!EGAaddr)
X#endif
X	    printf("No scores recorded for restored games.\n");
X    }
X    else
X#endif
X	savescore(howdead,score,num,name);
X
X#ifdef	EGA
X    if(EGAaddr) {
X	egaputs(4,341,"Play again? ");
X	egagets(4+12*8,341,buffer);
X	if(buffer[0] == 'y' || buffer[0] == 'Y') {
X	    score = 0;
X	    saved_game = 0;
X	    goto play_again;
X	    }
X	}
X#endif
X    }
X
X#ifdef	EGA
Xif(EGAaddr) {
X    egareset();
X    ioctl(0, TCSETAW, &sav);
X    }
X#endif
X
Xprintf("WANDERER (C) 1988 S. Shipway\n");
Xreturn 0;
X}
END_OF_FILE
if test 4477 -ne `wc -c <'m.c'`; then
    echo shar: \"'m.c'\" unpacked with wrong size!
fi
# end of 'm.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'\" \(6471 characters\)
sed "s/^X//" >'save.c' <<'END_OF_FILE'
X#include "wand_head.h"
X
X#ifdef	EGA
Xextern	char	*EGAaddr;
X#endif
X
Xextern char area[1+NOOFROWS+1][1+ROWLEN+1];
Xextern int saved_game;
Xextern int debug_disp;
X
X#ifndef NO_ENCRYPTION
X
X/* this is the random number seed */
X#define BLURFL 32451    /* the word blurfl is used for historical reasons */
X                        /* but it can be any number */
X
Xstatic int fread(buffer,length,items,stream)
Xchar *buffer;
XFILE *stream;
X{
Xint loop, c, count;
X
Xfor(loop=0; loop<items; loop++)
X	for(count = 0; count<length; ++count ) {
X		if ( (c = getc(stream)) == EOF || ferror(stream) )
X			return( loop );
X		*buffer++ = c ^ rand();
X		}
X
Xreturn( items );
X}
X
Xstatic int fwrite(buffer,length,items,stream)
Xchar *buffer;
XFILE *stream;
X{
Xint loop, count;
X
Xfor(loop=0; loop<items; loop++)
X	for(count = 0; count<length; ++count ) {
X		if ( putc(*buffer++ ^ rand(), stream) == EOF )
X			return( loop );
X		}
X
Xreturn( items );
X}
X#endif
X
Xstruct	saved_game	{
X	short	num;
X	long	score;
X	short	bell;
X	short	maxmoves;
X	short	num_monsters;
X};
X
Xstruct	save_vars	zz;
X
Xvoid
Xsave_game(num, score, bell, maxmoves, start_of_list, tail_of_list)
Xint	num, *bell, maxmoves;
Xlong    *score;
Xstruct	mon_rec	*start_of_list, *tail_of_list;
X{
X	char	fname[128], *fp;
X	FILE	*fo;
X	struct	saved_game	s;
X	extern	char	*getenv();
X	struct	mon_rec	*mp;
X
X#ifndef NO_ENCRYPTION
X	srand(BLURFL);
X#endif
X
X	fp = getenv("SAVENAME");
X#ifdef	EGA
X	if(EGAaddr) {
X		egaclear(0,350-4*9, 639,349);
X		egaputs(4,350-3*9,"Saving game... Filename ? ");
X
X		if (fp == NULL) {
X			fp = fname;
X			egagets(4+26*8,350-3*9,fp);
X		}
X		else
X			egaputs(4+26*8,350-3*9,fp);
X	}
X	else
X#endif
X		{
X		move(LINES-3,0);
X		clrtobot();
X		addstr("Saving game... Filename ? ");
X
X		if (fp == NULL) {
X			refresh();
X			fp = fname;
X			echo(); CBOFF;
X			getstr(fp);
X			noecho(); CBON;
X		}
X		else {
X			addstr(fp);
X			addch('\n');
X			refresh();
X		}
X	}
X	if (NULL == (fo = fopen(fp, W_BIN))) {
X		saveError("Error opening '%s'", fp);
X		return;
X	}
X
X	s.num = num;
X	s.score = *score;
X	s.bell = *bell;
X	s.maxmoves = maxmoves;
X	s.num_monsters = 0;
X
X	mp = start_of_list;		/* first entry is dummy	*/
X	while (mp != tail_of_list) {
X		mp = mp->next;
X		s.num_monsters++;	/* count them monsters	*/
X	}
X
X	if ( (1 != fwrite("WANDERER", 8, 1, fo)) ||
X	     (1 != fwrite(&s, sizeof(s), 1, fo)) ||
X	     (1 != fwrite(&zz, sizeof(zz), 1, fo)) )
X	{
X		saveError("Error writing '%s'", fp);
X		fclose(fo);
X		unlink(fp);
X		return;
X	}
X
X	mp = start_of_list;
X	while (mp != tail_of_list) {
X		/* save them monsters	*/
X		mp = mp->next;
X		if (1 != fwrite(mp, sizeof(*mp), 1, fo)) {
X			saveError("Error writing '%s'", fp);
X			fclose(fo);
X			unlink(fp);
X			return;
X		}
X	}
X
X	if ( 1 != fwrite(area, sizeof(area), 1, fo) )
X	{
X		saveError("Error writing '%s'", fp);
X		fclose(fo);
X		unlink(fp);
X		return;
X	}
X
X	fclose(fo);
X#ifdef	EGA
X	if(EGAaddr) {
X		extern struct termio sav;
X		egareset();
X		ioctl(0, TCSETAW, &sav);
X		}
X	else
X#endif
X		{
X		refresh();
X		endwin();
X	}
X	exit(0);
X}
X
XsaveError( msg, arg )
Xchar *msg, *arg;
X{
X#ifdef	EGA
X	if(EGAaddr)
X		egaprintf(4,350-2*9,msg,arg);
X	else
X#endif
X		{
X		mvprintw(LINES-2,0,msg,arg);
X		refresh();
X	}
X}
X
X
Xint
Xrestore_game(num, score, bell, maxmoves, start_of_list, tail_of_list)
Xint	*num, *bell, *maxmoves;
Xlong    *score;
Xstruct	mon_rec	*start_of_list, **tail_of_list;
X{
X	FILE	*fi;
X	struct	saved_game	s;
X	struct	mon_rec	*mp, *tmp, *rp;
X	char	fname[128], *fp;
X	char	name[10];
X	extern	char	*getenv();
X	extern	char	*malloc();
X
X#ifndef NO_ENCRYPTION
X	srand(BLURFL);
X#endif
X
X	fp = getenv("SAVENAME");
X#ifdef	EGA
X	if(EGAaddr) {
X		egaclear(0,350-4*9, 639,349);
X		egaputs(4,350-3*9,"Restore Filename ? ");
X
X		if (fp == NULL) {
X			fp = fname;
X			egagets(4+19*8,350-3*9,fp);
X		}
X		else
X			egaputs(4+19*8,350-3*9,fp);
X	}
X	else
X#endif
X		{
X		move(LINES-3,0);
X		clrtobot();
X		addstr("Restore Filename ? ");
X
X		if (NULL == (fp = getenv("SAVENAME"))) {
X			refresh();
X			CBOFF; echo();
X			fp = fname;
X			getstr(fp);
X			noecho(); CBON;
X		}
X		else {
X			addstr(fp);
X			addch('\n');
X			refresh();
X		}
X	}
X	if (NULL == (fi = fopen(fp, R_BIN))) {
X		restoreError("Error opening '%s'; cannot restore game", fp);
X		return 0;
X	}
X
X	if ( 1 != fread(name, 8, 1, fi) ) {
X		restoreError("Error reading '%s'; cannot restore game", fp);
X		fclose(fi);
X		return 0;
X	}
X
X	if ( 0 != strncmp(name,"WANDERER",8) ) {
X		restoreError("File '%s' is not a WANDERER save file; cannot restore game", fp);
X		fclose(fi);
X		return 0;
X	}
X
X	if ( (1 != fread((char *)&s, sizeof(s), 1, fi)) ||
X	     (1 != fread((char *)&zz, sizeof(zz), 1, fi)) ) {
X		restoreError("Error reading '%s'; cannot restore game", fp);
X		fclose(fi);
X		return 0;
X	}
X
X	/* read monsters into core */
X	if (NULL == (rp = (struct mon_rec*)malloc(s.num_monsters*sizeof(*rp)))) {
X		restoreError("Monster alloc error on '%s'; cannot restore game", fp);
X		fclose(fi);
X		return 0;
X	}
X	if ((s.num_monsters != fread(rp,sizeof(struct mon_rec),s.num_monsters,fi)) ||
X	     (1 != fread(area, sizeof(area), 1, fi)) ) {
X		restoreError("Error reading '%s'; cannot restore game", fp);
X		free(rp);
X		fclose(fi);
X		return 0;
X	}
X
X	/* point of no return */
X	*num = s.num;
X	*score = s.score;
X	*bell = s.bell;
X	*maxmoves = s.maxmoves;
X
X	/* free any monsters already on chain, to start clean */
X	mp = start_of_list->next;
X	while ((mp != NULL) && (mp != start_of_list)) {
X		/* free them monsters	*/
X		tmp = mp;
X		mp = mp->next;
X		free(tmp);
X	}
X
X	/* re-initialize the monster list	*/
X	/* *start_of_list = {0,0,0,0,0,NULL,NULL}; */
X	memset( start_of_list, 0, sizeof(*start_of_list) );
X
X	*tail_of_list = start_of_list;
X
X	for( tmp = rp; s.num_monsters--; ++tmp ) {
X		/* use make_monster to allocate the monster structures	*/
X		/* to get all the linking right without even trying	*/
X		if (NULL == (mp = make_monster(0, 0))) {
X#ifdef	EGA
X			if(EGAaddr) {
X				extern struct termio sav;
X				egareset();
X				ioctl(0, TCSETAW, &sav);
X				printf("Monster alloc error on '%s'; cannot restore game\n", fp);
X			}
X			else
X#endif
X				{
X				mvprintw(LINES-2,0,"Monster alloc error on '%s'; cannot restore game", fp);
X				refresh();
X				endwin();
X			}
X			fclose(fi);
X			exit(1);	/* no recovery possible */
X		}
X		/* copy info without trashing links	*/
X		mp->x     = tmp->x;
X		mp->y     = tmp->y;
X		mp->mx    = tmp->mx;
X		mp->my    = tmp->my;
X		mp->under = tmp->under;
X	}
X
X	fclose(fi);
X	unlink(fp);
X	free(rp);
X	saved_game = 1;
X	return 1;
X}
X
XrestoreError( msg, arg )
Xchar *msg, *arg;
X{
X#ifdef	EGA
X	if(EGAaddr)
X		egaprintf(4,350-2*9,msg,arg);
X	else
X#endif
X		{
X		mvprintw(LINES-2,0,msg,arg);
X		refresh();
X	}
X}
END_OF_FILE
if test 6471 -ne `wc -c <'save.c'`; then
    echo shar: \"'save.c'\" unpacked with wrong size!
fi
# end of 'save.c'
fi
if test -f 'wand_head.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'wand_head.h'\"
else
echo shar: Extracting \"'wand_head.h'\" \(5088 characters\)
sed "s/^X//" >'wand_head.h' <<'END_OF_FILE'
X#include <stdio.h>
X#include <curses.h>
X#include <string.h>
X#include <fcntl.h>
X
X/* I wouldn't change these if I were you - it won't give you a bigger screen */
X#define ROWLEN 40
X#define NOOFROWS 16
X
X/* Change these to the necessary directories or files */
X#define SCREENPATH "/usr/games/lib/wanderer"
X#define HISCOREPATH "/usr/games/lib/.wanderer"
X#define LOCKPATH "/tmp/wanderer.lock"      /* hiscore lock file */
X#define DICTIONARY "/usr/lib/dictionary"
X
X/* change this to anything (12 characters or less), but don't forget what */
X#define MASTERPASSWORD "slimy worms"
X
X/* change the numbers in this as well, but keep it in the same form */
X#define PASSWD (num * num * 4373L + num * 16927L + 39L)
X
X/* To disable the recording of hiscores from games restored from saves */
X/* #define NO_RESTORED_GAME_HISCORES  */
X/* #define COMPARE_BY_NAME  define this to compare by name, not uid */
X#define GUESTUID 0    /* guestuid always compared by name */
X/* #define NO_ENCRYPTION define this to disable the savefile encryptor */
X
X/* To compile for Microport System V/286 with EGA */
X#ifdef	iAPX286
X#define	EGA	1	/* enable EGA graphics mode */
X#endif
X
X/* cbreak switching via curses package. */
X/* on some Ultrix systems you may need to use crmode() and nocrmode() */
X/* if so, just change the #defs to the necessary. I also know that Xenix */
X/* systems have to use crmode, so.. */
X#ifdef XENIX
X#define CBON crmode()
X#define CBOFF nocrmode()
X#else
X#define CBON cbreak()
X#define CBOFF nocbreak()
X#endif
X
X
X/* MSDOS modifications (M001) by Gregory H. Margo	*/
X#ifdef	MSDOS
X#define	R_BIN	"rb"	/* binary mode for non-text files */
X#define	W_BIN	"wb"
X# ifdef	VOIDPTR
X#  define VOIDSTAR	(void *)
X# else
X#  define VOIDSTAR	(char *)
X# endif
X#define	ASKNAME		/* ask user's name if not in environment */
X#define	COMPARE_BY_NAME	/* compare users with name, not uid	*/
X#undef	getchar		/* remove stdio's definition to use curses' 	*/
X#define	getchar()	getch()	/* use curse's definition instead */
X
X#else /* not MSDOS */
X#define	R_BIN	"r"
X#define	W_BIN	"w"
X#define	VOIDSTAR	(void *)
X#endif
X
X#ifdef	EGA
X/*
X * Front-end various curses routines... this avoids a lot of #ifdef'ing
X */
X#undef	clear
X#undef	refresh
X#undef	move
X#undef	getch
X#define	clear()		Clear()
X#define	refresh()	Refresh()
X#define	move(y,x)	Move(y,x)
X#define	getch()		Getch()
X#define	beep()		Beep()
X#endif
X
X/* Save and Restore game additions (M002) by Gregory H. Margo	*/
X/* mon_rec structure needed by save.c */
Xstruct mon_rec
X    {
X    int x,y,mx,my;
X    char under;
X    struct mon_rec *next,*prev;
X    };
X
X
Xstruct	save_vars	{
X	int	z_x, z_y,
X		z_tx, z_ty,
X		z_mx, z_my,
X		z_max_score,
X		z_diamonds,
X		z_nf;
X};
X
X/* prototypes added by Gregory H. Margo */
X#ifdef	LINT_ARGS	/* M001 */
X/* DISPLAY.c */
Xextern  void map(char (*)[ROWLEN+1]);
Xextern  void display(int ,int ,char (*)[ROWLEN+1]);
Xextern	void update_score(lonf, int, int );
X
X/* EDIT.C */
Xextern  void instruct(void);
Xextern  void noins(void);
Xextern  void edit(int ,long *,int *,int ,char *);
X
X/* FALL.C */
Xextern  int check(int *,int *,int ,int ,int ,int ,int ,int ,char *);
Xextern  int fall(int *,int *,int ,int ,int ,int ,char *);
X
X/* GAME.C */
Xextern  struct mon_rec *make_monster(int ,int );
Xextern  char *playscreen(int *,long *,int *,int ,char *);
X
X/* ICON.C */
Xextern  void draw_symbol(int ,int ,char );
Xextern  int symbol(char);
X
X/* JUMP.C */
Xextern  int scrn_passwd(int ,char *);
Xextern  void showpass(int );
Xextern  int jumpscreen(int );
Xextern  int getnum(void);
X
X/* READ.C */
Xextern  int rscreen(int ,int *);
Xextern  int wscreen(int ,int );
X
X/* SAVE.C */
Xextern  void save_game(int ,long *,int *,int ,struct mon_rec *,struct mon_rec *);
Xextern  int restore_game(int *,long *,int *,int *,struct mon_rec *,struct mon_rec **);
X
X/* SCORES.C */
Xextern  int savescore(char *,long ,int ,char *);
Xextern  void delete_entry(int );
Xextern  int erase_scores(void);
X
X#ifdef	EGA
X/* iAPX286.c */
Xextern	int egainit(void);
Xextern	void egaclear(int,int, int,int);
Xextern	void egareset(void);
Xextern	void egaline( int, int, int, int );
Xextern	void egaputs( int, int, char * );
Xextern	void egapaint( int, int, void * );
Xextern	void egamessage( int, char * );
X#endif
X
X#else
X
X/* DISPLAY.c */
Xextern  void map();
Xextern  void display();
Xextern	void update_score();
X
X/* EDIT.C */
Xextern  void instruct();
Xextern  void noins();
Xextern  void edit();
X
X/* FALL.C */
Xextern  int check();
Xextern  int fall();
X
X/* GAME.C */
Xextern  struct mon_rec *make_monster();
Xextern  char *playscreen();
X
X/* ICON.C */
Xextern  void draw_symbol();
Xextern  int symbol();
X
X/* JUMP.C */
Xextern  int scrn_passwd();
Xextern  void showpass();
Xextern  int jumpscreen();
Xextern  int getnum();
X
X/* READ.C */
Xextern  int rscreen();
Xextern  int wscreen();
X
X/* SAVE.C */
Xextern  void save_game();
Xextern  int restore_game();
X
X/* SCORES.C */
Xextern  int savescore();
Xextern  void delete_entry();
Xextern  int erase_scores();
X
X#ifdef	EGA
X/* iAPX286.c */
Xextern	int egainit();
Xextern	void egaclear();
Xextern	void egareset();
Xextern	void egaline();
Xextern	void egaputs();
Xextern	void egapaint();
Xextern	void egamessage();
X#endif
X
X#endif
END_OF_FILE
if test 5088 -ne `wc -c <'wand_head.h'`; then
    echo shar: \"'wand_head.h'\" unpacked with wrong size!
fi
# end of 'wand_head.h'
fi
echo shar: End of archive 4 \(of 5\).
cp /dev/null ark4isdone
MISSING=""
for I in 1 2 3 4 5 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 5 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