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# : :<<====O : ==== =
X# = =O*=** = ::<== =
X# = ====== : ===== =====O : : :== =
X#*= =*=**======O O= ============= =
X#==*:=O= O :: ::**= =*::::* ::O<
X#***= : =*=O====\ \ ======= *=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