Path: utzoo!attcan!uunet!tektronix!tekgen!tekred!games From: games@tekred.TEK.COM Newsgroups: comp.sources.games Subject: v05i003: wanderer - mini rogue-like adventure game, Part02/02 Message-ID: <2770@tekred.TEK.COM> Date: 6 Jul 88 00:15:13 GMT Sender: billr@tekred.TEK.COM Lines: 930 Approved: billr@saab.CNA.TEK.COM Submitted by: Steven Shipway Comp.sources.games: Volume 5, Issue 3 Archive-name: wanderer/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_Makefile' X# Makefile for wanderer - modified by Bill Randle 6/30/88 X XOBJ = jump.o display.o icon.o game.o read.o fall.o scores.o XDEVOBJ = display.o icon.o gamedev.o fall.o X XCFLAGS = -O XLIBS = -lcurses -ltermcap X Xall: wanderer dev erase X @echo DONE X Xwanderer: $(OBJ) m.c X cc $(CFLAGS) -o wanderer m.c $(OBJ) $(LIBS) X X$(OBJ): wand_head.h X Xdev: $(DEVOBJ) mdev.c X cc $(CFLAGS) -o dev mdev.c $(DEVOBJ) $(LIBS) X Xerase: wand_head.h X cc $(CFLAGS) -o erase erase.c END_OF_Makefile if test 446 -ne `wc -c display.c <<'END_OF_display.c' X#include "wand_head.h" X Xvoid map(row_ptr) Xchar (*row_ptr)[ROWLEN+1]; X{ Xint x,y; Xchar ch; 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(void) getchar(); 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} 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 move(0,0); X addstr("+---------------------------------+"); X move(15,0); X addstr("+---------------------------------+"); X for(y=(cy-3);y<=(cy+3);y++) X { 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 } X else X { 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 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 { 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 move(16,0); X refresh(); X} END_OF_display.c if test 2076 -ne `wc -c erase.c <<'END_OF_erase.c' X#include "wand_head.h" X X#define LOCK while((lock = creat(LOCKPATH,0)) < 0) X#define UNLOCK (void) unlink(LOCKPATH) 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 Xvoid show_scores(table,num) Xscore_entry *table; Xint num; X{ Xint tot = num; Xprintf("\nNo. Score Level Name How he died\n"); Xprintf("=============================================================================\n"); Xwhile(num > 0) X { X num--; X printf("%2d %5d %3d %-20s was 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 Xvoid delete_entry(num) Xint num; X{ Xscore_entry table[ENTRIES + 22], X *table_ptr = table, X new_entry,temp_entry; Xint numread,index = 1, numsaved, lock, output_value = 1; XFILE *fp; XLOCK; Xnumread = readtable(table_ptr); Xif (numread == 0) { X printf("\007Missing or unreadable hiscore table.\n\n"); X UNLOCK; X exit(1); X} Xif (num > numread) { X printf("\007Invalid entry, choose again\n"); X UNLOCK; X return; X} Xwhile(index < num) X { X index++; X table_ptr++; X } Xwhile(index < numread) X { X index++; X *table_ptr = *(table_ptr+1); X table_ptr++; X } Xnumread--; 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); X} X Xmain() X{ Xint erasenum,numread; Xscore_entry table[ENTRIES + 2], X *table_ptr = table; Xnumread = readtable(table_ptr); Xshow_scores(table,numread); Xprintf("\n"); Xfor(;;) X{ Xprintf("Number to erase (0 to exit): "); Xscanf("%d",&erasenum); Xprintf("\n"); Xif(erasenum == 0) X break; Xdelete_entry(erasenum); Xprintf("\n"); X} Xprintf("Byee!\n"); X} END_OF_erase.c if test 2207 -ne `wc -c icon.c <<'END_OF_icon.c' X#include "wand_head.h" X Xvoid draw_symbol(x,y,ch) Xint x,y; Xchar ch; X{ X char icon[2][4], X (*iconrow)[4] = icon; X switch(ch) X { X case ' ': X strcpy((*iconrow++)," "); X strcpy((*iconrow)," "); X break; X case '#': X strcpy(*iconrow++,"###"); X strcpy(*iconrow,"###"); X break; X case '<': X strcpy(*iconrow++,"<--"); X strcpy(*iconrow,"<--"); X break; X case '>': X strcpy(*iconrow++,"-->"); X strcpy(*iconrow,"-->"); X break; X case 'O': X strcpy(*iconrow++,"/^\\"); X strcpy(*iconrow,"\\_/"); X break; X case ':': X strcpy(*iconrow++,". ."); X strcpy(*iconrow," . "); X break; X case '/': X strcpy(*iconrow++," _/"); X strcpy(*iconrow,"/ "); X break; X case '\\': X strcpy(*iconrow++,"\\_ "); X strcpy(*iconrow," \\"); X break; X case '*': X strcpy(*iconrow++,"/$\\"); X strcpy(*iconrow, "\\$/"); X break; X case '=': X strcpy(*iconrow++,"=-="); X strcpy(*iconrow, "-=-"); X break; X case '@': X strcpy(*iconrow++," o "); X strcpy(*iconrow, "<|>"); X break; X case 'T': X strcpy(*iconrow++,"(*)"); X strcpy(*iconrow, "(*)"); X break; X case 'X': X strcpy(*iconrow++,"Way"); X strcpy(*iconrow, "Out"); X break; X case '!': X strcpy(*iconrow++," I "); X strcpy(*iconrow, " o "); X break; X case 'M': X strcpy(*iconrow++,"}o{"); X strcpy(*iconrow, "/^\\"); X break; X case 'S': X strcpy(*iconrow++,"-o-"); X strcpy(*iconrow, "/*\\"); X break; X case 'C': X strcpy(*iconrow++," "); X strcpy(*iconrow, ""); X break; X case '+': X strcpy(*iconrow++,"TTT"); X strcpy(*iconrow, "III"); X break; X default: X strcpy(*iconrow++,"OOO"); X strcpy(*iconrow, "OOO"); X break; X }; X move(y+1,x+1); X iconrow--; X addstr(*iconrow++); X move(y+2,x+1); X addstr(*iconrow); X} END_OF_icon.c if test 2089 -ne `wc -c m.c <<'END_OF_m.c' X#include "wand_head.h" X Xextern char *playscreen(); X Xextern int rscreen(); X Xextern int savescore(); 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 Xif(argc > 1) X { X savescore("-",0,0,"-"); X return 0; X } 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 Xinitscr(); X X/* MAIN PROGRAM HERE */ X Xcbreak(); noecho(); X Xfor (;;) X { X if (rscreen(num,frow,&maxmoves)) X { X strcpy(howdead,"a non-existant screen"); X break; X }; X dead = playscreen(num,screen,&score,&bell,maxmoves,keys); X if ((dead != NULL) && (*dead == '~')) X { X num = (int)(dead[1]) - 1; X dead = NULL; X } X if (dead != NULL) X { X strcpy(howdead,dead); X break; X } X num++; X }; 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 Xif((savescore(howdead,score,num,name) == 0)&&(score != 0)) X printf("\nWARNING: newgame error: score not saved!\n\n"); X Xecho(); Xnocbreak(); Xendwin(); Xprintf("WANDERER (C)1988 S. Shipway\n"); Xreturn 0; X} END_OF_m.c if test 1486 -ne `wc -c read.c <<'END_OF_read.c' X#include "wand_head.h" X Xint rscreen(num,row_ptr,maxmoves) Xint *maxmoves, num; Xchar (*row_ptr)[ROWLEN+1]; X{ Xint y; XFILE *fp; Xchar name[50]; Xsprintf(name,"%s/screen.%d",SCREENPATH,num); Xfp = fopen(name,"r"); Xif(fp == NULL) X printf("File for screen %d unavailable.\n\n",num) ; Xelse X { X for(y = 0;yscreens/screen.1 <<'END_OF_screens/screen.1' X=O=====================\OOO*OOOO/#OO#### X*O O:# O/ \OOOOOO/# ::A**# X# O #### #:# **/ \OOOO/ ###### X# # O *#:# \OO/ ## - X# #* * ###:# OOO @ O/ ## - X# ######:::#***** :/ *###* O - X# #* *<*###*< - X#*#! ### \ *###* - X### ! :: \ ## - X# # \ /=O= :::: \O / O/ X#* O O = :: / \* / */- X### #***# = / \ O/ - XX < !!! #\*/# = / O*O*O*O - X>* * *< # # = / =**O*O= - X !!! ! !# #! =! \ / =:O*O:= - X ! *#T#*:::::\**/ =::::::*- X######################################## X2000 END_OF_screens/screen.1 if test 702 -ne `wc -c screens/screen.10 <<'END_OF_screens/screen.10' X OOOOO OC >O X ! === :OO:: /\ >O X !O!!!!=== =*= :: / *O X /=== = = = = =*= *O X ! = = =+= = = \=/ >O X \==== = === == S O X * ==== = + O: X = S ====== : :/ X == ===== ::: / - X === /\ : ===== : - X /==\ ==+X! :=S S= \ - X ======= =S *! :: * = - X = S S = == ===O=: ===== - X== ! = = := \ - XC+ = OOO== =:= * \ - XC+ @* *** +=: \ - X######################################## X25 END_OF_screens/screen.10 if test 700 -ne `wc -c screens/screen.11 <<'END_OF_screens/screen.11' XS >S \ # O S D S - X .NOtE: \: # # O # I m - X No EXIt! \< ># # O E O - X S S # # S R - X= # t = XS this screen is not yet a S X written! dont bother L - X :: S:=) S : + +*+- X /=\ # signed, S \< +*++ *- X /* *\#>: Ssteven, master of + * +- X !* *! SWaNDERER! S +*+ +- X ::@:: O S S - X######################################## END_OF_screens/screen.11 if test 697 -ne `wc -c screens/screen.12 <<'END_OF_screens/screen.12' X==/*<OO O / =* X+ :\ :<## *OO : O< X/ *: :: /==*OO X === ===\ / + /* :OO X * + =S S= / / \===:## X \ / *S = / *=:## X =*= * *@*=== O * =::<# X = ::== * : O \<# X /:<<: = ==== =+= \ # X :<<: ===* ::::: \ O:< X */ :<<: \ *:* X :: * ! X**= ::::::::: / ! \ - XS:* : ::+: /##>T X## \* X: * = : :::: /##*#######A * \ X :* S ::*:/# *<<<<<<<<< X######################################## END_OF_screens/screen.12 if test 697 -ne `wc -c screens/screen.13 <<'END_OF_screens/screen.13' XOOO#*# @ XOOO:*# - XT::::# O O O O O O: - X###\O# /: =========O= - XS : >: \ : : - X / \ # ++++++++++ - XS >>>>/ O # +========+ - X \ #< +# O+ - XS : \ +#A######+ - X S S S S S S S S S:<<< +# #+ - XS S################### +###### #+ - X S S S S S S S S S# +#OOOOO #+ - XS # +#X:::: #+ - X !*!*!*!******!*!*!*! # +========+ - XS ++++++++++ - X S S S S S S S S S S S - X######################################## END_OF_screens/screen.13 if test 697 -ne `wc -c screens/screen.2 <<'END_OF_screens/screen.2' XC O OOO ## \OOO*OOOO/ O * X * *# \OOOOOO/ > A X#! / # \OOOO/ - X O / O *<\OO/ =*==\ - X\O< / : :O/!!! O\*/ X>O / / := - X#O\ / = * - X#O / @ \ ==== X#O / O *< \ - X** : / - X====/ / - X \ / - XX! \ *\ / - X! /!!!*/!!!!!/*< / * - X>* \!!!/ !!\ / - X* * *\ */T * X######################################## X350 END_OF_screens/screen.2 if test 701 -ne `wc -c screens/screen.3 <<'END_OF_screens/screen.3' X ====>*O O< /O: - X * :* *< / *< O X##< / *<\ O/ X* O< O/* X######## #\ ### OO====== O/ O XAOO*OOO/*<<# */ **/ */ X\OO!OO/: *# /\ O#: * / - X*\OOO/::\* /#O\ / :#\ / - X \O/ @ * /O*<#* OO# \ / \- X* ::: * #O< ##\O# \**/ !* X ::/:O# # O * : */ >< !! X /# * :##O## ######O \ * X ###\ ::::#O#: :::::::::#####::#### X::OOO# ::::#:::::/>>::O /##O*O:*::O*O X::*OOO ::::!:#*## ##/*T* X# O:*::*::O:* X######################################## X750 moves END_OF_screens/screen.3 if test 707 -ne `wc -c screens/screen.4 <<'END_OF_screens/screen.4' XX#O# * O X*#: O O O *<<<<<<<<< X #\ : ## - X##A# * \ #* - X !* >O< \ # \ - X !! * \ \ - X #O# \ < O != \ < - X *< > * *= - X* *# = >/ - X O @ # - X == \ \< - X O *## \ > - X>/\ #* : / X \* # == \ / O<# X \< \ = = *\ / :O# X*! \< !*! = M\*!*! =::T X######################################## END_OF_screens/screen.4 if test 697 -ne `wc -c screens/screen.5 <<'END_OF_screens/screen.5' XX##O#:::/O*#*#*## *#O#*#*#*#*#*#*#*##**# X*#::::# : :<#>>O # X #######:#: : :#:: : #########>:::::# X #*#**#**::::::::# #OO :O *#>:::::# X* ##O#*######:### #*O /####*###### X<<<<<::::::O# *< **# OOO O# X>::: *# ::########!*****# X## / : #O## /### X#/ *<# ##*# X/ * # X O\ \ # #*# X O/ /\ ##*** : \ ## X*/ /##:::##>*: : \ : # X/**/\ ##*:#:*#**# \ O<# X*>/!! ##*#/:<<#***# />:: \ :O# XA/*****# #***@#*#*# ! *\:*T X######################################## END_OF_screens/screen.5 if test 697 -ne `wc -c screens/screen.6 <<'END_OF_screens/screen.6' X###O#######################*############ X#*>:* ::::= O=*OO :<<>>>::::=== = = X======= X# =\ / ! O :<*= >OO/=====/ * O< X#O==*/* :<<<<<<====== :*=O* O* =O= X#O===============O=**=======::O== ::= X#: : :<<*=O= : == :* == = X# :>>:***=>\OO O<====:@=O= X# *>: : ==****=A=T*****<<<==* :<<= X######################################## X2000 END_OF_screens/screen.6 if test 702 -ne `wc -c screens/screen.7 <<'END_OF_screens/screen.7' XX M X = = == - X = O= = O: : - X ==== = == - X = =*A= - X === == - X O * OOOO X # # # ## # * \OO/ X ## ## # # ## #*< # # * \O= X # # * O # ## # #*# # /=O= X # # # # # # # ## # O O= X # # # # ## T # # /* ** X / === X / - X >< / - X COO! / @ X######################################## END_OF_screens/screen.7 if test 697 -ne `wc -c screens/screen.8 <<'END_OF_screens/screen.8' X!\ ! /\ * >>OOOO*OOOOOM X! \! !XA! >>>OOOOOOOOOO X! ! \/ >>>>OOOOOOOO< X O >>>>>OOOOOO<< X!= /== /= /=\ !=\ != * >>>>>OOOOO<<* X! ! ! ! ! ! ! ! * >>>>//OOO<<<< X!= \=\ ! !=! !=/ != * OO<<<<< X! ! ! ! ! ! ! :<<<<<< X!= ==/ \= ! ! ! != * *O<<<<< X :O<<<< X * # # # # # # ! :\<<< X # # # # # # # # ! \ \<< X ### ### ### ### ! \ \< X # # # # # # # # \ - X # # # # # # # # ! - XT @ * X######################################## END_OF_screens/screen.8 if test 697 -ne `wc -c screens/screen.9 <<'END_OF_screens/screen.9' X**********= >* \>* \>* \>* *< O XOOOOOOOOOO== O O := @/ X::::O::O::O ===:=:=:=:=:=:=: /- X::::*::*=== O :OO /*T X===:::::::= ================: /OO: /:O/ X::::==== =: ! :: / /* X::=:*= = =O==O==O==O==O==O== /< - X::O<:= O==*O::::::::::::::::: /: *\ / X: O :=::O:==X :: =!*! X::/::=::O::============================= X:A:===:/O=:=:::<=O=O=O=O=O=O=O=:=####### X>::**=***=:::O:::::::*:*:*:*:*:*<## # X# ###########:/#################### ## # X# # # X###########::::###################### :# X* * * * * >>>>:: M >/# X######################################## X2001 END_OF_screens/screen.9 if test 702 -ne `wc -c wand_head.h <<'END_OF_wand_head.h' X#include X#include X#include X X#define ROWLEN 40 X#define NOOFROWS 16 X X#define SCREENPATH "/usr/net/games/lib/wanderer" X#define HISCOREPATH "/usr/net/games/lib/wanderer/hiscores" X#define LOCKPATH "/tmp/wanderer.lock" X X#define MASTERPASSWORD "squiggly worms" X X#define PASSWD (num * num * 4373 + num * 16927 + 39) END_OF_wand_head.h if test 340 -ne `wc -c