Home | History | Annotate | Line # | Download | only in larn
global.c revision 1.2
      1  1.2  mycroft #ifndef lint
      2  1.2  mycroft static char rcsid[] = "$Id: global.c,v 1.2 1993/08/02 17:20:02 mycroft Exp $";
      3  1.2  mycroft #endif /* not lint */
      4  1.2  mycroft 
      5  1.1      cgd /*	global.c 		Larn is copyrighted 1986 by Noah Morgan.
      6  1.1      cgd  *
      7  1.1      cgd  *	raiselevel()		subroutine to raise the player one level
      8  1.1      cgd  *	loselevel()		subroutine to lower the player by one level
      9  1.1      cgd  *	raiseexperience(x)	subroutine to increase experience points
     10  1.1      cgd  *	loseexperience(x)	subroutine to lose experience points
     11  1.1      cgd  *	losehp(x)			subroutine to remove hit points from the player
     12  1.1      cgd  *	losemhp(x)			subroutine to remove max # hit points from the player
     13  1.1      cgd  *	raisehp(x)			subroutine to gain hit points
     14  1.1      cgd  *	raisemhp(x)			subroutine to gain maximum hit points
     15  1.1      cgd  *	losespells(x)		subroutine to lose spells
     16  1.1      cgd  *	losemspells(x)		subroutine to lose maximum spells
     17  1.1      cgd  *	raisespells(x)		subroutine to gain spells
     18  1.1      cgd  *	raisemspells(x)		subroutine to gain maximum spells
     19  1.1      cgd  *	recalc()			function to recalculate the armor class of the player
     20  1.1      cgd  *	makemonst(lev)		function to return monster number for a randomly selected monster
     21  1.1      cgd  *	positionplayer()	function to be sure player is not in a wall
     22  1.1      cgd  *	quit()				subroutine to ask if the player really wants to quit
     23  1.1      cgd  */
     24  1.1      cgd 
     25  1.1      cgd #include "header.h"
     26  1.1      cgd extern int score[],srcount,dropflag;
     27  1.1      cgd extern int random;/*	the random number seed			*/
     28  1.1      cgd extern short playerx,playery,lastnum;
     29  1.1      cgd extern char cheat,level,monstnamelist[];
     30  1.1      cgd extern char lastmonst[],*what[],*who[];
     31  1.1      cgd extern char winner[];
     32  1.1      cgd extern char logname[],monstlevel[];
     33  1.1      cgd extern char sciv[SCORESIZE+1][26][2],*potionname[],*scrollname[];
     34  1.1      cgd /*
     35  1.1      cgd 	***********
     36  1.1      cgd 	RAISE LEVEL
     37  1.1      cgd 	***********
     38  1.1      cgd 	raiselevel()
     39  1.1      cgd 
     40  1.1      cgd 	subroutine to raise the player one level
     41  1.1      cgd 	uses the skill[] array to find level boundarys
     42  1.1      cgd 	uses c[EXPERIENCE]  c[LEVEL]
     43  1.1      cgd  */
     44  1.1      cgd raiselevel()
     45  1.1      cgd 	{
     46  1.1      cgd 	if (c[LEVEL] < MAXPLEVEL) raiseexperience((long)(skill[c[LEVEL]]-c[EXPERIENCE]));
     47  1.1      cgd 	}
     48  1.1      cgd 
     49  1.1      cgd /*
     50  1.1      cgd 	***********
     51  1.1      cgd 	LOOSE LEVEL
     52  1.1      cgd 	***********
     53  1.1      cgd     loselevel()
     54  1.1      cgd 
     55  1.1      cgd 	subroutine to lower the players character level by one
     56  1.1      cgd  */
     57  1.1      cgd loselevel()
     58  1.1      cgd 	{
     59  1.1      cgd 	if (c[LEVEL] > 1) loseexperience((long)(c[EXPERIENCE] - skill[c[LEVEL]-1] + 1));
     60  1.1      cgd 	}
     61  1.1      cgd 
     62  1.1      cgd /*
     63  1.1      cgd 	****************
     64  1.1      cgd 	RAISE EXPERIENCE
     65  1.1      cgd 	****************
     66  1.1      cgd 	raiseexperience(x)
     67  1.1      cgd 
     68  1.1      cgd 	subroutine to increase experience points
     69  1.1      cgd  */
     70  1.1      cgd raiseexperience(x)
     71  1.1      cgd 	register long x;
     72  1.1      cgd 	{
     73  1.1      cgd 	register int i,tmp;
     74  1.1      cgd 	i=c[LEVEL];	c[EXPERIENCE]+=x;
     75  1.1      cgd 	while (c[EXPERIENCE] >= skill[c[LEVEL]] && (c[LEVEL] < MAXPLEVEL))
     76  1.1      cgd 		{
     77  1.1      cgd 		tmp = (c[CONSTITUTION]-c[HARDGAME])>>1;
     78  1.1      cgd 		c[LEVEL]++;	raisemhp((int)(rnd(3)+rnd((tmp>0)?tmp:1)));
     79  1.1      cgd 		raisemspells((int)rund(3));
     80  1.1      cgd 		if (c[LEVEL] < 7-c[HARDGAME]) raisemhp((int)(c[CONSTITUTION]>>2));
     81  1.1      cgd 		}
     82  1.1      cgd 	if (c[LEVEL] != i)
     83  1.1      cgd 		{
     84  1.1      cgd 		cursors();
     85  1.1      cgd 		beep(); lprintf("\nWelcome to level %d",(long)c[LEVEL]);	/* if we changed levels	*/
     86  1.1      cgd 		}
     87  1.1      cgd 	bottomline();
     88  1.1      cgd 	}
     89  1.1      cgd 
     90  1.1      cgd /*
     91  1.1      cgd 	****************
     92  1.1      cgd 	LOOSE EXPERIENCE
     93  1.1      cgd 	****************
     94  1.1      cgd 	loseexperience(x)
     95  1.1      cgd 
     96  1.1      cgd 	subroutine to lose experience points
     97  1.1      cgd  */
     98  1.1      cgd loseexperience(x)
     99  1.1      cgd 	register long x;
    100  1.1      cgd 	{
    101  1.1      cgd 	register int i,tmp;
    102  1.1      cgd 	i=c[LEVEL];		c[EXPERIENCE]-=x;
    103  1.1      cgd 	if (c[EXPERIENCE] < 0) c[EXPERIENCE]=0;
    104  1.1      cgd 	while (c[EXPERIENCE] < skill[c[LEVEL]-1])
    105  1.1      cgd 		{
    106  1.1      cgd 		if (--c[LEVEL] <= 1) c[LEVEL]=1;	/*	down one level		*/
    107  1.1      cgd 		tmp = (c[CONSTITUTION]-c[HARDGAME])>>1;	/* lose hpoints */
    108  1.1      cgd 		losemhp((int)rnd((tmp>0)?tmp:1));	/* lose hpoints */
    109  1.1      cgd 		if (c[LEVEL] < 7-c[HARDGAME]) losemhp((int)(c[CONSTITUTION]>>2));
    110  1.1      cgd 		losemspells((int)rund(3));				/*	lose spells		*/
    111  1.1      cgd 		}
    112  1.1      cgd 	if (i!=c[LEVEL])
    113  1.1      cgd 		{
    114  1.1      cgd 		cursors();
    115  1.1      cgd 		beep(); lprintf("\nYou went down to level %d!",(long)c[LEVEL]);
    116  1.1      cgd 		}
    117  1.1      cgd 	bottomline();
    118  1.1      cgd 	}
    119  1.1      cgd 
    120  1.1      cgd /*
    121  1.1      cgd 	********
    122  1.1      cgd 	LOOSE HP
    123  1.1      cgd 	********
    124  1.1      cgd 	losehp(x)
    125  1.1      cgd 	losemhp(x)
    126  1.1      cgd 
    127  1.1      cgd 	subroutine to remove hit points from the player
    128  1.1      cgd 	warning -- will kill player if hp goes to zero
    129  1.1      cgd  */
    130  1.1      cgd losehp(x)
    131  1.1      cgd 	register int x;
    132  1.1      cgd 	{
    133  1.1      cgd 	if ((c[HP] -= x) <= 0)
    134  1.1      cgd 		{
    135  1.1      cgd 		beep(); lprcat("\n");  nap(3000);  died(lastnum);
    136  1.1      cgd 		}
    137  1.1      cgd 	}
    138  1.1      cgd 
    139  1.1      cgd losemhp(x)
    140  1.1      cgd 	register int x;
    141  1.1      cgd 	{
    142  1.1      cgd 	c[HP] -= x;		if (c[HP] < 1)		c[HP]=1;
    143  1.1      cgd 	c[HPMAX] -= x;	if (c[HPMAX] < 1)	c[HPMAX]=1;
    144  1.1      cgd 	}
    145  1.1      cgd 
    146  1.1      cgd /*
    147  1.1      cgd 	********
    148  1.1      cgd 	RAISE HP
    149  1.1      cgd 	********
    150  1.1      cgd 	raisehp(x)
    151  1.1      cgd 	raisemhp(x)
    152  1.1      cgd 
    153  1.1      cgd 	subroutine to gain maximum hit points
    154  1.1      cgd  */
    155  1.1      cgd raisehp(x)
    156  1.1      cgd 	register int x;
    157  1.1      cgd 	{
    158  1.1      cgd 	if ((c[HP] += x) > c[HPMAX]) c[HP] = c[HPMAX];
    159  1.1      cgd 	}
    160  1.1      cgd 
    161  1.1      cgd raisemhp(x)
    162  1.1      cgd 	register int x;
    163  1.1      cgd 	{
    164  1.1      cgd 	c[HPMAX] += x;	c[HP] += x;
    165  1.1      cgd 	}
    166  1.1      cgd 
    167  1.1      cgd /*
    168  1.1      cgd 	************
    169  1.1      cgd 	RAISE SPELLS
    170  1.1      cgd 	************
    171  1.1      cgd 	raisespells(x)
    172  1.1      cgd 	raisemspells(x)
    173  1.1      cgd 
    174  1.1      cgd 	subroutine to gain maximum spells
    175  1.1      cgd  */
    176  1.1      cgd raisespells(x)
    177  1.1      cgd 	register int x;
    178  1.1      cgd 	{
    179  1.1      cgd 	if ((c[SPELLS] += x) > c[SPELLMAX])	c[SPELLS] = c[SPELLMAX];
    180  1.1      cgd 	}
    181  1.1      cgd 
    182  1.1      cgd raisemspells(x)
    183  1.1      cgd 	register int x;
    184  1.1      cgd 	{
    185  1.1      cgd 	c[SPELLMAX]+=x; c[SPELLS]+=x;
    186  1.1      cgd 	}
    187  1.1      cgd 
    188  1.1      cgd /*
    189  1.1      cgd 	************
    190  1.1      cgd 	LOOSE SPELLS
    191  1.1      cgd 	************
    192  1.1      cgd 	losespells(x)
    193  1.1      cgd 	losemspells(x)
    194  1.1      cgd 
    195  1.1      cgd 	subroutine to lose maximum spells
    196  1.1      cgd  */
    197  1.1      cgd losespells(x)
    198  1.1      cgd 	register int x;
    199  1.1      cgd 	{
    200  1.1      cgd 	if ((c[SPELLS] -= x) < 0) c[SPELLS]=0;
    201  1.1      cgd 	}
    202  1.1      cgd 
    203  1.1      cgd losemspells(x)
    204  1.1      cgd 	register int x;
    205  1.1      cgd 	{
    206  1.1      cgd 	if ((c[SPELLMAX] -= x) < 0) c[SPELLMAX]=0;
    207  1.1      cgd 	if ((c[SPELLS] -= x) < 0) c[SPELLS]=0;
    208  1.1      cgd 	}
    209  1.1      cgd 
    210  1.1      cgd /*
    211  1.1      cgd 	makemonst(lev)
    212  1.1      cgd 		int lev;
    213  1.1      cgd 
    214  1.1      cgd 	function to return monster number for a randomly selected monster
    215  1.1      cgd 		for the given cave level
    216  1.1      cgd  */
    217  1.1      cgd makemonst(lev)
    218  1.1      cgd 	register int lev;
    219  1.1      cgd 	{
    220  1.1      cgd 	register int tmp,x;
    221  1.1      cgd 	if (lev < 1)	lev = 1;			if (lev > 12)	lev = 12;
    222  1.1      cgd 	tmp=WATERLORD;
    223  1.1      cgd 	if (lev < 5)
    224  1.1      cgd 		while (tmp==WATERLORD) tmp=rnd((x=monstlevel[lev-1])?x:1);
    225  1.1      cgd 	else while (tmp==WATERLORD)
    226  1.1      cgd 		tmp=rnd((x=monstlevel[lev-1]-monstlevel[lev-4])?x:1)+monstlevel[lev-4];
    227  1.1      cgd 
    228  1.1      cgd 	while (monster[tmp].genocided && tmp<MAXMONST) tmp++; /* genocided? */
    229  1.1      cgd 	return(tmp);
    230  1.1      cgd 	}
    231  1.1      cgd 
    232  1.1      cgd /*
    233  1.1      cgd 	positionplayer()
    234  1.1      cgd 
    235  1.1      cgd 	function to be sure player is not in a wall
    236  1.1      cgd  */
    237  1.1      cgd positionplayer()
    238  1.1      cgd 	{
    239  1.1      cgd 	int try;
    240  1.1      cgd 	try = 2;
    241  1.1      cgd 	while ((item[playerx][playery] || mitem[playerx][playery]) && (try))
    242  1.1      cgd 		if (++playerx >= MAXX-1)
    243  1.1      cgd 			{
    244  1.1      cgd 			playerx = 1;
    245  1.1      cgd 			if (++playery >= MAXY-1)
    246  1.1      cgd 				{	playery = 1;	--try;	}
    247  1.1      cgd 			}
    248  1.1      cgd 	if (try==0)	 lprcat("Failure in positionplayer\n");
    249  1.1      cgd 	}
    250  1.1      cgd 
    251  1.1      cgd /*
    252  1.1      cgd 	recalc()	function to recalculate the armor class of the player
    253  1.1      cgd  */
    254  1.1      cgd recalc()
    255  1.1      cgd 	{
    256  1.1      cgd 	register int i,j,k;
    257  1.1      cgd 	c[AC] = c[MOREDEFENSES];
    258  1.1      cgd 	if (c[WEAR] >= 0)
    259  1.1      cgd 		switch(iven[c[WEAR]])
    260  1.1      cgd 			{
    261  1.1      cgd 			case OSHIELD:		c[AC] += 2 + ivenarg[c[WEAR]]; break;
    262  1.1      cgd 			case OLEATHER:		c[AC] += 2 + ivenarg[c[WEAR]]; break;
    263  1.1      cgd 			case OSTUDLEATHER:	c[AC] += 3 + ivenarg[c[WEAR]]; break;
    264  1.1      cgd 			case ORING:			c[AC] += 5 + ivenarg[c[WEAR]]; break;
    265  1.1      cgd 			case OCHAIN:		c[AC] += 6 + ivenarg[c[WEAR]]; break;
    266  1.1      cgd 			case OSPLINT:		c[AC] += 7 + ivenarg[c[WEAR]]; break;
    267  1.1      cgd 			case OPLATE:		c[AC] += 9 + ivenarg[c[WEAR]]; break;
    268  1.1      cgd 			case OPLATEARMOR:	c[AC] += 10 + ivenarg[c[WEAR]]; break;
    269  1.1      cgd 			case OSSPLATE:		c[AC] += 12 + ivenarg[c[WEAR]]; break;
    270  1.1      cgd 			}
    271  1.1      cgd 
    272  1.1      cgd 	if (c[SHIELD] >= 0) if (iven[c[SHIELD]] == OSHIELD) c[AC] += 2 + ivenarg[c[SHIELD]];
    273  1.1      cgd 	if (c[WIELD] < 0)  c[WCLASS] = 0;  else
    274  1.1      cgd 		{
    275  1.1      cgd 		i = ivenarg[c[WIELD]];
    276  1.1      cgd 		switch(iven[c[WIELD]])
    277  1.1      cgd 			{
    278  1.1      cgd 			case ODAGGER:    c[WCLASS] =  3 + i;  break;
    279  1.1      cgd 			case OBELT:	     c[WCLASS] =  7 + i;  break;
    280  1.1      cgd 			case OSHIELD:	 c[WCLASS] =  8 + i;  break;
    281  1.1      cgd 			case OSPEAR:     c[WCLASS] = 10 + i;  break;
    282  1.1      cgd 			case OFLAIL:     c[WCLASS] = 14 + i;  break;
    283  1.1      cgd 			case OBATTLEAXE: c[WCLASS] = 17 + i;  break;
    284  1.1      cgd 			case OLANCE:	 c[WCLASS] = 19 + i;  break;
    285  1.1      cgd 			case OLONGSWORD: c[WCLASS] = 22 + i;  break;
    286  1.1      cgd 			case O2SWORD:    c[WCLASS] = 26 + i;  break;
    287  1.1      cgd 			case OSWORD:     c[WCLASS] = 32 + i;  break;
    288  1.1      cgd 			case OSWORDofSLASHING: c[WCLASS] = 30 + i; break;
    289  1.1      cgd 			case OHAMMER:    c[WCLASS] = 35 + i;  break;
    290  1.1      cgd 			default:	     c[WCLASS] = 0;
    291  1.1      cgd 			}
    292  1.1      cgd 		}
    293  1.1      cgd 	c[WCLASS] += c[MOREDAM];
    294  1.1      cgd 
    295  1.1      cgd /*	now for regeneration abilities based on rings	*/
    296  1.1      cgd 	c[REGEN]=1;		c[ENERGY]=0;
    297  1.1      cgd 	j=0;  for (k=25; k>0; k--)  if (iven[k]) {j=k; k=0; }
    298  1.1      cgd 	for (i=0; i<=j; i++)
    299  1.1      cgd 		{
    300  1.1      cgd 		switch(iven[i])
    301  1.1      cgd 			{
    302  1.1      cgd 			case OPROTRING: c[AC]     += ivenarg[i] + 1;	break;
    303  1.1      cgd 			case ODAMRING:  c[WCLASS] += ivenarg[i] + 1;	break;
    304  1.1      cgd 			case OBELT:     c[WCLASS] += ((ivenarg[i]<<1)) + 2;	break;
    305  1.1      cgd 
    306  1.1      cgd 			case OREGENRING:	c[REGEN]  += ivenarg[i] + 1;	break;
    307  1.1      cgd 			case ORINGOFEXTRA:	c[REGEN]  += 5 * (ivenarg[i]+1); break;
    308  1.1      cgd 			case OENERGYRING:	c[ENERGY] += ivenarg[i] + 1;	break;
    309  1.1      cgd 			}
    310  1.1      cgd 		}
    311  1.1      cgd 	}
    312  1.1      cgd 
    313  1.1      cgd 
    314  1.1      cgd /*
    315  1.1      cgd 	quit()
    316  1.1      cgd 
    317  1.1      cgd 	subroutine to ask if the player really wants to quit
    318  1.1      cgd  */
    319  1.1      cgd quit()
    320  1.1      cgd 	{
    321  1.1      cgd 	register int i;
    322  1.1      cgd 	cursors();	strcpy(lastmonst,"");
    323  1.1      cgd 	lprcat("\n\nDo you really want to quit?");
    324  1.1      cgd 	while (1)
    325  1.1      cgd 		{
    326  1.1      cgd 		i=getchar();
    327  1.1      cgd 		if (i == 'y')	{ died(300); return; }
    328  1.1      cgd 		if ((i == 'n') || (i == '\33'))	{ lprcat(" no"); lflush(); return; }
    329  1.1      cgd 		lprcat("\n");  setbold();  lprcat("Yes");  resetbold();  lprcat(" or ");
    330  1.1      cgd 		setbold();  lprcat("No");  resetbold();  lprcat(" please?   Do you want to quit? ");
    331  1.1      cgd 		}
    332  1.1      cgd 	}
    333  1.1      cgd 
    334  1.1      cgd /*
    335  1.1      cgd 	function to ask --more-- then the user must enter a space
    336  1.1      cgd  */
    337  1.1      cgd more()
    338  1.1      cgd 	{
    339  1.1      cgd 	lprcat("\n  --- press ");  standout("space");  lprcat(" to continue --- ");
    340  1.1      cgd 	while (getchar() != ' ');
    341  1.1      cgd 	}
    342  1.1      cgd 
    343  1.1      cgd /*
    344  1.1      cgd 	function to put something in the players inventory
    345  1.1      cgd 	returns 0 if success, 1 if a failure
    346  1.1      cgd  */
    347  1.1      cgd take(itm,arg)
    348  1.1      cgd 	int itm,arg;
    349  1.1      cgd 	{
    350  1.1      cgd 	register int i,limit;
    351  1.1      cgd /*	cursors(); */
    352  1.1      cgd 	if ((limit = 15+(c[LEVEL]>>1)) > 26)  limit=26;
    353  1.1      cgd 	for (i=0; i<limit; i++)
    354  1.1      cgd 		if (iven[i]==0)
    355  1.1      cgd 			{
    356  1.1      cgd 			iven[i] = itm;  ivenarg[i] = arg;  limit=0;
    357  1.1      cgd 			switch(itm)
    358  1.1      cgd 				{
    359  1.1      cgd 				case OPROTRING:	case ODAMRING: case OBELT: limit=1;  break;
    360  1.1      cgd 				case ODEXRING:		c[DEXTERITY] += ivenarg[i]+1; limit=1;	break;
    361  1.1      cgd 				case OSTRRING:		c[STREXTRA]  += ivenarg[i]+1;	limit=1; break;
    362  1.1      cgd 				case OCLEVERRING:	c[INTELLIGENCE] += ivenarg[i]+1;  limit=1; break;
    363  1.1      cgd 				case OHAMMER:		c[DEXTERITY] += 10;	c[STREXTRA]+=10;
    364  1.1      cgd 									c[INTELLIGENCE]-=10;	limit=1;	 break;
    365  1.1      cgd 
    366  1.1      cgd 				case OORBOFDRAGON:	c[SLAYING]++;		break;
    367  1.1      cgd 				case OSPIRITSCARAB: c[NEGATESPIRIT]++;	break;
    368  1.1      cgd 				case OCUBEofUNDEAD: c[CUBEofUNDEAD]++;	break;
    369  1.1      cgd 				case ONOTHEFT:		c[NOTHEFT]++;		break;
    370  1.1      cgd 				case OSWORDofSLASHING:	c[DEXTERITY] +=5;	limit=1; break;
    371  1.1      cgd 				};
    372  1.1      cgd 			lprcat("\nYou pick up:"); srcount=0;  show3(i);
    373  1.1      cgd 			if (limit) bottomline();  return(0);
    374  1.1      cgd 			}
    375  1.1      cgd 	lprcat("\nYou can't carry anything else");  return(1);
    376  1.1      cgd 	}
    377  1.1      cgd 
    378  1.1      cgd /*
    379  1.1      cgd 	subroutine to drop an object  returns 1 if something there already else 0
    380  1.1      cgd  */
    381  1.1      cgd drop_object(k)
    382  1.1      cgd 	int k;
    383  1.1      cgd 	{
    384  1.1      cgd 	int itm;
    385  1.1      cgd 	if ((k<0) || (k>25)) return(0);
    386  1.1      cgd 	itm = iven[k];	cursors();
    387  1.1      cgd 	if (itm==0) { lprintf("\nYou don't have item %c! ",k+'a'); return(1); }
    388  1.1      cgd 	if (item[playerx][playery])
    389  1.1      cgd 		{ beep(); lprcat("\nThere's something here already"); return(1); }
    390  1.1      cgd 	if (playery==MAXY-1 && playerx==33) return(1); /* not in entrance */
    391  1.1      cgd 	item[playerx][playery] = itm;
    392  1.1      cgd 	iarg[playerx][playery] = ivenarg[k];
    393  1.1      cgd 	srcount=0; lprcat("\n  You drop:"); show3(k); /* show what item you dropped*/
    394  1.1      cgd 	know[playerx][playery] = 0;  iven[k]=0;
    395  1.1      cgd 	if (c[WIELD]==k) c[WIELD]= -1;		if (c[WEAR]==k)  c[WEAR] = -1;
    396  1.1      cgd 	if (c[SHIELD]==k) c[SHIELD]= -1;
    397  1.1      cgd 	adjustcvalues(itm,ivenarg[k]);
    398  1.1      cgd 	dropflag=1; /* say dropped an item so wont ask to pick it up right away */
    399  1.1      cgd 	return(0);
    400  1.1      cgd 	}
    401  1.1      cgd 
    402  1.1      cgd /*
    403  1.1      cgd 	function to enchant armor player is currently wearing
    404  1.1      cgd  */
    405  1.1      cgd enchantarmor()
    406  1.1      cgd 	{
    407  1.1      cgd 	register int tmp;
    408  1.1      cgd 	if (c[WEAR]<0) { if (c[SHIELD] < 0)
    409  1.1      cgd 		{ cursors(); beep(); lprcat("\nYou feel a sense of loss"); return; }
    410  1.1      cgd 					else { tmp=iven[c[SHIELD]]; if (tmp != OSCROLL) if (tmp != OPOTION) { ivenarg[c[SHIELD]]++; bottomline(); } } }
    411  1.1      cgd 	tmp = iven[c[WEAR]];
    412  1.1      cgd 	if (tmp!=OSCROLL) if (tmp!=OPOTION)  { ivenarg[c[WEAR]]++;  bottomline(); }
    413  1.1      cgd 	}
    414  1.1      cgd 
    415  1.1      cgd /*
    416  1.1      cgd 	function to enchant a weapon presently being wielded
    417  1.1      cgd  */
    418  1.1      cgd enchweapon()
    419  1.1      cgd 	{
    420  1.1      cgd 	register int tmp;
    421  1.1      cgd 	if (c[WIELD]<0)
    422  1.1      cgd 		{ cursors(); beep(); lprcat("\nYou feel a sense of loss"); return; }
    423  1.1      cgd 	tmp = iven[c[WIELD]];
    424  1.1      cgd 	if (tmp!=OSCROLL) if (tmp!=OPOTION)
    425  1.1      cgd 		{ ivenarg[c[WIELD]]++;
    426  1.1      cgd 		  if (tmp==OCLEVERRING) c[INTELLIGENCE]++;  else
    427  1.1      cgd 		  if (tmp==OSTRRING)	c[STREXTRA]++;  else
    428  1.1      cgd 		  if (tmp==ODEXRING)    c[DEXTERITY]++;		  bottomline(); }
    429  1.1      cgd 	}
    430  1.1      cgd 
    431  1.1      cgd /*
    432  1.1      cgd 	routine to tell if player can carry one more thing
    433  1.1      cgd 	returns 1 if pockets are full, else 0
    434  1.1      cgd  */
    435  1.1      cgd pocketfull()
    436  1.1      cgd 	{
    437  1.1      cgd 	register int i,limit;
    438  1.1      cgd 	if ((limit = 15+(c[LEVEL]>>1)) > 26)  limit=26;
    439  1.1      cgd 	for (i=0; i<limit; i++) if (iven[i]==0) return(0);
    440  1.1      cgd 	return(1);
    441  1.1      cgd 	}
    442  1.1      cgd 
    443  1.1      cgd /*
    444  1.1      cgd 	function to return 1 if a monster is next to the player else returns 0
    445  1.1      cgd  */
    446  1.1      cgd nearbymonst()
    447  1.1      cgd 	{
    448  1.1      cgd 	register int tmp,tmp2;
    449  1.1      cgd 	for (tmp=playerx-1; tmp<playerx+2; tmp++)
    450  1.1      cgd 		for (tmp2=playery-1; tmp2<playery+2; tmp2++)
    451  1.1      cgd 			if (mitem[tmp][tmp2]) return(1); /* if monster nearby */
    452  1.1      cgd 	return(0);
    453  1.1      cgd 	}
    454  1.1      cgd 
    455  1.1      cgd /*
    456  1.1      cgd 	function to steal an item from the players pockets
    457  1.1      cgd 	returns 1 if steals something else returns 0
    458  1.1      cgd  */
    459  1.1      cgd stealsomething()
    460  1.1      cgd 	{
    461  1.1      cgd 	register int i,j;
    462  1.1      cgd 	j=100;
    463  1.1      cgd 	while (1)
    464  1.1      cgd 		{
    465  1.1      cgd 		i=rund(26);
    466  1.1      cgd 		if (iven[i]) if (c[WEAR]!=i) if (c[WIELD]!=i) if (c[SHIELD]!=i)
    467  1.1      cgd 			{
    468  1.1      cgd 			srcount=0; show3(i);
    469  1.1      cgd 			adjustcvalues(iven[i],ivenarg[i]);  iven[i]=0; return(1);
    470  1.1      cgd 			}
    471  1.1      cgd 		if (--j <= 0) return(0);
    472  1.1      cgd 		}
    473  1.1      cgd 	}
    474  1.1      cgd 
    475  1.1      cgd /*
    476  1.1      cgd 	function to return 1 is player carrys nothing else return 0
    477  1.1      cgd  */
    478  1.1      cgd emptyhanded()
    479  1.1      cgd 	{
    480  1.1      cgd 	register int i;
    481  1.1      cgd 	for (i=0; i<26; i++)
    482  1.1      cgd 		if (iven[i]) if (i!=c[WIELD]) if (i!=c[WEAR]) if (i!=c[SHIELD]) return(0);
    483  1.1      cgd 	return(1);
    484  1.1      cgd 	}
    485  1.1      cgd 
    486  1.1      cgd /*
    487  1.1      cgd 	function to create a gem on a square near the player
    488  1.1      cgd  */
    489  1.1      cgd creategem()
    490  1.1      cgd 	{
    491  1.1      cgd 	register int i,j;
    492  1.1      cgd 	switch(rnd(4))
    493  1.1      cgd 		{
    494  1.1      cgd 		case 1:	 i=ODIAMOND;	j=50;	break;
    495  1.1      cgd 		case 2:	 i=ORUBY;		j=40;	break;
    496  1.1      cgd 		case 3:	 i=OEMERALD;	j=30;	break;
    497  1.1      cgd 		default: i=OSAPPHIRE;	j=20;	break;
    498  1.1      cgd 		};
    499  1.1      cgd 	createitem(i,rnd(j)+j/10);
    500  1.1      cgd 	}
    501  1.1      cgd 
    502  1.1      cgd /*
    503  1.1      cgd 	function to change character levels as needed when dropping an object
    504  1.1      cgd 	that affects these characteristics
    505  1.1      cgd  */
    506  1.1      cgd adjustcvalues(itm,arg)
    507  1.1      cgd 	int itm,arg;
    508  1.1      cgd 	{
    509  1.1      cgd 	register int flag;
    510  1.1      cgd 	flag=0;
    511  1.1      cgd 	switch(itm)
    512  1.1      cgd 		{
    513  1.1      cgd 		case ODEXRING:	c[DEXTERITY] -= arg+1;  flag=1; break;
    514  1.1      cgd 		case OSTRRING:	c[STREXTRA]  -= arg+1;  flag=1; break;
    515  1.1      cgd 		case OCLEVERRING: c[INTELLIGENCE] -= arg+1;  flag=1; break;
    516  1.1      cgd 		case OHAMMER:	c[DEXTERITY] -= 10;	c[STREXTRA] -= 10;
    517  1.1      cgd 						c[INTELLIGENCE] += 10; flag=1; break;
    518  1.1      cgd 		case OSWORDofSLASHING:	c[DEXTERITY] -= 5;	flag=1; break;
    519  1.1      cgd 		case OORBOFDRAGON:		--c[SLAYING];		return;
    520  1.1      cgd 		case OSPIRITSCARAB:		--c[NEGATESPIRIT];	return;
    521  1.1      cgd 		case OCUBEofUNDEAD:		--c[CUBEofUNDEAD];	return;
    522  1.1      cgd 		case ONOTHEFT:			--c[NOTHEFT]; 		return;
    523  1.1      cgd 		case OLANCE:		c[LANCEDEATH]=0;	return;
    524  1.1      cgd 		case OPOTION:	case OSCROLL:	return;
    525  1.1      cgd 
    526  1.1      cgd 		default:	flag=1;
    527  1.1      cgd 		};
    528  1.1      cgd 	if (flag) bottomline();
    529  1.1      cgd 	}
    530  1.1      cgd 
    531  1.1      cgd /*
    532  1.1      cgd 	function to read a string from token input "string"
    533  1.1      cgd 	returns a pointer to the string
    534  1.1      cgd  */
    535  1.1      cgd gettokstr(str)
    536  1.1      cgd 	register char *str;
    537  1.1      cgd 	{
    538  1.1      cgd 	register int i,j;
    539  1.1      cgd 	i=50;
    540  1.1      cgd 	while ((getchar() != '"') && (--i > 0));
    541  1.1      cgd 	i=36;
    542  1.1      cgd 	while (--i > 0)
    543  1.1      cgd 		{
    544  1.1      cgd 		if ((j=getchar()) != '"') *str++ = j;  else i=0;
    545  1.1      cgd 		}
    546  1.1      cgd 	*str = 0;
    547  1.1      cgd 	i=50;
    548  1.1      cgd 	if (j != '"') while ((getchar() != '"') && (--i > 0)); /* if end due to too long, then find closing quote */
    549  1.1      cgd 	}
    550  1.1      cgd 
    551  1.1      cgd /*
    552  1.1      cgd 	function to ask user for a password (no echo)
    553  1.1      cgd 	returns 1 if entered correctly, 0 if not
    554  1.1      cgd  */
    555  1.1      cgd static char gpwbuf[33];
    556  1.1      cgd getpassword()
    557  1.1      cgd 	{
    558  1.1      cgd 	register int i,j;
    559  1.1      cgd 	register char *gpwp;
    560  1.1      cgd 	extern char *password;
    561  1.1      cgd 	scbr();	/*	system("stty -echo cbreak"); */
    562  1.1      cgd 	gpwp = gpwbuf;	lprcat("\nEnter Password: "); lflush();
    563  1.1      cgd 	i = strlen(password);
    564  1.1      cgd 	for (j=0; j<i; j++) read(0,gpwp++,1);	  gpwbuf[i]=0;
    565  1.1      cgd 	sncbr(); /* system("stty echo -cbreak"); */
    566  1.1      cgd 	if (strcmp(gpwbuf,password) != 0)
    567  1.1      cgd 		{	lprcat("\nSorry\n");  lflush(); return(0);	}
    568  1.1      cgd 	else  return(1);
    569  1.1      cgd 	}
    570  1.1      cgd 
    571  1.1      cgd /*
    572  1.1      cgd 	subroutine to get a yes or no response from the user
    573  1.1      cgd 	returns y or n
    574  1.1      cgd  */
    575  1.1      cgd getyn()
    576  1.1      cgd 	{
    577  1.1      cgd 	register int i;
    578  1.1      cgd 	i=0; while (i!='y' && i!='n' && i!='\33') i=getchar();
    579  1.1      cgd 	return(i);
    580  1.1      cgd 	}
    581  1.1      cgd 
    582  1.1      cgd /*
    583  1.1      cgd 	function to calculate the pack weight of the player
    584  1.1      cgd 	returns the number of pounds the player is carrying
    585  1.1      cgd  */
    586  1.1      cgd packweight()
    587  1.1      cgd 	{
    588  1.1      cgd 	register int i,j,k;
    589  1.1      cgd 	k=c[GOLD]/1000; j=25;  while ((iven[j]==0) && (j>0)) --j;
    590  1.1      cgd 	for (i=0; i<=j; i++)
    591  1.1      cgd 		switch(iven[i])
    592  1.1      cgd 			{
    593  1.1      cgd 			case 0:												break;
    594  1.1      cgd 			case OSSPLATE:   case OPLATEARMOR:		k += 40;	break;
    595  1.1      cgd 			case OPLATE:							k += 35;	break;
    596  1.1      cgd 			case OHAMMER:							k += 30;	break;
    597  1.1      cgd 			case OSPLINT:							k += 26;	break;
    598  1.1      cgd 			case OSWORDofSLASHING:	case OCHAIN:
    599  1.1      cgd 			case OBATTLEAXE:   		case O2SWORD:	k += 23;	break;
    600  1.1      cgd 			case OLONGSWORD:   		case OSWORD:
    601  1.1      cgd 			case ORING:				case OFLAIL:	k += 20;	break;
    602  1.1      cgd 			case OLANCE: 		case OSTUDLEATHER:	k += 15;	break;
    603  1.1      cgd 			case OLEATHER:   		case OSPEAR:	k += 8;		break;
    604  1.1      cgd 			case OORBOFDRAGON:   	case OBELT:		k += 4;		break;
    605  1.1      cgd 			case OSHIELD:							k += 7;		break;
    606  1.1      cgd 			case OCHEST:		k += 30 + ivenarg[i];			break;
    607  1.1      cgd 			default:								k++;
    608  1.1      cgd 			};
    609  1.1      cgd 	return(k);
    610  1.1      cgd 	}
    611  1.1      cgd 
    612  1.1      cgd #ifndef MACRORND
    613  1.1      cgd 	/* macros to generate random numbers   1<=rnd(N)<=N   0<=rund(N)<=N-1 */
    614  1.1      cgd rnd(x)
    615  1.1      cgd 	int x;
    616  1.1      cgd 	{
    617  1.1      cgd 	return((((randx=randx*1103515245+12345)>>7)%(x))+1);
    618  1.1      cgd 	}
    619  1.1      cgd 
    620  1.1      cgd rund(x)
    621  1.1      cgd 	int x;
    622  1.1      cgd 	{
    623  1.1      cgd 	return((((randx=randx*1103515245+12345)>>7)%(x))  );
    624  1.1      cgd 	}
    625  1.1      cgd #endif MACRORND
    626