From decwrl!decvax!tektronix!tekgen!tekred!games Sun Oct 30 15:03:49 PST 1988 Article 446 of comp.sources.games: Path: granite!decwrl!decvax!tektronix!tekgen!tekred!games From: games@tekred.TEK.COM Newsgroups: comp.sources.games Subject: v05i080: xwanderer - wanderer2 for X-windows X11R2 (and curses), Part02/05 Message-ID: <3220@tekred.TEK.COM> Date: 28 Oct 88 23:32:34 GMT Sender: billr@tekred.TEK.COM Lines: 2216 Approved: billr@saab.CNA.TEK.COM Submitted by: Mike Cuddy Comp.sources.games: Volume 5, Issue 80 Archive-name: xwanderer/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 'Makefile' <<'END_OF_FILE' X#!/bin/make -f X# Makefile for wanderer - modified by Bill Randle 6/30/88 X# completely re-written by Mike Cuddy (ihnp4!convex!cuddy) 7-22-88 X# X# GOALS: the programs you want to make X# XGOALS = wanderer xwanderer dev xdev erase X#GOALS = xwanderer X# X# HEADERS: the header files X# XHEADERS= wand_head.h X# X# CUR_OBJS: the object files for the curses based wanderer X# XWIN_OBJS: object files for the X based wanderer X# DEV_OBJS: object files for the curses base dev. utility X# COM_OBJS: object files common to the X based progams and the curses base ones X# ERASE_OBJS: object files for the erase utility X# XCUR_OBJS = displayC.o fallC.o gameC.o iconC.o jumpC.o mC.o read.o scoresC.o \ X helpscrC.o XXWIN_OBJS = displayX.o fallX.o gameX.o iconX.o jumpX.o mX.o read.o scoresX.o \ X helpscrX.o XDEV_OBJS= displayC.o iconC.o gameD.o mD.o fallC.o devread.o helpscrC.o XXDEV_OBJS= displayX.o iconX.o gameXD.o mXD.o fallX.o devread.o helpscrX.o XCOM_OBJS= read.o XERASE_OBJS= erase.o XSRCS= devread.c display.c erase.c fall.c game.c gamedev.c helpscr.c \ X icon.c jump.c m.c pixmapdecl.h read.c scores.c wand_head.h X# X# all of the object files X# XALLOBJS = $(CUR_OBJS) $(XWIN_OBJS) $(DEV_OBJS) $(COM_OBJS) $(ERASE_OBJS) X# X# flags for the compiler X# XCFLAGS = -g X# X# libraries for an X based program X# XXLIBS= -lX11 X# X# libraries for a curses based program X# XCLIBS = -lcurses -ltermcap X# X# quiet rm -- doesn't complain when files aren't there X# XRM=rm -f X# X# BINDIR: where to put the executables X# SCREENPATH: where to put the screens (see wand_head.h also) X# XBINDIR=/mnt/cuddy/bin XSCREENPATH= /mnt/cuddy/lib/wanderer X Xall: $(GOALS) X @echo DONE X Xwanderer: $(CUR_OBJS) $(COM_OBJS) X $(CC) $(CFLAGS) -o wanderer $(CUR_OBJS) $(COM_OBJS) $(CLIBS) X Xxwanderer: $(XWIN_OBJS) $(COM_OBJS) X $(CC) $(CFLAGS) -o xwanderer $(XWIN_OBJS) $(COM_OBJS) $(XLIBS) X Xerase: $(ERASE_OBJS) X $(CC) $(CFLAGS) -o erase $(ERASE_OBJS) X Xdev: $(DEV_OBJS) X $(CC) $(CFLAGS) -o dev $(DEV_OBJS) $(CLIBS) Xxdev: $(XDEV_OBJS) X $(CC) $(CFLAGS) -o xdev $(XDEV_OBJS) $(XLIBS) X Xinstall: $(GOALS) X cp $(GOALS) $(BINDIR) X @mkdir $(SCREENPATH) X cp screens/* $(SCREENPATH) X cp wanderer.help $(SCREENPATH) X Xdclean: X $(RM) $(DEV_OBJS) $(COM_OBJS) Xxdclean: X $(RM) $(XDEV_OBJS) $(COM_OBJS) Xwclean: X $(RM) $(CUR_OBJS) $(COM_OBJS) Xxclean: X $(RM) $(XWIN_OBJS) $(COM_OBJS) X Xtags: $(SRCS) X ctags $(SRCS) X Xclean: dclean wclean xclean xdclean X $(RM) core make.out lint.out tags .#* X Xclobber: clean X $(RM) dev xdev wanderer xwanderer erase X X$(COM_OBJS): $(HEADERS) X# X# special multiple compile targets X# XdisplayC.o: display.c $(HEADERS) X cc -c display.c $(CFLAGS) -UXWANDER X @mv display.o displayC.o XdisplayX.o: display.c $(HEADERS) X cc -c display.c $(CFLAGS) -DXWANDER X @mv display.o displayX.o XfallC.o: fall.c $(HEADERS) X cc -c fall.c $(CFLAGS) -UXWANDER X @mv fall.o fallC.o XfallX.o: fall.c $(HEADERS) X cc -c fall.c $(CFLAGS) -DXWANDER X @mv fall.o fallX.o XgameC.o: game.c $(HEADERS) X cc -c game.c $(CFLAGS) -UXWANDER X @mv game.o gameC.o XgameD.o: game.c $(HEADERS) X cc -c game.c $(CFLAGS) -DGAMEDEV X @mv game.o gameD.o XgameXD.o: game.c $(HEADERS) X cc -c game.c $(CFLAGS) -DGAMEDEV -DXWANDER X @mv game.o gameXD.o XgameX.o: game.c $(HEADERS) X cc -c game.c $(CFLAGS) -DXWANDER X @mv game.o gameX.o XhelpscrX.o: helpscr.c $(HEADERS) X cc -c helpscr.c $(CFLAGS) -DXWANDER X @mv helpscr.o helpscrX.o XhelpscrC.o: helpscr.c $(HEADERS) X cc -c helpscr.c $(CFLAGS) -UXWANDER X @mv helpscr.o helpscrC.o XiconC.o: icon.c $(HEADERS) X cc -c icon.c $(CFLAGS) -UXWANDER X @mv icon.o iconC.o XiconX.o: icon.c $(HEADERS) X cc -c icon.c $(CFLAGS) -DXWANDER X @mv icon.o iconX.o XjumpC.o: jump.c $(HEADERS) X cc -c jump.c $(CFLAGS) -UXWANDER X @mv jump.o jumpC.o XjumpX.o: jump.c $(HEADERS) X cc -c jump.c $(CFLAGS) -DXWANDER X @mv jump.o jumpX.o XmC.o: m.c $(HEADERS) X cc -c m.c $(CFLAGS) -UXWANDER X @mv m.o mC.o XmD.o: m.c $(HEADERS) X cc -c m.c $(CFLAGS) -DGAMEDEV X @mv m.o mD.o XmXD.o: m.c $(HEADERS) X cc -c m.c $(CFLAGS) -DGAMEDEV -DXWANDER X @mv m.o mXD.o XmX.o: m.c $(HEADERS) X cc -c m.c $(CFLAGS) -DXWANDER X @mv m.o mX.o XscoresC.o: scores.c $(HEADERS) X cc -c scores.c $(CFLAGS) -UXWANDER X @mv scores.o scoresC.o XscoresX.o: scores.c $(HEADERS) X cc -c scores.c $(CFLAGS) -DXWANDER X @mv scores.o scoresX.o X END_OF_FILE if test 4271 -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'\" \(3917 characters\) sed "s/^X//" >'display.c' <<'END_OF_FILE' X#include "wand_head.h" X X#ifdef XWANDER Xextern GC linegc; Xextern int do_repaint; X#endif X Xvoid map(row_ptr) Xchar (*row_ptr)[ROWLEN+1]; X{ Xint x,y; Xchar ch; X#ifdef XWANDER X drawmap(row_ptr,1); X#else Xmove(0,0); Xaddch('+'); Xfor(x = 0;x < ROWLEN; x++) X addch('-'); Xaddch('+'); Xfor(y = 0;y < NOOFROWS; y++) X { X move(y+1,0); X addch('|'); X for(x = 0; x<= ROWLEN; x++) X { X ch = (*row_ptr)[x]; X if((ch == 'M')||(ch == 'S')) X ch = ' '; X addch(ch); X } X addch('|'); X row_ptr++; X } Xmove(y+1,0); Xaddch('+'); Xfor(x = 0;x < ROWLEN; x++) X addch('-'); Xaddch('+'); Xmove(18,0); Xaddstr("Press any key to return to the game."); Xrefresh(); X#endif X#ifdef XWANDER Xmessage(0,"Press any key to return to the game."); Xdo_repaint = 1; X#endif X(void) getchar(); X#ifndef XWANDER Xmove(18,0); Xaddstr(" "); Xrefresh(); Xfor(y=0;y<=(NOOFROWS+1);y++) X { X move(y,0); X for(x=0;x<=(ROWLEN+2);x++) X addch(' '); X } X X#else X erase_message(0); X /* clear out the small map */ X XClearArea(dpy, win, 5, 5, ICON_WIDE * 11, ICON_HIGH * 7, 0); X#endif X} X X#ifdef XWANDER Xdrawmap(row_ptr, er) Xchar (*row_ptr)[ROWLEN+1]; X{ Xint x,y; Xchar ch; X X if (er) { X /* erase the magnified map */ X XClearArea(dpy, win, 5, 5, ICON_WIDE * 11, ICON_HIGH * 7, 0); X } X for (x= -1; x <= ROWLEN+1; x++) X paint_small_square(x ,-1, '='); X X for(y = 0;y < NOOFROWS; y++) X { X paint_small_square((-1), y,'='); X for(x = 0; x<= ROWLEN; x++) X { X ch = (*row_ptr)[x]; X if((ch == 'M')||(ch == 'S')) X ch = ' '; X paint_small_square(x,y,ch); X } X paint_small_square(x,y,'='); X row_ptr++; X } X for (x= -1; x <= ROWLEN+1; x++) X paint_small_square(x, y, '='); X do_repaint = 1; X XDrawLine(dpy,win,linegc,2,2,2,ICON_HIGH*7+6); X XDrawLine(dpy,win,linegc,2,ICON_HIGH*7+6,ICON_WIDE*11+6,ICON_HIGH*7+6); X XDrawLine(dpy,win,linegc,ICON_WIDE*11+6,ICON_HIGH*7+6,ICON_WIDE*11+6,2); X XDrawLine(dpy,win,linegc,ICON_WIDE*11+6,2,2,2); X} X#endif X Xvoid display(cx,cy,row_ptr,score) Xchar (*row_ptr)[ROWLEN+1]; Xint cx,cy,score; X{ X int x,y = 0, X x_coord,y_coord; X char ch; X while(y<(cy-3)) X { X y++; X row_ptr++; X }; X#ifndef XWANDER X move(0,0); X addstr("+---------------------------------+"); X move(15,0); X addstr("+---------------------------------+"); X#else X XDrawLine(dpy,win,linegc,2,2,2,ICON_HIGH*7+6); X XDrawLine(dpy,win,linegc,2,ICON_HIGH*7+6,ICON_WIDE*11+6,ICON_HIGH*7+6); X XDrawLine(dpy,win,linegc,ICON_WIDE*11+6,ICON_HIGH*7+6,ICON_WIDE*11+6,2); X XDrawLine(dpy,win,linegc,ICON_WIDE*11+6,2,2,2); X#endif X for(y=(cy-3);y<=(cy+3);y++) X { X#ifndef XWANDER X y_coord = (y+3-cy)*2; X if ((y<0) || (y>=NOOFROWS)) X { X move(y_coord+1,0); X addstr("|#################################|"); X move(y_coord+2,0); X addstr("|#################################|"); X#else X y_coord = (y+3-cy); X if ((y<0) || (y>=NOOFROWS)) X { X for (x = cx-5; x <= (cx+5); x++) { X x_coord = (x+5-cx); X draw_symbol(x_coord,y_coord,'#'); X } X#endif X } X else X { X#ifndef XWANDER X move(y_coord+1,0); X addch('|'); X move(y_coord+1,34); X addch('|'); X move(y_coord+2,0); X addch('|'); X move(y_coord+2,34); X addch('|'); X#endif X for(x=(cx-5);x<=(cx+5);x++) X { X#ifndef XWANDER X x_coord = (x+5-cx)*3; X#else X x_coord = (x+5-cx); X#endif X if ((x<0) || (x>ROWLEN-1)) X draw_symbol(x_coord,y_coord,'#'); X else X { X ch = (*row_ptr)[x]; X draw_symbol(x_coord,y_coord,ch); X } X }; X row_ptr++; X } /* end if */ X } /* end y loop */ X#ifndef XWANDER X move(16,0); X refresh(); X#endif X} END_OF_FILE if test 3917 -ne `wc -c <'display.c'`; then echo shar: \"'display.c'\" unpacked with wrong size! fi # end of 'display.c' fi if test -f 'gamedev.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'gamedev.c'\" else echo shar: Extracting \"'gamedev.c'\" \(14429 characters\) sed "s/^X//" >'gamedev.c' <<'END_OF_FILE' X#include "wand_head.h" X X#define viable(x,y) ((screen[y][x] == ' ') || (screen[y][x] == ':') ||\ X (screen[y][x] == '@') || (screen[y][x] == '+')) && (y >= 0) &&\ X (x >= 0) && (y < NOOFROWS) && (x < ROWLEN) X Xtypedef struct mon_rec X { X int x,y,mx,my; X char under; X struct mon_rec *next; X }; X Xtypedef struct { int d[2] } direction; X Xextern void draw_symbol(); X Xextern void display(); X Xextern int fall(); X Xextern void map(); X X/* Add a spirit to the chain */ X Xstruct mon_rec *make_monster(x,y) Xint x,y; X{ Xstruct mon_rec *malloc(), X *monster; Xif((monster = malloc(sizeof(struct mon_rec))) == NULL) X return NULL; Xmonster->x = x; Xmonster->y = y; Xmonster->mx = 1; /* always start moving RIGHT. (fix later) */ Xmonster->my = 0; Xmonster->under = ' '; Xmonster->next = NULL; Xreturn monster; X} X X/* 'follow lefthand wall' algorithm for sprites */ X Xdirection new_direction(screen,x,y,bx,by) Xint x,y,bx,by; Xchar screen[NOOFROWS][ROWLEN+1]; X{ Xdirection out; Xif(viable((x+by),(y-bx))) X { X out.d[0] = by; X out.d[1] = -bx; X return out; X } Xif(viable((x+bx),(y+by))) X { X out.d[0] = bx; X out.d[1] = by; X return out; X } Xif(viable((x-by),(y+bx))) X { X out.d[0] = -by; X out.d[1] = bx; X return out; X } Xif(viable((x-bx),(y-by))) X { X out.d[0] = -bx; X out.d[1] = -by; X return out; X } Xout.d[0] = -bx; Xout.d[1] = -by; Xreturn out; X} X X/* Actual game function - Calls fall() to move X boulders and arrows recursively */ X Xchar *playscreen(screen,score,bell,maxmoves,keys) Xint maxmoves, X *bell, X *score; Xchar screen[NOOFROWS][ROWLEN+1], X keys[6]; X{ Xint x,y,nx,ny,deadyet =0, X sx = -1,sy = -1,tx = -1,ty = -1,lx = 0,ly = 0,mx = -1,my = -1, X bx, by, nbx, nby, X newnum, num = 1, X diamonds = 0, nf = 0,hd ,vd ,xdirection,ydirection; Xchar (*frow)[ROWLEN+1] = screen, X ch, X buffer[25], X howdead[25]; Xdirection new_disp; Xstruct mon_rec *monster,*mon_ptr, *current; X Xmon_ptr = NULL; X Xfor(x=0;x<=ROWLEN;x++) X for(y=0;ynext = monster; X } X if(screen[y][x] == '-') X screen[y][x] = ' '; X }; Xx=sx; Xy=sy; Xif((x == -1)&&(y == -1)) /* no start position in file ? */ X { X strcpy(howdead,"no start position!"); X return(howdead); X } Xmove(0,48); X(void) addstr("Score\t Diamonds"); Xmove(1,48); X(void) addstr("\tFound\tTotal"); Xmove(3,48); X(void) sprintf(buffer,"%d\t %d\t %d ",*score,nf,diamonds); X(void) addstr(buffer); Xmove(6,48); X(void) sprintf(buffer,"Current screen %d",num); X(void) addstr(buffer); Xif(maxmoves != 0) X(void) sprintf(buffer,"Moves remaining = %d ",maxmoves); Xelse X{ X (void) strcpy(buffer," Unlimited moves "); X maxmoves = -1; X}; Xmove(15,48); X(void) addstr(buffer); Xif(mx != -1) /* tell player if monster exists */ X draw_symbol(48,10,'M'); Xelse X draw_symbol(48,10,' '); X Xdisplay(sx,sy,frow,*score); X X/* ACTUAL GAME FUNCTION - Returns method of death in string */ X Xwhile(deadyet == 0) X{ Xch = getchar(); X Xnx=x; Xny=y; X Xif(ch == keys[3]) X nx++; Xif(ch == keys[2]) X nx--; Xif((ch == keys[1]) && (y<(NOOFROWS-1))) X ny++; Xif(ch == keys[0]) X ny--; Xif(ch == '1') X { X move(10,45); X *bell = 1; X (void) addstr("Bell ON "); X printf("\007"); X move(16,0); X refresh(); X } Xif(ch == '0') X { X *bell = 0; X move(10,45); X (void) addstr("Bell OFF"); X move(16,0); X refresh(); X } Xif(ch == '~') /* level jump */ X { X strcpy(howdead,"~~"); X return howdead; X } Xif(ch == '!') X { X map(frow); X display(sx,sy,frow,*score); X } Xif(ch == 'q') X { X strcpy(howdead,"quitting the game"); X return howdead; X } X Xif(screen[ny][nx] == 'C') X { X screen[ny][nx] = ':'; X *score+=4; X if (*bell) X printf("\007"); X if(maxmoves != -1) X maxmoves+=250; X } Xswitch(screen[ny][nx]) X { X case '@': break; X case '*': *score+=9; X if (*bell) X printf("\007"); X nf++; X case ':': *score+=1; X move(3,48); X sprintf(buffer,"%d\t %d",*score,nf); X (void) addstr(buffer); X case ' ': X screen[y][x] = ' '; X screen[ny][nx] = '@'; X draw_symbol((x-sx+5)*3,(y-sy+3)*2,' '); X draw_symbol((nx-sx+5)*3,(ny-sy+3)*2,'@'); X if(deadyet ==0) X deadyet = fall(&mx,&my,x,y,sx,sy,screen,howdead); X if((deadyet ==0) && (nx != (x+1))) X deadyet = fall(&mx,&my,x+1,y,sx,sy,screen,howdead); X if((deadyet ==0) && (nx != (x-1))) X deadyet = fall(&mx,&my,x-1,y,sx,sy,screen,howdead); X if(deadyet ==0) X deadyet = fall(&mx,&my,x+1,y+1,sx,sy,screen,howdead); X if(deadyet ==0) X deadyet = fall(&mx,&my,x-1,y+1,sx,sy,screen,howdead); X if(deadyet ==0) X deadyet = fall(&mx,&my,x-1,y-1,sx,sy,screen,howdead); X if((deadyet ==0) && (ny != (y+1))) X deadyet = fall(&mx,&my,x,y+1,sx,sy,screen,howdead); X if((deadyet ==0) && (ny != (y-1))) X deadyet = fall(&mx,&my,x,y-1,sx,sy,screen,howdead); X if(deadyet ==0) X deadyet = fall(&mx,&my,x+1,y-1,sx,sy,screen,howdead); X move(16,0); X refresh(); X y = ny; X x = nx; X break; X case 'O': X if(screen[y][nx*2-x] == 'M') X { X screen[y][nx*2-x] = ' '; X mx = my = -1; X if(*bell) X printf("\007"); X *score+=100; X move(3,48); X sprintf(buffer,"%d\t %d\t %d ",*score,nf,diamonds); X (void) addstr(buffer); X draw_symbol(48,10,' '); X move(16,0); X refresh(); X } X if(screen[y][nx*2-x] == ' ') X { X screen[y][nx*2-x] = 'O'; X screen[y][x] = ' '; X screen[ny][nx] = '@'; X draw_symbol((x-sx+5)*3,(y-sy+3)*2,' '); X draw_symbol((nx-sx+5)*3,(ny-sy+3)*2,'@'); X draw_symbol((nx*2-x-sx+5)*3,(y-sy+3)*2,'O'); X if(deadyet==0) X deadyet = fall(&mx,&my,nx*2-x,y+1,sx,sy,screen,howdead); X if(deadyet==0) X deadyet = fall(&mx,&my,x*2-nx,y,sx,sy,screen,howdead); X if(deadyet==0) X deadyet = fall(&mx,&my,x,y,sx,sy,screen,howdead); X if(deadyet==0) X deadyet = fall(&mx,&my,x,y-1,sx,sy,screen,howdead); X if(deadyet==0) X deadyet = fall(&mx,&my,x,y+1,sx,sy,screen,howdead); X move(16,0); X refresh(); X y = ny; X x = nx; X } X break; X case '<': X case '>': X if(screen[ny*2-y][x] == 'M') X { X screen[ny*2-y][x] = ' '; X mx = my = -1; X if(*bell) X printf("\007"); X *score+=100; X move(3,48); X sprintf(buffer,"%d\t %d\t %d ",*score,nf,diamonds); X (void) addstr(buffer); X draw_symbol(48,10,' '); X move(16,0); X refresh(); X } X if(screen[ny*2-y][x] == ' ') X { X screen[ny*2-y][x] = screen[ny][nx]; X screen[y][x] = ' '; X screen[ny][nx] = '@'; X draw_symbol((x-sx+5)*3,(y-sy+3)*2,' '); X draw_symbol((nx-sx+5)*3,(ny-sy+3)*2,'@'); X draw_symbol((x-sx+5)*3,(ny*2-y-sy+3)*2,screen[ny*2-y][x]); X if(deadyet == 0) X deadyet = fall(&mx,&my,x,y,sx,sy,screen,howdead); X if(deadyet == 0) X deadyet = fall(&mx,&my,x-1,(ny>y)?y:(y-1),sx,sy,screen,howdead); X if(deadyet == 0) X deadyet = fall(&mx,&my,x+1,(ny>y)?y:(y-1),sx,sy,screen,howdead); X if(deadyet == 0) X deadyet = fall(&mx,&my,x-1,ny*2-y,sx,sy,screen,howdead); X if(deadyet == 0) X deadyet = fall(&mx,&my,x+1,ny*2-y,sx,sy,screen,howdead); X move(16,0); X refresh(); X y = ny; X x = nx; X } X break; X case '!': X strcpy(howdead,"an exploding landmine"); X deadyet = 1; X draw_symbol((x-sx+5)*3,(y-sy+3)*2,' '); X draw_symbol((nx-sx+5)*3,(ny-sy+3)*2,'@'); X move(16,0); X refresh(); X break; X case 'X': X if(nf == diamonds) X { X *score+=250; X if(*bell) X printf("\007"); X strcpy(howdead,"finishing the screen."); X return howdead; X } X break; X case 'T': X if(tx > -1) X { X screen[ny][nx] = ' '; X screen[y][x] = ' '; X lx = x; X ly = y; X y = ty; X x = tx; X screen[y][x] = '@'; X sx = x; X sy = y; X *score += 20; X display(sx,sy,frow,*score); X deadyet = fall(&mx,&my,nx,ny,sx,sy,screen,howdead); X if(deadyet == 0) X deadyet = fall(&mx,&my,lx,ly,sx,sy,screen,howdead); X if(deadyet == 0) X deadyet = fall(&mx,&my,lx+1,ly-1,sx,sy,screen,howdead); X if(deadyet == 0) X deadyet = fall(&mx,&my,lx+1,ly+1,sx,sy,screen,howdead); X if(deadyet == 0) X deadyet = fall(&mx,&my,lx-1,ly+1,sx,sy,screen,howdead); X if(deadyet == 0) X deadyet = fall(&mx,&my,lx-1,ly-1,sx,sy,screen,howdead); X move(16,0); X refresh(); X } X else X { X screen[ny][nx] = ' '; X printf("Teleport out of order"); X } X break; X case 'M': X strcpy(howdead,"a hungry monster"); X deadyet = 1; X draw_symbol((x-sx+5)*3,(y-sy+3)*2,' '); X move(16,0); X refresh(); X break; X case 'S': X strcpy(howdead,"walking into a monster"); X deadyet = 1; X draw_symbol((x-sx+5)*3,(y-sy+3)*2,' '); X move(16,0); X refresh(); X break; X default: X break; X } Xif((y == ny) && (x == nx) && (maxmoves>0)) X { X (void) sprintf(buffer,"Moves remaining = %d ",--maxmoves); X move(15,48); X (void) addstr(buffer); X } Xif(maxmoves == 0) X { X addstr("You ran out of time! \007\007"); X refresh(); X } Xif ((x<(sx-3))&& (deadyet ==0)) /* screen scrolling if necessary */ X { X sx-=6; X if(sx < 4) X sx = 4; X display(sx,sy,frow,*score); X } Xif ((y<(sy-2))&& (deadyet == 0)) X { X sy-=5; X if(sy < 2) X sy = 2; X display(sx,sy,frow,*score); X } Xif ((x>(sx+3)) && (deadyet == 0)) X { X sx+=6; X if(sx>(ROWLEN -5)) X sx = ROWLEN -5; X display(sx,sy,frow,*score); X } Xif ((y>(sy+2))&& (deadyet ==0)) X { X sy+=5; X if(sy > (NOOFROWS-3)) X sy = NOOFROWS -3; X display(sx,sy,frow,*score); X } X X /* MONSTER SECTION - Put all these in a separate function later */ X Xif(mx == -2) /* has the monster been killed ? */ X { X *score+=100; X mx = my = -1; X move(3,48); X sprintf(buffer,"%d\t %d\t",*score,nf); X (void) addstr(buffer); X draw_symbol(48,10,' '); X move(16,0); X refresh(); X } Xif(mx != -1) /* no? then move that monster ! */ X { X screen[my][mx] = ' '; X if(mx>x) X xdirection = -1; X else X xdirection = 1; X if((my<(sy+4))&&(my>(sy-4))&&(mx<(sx+6))&&(mx>(sx-6))) X draw_symbol((mx-sx+5)*3,(my-sy+3)*2,' '); X if((hd = (mx-x))<0) X hd = -hd; X if((vd = (my-y))<0) X vd = -vd; X if((hd>vd)&&((screen[my][mx+xdirection] == ' ')||(screen[my][mx+xdirection] == '@'))) X mx+=xdirection; X else X { X if(my>y) X ydirection = -1; X else X ydirection = 1; X if((screen[my+ydirection][mx] == ' ')||(screen[my+ydirection][mx] == '@')) X my+=ydirection; X else X if((screen[my][mx+xdirection] == ' ')||(screen[my][mx+xdirection] == '@')) X mx+=xdirection; X } X if((my<(sy+4))&&(my>(sy-4))&&(mx<(sx+6))&&(mx>(sx-6))) X draw_symbol((mx-sx+5)*3,(my-sy+3)*2,'M'); X if(screen[my][mx] == '@') /* ha! gottim! */ X { X strcpy(howdead,"a hungry monster"); X move(16,0); X refresh(); X deadyet = 1; X screen[my][mx] = 'M'; X } X screen[my][mx] = 'M'; X move(16,0); X refresh(); X } X Xcurrent = monster = mon_ptr; Xwhile((monster != NULL)&&(!deadyet))/* deal with those little monsters */ X { X new_disp = new_direction(screen, monster->x, monster->y, monster->mx, monster->my ); X screen[monster->y][monster->x] = monster->under; X if((monster->y < (sy+4)) && (monster->y > (sy-4)) && (monster->x < (sx+6)) && (monster->x > (sx-6))) X draw_symbol((monster->x-sx+5)*3,(monster->y-sy+3)*2,monster->under); X if(monster->under == ' ') X deadyet = deadyet | fall(&mx,&my,monster->x,monster->y,sx,sy,screen,howdead); X monster->mx = new_disp.d[0]; X monster->my = new_disp.d[1]; X monster->x += monster->mx; X monster->y += monster->my; X monster->under = screen[monster->y][monster->x]; X screen[monster->y][monster->x] = 'S'; /* move into new space */ X if((monster->y < (sy+4)) && (monster->y > (sy-4)) && (monster->x < (sx+6)) && (monster->x > (sx-6))) X draw_symbol((monster->x-sx+5)*3,(monster->y-sy+3)*2,'S'); X if(monster->under == '@') /* monster hit you? */ X { X strcpy(howdead,"the little monsters"); X move(16,0); X refresh(); X deadyet = 1; X monster->under = ' '; X } X if(monster->under == '+') /* monster hit cage? */ X { X *score +=20; X if(*bell) X printf("\007"); X if(monster == mon_ptr) /* remove from chain */ X mon_ptr = mon_ptr->next; X else current->next = monster-> next; X screen[monster->y][monster->x] = '*'; X if((monster->y < (sy+4)) && (monster->y > (sy-4)) && (monster->x < (sx+6)) && (monster->x > (sx-6))) X draw_symbol((monster->x-sx+5)*3,(monster->y-sy+3)*2,'*'); X } X if(monster->under == 'S') X monster->under = ' '; X if(monster != mon_ptr) X current = current->next; X monster = monster->next; X move(16,0); X refresh(); X } Xif(deadyet != 0) X { X move(16,0); X addstr("You are dead, killed by "); X addstr(howdead); X addstr("\nPress any key to come back to life."); X refresh(); X ch = getchar(); X move(16,0); X addstr(" \n"); X addstr(" "); X move(16,0); X refresh(); X deadyet = 0; X } X} Xreturn(howdead); X} END_OF_FILE if test 14429 -ne `wc -c <'gamedev.c'`; then echo shar: \"'gamedev.c'\" unpacked with wrong size! fi # end of 'gamedev.c' fi if test -f 'helpscr.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'helpscr.c'\" else echo shar: Extracting \"'helpscr.c'\" \(9311 characters\) sed "s/^X//" >'helpscr.c' <<'END_OF_FILE' X#include "wand_head.h" X#include X X#define HELPFILE "wanderer.help" X Xstruct lh_f { X char *line; X struct lh_f *next; X struct lh_f *prev; X}; X Xstruct help_f { X int pgnum; /* the page number */ X struct lh_f *lh; /* long help */ X struct help_f *next; X struct help_f *prev; X}; X X#define new(type) (type *) malloc(sizeof(type)); X#define cll_insert(member, list) (member->next = list, \ X member->prev = list->prev, \ X list->prev->next = member, \ X list->prev = member) Xchar *make_filename(); X X#ifdef XWANDER Xextern struct fontinfo *tablefont; Xextern tablefonthigh; Xextern tablefontwide; Xextern tablefonta; Xextern GC tablegc; X#endif X Xstruct help_f *helpscr = NULL; Xstruct help_f *s_helppage = NULL; Xchar *movekeys; X Xdo_help(keys) Xchar *keys; X{ X#ifndef XWANDER X WINDOW *win; X int rows = 24; X#else X int rows = (ICON_HIGH * 7) / tablefonthigh; X#endif X struct lh_f *p; X int y, ch; X int done; X char lastline[255]; X X movekeys = keys; X if (helpscr == NULL) parse_help(); X if (helpscr == NULL) return; X s_helppage = helpscr->next; X if (s_helppage == helpscr) s_helppage = helpscr->next; X X#ifndef XWANDER X win = newwin(rows-1, COLS, 0,0); /* window which gets the data */ X wclear(win); X clearok(win,1); X wrefresh(win); X#else X XClearArea(dpy,win,5,5,ICON_WIDE*11,ICON_HIGH*7,0); X erase_message(0); X erase_message(1); X#endif X X y = 0; X for ( p = s_helppage->lh->next; ; p=p->next) { X eswprint(win,y++,p->line); X if (y == rows-5 || p->next == s_helppage->lh) { X lastline[0] = 0; X if (s_helppage != helpscr->next) strcat(lastline,"<-"); X else strcat(lastline," "); X strcat(lastline," "); X if (s_helppage != helpscr->prev) strcat(lastline,"->"); X else strcat(lastline," "); X strcat(lastline," "); X if (p->next != s_helppage->lh) { X strcat(lastline,"-MORE-"); X strcat(lastline," for more,"); X } else { X strcat(lastline," "); X } X strcat(lastline," 'n' next page, 'p' previous page, end HELP."); X#ifndef XWANDER X wmove(win, rows-2, 1); X waddstr(win, lastline); X touchwin(win); X wrefresh(win); X#else X table_message(rows-2, lastline); X#endif X X done = 0; X while(!done) { X#ifndef XWANDER X ch = getchar(); X#else X ch = getchar(-1); X#endif X switch(ch) { X case ' ': /* space - continue */ X#ifndef XWANDER X wclear(win); X#else X XClearArea(dpy,win,5,5,ICON_WIDE*11,ICON_HIGH*7,0); X#endif X y = 1; X if (p->next == s_helppage->lh X && s_helppage->lh->next != helpscr->lh) { X s_helppage = s_helppage->next; X if (s_helppage == helpscr) s_helppage = helpscr->next; X p = s_helppage->lh; X y = 0; X } X done = 1; X break; X case 13: /* ctrl-M, , ctrl-J */ X case 10: X case 'n': X case 'N': X#ifndef XWANDER X wclear(win); X#else X XClearArea(dpy,win,5,5,ICON_WIDE*11,ICON_HIGH*7,0); X#endif X y = 0; X s_helppage = s_helppage->next; X if (s_helppage == helpscr) s_helppage = helpscr->next; X p = s_helppage->lh; X done = 1; X break; X case 'p': /* 'P', 'p' or '-' = previous page */ X case 'P': X case '-': X#ifndef XWANDER X wclear(win); X#else X XClearArea(dpy,win,5,5,ICON_WIDE*11,ICON_HIGH*7,0); X#endif X y = 0; X s_helppage = s_helppage->prev; X if (s_helppage == helpscr) s_helppage = helpscr->prev; X p = s_helppage->lh; X done = 1; X break; X case 27: /* esc - abort */ X#ifndef XWANDER X delwin(win); X touchwin(stdscr); X clearok(stdscr,1); X refresh(); X#else X XClearArea(dpy,win,5,5,ICON_WIDE*11,ICON_HIGH*7,0); X#endif X return; X default: X dobeep(); X } X } X } X } X} X Xparse_help() X{ X FILE *inp; X char buf[1024], buf2[1024]; X int lineno, pgnum, n, i; X struct help_f *th; X struct lh_f *tl; X char *p; X strcpy(buf,make_filename(SCREENPATH,HELPFILE)); X X if ((inp = fopen(buf,"r")) == NULL) { X#ifdef XWANDER X message(0,"Cannot open help file \"%s\"",buf); X#else X fprintf(stderr,"Cannot open help file \"%s\"",buf); X#endif X helpscr = NULL; X return; X } X X pgnum = 0; X lineno = 0; X X /* allocate the header node of the adeck list */ X helpscr = new(struct help_f); X helpscr->next = helpscr; X helpscr->prev = helpscr; X X while (!feof(inp)) { X if (fgets(buf,1024,inp) == NULL) X break; X lineno++; X p = buf; X /* blow off white space */ X for (;isspace(*p);p++); X /* did we use up all of our line ? */ X if (*p == '#' || *p == 0 || *p == '\n') X continue; X X /* look for key word */ X if (*p == '$') { X if (strncmp(p,"$PAGE",5) == 0) { /* got the $PAGE token */ X /* allocate the page */ X th = new(struct help_f); X pgnum++; X th->pgnum = pgnum; /* set page number */ X th->lh = new(struct lh_f); /* allocate new long-help header node */ X th->lh->next = th->lh; /* init new long-help header node */ X th->lh->prev = th->lh; X cll_insert(th,helpscr); /* insert page */ X while (1) { /* get the rest of the long-help */ X if (fgets(buf,1024,inp) == NULL) { X#ifdef XWANDER X message(0, "Illegal help file (no $END). Page: %d, Line: %d.",pgnum,lineno); X#else X fprintf(stderr,"Illegal help file (no $END). Page: %d, Line: %d.",pgnum,lineno); X#endif X helpscr = NULL; X fclose(inp); X return; X } X#ifdef XWANDER X if (strncmp(buf,"$C",2)==0) continue; /* ignore $C */ X if (strncmp(buf,"$X",2)==0) { X buf[0] = ' '; X buf[1] = ' '; X } X#else X if (strncmp(buf,"$X",2)==0) continue; /* ignore $X */ X if (strncmp(buf,"$C",2)==0) { X buf[0] = ' '; X buf[1] = ' '; X } X#endif X X lineno++; X p = buf; X if (strncmp(buf,"$END",4) == 0) { X if (th->lh->next == th->lh) { X#ifdef XWANDER X message(0, "Illegal help file (null page). Page: %d, Line: %d.",pgnum,lineno); X#else X fprintf(stderr,"Illegal help file (null page). Page: %d, Line: %d.",pgnum,lineno); X#endif X helpscr = NULL; X fclose(inp); X return; X } X break; /* done with this page */ X } else { X tl = new(struct lh_f); /* new line struct */ X buf[strlen(buf)-1] = 0; /* clobber trailing null */ X tl->line = (char *)strcpy(malloc(strlen(buf)+1),buf); X cll_insert(tl,th->lh); /* insert line */ X } X } X } else { X#ifdef XWANDER X message(0,"Illegal help file (Unknown token). Page: %d, Line: %d.",pgnum,lineno); X#else X fprintf(stderr,"Illegal help file (Unknown token). Page: %d, Line: %d.",pgnum,lineno); X#endif X fclose(inp); X helpscr = NULL; X return; X } X } else { X#ifdef XWANDER X message(0,"Illegal help file (Bad line). Page: %d, Line: %d",pgnum,lineno); X#else X fprintf(stderr,"Illegal help file (Bad line). Page: %d, Line: %d",pgnum,lineno); X#endif X helpscr = NULL; X fclose(inp); X return; X } X } X /* for (th = helpscr->next; th != helpscr; th=th->next) { X int n; X printf("help page: %d \"%s\"\n",th->pgnum, th->shorthelp); X n = 0; X for (tl = th->lh->next; tl != th->lh; tl=tl->next) { X printf("%2d: %s\n",n++, tl->line); X } X printf("---------------------------\n"); X } */ X} X X#ifndef XWANDER Xeswprint(win, y, line) XWINDOW *win; X#else Xeswprint(foo, y, line) X#endif Xint y; Xchar *line; X{ X char cp[3]; X char *p; X int x; X char ch; X#ifndef XWANDER X WINDOW *twin = stdscr; X X stdscr = win; X#endif X X p = line; X x = 0; X for (;*p;) { X ch = *p; X if (*p == '%') { X p++; if (*p == 0) break; X switch(*p) { X case '%': X break; X case 'L': /* direction keys */ X ch = movekeys[0]; X break; X case 'D': X ch = movekeys[1]; X break; X case 'U': X ch = movekeys[2]; X break; X case 'R': X ch = movekeys[3]; X break; X case 'N': X ch = s_helppage->pgnum + '0'; X break; X case '$': /* treasure */ X case '*': X case 'C': /* time capsule */ X case '@': /* player */ X case '#': /* rock */ X case '=': /* brick */ X case ':': /* dirt */ X case '!': /* landmine */ X case '+': /* cage */ X case '<': /* larrow */ X case '>': /* rarrow */ X case '\\': /* backslope */ X case '/': /* fwdslope */ X case 'T': /* Teleport */ X case 'O': /* boulder */ X case 'S': /* sprite */ X case 'X': /* Exit */ X case 'M': /* monster */ X xydrawsymbol(x,y,*p); X ch = 0; X break; X default: X fprintf(stderr,"illegal escape: %c\n",*p); X ch = *p; X break; X } X } X if (ch) xyprintchar(x,y,ch); X x++; X p++; X } X#ifndef XWANDER X stdscr = twin; X#endif X} X Xxyprintchar(x,y,ch) X{ X char buf[3]; X if (ch == ' ') return; X#ifndef XWANDER X move(y,x); addch(ch); X#else X buf[0] = ch; X buf[1] = 0; X XDrawImageString(dpy, win, tablegc,10+tablefontwide*x, X (tablefonthigh*y)+10+tablefonta, buf, 1); X#endif X} X Xxydrawsymbol(x,y,ch) X{ X#ifdef XWANDER X Pixmap p = (Pixmap) symbol_pixmap(ch); X GC g = (GC) symbol_gc(ch); X X XCopyArea(dpy, p, win, g, 0, 0, ICON_WIDE, ICON_HIGH, X x * tablefontwide + 10, y * tablefonthigh + 10); X#else X draw_symbol(x, y, ch); X#endif X} X Xstatic char make_filenamebuf[1024]; Xchar *make_filename(path,file) /* make a filepath from 'path' and 'file' */ Xchar *path, *file; X{ X strcpy(make_filenamebuf,path); X strcat(make_filenamebuf,"/"); X strcat(make_filenamebuf,file); X return(make_filenamebuf); X} END_OF_FILE if test 9311 -ne `wc -c <'helpscr.c'`; then echo shar: \"'helpscr.c'\" unpacked with wrong size! fi # end of 'helpscr.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'\" \(3555 characters\) sed "s/^X//" >'jump.c' <<'END_OF_FILE' X#include "wand_head.h" X Xvoid showpass(num) Xint num; X{ Xlong position; Xchar correct[20]; Xchar buffer[100]; XFILE *fp; Xchar ch; X#ifndef XWANDER Xmove(18,0); X#endif Xposition = PASSWD; Xwhile(position > 200000) X position -= 200000; Xif((fp = fopen("/usr/dict/words","r")) == NULL) X return; Xfseek(fp,position,ftell(fp)); Xwhile(fgetc(fp) != '\n'); Xfscanf(fp,"%s\n",correct); X /* read a word into correct */ Xfclose(fp); X#ifndef XWANDER X(void) sprintf(buffer,"\007The password to jump from level %d ( using ~ ) is : %s \n",num,correct); Xaddstr(buffer); Xaddstr("PRESS ANY KEY TO REMOVE IT AND CONTINUE \n"); Xrefresh(); X#ifndef XWANDER Xgetchar(); X#else Xgetchar(-1); X#endif Xmove(18,0); Xaddstr(" \n"); Xaddstr(" "); Xmove(18,0); Xrefresh(); X#else X message(0,"The password to jump from level %d ( using ~ ) is : %s\n", X num, correct); X message(1,"PRESS ANY KEY TO REMOVE IT AND CONTINUE"); X#ifndef XWANDER X (void)getchar(); X#else X (void)getchar(-1); X#endif X erase_message(0); X erase_message(1); X#endif X X} X Xint jumpscreen(num) Xint num; X{ Xchar word[20], X buffer[100], X correct[20]; Xint index=0, input; Xchar ch; Xlong position; XFILE *fp; X#ifndef XWANDER Xmove(16,0); Xsprintf(buffer,"Number of screen to jump to? (next is %d) :",num+1); Xaddstr("Please enter password of screen to jump to:"); Xrefresh(); X#else X message(1,"Please enter password of screen to jump to:"); X#endif X X#ifndef XWANDER Xwhile(((word[index++] = getchar()) != '\n')&&(index < 19)) X#else Xwhile(((word[index++] = getchar(-1)) != '\n')&&(index < 19)) X#endif X { X#ifndef XWANDER X addch(' '); X refresh(); X#else X ; /* NULL statement */ X#endif X } Xword[--index]='\0'; X#ifndef XWANDER Xmove(16,0); Xaddstr("Validating... "); Xrefresh(); X#else Xerase_message(0); Xmessage(0,"Validating..."); X#endif Xposition = PASSWD; Xwhile(position > 200000) X position -= 200000; Xif((fp = fopen("/usr/dict/words","r")) == NULL) X return 0; Xfseek(fp,position,ftell(fp)); Xwhile(fgetc(fp) != '\n'); Xfscanf(fp,"%s\n",correct); X /* read a word into correct */ X Xfclose(fp); X Xif(strcmp(word,MASTERPASSWORD) == 0) X { X#ifndef XWANDER X move(16,0); X sprintf(buffer,"Certainly master, but the correct word is %s. \n",correct); X addstr(buffer); X addstr("Press letter corresponding to desired level. (Or space to continue)"); X refresh(); X#else X message(0,"Certainly master, but the correct word is %s.",correct); X message(1,"Press letter corresponding to desired level. (Or space to continue)"); X#endif X#ifndef XWANDER X ch = getchar(); X#else X ch = getchar(-1); X#endif X num++; X input = ch - 'a' +1; X if(!(ch<'a') && !(ch>'z')) X num = input; X#ifndef XWANDER X move(16,0); X addstr(" "); X move(16,0); X refresh(); X#else X erase_message(0); X erase_message(1); X#endif X return num; X } X Xif(strcmp(correct,word) != 0) X { X#ifndef XWANDER X move(16,0); X addstr("\007INCORRECT! "); X refresh(); X#else X erase_message(0); X message(0,"INCORRECT!"); X dobeep(); X#endif X return num; X } X X#ifndef XWANDER Xmove(16,0); Xaddstr("Password Validated..... Jumping to next screen. "); Xrefresh(); X#else Xerase_message(0); Xmessage(0,"Password Validated..... Jumping to next screen."); X#endif X X/* if they match, return ++num */ X Xreturn ++num; X} END_OF_FILE if test 3555 -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'\" \(6750 characters\) sed "s/^X//" >'m.c' <<'END_OF_FILE' X#include "wand_head.h" X X#ifdef GAMEDEV Xchar *scrname = "screen"; X#endif X X X#ifdef XWANDER X# include X# define PROGNAME "sample program" X# define ICON_LABEL "sample" X# include "icons/wanderer_bm" X# define BITMAPDEPTH 1 Xextern int do_repaint; Xextern tinymode; XWindow win; /* window ID */ XDisplay *dpy; /* structure with display and screen info */ XGC globgc; Xint scr; /* screen number */ Xint endgame; X#endif X Xextern char *playscreen(); X Xextern int rscreen(); X X#ifndef GAMEDEV Xextern int savescore(); X#endif X X#ifdef XWANDER Xusage() X{ X fprintf(stderr,"usage: xwander -s -d display_name\n"); X fprintf(stderr,"\t-s\tprints high score table\n"); X fprintf(stderr,"\t-d\tspecify display name\n"); X} X#endif X Xmain(argc,argv) Xint argc; Xchar *argv[]; X{ Xchar screen[NOOFROWS][ROWLEN+1]; Xchar (*frow)[ROWLEN+1] = screen; Xint num = 1,score = 0,bell = 1,maxmoves = 0; Xchar howdead[25], X *name,*keys,*dead; Xchar *malloc(); X#ifdef XWANDER X int win_width, win_height, win_x, win_y; X int border_width = 2; X int display_width, display_height; X unsigned int icon_width, icon_height; X char *window_name = PROGNAME; X char *icon_name = ICON_LABEL; X Pixmap icon_pixmap; X XSizeHints size_hints; /* window manager hints */ X XIconSize *size_list; X int count; /* number of icon sizes set by wm */ X XEvent report; X char *display_name = NULL; X char *p; X X argc--; argv++; /* skip program name */ X while (argc > 0 && **argv == '-') /* until there are no more args */ X { X p = *argv; X if (strcmp("-display", p) == 0) { X display_name = *++argv; X printf("display = \"%s\"\n",display_name); X argc--; X } else { X for (p++; *p;p++) X { X switch(*p) { X case 'd': /* set display name */ X display_name = *++argv; X printf("display = \"%s\"\n",display_name); X --argc; X break; X#ifndef GAMEDEV X case 's': /* print scores */ X savescore("-",0,0,"-"); X return 0; X break; X#endif X#ifdef GAMEDEV X case 'n': /* name of screen to test */ X scrname = *++argv; X break; X#endif X default: X printf("xwanderer: bad option '%c'\n", *p); X usage(); X break; X } X } X argv++; X argc--; X } X } X X /* try to connect to display server */ X if (( dpy = XOpenDisplay(display_name)) == NULL) X { X fprintf(stderr,"Cannot Connect to display server!\n"); X exit(-1); X } X X /* get screen and size from display structure macros */ X scr = DefaultScreen(dpy); X X display_width = DisplayWidth(dpy,scr); X display_height = DisplayHeight(dpy,scr); X X win_x = 0; win_y = 0; X win_width = 1100; win_height = ICON_HIGH * 7 + 75; X X /* make window */ X win = XCreateSimpleWindow(dpy,RootWindow(dpy,scr), win_x, win_y, X win_width, win_height, border_width, WhitePixel(dpy,scr), X BlackPixel(dpy,scr)); X X /* get available icon sizes from window manager */ X /* if (XGetIconSizes(dpy,RootWindow(dpy,scr),&size_list,&count)==0) */ X /* I don't care if your window manager doesn't support 64x64--mine does. */ X icon_width = wanderer_bm_width; icon_height = wanderer_bm_height; X /* else X { X icon_width = size_list->min_width; icon_height = size_list->min_height; X } */ X /* create pixmap from bitmap data */ X icon_pixmap = MakePixmap(dpy,RootWindow(dpy,scr),wanderer_bm_bits, X icon_width, icon_height); X X /* initalize the hint prop. for wm */ X size_hints.flags = PPosition | PSize | PMinSize; X size_hints.x = win_x; X size_hints.y = win_y; X size_hints.width = win_width; X size_hints.height = win_height; X size_hints.min_width = 350; X size_hints.min_height = 100; X X /* set props. for wm (always before mapping) */ X XSetStandardProperties(dpy,win,window_name,icon_name,icon_pixmap, X argv,argc,&size_hints); X X /*select event types wanted */ X XSelectInput(dpy,win,ExposureMask | KeyPressMask); X X /* build the pixmaps for the game */ X build_pixmaps(); X X /* display the window! */ X XMapWindow(dpy,win); X X#else X# ifndef GAMEDEV Xif(argc > 1) X { X savescore("-",0,0,"-"); X return 0; X } X# else Xif (argc > 1) X { X scrname = argv[1]; X } X# endif X#endif X Xif((name = (char *)getenv("NEWNAME")) == NULL) X if((name = (char *)getenv("NAME")) == NULL) X if((name = (char *)getenv("FULLNAME")) == NULL) X if((name = (char *)getenv("USER")) == NULL) X name = "noname"; X Xif((keys = (char *)getenv("NEWKEYS")) == NULL) X { X keys = malloc(5); X strcpy(keys,"kjhl"); X } X X#ifndef XWANDER Xinitscr(); X X/* MAIN PROGRAM HERE */ X Xcrmode(); noecho(); X#endif X Xfor (;;) X { X int ch; X X#ifndef GAMEDEV X if (rscreen(num,frow,&maxmoves)) X { X strcpy(howdead,"a non-existant screen"); X break; /* really game over- leave the program and all! */ X } X#else X if (rscreen(scrname,frow, &maxmoves)) X { X fprintf(stderr,"dev: Can't find file `%s'\n",scrname); X#ifndef XWANDER X echo(); X nocrmode(); X endwin(); X#endif X exit(0); X }; X#endif X#ifdef XWANDER X do_repaint = 1; X tinymode = 0; X#endif X dead = playscreen(num,screen,&score,&bell,maxmoves,keys); X#ifdef GAMEDEV X if ((dead != NULL) && (*dead == '~')) X dead = NULL; X#else X if ((dead != NULL) && (*dead == '~')) X { X num = (int)(dead[1]) - 1; X dead = NULL; X } X#endif X if (dead != NULL) X { X strcpy(howdead,dead); X#ifdef XWANDER X /* we can't have this window based program going away every time X * we die. Ask the user if he wants to play again, but first X * do the end of game clean up type stuff X */ X erase_message(0); X erase_message(1); X message(0,"%s killed by %s with a score of %d on level %d.", X name,howdead,score,num); X endgame = 0; X XClearArea(dpy, win, 5, 5, ICON_WIDE * 11, ICON_HIGH * 7, 0); X# ifndef GAMEDEV X if((savescore(howdead,score,num,name) == 0)&&(score != 0)) X printf("\nWARNING: newgame error: score not saved!\n\n"); X# endif X message(1,"Would you like to play again? (Y/N)"); X while (1) { X ch = getchar(-1); X if (islower(ch)) ch = toupper(ch); X if (ch == 'Y' || ch == 'N') X break; X erase_message(1); X message(1,"You dolt, type `Y' or `N': "); X dobeep(); X } X if (ch == 'N') break; else { X num = 0; score = 0; maxmoves = 0; X howdead[0] = 0; X erase_message(0); X erase_message(1); X } X#else X break; X#endif X } X num++; X }; X#ifdef XWANDER X endgame = 1; X#endif X Xprintf("\n\n%s killed by %s with a score of %d on level %d.\n",name,howdead,score,num); X X/* END OF MAIN PROGRAM */ X X/* SAVE ROUTINES FOR SCORES */ X X#ifndef GAMEDEV Xif((savescore(howdead,score,num,name) == 0)&&(score != 0)) X printf("\nWARNING: newgame error: score not saved!\n\n"); X#endif X X#ifndef XWANDER Xecho(); Xnocrmode(); Xendwin(); X#endif Xprintf("WANDERER (C)1988 S. Shipway\n"); Xreturn 0; X} END_OF_FILE if test 6750 -ne `wc -c <'m.c'`; then echo shar: \"'m.c'\" unpacked with wrong size! fi # end of 'm.c' fi if test -f 'scores.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'scores.c'\" else echo shar: Extracting \"'scores.c'\" \(4206 characters\) sed "s/^X//" >'scores.c' <<'END_OF_FILE' X#include "wand_head.h" X X/* MFC- lockfiles fixed: tries 5 times to get lock, with 1 second between X * tries, if after 5 seconds, no lock is gained, the lockfile is blown X * away. X */ X#define LOCK { lc=5; \ X while((lock = creat(LOCKPATH,0)<0 && lc)) { \ X sleep(1); lc--; } \ X } X#define UNLOCK (void) unlink(LOCKPATH) X X#define ENTRIES 15 X Xtypedef struct X { X char howdead[25]; X char name[20]; X int score; X int level; X } score_entry; X X#ifdef XWANDER Xextern endgame; Xwin_show_scores(table,num) Xscore_entry *table; Xint num; X{ X int tot = num; X Xtable_message(0,"No. Score Level Names How they died"); Xtable_message(1,"-----------------------------------------------------------------------------"); Xwhile(num > 0) X { X num--; X table_message((tot-num)+1,"%2d %5d %3d %-20s killed by %-s",(tot - num),table->score,table->level,table->name,table->howdead); X table++; X } X} X#endif X Xvoid show_scores(table,num) Xscore_entry *table; Xint num; X{ Xint tot = num; X#ifdef XWANDER X if (!endgame) { win_show_scores(table, num); return; } X#endif Xprintf("\nNo. Score Level Names How they died\n"); Xprintf("=============================================================================\n"); Xwhile(num > 0) X { X num--; X printf("%2d %5d %3d %-20s killed by %-s\n",(tot - num),table->score,table->level,table->name,table->howdead); X table++; X } Xprintf("\n\n"); X} X Xint readtable(table_ptr) Xscore_entry *table_ptr; X{ XFILE *fp; Xint numread; Xif((fp = fopen(HISCOREPATH,"r")) == NULL) X { X numread = 0; X } Xelse X { X numread = fread(table_ptr, sizeof(score_entry), ENTRIES, fp); X fclose(fp); X } Xreturn numread; X} X Xint savescore(howdead,score,level,name) Xchar *howdead, *name; Xint score,level; X{ X int lc; Xscore_entry table[ENTRIES + 2], X *table_ptr = table, *from_ptr, X new_entry,temp_entry; Xint numread,index = 1, numsaved, lock, already = 0, output_value = 1; XFILE *fp; Xstrncpy(new_entry.howdead,howdead,25); Xstrncpy(new_entry.name,name,20); Xnew_entry.score = score; Xnew_entry.level = level; Xlock = (-1); Xwhile (lock == (-1)) { X LOCK; X if (lock==(-1)) { UNLOCK; } X} Xnumread = readtable(table_ptr); Xif (numread > 0) X if(table[numread-1].score > 99999) /* stop system errors messing it up*/ X { X numread--; X printf("\007Erasing spurious entry in table.\n"); X } Xif(score == 0) X { X show_scores(table,numread); X UNLOCK; X return 0; X } Xif (numread > 0) { X numread++; /* scan through until correct insertion point */ X while((table_ptr->score > score)&&(index < numread)) X { X if(strcmp(table_ptr->name,name)==0) { X already= 1; X break; X } X table_ptr++; X index++; X } X if(table_ptr->score == score) X while((table_ptr->level>level)&&(index<=numread)&&(table_ptr->score == score)) X { X if((already == 1)||(strcmp(table_ptr->name,name)==0)) { X already= 1; X break; X } X table_ptr++; X index++; X }; X if(already == 0) { /* provided no previous hiscore */ X temp_entry = *table_ptr; /* insert new entry */ X *table_ptr = new_entry; X from_ptr = table_ptr; X if (strcmp(temp_entry.name, name) == 0) X numread--; /* new entry directly replaces old one */ X } else { X numread--; X from_ptr = table_ptr--; X temp_entry = *from_ptr; X } X while(index++ < numread) X { X table_ptr++; X from_ptr++; X if(strcmp(from_ptr->name,name)==0 && index ENTRIES) ? ENTRIES : numread ); Xfp = fopen(HISCOREPATH,"w"); Xtable_ptr = table; Xnumsaved = fwrite(table_ptr, sizeof(score_entry), numread, fp); Xchmod(HISCOREPATH,0666); Xif(numsaved < numread) X { X printf("ERROR! Only %d items saved from %d !\n",numsaved,numread); X output_value = 0; X } Xfclose(fp); XUNLOCK; Xshow_scores(table,numsaved); Xreturn output_value; X} END_OF_FILE if test 4206 -ne `wc -c <'scores.c'`; then echo shar: \"'scores.c'\" unpacked with wrong size! fi # end of 'scores.c' fi if test -f 'wanderer.help' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'wanderer.help'\" else echo shar: Extracting \"'wanderer.help'\" \(3799 characters\) sed "s/^X//" >'wanderer.help' <<'END_OF_FILE' X# X# this is the help file for 'wanderer'. X# it consists of pages of help bracketed by X# '$PAGE' and '$END' directives. X# There are several printf style escapes X# they are: X# %U %D %L %R - the movement command keys X# %[any icon character] - draw that icon X# %N - page number X# This help file should live with the screens. X# if a line begins with $X, it will only be present in the X# X windows versions of the program. Likewise, if X# a line begins with $C, it will only be printed in X# the curses versions. X# X# (C)1988 Mike Cuddy X# X$PAGE X ** W A N D E R E R ** X XHow to play: X %* X Collect all the treasure: X X$X X$X X %X X Then go through the exit: X X$X X$X X X Keys are: %L Left 1 Loud X %D Down 0 Quiet <- Very useful! X %U Up q Quit game X %R Right ~ Jump level. NB This means you do not X***-->> ! Look at map receive your bonus! X$X t tiny mode (xwanderer only) X X$END X$PAGE X WANDERER HELP, PAGE %N X Screen Items: X X This is You: X$X X %@ X X$X X$X X$X X X %# %= %C X Solid rock Time capsule X (5 points, 250 moves) X$X X$X X X %: X Passable earth (dirt, one point) X X$X X$X X %O X Boulder (falls down, boulders and arrows fall off it) X X$END X$PAGE X WANDERER HELP, PAGE %N X More Screen Items: X$X X$X X$X X X X %< %> Arrows %+ Cage- holds baby monsters X (run left and right) and changes into treasure X X$X X$X X X %* (10 points) %S X Money (collect it) Baby monster (kills you) X X X$X X %! When a baby monster hits a cage X Instant annihilation it is captured and you get 50 X points. Also the cage becomes X a treasure. X X$END X$PAGE X WANDERER HELP, PAGE %N X Other items are: X X$X X$X X$X X X %\ %/ Slopes %M Monster X (boulders etc slide off) (eats you up whole. X Yum yum yum. ) X 100 points for killing X with a rock or arrow X$C%X X$C The exit. Collect all the X$X%X The exit. Collect all the X treasure first. (250 point bonus) X X$X X$X X %T X$X X Teleport (50 points for using it) X X X$END X$PAGE X WANDERER HELP, PAGE %N X Thanx-n-hints X$C X$C X XV11R2 port/helpscreens by: Mike Cuddy (ihnp4!convex!cuddy) X Thanx to : Mark (mjs@opal) for curing the bus error X James Beckett(cstrhey) for designing screens 5 and 6 X Mike Taylor(maujf) for helpful suggestions X$C X$C X YOU CAN DEFINE YOUR OWN KEYS BY USING THE ENVIRONMENT VARIABLE X 'NEWKEYS'. TO GET a UP z DOWN n LEFT m RIGHT ADD IN YOUR .cshrc X setenv NEWKEYS aznm X YOU CAN ALSO CHANGE YOUR NAME USING THE VARIABLE 'NEWNAME' IN THE X SAME WAY. X To see the hiscore table only, use '-s'. X$END END_OF_FILE if test 3799 -ne `wc -c <'wanderer.help'`; then echo shar: \"'wanderer.help'\" unpacked with wrong size! fi # end of 'wanderer.help' fi echo shar: End of archive 2 \(of 5\). cp /dev/null ark2isdone 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