DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T m

⟦c4d8dd6bc⟧ TextFile

    Length: 26141 (0x661d)
    Types: TextFile
    Names: »main.c.orig«

Derivation

└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
    └─⟦this⟧ »EUUGD18/General/Ularn/main.c.orig« 

TextFile

/*	main.c		*/
/* This game is bad for you. It is evil. It will rot your brain. */
#include "header.h"

static char copyright[]=
"\nUlarn was created by Phil Cordier and is based on Larn by Noah Morgan\n";

int srcount=0;	/* line counter for showstr()	*/
int dropflag=0; /* if 1 then don't lookforobject() next round */
int rmst=80;	/* random monster creation counter		*/
int userid;	/* the players login user id number */
int stayflag=0;

char 	nowelcome=0,
nomove=0; /* if (nomove) then don't count next iteration as a move */

static char viewflag=0;
/*	if viewflag then we have done a 99 stay here and 
	don't showcell in the main loop */

char restorflag=0;	/* 1 means restore has been done	*/
static char cmdhelp[] = "\
Cmd line format: Ularn [-slicnh] [-o<optsfile>] [-##] [++]\n\
  -s   show the scoreboard\n\
  -i   show scoreboard with inventories\n\
  -c   create new scoreboard (wizard only)\n\
  -n   suppress welcome message on starting game\n\
  -h   print this help text\n\
  -o<optsfile>   specify .Ularnopts file to be used instead of \"~/.Ularnopts\"\n\
  -##  specify level of difficulty (example: Ularn -5)\n\
  -++  restore game checkpoint file\n";

/*
	************
	MAIN PROGRAM
	************
 */

main(argc,argv)
int argc;
char **argv;
{
	register int i;
	int hard;
	char *ptr=0;
	struct passwd *pwe,*getpwuid();

	init_term();	/*setup the terminal (find out what type) for termcap */

/*
 *	first task is to identify the player
 */
	    if ((ptr = getlogin()) == NULL)
	  	if (pwe=getpwuid(geteuid()))
			ptr = pwe->pw_name;
	  	else if ((ptr = getenv("USER")) == NULL) {
noone:		    fprintf(stderr, "Can't find your logname.  Who Are You?\n");
			fflush(stderr);
			exit(1);
		 }
	if (ptr==NULL) goto noone;
	if (strlen(ptr)==0) goto noone;
/*
 *	second task is to prepare the pathnames the player will need
 */
	strcpy(loginname,ptr); 

	/* save loginname of the user for logging purposes */
	strcpy(logname,ptr);	

	/* this will be overwritten with the players name */
	if ((ptr = getenv("HOME")) == NULL) 
		if ((ptr = pwe->pw_dir) == NULL)
			ptr = ".";

	/* save file name in home directory */
	strcpy(savefilename, ptr);
	strcat(savefilename, "/Ularn.sav");	

	sprintf(optsfile, "%s/.Ularnopts",ptr);	/* the .Ularnopts filename */
	strcat(scorefile, SCORENAME);	/* the Ularn scoreboard filename */
	strcat(logfile, LOGFNAME);

	/* Ularn activity logging filename */
	strcat(helpfile, HELPNAME);	/* the Ularn on-line help file */
	strcat(larnlevels, LEVELSNAME);	/* the pre-made cave level data file */
	strcat(fortfile, FORTSNAME);	/* the fortune data file name */
/*
 *	now malloc the memory for the dungeon 
 */
cell = (struct cel *)malloc(sizeof(struct cel)*(MAXLEVEL+MAXVLEVEL)*MAXX*MAXY);

	if (cell == (struct cel *)NULL) 
		died(-285);	/* malloc failure */

	if ( ( lpbuf = malloc ((5* BUFBIG)>>2) ) == (char *)NULL)
		died(-285);

	if ( ( inbuffer = malloc( (5*MAXIBUF) >>2) ) == (char *)NULL)
		died(-285);

	lcreat((char*)0);	
	newgame();		/*	set the initial clock  */ 
	hard= -1;

/*
 *	now make scoreboard if it is not there (don't clear) 
 */
	if (access(scorefile,0) == -1) /* not there */
		makeboard();

/*
 *	now process the command line arguments 
 */
	for (i=1; i<argc; i++) {
		if (argv[i][0] == '-')
		  switch(argv[i][1]) {
			case 's': showscores();  
				  exit(0);  /* show scoreboard   */

			case 'i': showallscores();  
				  exit(0);  /* show all scoreboard */

			case 'c': /*anyone with password can create scoreboard*/
			setupvt100();	
			lprcat("Preparing to initialize the scoreboard.\n");
				  if (getpassword() != 0) {
					makeboard(); 
					showscores();
				  }
				  exit(0);

			case 'n':	nowelcome=1; 
					argv[i][0]=0; 
					break;

			case '0': case '1': case '2': case '3': 
			case '4': case '5': case '6': case '7': 
			case '8': case '9':	/* for hardness */
					sscanf(&argv[i][1],"%d",&hard);	
					if (hard > 100) hard = 100;
					break;

			case 'h':	/* print out command line arguments */
					fprintf(stderr, "%s", cmdhelp);
					fflush(stderr);
					exit(0);
			case 'o':	/* specify a .Ularnopts filename */
					strncpy(optsfile,argv[i]+2,127);  break;
			default:
				fprintf(stderr,"Unknown option <%s>\n",argv[i]);
				fprintf(stderr,"%s", cmdhelp);  
				fflush(stderr);
				exit(1);
			};
		if (argv[i][0] == '+') {
			clear();	restorflag = 1;
			if (argv[i][1] == '+') {
				hitflag=1; 
				restoregame(ckpfile); 
				/* restore checkpointed game */
			}
			i = argc;
		}
	}


	userid = geteuid();	/* obtain the user's effective id number */

	sigsetup();	/* trap all needed signals	*/
	sethard(hard);	/* set up the desired difficulty	*/
	setupvt100();	/* setup the terminal special mode	*/
	readopts();	/* read the options file if there is one */

	/* restore game if need to */
	if (access(savefilename,0)==0)	{
		clear();	
		restorflag = 1;
		hitflag=1;	
		restoregame(savefilename);  
	}

	/* create new game */
	if (c[HP]==0) {
		makeplayer();	/*	make the character that will play*/
		newcavelevel(0);/*	make the dungeon */
		predostuff = 1;	

		/* tell signals that we are in the welcome screen */
		if (nowelcome==0) 
			welcome();	 /* welcome the player to the game */
	}

	drawscreen();	/*	show the initial dungeon */

	/* tell the trap functions that they must do a showplayer()
	   from here on */
	predostuff = 2;	

	yrepcount = hit2flag = 0;
	/*
	 *	M A I N  L O O P
	 */
	while (1) {
		if (dropflag==0) 
			lookforobject(); /* see if there is an object here*/
		else 
			dropflag=0; /* don't show it just dropped an item */

		if (hitflag==0) { 	
			if (c[HASTEMONST]) 
				movemonst(); 
			movemonst(); 
		}	/* move the monsters	*/

		if (viewflag==0) 
			showcell(playerx,playery); 
		else viewflag=0;	/* show stuff around player */

		if (hit3flag) 
			flushall();
		hitflag = hit3flag = 0;	
		nomove=1;
		bot_linex();	/* update bottom line */

		while (nomove)/*	get commands and make moves	*/
		{
			if (hit3flag) 
				flushall();
			nomove=0; 
			parse();
		}	

		regen();	/*	regenerate hp and spells*/

		if (c[TIMESTOP]==0)
		  if (--rmst <= 0) { 	
			rmst = 120-(level<<2); 
			fillmonst(makemonst(level)); 
		  }
	}	/* end main loop */
}	/* end main */

/*
	showstr()

	show character's inventory
 */
showstr()
{
	register int i,number;

	for (number=3, i=0; i<26; i++)
		if (iven[i]) number++;	/* count items in inventory */
	t_setup(number);	
	qshowstr();
	t_endup(number);
}

qshowstr()
{
	register int k,sigsav;

	srcount=0;  
	sigsav=nosignal;  
	nosignal=1; /* don't allow ^c etc */
	if (c[GOLD]) { 	
		lprintf(".)   %d gold pieces",(long)c[GOLD]); 
		srcount++; 
	}

	for (k=0; k<=26; k++)
		if (iven[k]) show3(k);

	lprintf("\nElapsed time is %d.  You have %d mobuls left",
		(long)((gtime+99)/100+1),(long)((TIMELIMIT-gtime)/100));
	more();		
	nosignal=sigsav;
}

/*
 *	subroutine to clear screen depending on # lines to display
 */
t_setup(count)
register int count;
{
	if (count<20)  {
		cl_up(79,count);  
		cursor(1,1);
	}
	else {
		resetscroll(); 
		clear();
	}
}

/*
 *	subroutine to restore normal display screen depending on t_setup()
 */
t_endup(count)
register int count;
{
	if (count<18)  /* how did we clear the screen? */
		draws(0,MAXX,0,(count>MAXY) ? MAXY : count);
	else {
		drawscreen(); 
		setscroll();
	}
}

/*
	function to show the things player is wearing only
 */
showwear()
{
	register int i,j,sigsav,count;

	sigsav=nosignal;  
	nosignal=1; /* don't allow ^c etc */
	srcount=0;

	/* count number of items we will display */
	for (count=2,j=0; j<=26; j++)	 
	   if (i=iven[j])
		switch(i) {
			case OLEATHER:	
			case OPLATE:	
			case OCHAIN:
			case ORING:		
			case OSTUDLEATHER:	
			case OSPLINT:
			case OPLATEARMOR:	
			case OSSPLATE:	
			case OSHIELD:
			case OELVENCHAIN:
				count++;
		};

	t_setup(count);

	for (i=22; i<93; i++)
		 for (j=0; j<=26; j++)
		   if (i==iven[j])
			switch(i) {
				case OLEATHER:	
				case OPLATE:	
				case OCHAIN:
				case ORING:		
				case OSTUDLEATHER:	
				case OSPLINT:
				case OPLATEARMOR:	
				case OSSPLATE:	
				case OSHIELD:
				case OELVENCHAIN:
					show3(j);
			};
	more();		
	nosignal=sigsav;	
	t_endup(count);
}

/*
	function to show the things player can wield only 
 */
showwield()
{
	register int i,j,sigsav,count;
	sigsav=nosignal;  nosignal=1; /* don't allow ^c etc */
	srcount=0;

	 for (count=2,j=0; j<=26; j++)	/* count how many items */
	   if (i=iven[j])
		switch(i) {
			case ODIAMOND:  case ORUBY:  case OEMERALD:  
			case OSAPPHIRE:
			case OBOOK:     case OCHEST:  case OLARNEYE: 
			case ONOTHEFT:
			case OSPIRITSCARAB:  case OCUBEofUNDEAD:
			case OPOTION:   
			case OORB:
			case OHANDofFEAR:
			case OBRASSLAMP:
			case OURN:
			case OWWAND:
			case OSPHTALISMAN:
			case OSCROLL:  break;
			default:  count++;
		};

	t_setup(count);

	for (i=22; i<93; i++)
		 for (j=0; j<=26; j++)
		   if (i==iven[j])
			switch(i) {
				case ODIAMOND:  case ORUBY:  
				case OEMERALD:  case OSAPPHIRE:
				case OBOOK:     case OCHEST:  
				case OLARNEYE: case ONOTHEFT:
				case OSPIRITSCARAB:  case OCUBEofUNDEAD:
				case OPOTION:   case OHANDofFEAR:
				case OBRASSLAMP:  case OURN:
				case OSPHTALISMAN:
				case OWWAND:
				case OORB: case OSCROLL:  break;
				default:  show3(j);
			};
		more();		
		nosignal=sigsav;	
		t_endup(count);
	}

/*
 *	function to show the things player can read only
 */
showread()
	{
	register int i,j,sigsav,count;
	sigsav=nosignal;  nosignal=1; /* don't allow ^c etc */
	srcount=0;

	for (count=2,j=0; j<=26; j++)
		switch(iven[j]) {
			case OBOOK:	
			case OSCROLL:	
				count++;
			};
	t_setup(count);

	for (i=22; i<84; i++)
		 for (j=0; j<=26; j++)
		   if (i==iven[j])
			switch(i) {
				case OBOOK:	
				case OSCROLL:	
					show3(j);
			};
		more();	
		nosignal=sigsav;	
		t_endup(count);
	}

/*
 *	function to show the things player can eat only
 */
showeat()
{
	register int i,j,sigsav,count;

	sigsav=nosignal;  
	nosignal=1; /* don't allow ^c etc */
	srcount=0;

	for (count=2,j=0; j<=26; j++)
		switch(iven[j]) {
			case OCOOKIE:	
				count++;
		};
	t_setup(count);

	for (i=22; i<84; i++)
		 for (j=0; j<=26; j++)
		   if (i==iven[j])
			switch(i) {
				case OCOOKIE:	
					show3(j);
			};
		more();		
		nosignal=sigsav;	
		t_endup(count);
	}

/*
	function to show the things player can quaff only
 */
showquaff()
{
	register int i,j,sigsav,count;

	sigsav=nosignal;  
	nosignal=1; /* don't allow ^c etc */
	srcount=0;

	for (count=2,j=0; j<=26; j++)
		switch(iven[j]) {
			case OPOTION:	
				count++;
		};
	t_setup(count);

	for (i=22; i<84; i++)
	  for (j=0; j<=26; j++)
	     if (i==iven[j])
		switch(i) {
			case OPOTION:	
				show3(j);
	        };
	more();			
	nosignal=sigsav;		
	t_endup(count);
}

show1(idx,str2)
register int idx;
register char *str2[];
{
	if (str2==0)  
		lprintf("\n%c)   %s",idx+'a',objectname[iven[idx]]);
	else if (*str2[ivenarg[idx]]==0)  
		lprintf("\n%c)   %s",idx+'a',objectname[iven[idx]]);
	else 
		lprintf("\n%c)   %s of%s",
			idx+'a',objectname[iven[idx]],str2[ivenarg[idx]]);
}

show3(index)
register int index;
{
	switch(iven[index]) {
		case OPOTION:	show1(index,potionname);  break;
		case OSCROLL:	show1(index,scrollname);  break;
		case OLARNEYE:		
		case OBOOK:			
		case OSPIRITSCARAB:
		case ODIAMOND:		
		case ORUBY:			
		case OCUBEofUNDEAD:
		case OEMERALD:		
		case OCHEST:		
		case OCOOKIE:
		case OSAPPHIRE:		
		case OORB:	
		case OHANDofFEAR:
		case OBRASSLAMP:
		case OURN:
		case OWWAND:
		case OSPHTALISMAN:
		case ONOTHEFT:		show1(index,(char **)0);  break;

		default:	
			lprintf("\n%c)   %s",index+'a',objectname[iven[index]]);
			if (ivenarg[index]>0) 
				lprintf(" + %d",(long)ivenarg[index]);
			else if (ivenarg[index]<0) 
				lprintf(" %d",(long)ivenarg[index]);
			break;
	}
	if (c[WIELD]==index) 
		lprcat(" (weapon in hand)");
	if ((c[WEAR]==index) || (c[SHIELD]==index))  
		lprcat(" (being worn)");
	if (++srcount>=22) { 
		srcount=0; 
		more(); 
		clear(); 
	}
}

/*
	subroutine to randomly create monsters if needed
 */
randmonst()
{	/*	don't make monsters if time is stopped	*/
	if (c[TIMESTOP]) return;	
	if (--rmst <= 0) {
		rmst = 120 - (level<<2);  
		fillmonst(makemonst(level));
	}
}


/*
	parse()

	get and execute a command
 */
parse()
{
	register int i,j,k,flag;
	while	(1) {
		k = yylex();
		/* get the token from the input and switch on it	*/
		switch(k)	{
			case 'A':	if (wizard) 
						diag(); 
					yrepcount=0;
					return;
			case 'h':	moveplayer(4);	
					return;	/* west	*/
			case 'H':	run(4);
					return;	/* west	*/
			case 'l':	moveplayer(2);	
					return;	/* east	*/
			case 'L':	run(2);		
					return;	/* east	*/
			case 'j':	moveplayer(1);	
					return;	/* south */
			case 'J':	run(1);			
					return;	/* south */
			case 'k':	moveplayer(3);	
					return;	/* north */
			case 'K':	run(3);			
					return;	/* north */
			case 'u':	moveplayer(5);	
					return;	/* northeast */
			case 'U':	run(5);			
					return;	/* northeast */
			case 'y':	moveplayer(6);  
					return;	/* northwest */
			case 'Y':	run(6);			
					return;	/* northwest */
			case 'n':	moveplayer(7);	
					return;	/* southeast */
			case 'N':	run(7);			
					return;	/* southeast */
			case 'b':	moveplayer(8);	
					return;	/* southwest */
			case 'B':	run(8);			
					return;	/* southwest */

			case '.':	if (yrepcount) 
						viewflag=1; 
					return;	/* stay here */

			case 'w':	yrepcount=0;	
					wield();	
					return;	/* wield a weapon */

			case 'W':	yrepcount=0;	
					wear();		
					return;	/* wear armor	*/

			case 'r':	yrepcount=0;
					if (c[BLINDCOUNT]) { 
						cursors(); 
						lprcat("\nYou can't read anything when you're blind!"); 
					} else if (c[TIMESTOP]==0) 
						readscr(); 
					return;	/* to read a scroll */

			case 'q':	yrepcount=0;	
					if (c[TIMESTOP]==0) 
						quaff();	
					return;	/* quaff a potion */

			case 'd':	yrepcount=0;	
					if (c[TIMESTOP]==0) 
					dropobj(); 
					return;	/* to drop an object */

			case 'c':	yrepcount=0;	
					cast();		
					return;	/* cast a spell	*/

			case 'i':	yrepcount=0;	
					nomove=1;  
					showstr();	
					return;	/* status */

			case 'e':	yrepcount=0;
					if (c[TIMESTOP]==0) 
						eatcookie(); 
					return;	/* to eat a fortune cookie */

			case 'D':	yrepcount=0;	
					seemagic(0);	
					nomove=1; 
					return;	/*list spells and scrolls */

			case '?':	yrepcount=0;	
					help(); 
					nomove=1; 
					return;	/*give the help screen*/

			case 'S':	clear();  
					lprcat("Saving . . ."); 
					lflush();  
					savegame(savefilename); 
					wizard=1; 
					died(-257);
					/* save the game - 
					   doesn't return */

			case 'Z':	yrepcount=0;	
				if (wizard) {
					int t;
					cursors();
			lprcat("\nWhich level do you wish to teleport to? ");
					t = readnum(20);
					if (t > 20 || t < 0) {
						lprcat(" sorry!");
						return;
					}
					playerx = rnd(MAXX-2);	
					playery = rnd(MAXY-2);
					newcavelevel(t);  
					positionplayer();
					draws(0,MAXX,0,MAXY); 
					bot_linex();
					return;
				}
					if (c[LEVEL]>9) { 
						oteleport(1); 
						return; 
					}
					cursors();
				lprcat("\nYou don't know how to teleport yet");
					return;	/* teleport yourself	*/

			case '^':	/* identify traps */  
					flag=yrepcount=0;  
					cursors();
					lprc('\n');  
					for (j=playery-1; j<playery+2; j++) {
					  if (j < 0) j=0;		
					  if (j >= MAXY) break;
					  for (i=playerx-1; i<playerx+2; i++) {
					    if (i < 0) i=0;	
					    if (i >= MAXX) break;
					    switch(item[i][j]) {
						case OTRAPDOOR:		
						case ODARTRAP:
						case OTRAPARROW:
						case OTELEPORTER:
						case OELEVATORUP:
						case OELEVATORDOWN:
						 lprcat("\nIt's "); 
						 lprcat(objectname[item[i][j]]);
						flag++;
					    };
					}
				      }
				      if (flag==0) 
					lprcat("\nNo traps are visible");
				      return;

			case '#':	
				yrepcount=0;	
				cursors(); 
				nomove=1;
				if (getpassword()==0) {
					scbr(); 
					return;
				}
				scbr();
				raiseexperience(370 * 1000000);
				bottomline();
				drawscreen();
				return;

#if WIZID
			case '_': /*this is the fudge player password 
					for wizard mode*/
				yrepcount=0;	
				cursors(); 
				nomove=1;
				if (getpassword()==0) {
					scbr(); 
					return;
				}
				wizard=1;  
				scbr(); 
				for (i=0; i<6; i++)  
					c[i]=70;  
				iven[0]=iven[1]=0;
				take(OPROTRING,50);   
				take(OLANCE,25);  
				for (i=0; i<26; i++)
				  if (iven[i]==OLANCE && ivenarg[i]==25) {
						c[WIELD]=i;
						break;
					}
				c[LANCEDEATH]=1;   
				c[WEAR] = c[SHIELD] = -1;
				raiseexperience(370*1000000); 
				c[AWARENESS] += 25000;
				{
					register int i,j;
					for (i=0; i<MAXY; i++)
					  for (j=0; j<MAXX; j++)  
						know[j][i]=1;
					for (i=0; i<SPNUM; i++)	
						spelknow[i]=1;
					for (i=0; i<MAXSCROLL; i++)  
						scrollname[i][0]=' ';
					for (i=0; i<MAXPOTION; i++)  
						potionname[i][0]=' ';
				}
				for (i=0; i<MAXSCROLL; i++)
				  if (strlen(scrollname[i])>2) 
				  { 	item[i][0]=OSCROLL; 
					iarg[i][0]=i; 
				  }
				for (i=MAXX-1; i>MAXX-1-MAXPOTION; i--)
				  if (strlen(potionname[i-MAXX+MAXPOTION])>2) 
					/* no null items */
				  { 	item[i][0]=OPOTION; 
					iarg[i][0]=i-MAXX+MAXPOTION; 
				  }
				for (i=1; i<MAXY; i++)
				{ 	item[0][i]=i; 
					iarg[0][i]=0; 
				}
				for (i=MAXY; i<MAXY+MAXX; i++)
				{ 	item[i-MAXY][MAXY-1]=i; 
					iarg[i-MAXY][MAXY-1]=0; 
				}
				for (i=MAXX+MAXY; i<MAXX+MAXY+MAXY; i++)
				{ 	item[MAXX-1][i-MAXX-MAXY]=i; 
					iarg[MAXX-1][i-MAXX-MAXY]=0; 
				}
				c[GOLD]+=250000;
				bottomline();
				drawscreen();	
				return;
#endif /* WIZID */

			case 'T':	yrepcount=0;	
					cursors();  
					if (c[SHIELD] != -1) { 
						c[SHIELD] = -1; 
						lprcat("\nYour shield is off");
 						bottomline(); 
					} else
					if (c[WEAR] != -1) { 
						c[WEAR] = -1; 
						lprcat("\nYour armor is off"); 
						bottomline(); 
					}
				else lprcat("\nYou aren't wearing anything");
					return;

			case 'g':	cursors();
	lprintf("\nThe stuff you are carrying presently weighs %d pounds",
		(long)packweight());

			case ' ':	yrepcount=0;	
					nomove=1;  
					return;

			case 'v':	yrepcount=0;	
					cursors();
lprintf( "\nThe Addiction of Ularn, by Satyr. Difficulty : %d",
	(long)c[HARDGAME]);
					if (wizard) lprcat(" (WIZARD)");
					nomove=1;
					if (cheat) lprcat(" (Cheater)");
			        	lprcat(copyright); 
					return;

			case 'Q':	yrepcount=0;
					quit(); 
					nomove=1;	
					return;	/* quit	*/

			case 'L'-64:  	yrepcount=0;	
					drawscreen();  
					nomove=1; 
					return;	/*	look		*/

			case 'P':	cursors(); 
					if (outstanding_taxes>0)
					lprintf("\nYou presently owe %d gp in taxes.",(long)outstanding_taxes);
					else
						lprcat("\nYou do not owe any taxes.");
					return;
		};
	}
}

parse2()
{
	if (c[HASTEMONST]) 
		movemonst(); 
	movemonst(); /*	move the monsters */
	randmonst();	
	regen();
}

run(dir)
int dir;
{
	register int i;
	i=1; 
	while (i) {
		i=moveplayer(dir);
		if (i>0) {  	
			if (c[HASTEMONST]) 
				movemonst();  
			movemonst(); 
			randmonst(); 
			regen(); 
		}
		if (hitflag) i=0;
		if (i!=0)  
			showcell(playerx,playery);
	}
}

/*
	function to wield a weapon
 */
wield()	
{
	register int i;

	while (1) {
		if ((i = whatitem("wield"))=='\33')  return;
		if (i != '.') {
			if (i=='*') showwield();
			else  if (iven[i-'a']==0) { ydhi(i); return; }
			else if (iven[i-'a']==OPOTION) { ycwi(i); return; }
			else if (iven[i-'a']==OSCROLL) { ycwi(i); return; }
			else  if ((c[SHIELD]!= -1) && (iven[i-'a']==O2SWORD)) {
			      lprcat("\nBut one arm is busy with your shield!");
				return; 
			}
			else  {
				c[WIELD]=i-'a'; 
				if (iven[i-'a'] == OLANCE) c[LANCEDEATH]=1; 
				else c[LANCEDEATH]=0;  
				bottomline(); 
				return; 
			}
		}
	}
}

/*
	common routine to say you don't have an item
 */
ydhi(x)
int x;
{ cursors();  lprintf("\nYou don't have item %c!",x); }

ycwi(x)
int x;
{ cursors();  lprintf("\nYou can't wield item %c!",x); }

/*
	function to wear armor
 */
wear()
{
	register int i;
	while (1) {
		if ((i = whatitem("wear"))=='\33')  return;
		if (i != '.') {
			if (i=='*') showwear(); else
			switch(iven[i-'a']) {
				case 0:  ydhi(i); return;
				case OLEATHER:  
				case OCHAIN:  
				case OPLATE:	
				case OSTUDLEATHER:
				case ORING:		
				case OSPLINT:	
				case OPLATEARMOR:	
				case OELVENCHAIN:
				case OSSPLATE:
				  if (c[WEAR] != -1) { 
				  lprcat("\nYou're already wearing some armor");
				    return; }
				  c[WEAR]=i-'a';  
				  bottomline(); 
				  return;

				case OSHIELD:	
				  if (c[SHIELD] != -1) { 
				   lprcat("\nYou are already wearing a shield");
				    return; 
				  }
				  if (iven[c[WIELD]]==O2SWORD) {
		     lprcat("\nYour hands are busy with the two handed sword!");
					return; 
				}
				  c[SHIELD] = i-'a';  bottomline(); return;

				default: lprcat("\nYou can't wear that!");
			};
		}
	}
}

/*
	function to drop an object
 */
dropobj()
{
	register int i;
	register char *p;
	long amt;

	p = &item[playerx][playery];
	while (1) {
		if ((i = whatitem("drop"))=='\33')  return;
		if (i=='*') 
			showstr(); 
		else {
			/* drop some gold */
			if (i=='.')	{
				if (*p) { 
				lprcat("\nThere's something here already!"); 
					return; 
				}
				lprcat("\n\n");
				cl_dn(1,23);
				lprcat("How much gold do you drop? ");
				if ((amt=readnum((long)c[GOLD])) == 0) return;
				if (amt>c[GOLD]) { 
					lprcat("\nYou don't have that much!"); 
					return; 
				}
				if (amt<=32767) { 
					*p=OGOLDPILE; 
					i=amt; 
				}
				else if (amt<=327670L) { 
					*p=ODGOLD; 
					i=amt/10; 
					amt = 10*i; 
				}
				else if (amt<=3276700L) { 
					*p=OMAXGOLD; 
					i=amt/100; 
					amt = 100*i; 
				}
				else if (amt<=32767000L) { 
					*p=OKGOLD; 
					i=amt/1000; 
					amt = 1000*i; 
				}
				else { 
					*p=OKGOLD; 
					i=32767; 
					amt = 32767000L; 
				}
				c[GOLD] -= amt; 
				lprintf("You drop %d gold pieces",(long)amt);
				iarg[playerx][playery]=i; 
				bottomgold();
				know[playerx][playery]=0; 
				dropflag=1;  
				return;
			}
			drop_object(i-'a');
			return;
		}
	}
}

/*
 *	readscr()		Subroutine to read a scroll one is carrying
 */
readscr()
	{
	register int i;
	while (1) {
		if ((i = whatitem("read"))=='\33')  return;
		if (i != '.') {
			if (i=='*') showread(); else {
				if (iven[i-'a']==OSCROLL) { read_scroll(ivenarg[i-'a']); iven[i-'a']=0; return; }
				if (iven[i-'a']==OBOOK)   { readbook(ivenarg[i-'a']);  iven[i-'a']=0; return; }
				if (iven[i-'a']==0) { ydhi(i); return; }
				lprcat("\nThere's nothing on it to read");  return;
				}
			}
		}
	}

/*
 *	subroutine to eat a cookie one is carrying
 */
eatcookie()
{
	register int i;
	char *p;

	while (1) {
	if ((i = whatitem("eat"))=='\33')  
		return;
	if (i != '.')
		if (i=='*') showeat(); else {
			if (iven[i-'a']==OCOOKIE) {
				lprcat("\nThe cookie was delicious.");
				iven[i-'a']=0;
				if (!c[BLINDCOUNT]) {
					if (p=fortune(fortfile)) {
						lprcat("  Inside you find a scrap of paper that says:\n");
						lprcat(p);
						}
					}
				return;
				}
			if (iven[i-'a']==0) { ydhi(i); return; }
			lprcat("\nYou can't eat that!");  return;
		}
	}
}

/*
 *	subroutine to quaff a potion one is carrying
 */
quaff()
{
	register int i;

	while (1) {
		if ((i = qwhatitem())=='\33')  return;
		if (i != '.') {
			if (i=='*') showquaff(); 
			else {
				if (iven[i-'a']==OPOTION) { 
					quaffpotion(ivenarg[i-'a']); 
					iven[i-'a']=0; 
					return; 
				}
				if (iven[i-'a']==0) { ydhi(i); return; }
		lprcat("\nYou wouldn't want to quaff that, would you? ");  
				return;
			}
		}
	}
}

qwhatitem()
{
	int j, i=0;
	char gack[26];

	cursors();
	for (j=0; j<=26; j++)
		switch(iven[j]) {
			case OPOTION:	gack[i++] = j;
		};
	lprintf("\nWhat do you want to quaff [");
	if (i)
		for (j=0;j<i;j++) 
			lprintf("%c",gack[j] + 'a');
	lprintf(" * for all] ?");
	i=0; 
	while (i>'z' || (i<'a' && i!='*' && i!='\33' && i!='.')) 
		i=getcharacter();
	if (i=='\33')  
		lprcat(" aborted");
	return(i);
}

/*
	function to ask what player wants to do
 */
whatitem(str)
char *str;
{
	register int j=0, flag=0, i=0;
	int wld=0, q=0, r=0, w=0, e=0, d=0;
	char gack[26];

	cursors();
	if (!strcmp(str, "wield")) wld = 1;
	else if (!strcmp(str, "quaff")) q = 1;
 	else if (!strcmp(str, "read")) r = 1;
	else if (!strcmp(str, "wear")) w = 1;
	else if (!strcmp(str, "eat")) e = 1;
	else if (!strcmp(str, "drop")) d = 1;

	for (j=0; j<=26; j++) {
		switch(iven[j]) {
		case OSWORDofSLASHING :
		case OHAMMER:
		case OSWORD:
		case O2SWORD:
		case OSPEAR :
		case ODAGGER:
		case OBATTLEAXE:
		case OLONGSWORD:
		case OFLAIL:
		case OSLAYER :
		case OLANCE :
				flag = 1; break; /* wield */
		case OPOTION:	
				flag = 2; break; /* quaff */
		case OSCROLL:
				flag = 3; break; /* read */
		case OPLATE :
		case OCHAIN:
		case OLEATHER :
		case ORING :
		case OSTUDLEATHER :
		case OSPLINT :
		case OPLATEARMOR :
		case OSSPLATE :
		case OSHIELD :
		case OELVENCHAIN :
				flag = 4; break; /* wear */
		case OCOOKIE:
				flag = 5; break; /* eat */
		default :	flag = 0; break;
		}
		if (!d) switch (flag) {
		case 0 :	break;
		case 1 : 	if (wld) gack[i++] = j;
				break;
		case 2 : 	if (q) gack[i++] = j;
				break;
		case 3 : 	if (r) gack[i++] = j;
				break;
		case 4 : 	if (w) gack[i++] = j;
				break;
		case 5 : 	if (e) gack[i++] = j;
		default : 	break;
		}
		else if (iven[j]) gack[i++] = j;
	}
	lprintf("\nWhat do you want to %s [", str);
	if (i) {
		for (j=0;j<i;j++) 
			lprintf("%c",gack[j] + 'a');
		lprintf(" ");
	}
	lprintf("* for all] ?");
	i=0; 
	while (i>'z' || (i<'a' && i!='*' && i!='\33' && i!='.')) 
		i=getcharacter();
	if (i=='\33')  
		lprcat(" aborted");
	return(i);
}



/*
	subroutine to get a number from the player
	and allow * to mean return amt, else return the number entered
 */
long readnum(mx)
long mx;
{
	register int i;
	long amt=0;

	sncbr();
	if ((i=getcharacter()) == '*')  
		amt = mx;   /* allow him to say * for all gold */
	else while (i != '\n') {
		if (i=='\033') { scbr(); lprcat(" aborted"); return(0); }
		if ((i <= '9') && (i >= '0') && (amt<999999999))
			amt = amt*10+i-'0';
		i = getcharacter();
	}
	scbr();  
	return(amt);
}