v07i006: ularn - ultra-larn, an enhancement of the larn adventure game, Part06/08

12 views
Skip to first unread message

Bill Randle

unread,
Jul 6, 1989, 10:04:06 AM7/6/89
to
Submitted-by: "Philip A. Cordier" <ph...@sco.COM>
Posting-number: Volume 7, Issue 6
Archive-name: ularn/Part06

#! /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 6 (of 8)."
# Contents: create.c global.c header.h regen.c
# Wrapped by billr@saab on Thu Jun 29 08:10:21 1989
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'create.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'create.c'\"
else
echo shar: Extracting \"'create.c'\" \(14814 characters\)
sed "s/^X//" >'create.c' <<'END_OF_FILE'
X/* create.c */
X#include "header.h"
X
Xextern char spelknow[],larnlevels[];
Xextern char beenhere[],wizard,level;
Xextern short oldx,oldy;
X
X/*
X makeplayer()
X
X subroutine to create the player and the players attributes
X this is called at the beginning of a game and at no other time
X */
Xmakeplayer()
X{
X register int i;
X extern int char_picked;
X
X scbr();
X clear();
X c[LEVEL]=1; /* player starts at level one */
X c[REGENCOUNTER]=16;
X c[ECOUNTER]=96; /*start regeneration correctly*/
X
X c[SHIELD] = c[WEAR] = c[WIELD] = -1;
X
X if (char_picked >= 'a' && char_picked <= 'h')
X pick_char(char_picked);
X else {
X for (i=0; i<26; i++)
X iven[i]=0;
X pick_char(0);
X }
X playerx=rnd(MAXX-2);
X playery=rnd(MAXY-2);
X oldx=0;
X oldy=25;
X gtime=0; /* time clock starts at zero */
X cbak[SPELLS] = -50;
X recalc();
X}
X
X/*
X newcavelevel(level)
X int level;
X
X function to enter a new level. This routine must be called anytime the
X player changes levels. If that level is unknown it will be created.
X A new set of monsters will be created for a new level, and existing
X levels will get a few more monsters.
X Note that it is here we remove genocided monsters from the present level
X */
Xnewcavelevel(x)
Xregister int x;
X{
X register int i,j;
X
X if (beenhere[level])
X savelevel(); /* put the level back into storage */
X level = x; /* get the new level and put in working storage*/
X if (beenhere[x]==0)
X for (i=0; i<MAXY; i++)
X for (j=0; j<MAXX; j++)
X know[j][i]=mitem[j][i]=0;
X else {
X getlevel();
X sethp(0);
X goto chgn; /* yuck! */
X }
X makemaze(x);
X makeobject(x);
X beenhere[x]=1;
X sethp(1);
X
X#if WIZID
X if (wizard || x==0)
X#else
X if (x==0)
X#endif
X for (j=0; j<MAXY; j++)
X for (i=0; i<MAXX; i++)
X know[i][j]=1;
Xchgn:
X checkgen(); /* wipe out any genocided monsters */
X}
X
X/*
X makemaze(level)
X int level;
X
X subroutine to make the caverns for a given level. only walls are made.
X */
Xstatic int mx,mxl,mxh,my,myl,myh,tmp2;
Xmakemaze(k)
Xint k;
X{
X register int i,j;
X int tmp, z;
X
X if (k > 1 && (rnd(17)<=4 || k==MAXLEVEL-1 || k==MAXLEVEL+MAXVLEVEL-1)) {
X if (cannedlevel(k));
X return; /* read maze from data file */
X }
X if (k==0)
X tmp=0;
X else
X tmp=OWALL;
X for (i=0; i<MAXY; i++)
X for (j=0; j<MAXX; j++)
X item[j][i]=tmp;
X if (k==0)
X return;
X eat(1,1);
X if (k==1)
X item[33][MAXY-1]=0; /* exit from dungeon */
X
X /* now for open spaces -- not on level 10 */
X if (k != MAXLEVEL-1) {
X tmp2 = rnd(3)+3;
X for (tmp=0; tmp<tmp2; tmp++) {
X my = rnd(11)+2;
X myl = my - rnd(2);
X myh = my + rnd(2);
X if (k < MAXLEVEL) {
X mx = rnd(44)+5;
X mxl = mx - rnd(4);
X mxh = mx + rnd(12)+3;
X z=0;
X }
X else {
X mx = rnd(60)+3;
X mxl = mx - rnd(2);
X mxh = mx + rnd(2);
X z = makemonst(k);
X }
X for (i=mxl; i<mxh; i++)
X for (j=myl; j<myh; j++) {
X item[i][j]=0;
X if ((mitem[i][j]=z))
X hitp[i][j]=monster[z].hitpoints;
X }
X }
X }
X if (k!=MAXLEVEL-1) {
X my=rnd(MAXY-2);
X for (i=1; i<MAXX-1; i++)
X item[i][my] = 0;
X }
X if (k>1) treasureroom(k);
X}
X
X/*
X function to eat away a filled in maze
X */
Xeat(xx,yy)
Xregister int xx,yy;
X{
X register int dir,try;
X
X dir = rnd(4);
X try=2;
X while (try) {
X switch(dir) {
X case 1:
X if (xx <= 2) break; /* west */
X if ((item[xx-1][yy]!=OWALL) || (item[xx-2][yy]!=OWALL))
X break;
X item[xx-1][yy] = item[xx-2][yy] = 0;
X eat(xx-2,yy);
X break;
X case 2:
X if (xx >= MAXX-3) break; /* east */
X if ((item[xx+1][yy]!=OWALL) || (item[xx+2][yy]!=OWALL))
X break;
X item[xx+1][yy] = item[xx+2][yy] = 0;
X eat(xx+2,yy);
X break;
X case 3:
X if (yy <= 2) break; /* south */
X if ((item[xx][yy-1]!=OWALL) || (item[xx][yy-2]!=OWALL))
X break;
X item[xx][yy-1] = item[xx][yy-2] = 0;
X eat(xx,yy-2);
X break;
X case 4:
X if (yy >= MAXY-3 ) break; /*north */
X if ((item[xx][yy+1]!=OWALL) || (item[xx][yy+2]!=OWALL))
X break;
X item[xx][yy+1] = item[xx][yy+2] = 0;
X eat(xx,yy+2);
X break;
X };
X if (++dir > 4) {
X dir=1;
X --try;
X }
X }
X}
X
X/*
X * function to read in a maze from a data file
X *
X * Format of maze data file:
X * 1st character = # of mazes in file (ascii digit)
X * For each maze:
X * 18 lines (1st 17 used)
X * 67 characters per line
X *
X * Special characters in maze data file:
X *
X * # wall D door
X * . random monster ~ eye of larn
X * ! cure dianthroritis - random object
X */
Xcannedlevel(k)
Xint k;
X{
X char *row,*lgetl();
X register int i,j;
X int it,arg,mit,marg;
X
X if (lopen(larnlevels)<0) {
X write(1,"Can't open the maze data file\n",30);
X died(-282);
X return(0);
X }
X for (i=18*rund(20); i>0; i--)
X lgetl(); /* advance to desired maze */
X
X for (i=0; i<MAXY; i++) {
X row = lgetl();
X for (j=0; j<MAXX; j++) {
X it = mit = arg = marg = 0;
X switch(*row++) {
X case '#':
X it = OWALL;
X break;
X case 'D':
X it = OCLOSEDDOOR;
X arg = rnd(30);
X break;
X case '~':
X if (k!=MAXLEVEL-1) break;
X it = OLARNEYE;
X mit = DEMONPRINCE;
X marg = monster[mit].hitpoints;
X break;
X case '!':
X if (k!=MAXLEVEL+MAXVLEVEL-1)
X break;
X it = OPOTION;
X arg = 21;
X mit = LUCIFER;
X marg = monster[mit].hitpoints;
X break;
X case '.':
X if (k<MAXLEVEL) break;
X mit = makemonst(k+1);
X marg = monster[mit].hitpoints;
X break;
X case '-':
X it = newobject(k+1,&arg);
X break;
X };
X item[j][i] = it;
X iarg[j][i] = arg;
X mitem[j][i] = mit;
X hitp[j][i] = marg;
X#if WIZID
X know[j][i] = (wizard) ? 1 : 0;
X#else
X know[j][i] = 0;
X#endif
X }
X }
X lrclose();
X return(1);
X}
X
X/*
X function to make a treasure room on a level
X level 10's treasure room has the eye in it and demon lords
X level V3 has potion of cure dianthroritis and demon prince
X */
Xtreasureroom(lv)
Xregister int lv;
X{
X register int tx,ty,xsize,ysize;
X
X for (tx=1+rnd(10); tx<MAXX-10; tx+=10)
X if ( (lv==MAXLEVEL-1) || (lv==MAXLEVEL+MAXVLEVEL-1) || rnd(13)==2) {
X xsize = rnd(6)+3;
X ysize = rnd(3)+3;
X ty = rnd(MAXY-9)+1; /* upper left corner of room */
X if (lv==MAXLEVEL-1 || lv==MAXLEVEL+MAXVLEVEL-1)
X troom(lv,xsize,ysize,tx=tx+rnd(MAXX-24),ty,rnd(3)+6);
X else
X troom(lv,xsize,ysize,tx,ty,rnd(9));
X }
X}
X
X/*
X * subroutine to create a treasure room of any size at a given location
X * room is filled with objects and monsters
X * the coordinate given is that of the upper left corner of the room
X */
Xtroom(lv,xsize,ysize,tx,ty,glyph)
Xint lv,xsize,ysize,tx,ty,glyph;
X{
X register int i,j;
X int tp1,tp2;
X
X for (j=ty-1; j<=ty+ysize; j++)
X for (i=tx-1; i<=tx+xsize; i++) /* clear out space for room */
X item[i][j]=0;
X for (j=ty; j<ty+ysize; j++)
X for (i=tx; i<tx+xsize; i++) /* now put in the walls */
X {
X item[i][j]=OWALL;
X mitem[i][j]=0;
X }
X for (j=ty+1; j<ty+ysize-1; j++)
X for (i=tx+1; i<tx+xsize-1; i++) /* now clear out interior */
X item[i][j]=0;
X switch(rnd(2)) /* locate the door on the treasure room */
X {
X case 1:
X item[i=tx+rund(xsize)][j=ty+(ysize-1)*rund(2)]=OCLOSEDDOOR;
X iarg[i][j] = glyph; /* on horizontal walls */
X break;
X case 2:
X item[i=tx+(xsize-1)*rund(2)][j=ty+rund(ysize)]=OCLOSEDDOOR;
X iarg[i][j] = glyph; /* on vertical walls */
X break;
X };
X
X tp1=playerx;
X tp2=playery;
X playery=ty+(ysize>>1);
X if (c[HARDGAME]<2)
X for (playerx=tx+1; playerx<=tx+xsize-2; playerx+=2)
X for (i=0, j=rnd(6); i<=j; i++) {
X something(lv+2);
X createmonster(makemonst(lv+2));
X }
X else
X for (playerx=tx+1; playerx<=tx+xsize-2; playerx+=2)
X for (i=0, j=rnd(4); i<=j; i++) {
X something(lv+2);
X createmonster(makemonst(lv+4));
X }
X playerx=tp1;
X playery=tp2;
X}
X
X/*
X ***********
X MAKE_OBJECT
X ***********
X subroutine to create the objects in the maze for the given level
X */
Xmakeobject(j)
Xregister int j;
X{
X register int i;
X
X if (j==0) {
X fillroom(OENTRANCE,0); /* entrance to dungeon*/
X fillroom(ODNDSTORE,0); /* the DND STORE */
X fillroom(OSCHOOL,0); /* college of Larn */
X fillroom(OBANK,0); /* 1st national bank of larn*/
X fillroom(OVOLDOWN,0); /* volcano shaft to temple*/
X fillroom(OHOME,0); /* the players home & family*/
X fillroom(OTRADEPOST,0); /* the trading post */
X fillroom(OLRS,0); /* the larn revenue service */
X return;
X }
X if (j==MAXLEVEL)
X fillroom(OVOLUP,0); /* volcano shaft up from the temple */
X
X /* make the fixed object in the maze STAIRS and
X random object ELEVATORS */
X
X if ((j>0) && (j != MAXLEVEL-1) && (j < MAXLEVEL+MAXVLEVEL-3))
X fillroom(OSTAIRSDOWN,0);
X
X if ((j > 1) && (j != MAXLEVEL))
X fillroom(OSTAIRSUP,0);
X
X if ((j>3) && (j != MAXLEVEL))
X if (c[ELVUP]==0)
X if (rnd(100) > 85) {
X fillroom(OELEVATORUP,0);
X c[ELVUP]++;
X }
X
X if ((j>0) && (j<=MAXLEVEL-2))
X if (c[ELVDOWN]==0)
X if (rnd(100) > 85) {
X fillroom(OELEVATORDOWN,0);
X c[ELVDOWN]++;
X }
X
X /* make the random objects in the maze */
X fillmroom(rund(3),OBOOK,j);
X fillmroom(rund(3),OCOOKIE,0);
X fillmroom(rund(3),OALTAR,0);
X fillmroom(rund(3),OSTATUE,0);
X fillmroom(rund(3),OFOUNTAIN,0);
X fillmroom(rund(2),OTHRONE,0);
X fillmroom(rund(2),OMIRROR,0);
X
X if (j >= MAXLEVEL+MAXVLEVEL-3)
X fillroom(OPIT,0);
X fillmroom(rund(3),OPIT,0);
X
X if (j >= MAXLEVEL+MAXVLEVEL-3)
X fillroom(OIVTRAPDOOR,0);
X fillmroom(rund(2),OIVTRAPDOOR,0);
X fillmroom(rund(2),OTRAPARROWIV,0);
X fillmroom(rnd(3)-2,OIVTELETRAP,0);
X fillmroom(rnd(3)-2,OIVDARTRAP,0);
X
X if (j==1) fillmroom(1,OCHEST,j);
X else fillmroom(rund(2),OCHEST,j);
X
X if (j<MAXLEVEL-1) {
X fillmroom(rund(2),ODIAMOND,rnd(10*j+1)+10);
X fillmroom(rund(2),ORUBY,rnd(6*j+1)+6);
X fillmroom(rund(2),OEMERALD,rnd(4*j+1)+4);
X fillmroom(rund(2),OSAPPHIRE,rnd(3*j+1)+2);
X }
X
X for (i=0; i<rnd(4)+3; i++)
X fillroom(OPOTION,newpotion()); /* make a POTION */
X
X for (i=0; i<rnd(5)+3; i++)
X fillroom(OSCROLL,newscroll()); /* make a SCROLL */
X
X for (i=0; i<rnd(12)+11; i++)
X fillroom(OGOLDPILE,12*rnd(j+1)+(j<<3)+10); /* make GOLD */
X
X if (j==8)
X fillroom(OBANK2,0); /* branch office of the bank */
X
X if ( (c[PAD]==0) && (j>=4) )
X if (rnd(100) > 75) {
X fillroom(OPAD,0); /* Dealer McDope's Pad */
X c[PAD]++;
X }
X
X froom(2,ORING,0); /* a ring mail */
X froom(1,OSTUDLEATHER,0); /* a studded leather */
X froom(3,OSPLINT,0); /* a splint mail*/
X froom(5,OSHIELD,rund(3)); /* a shield */
X froom(2,OBATTLEAXE,rund(3)); /* a battle axe */
X froom(5,OLONGSWORD,rund(3)); /* a long sword */
X froom(5,OFLAIL,rund(3)); /* a flail */
X froom(7,OSPEAR,rnd(5)); /* a spear */
X froom(4,OREGENRING,rund(3)); /* ring of regeneration */
X froom(1,OPROTRING,rund(3)); /* ring of protection */
X froom(2,OSTRRING,rund(5)); /* ring of strength */
X froom(2,ORINGOFEXTRA,0); /* ring of extra regen */
X
X if (c[LAMP]==0) {
X if (rnd(120) < 8) {
X fillroom (OBRASSLAMP,0);
X c[LAMP]++;
X goto zug;
X }
X }
X
X if (c[WAND]==0) { /* wand of wonder */
X if (rnd(120) < 8) {
X fillroom(OWWAND,0);
X c[WAND]++;
X goto zug;
X }
X }
X
X if (c[DRAGSLAY]==0) /* orb of dragon slaying */
X if(rnd(120) < 8) {
X fillroom(OORBOFDRAGON,0);
X c[DRAGSLAY]++;
X goto zug;
X }
X
X if (c[NEGATE]==0) /* scarab of negate spirit */
X if(rnd(120) < 8) {
X fillroom(OSPIRITSCARAB,0);
X c[NEGATE]++;
X goto zug;
X }
X
X if (c[CUBEUNDEAD]==0) /* cube of undead control */
X if (rnd(120) < 8) {
X fillroom(OCUBEofUNDEAD,0);
X c[CUBEUNDEAD]++;
X goto zug;
X }
X
X if (c[DEVICE]==0) /* device of antitheft */
X if (rnd(120) < 8) {
X fillroom(ONOTHEFT,0);
X c[DEVICE]++;
X goto zug;
X }
X
X if(c[TALISMAN]==0) /* talisman of the sphere */
X if(rnd(120) < 8) {
X fillroom(OSPHTALISMAN,0);
X c[TALISMAN]++;
X goto zug;
X }
X
X if (c[HAND]==0) /* hand of fear */
X if (rnd(120) < 8) {
X fillroom(OHANDofFEAR,0);
X c[HAND]++;
X goto zug;
X }
X
X if (c[ORB] == 0) /* orb of enlightenment */
X if (rnd(120) < 8) {
X fillroom(OORB,0);
X c[ORB]++;
X goto zug;
X }
X
X if (c[ELVEN]==0) /* elven chain */
X if (rnd(120) < 8) {
X fillroom(OELVENCHAIN,0);
X c[ELVEN]++;
X }
Xzug:
X if (c[SLASH]==0) /* sword of slashing */
X if (rnd(120) < 8) {
X fillroom(OSWORDofSLASHING,0);
X c[SLASH]++;
X }
X
X if (c[BESSMANN]==0) /* Bessman's flailing hammer */
X if(rnd(120) < 8) {
X fillroom(OHAMMER,0);
X c[BESSMANN]++;
X }
X
X if ((j>=10)&&(j<=20)&&(c[SLAY]==0)) /* Slayer */
X if (rnd(100) > 85-(j-10)) {
X fillroom (OSLAYER,0);
X c[SLAY]++;
X }
X
X if ((c[STAFF]==0) && (j>=8) && (j<=20)) /* staff of power */
X if (rnd(100) > 85-(j-10)) {
X fillroom(OPSTAFF,0);
X c[STAFF]++;
X }
X
X if (c[HARDGAME]<3 || (rnd(4)==3)) {
X if (j>3) {
X froom(3,OSWORD,rund(6)); /* sunsword */
X froom(5,O2SWORD,rnd(6)); /* a two handed sword */
X froom(3,OBELT,rund(7)); /* belt of striking */
X froom(3,OENERGYRING,rund(6)); /* energy ring */
X froom(4,OPLATE,rund(8)); /* platemail */
X }
X }
X}
X
X/*
X subroutine to fill in a number of objects of the same kind
X */
Xfillmroom(n,what,arg)
Xint n,arg;
Xchar what;
X{
X register int i;
X
X for (i=0; i<n; i++)
X fillroom(what,arg);
X}
X
Xfroom(n,itm,arg)
Xint n;
Xchar itm;
Xint arg;
X{
X if (rnd(151) < n)
X fillroom(itm,arg);
X}
X
X/*
X * subroutine to put an object into an empty room
X * uses a random walk
X */
Xfillroom(what,arg)
Xchar what;
Xint arg;
X{
X register int x,y;
X
X x=rnd(MAXX-2);
X y=rnd(MAXY-2);
X while (item[x][y]) {
X x += rnd(3)-2;
X y += rnd(3)-2;
X if (x > MAXX-2) x=1;
X if (x < 1) x=MAXX-2;
X if (y > MAXY-2) y=1;
X if (y < 1) y=MAXY-2;
X }
X item[x][y]=what;
X iarg[x][y]=arg;
X}
X
X/*
X subroutine to put monsters into an empty room without walls or other
X monsters
X */
Xfillmonst(what)
Xchar what;
X{
X register int x,y,trys;
X
X for (trys=10; trys>0; --trys) /* max # of creation attempts */
X {
X x=rnd(MAXX-2);
X y=rnd(MAXY-2);
X if ((item[x][y]==0) && (mitem[x][y]==0) &&
X ((playerx!=x) || (playery!=y))) {
X mitem[x][y] = what;
X know[x][y]=0;
X hitp[x][y] = monster[what].hitpoints;
X return(0);
X }
X }
X return(-1); /* creation failure */
X}
X
X/*
X creates an entire set of monsters for a level
X must be done when entering a new level
X if sethp(1) then wipe out old monsters else leave them there
X */
Xsethp(flg)
Xint flg;
X{
X register int i,j;
X
X if (flg)
X for (i=0; i<MAXY; i++)
X for (j=0; j<MAXX; j++)
X stealth[j][i]=0;
X if (level==0) {
X c[TELEFLAG]=0;
X return;
X } /* if teleported and found level 1 then know level we are on */
X
X if (flg)
X j = rnd(12) + 2 + (level>>1);
X else
X j = (level>>1) + 1;
X
X for (i=0; i<j; i++)
X fillmonst(makemonst(level));
X
X if ((level >= 11) && (level<=15)) {
X i=level-10;
X for (j=1;j<=i;j++)
X if (fillmonst(DEMONLORD+rund(7))==-1)
X j--;
X }
X if (level > 15 ) {
X i=level-15;
X for (j=1;j<=i;j++)
X if (fillmonst(DEMONPRINCE)==-1)
X j--;
X }
X positionplayer();
X}
X
X/*
X * Function to destroy all genocided monsters on the present level
X */
Xcheckgen()
X{
X register int x,y;
X
X for (y=0; y<MAXY; y++)
X for (x=0; x<MAXX; x++)
X if (monster[mitem[x][y]].genocided)
X mitem[x][y]=0; /* no more monster */
X}
END_OF_FILE
if test 14814 -ne `wc -c <'create.c'`; then
echo shar: \"'create.c'\" unpacked with wrong size!
fi
# end of 'create.c'
fi
if test -f 'global.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'global.c'\"
else
echo shar: Extracting \"'global.c'\" \(18790 characters\)
sed "s/^X//" >'global.c' <<'END_OF_FILE'
X/* global.c
X *
X * raiselevel() subroutine to raise the player one level
X * loselevel() subroutine to lower the player by one level
X * raiseexperience(x) subroutine to increase experience points
X * loseexperience(x) subroutine to lose experience points
X * losehp(x) subroutine to remove hit points from the player
X * losemhp(x) subroutine to remove max # hit points from
X * the player
X * raisehp(x) subroutine to gain hit points
X * raisemhp(x) subroutine to gain maximum hit points
X * losespells(x) subroutine to lose spells
X * losemspells(x) subroutine to lose maximum spells
X * raisespells(x) subroutine to gain spells
X * raisemspells(x) subroutine to gain maximum spells
X * recalc() function to recalculate the armor class of
X * the player
X * makemonst(lev) function to return monster number for a randomly
X * selected monster
X * positionplayer() function to be sure player is not in a wall
X * quit() subroutine to ask if the player really wants
X * to quit
X */
X
X#include "header.h"
Xextern int score[],srcount,dropflag;
Xextern int random;/* the random number seed */
Xextern short playerx,playery,lastnum;
Xextern char cheat,level,monstnamelist[];
Xextern char lastmonst[],*what[],*who[];
Xextern char winner[];
Xextern char logname[],monstlevel[];
Xextern char sciv[SCORESIZE+1][26][2],*potionname[],*scrollname[];
X/*
X ***********
X RAISE LEVEL
X ***********
X raiselevel()
X
X subroutine to raise the player one level
X uses the skill[] array to find level boundarys
X uses c[EXPERIENCE] c[LEVEL]
X */
Xraiselevel()
X{
X if (c[LEVEL] < MAXPLEVEL)
X raiseexperience((long)(skill[c[LEVEL]]-c[EXPERIENCE]));
X}
X
X/*
X ***********
X LOOSE LEVEL
X ***********
X loselevel()
X
X subroutine to lower the players character level by one
X */
Xloselevel()
X{
X if (c[LEVEL] > 1) loseexperience((long)(c[EXPERIENCE] - skill[c[LEVEL]-1] + 1));
X}
X
X/*
X ****************
X RAISE EXPERIENCE
X ****************
X raiseexperience(x)
X
X subroutine to increase experience points
X */
Xraiseexperience(x)
Xregister long x;
X{
X register int i,tmp;
X
X i=c[LEVEL];
X c[EXPERIENCE]+=x;
X while (c[EXPERIENCE] >= skill[c[LEVEL]] && (c[LEVEL] < MAXPLEVEL)) {
X tmp = (c[CONSTITUTION]-c[HARDGAME])>>1;
X c[LEVEL]++;
X raisemhp((int)(rnd(3)+rnd((tmp>0)?tmp:1)));
X raisemspells((int)rund(3));
X if (c[LEVEL] < 7-c[HARDGAME])
X raisemhp((int)(c[CONSTITUTION]>>2));
X }
X if (c[LEVEL] != i) {
X cursors();
X beep();
X lprintf("\nWelcome to level %d",(long)c[LEVEL]);
X /* if we changed levels */
X switch (c[LEVEL]) {
X case 94: /* earth guardian */
X c[WTW] = 99999L;
X break;
X case 95: /* air guardian */
X c[INVISIBILITY] = 99999L;
X break;
X case 96: /* fire guardian */
X c[FIRERESISTANCE] = 99999L;
X break;
X case 97: /* water guardian */
X c[CANCELLATION] = 99999L;
X break;
X case 98: /* time guardian */
X c[HASTESELF] = 99999L;
X break;
X case 99: /* ethereal guardian */
X c[STEALTH] = 99999L;
X c[SPIRITPRO] = 99999L;
X break;
X case 100:
X lprcat("\nYou are now The Creator ");
X {
X register int i,j;
X
X for (i=0; i<MAXY; i++)
X for (j=0; j<MAXX; j++)
X know[j][i]=1;
X for (i=0; i<SPNUM; i++)
X spelknow[i]=1;
X for (i=0; i<MAXSCROLL; i++)
X scrollname[i][0]=' ';
X for (i=0; i<MAXPOTION; i++)
X potionname[i][0]=' ';
X }
X/* c[STEALTH] = 99999L;
X c[UNDEADPRO] = 99999L;
X c[SPIRITPRO] = 99999L;
X c[CHARMCOUNT] = 99999L;
X c[GIANTSTR] = 99999L;
X c[FIRERESISTANCE] = 99999L;
X c[DEXCOUNT] = 99999L;
X c[STRCOUNT] = 99999L;
X c[SCAREMONST] = 99999L;
X c[HASTESELF] = 99999L;
X c[CANCELLATION] = 99999L;
X c[INVISIBILITY] = 99999L;
X c[ALTPRO] = 99999L;
X c[WTW] = 99999L;
X c[AWARENESS] = 99999L;
X*/
X break;
X }
X }
X}
X
X/*
X ****************
X LOOSE EXPERIENCE
X ****************
X loseexperience(x)
X
X subroutine to lose experience points
X */
Xloseexperience(x)
Xregister long x;
X{
X register int i,tmp;
X
X i=c[LEVEL];
X c[EXPERIENCE]-=x;
X if (c[EXPERIENCE] < 0) c[EXPERIENCE]=0;
X while (c[EXPERIENCE] < skill[c[LEVEL]-1])
X {
X if (--c[LEVEL] <= 1)
X c[LEVEL]=1; /* down one level */
X tmp = (c[CONSTITUTION]-c[HARDGAME])>>1; /* lose hpoints */
X losemhp((int)rnd((tmp>0)?tmp:1)); /* lose hpoints */
X if (c[LEVEL] < 7-c[HARDGAME])
X losemhp((int)(c[CONSTITUTION]>>2));
X losemspells((int)rund(3)); /* lose spells */
X }
X if (i!=c[LEVEL])
X {
X cursors();
X beep();
X lprintf("\nYou went down to level %d!",(long)c[LEVEL]);
X }
X bottomline();
X}
X
X/*
X ********
X LOOSE HP
X ********
X losehp(x)
X losemhp(x)
X
X subroutine to remove hit points from the player
X warning -- will kill player if hp goes to zero
X */
Xlosehp(x)
Xregister int x;
X{
X if ((c[HP] -= x) <= 0)
X {
X beep();
X lprcat("\n");
X nap(3000);
X died(lastnum);
X }
X}
X
Xlosemhp(x)
Xregister int x;
X{
X c[HP] -= x;
X if (c[HP] < 1)
X c[HP]=1;
X c[HPMAX] -= x;
X if (c[HPMAX] < 1)
X c[HPMAX]=1;
X}
X
X/*
X ********
X RAISE HP
X ********
X raisehp(x)
X raisemhp(x)
X
X subroutine to gain maximum hit points
X */
Xraisehp(x)
Xregister int x;
X{
X if ((c[HP] += x) > c[HPMAX]) c[HP] = c[HPMAX];
X}
X
Xraisemhp(x)
Xregister int x;
X{
X c[HPMAX] += x;
X c[HP] += x;
X}
X
X/*
X ************
X RAISE SPELLS
X ************
X raisespells(x)
X raisemspells(x)
X
X subroutine to gain maximum spells
X */
Xraisespells(x)
Xregister int x;
X{
X if ((c[SPELLS] += x) > c[SPELLMAX]) c[SPELLS] = c[SPELLMAX];
X}
X
Xraisemspells(x)
Xregister int x;
X{
X c[SPELLMAX]+=x;
X c[SPELLS]+=x;
X}
X
X/*
X ************
X LOSE SPELLS
X ************
X losespells(x)
X losemspells(x)
X
X subroutine to lose maximum spells
X */
Xlosespells(x)
Xregister int x;
X{
X if ((c[SPELLS] -= x) < 0) c[SPELLS]=0;
X}
X
Xlosemspells(x)
Xregister int x;
X{
X if ((c[SPELLMAX] -= x) < 0) c[SPELLMAX]=0;
X if ((c[SPELLS] -= x) < 0) c[SPELLS]=0;
X}
X
X/*
X makemonst(lev)
X int lev;
X
X function to return monster number for a randomly selected monster
X for the given cave level
X */
Xmakemonst(lev)
Xregister int lev;
X{
X register int tmp,x;
X
X
X if (lev < 1)
X lev = 1;
X if (lev > 12)
X lev = 12;
X
X tmp=WATERLORD;
X
X if (lev < 5)
X while (tmp==WATERLORD)
X tmp=rnd((x=monstlevel[lev-1])?x:1);
X
X else while (tmp==WATERLORD)
X tmp=rnd((x=monstlevel[lev-1]-monstlevel[lev-4])?x:1)+monstlevel[lev-4];
X
X while (monster[tmp].genocided && tmp<MAXMONST) tmp++; /* genocided? */
X
X if (level < 16)
X if (rnd(100)<10) tmp=LEMMING;
X
X return(tmp);
X}
X
X/*
X positionplayer()
X
X function to be sure player is not in a wall
X */
Xpositionplayer()
X{
X int try;
X try = 2;
X
X while ((item[playerx][playery] || mitem[playerx][playery]) && (try))
X if (++playerx >= MAXX-1)
X {
X playerx = 1;
X if (++playery >= MAXY-1)
X {
X playery = 1;
X --try;
X }
X }
X if (try==0) lprcat("Failure in positionplayer\n");
X}
X
X/*
X recalc() function to recalculate the armor class of the player
X */
Xrecalc()
X{
X register int i,j,k;
X
X c[AC] = c[MOREDEFENSES];
X if (c[WEAR] >= 0)
X switch(iven[c[WEAR]]) {
X case OSHIELD:
X c[AC] += 2 + ivenarg[c[WEAR]];
X break;
X case OLEATHER:
X c[AC] += 2 + ivenarg[c[WEAR]];
X break;
X case OSTUDLEATHER:
X c[AC] += 3 + ivenarg[c[WEAR]];
X break;
X case ORING:
X c[AC] += 5 + ivenarg[c[WEAR]];
X break;
X case OCHAIN:
X c[AC] += 6 + ivenarg[c[WEAR]];
X break;
X case OSPLINT:
X c[AC] += 7 + ivenarg[c[WEAR]];
X break;
X case OPLATE:
X c[AC] += 9 + ivenarg[c[WEAR]];
X break;
X case OPLATEARMOR:
X c[AC] += 10 + ivenarg[c[WEAR]];
X break;
X case OSSPLATE:
X c[AC] += 12 + ivenarg[c[WEAR]];
X break;
X case OELVENCHAIN:
X c[AC] += 15 + ivenarg[c[WEAR]];
X break;
X }
X
X if (c[SHIELD] >= 0) if (iven[c[SHIELD]] == OSHIELD) c[AC] += 2 + ivenarg[c[SHIELD]];
X if (c[WIELD] < 0) c[WCLASS] = 0;
X else {
X i = ivenarg[c[WIELD]];
X switch(iven[c[WIELD]]) {
X case ODAGGER:
X c[WCLASS] = 3 + i;
X break;
X case OBELT:
X c[WCLASS] = 7 + i;
X break;
X case OSHIELD:
X c[WCLASS] = 8 + i;
X break;
X case OPSTAFF:
X case OSPEAR:
X c[WCLASS] = 10 + i;
X break;
X case OFLAIL:
X c[WCLASS] = 14 + i;
X break;
X case OBATTLEAXE:
X c[WCLASS] = 17 + i;
X break;
X case OLANCE:
X c[WCLASS] = 20 + i;
X break;
X case OLONGSWORD:
X c[WCLASS] = 22 + i;
X break;
X case O2SWORD:
X c[WCLASS] = 26 + i;
X break;
X case OSWORDofSLASHING:
X c[WCLASS] = 30 + i;
X break;
X case OSLAYER:
X c[WCLASS] = 30 + i;
X break;
X case OSWORD:
X c[WCLASS] = 32 + i;
X break;
X case OHAMMER:
X c[WCLASS] = 35 + i;
X break;
X default:
X c[WCLASS] = 0;
X }
X }
X c[WCLASS] += c[MOREDAM];
X
X /* now for regeneration abilities based on rings */
X c[REGEN]=1;
X c[ENERGY]=0;
X j=0;
X for (k=25; k>0; k--) if (iven[k]) {
X j=k;
X k=0;
X }
X for (i=0; i<=j; i++) {
X switch(iven[i]) {
X case OPROTRING:
X c[AC] += ivenarg[i] + 1;
X break;
X case ODAMRING:
X c[WCLASS] += ivenarg[i] + 1;
X break;
X case OBELT:
X c[WCLASS] += ((ivenarg[i]<<1)) + 2;
X break;
X
X case OREGENRING:
X c[REGEN] += ivenarg[i] + 1;
X break;
X case ORINGOFEXTRA:
X c[REGEN] += 5 * (ivenarg[i]+1);
X break;
X case OENERGYRING:
X c[ENERGY] += ivenarg[i] + 1;
X break;
X }
X }
X}
X
X
X/*
X quit()
X
X subroutine to ask if the player really wants to quit
X */
Xquit()
X{
X register int i;
X
X cursors();
X strcpy(lastmonst,"");
X lprcat("\n\nDo you really want to quit? (y)es, (n)o, (s)ave");
X while (1) {
X i=getcharacter();
X if (i == 'y') {
X died(300);
X return;
X }
X if ((i == 'n') || (i == '\33')) {
X lprcat(" no");
X lflush();
X return;
X }
X if (i == 's') {
X lprcat(" save");
X lflush();
X clear();
X lprcat("Saving . . .");
X lflush();
X savegame(savefilename);
X wizard=1;
X died(-257);
X }
X lprcat("\n");
X if (boldon) setbold();
X lprcat("Yes");
X if (boldon) resetbold();
X lprcat(" ");
X if (boldon) setbold();
X lprcat("Save");
X if (boldon) resetbold();
X lprcat(" or ");
X if (boldon) setbold();
X lprcat("No");
X if (boldon) resetbold();
X lprcat(" please? Do you want to quit? ");
X }
X}
X
X/*
X function to ask --more-- then the user must enter a space
X */
Xmore()
X{
X lprcat("\n --- press ");
X standout("space");
X lprcat(" to continue --- ");
X while (getcharacter() != ' ');
X}
X
X/*
X function to put something in the players inventory
X returns 0 if success, 1 if a failure
X */
Xtake(itm,arg)
Xint itm,arg;
X{
X register int i,limit;
X
X /* cursors(); */
X if ((limit = 15+(c[LEVEL]>>1)) > 26) limit=26;
X for (i=0; i<limit; i++)
X if (iven[i]==0) {
X iven[i] = itm;
X ivenarg[i] = arg;
X limit=0;
X switch(itm) {
X case OPROTRING:
X case ODAMRING:
X case OBELT:
X limit=1;
X break;
X case ODEXRING:
X c[DEXTERITY] += ivenarg[i]+1;
X limit=1;
X break;
X case OSTRRING:
X c[STREXTRA] += ivenarg[i]+1;
X limit=1;
X break;
X case OCLEVERRING:
X c[INTELLIGENCE] += ivenarg[i]+1;
X limit=1;
X break;
X case OHAMMER:
X c[DEXTERITY] += 10;
X c[STREXTRA]+=10;
X c[INTELLIGENCE]-=10;
X limit=1;
X break;
X case OORB:
X c[ORB]++;
X c[AWARENESS]++;
X break;
X case OORBOFDRAGON:
X c[SLAYING]++;
X break;
X case OSPIRITSCARAB:
X c[NEGATESPIRIT]++;
X break;
X case OCUBEofUNDEAD:
X c[CUBEofUNDEAD]++;
X break;
X case ONOTHEFT:
X c[NOTHEFT]++;
X break;
X case OSWORDofSLASHING:
X c[DEXTERITY] +=5;
X limit=1;
X break;
X case OSLAYER:
X c[INTELLIGENCE]+=10;
X break;
X case OPSTAFF:
X c[WISDOM]+=10;
X break;
X case OLARNEYE:
X monstnamelist[DEMONLORD] = '1';
X monstnamelist[DEMONLORD+1] = '2';
X monstnamelist[DEMONLORD+2] = '3';
X monstnamelist[DEMONLORD+3] = '4';
X monstnamelist[DEMONLORD+4] = '5';
X monstnamelist[DEMONLORD+5] = '6';
X monstnamelist[DEMONLORD+6] = '7';
X monstnamelist[DEMONPRINCE] = '9';
X monstnamelist[LUCIFER] = '0';
X break;
X };
X
X lprcat("\nYou pick up:");
X srcount=0;
X show3(i);
X if (limit) bottomline();
X return(0);
X }
X lprcat("\nYou can't carry anything else");
X return(1);
X}
X
X/*
X subroutine to drop an object returns 1 if something there already else
X
X k is index into iven list of object to drop
X */
X
Xdrop_object(k)
Xint k;
X{
X int itm;
X
X if ((k<0) || (k>25)) return(0);
X itm = iven[k];
X cursors();
X if (itm==0) {
X lprintf("\nYou don't have item %c! ",k+'a');
X return(1);
X }
X if (item[playerx][playery]) {
X beep();
X lprcat("\nThere's something here already");
X return(1);
X }
X if (playery==MAXY-1 && playerx==33)
X return(1); /* not in entrance */
X
X item[playerx][playery] = itm;
X iarg[playerx][playery] = ivenarg[k];
X
X srcount=0;
X lprcat("\n You drop:");
X show3(k); /* show what item you dropped*/
X know[playerx][playery] = 0;
X iven[k]=0;
X if (c[WIELD]==k)
X c[WIELD]= -1;
X if (c[WEAR]==k)
X c[WEAR] = -1;
X if (c[SHIELD]==k)
X c[SHIELD]= -1;
X adjustcvalues(itm,ivenarg[k]);
X if (itm==OLANCE) recalc();
X/* say dropped an item so wont ask to pick it up right away */
X dropflag=1;
X return(0);
X}
X
X/*
X function to enchant armor player is currently wearing
X */
Xenchantarmor()
X{
X register int tmp;
X if (c[WEAR]<0) {
X if (c[SHIELD] < 0)
X {
X cursors();
X beep();
X lprcat("\nYou feel a sense of loss");
X return;
X }
X else {
X tmp=iven[c[SHIELD]];
X if (tmp != OSCROLL) if (tmp != OPOTION) {
X ivenarg[c[SHIELD]]++;
X bottomline();
X }
X }
X }
X tmp = iven[c[WEAR]];
X if (tmp!=OSCROLL) if (tmp!=OPOTION) {
X ivenarg[c[WEAR]]++;
X bottomline();
X }
X}
X
X/*
X function to enchant a weapon presently being wielded
X */
Xenchweapon()
X{
X register int tmp;
X
X if (c[WIELD]<0) {
X cursors();
X beep();
X lprcat("\nYou feel depressed");
X return;
X }
X tmp = iven[c[WIELD]];
X if (tmp!=OSCROLL) if (tmp!=OPOTION) {
X ivenarg[c[WIELD]]++;
X if (tmp==OCLEVERRING) c[INTELLIGENCE]++;
X else
X if (tmp==OSTRRING) c[STREXTRA]++;
X else
X if (tmp==ODEXRING) c[DEXTERITY]++;
X bottomline();
X }
X}
X
X/*
X routine to tell if player can carry one more thing
X returns 1 if pockets are full, else 0
X */
Xpocketfull()
X{
X register int i,limit;
X if ((limit = 15+(c[LEVEL]>>1)) > 26) limit=26;
X for (i=0; i<limit; i++) if (iven[i]==0) return(0);
X return(1);
X}
X
X/*
X function to return 1 if a monster is next to the player else returns 0
X */
Xnearbymonst()
X{
X register int tmp,tmp2;
X for (tmp=playerx-1; tmp<playerx+2; tmp++)
X for (tmp2=playery-1; tmp2<playery+2; tmp2++)
X if (mitem[tmp][tmp2]) return(1); /* if monster nearby */
X return(0);
X}
X
X/*
X function to steal an item from the players pockets
X returns 1 if steals something else returns 0
X */
Xstealsomething()
X{
X register int i,j;
X
X j=100;
X while (1) {
X i=rund(26);
X if (iven[i]) if (c[WEAR]!=i) if (c[WIELD]!=i) if (c[SHIELD]!=i) {
X srcount=0;
X show3(i);
X adjustcvalues(iven[i],ivenarg[i]);
X iven[i]=0;
X return(1);
X }
X if (--j <= 0) return(0);
X }
X}
X
X/*
X function to return 1 is player carrys nothing else return 0
X */
Xemptyhanded()
X{
X register int i;
X
X for (i=0; i<26; i++)
X if (iven[i]) if (i!=c[WIELD]) if (i!=c[WEAR]) if (i!=c[SHIELD]) return(0);
X return(1);
X}
X
X/*
X function to create a gem on a square near the player
X */
Xcreategem()
X{
X register int i,j;
X switch(rnd(4))
X {
X case 1:
X i=ODIAMOND;
X j=50;
X break;
X case 2:
X i=ORUBY;
X j=40;
X break;
X case 3:
X i=OEMERALD;
X j=30;
X break;
X default:
X i=OSAPPHIRE;
X j=20;
X break;
X };
X createitem(i,rnd(j)+j/10);
X}
X
X/*
X function to change character levels as needed when dropping an object
X that affects these characteristics
X */
Xadjustcvalues(itm,arg)
Xint itm,arg;
X{
X register int flag,i;
X
X flag=0;
X switch(itm) {
X case ODEXRING:
X c[DEXTERITY] -= arg+1;
X flag=1;
X break;
X case OSTRRING:
X c[STREXTRA] -= arg+1;
X flag=1;
X break;
X case OCLEVERRING:
X c[INTELLIGENCE] -= arg+1;
X flag=1;
X break;
X case OHAMMER:
X c[DEXTERITY] -= 10;
X c[STREXTRA] -= 10;
X c[INTELLIGENCE] += 10;
X flag=1;
X break;
X case OORB:
X c[ORB]--;
X c[AWARENESS]--;
X case OSWORDofSLASHING:
X c[DEXTERITY] -= 5;
X flag=1;
X break;
X case OSLAYER:
X c[INTELLIGENCE]-=10;
X flag=1;
X break;
X case OPSTAFF:
X c[WISDOM]-=10;
X flag=1;
X break;
X case OORBOFDRAGON:
X --c[SLAYING];
X return;
X case OSPIRITSCARAB:
X --c[NEGATESPIRIT];
X return;
X case OCUBEofUNDEAD:
X --c[CUBEofUNDEAD];
X return;
X case ONOTHEFT:
X --c[NOTHEFT];
X return;
X case OLANCE:
X c[LANCEDEATH]=0;
X return;
X case 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 cursors();
X return;
X case OPOTION:
X case OSCROLL:
X return;
X
X default:
X flag=1;
X };
X if (flag) bottomline();
X
X for (i=0;i<6;i++)
X if (c[i] < 3)
X c[i] = 3;
X}
X
X/*
X function to read a string from token input "string"
X returns a pointer to the string
X */
Xgettokstr(str)
Xregister char *str;
X{
X register int i,j;
X
X i=50;
X while ((getcharacter() != '"') && (--i > 0));
X i=36;
X while (--i > 0) {
X if ((j=getcharacter()) != '"') *str++ = j;
X else i=0;
X }
X *str = 0;
X i=50;
X if (j != '"') while ((getcharacter() != '"') && (--i > 0)); /* if end due to too long, then find closing quote */
X}
X
X/*
X function to ask user for a password (no echo)
X returns 1 if entered correctly, 0 if not
X */
Xstatic char gpwbuf[33];
X
Xgetpassword()
X{
X register int i,j;
X register char *gpwp;
X extern char *password;
X
X scbr(); /* system("stty -echo cbreak"); */
X gpwp = gpwbuf;
X lprcat("\nEnter Password: ");
X lflush();
X i = strlen(password);
X for (j=0; j<i; j++) read(0,gpwp++,1);
X gpwbuf[i]=0;
X sncbr(); /* system("stty echo -cbreak"); */
X if (strcmp(gpwbuf,password) != 0) {
X lprcat("\nSorry\n");
X lflush();
X return(0);
X }
X else return(1);
X}
X
X/*
X subroutine to get a yes or no response from the user
X returns y or n
X */
Xgetyn()
X{
X register int i;
X
X i=0;
X while (i!='y' && i!='n' && i!='\33') i=getcharacter();
X return(i);
X}
X
X/*
X function to calculate the pack weight of the player
X returns the number of pounds the player is carrying
X */
Xpackweight()
X{
X register int i,j,k;
X
X k=c[GOLD]/1000;
X j=25;
X while ((iven[j]==0) && (j>0)) --j;
X for (i=0; i<=j; i++)
X switch(iven[i]) {
X case 0:
X break;
X case OSSPLATE:
X case OPLATEARMOR:
X k += 40;
X break;
X case OPLATE:
X k += 35;
X break;
X case OHAMMER:
X k += 30;
X break;
X case OSPLINT:
X k += 26;
X break;
X
X case OCHAIN:
X case OBATTLEAXE:
X case O2SWORD:
X k += 23;
X break;
X
X case OLONGSWORD:
X case OPSTAFF:
X case OSWORD:
X case ORING:
X case OFLAIL:
X k += 20;
X break;
X
X case OELVENCHAIN:
X case OSWORDofSLASHING:
X case OLANCE:
X case OSLAYER:
X case OSTUDLEATHER:
X k += 15;
X break;
X
X
X case OLEATHER:
X case OSPEAR:
X k += 8;
X break;
X
X case OORBOFDRAGON:
X case OORB:
X case OBELT:
X k += 4;
X break;
X
X case OSHIELD:
X k += 7;
X break;
X case OCHEST:
X k += 30 + ivenarg[i];
X break;
X default:
X k++;
X };
X return(k);
X}
END_OF_FILE
if test 18790 -ne `wc -c <'global.c'`; then
echo shar: \"'global.c'\" unpacked with wrong size!
fi
# end of 'global.c'
fi
if test -f 'header.h' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'header.h'\"
else
echo shar: Extracting \"'header.h'\" \(13542 characters\)
sed "s/^X//" >'header.h' <<'END_OF_FILE'
X/* header.h */
X#include <sys/types.h>
X#include <sys/stat.h>
X#include <sys/timeb.h>
X
X#ifdef BSD
X# include <sys/time.h>
X# include <sgtty.h>
X#else
X# include <sys/times.h>
X# include <termio.h>
X#endif
X
X#include <fcntl.h>
X#include <ctype.h>
X#include <varargs.h>
X#include <pwd.h>
X#include <signal.h>
X#include <stdio.h>
X
X#define SCORENAME "Uscore"
X#define LOGFNAME "Ulog"
X#define HELPNAME "Uhelp"
X#define LEVELSNAME "Umaps"
X#define FORTSNAME "Ufortune"
X
X#define MAXLEVEL 16 /* max # levels + 1 in the dungeon */
X#define MAXVLEVEL 5 /* max # of levels in the temple of the luran (volcano) */
X
X#define MAXX 67
X#define MAXY 17
X
X#define SCORESIZE 25 /* this is the number of people on a scoreboard max */
X#define MAXPLEVEL 100 /* maximum player level allowed */
X
X/* 56 monsters, 7 demon lords, 1 demon prince, 1 God of Hellfire*/
X#define MAXMONST 57 /* maximum # monsters in the dungeon */
X
X#define SPNUM 39 /* maximum number of spells in existance */
X#define MAXSCROLL 28 /* maximum number of scrolls that are possible */
X#define MAXPOTION 35 /* maximum number of potions that are possible */
X#define TIMELIMIT 40000 /* the maximum number moves before the game is called*/
X#define TAXRATE 1/20 /* the tax rate for the LRS */
X#define MAXOBJ 93 /* the maximum number of objects n < MAXOBJ */
X
X/* this is the structure definition of the monster data */
Xstruct monst
X{
X char *name;
X char level;
X short armorclass;
X char damage;
X char attack;
X char defense;
X char genocided;
X char intelligence; /* used to choose movement */
X short gold;
X short hitpoints;
X unsigned long experience;
X};
X
X/* this is the structure definition for the items in the dnd store */
Xstruct _itm
X{
X short price;
X char **mem;
X char obj;
X char arg;
X char qty;
X};
X
X/* this is the structure that holds the entire dungeon specifications */
Xstruct cel
X{
X short hitp; /* monster's hit points */
X char mitem; /* the monster ID */
X char item; /* the object's ID */
X short iarg; /* the object's argument */
X char know; /* have we been here before*/
X};
X
X/* this is the structure for maintaining & moving the spheres of annihilation */
Xstruct sphere
X{
X struct sphere *p; /* pointer to next structure */
X char x,y,lev; /* location of the sphere */
X char dir; /* direction sphere is going in */
X char lifetime; /* duration of the sphere */
X};
X
X/* defines for the character attribute array c[] */
X#define STRENGTH 0 /* characters physical strength not due to objects */
X#define INTELLIGENCE 1
X#define WISDOM 2
X#define CONSTITUTION 3
X#define DEXTERITY 4
X#define CHARISMA 5
X#define HPMAX 6
X#define HP 7
X#define GOLD 8
X#define EXPERIENCE 9
X#define LEVEL 10
X#define REGEN 11
X#define WCLASS 12
X#define AC 13
X#define BANKACCOUNT 14
X#define SPELLMAX 15
X#define SPELLS 16
X#define ENERGY 17
X#define ECOUNTER 18
X#define MOREDEFENSES 19
X#define WEAR 20
X#define PROTECTIONTIME 21
X#define WIELD 22
X#define AMULET 23 /* if have amulet of invisibility */
X#define REGENCOUNTER 24
X#define MOREDAM 25
X#define DEXCOUNT 26
X#define STRCOUNT 27
X#define BLINDCOUNT 28 /* if blind */
X#define CAVELEVEL 29
X#define CONFUSE 30 /* if confused */
X#define ALTPRO 31
X#define HERO 32 /* if hero */
X#define CHARMCOUNT 33
X#define INVISIBILITY 34 /* if invisible */
X#define CANCELLATION 35 /* if cancel cast */
X#define HASTESELF 36 /* if hasted */
X#define EYEOFLARN 37 /* if have eye */
X#define AGGRAVATE 38
X#define GLOBE 39
X#define TELEFLAG 40 /* if been teleported */
X#define SLAYING 41 /* if have orb of dragon slaying */
X#define NEGATESPIRIT 42 /* if negate spirit */
X#define SCAREMONST 43 /* if scare cast */
X#define AWARENESS 44 /* if awareness cast */
X#define HOLDMONST 45
X#define TIMESTOP 46
X#define HASTEMONST 47
X#define CUBEofUNDEAD 48 /* if have cube */
X#define GIANTSTR 49 /* if giant strength */
X#define FIRERESISTANCE 50
X#define BESSMANN 51 /* flag for hammer */
X#define NOTHEFT 52
X#define HARDGAME 53
X#define BYTESIN 54 /* used for checkpointing in tok.c */
X
X /* 55 to 59 are open */
X
X
X
X#define LANCEDEATH 60 /* if have LoD */
X#define SPIRITPRO 61
X#define UNDEADPRO 62
X#define SHIELD 63
X#define STEALTH 64
X#define ITCHING 65
X#define LAUGHING 66 /* not implemented */
X#define DRAINSTRENGTH 67
X#define CLUMSINESS 68
X#define INFEEBLEMENT 69
X#define HALFDAM 70
X#define SEEINVISIBLE 71
X#define FILLROOM 72
X /* 73 is open */
X#define SPHCAST 74 /* nz if an active sphere of annihilation */
X#define WTW 75 /* walk through walls */
X#define STREXTRA 76 /* character strength due to objects or enchantments */
X#define TMP 77 /* misc scratch space */
X#define LIFEPROT 78 /* life protection counter */
X
X /* FLAGS : non-zero if object has been made */
X#define ORB 79 /* orb - 1 if created, 2 if held */
X#define ELVUP 80 /* elevator up */
X#define ELVDOWN 81 /* elevator down */
X#define HAND 82 /* Hand of Fear */
X#define CUBEUNDEAD 83 /* cube of undead control */
X#define DRAGSLAY 84 /* orb of dragon slaying */
X#define NEGATE 85 /* scarab of negate spirit */
X#define URN 86 /* golden urn */
X#define LAMP 87 /* brass lamp */
X#define TALISMAN 88 /* Talisman of the Sphere */
X#define WAND 89 /* wand of wonder */
X#define STAFF 90 /* staff of power */
X#define DEVICE 91 /* anti-theft */
X#define SLASH 92 /* sword of slashing */
X#define ELVEN 93 /* elven chain */
X#define VORP 94 /* Vorpal */
X#define SLAY 95 /* Slayer */
X#define PAD 96 /* Dealer McDopes */
X
X#define COKED 97 /* timer for being coked out */
X/* used up to 97 of 100 */
X
X/* defines for the objects in the game */
X#define OALTAR 1
X#define OTHRONE 2
X#define OORB 3 /* orb of enlightement - gives expanded awareness
X as long as held */
X#define OPIT 4
X#define OSTAIRSUP 5
X#define OELEVATORUP 6
X#define OFOUNTAIN 7
X#define OSTATUE 8
X#define OTELEPORTER 9
X#define OSCHOOL 10
X#define OMIRROR 11
X#define ODNDSTORE 12
X#define OSTAIRSDOWN 13
X#define OELEVATORDOWN 14
X#define OBANK2 15
X#define OBANK 16
X#define ODEADFOUNTAIN 17
X#define OMAXGOLD 70
X#define OGOLDPILE 18
X#define OOPENDOOR 19
X#define OCLOSEDDOOR 20
X#define OWALL 21
X#define OTRAPARROW 66
X#define OTRAPARROWIV 67
X
X#define OLARNEYE 22
X
X#define OPLATE 23
X#define OCHAIN 24
X#define OLEATHER 25
X#define ORING 60
X#define OSTUDLEATHER 61
X#define OSPLINT 62
X#define OPLATEARMOR 63
X#define OSSPLATE 64
X#define OSHIELD 68
X
X#define OSWORDofSLASHING 26 /* impervious to rust, light, strong */
X#define OHAMMER 27 /* Bessman's Flailing Hammer */
X#define OSWORD 28
X#define O2SWORD 29 /* 2 handed sword */
X#define OSPEAR 30
X#define ODAGGER 31
X#define OBATTLEAXE 57
X#define OLONGSWORD 58
X#define OFLAIL 59
X#define OLANCE 65
X
X#define ORINGOFEXTRA 32
X#define OREGENRING 33
X#define OPROTRING 34
X#define OENERGYRING 35
X#define ODEXRING 36
X#define OSTRRING 37
X#define OCLEVERRING 38
X#define ODAMRING 39
X
X#define OBELT 40
X
X#define OSCROLL 41
X#define OPOTION 42
X#define OBOOK 43
X#define OCHEST 44
X
X#define OAMULET 45
X#define OORBOFDRAGON 46
X#define OSPIRITSCARAB 47
X#define OCUBEofUNDEAD 48
X#define ONOTHEFT 49
X
X#define ODIAMOND 50
X#define ORUBY 51
X#define OEMERALD 52
X#define OSAPPHIRE 53
X
X#define OENTRANCE 54
X#define OVOLDOWN 55
X#define OVOLUP 56
X#define OHOME 69
X
X#define OKGOLD 71
X#define ODGOLD 72
X#define OIVDARTRAP 73
X#define ODARTRAP 74
X#define OTRAPDOOR 75
X#define OIVTRAPDOOR 76
X#define OTRADEPOST 77
X#define OIVTELETRAP 78
X#define ODEADTHRONE 79
X#define OANNIHILATION 80 /* sphere of annihilation */
X#define OTHRONE2 81
X#define OLRS 82 /* Larn Revenue Service */
X#define OCOOKIE 83
X#define OURN 84 /* golden urn - not implemented */
X#define OBRASSLAMP 85 /* brass lamp - genie pops up and offers spell */
X#define OHANDofFEAR 86 /* hand of fear - scare monster spell lasts
X twice as long if have this */
X#define OSPHTALISMAN 87 /* talisman of the sphere */
X#define OWWAND 88 /* wand of wonder - cant fall in trap doors/pits */
X#define OPSTAFF 89 /* staff of power - cancels drain life attack*/
X
X#define OVORPAL 90 /* ? - not implemented */
X#define OSLAYER 91 /* magical sword - increases intelligence by 10,
X halves damage caused by demons, demon prince
X and lucifer - strong as lance of death against them*/
X
X#define OELVENCHAIN 92 /* elven chain - strong and light,
X impervious to rust */
X#define OSPEED 93
X#define OACID 94
X#define OHASH 95
X#define OSHROOMS 96
X#define OCOKE 97
X#define OPAD 98 /* Dealer McDope's Pad */
X/* used up to 98 */
X
X/* defines for the monsters as objects */
X
X#define LEMMING 1
X#define GNOME 2
X#define HOBGOBLIN 3
X#define JACKAL 4
X#define KOBOLD 5
X#define ORC 6
X#define SNAKE 7
X#define CENTIPEDE 8
X#define JACULI 9
X#define TROGLODYTE 10
X#define ANT 11
X#define EYE 12
X#define LEPRECHAUN 13
X#define NYMPH 14
X#define QUASIT 15
X#define RUSTMONSTER 16
X#define ZOMBIE 17
X#define ASSASSINBUG 18
X#define BUGBEAR 19
X#define HELLHOUND 20
X#define ICELIZARD 21
X#define CENTAUR 22
X#define TROLL 23
X#define YETI 24
X#define WHITEDRAGON 25
X#define ELF 26
X#define CUBE 27
X#define METAMORPH 28
X#define VORTEX 29
X#define ZILLER 30
X#define VIOLETFUNGI 31
X#define WRAITH 32
X#define FORVALAKA 33
X#define LAMANOBE 34
X#define OSEQUIP 35
X#define ROTHE 36
X#define XORN 37
X#define VAMPIRE 38
X#define INVISIBLESTALKER 39
X#define POLTERGEIST 40
X#define DISENCHANTRESS 41
X#define SHAMBLINGMOUND 42
X#define YELLOWMOLD 43
X#define UMBERHULK 44
X#define GNOMEKING 45
X#define MIMIC 46
X#define WATERLORD 47
X#define BRONZEDRAGON 48
X#define GREENDRAGON 49
X#define PURPLEWORM 50
X#define XVART 51
X#define SPIRITNAGA 52
X#define SILVERDRAGON 53
X#define PLATINUMDRAGON 54
X#define GREENURCHIN 55
X#define REDDRAGON 56
X#define DEMONLORD 57
X#define DEMONPRINCE 64
X#define LUCIFER 65
X
X#define BUFBIG 4096 /* size of the output buffer */
X#define MAXIBUF 4096 /* size of the input buffer */
X#define LOGNAMESIZE 40 /* max size of the players name */
X#define PSNAMESIZE 40 /* max size of the process name */
X#define SAVEFILENAMESIZE 128 /* max size of the savefile path */
X
Xextern char aborted[],beenhere[],boldon,cheat,ckpfile[],ckpflag;
Xextern char *class[],course[],diagfile[],fortfile[],helpfile[];
Xextern char *inbuffer,drug[];
Xextern char item[MAXX][MAXY],iven[],know[MAXX][MAXY],larnlevels[],lastmonst[];
Xextern char level,*levelname[],logfile[],loginname[],logname[],*lpbuf,*lpend;
Xextern char *lpnt,moved[MAXX][MAXY],mitem[MAXX][MAXY],monstlevel[];
Xextern char monstnamelist[],nch[],ndgg[],nlpts[],nomove,nosignal,nowelcome;
Xextern char nplt[],nsw[],*objectname[], char_class[];
Xextern char objnamelist[],optsfile[],*potionname[],potprob[];
Xextern char predostuff,restorflag,savefilename[],scorefile[],scprob[];
Xextern char screen[MAXX][MAXY],*scrollname[],sex,*spelcode[],*speldescript[];
Xextern char spelknow[],*spelname[],*spelmes[],spelweird[MAXMONST+8][SPNUM];
Xextern char splev[],stealth[MAXX][MAXY],wizard;
Xextern short diroffx[],diroffy[],hitflag,hit2flag,hit3flag,hitp[MAXX][MAXY];
Xextern short iarg[MAXX][MAXY],ivenarg[],lasthx,lasthy,lastnum,lastpx,lastpy;
Xextern short nobeep,oldx,oldy,playerx,playery;
Xextern int dayplay,enable_scroll,srcount,stayflag,yrepcount,userid,lfd,fd;
Xextern long initialtime,outstanding_taxes,skill[],gtime,c[],cbak[];
Xextern unsigned long randx;
Xextern struct cel *cell;
Xextern struct monst monster[];
Xextern struct sphere *spheres;
Xextern struct _itm itm[];
X
Xchar *fortune(),*malloc(),*getenv(),*getlogin(),*lgetw(),*lgetl(),*ctime();
Xchar *tmcapcnv(),*tgetstr(),*tgoto();
Xlong paytaxes(),lgetc(),lrint(),time();
Xlong readnum();
X
X /* macro to create scroll #'s with probability of occurrence */
X#define newscroll() (scprob[rund(81)])
X /* macro to return a potion # created with probability of occurrence */
X#define newpotion() (potprob[rund(41)])
X /* macro to return the + points on created leather armor */
X#define newleather() (nlpts[rund(c[HARDGAME]?10:13)])
X /* macro to return the + points on chain armor */
X#define newchain() (nch[rund(10)])
X /* macro to return + points on plate armor */
X#define newplate() (nplt[rund(c[HARDGAME]?3:10)])
X /* macro to return + points on new daggers */
X#define newdagger() (ndgg[rund(13)])
X /* macro to return + points on new swords */
X#define newsword() (nsw[rund(c[HARDGAME]?6:13)])
X /* macro to destroy object at present location */
X#define forget() (item[playerx][playery]=know[playerx][playery]=0)
X /* macro to wipe out a monster at a location */
X#define disappear(x,y) (mitem[x][y]=know[x][y]=0)
X
X /* defines below are for use in the termcap mode only */
X#define ST_START 1
X#define ST_END 2
X#define BOLD 3
X#define END_BOLD 4
X#define CLEAR 5
X#define CL_LINE 6
X#define CL_DOWN 14
X#define CURSOR 15
X /* macro to turn on bold display for the terminal */
X#define setbold() (*lpnt++ = ST_START)
X /* macro to turn off bold display for the terminal */
X#define resetbold() (*lpnt++ = ST_END)
X /* macro to setup the scrolling region for the terminal */
X#define setscroll() enable_scroll=1
X /* macro to clear the scrolling region for the terminal */
X#define resetscroll() enable_scroll=0
X /* macro to clear the screen and home the cursor */
X#define clear() (*lpnt++ =CLEAR, cbak[SPELLS]= -50)
X /* macro to clear to end of line */
X#define cltoeoln() (*lpnt++ = CL_LINE)
X
X /* macro to output one byte to the output buffer */
X#define lprc(ch) ((lpnt>=lpend)?(*lpnt++ =(ch), lflush()):(*lpnt++ =(ch)))
X
X /* macro to seed the random number generator */
X#define srand(x) (randx=x)
X /* macros to generate random numbers 1<=rnd(N)<=N 0<=rund(N)<=N-1 */
X#define rnd(x) ((((randx=randx*1103515245+12345)>>7)%(x))+1)
X#define rund(x) ((((randx=randx*1103515245+12345)>>7)%(x)))
X /* macros for miscellaneous data conversion */
X#define min(x,y) (((x)>(y))?(y):(x))
X#define max(x,y) (((x)>(y))?(x):(y))
END_OF_FILE
if test 13542 -ne `wc -c <'header.h'`; then
echo shar: \"'header.h'\" unpacked with wrong size!
fi
# end of 'header.h'
fi
if test -f 'regen.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'regen.c'\"
else
echo shar: Extracting \"'regen.c'\" \(3702 characters\)
sed "s/^X//" >'regen.c' <<'END_OF_FILE'
X/* regen.c */
X#include "header.h"
X/*
X *******
X REGEN()
X *******
X regen()
X
X subroutine to regenerate player hp and spells
X */
Xregen()
X{
X register int i,flag;
X register long *d;
X
X d = c;
X if (d[TIMESTOP]) {
X if(--d[TIMESTOP]<=0)
X bottomline();
X return;
X } /* for stop time spell */
X flag=0;
X
X if (d[STRENGTH]<3) {
X d[STRENGTH]=3;
X flag=1;
X }
X if ((d[HASTESELF]==0) || ((d[HASTESELF] & 1) == 0))
X gtime++;
X
X if (d[HP] != d[HPMAX])
X if (d[REGENCOUNTER]-- <= 0) /*regenerate hit points */
X {
X d[REGENCOUNTER] = 22 + (d[HARDGAME]<<1) - d[LEVEL];
X if ((d[HP] += d[REGEN]) > d[HPMAX])
X d[HP] = d[HPMAX];
X bottomhp();
X }
X
X if (d[SPELLS] < d[SPELLMAX]) /*regenerate spells */
X if (d[ECOUNTER]-- <= 0) {
X d[ECOUNTER] = 100+4*(d[HARDGAME]-d[LEVEL]-d[ENERGY]);
X d[SPELLS]++;
X bottomspell();
X }
X
X if (d[HERO])
X if (--d[HERO]<=0) {
X for (i=0; i<6; i++)
X d[i] -= 10;
X flag=1;
X }
X if (d[COKED])
X if (--d[COKED]<=0) {
X for (i=0; i<6; i++)
X d[i] -= 34;
X flag=1;
X }
X if (d[ALTPRO])
X if (--d[ALTPRO]<=0) {
X d[MOREDEFENSES]-=3;
X flag=1;
X }
X if (d[PROTECTIONTIME])
X if (--d[PROTECTIONTIME]<=0) {
X d[MOREDEFENSES]-=2;
X flag=1;
X }
X if (d[DEXCOUNT])
X if (--d[DEXCOUNT]<=0) {
X if ( (d[DEXTERITY]-=3) < 3 )
X d[DEXTERITY] = 3;
X flag=1;
X }
X if (d[STRCOUNT])
X if (--d[STRCOUNT]<=0) {
X d[STREXTRA]-=3;
X flag=1;
X }
X if (d[BLINDCOUNT])
X if (--d[BLINDCOUNT]<=0) {
X cursors();
X lprcat("\nThe blindness lifts ");
X beep();
X }
X if (d[CONFUSE])
X if (--d[CONFUSE]<=0) {
X cursors();
X lprcat("\nYou regain your senses");
X beep();
X }
X if (d[GIANTSTR])
X if (--d[GIANTSTR]<=0) {
X d[STREXTRA] -= 20;
X flag=1;
X }
X if (d[CHARMCOUNT])
X if ((--d[CHARMCOUNT]) <= 0) flag=1;
X if (d[INVISIBILITY])
X if ((--d[INVISIBILITY]) <= 0) flag=1;
X if (d[CANCELLATION])
X if ((--d[CANCELLATION]) <= 0) flag=1;
X if (d[WTW])
X if ((--d[WTW]) <= 0) flag=1;
X if (d[HASTESELF])
X if ((--d[HASTESELF]) <= 0) flag=1;
X if (d[AGGRAVATE])
X --d[AGGRAVATE];
X if (d[SCAREMONST])
X if ((--d[SCAREMONST]) <= 0) flag=1;
X if (d[STEALTH])
X if ((--d[STEALTH]) <= 0) flag=1;
X if (d[AWARENESS])
X if(c[ORB] != 2)
X --d[AWARENESS];
X if (d[HOLDMONST])
X if ((--d[HOLDMONST]) <= 0) flag=1;
X if (d[HASTEMONST])
X --d[HASTEMONST];
X if (d[FIRERESISTANCE])
X if ((--d[FIRERESISTANCE]) <= 0) flag=1;
X if (d[GLOBE])
X if (--d[GLOBE]<=0) {
X d[MOREDEFENSES]-=10;
X flag=1;
X }
X if (d[SPIRITPRO])
X if (--d[SPIRITPRO] <= 0) flag=1;
X if (d[UNDEADPRO])
X if (--d[UNDEADPRO] <= 0) flag=1;
X if (d[HALFDAM])
X if (--d[HALFDAM]<=0) {
X cursors();
X lprcat("\nYou now feel better ");
X beep();
X }
X if (d[SEEINVISIBLE]) {
X int i;
X for (i=0;i<26;i++)
X if (iven[i]==OAMULET) {
X i=999;
X break;
X }
X if (i!=999)
X if (--d[SEEINVISIBLE]<=0) {
X monstnamelist[INVISIBLESTALKER] = ' ';
X cursors();
X lprcat("\nYou feel your vision return to normal");
X beep();
X }
X }
X
X if (d[ITCHING]) {
X if (d[ITCHING]>1)
X if ((d[WEAR]!= -1) || (d[SHIELD]!= -1))
X if (rnd(100)<50) {
X d[WEAR]=d[SHIELD]= -1;
X cursors();
X lprcat("\nThe hysteria of itching forces you to remove your armor!");
X beep();
X recalc();
X bottomline();
X }
X if (--d[ITCHING]<=0) {
X cursors();
X lprcat("\nYou now feel the irritation subside!");
X beep();
X }
X }
X if (d[CLUMSINESS]) {
X if (d[WIELD] != -1)
X if (d[CLUMSINESS]>1)
X if (item[playerx][playery]==0)/* if nothing there */
X if (rnd(100)<33) /* drop your weapon */
X drop_object((int)d[WIELD]);
X if (--d[CLUMSINESS]<=0) {
X cursors();
X lprcat("\nYou now feel less awkward!");
X beep();
X }
X }
X if (flag)
X bottomline();
X}
END_OF_FILE
if test 3702 -ne `wc -c <'regen.c'`; then
echo shar: \"'regen.c'\" unpacked with wrong size!
fi
# end of 'regen.c'
fi
echo shar: End of archive 6 \(of 8\).
cp /dev/null ark6isdone
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

Reply all
Reply to author
Forward
0 new messages