Path: utzoo!utgpu!jarvis.csri.toronto.edu!mailrus!tut.cis.ohio-state.edu!cs.utexas.edu!uunet!zephyr!tektronix!tekgen!tekred!saab!billr From: billr@saab.CNA.TEK.COM (Bill Randle) Newsgroups: comp.sources.games Subject: v07i006: ularn - ultra-larn, an enhancement of the larn adventure game, Part06/08 Message-ID: <4199@tekred.CNA.TEK.COM> Date: 6 Jul 89 14:04:06 GMT Sender: news@tekred.CNA.TEK.COM Lines: 2438 Approved: billr@saab.CNA.TEK.COM Submitted-by: "Philip A. Cordier" 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 '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 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; i1) 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>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=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 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>1); X else X j = (level>>1) + 1; X X for (i=0; i= 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'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>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= 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; i25)) 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 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; j0)) --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 X#include X#include X X#ifdef BSD X# include X# include X#else X# include X# include X#endif X X#include X#include X#include X#include X#include X#include 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