billr@saab.CNA.TEK.COM (Bill Randle) (07/06/89)
Submitted-by: "Philip A. Cordier" <philc@sco.COM> Posting-number: Volume 7, Issue 4 Archive-name: ularn/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 8)." # Contents: Makefile scores.c store.c # Wrapped by billr@saab on Thu Jun 29 08:10:19 1989 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'Makefile' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'Makefile'\" else echo shar: Extracting \"'Makefile'\" \(2733 characters\) sed "s/^X//" >'Makefile' <<'END_OF_FILE' X# your favorite compiler XCC = mcc X X# SYSV or BSD XUNIX = SYSV X#UNIX = BSD X X# location of data files XHOME = /v/philc/games/Ularn/lib X X# final location of binary (for 'make install') XBINDIR = . X X# user id of wizard (wizard password is defined in config.c) XWIZID = 1060 X X# name of program XGAME = Ularn X X# termlib options XTERMLIB = -ltermlib X X# program options XOPTIONS = -DWIZID=$(WIZID) -D$(UNIX) X X# compile flags XCFLAGS = -M3e -Ox -s $(OPTIONS) -DHOME=\"$(HOME)/\" X#CFLAGS = -M3e -g $(OPTIONS) -DHOME=\"$(HOME)/\" X X# link flags X#LDFLAGS= -s XLDFLAGS = X X# the object files XOBJ = bill.o config.o create.o data.o diag.o display.o fortune.o\ X global.o help.o io.o main.o monster.o moreobj.o movem.o object.o\ X regen.o savelev.o scores.o signal.o store.o tok.o nap.o X X# the source files XSRC = bill.c config.c create.c data.c diag.c display.c fortune.c\ X global.c help.c io.c main.c monster.c moreobj.c movem.c object.c\ X regen.c savelev.c scores.c signal.c store.c tok.c nap.c X X# the header file XHDR = header.h X XUTIL = to_ansi XUTIL_OBJ = to_ansi.o XUTIL_SRC = to_ansi.c X X########################################################################## X Xlove: $(GAME) X X$(GAME): $(OBJ) X $(CC) $(CFLAGS) $(LDFLAGS) $(OBJ) -o $(GAME) $(TERMLIB) X @ls -ls $(GAME) X @echo done X X.c.o: X $(CC) -c $(CFLAGS) $< X X$(OBJ): header.h X X$(UTIL): $(UTIL_OBJ) X $(CC) -o $(UTIL) $(UTIL_OBJ) X XUhelp: $(UTIL) Uhelp.no_control X $(UTIL) <Uhelp.no_control >Uhelp X Xtags: tag Xtag: X rm -f Tags X ctags -x $(SRC) $(HDR) > Tags X ctags $(SRC) $(HDR) X Xlint: $(SRC) X rm -f Lint.out X lint $(SRC) $(TERMLIB) > Lint.out X Xinstall: $(GAME) Umaps Ufortune Uhelp X touch Uscore X chmod 644 Umaps Ufortune Uhelp X chmod 666 Uscore X -mkdir $(HOME) X cp Uscore Umaps Ufortune Uhelp $(HOME) X chmod 711 $(HOME) X chmod 711 $(GAME) X -mv $(GAME) $(BINDIR) X Xclean: X rm -f core *.o $(GAME) X# X########################################################################## X# shar the source X########################################################################## X# XSHAR = /u/philc/bin/shar -a XSHAR1 = bill.c config.c create.c diag.c fortune.c help.c io.c tok.c XSHAR2 = data.c display.c regen.c savelev.c nap.c XSHAR3 = global.c header.h moreobj.c signal.c Makefile XSHAR4 = monster.c XSHAR5 = main.c movem.c XSHAR6 = object.c MANIFEST README XSHAR7 = scores.c store.c XSHAR8 = Ufortune Uhelp Umaps Xshar: X $(SHAR) -m 1 -n 8 $(SHAR1) > Ushar.1 X $(SHAR) -m 2 -n 8 $(SHAR2) > Ushar.2 X $(SHAR) -m 3 -n 8 $(SHAR3) > Ushar.3 X $(SHAR) -m 4 -n 8 $(SHAR4) > Ushar.4 X $(SHAR) -m 5 -n 8 $(SHAR5) > Ushar.5 X $(SHAR) -m 6 -n 8 $(SHAR6) > Ushar.6 X $(SHAR) -m 7 -n 8 $(SHAR7) > Ushar.7 X @cp $(HOME)/Ufortune . X @cp $(HOME)/Uhelp . X @cp $(HOME)/Umaps . X $(SHAR) -m 8 -n 8 $(SHAR8) > Ushar.8 END_OF_FILE if test 2733 -ne `wc -c <'Makefile'`; then echo shar: \"'Makefile'\" unpacked with wrong size! fi # end of 'Makefile' 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'\" \(19030 characters\) sed "s/^X//" >'scores.c' <<'END_OF_FILE' X/* scores.c X * X * Functions in this file are: X * X * readboard() X * Function to read in the scoreboard into a static buffer X * writeboard() X * Function to write the scoreboard from readboard()'s buffer X * makeboard() X * Function to create a new scoreboard (wipe out old one) X * hashewon() X * Function to return 1 if player has won a game before, else 0 X * long paytaxes(x) X * Function to pay taxes if any are due X * winshou() X * Subroutine to print out the winning scoreboard X * shou(x) X * Subroutine to print out the non-winners scoreboard X * showscores() X * Function to show the scoreboard on the terminal X * showallscores() X * Function to show scores and the iven lists that go with them X * sortboard() X * Function to sort the scoreboard X * newscore(score, whoo, whyded, winner) X * Function to add entry to scoreboard X * new1sub(score,i,whoo,taxes) X * Subroutine to put player into a X * new2sub(score,i,whoo,whyded) X * Subroutine to put player into a X * died(x) X * Subroutine to record who played larn, and what the score was X * diedsub(x) X * Subroutine to print out a line showing player when he is killed X */ X#include "header.h" X Xstruct scofmt /*This is the structure for the scoreboard */ X{ X long score; /* the score of the player */ X long suid; /* the user id number of the player*/ X short what; /* the number of the monster that killedplayer*/ X short level; /* the level player was on when he died */ X short hardlev; /* the level of difficulty player played at*/ X short order; /* the relative ordering place of this entry*/ X char who[40]; /* the name of the character */ X char char_class[20]; /* the character class */ X char sciv[26][2]; /* this is the inventory list of the character*/ X}; X X/* This is the structure for the winning scoreboard */ Xstruct wscofmt { X long score; /* the score of the player */ X long timeused; /* the time used in mobuls to win the game*/ X long taxes; /* taxes he owes to LRS */ X long suid; /* the user id number of the player*/ X short hardlev; /* the level of difficulty player played at*/ X short order; /* the relative ordering place of this entry*/ X char who[40]; /* the name of the character */ X char char_class[20]; /* the character class */ X}; X Xstatic struct scofmt sco[SCORESIZE]; /* the structure for the scoreboard */ Xstatic struct wscofmt winr[SCORESIZE]; /* struct for the winning scoreboard */ X Xstatic char *whydead[] = { X"quit", /* 0 */ X"suspended", X"self - annihilated", X"shot by an arrow", X"hit by a dart", X"fell into a pit", /* 5 */ X"fell into a pit to HELL", X"a winner", X"trapped in solid rock", X"killed by a missing save file", X"killed by an old save file", /* 10 */ X"caught by the greedy cheater checker trap", X"killed by a protected save file", X"killed his family and committed suicide", /* 13 */ X"erased by a wayward finger", X"fell through a trap door to HELL", /* 15 */ X"fell through a trap door", X"drank some poisonous water", X"fried by an electric shock", X"slipped on a volcano shaft", X"killed by a stupid act of frustration", /* 20 */ X"attacked by a revolting demon", X"hit by his own magic", /* 22 */ X"demolished by an unseen attacker", X"fell into the dreadful sleep", X"killed by an exploding chest", /* 25 */ X"killed by a missing maze data file", X"annihilated in a sphere", X"died a post mortem death", X"wasted by a malloc() failure" /* 29 */ X}; X X X/* X * readboard() Function to read in the scoreboard into a static buffer X * X * returns -1 if unable to read in the scoreboard, returns 0 if all is OK X */ Xreadboard() X{ X FILE *fp; X X if ((fp = fopen(scorefile, "r")) == (FILE *)NULL) { X fprintf(stderr, "Can't open scorefile for reading\n"); X fflush(stderr); X return(-1); X } X if (fread((char *)sco, sizeof(sco), 1, fp) != 1) { X fprintf(stderr, "Can't read scoreboard\n"); X fflush(stderr); X fclose(fp); X return(-1); X } X if (fread((char *)winr, sizeof(winr), 1, fp) != 1) { X fprintf(stderr, "Can't read scoreboard\n"); X fflush(stderr); X fclose(fp); X return(-1); X } X fflush(fp); X fclose(fp); X return(0); X} X X X/* X * writeboard() X * Function to write the scoreboard from readboard()'s buffer X * X * returns -1 if unable to write the scoreboard, returns 0 if all is OK X */ Xwriteboard() X{ X FILE *fp; X X if ((fp = fopen(scorefile, "w")) == (FILE *)NULL) { X lprcat("Can't open scorefile for writing\n"); X lflush(); X return(-1); X } X if (fwrite((char * )sco, sizeof(sco), 1, fp) != 1) { X lprcat("Can't write scorefile\n"); X lflush(); X fclose(fp); X return(-1); X } X if (fwrite((char * )winr, sizeof(winr), 1, fp) != 1) { X lprcat("Can't write scorefile\n"); X lflush(); X fclose(fp); X return(-1); X } X fflush(fp); X fclose(fp); X return(0); X} X X X/* X * Function to create a new scoreboard (wipe out old one) X * makeboard() X * X * returns -1 if unable to write the scoreboard, returns 0 if all is OK X */ Xmakeboard() X{ X int i; X X for (i = 0; i < SCORESIZE; i++) { X winr[i].taxes = winr[i].score = sco[i].score = 0; X winr[i].order = sco[i].order = i; X } X if (writeboard()) X return(-1); X chmod(scorefile, 0666); X return(0); X} X X X/* X * Function to return 1 if player has won a game before, else 0 X * X * hashewon() X * X * This function also sets c[HARDGAME] to appropriate value -- 0 if not a X * winner, otherwise the next level of difficulty listed in the winners X * scoreboard. This function also sets outstanding_taxes to the value in X * the winners scoreboard. X */ Xhashewon() X{ X register int i; X X c[HARDGAME] = 0; X X if (readboard() < 0) X return(0); /* can't find scoreboard */ X X for (i = 0; i < SCORESIZE; i++) /* search through winners scoreboard */ X if (winr[i].suid == userid) X if (winr[i].score > 0) { X c[HARDGAME] = winr[i].hardlev + 1; X outstanding_taxes = winr[i].taxes; X return(1); X } X return(0); X} X X X/* X * long paytaxes(x) Function to pay taxes if any are due X * X * Enter with the amount (in gp) to pay on the taxes. X * Returns amount actually paid. X */ Xlong paytaxes(x) Xlong x; X{ X int i; X long amt; X X if (x <= 0) X return(0L); X X if (readboard() < 0) X return(0L); X X for (i = 0; i < SCORESIZE; i++) X X /* look for players winning entry */ X if (winr[i].suid == userid) X X /* search for a winning entry for the player */ { X if (winr[i].score > 0) X amt = winr[i].taxes; X if (x < amt) X amt = x; X winr[i].taxes -= amt; X outstanding_taxes -= amt; X if (writeboard() < 0) X return(0); X return(amt); X } X return(0L); /* couldn't find user on winning scoreboard */ X} X X X/* X * winshou() Subroutine to print out the winning scoreboard X * X * Returns the number of players on scoreboard that were shown X */ Xwinshou() X{ X struct wscofmt *p; X register int i, j, count; X X /* is there anyone on the scoreboard? */ X for (count = j = i = 0; i < SCORESIZE; i++) X if (winr[i].score != 0) { X j++; X break; X } X X if (j) { X X /*12345678901234567890123456789012345678901234567890123*/ X puts("\n Score Diff Time Needed Ularn Winners List"); X X /* needed to print out the */ X /* winners in order */ X for (i = 0; i < SCORESIZE; i++) X for (j = 0; j < SCORESIZE; j++) { X p = &winr[j];/*pointer to the scoreboard entry*/ X if (p->order == i) { X if (p->score) { X count++; X printf("%-10ld%8d%8d Mobuls (%s) %s\n", X (long)p->score, X p->hardlev, X p->timeused, X p->char_class, X p->who); X fflush(stdout); X } X break; X } X } X } X return(count); /* return number of people on scoreboard */ X} X X X/* X * shou(x) X * int x; X * Subroutine to print out the non-winners scoreboard X * X * Enter with 0 to list the scores, enter with 1 to list inventories too X * Returns the number of players on scoreboard that were shown X */ Xshou(x) Xint x; X{ X int i, j, n; X int count; X X /* is the scoreboard empty? */ X for (count = j = i = 0; i < SCORESIZE; i++) X if (sco[i].score != 0) { X j++; X break; X } X X if (j) { X puts("\n Score Diff Ularn Visitor Log"); X for (i = 0; i < SCORESIZE; i++) X for (j = 0; j < SCORESIZE; j++) X if (sco[j].order == i) { X if (sco[j].score) { X count++; X printf("%7ld %3ld (%s) %s ", X (long)sco[j].score, X (long)sco[j].hardlev, X sco[j].char_class, X sco[j].who); X if (sco[j].what < 256) X printf("killed by a %s", X monster[sco[j].what].name); X else { X int foo = sco[j].what - 256; X if (!sex && (foo == 13 || foo == 22)) X switch(foo) { X case 13 : X printf("killed her family and committed suicide"); X break; X case 22 : X printf("hit by her own magic"); X break; X } X else X printf("%s", whydead[foo]); X } X if (x != 263) X printf(" on %s", X levelname[sco[j].level]); X if (x) { X for (n = 0; n < 26; n++) { X iven[n] = sco[j].sciv[n][0]; X ivenarg[n] = sco[j].sciv[n][1]; X } X for (n = 0; n < 26; n++) X if (iven[n]) { X srcount = 0; X showscore3(n); X } X } X putchar('\n'); X fflush(stdout); X } X j = SCORESIZE; X } X } X return(count); /* return the number of players just shown */ X} X X X/* X * showscores() Function to show the scoreboard on the terminal X * X * Returns nothing of value X */ Xstatic char esb[] = "The scoreboard is empty.\n"; X Xshowscores() X{ X int i, j; X X if (readboard() < 0) X return; X i = winshou(); X j = shou(0); X X if (i + j == 0) X puts(esb); X else X putchar('\n'); X lflush(); X} X X X/* X * showallscores() X * Function to show scores and the iven lists that go with them X * X * Returns nothing of value X */ Xshowallscores() X{ X int i, j; X X X if (readboard() < 0) X return; X X c[WEAR] = c[WIELD] = c[SHIELD] = -1; X X for (i = 0; i < MAXPOTION; i++) X potionname[i][0] = ' '; X for (i = 0; i < MAXSCROLL; i++) X scrollname[i][0] = ' '; X X i = winshou(); X j = shou(1); X X if (i + j == 0) X puts(esb); X else X putchar('\n'); X X} X X X/* X * sortboard() Function to sort the scoreboard X * X * Returns 0 if no sorting done, else returns 1 X */ Xsortboard() X{ X int i, j, pos; X long jdat; X X for (i = 0; i < SCORESIZE; i++) X sco[i].order = winr[i].order = -1; X pos = 0; X while (pos < SCORESIZE) { X jdat = 0; X for (i = 0; i < SCORESIZE; i++) X if ((sco[i].order < 0) && (sco[i].score >= jdat)) { X j = i; X jdat = sco[i].score; X } X sco[j].order = pos++; X } X pos = 0; X while (pos < SCORESIZE) { X jdat = 0; X for (i = 0; i < SCORESIZE; i++) X if ((winr[i].order < 0) && (winr[i].score >= jdat)) { X j = i; X jdat = winr[i].score; X } X winr[j].order = pos++; X } X return(1); X} X X X/* X * Function to add entry to scoreboard X * newscore(score, whoo, whyded, winner) X * int score, winner, whyded; X * char *whoo; X * X * Enter with the total score in gp in score, players name in whoo, X * died() reason # in whyded, and TRUE/FALSE in winner if a winner X * ex. newscore(1000, "player 1", 32, 0); X */ Xnewscore(score, whoo, whyded, winner) Xlong score; Xint winner, whyded; Xchar *whoo; X{ X int i; X long taxes; X X if (readboard() < 0) X return; /* do the scoreboard */ X X /* if a winner then delete all non-winning scores */ X if (cheat) X winner = 0; /* if he cheated, don't let him win */ X X if (winner) { X for (i = 0; i < SCORESIZE; i++) X if (sco[i].suid == userid) X sco[i].score = 0; X taxes = score * TAXRATE; X score += 100000 * c[HARDGAME]; /* bonus for winning */ X X/* if he has a slot on the winning scoreboard update it if greater score*/ X for (i = 0; i < SCORESIZE; i++) X if (winr[i].suid == userid) { X new1sub(score, i, whoo, taxes); X return; X } X X/* he had no entry. look for last entry and see if he has a greater score */ X for (i = 0; i < SCORESIZE; i++) X if (winr[i].order == SCORESIZE - 1) { X new1sub(score, i, whoo, taxes); X return; X } X } else if (!cheat) /* for not winning scoreboard */ { X /* if he has a slot on the scoreboard update it if greater score */ X for (i = 0; i < SCORESIZE; i++) X if (sco[i].suid == userid) { X new2sub(score, i, whoo, whyded); X return; X } X X/* he had no entry. look for last entry and see if he has a greater score */ X for (i = 0; i < SCORESIZE; i++) X if (sco[i].order == SCORESIZE - 1) { X new2sub(score, i, whoo, whyded); X return; X } X } X} X X X/* X * new1sub(score,i,whoo,taxes) Subroutine to put player into a X * int score,i,whyded,taxes; winning scoreboard entry if his score X * char *whoo; is high enough X * X * Enter with the total score in gp in score, players name in whoo, X * died() reason # in whyded, and TRUE/FALSE in winner if a winner X * slot in scoreboard in i, and the tax bill in taxes. X * Returns nothing of value X */ Xnew1sub(score, i, whoo, taxes) Xlong score, taxes; Xint i; Xchar *whoo; X{ X struct wscofmt *p; X X p = &winr[i]; X p->taxes += taxes; X if ((score >= p->score) || (c[HARDGAME] > p->hardlev)) { X strcpy(p->who, whoo); X strcpy(p->char_class, char_class); X p->score = score; X p->hardlev = c[HARDGAME]; X p->suid = userid; X p->timeused = gtime / 100; X } X} X X X/* X * new2sub(score,i,whoo,whyded) X * int score,i,whyded,taxes; X * char *whoo; X * Subroutine to put player into a X * non-winning scoreboard entry if his X * score is high enough X * X * Enter with the total score in gp in score, players name in whoo, X * died() reason # in whyded, and slot in scoreboard in i. X * Returns nothing of value X */ Xnew2sub(score, i, whoo, whyded) Xlong score; Xint i, whyded; Xchar *whoo; X{ X int j; X struct scofmt *p; X X p = &sco[i]; X if ((score >= p->score) || (c[HARDGAME] > p->hardlev)) { X strcpy(p->who, whoo); X strcpy(p->char_class, char_class); X p->score = score; X p->what = whyded; X p->hardlev = c[HARDGAME]; X p->suid = userid; X p->level = level; X for (j = 0; j < 26; j++) { X p->sciv[j][0] = iven[j]; X p->sciv[j][1] = ivenarg[j]; X } X } X} X X X/* X * Subroutine to record who played larn, and what the score was X * died(x) X * int x; X * X * if x < 0 then don't show scores X * died() never returns! (unless c[LIFEPROT] and a reincarnatable death!) X * X * < 256 killed by the monster number X * 256 quit X * 257 suspended X * 258 self - annihilated X * 259 shot by an arrow X * 260 hit by a dart X * 261 fell into a pit X * 262 fell into a bottomless pit X * 263 a winner X * 264 trapped in solid rock X * 265 killed by a missing save file X * 266 killed by an old save file X * 267 caught by the greedy cheater checker trap X * 268 killed by a protected save file X * 269 killed his family and killed himself X * 270 erased by a wayward finger X * 271 fell through a bottomless trap door X * 272 fell through a trap door X * 273 drank some poisonous water X * 274 fried by an electric shock X * 275 slipped on a volcano shaft X * 276 killed by a stupid act of frustration X * 277 attacked by a revolting demon X * 278 hit by his own magic X * 279 demolished by an unseen attacker X * 280 fell into the dreadful sleep X * 281 killed by an exploding chest X * 282 killed by a missing maze data file X * 283 killed by a sphere of annihilation X * 284 died a post mortem death X * 285 malloc() failure X * 300 quick quit -- don't put on scoreboard X */ X Xstatic int scorerror; X Xdied(x) Xint x; X{ X int f, win; X X if (c[LIFEPROT] > 0) /* if life protection */ { X switch ((x > 0) ? x : -x) { X case 256: X case 257: X case 262: X case 263: X case 265: X case 266: X case 267: X case 268: X case 269: X case 271: X case 282: X case 284: X case 285: X case 300: X goto invalid; /* can't be saved */ X }; X --c[LIFEPROT]; X c[HP] = 1; X --c[CONSTITUTION]; X lprcat("\nYou feel wiiieeeeerrrrrd all over! "); X lflush(); X beep(); X sleep(4); X return; /* only case where died() returns */ X } Xinvalid: X sncbr(); X f = 0; X if (ckpflag) X unlink(ckpfile); /* remove checkpoint file if used */ X X if (x < 0) { X f++; X x = -x; X } /* if we are not to display the scores */ X X if ((x == 300) || (x == 257)) { X clear(); X lflush(); X putchar('\n'); X exit(0);/* for quick exit or saved game */ X } X X if (x == 263) X win = 1; X else X win = 0; X X c[GOLD] += c[BANKACCOUNT]; X c[BANKACCOUNT] = 0; X X /* now enter the player at the end of the scoreboard */ X newscore(c[GOLD], logname, x, win); X X clear(); X lflush(); X diedsub(x); /* print out the score line */ X X /* wizards can't score*/ X if ( !wizard ) { X X /*now for the scoreboard maintenance -- not for a suspended game*/ X if (x != 257) { X if (sortboard()) X scorerror = writeboard(); X } X } X if ((x == 256) || (x == 257) || (f != 0)) { X exit(0); X } X X if (scorerror == 0) X showscores(); /* if we updated the scoreboard*/ X X if (x == 263) X mailbill(); X X putchar('\n'); X exit(0); X} X X X/* X * Subroutine to print out the line showing the player when he is killed X * diedsub(x) X * int x; X */ Xdiedsub(x) Xint x; X{ X char ch, *mod, *cls; X X cls = class[c[LEVEL]-1]; X puts("---------------------------------------------------------------"); X puts(" U L A R N S C O R E S"); X puts("---------------------------------------------------------------"); X printf("Score: %ld Diff: %d ", c[GOLD], c[HARDGAME]); X printf("Level: %s Char: %s\n", cls, char_class); X printf("\t%s", logname); X if (wizard) X printf(" (wizard)"); X if (x < 256) { X ch = *monster[x].name; X if(ch== 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u') X mod = "an"; X else X mod = "a"; X printf(" killed by %s %s", mod, monster[x].name); X } else { X int foo = x - 256; X if (!sex && (foo == 13 || foo == 22)) X switch(foo) { X case 13 : X printf(" killed her family and committed suicide"); X break; X case 22 : X printf(" hit by her own magic"); X break; X } X else X printf(" %s", whydead[foo]); X } X X if (x != 263) X printf(" on %s\n", levelname[level]); X else X putchar('\n'); X puts("---------------------------------------------------------------"); X fflush(stdout); X} X Xshowscore3(index) Xint index; X{ X switch (iven[index]) { X case OPOTION: X showscore1(index, potionname); X break; X case OSCROLL: X showscore1(index, scrollname); X break; X case OLARNEYE: X case OBOOK: X case OSPIRITSCARAB: X case ODIAMOND: X case ORUBY: X case OCUBEofUNDEAD: X case OEMERALD: X case OCHEST: X case OCOOKIE: X case OSAPPHIRE: X case OORB: X case OHANDofFEAR: X case OBRASSLAMP: X case OURN: X case OWWAND: X case OSPHTALISMAN: X case ONOTHEFT: X showscore1(index, (char **)0); X break; X default: X printf("\n%c) %s", index + 'a' , objectname[iven[index]]); X if (ivenarg[index] > 0) X printf(" + %d", (long)ivenarg[index]); X else if (ivenarg[index] < 0) X printf(" %d", (long)ivenarg[index]); X break; X } X if (c[WIELD] == index) X puts(" (weapon in hand)"); X if ((c[WEAR] == index) || (c[SHIELD] == index)) X puts(" (being worn)"); X fflush(stdout); X} X Xshowscore1(idx, str2) Xint idx; Xchar *str2[]; X{ X if (str2 == 0) X printf("\n%c) %s", idx + 'a' , objectname[iven[idx]]); X else if (*str2[ivenarg[idx]] == 0) X printf("\n%c) %s", idx + 'a' , objectname[iven[idx]]); X else X printf("\n%c) %s of%s", idx + 'a' , X objectname[iven[idx]], str2[ivenarg[idx]]); X} END_OF_FILE if test 19030 -ne `wc -c <'scores.c'`; then echo shar: \"'scores.c'\" unpacked with wrong size! fi # end of 'scores.c' fi if test -f 'store.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'store.c'\" else echo shar: Extracting \"'store.c'\" \(29301 characters\) sed "s/^X//" >'store.c' <<'END_OF_FILE' X/* store.c */ X#include "header.h" X Xstatic int dndcount=0,dnditm=0; X X/* this is the data for the stuff in the dnd store */ Xint maxitm=92; /* number of items in the dnd inventory table */ X Xstruct _itm itm[92] = { X/*cost memory iven name iven arg how X gp pointer iven[] ivenarg[] many */ X{ 2, 0, OLEATHER, 0, 3 } , X{ 10, 0, OSTUDLEATHER, 0, 2 } , X{ 40, 0, ORING, 0, 2 } , X{ 85, 0, OCHAIN, 0, 2 } , X{ 220, 0, OSPLINT, 0, 1 } , X{ 400, 0, OPLATE, 0, 1 } , X{ 900, 0, OPLATEARMOR, 0, 1 } , X{ 2600, 0, OSSPLATE, 0, 1 } , X{ 150, 0, OSHIELD, 0, 1 } , X{ 5000, 0, OELVENCHAIN, 0, 0 } , X{ 1000, 0, OORB, 0, 0 } , X{ 10000,0, OSLAYER, 0, 0 } , X X/*cost memory iven name iven arg how X gp pointer iven[] ivenarg[] many */ X X{ 2, 0, ODAGGER, 0, 3 } , X{ 20, 0, OSPEAR, 0, 3 } , X{ 80, 0, OFLAIL, 0, 2 } , X{ 150, 0, OBATTLEAXE, 0, 2 } , X{ 450, 0, OLONGSWORD, 0, 2 } , X{ 1000, 0, O2SWORD, 0, 2 } , X{ 5000, 0, OSWORD, 0, 1 } , X{ 20000,0, OLANCE, 0, 1 } , X{ 2000, 0, OSWORDofSLASHING, 0, 0 } , X{ 7500, 0, OHAMMER, 0, 0 } , X X/*cost memory iven name iven arg how X gp pointer iven[] ivenarg[] many */ X{ 150, 0, OPROTRING, 1, 1 } , X{ 85, 0, OSTRRING, 1, 1 } , X{ 120, 0, ODEXRING, 1, 1 } , X{ 120, 0, OCLEVERRING, 1, 1 } , X{ 180, 0, OENERGYRING, 0, 1 } , X{ 125, 0, ODAMRING, 0, 1 } , X{ 220, 0, OREGENRING, 0, 1 } , X{ 1000, 0, ORINGOFEXTRA, 0, 1 } , X X{ 280, 0, OBELT, 0, 1 } , X{ 400, 0, OAMULET, 5, 1 } , X X{ 500, 0, OCUBEofUNDEAD, 0, 0 } , X{ 600, 0, ONOTHEFT, 0, 0 } , X X{ 590, 0, OCHEST, 3, 1 } , X{ 200, 0, OBOOK, 2, 1 } , X{ 10, 0, OCOOKIE, 0, 3 } , X{ 666, 0, OHANDofFEAR, 0, 0 } , X X /*cost memory iven name iven arg how X gp pointer iven[] ivenarg[] many */ X X{ 20, potionname, OPOTION, 0, 6 } , X{ 90, potionname, OPOTION, 1, 5 } , X{ 520, potionname, OPOTION, 2, 1 } , X{ 100, potionname, OPOTION, 3, 2 } , X{ 50, potionname, OPOTION, 4, 2 } , X{ 150, potionname, OPOTION, 5, 2 } , X{ 70, potionname, OPOTION, 6, 1 } , X{ 30, potionname, OPOTION, 7, 7 } , X{ 200, potionname, OPOTION, 8, 1 } , X{ 50, potionname, OPOTION, 9, 1 } , X{ 80, potionname, OPOTION, 10, 1 } , X X/*cost memory iven name iven arg how X gp pointer iven[] ivenarg[] many */ X X{ 30, potionname, OPOTION, 11, 3 } , X{ 20, potionname, OPOTION, 12, 5 } , X{ 40, potionname, OPOTION, 13, 3 } , X{ 35, potionname, OPOTION, 14, 2 } , X{ 520, potionname, OPOTION, 15, 1 } , X{ 90, potionname, OPOTION, 16, 2 } , X{ 200, potionname, OPOTION, 17, 2 } , X{ 220, potionname, OPOTION, 18, 4 } , X{ 80, potionname, OPOTION, 19, 6 } , X{ 370, potionname, OPOTION, 20, 3 } , X{ 50, potionname, OPOTION, 22, 1 } , X{ 150, potionname, OPOTION, 23, 3 } , X X/*cost memory iven name iven arg how X gp pointer iven[] ivenarg[] many */ X X{ 850, 0, OORBOFDRAGON, 0, 0 } , X{ 750, 0, OSPIRITSCARAB, 0, 0 } , X{ 8000, 0, OVORPAL, 0, 0, } , X X{ 100, scrollname, OSCROLL, 0, 2 } , X{ 125, scrollname, OSCROLL, 1, 2 } , X{ 60, scrollname, OSCROLL, 2, 4 } , X{ 10, scrollname, OSCROLL, 3, 4 } , X{ 100, scrollname, OSCROLL, 4, 3 } , X{ 200, scrollname, OSCROLL, 5, 2 } , X{ 110, scrollname, OSCROLL, 6, 1 } , X{ 500, scrollname, OSCROLL, 7, 2 } , X{ 200, scrollname, OSCROLL, 8, 2 } , X{ 250, scrollname, OSCROLL, 9, 4 } , X{ 20, scrollname, OSCROLL, 10, 5 } , X{ 30, scrollname, OSCROLL, 11, 3 } , X X/*cost memory iven name iven arg how X gp pointer iven[] ivenarg[] many */ X X{ 340, scrollname, OSCROLL, 12, 1 } , X{ 340, scrollname, OSCROLL, 13, 1 } , X{ 300, scrollname, OSCROLL, 14, 2 } , X{ 400, scrollname, OSCROLL, 15, 2 } , X{ 500, scrollname, OSCROLL, 16, 2 } , X{ 1000, scrollname, OSCROLL, 17, 1 } , X{ 500, scrollname, OSCROLL, 18, 1 } , X{ 340, scrollname, OSCROLL, 19, 2 } , X{ 220, scrollname, OSCROLL, 20, 3 } , X{ 3900, scrollname, OSCROLL, 21, 0 } , X{ 610, scrollname, OSCROLL, 22, 1 } , X{ 3000, scrollname, OSCROLL, 23, 0 } , X{ 300, 0, OSPHTALISMAN, 0, 0 } , X{ 150, 0, OWWAND, 0, 0 } , X{ 50, 0, OBRASSLAMP, 0, 0 } , X{ 9500, 0, OPSTAFF, 0, 0 } X}; X X/* X function for the dnd store X */ Xdnd_2hed() X{ Xlprcat("Welcome to the Ularn Thrift Shoppe. We stock many items explorers find useful\n"); Xlprcat("in their adventures. Feel free to browse to your hearts content.\n"); Xlprcat("Also be advised, if you break 'em, you pay for 'em."); X} X Xdnd_hed() X{ X register int i; X X for (i=dnditm; i<26+dnditm; i++) X dnditem(i); X cursor(50,18); X lprcat("You have "); X} X Xdndstore() X{ X register int i; X X dnditm = 0; X nosignal = 1; /* disable signals */ X clear(); X dnd_2hed(); X if (outstanding_taxes>0) X { Xlprcat("\n\nThe Ularn Revenue Service has ordered us to not do business with tax evaders.\n"); X beep(); Xlprintf("They have also told us that you owe %d gp in back taxes, and as we must\n",(long)outstanding_taxes); Xlprcat("comply with the law, we cannot serve you at this time. Soo Sorry.\n"); X cursors(); X lprcat("\nPress "); X standout("escape"); X lprcat(" to leave: "); X lflush(); X i=0; X while (i!='\33') i=getcharacter(); X drawscreen(); X nosignal = 0; /* enable signals */ X return; X } X dnd_hed(); X while (1) { X cursor(59,18); X lprintf("%d gold pieces",(long)c[GOLD]); X cltoeoln(); X cl_dn(1,20); /* erase to eod */ X lprcat("\nEnter your transaction ["); X standout("space"); X lprcat(" for more, "); X standout("escape"); X lprcat(" to leave]? "); X i=0; X while ((i<'a' || i>'z') && (i!=' ') && (i!='\33') && (i!=12)) X i=getcharacter(); X if (i==12) { X clear(); X dnd_2hed(); X dnd_hed(); X } X else if (i=='\33') { X drawscreen(); X nosignal = 0; /* enable signals */ X X return; X } X else if (i==' ') { X cl_dn(1,4); X if ((dnditm += 26) >= maxitm) X dnditm=0; X dnd_hed(); X } X else X { /* buy something */ X lprc(i); /* echo the byte */ X i += dnditm - 'a'; X if (i>=maxitm) X outofstock(); X else if (itm[i].qty <= 0) X outofstock(); X else if (pocketfull()) X handsfull(); X else if (c[GOLD] < itm[i].price*10) X nogold(); X else { X if (itm[i].mem != 0) X *itm[i].mem[itm[i].arg] = ' '; X c[GOLD] -= itm[i].price*10; X itm[i].qty--; X take(itm[i].obj,itm[i].arg); X if (itm[i].qty==0) X dnditem(i); X nap(1001); X } X } X X } X} X X/* X function for the players hands are full X */ Xhandsfull() X{ X lprcat("\nYou can't carry anything more!"); X lflush(); X nap(2200); X} Xoutofstock() X{ X lprcat("\nSorry, but we are out of that item."); X lflush(); X nap(2200); X} Xnogold() X{ X lprcat("\nYou don't have enough gold to pay for that!"); X lflush(); X nap(2200); X} X X/* X dnditem(index) X X to print the item list; X used in dndstore() enter with the index into itm X*/ Xdnditem(i) Xregister int i; X{ X register int j,k; X X if (i >= maxitm) X return; X cursor( (j=(i&1)*40+1) , (k=((i%26)>>1)+5) ); X if (itm[i].qty == 0) { X lprintf("%39s",""); X return; X } X lprintf("%c) ",(i%26)+'a'); X if (itm[i].obj == OPOTION) { X lprcat("potion of "); X lprintf("%s",&potionname[itm[i].arg][1]); X } X else if (itm[i].obj == OSCROLL) { X lprcat("scroll of "); X lprintf("%s",&scrollname[itm[i].arg][1]); X } X else lprintf("%s",objectname[itm[i].obj]); X cursor( j+31,k ); X lprintf("%6d",(long)(itm[i].price*10)); X} X X X/* X for the college of larn X */ Xchar course[26]={0}; /* the list of courses taken */ Xchar coursetime[] = { 10, 15, 10, 20, 10, 10, 10, 5 }; X X/* X function to display the header info for the school X */ Xsch_hed() X{ X clear(); Xlprcat("The College of Ularn offers the exciting opportunity of higher education to\n"); Xlprcat("all inhabitants of the caves. Here is a list of the class schedule:\n\n\n"); X lprcat("\t\t Course Name \t Time Needed\n\n"); X X /*line 7 of crt*/ X if (course[0]==0) X lprcat("\t\ta) Fighters Training I 10 mobuls"); X lprc('\n'); X if (course[1]==0) X lprcat("\t\tb) Fighters Training II 15 mobuls"); X lprc('\n'); X if (course[2]==0) X lprcat("\t\tc) Introduction to Wizardry 10 mobuls"); X lprc('\n'); X if (course[3]==0) X lprcat("\t\td) Applied Wizardry 20 mobuls"); X lprc('\n'); X if (course[4]==0) X lprcat("\t\te) Behavioral Psychology 10 mobuls"); X lprc('\n'); X if (course[5]==0) X lprcat("\t\tf) Faith for Today 10 mobuls"); X lprc('\n'); X if (course[6]==0) X lprcat("\t\tg) Contemporary Dance 10 mobuls"); X lprc('\n'); X if (course[7]==0) X lprcat("\t\th) History of Ularn 5 mobuls"); X X lprcat("\n\n\t\tAll courses cost 250 gold pieces."); X cursor(30,18); X lprcat("You are presently carrying "); X} X Xoschool() X{ X register int i; X X long time_used; X nosignal = 1; /* disable signals */ X sch_hed(); X while (1) { X cursor(57,18); X lprintf("%d gold pieces. ",(long)c[GOLD]); X cursors(); X lprcat("\nWhat is your choice ["); X standout("escape"); X lprcat(" to leave] ? "); X yrepcount=0; X i=0; X while ((i<'a' || i>'h') && (i!='\33') && (i!=12)) X i=getcharacter(); X if (i==12) { X sch_hed(); X continue; X } X else if (i=='\33') { X nosignal = 0; X drawscreen(); /* enable signals */ X X return; X } X lprc(i); X if (c[GOLD] < 250) X nogold(); X else X if (course[i-'a']) { X lprcat("\nSorry, but that class is filled."); X nap(1000); X } X else if (i <= 'h') { X c[GOLD] -= 250; X time_used=0; X switch(i) { X case 'a': X c[STRENGTH] += 2; X c[CONSTITUTION]++; X lprcat("\nYou feel stronger!"); X cl_line(16,7); X break; X X case 'b': X if (course[0]==0) { X lprcat("\nSorry, but this class has a prerequisite of Fighters Training I"); X c[GOLD]+=250; X time_used= -10000; X break; X } X lprcat("\nYou feel much stronger!"); X cl_line(16,8); X c[STRENGTH] += 2; X c[CONSTITUTION] += 2; X break; X X case 'c': X c[INTELLIGENCE] += 2; X lprcat("\nThe task before you now seems more attainable!"); X cl_line(16,9); X break; X X case 'd': X if (course[2]==0) { X lprcat("\nSorry, but this class has a prerequisite of Introduction to Wizardry"); X c[GOLD]+=250; X time_used= -10000; X break; X } X lprcat("\nThe task before you now seems very attainable!"); X cl_line(16,10); X c[INTELLIGENCE] += 2; X break; X X case 'e': X c[CHARISMA] += 3; X lprcat("\nYou now feel like a born leader!"); X cl_line(16,11); X break; X X case 'f': X c[WISDOM] += 2; X lprcat("\nYou now feel more confident that you can find the potion in time!"); X cl_line(16,12); X break; X X case 'g': X c[DEXTERITY] += 3; X lprcat("\nYou feel like dancing!"); X cl_line(16,13); X break; X X case 'h': X c[INTELLIGENCE]++; X lprcat("\nWow!! E = MC^2!!!\n"); X cl_line(16,14); X break; X } X time_used += coursetime[i-'a']*100; X if (time_used > 0) { X gtime += time_used; X /*remember that he has taken that course*/ X course[i-'a']++; X /* he regenerated */ X c[HP] = c[HPMAX]; X c[SPELLS] = c[SPELLMAX]; X X /* cure blindness too! */ X if (c[BLINDCOUNT]) X c[BLINDCOUNT]=1; X X /* end confusion */ X if (c[CONFUSE]) X c[CONFUSE]=1; X X /* adjust parameters for time change */ X adjtime((long)time_used); X } X nap(1000); X } X } X} X X/* X * for the first national bank of Ularn X */ Xint lasttime=0; /* last time he was in bank */ Xobank() X{ X banktitle(" Welcome to the First National Bank of Ularn."); X} Xobank2() X{ Xbanktitle("Welcome to the 8th level branch office of the First National Bank of Ularn."); X} X Xbanktitle(str) Xchar *str; X{ X nosignal = 1; /* disable signals */ X clear(); X lprcat(str); X if (outstanding_taxes>0) { X register int i; Xlprcat("\n\nThe Ularn Revenue Service has ordered that your account be frozen until all\n"); X beep(); Xlprintf("levied taxes have been paid. They have also told us that you owe %d gp in\n",(long)outstanding_taxes); Xlprcat("taxes, and we must comply with them. We cannot serve you at this time. Sorry.\n"); Xlprcat("We suggest you go to the LRS office and pay your taxes.\n"); X cursors(); X lprcat("\nPress "); X standout("escape"); X lprcat(" to leave: "); X lflush(); X i=0; X while (i!='\33') X i=getcharacter(); X drawscreen(); X nosignal = 0; /* enable signals */ X X return; X } X lprcat("\n\n\tGemstone\t Appraisal\t\tGemstone\t Appraisal"); X obanksub(); X nosignal = 0; /* enable signals */ X drawscreen(); X} X X/* X * function to put interest on your bank account X */ Xointerest() X{ X register int i; X X if (c[BANKACCOUNT]<0) X c[BANKACCOUNT] = 0; X else if ((c[BANKACCOUNT]>0) && (c[BANKACCOUNT]<1000000)) { X i = (gtime-lasttime)/100; /* # mobuls elapsed */ X while ((i-- > 0) && (c[BANKACCOUNT]<1000000)) X c[BANKACCOUNT] += c[BANKACCOUNT]/250; X if (c[BANKACCOUNT]>1000000) X c[BANKACCOUNT]=1000000; /* interest limit */ X } X lasttime = (gtime/100)*100; X} X Xstatic short gemorder[26]={0}; /* the reference to screen location for each */ Xstatic long gemvalue[26]={0}; /* the appraisal of the gems */ X Xobanksub() X{ X long amt; X register int i,k; X ointerest(); /* credit any needed interest */ X X if (level==8) c[TELEFLAG] = 0; X X for (k=i=0; i<26; i++) X switch(iven[i]) { X case OLARNEYE: X case ODIAMOND: X case OEMERALD: X case ORUBY: X case OSAPPHIRE: X if (iven[i]==OLARNEYE) { X gemvalue[i]=250000-((gtime*7)/100)*100; X if (gemvalue[i]<50000) X gemvalue[i]=50000; X } X else gemvalue[i] = (255&ivenarg[i])*100; X gemorder[i]=k; X cursor( (k%2)*40+1 , (k>>1)+4 ); X lprintf("%c) %s",i+'a',objectname[iven[i]]); X cursor( (k%2)*40+33 , (k>>1)+4 ); X lprintf("%5d",(long)gemvalue[i]); X k++; X }; X cursor(31,17); X lprintf("You have %8d gold pieces in the bank.",(long)c[BANKACCOUNT]); X cursor(40,18); X lprintf("You have %8d gold pieces",(long)c[GOLD]); X if (c[BANKACCOUNT]+c[GOLD] >= 500000) X lprcat("\nNote: Ularndom law states that only deposits under 1,000,000gp can earn interest."); X while (1) { X cl_dn(1,20); X lprcat("\nYour wish? [("); X standout("d"); X lprcat(") deposit, ("); X standout("w"); X lprcat(") withdraw, ("); X standout("s"); X lprcat(") sell a stone, or "); X standout("escape"); X lprcat("] "); X yrepcount=0; X i=0; X while (i!='d' && i!='w' && i!='s' && i!='\33') X i=getcharacter(); X switch(i) { X case 'd': X lprcat("deposit\nHow much? "); X amt = readnum((long)c[GOLD]); X if (amt < 0) { X lprcat("\nSorry, but we can't take negative gold!"); X nap(2000); X amt=0; X } X else if (amt>c[GOLD]) { X lprcat(" You don't have that much."); X nap(2000); X } X else { X c[GOLD] -= amt; X c[BANKACCOUNT] += amt; X } X break; X X case 'w': X lprcat("withdraw\nHow much? "); X amt = readnum((long)c[BANKACCOUNT]); X if (amt<0) { X lprcat("\nSorry, but we don't have any negative gold!"); X nap(2000); X amt=0; X } X else if (amt > c[BANKACCOUNT]) { X lprcat("\nYou don't have that much in the bank!"); X nap(2000); X } X else { X c[GOLD] += amt; X c[BANKACCOUNT] -= amt; X } X break; X X case 's': X lprcat("\nWhich stone would you like to sell? "); X i=0; X while ((i<'a' || i>'z') && i!='*') X i=getcharacter(); X if (i=='*') X for (i=0; i<26; i++) { X if (gemvalue[i]) { X if (iven[i]==OLARNEYE) { X monstnamelist[DEMONLORD]=' '; X monstnamelist[DEMONLORD+1]=' '; X monstnamelist[DEMONLORD+2]= ' '; X monstnamelist[DEMONLORD+3]= ' '; X monstnamelist[DEMONLORD+4]= ' '; X monstnamelist[DEMONLORD+5]= ' '; X monstnamelist[DEMONLORD+6]= ' '; X monstnamelist[DEMONPRINCE]= ' '; X monstnamelist[LUCIFER] = ' '; X } X c[GOLD]+=gemvalue[i]; X iven[i]=0; X gemvalue[i]=0; X k = gemorder[i]; X cursor( (k%2)*40+1 , (k>>1)+4 ); X lprintf("%39s",""); X } X } X else { X if (gemvalue[i=i-'a']==0) { X lprintf("\nItem %c is not a gemstone!",i+'a'); X nap(2000); X break; X } X if (iven[i]==OLARNEYE) { X monstnamelist[DEMONLORD]=' '; X monstnamelist[DEMONLORD+1]=' '; X monstnamelist[DEMONLORD+2]= ' '; X monstnamelist[DEMONLORD+3]= ' '; X monstnamelist[DEMONLORD+4]= ' '; X monstnamelist[DEMONLORD+5]= ' '; X monstnamelist[DEMONLORD+6]= ' '; X monstnamelist[DEMONPRINCE]= ' '; X monstnamelist[LUCIFER] = ' '; X } X c[GOLD]+=gemvalue[i]; X iven[i]=0; X gemvalue[i]=0; X k = gemorder[i]; X cursor( (k%2)*40+1 , (k>>1)+4 ); X lprintf("%39s",""); X } X break; X case '\33': X return; X }; X cursor(40,17); X lprintf("%8d",(long)c[BANKACCOUNT]); X cursor(49,18); X lprintf("%8d",(long)c[GOLD]); X } X} X X/* X subroutine to appraise any stone for the bank X */ Xappraise(gemstone) Xint gemstone; X{ X register int j,amt; X X for (j=0; j<26; j++) X if (iven[j]==gemstone) { X lprintf("\nI see you have %s",objectname[gemstone]); X if (gemstone==OLARNEYE) X lprcat(" I must commend you. I didn't think\nyou could get it."); X lprcat(" Shall I appraise it for you? "); X yrepcount=0; X if (getyn()=='y') { X lprcat("yes.\n Just one moment please \n"); X nap(1000); X if (gemstone==OLARNEYE) { X amt = 250000-((gtime*7)/100)*100; X if (amt<50000) amt=50000; X } X else amt = (255 & ivenarg[j]) * 100; X lprintf("\nI can see this is an excellent stone, It is worth %d",(long)amt); X lprcat("\nWould you like to sell it to us? "); X yrepcount=0; X if (getyn()=='y') { X lprcat("yes\n"); X c[GOLD]+=amt; X iven[j]=0; X } X else lprcat("no thank you.\n"); X if (gemstone==OLARNEYE) lprcat("It is, of course, your privilege to keep the stone\n"); X } X else lprcat("no\nO. K.\n"); X } X} X/* X function for the trading post X */ Xotradhead() X{ X clear(); Xlprcat("Welcome to the Ularn Trading Post. We buy items that explorers no longer find\n"); Xlprcat("useful. Since the condition of the items you bring in is not certain,\n"); Xlprcat("and we incur great expense in reconditioning the items, we usually pay\n"); Xlprcat("only 20% of their value were they to be new. If the items are badly\n"); Xlprcat("damaged, we will pay only 10% of their new value.\n\n"); X} X Xotradepost() X{ X int i,j,value,isub,izarg; X X dnditm = dndcount = 0; X nosignal = 1; /* disable signals */ X resetscroll(); X otradhead(); X while (1) { X lprcat("\nWhat item do you want to sell to us ["); X standout("*"); X lprcat(" for list, or "); X standout("escape"); X lprcat("] ? "); X i=0; X while (i>'z' || (i<'a' && i!='*' && i!='\33' && i!='.')) X i=getcharacter(); X if (i == '\33') { X setscroll(); X recalc(); X drawscreen(); X nosignal=0; /* enable signals */ X X return; X } X isub = i - 'a'; X j=0; X if (iven[isub]==OSCROLL) X if (scrollname[ivenarg[isub]][0]==0) { X j=1; X cnsitm(); X } /* can't sell unidentified item */ X if (iven[isub]==OPOTION) X if (potionname[ivenarg[isub]][0]==0) { X j=1; X cnsitm(); X } /* can't sell unidentified item */ X if (!j) X if (i=='*') { X clear(); X qshowstr(); X otradhead(); X } X else if (iven[isub]==0) X lprintf("\nYou don't have item %c!",isub+'a'); X else { X for (j=0; j<maxitm; j++) X if ((itm[j].obj == iven[isub]) || X (iven[isub] == ODIAMOND) || X (iven[isub] == ORUBY) || X (iven[isub] == OEMERALD) || X (iven[isub] == OSAPPHIRE)) { X srcount=0; X show3(isub); /* show what the item was */ X if ((iven[isub] == ODIAMOND) X || (iven[isub] == ORUBY) X || (iven[isub] == OEMERALD) X || (iven[isub] == OSAPPHIRE)) X value = 20*ivenarg[isub]; X else if ((itm[j].obj == OSCROLL) X || (itm[j].obj == OPOTION)) X value = 2*itm[j+ivenarg[isub]].price; X else { X izarg=ivenarg[isub]; X /* appreciate if a +n object */ X value = itm[j].price; X if (izarg >= 0) value *= 2; X while ((izarg-- > 0) && ((value=14*(67+value)/10) < 500000)) X ; X } X lprintf("\nItem (%c) is worth %d gold pieces to us. Do you want to sell it? ",i,(long)value); X yrepcount=0; X if (getyn()=='y') { X lprcat("yes\n"); X c[GOLD]+=value; X if (c[WEAR] == isub) c[WEAR] = -1; X if (c[WIELD] == isub) c[WIELD] = -1; X if (c[SHIELD] == isub) c[SHIELD] = -1; X adjustcvalues(iven[isub],ivenarg[isub]); X iven[isub]=0; X } X else lprcat("no thanks.\n"); X j = maxitm+100; /* get out of the inner loop */ X } X if (j <= maxitm+2) lprcat("\nSo sorry, but we are not authorized to accept that item."); X } X } X} X Xcnsitm() X{ X lprcat("\nSorry, we can't accept unidentified objects."); X} X X/* X * for the Ularn Revenue Service X */ Xolrs() X{ X register int i,first; X long amt; X X first = nosignal = 1; /* disable signals */ X clear(); X resetscroll(); X cursor(1,4); X if (outstanding_taxes) X if (cheat) { Xlprcat("Sorry, but it seems you are trying to pay off your taxes by cheating!"); X lprcat("\n\n\tpress [escape] to exit the office."); X cursors(); X i=0; X while (i!='\33') X i=getcharacter(); X nosignal = 0; /* enable signals */ X setscroll(); X drawscreen(); X return; X } X lprcat("Welcome to the Ularn Revenue Service district office. How can we help you?"); X while (1) { X if (first) { X first=0; X goto nxt; X } X cursor(1, 20); X lprcat("\n\nYour wish? [("); X standout("p"); X lprcat(") pay taxes, or "); X standout("escape"); X lprcat("] "); X yrepcount=0; X i=0; X while (i!='p' && i!='\33') X i=getcharacter(); X switch(i) { X case 'p': X lprcat("pay taxes\nHow much? "); X amt = readnum((long)c[GOLD]); X if (amt<0) { X lprcat("\nSorry, but we can't take negative gold\n"); X amt=0; X } X else X if (amt>c[GOLD]) X lprcat(" You don't have that much.\n"); X else c[GOLD] -= paytaxes((long)amt); X break; X case '\33': X nosignal = 0; /* enable signals */ X setscroll(); X drawscreen(); X return; X }; X Xnxt: X cursor(1,6); X if (outstanding_taxes>0) X lprintf("You presently owe %d gp in taxes. ",(long)outstanding_taxes); X else X lprcat("You do not owe us any taxes. "); X cursor(1,8); X if (c[GOLD]>0) X lprintf("You have %6d gp. ",(long)c[GOLD]); X else X lprcat("You have no gold pieces. "); X } X} X X Xnomore() X{ X lprcat("\nSorry man, I ain't got no more of that shit."); X lflush(); X nap(2200); X} Xnocash() X{ X lprcat("\nWhattaya trying to pull on me? You aint got the cash!"); X lflush(); X nap(1200); X} X X/* X Dealer McDopes Pad X */ X/* X function to display the header info for the pad X */ Xchar drug[5]={0}; Xpad_hd() X{ X clear(); X lprcat("Hey man, welcome to Dealer McDope's Pad! I gots the some of the finest shit\n"); X lprcat("you'll find anywhere in Ularn - check it out...\n\n\n"); X lprcat("\t\t The Stash\t\t\tThe Cash\n\n"); X X /*line 7 of crt*/ X if (drug[0]==0) lprcat("\t\ta) Killer Speed\t\t100 bucks"); X lprc('\n'); X if (drug[1]==0) lprcat("\t\tb) Groovy Acid\t\t\t250 bucks"); X lprc('\n'); X if (drug[2]==0) lprcat("\t\tc) Monster Hash\t\t500 bucks"); X lprc('\n'); X if (drug[3]==0) lprcat("\t\td) Trippy Shrooms\t\t1000 bucks"); X lprc('\n'); X if (drug[4]==0) lprcat("\t\te) Cool Coke\t\t\t5000 bucks"); X lprc('\n'); X X cursor(30,18); X lprcat("Looks like you got about "); X} X Xopad() X{ X register int i,flag; X X nosignal = 1; /* disable signals */ X X pad_hd(); X X while (1) { X cursor(57,18); X lprintf("%d bucks on you. ",(long)c[GOLD]); X cursors(); X lprcat("\nSo, whatdya want [escape"); X lprcat(" to split] ? "); X yrepcount=0; X X i=flag=0; X X while ((i<'a' || i>'e') && (i!='\33') && (i!=12)) X i=getcharacter(); X X if (i==12) { X pad_hd(); X continue; X } X else if (i=='\33') { X nosignal = 0; X drawscreen(); /* enable signals */ X return; X } X lprc(i); X if (drug[i-'a']) { X nomore(); X flag++; X } X else X switch(i) { X case 'a': X if (c[GOLD] < 100) { X nocash(); X flag++; X } X break; X case 'b': X if (c[GOLD] < 250) { X nocash(); X flag++; X } X break; X case 'c': X if (c[GOLD] < 500) { X nocash(); X flag++; X } X break; X case 'd': X if (c[GOLD] < 1000) { X nocash(); X flag++; X } X break; X case 'e': X if (c[GOLD] < 5000) { X nocash(); X flag++; X } X break; X } X if (flag>0) continue; X switch(i) { X case 'a': /* speed */ X if (snag(OSPEED)) { X c[GOLD] -= 100; X cl_line(16,7); X flag++; X } X break; X X case 'b': /* acid */ X if (snag(OACID)) { X c[GOLD] -= 250; X cl_line(16,8); X flag++; X } X break; X X case 'c': /* hash */ X if (snag(OHASH)) { X c[GOLD] -= 500; X cl_line(16,9); X flag++; X } X break; X X case 'd': /* shrooms */ X if (snag(OSHROOMS)) { X c[GOLD] -= 1000; X cl_line(16,10); X flag++; X } X break; X X case 'e': /* coke */ X if (snag(OCOKE)) { X c[GOLD] -= 5000; X cl_line(16,11); X flag++; X } X break; X } /* end switch */ X X /*remember that he has snagged that drug*/ X if (flag) X drug[i-'a']++; X nap(1000); X } /*end while(1) */ X} /* end pad() */ X Xsnag(itm) Xint itm; X{ X int i,limit; X X if ( (limit = 15 + (c[LEVEL] >> 1)) > 26) limit=26; X X for(i=0;i<limit;i++) X if (iven[i]==0) { X iven[i]=itm; X ivenarg[i]=0; X limit=0; X lprcat("\nOk, here ya go"); X show3(i); X return(1); X } X lprcat("\nHey, you can't carry anymore"); X return(0); X} X Xint char_picked = 0; X Xpick_char(foo) Xint foo; X{ X int i; X X nosignal = 1; /* disable signals */ X X if (foo == 0) { X clear(); X lprcat("\t\tThe Addiction of Ularn\n\n"); X lprcat("Pick a character class...\n\n\n"); X lprcat("\t\t Character\n\n"); X X lprcat("\t\ta) Ogre"); X lprc('\n'); X lprcat("\t\tb) Wizard"); X lprc('\n'); X lprcat("\t\tc) Klingon"); X lprc('\n'); X lprcat("\t\td) Elf"); X lprc('\n'); X lprcat("\t\te) Rogue"); X lprc('\n'); X lprcat("\t\tf) Geek"); X lprc('\n'); X lprcat("\t\tg) Dwarf"); X lprc('\n'); X lprcat("\t\th) Rambo"); X lprc('\n'); X X cursors(); X lprcat("\nSo, what are ya? "); X lflush(); X X while (i<'a' || i>'h') X i=getcharacter(); X X } else { X i = foo; X c[SHIELD] = c[WEAR] = c[WIELD] = -1; X } X switch(i) { X case 'a': /* Ogre */ X strcpy(char_class, "Ogre"); X spelknow[1]=1; /* mle */ X c[SPELLMAX]=c[SPELLS]=1; X c[HPMAX]=c[HP]=16; X c[0] = 18; /* strength */ X c[1] = 4; /* intelligence */ X c[2] = 6; /* wisdom */ X c[3] = 16; /* constitution */ X c[4] = 6; /* dexterity */ X c[5] = 4; /* charisma */ X iven[0]=OPOTION; X ivenarg[0]=rund(6); X iven[1]=OPOTION; X ivenarg[1]=rund(6); X c[WIELD]=c[WEAR]= -1; X break; X case 'b': /* Wizard */ X strcpy(char_class, "Wizard"); X spelknow[1]=1; /* mle */ X spelknow[4]=1; /* chm */ X c[SPELLMAX]=c[SPELLS]=2; X c[HPMAX]=c[HP]=8; X c[0] = 8; /* strength */ X c[1] = 16; /* intelligence */ X c[2] = 16; /* wisdom */ X c[3] = 6; /* constitution */ X c[4] = 6; /* dexterity */ X c[5] = 8; /* charisma */ X iven[0]=OPOTION; X ivenarg[0]=19; /* potion of treasure detection */ X iven[1]=OSCROLL; X ivenarg[1]=rund(6); X iven[2]=OSCROLL; X ivenarg[2]=rund(6); X c[WIELD]=c[WEAR]= -1; X break; X case 'c': /* Klingon */ X strcpy(char_class, "Klingon"); X spelknow[5]=1; /* ssp */ X c[SPELLMAX]=c[SPELLS]=1; X c[HPMAX]=c[HP]=14; X c[0] = 14; /* strength */ X c[1] = 12; /* intelligence */ X c[2] = 4; /* wisdom */ X c[3] = 12; /* constitution */ X c[4] = 8; /* dexterity */ X c[5] = 3; /* charisma */ X iven[0]=OSTUDLEATHER; X ivenarg[0]=0; X iven[1]=OPOTION; X ivenarg[1]=rund(6); X c[WIELD]= -1; X c[WEAR] = 0; X break; X case 'd': /* Elf */ X strcpy(char_class, "Elf"); X spelknow[0]=1; X c[SPELLS]=1; X c[SPELLMAX]=2; X c[HPMAX]=c[HP]=8; X c[0] = 8; /* strength */ X c[1] = 14; /* intelligence */ X c[2] = 12; /* wisdom */ X c[3] = 8; /* constitution */ X c[4] = 8; /* dexterity */ X c[5] = 14; /* charisma */ X iven[0]=OLEATHER; X ivenarg[0]=0; X iven[1]=OSCROLL; X ivenarg[1]=rund(6); X c[WIELD]= -1; X c[WEAR]=0; X break; X case 'e': /* Rogue */ X strcpy(char_class, "Rogue"); X spelknow[1]=1; X c[SPELLMAX]=c[SPELLS]=1; X c[HPMAX]=c[HP]=12; X c[0] = 8; /* strength */ X c[1] = 12; /* intelligence */ X c[2] = 8; /* wisdom */ X c[3] = 10; /* constitution */ X c[4] = 14; /* dexterity */ X c[5] = 6; /* charisma */ X iven[0]=OLEATHER; X iven[1]=ODAGGER; X ivenarg[1]=ivenarg[0]=c[WEAR]=0; X c[WIELD]=1; X iven[2]=OSCROLL; X ivenarg[2]=14; /* stealth */ X break; X case 'f': /* Geek */ X strcpy(char_class, "Geek"); X spelknow[0]=1; X spelknow[1]=1; X c[SPELLMAX]=c[SPELLS]=1; X c[HPMAX]=c[HP]=10; X c[0] = 12; /* strength */ X c[1] = 12; /* intelligence */ X c[2] = 12; /* wisdom */ X c[3] = 12; /* constitution */ X c[4] = 12; /* dexterity */ X c[5] = 12; /* charisma */ X iven[0]=OLEATHER; X iven[1]=ODAGGER; X ivenarg[1]=ivenarg[0]=c[WEAR]=0; X c[WIELD]=1; X break; X case 'g': /* Dwarf*/ X strcpy(char_class, "Dwarf"); X spelknow[0]=1; X c[SPELLMAX]=c[SPELLS]=1; X c[HPMAX]=c[HP]=12; X c[0] = 16; /* strength */ X c[1] = 6; /* intelligence */ X c[2] = 8; /* wisdom */ X c[3] = 16; /* constitution */ X c[4] = 4; /* dexterity */ X c[5] = 4; /* charisma */ X iven[0]=OSPEAR; X ivenarg[0]=c[WIELD]=0; X break; X case 'h': /* Rambo */ X strcpy(char_class, "Rambo"); X c[SPELLMAX]=c[SPELLS]=0; X c[HPMAX]=c[HP]=1; X c[0] = 3; /* strength */ X c[1] = 3; /* intelligence */ X c[2] = 3; /* wisdom */ X c[3] = 3; /* constitution */ X c[4] = 3; /* dexterity */ X c[5] = 3; /* charisma */ X iven[0]=OLANCE; X ivenarg[0]=c[WIELD]=0; X c[LANCEDEATH] = 1; X break; X } /* end switch */ X nosignal = 0; X} /* end pick_char */ END_OF_FILE if test 29301 -ne `wc -c <'store.c'`; then echo shar: \"'store.c'\" unpacked with wrong size! fi # end of 'store.c' fi echo shar: End of archive 4 \(of 8\). cp /dev/null ark4isdone MISSING="" for I in 1 2 3 4 5 6 7 8 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked all 8 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