[comp.sources.games] v07i043: ularn - ultra-larn, an enhancement of the larn adventure game, Patch2b

billr@saab.CNA.TEK.COM (Bill Randle) (07/19/89)

Submitted-by: "Scott S. Snyder" <ssnyder@tybalt.caltech.edu>
Posting-number: Volume 7, Issue 43
Archive-name: ularn/Patch2b
Patch-To: ularn: Volume 7, Issue 1-9


#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create the files:
#	patch02.2
# This archive created: Sun Jul 16 07:21:36 1989
export PATH; PATH=/bin:$PATH
echo shar: extracting "'patch02.2'" '(55551 characters)'
if test -f 'patch02.2'
then
	echo shar: will not over-write existing file "'patch02.2'"
else
sed 's/^X//' << \SHAR_EOF > 'patch02.2'
Xdiff -c orig/main.c new/main.c
X*** orig/main.c	Sun Jul 16 01:07:05 1989
X--- new/main.c	Sun Jul 16 04:51:44 1989
X***************
X*** 19,25 ****
X--- 19,42 ----
X  	don't showcell in the main loop */
X  
X  char restorflag=0;	/* 1 means restore has been done	*/
X+ #ifdef __MSDOS__
X+ 
X  static char cmdhelp[] = "\
X+ Cmd line format: Ularn [-slicnh] [-o<optsfile>] [-##] [++] name\n\
X+   -s   show the scoreboard\n\
X+   -i   show scoreboard with inventories\n\
X+   -c   create new scoreboard (wizard only)\n\
X+   -n   suppress welcome message on starting game\n\
X+   -h   print this help text\n\
X+   -o<optsfile>   specify options file to be used instead of \".Ularnopts\"\n\
X+   -##  specify level of difficulty (example: Ularn -5)\n\
X+   ++  restore game checkpoint file\n";
X+ 
X+ char larnpath[SAVEFILENAMESIZE];
X+ 
X+ #else /* __MSDOS__ */
X+ 
X+ static char cmdhelp[] = "\
X  Cmd line format: Ularn [-slicnh] [-o<optsfile>] [-##] [++]\n\
X    -s   show the scoreboard\n\
X    -i   show scoreboard with inventories\n\
X***************
X*** 28,35 ****
X    -h   print this help text\n\
X    -o<optsfile>   specify .Ularnopts file to be used instead of \"~/.Ularnopts\"\n\
X    -##  specify level of difficulty (example: Ularn -5)\n\
X!   -++  restore game checkpoint file\n";
X  
X  /*
X  	************
X  	MAIN PROGRAM
X--- 45,54 ----
X    -h   print this help text\n\
X    -o<optsfile>   specify .Ularnopts file to be used instead of \"~/.Ularnopts\"\n\
X    -##  specify level of difficulty (example: Ularn -5)\n\
X!   ++  restore game checkpoint file\n";
X  
X+ #endif  /* __MSDOS__ */
X+ 
X  /*
X  	************
X  	MAIN PROGRAM
X***************
X*** 42,55 ****
X  {
X  	register int i;
X  	int hard;
X  	char *ptr=0;
X  	struct passwd *pwe,*getpwuid();
X  
X- 	init_term();	/*setup the terminal (find out what type) for termcap */
X- 
X  /*
X   *	first task is to identify the player
X   */
X  	    if ((ptr = getlogin()) == NULL)
X  	  	if (pwe=getpwuid(geteuid()))
X  			ptr = pwe->pw_name;
X--- 61,77 ----
X  {
X  	register int i;
X  	int hard;
X+ #ifdef __MSDOS__
X+ 	char *p;
X+ #else
X  	char *ptr=0;
X  	struct passwd *pwe,*getpwuid();
X+ #endif
X  
X  /*
X   *	first task is to identify the player
X   */
X+ #ifndef __MSDOS__
X  	    if ((ptr = getlogin()) == NULL)
X  	  	if (pwe=getpwuid(geteuid()))
X  			ptr = pwe->pw_name;
X***************
X*** 60,68 ****
X--- 82,201 ----
X  		 }
X  	if (ptr==NULL) goto noone;
X  	if (strlen(ptr)==0) goto noone;
X+ #endif /* __MSDOS__ */
X+ 
X  /*
X+  * allocate the memory for the I/O routines
X+  */
X+ 
X+ 	if ( ( lpbuf = malloc ((5* BUFBIG)>>2) ) == (char *)NULL)
X+ 		died(-285);
X+ 
X+ 	if ( ( inbuffer = malloc( (5*MAXIBUF) >>2) ) == (char *)NULL)
X+ 		died(-285);
X+ 
X+ /*
X   *	second task is to prepare the pathnames the player will need
X   */
X+ 
X+ #ifdef __MSDOS__
X+ 
X+ /*
X+  * try to figure out where our data files are...
X+  *
X+  *  first try to find the path where ularn.exe resides.
X+  */
X+ 
X+ 	logname[0] = loginname[0] = '\0';
X+ 
X+ 	if (strlen(argv[0])+1 > sizeof(larnpath)-12)
X+ 		argv[0][sizeof(larnpath)-1] = '\0';
X+ 	strcpy(larnpath, argv[0]);
X+ 
X+ 	p = larnpath + strlen(larnpath);
X+ 	while (--p >= larnpath)
X+ 		if (*p == '/' || *p == '\\' || *p == ':') break;
X+ 	*(p + 1) = '\0';
X+ 
X+ /*
X+  * if an option file name was specified on the command line, try to open it.
X+  */
X+ 
X+ 	for (i=1; i<argc; i++)
X+ 		if (argv[i][0] == '-' && argv[i][1] == 'o') {
X+ 			strncpy(optsfile, argv[i]+2, SAVEFILENAMESIZE-1);
X+ 			if (readopts() < 0) {
X+ 				fprintf(stderr, "Can't open options file %s\n.", optsfile);
X+ 				exit(1);
X+ 			}
X+ 			goto gotopts;
X+ 		}
X+ 
X+ /* now look for an option file in the current directory */
X+ 
X+ 	strcpy(optsfile, "ularnopt");
X+ 	if (readopts() < 0) {
X+ 
X+ /* then look for it in the larn exe directory */
X+ 
X+ 		strcpy(optsfile, larnpath);
X+ 		strcat(optsfile, "ularnopt");
X+ 		readopts();
X+   }
X+ 
X+ gotopts:
X+ 
X+ /*
X+  * if the player game a name on the command line, let it override one
X+  *  given in the options file
X+  */
X+ 
X+ 	if (argc > 1 && argv[argc-1][0] != '-' && argv[argc-1][0] != '+') {
X+ 		--argc;
X+ 		strcpy(logname, argv[argc]);
X+ 	}
X+ 
X+ /* if the player didn't specify a name, ask now */
X+ 
X+ 	while (logname[0] == '\0') {
X+ 		char tmp[LOGNAMESIZE];
X+ 		printf("Who are you: ");
X+ 		fgets(tmp, sizeof(tmp), stdin);
X+ 		p = tmp + strlen(tmp);
X+ 		while (--p >= tmp)
X+ 			if (*p == '\n' || isspace(*p)) *p = '\0';
X+ 			else break;
X+ 		for (p=tmp; *p && isspace(*p); p++)
X+ 			;
X+ 		strcpy(logname, p);
X+ 	}
X+ 
X+ /*
X+  * if the save file name wasn't specified in the options file, use the player's
X+  *  name in the current directory.
X+  */
X+ 
X+ 	if (savefilename[0] == '\0') {
X+ 		strcpy(savefilename, logname);
X+ 		savefilename[8] = '\0';
X+ 		for (p=savefilename; *p; p++)
X+ 			if (isspace(*p) || *p == '.' || *p == '\\' || *p == '/') {
X+ 				*p = '\0';
X+ 				break;
X+ 			}
X+ 		strcat(savefilename, ".sav");
X+ 	}
X+ 
X+ /* set the paths for the data files */
X+ 
X+ 	strcpy(scorefile,  larnpath);
X+ 	strcpy(logfile,    larnpath);
X+ 	strcpy(helpfile,   larnpath);
X+ 	strcpy(larnlevels, larnpath);
X+ 	strcpy(fortfile,   larnpath);
X+ 
X+ #else /* __MSDOS__ */
X+ 
X  	strcpy(loginname,ptr); 
X  
X  	/* save loginname of the user for logging purposes */
X***************
X*** 76,83 ****
X  	/* save file name in home directory */
X  	strcpy(savefilename, ptr);
X  	strcat(savefilename, "/Ularn.sav");	
X- 
X  	sprintf(optsfile, "%s/.Ularnopts",ptr);	/* the .Ularnopts filename */
X  	strcat(scorefile, SCORENAME);	/* the Ularn scoreboard filename */
X  	strcat(logfile, LOGFNAME);
X  
X--- 209,218 ----
X  	/* save file name in home directory */
X  	strcpy(savefilename, ptr);
X  	strcat(savefilename, "/Ularn.sav");	
X  	sprintf(optsfile, "%s/.Ularnopts",ptr);	/* the .Ularnopts filename */
X+ 
X+ #endif  /* __MSDOS__ */
X+ 
X  	strcat(scorefile, SCORENAME);	/* the Ularn scoreboard filename */
X  	strcat(logfile, LOGFNAME);
X  
X***************
X*** 85,104 ****
X  	strcat(helpfile, HELPNAME);	/* the Ularn on-line help file */
X  	strcat(larnlevels, LEVELSNAME);	/* the pre-made cave level data file */
X  	strcat(fortfile, FORTSNAME);	/* the fortune data file name */
X  /*
X   *	now malloc the memory for the dungeon 
X   */
X- cell = (struct cel *)malloc(sizeof(struct cel)*(MAXLEVEL+MAXVLEVEL)*MAXX*MAXY);
X  
X! 	if (cell == (struct cel *)NULL) 
X! 		died(-285);	/* malloc failure */
X  
X- 	if ( ( lpbuf = malloc ((5* BUFBIG)>>2) ) == (char *)NULL)
X- 		died(-285);
X- 
X- 	if ( ( inbuffer = malloc( (5*MAXIBUF) >>2) ) == (char *)NULL)
X- 		died(-285);
X- 
X  	lcreat((char*)0);	
X  	newgame();		/*	set the initial clock  */ 
X  	hard= -1;
X--- 220,235 ----
X  	strcat(helpfile, HELPNAME);	/* the Ularn on-line help file */
X  	strcat(larnlevels, LEVELSNAME);	/* the pre-made cave level data file */
X  	strcat(fortfile, FORTSNAME);	/* the fortune data file name */
X+ 
X+ 
X+ 	init_term();	/*setup the terminal (find out what type) for termcap */
X+ 
X  /*
X   *	now malloc the memory for the dungeon 
X   */
X  
X!         init_cells();
X  
X  	lcreat((char*)0);	
X  	newgame();		/*	set the initial clock  */ 
X  	hard= -1;
X***************
X*** 112,117 ****
X--- 243,249 ----
X  /*
X   *	now process the command line arguments 
X   */
X+ 
X  	for (i=1; i<argc; i++) {
X  		if (argv[i][0] == '-')
X  		  switch(argv[i][1]) {
X***************
X*** 165,176 ****
X  	}
X  
X  
X  	userid = geteuid();	/* obtain the user's effective id number */
X  
X  	sigsetup();	/* trap all needed signals	*/
X  	sethard(hard);	/* set up the desired difficulty	*/
X! 	setupvt100();	/* setup the terminal special mode	*/
X  	readopts();	/* read the options file if there is one */
X  
X  	/* restore game if need to */
X  	if (access(savefilename,0)==0)	{
X--- 297,314 ----
X  	}
X  
X  
X+ #ifndef __MSDOS__
X  	userid = geteuid();	/* obtain the user's effective id number */
X+ #else
X+         userid = 42;
X+ #endif
X  
X  	sigsetup();	/* trap all needed signals	*/
X  	sethard(hard);	/* set up the desired difficulty	*/
X! #ifndef __MSDOS__  /* if __MSDOS__, we've already done this */
X  	readopts();	/* read the options file if there is one */
X+ #endif
X+ 	setupvt100();	/* setup the terminal special mode	*/
X  
X  	/* restore game if need to */
X  	if (access(savefilename,0)==0)	{
X***************
X*** 321,327 ****
X  
X  	/* count number of items we will display */
X  	for (count=2,j=0; j<26; j++)	 
X! 	   if (i=iven[j])
X  		switch(i) {
X  			case OLEATHER:	
X  			case OPLATE:	
X--- 459,465 ----
X  
X  	/* count number of items we will display */
X  	for (count=2,j=0; j<26; j++)	 
X! 	   if ((i=iven[j])!=0)
X  		switch(i) {
X  			case OLEATHER:	
X  			case OPLATE:	
X***************
X*** 369,375 ****
X  	srcount=0;
X  
X  	 for (count=2,j=0; j<26; j++)	/* count how many items */
X! 	   if (i=iven[j])
X  		switch(i) {
X  			case ODIAMOND:  case ORUBY:  case OEMERALD:  
X  			case OSAPPHIRE:
X--- 507,513 ----
X  	srcount=0;
X  
X  	 for (count=2,j=0; j<26; j++)	/* count how many items */
X! 	   if ((i=iven[j])!=0)
X  		switch(i) {
X  			case ODIAMOND:  case ORUBY:  case OEMERALD:  
X  			case OSAPPHIRE:
X***************
X*** 1018,1034 ****
X  				else if (amt<=327670L) { 
X  					*p=ODGOLD; 
X  					i=amt/10; 
X! 					amt = 10*i; 
X  				}
X  				else if (amt<=3276700L) { 
X  					*p=OMAXGOLD; 
X  					i=amt/100; 
X! 					amt = 100*i; 
X  				}
X  				else if (amt<=32767000L) { 
X  					*p=OKGOLD; 
X  					i=amt/1000; 
X! 					amt = 1000*i; 
X  				}
X  				else { 
X  					*p=OKGOLD; 
X--- 1156,1172 ----
X  				else if (amt<=327670L) { 
X  					*p=ODGOLD; 
X  					i=amt/10; 
X! 					amt = 10L*i; 
X  				}
X  				else if (amt<=3276700L) { 
X  					*p=OMAXGOLD; 
X  					i=amt/100; 
X! 					amt = 100L*i; 
X  				}
X  				else if (amt<=32767000L) { 
X  					*p=OKGOLD; 
X  					i=amt/1000; 
X! 					amt = 1000L*i; 
X  				}
X  				else { 
X  					*p=OKGOLD; 
X***************
X*** 1085,1091 ****
X  				lprcat("\nThe cookie was delicious.");
X  				iven[i-'a']=0;
X  				if (!c[BLINDCOUNT]) {
X! 					if (p=fortune(fortfile)) {
X  						lprcat("  Inside you find a scrap of paper that says:\n");
X  						lprcat(p);
X  						}
X--- 1223,1229 ----
X  				lprcat("\nThe cookie was delicious.");
X  				iven[i-'a']=0;
X  				if (!c[BLINDCOUNT]) {
X! 					if ((p=fortune(fortfile))!=0) {
X  						lprcat("  Inside you find a scrap of paper that says:\n");
X  						lprcat(p);
X  						}
Xdiff -c orig/makehelp.bat new/makehelp.bat
X*** orig/makehelp.bat	Sun Jul 16 05:19:23 1989
X--- new/makehelp.bat	Sun Jul 16 04:59:03 1989
X***************
X*** 0 ****
X--- 1 ----
X+ to_ansi <uhelp.no_ >uhelp
Xdiff -c orig/monster.c new/monster.c
X*** orig/monster.c	Sun Jul 16 01:00:30 1989
X--- new/monster.c	Sun Jul 16 04:57:39 1989
X***************
X*** 216,238 ****
X  					return;
X  				}
X  			case ODGOLD :
X! 				if ( (10 * iarg[x][y] + arg) < 327670L) {
X  					i = iarg[x][y] ;
X! 					iarg[x][y] = (10 * i + arg) / 10;
X  					item[x][y] = ODGOLD;
X  					return;
X  				}
X  			case OMAXGOLD :
X! 				if ( (100 * iarg[x][y] + arg) < 3276700L) {
X! 					i = (100 * iarg[x][y]) + arg;
X! 					iarg[x][y] = i / 100;
X  					item[x][y] = OMAXGOLD;
X  					return;
X  				}
X  			case OKGOLD :
X! 				if ( (1000 * iarg[x][y] + arg) < 32767000L) { 
X  					i = iarg[x][y];
X! 					iarg[x][y] = (1000 * i + arg) / 1000;
X  					item[x][y] = OKGOLD;
X  					return;
X  				}
X--- 216,238 ----
X  					return;
X  				}
X  			case ODGOLD :
X! 				if ( (10L * iarg[x][y] + arg) < 327670L) {
X  					i = iarg[x][y] ;
X! 					iarg[x][y] = (10L * i + arg) / 10;
X  					item[x][y] = ODGOLD;
X  					return;
X  				}
X  			case OMAXGOLD :
X! 				if ( (100L * iarg[x][y] + arg) < 3276700L) {
X! 					i = ((100L * iarg[x][y]) + arg)/100;
X! 					iarg[x][y] = i;
X  					item[x][y] = OMAXGOLD;
X  					return;
X  				}
X  			case OKGOLD :
X! 				if ( (1000L * iarg[x][y] + arg) < 32767000L) { 
X  					i = iarg[x][y];
X! 					iarg[x][y] = (1000L * i + arg) / 1000;
X  					item[x][y] = OKGOLD;
X  					return;
X  				}
X***************
X*** 401,406 ****
X--- 401,413 ----
X  		return;	/* cure blindness	*/
X  
X  	case 11:	
X+ 		if (wizard) {
X+ 			lprintf("Number: ");
X+ 			if ((i = readnum((long)-1)) != -1) {
X+ 				createmonster(i);
X+ 				return;
X+ 			}
X+ 		}
X  		createmonster(makemonst(level+1)+8);  
X  		return;
X  
X***************
X*** 885,891 ****
X  			nap(delay); 
X  			show1cell(x,y);
X  		}
X! 		if ((m=mitem[x][y]))	/* is there a monster there? */
X  		{
X  			ifblind(x,y);
X  			if (m == LUCIFER || (m>=DEMONLORD && rnd(100)<10) ) {
X--- 892,898 ----
X  			nap(delay); 
X  			show1cell(x,y);
X  		}
X! 		if ((m=mitem[x][y])!=0)	/* is there a monster there? */
X  		{
X  			ifblind(x,y);
X  			if (m == LUCIFER || (m>=DEMONLORD && rnd(100)<10) ) {
X***************
X*** 1081,1087 ****
X  	for (x=playerx-1; x<playerx+2; x++)
X  		for (y=playery-1; y<playery+2; y++)
X  		{
X! 			if (m=mitem[x][y])
X  				if (nospell(spnum,m) == 0)
X  				{
X  					ifblind(x,y);
X--- 1088,1094 ----
X  	for (x=playerx-1; x<playerx+2; x++)
X  		for (y=playery-1; y<playery+2; y++)
X  		{
X! 			if ((m=mitem[x][y])!=0)
X  				if (nospell(spnum,m) == 0)
X  				{
X  					ifblind(x,y);
X***************
X*** 1227,1233 ****
X  	hit3flag=1;  
X  	ifblind(x,y);
X  
X! tmp = monster[monst].armorclass + c[LEVEL] + c[DEXTERITY] + c[WCLASS/4] -12 
X  	    - c[HARDGAME];
X  
X  	cursors();
X--- 1234,1242 ----
X  	hit3flag=1;  
X  	ifblind(x,y);
X  
X! /* this couldn't have been right, could it? */
X! /*tmp = monster[monst].armorclass + c[LEVEL] + c[DEXTERITY] + c[WCLASS/4] -12*/
X! tmp = monster[monst].armorclass + c[LEVEL] + c[DEXTERITY] + c[WCLASS]/4 -12
X  	    - c[HARDGAME];
X  
X  	cursors();
X***************
X*** 1487,1494 ****
X  dropgold(amount)
X  register int amount;
X  {
X! 	if (amount > 250) createitem(OMAXGOLD, amount);  
X! 	else  createitem(OGOLDPILE,amount);
X  }
X  
X  /*
X--- 1496,1503 ----
X  dropgold(amount)
X  register int amount;
X  {
X! 	if (amount > 250) createitem(OMAXGOLD, (long)amount);  
X! 	else  createitem(OGOLDPILE,(long)amount);
X  }
X  
X  /*
X***************
X*** 1510,1516 ****
X  	if (rnd(101)<8) 
X  		something(lev); /* possibly more than one item */
X  	j = newobject(lev,&i);		
X! 	createitem(j,i);
X  }
X  
X  /*
X--- 1519,1525 ----
X  	if (rnd(101)<8) 
X  		something(lev); /* possibly more than one item */
X  	j = newobject(lev,&i);		
X! 	createitem(j,(long)i);
X  }
X  
X  /*
X***************
X*** 1570,1581 ****
X  	case 17: 
X  	case 18: 
X  	case 19: 
X! 		if (!(*i=newdagger()))  return(0);  
X  		break;
X  	case 20: 
X  	case 21: 
X  	case 22: 
X! 		if (!(*i=newleather()))  return(0);  
X  		break;
X  	case 23: 
X  	case 32: 
X--- 1579,1590 ----
X  	case 17: 
X  	case 18: 
X  	case 19: 
X! 		if ((*i=newdagger())==0)  return(0);  
X  		break;
X  	case 20: 
X  	case 21: 
X  	case 22: 
X! 		if ((*i=newleather())==0)  return(0);  
X  		break;
X  	case 23: 
X  	case 32: 
X***************
X*** 1694,1703 ****
X  	switch(x) {
X  	case 1:	/* rust your armor, j=1 when rusting has occurred */
X  		m = k = c[WEAR];
X! 		if ((i=c[SHIELD]) != -1)
X! 			if (--ivenarg[i] < -1) 
X  				ivenarg[i]= -1; 
X  			else j=1;
X  		if ((j==0) && (k != -1)) {
X  			m = iven[k];
X  			for (i=0; i<ARMORTYPES; i++)
X--- 1703,1714 ----
X  	switch(x) {
X  	case 1:	/* rust your armor, j=1 when rusting has occurred */
X  		m = k = c[WEAR];
X! 		if ((i=c[SHIELD]) != -1) {
X! 			--ivenarg[i];  /* avoid TC bug again... */
X! 			if (ivenarg[i] < -1) 
X  				ivenarg[i]= -1; 
X  			else j=1;
X+ 		}
X  		if ((j==0) && (k != -1)) {
X  			m = iven[k];
X  			for (i=0; i<ARMORTYPES; i++)
X***************
X*** 1704,1710 ****
X  				if (m == rustarm[i][0]) 
X  					/* find his armor in table */
X  				{
X! 					if (--ivenarg[k]< rustarm[i][1])
X  						ivenarg[k]= rustarm[i][1]; 
X  					else j=1; 
X  					break;
X--- 1715,1722 ----
X  				if (m == rustarm[i][0]) 
X  					/* find his armor in table */
X  				{
X! 					--ivenarg[k];
X! 					if (ivenarg[k]< rustarm[i][1])
X  						ivenarg[k]= rustarm[i][1]; 
X  					else j=1; 
X  					break;
Xdiff -c orig/nap.c new/nap.c
X*** orig/nap.c	Sun Jul 16 01:07:09 1989
X--- new/nap.c	Sun Jul 16 04:37:49 1989
X***************
X*** 2,7 ****
X--- 2,11 ----
X  
X  #include "header.h"
X  
X+ #ifdef __MSDOS__
X+ # include <dos.h>
X+ #endif
X+ 
X  /*
X   *	routine to take a nap for n milliseconds
X   */
X***************
X*** 96,105 ****
X  	}
X  }
X  #    endif /* SIGVTALARAM */
X! #  else /* not BSD */
X  napms(time) 
X  int time; 
X  {
X  }	/* do nothing, forget it */
X  #  endif /* BSD */
X  #endif /* SYSV */
X--- 100,139 ----
X  	}
X  }
X  #    endif /* SIGVTALARAM */
X! #  else
X! #   ifdef __MSDOS__
X! 
X! napms(zzz)
X! int zzz;
X! {
X!   time_t targ_time, t;
X!   int targ_hund;
X!   struct time tm;
X! 
X!   time(&targ_time);
X!   gettime(&tm);
X!   targ_hund = tm.ti_hund + zzz/10;
X! 
X!   while (targ_hund >= 100) {
X!     targ_hund -= 100;
X!     ++targ_time;
X!   }
X! 
X!   do {
X!     time(&t);
X!   } while (t < targ_time);
X! 
X!   do {
X!     gettime(&tm);
X!   } while (tm.ti_hund < targ_hund);
X! }
X! 
X! #   else
X! 
X  napms(time) 
X  int time; 
X  {
X  }	/* do nothing, forget it */
X+ #   endif /* __MSDOS__ */
X  #  endif /* BSD */
X  #endif /* SYSV */
Xdiff -c orig/object.c new/object.c
X*** orig/object.c	Sun Jul 16 01:00:05 1989
X--- new/object.c	Sun Jul 16 04:53:56 1989
X***************
X*** 1131,1138 ****
X  {
X  	register int j;
X  	for (j=0; j<26; j++)	/* adjust time related parameters */
X! 		if (c[time_change[j]])
X! 			if ((c[time_change[j]] -= tim) < 1) c[time_change[j]]=1;
X  	regen();
X  }
X  
X--- 1131,1144 ----
X  {
X  	register int j;
X  	for (j=0; j<26; j++)	/* adjust time related parameters */
X! 		if (c[time_change[j]]) {
X! /* this next line rearranged to avoid TC bug */
X! /*			if ((c[time_change[j]] -= tim) < 1) c[time_change[j]]=1;*/
X!                         if (c[time_change[j]] < tim+1)
X!                           c[time_change[j]] = 1;
X!                         else
X!                           c[time_change[j]] -= tim;
X!                 }
X  	regen();
X  }
X  
X***************
X*** 1404,1414 ****
X  	register int i,tmp;
X  
X  	if (arg<=3) 
X! 		i = rund((tmp=splev[arg])?tmp:1); 
X  	else {
X  		if (arg >= 21) 
X  			arg = 20;	/* # entries in splev = 21 */
X! 		i = rnd( (tmp=splev[arg]-9) ?tmp:1 ) + 9;
X  	}
X  	spelknow[i]=1;
X  	lprintf("\nSpell \"%s\":  %s\n%s",
X--- 1410,1420 ----
X  	register int i,tmp;
X  
X  	if (arg<=3) 
X! 		i = rund(((tmp=splev[arg])!=0)?tmp:1); 
X  	else {
X  		if (arg >= 21) 
X  			arg = 20;	/* # entries in splev = 21 */
X! 		i = rnd( ((tmp=splev[arg]-9)!=0) ?tmp:1 ) + 9;
X  	}
X  	spelknow[i]=1;
X  	lprintf("\nSpell \"%s\":  %s\n%s",
X***************
X*** 1436,1442 ****
X  			lprcat("eat\nThe cookie tasted good.");
X  			forget(); /* no more cookie	*/
X  			if (c[BLINDCOUNT]) return;
X! 			if (!(p=fortune(fortfile))) return;
X  			lprcat("  A message inside the cookie reads:\n"); 
X  			lprcat(p);
X  			return;
X--- 1442,1448 ----
X  			lprcat("eat\nThe cookie tasted good.");
X  			forget(); /* no more cookie	*/
X  			if (c[BLINDCOUNT]) return;
X! 			if ((p=fortune(fortfile)) == NULL) return;
X  			lprcat("  A message inside the cookie reads:\n"); 
X  			lprcat(p);
X  			return;
Xdiff -c orig/patchlevel.h new/patchlevel.h
X*** orig/patchlevel.h	Sun Jul 16 01:07:17 1989
X--- new/patchlevel.h	Sun Jul 16 04:58:57 1989
X***************
X*** 1 ****
X! #define PATCHLEVEL	1
X--- 1 ----
X! #define PATCHLEVEL 2
Xdiff -c orig/regen.c new/regen.c
X*** orig/regen.c	Sun Jul 16 01:02:38 1989
X--- new/regen.c	Sun Jul 16 04:57:57 1989
X***************
X*** 143,149 ****
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--- 143,150 ----
X  			}
X  		if (i!=999)
X  			if (--d[SEEINVISIBLE]<=0) {
X! 				monstnamelist[INVISIBLESTALKER] =
X! 					objnamelist[0];
X  				cursors();  
X  			   lprcat("\nYou feel your vision return to normal"); 
X  				beep(); 
Xdiff -c orig/savelev.c new/savelev.c
X*** orig/savelev.c	Sun Jul 16 01:03:14 1989
X--- new/savelev.c	Sun Jul 16 06:14:05 1989
X***************
X*** 1,62 ****
X  /* savelev.c	*/
X  #include "header.h"
X  
X! extern struct cel *cell;
X  
X  /*
X!  *	routine to save the present level into storage
X   */
X! savelevel()
X  {
X! 	struct cel *pcel;
X! 	char *pitem,*pknow,*pmitem;
X! 	short *phitp,*piarg;
X! 	struct cel *pecel;
X  
X! 	pcel = &cell[level*MAXX*MAXY];	/* pointer to this level's cells */
X  
X! 	/* pointer to past end of this level's cells */
X! 	pecel = pcel + MAXX*MAXY;	
X  
X! 	pitem=item[0]; 
X! 	piarg=iarg[0]; 
X! 	pknow=know[0]; 
X! 	pmitem=mitem[0]; 
X! 	phitp=hitp[0];
X! 	while (pcel < pecel) {
X! 		pcel->mitem  = *pmitem++;
X! 		pcel->hitp   = *phitp++;
X! 		pcel->item   = *pitem++;
X! 		pcel->know   = *pknow++;
X! 		pcel++->iarg = *piarg++;
X! 	}
X  }
X  
X  /*
X   *	routine to restore a level from storage
X   */
X  getlevel()
X  {
X! 	struct cel *pcel;
X! 	char *pitem,*pknow,*pmitem;
X! 	short *phitp,*piarg;
X! 	struct cel *pecel;
X  
X! 	pcel = &cell[level*MAXX*MAXY];	/* pointer to this level's cells */
X  
X! 	/* pointer to past end of this level's cells */
X! 	pecel = pcel + MAXX*MAXY;	
X  
X! 	pitem=item[0]; 
X! 	piarg=iarg[0]; 
X! 	pknow=know[0]; 
X! 	pmitem=mitem[0]; 
X! 	phitp=hitp[0];
X! 	while (pcel < pecel) {
X! 		*pmitem++ = pcel->mitem;
X! 		*phitp++ = pcel->hitp;
X! 		*pitem++ = pcel->item;
X! 		*pknow++ = pcel->know;
X! 		*piarg++ = pcel++->iarg;
X  	}
X  }
X--- 1,626 ----
X  /* savelev.c	*/
X  #include "header.h"
X  
X! #ifdef __MSDOS__
X  
X+ # define SWAPPING
X+ 
X+ extern unsigned long coreleft(void);
X+ 
X  /*
X!  * how much memory must we leave after allocating space for all the
X!  *  levels? we need memory for the fortune file and for spheres.
X   */
X! 
X! # define LEFTOVERS 20000
X! 
X! #endif
X! 
X! /*
X!  * When a player leaves a level, the arrays describing that level are
X!  *  concatenated and placed in a Saved_Level structure. Memory space for
X!  *  these structures is pointed to by saved_levels[]. For each entry in
X!  *  saved_levels[], the corresponding entry in slot_in_use[] is 1 if
X!  *  that entry is currently holding a level, -1 if that level couldn't
X!  *  be malloc'd, and 0 if it is free. For each level, its entry in
X!  *  level_locs[] is the index into saved_levels[] where it is stored, or
X!  *  -1 if it isn't stored there (it is the current level, or it hasn't
X!  *  been visited yet). If the level is stored in the swapfile, level_loc
X!  *  is (-2 - swap_slot). slot_time holds the time when the level
X!  *  in that slot was saved, for implementing LRU swapping. An entry in
X!  *  swap_slot_in_use is 1 if the slot is in use, 0 if it is free, and -1 if
X!  *  it hasn't been allocated yet. If swap_slot_in_use[0] == -1, the swapfile
X!  *  hasn't been opened yet.
X!  */
X! 
X! typedef char Char_Ary[MAXX][MAXY];
X! typedef short Short_Ary[MAXX][MAXY];
X! 
X! /* this is the structure that holds the entire dungeon specifications */
X! typedef struct {
X!   Short_Ary hitp;
X!   Char_Ary  mitem;
X!   Char_Ary  item;
X!   Short_Ary iarg;
X!   Char_Ary  know;
X! } Saved_Level;
X! 
X! #define NLEVELS (MAXLEVEL + MAXVLEVEL)
X! 
X! static Saved_Level *saved_levels[NLEVELS];
X! 
X! #ifdef SWAPPING
X! 
X! static int slot_in_use[NLEVELS], level_locs[NLEVELS];
X! static long slot_time[NLEVELS];
X! static int swap_slot_in_use[NLEVELS];
X! static char swap_file_name[] = "lrnswpxxxxxx";
X! static FILE *swap_fp = NULL;
X! 
X! /*
X!  * open and close the swap file...
X!  */
X! 
X! close_swap_file()
X  {
X!   fclose(swap_fp);
X!   unlink(swap_file_name);
X! }
X  
X! open_swap_file()
X! {
X!   mktemp(swap_file_name);
X!   if ((swap_fp = fopen(swap_file_name, "w+b")) == NULL) {
X!     perror("Can't open swap file");
X!     abort();
X!   }
X!   lprintf("(Opened swap file)\n");
X  
X!   atexit(close_swap_file);
X! }
X  
X! #define SWAP_SEEK(slot) fseek(swap_fp, (long)(slot)*sizeof(Saved_Level), 0)
X! 
X! /*
X!  * swap_write: write a level out to the swap file
X!  */
X! 
X! swap_write(storage, slot)
X! Saved_Level *storage;
X! int slot;
X! {
X!   if (swap_fp == NULL || slot < 0 || slot >= NLEVELS || storage == NULL) {
X!     puts("swap_write: bogus arguments");
X!     abort();
X!   }
X! 
X!   if (SWAP_SEEK(slot) ||
X!        fwrite((char *)storage, sizeof(Saved_Level), 1, swap_fp) != 1) {
X!     perror("Can't write to swap file");
X!     abort();
X!   }
X  }
X  
X  /*
X+  * swap_read: read a level in from the swap file
X+  */
X+ 
X+ swap_read(storage, slot)
X+ Saved_Level *storage;
X+ int slot;
X+ {
X+   if (swap_fp == NULL || slot < 0 || slot >= NLEVELS || storage == NULL) {
X+     puts("swap_read: bogus arguments");
X+     abort();
X+   }
X+ 
X+   if (SWAP_SEEK(slot) ||
X+        fread((char *)storage, sizeof(Saved_Level), 1, swap_fp) != 1) {
X+     perror("Can't read from swap file");
X+     abort();
X+   }
X+ }
X+ 
X+ /*
X+  * swap_out_level: swap the least-recently saved level out.
X+  */
X+ 
X+ swap_out_level()
X+ {
X+   int lru_slot = -1;
X+   long lru_time;
X+   int swap_slot = -1;
X+   int i, level;
X+ 
X+   time(&lru_time);
X+ 
X+   for (i=0; i<NLEVELS; i++)
X+     if (slot_in_use[i] == 1 && slot_time[i] < lru_time) {
X+       lru_time = slot_time[i];
X+       lru_slot = i;
X+     }
X+ 
X+   if (lru_slot == -1) {
X+     puts("swap_out_level: couldn't find a level to swap out!");
X+     abort();
X+   }
X+ 
X+   for (i=0; i<NLEVELS; i++)
X+     if (swap_slot_in_use[i] != 1) {
X+       if (swap_slot_in_use[i] == -1 && i == 0) open_swap_file();
X+       swap_slot = i;
X+       break;
X+     }
X+ 
X+   if (swap_slot == -1) {
X+     puts("swap_out_level: couldn't find a free swap slot!");
X+     abort();
X+   }
X+ 
X+   swap_write(saved_levels[lru_slot], swap_slot);
X+ 
X+   level=-1;
X+   for (i=0; i<NLEVELS; i++)
X+     if (level_locs[i] == lru_slot) {
X+       level = i;
X+       break;
X+     }
X+ 
X+   if (level == -1) {
X+     puts("swap_out_level: i couldn't figure out what level i was outswapping");
X+     abort();
X+   }
X+ 
X+   level_locs[level] = -2-swap_slot;
X+   slot_in_use[lru_slot] = 0;
X+   swap_slot_in_use[swap_slot] = 1;
X+ }
X+ 
X+ /*
X+  * alloc_level allocates a slot for a new level and returns a pointer to the
X+  *  Saved_Level structure. note: this pointer may be invalidated by any
X+  *  future calls to get_level or alloc_level.
X+  */
X+ 
X+ static Saved_Level *alloc_level(level)
X+ int level;
X+ {
X+   int i;
X+   int tried_to_swap = 0;
X+ 
X+ try_again:
X+   for (i=0; i<NLEVELS; i++)
X+     if (slot_in_use[i] == 0) {
X+       slot_in_use[i] = 1;
X+       level_locs[level] = i;
X+       time(&slot_time[i]);
X+       if (saved_levels[i] == NULL) {
X+         printf("bug in alloc_level!");
X+         abort();
X+       }
X+       return saved_levels[i];
X+     }
X+ 
X+   if (tried_to_swap) {
X+     puts("Can't find a place to put a level!");
X+     abort();
X+   }
X+   else {
X+     tried_to_swap = 1;
X+     swap_out_level();
X+     goto try_again;
X+   }
X+ }
X+ 
X+ /*
X+  * get_level returns a pointer to the Saved_Level structure for the indicated
X+  *  level. note: this pointer may be invalidated by any future calls to
X+  *  get_level or alloc_level.
X+  */
X+ 
X+ static Saved_Level *get_level(level)
X+ int level;
X+ {
X+   int slot = level_locs[level];
X+   Saved_Level *storage = saved_levels[slot];
X+ 
X+   if (slot == -1 || slot >= NLEVELS || slot <= -2 - NLEVELS) {
X+     puts("bug in get_level!");
X+     abort();
X+   }
X+ 
X+   if (slot >= 0)
X+     storage = saved_levels[slot];
X+   else {
X+ 
X+ /* swap in the level */
X+ 
X+     slot = -2 - slot;
X+     if (swap_slot_in_use[slot] != 1) {
X+       puts("bogus swapped level_loc in get_level!");
X+       abort();
X+     }
X+     storage = alloc_level(level);
X+ 
X+     swap_read(storage, slot);
X+ 
X+     swap_slot_in_use[slot] = 0;
X+   }
X+ 
X+   if (storage == NULL) {
X+     puts("bogus storage pointer in get_level!");
X+     abort();
X+   }
X+   return storage;
X+ }
X+ 
X+ /*
X+  * free the storage for a level
X+  */
X+ 
X+ static free_level(level)
X+ int level;
X+ {
X+   int slot = level_locs[level];
X+ 
X+   if (slot < -2-NLEVELS || slot == -1 || slot >= NLEVELS) {
X+     printf("bug in free_level!\n");
X+     abort();
X+   }
X+ 
X+   if (slot >= 0)
X+     slot_in_use[slot] = 0;
X+   else
X+     swap_slot_in_use[-2-slot] = 0;
X+ 
X+   level_locs[level] = -1;
X+ }
X+ 
X+ #endif /* SWAPPING */
X+ 
X+ 
X+ /*
X+  *	routine to save the present level into storage
X+  */
X+ savelevel()
X+ {
X+ #ifdef SWAPPING
X+   Saved_Level *storage = alloc_level(level);
X+ #else
X+   Saved_Level *storage = saved_levels[level];
X+ #endif
X+ 
X+   memcpy(storage->hitp,  hitp,  sizeof(Short_Ary));
X+   memcpy(storage->mitem, mitem, sizeof(Char_Ary));
X+   memcpy(storage->item,  item,  sizeof(Char_Ary));
X+   memcpy(storage->iarg,  iarg,  sizeof(Short_Ary));
X+   memcpy(storage->know,  know,  sizeof(Char_Ary));
X+ }
X+ 
X+ /*
X   *	routine to restore a level from storage
X   */
X  getlevel()
X  {
X! #ifdef SWAPPING
X!   Saved_Level *storage = get_level(level);
X! #else
X!   Saved_Level *storage = saved_levels[level];
X! #endif
X  
X!   memcpy(hitp,  storage->hitp,  sizeof(Short_Ary));
X!   memcpy(mitem, storage->mitem, sizeof(Char_Ary));
X!   memcpy(item,  storage->item,  sizeof(Char_Ary));
X!   memcpy(iarg,  storage->iarg,  sizeof(Short_Ary));
X!   memcpy(know,  storage->know,  sizeof(Char_Ary));
X  
X! #ifdef SWAPPING
X!   free_level(level);
X! #endif
X! }
X  
X! /*
X! 	to save the game in a file
X!  */
X! static long int zzz=0;
X! extern int rmst;
X! extern long lasttime;
X! savegame(fname)
X! char *fname;
X! {
X! 	register int i,k;
X! 	register struct sphere *sp;
X! 	struct stat statbuf;
X!         Saved_Level *storage;
X! 
X! 	nosignal=1;  
X! 	lflush();	
X! 	savelevel();
X! 	ointerest();
X! 	if (lcreat(fname, 1) < 0) {
X! 		lcreat((char*)0); 
X! 		lprintf("\nCan't open file <%s> to save game\n",fname);
X! 		nosignal=0;  
X! 		return(-1);
X  	}
X+ 
X+ 	set_score_output();
X+ 	lwrite((char*)beenhere,MAXLEVEL+MAXVLEVEL);
X+ 	for (k=0; k<MAXLEVEL+MAXVLEVEL; k++)
X+ 		if (beenhere[k]) {
X+ #ifdef SWAPPING
X+                         storage = get_level(k);
X+ #else
X+ 			storage = saved_levels[k];
X+ #endif
X+ 			lwrite((char*)storage, sizeof(Saved_Level));
X+                 }
X+ 	lwrite((char*)&c[0],100*sizeof(long));
X+ 	lprint((long)gtime);		
X+ 	lprc(level);
X+ 	lprc(playerx);		
X+ 	lprc(playery);
X+ 	lwrite((char*)iven,26);	
X+ 	lwrite((char*)ivenarg,26*sizeof(short));
X+ 	lwrite((char*)char_class,20);	
X+ 	for (k=0; k<MAXSCROLL; k++)  lprc(scrollname[k][0]);
X+ 	for (k=0; k<MAXPOTION; k++)  lprc(potionname[k][0]);
X+ 	lwrite((char*)spelknow,SPNUM);		 
X+ 	lprc(wizard);
X+ 	lprc(rmst);		/*	random monster generation counter */
X+ 	for (i=0; i<90; i++)	lprc(itm[i].qty);
X+ 	lwrite((char*)course,25);			
X+ 	lprc(cheat);		
X+ 
X+ 	/* genocide info */
X+ 	for (i=0; i<MAXMONST; i++) lprc(monster[i].genocided);
X+ 
X+ 	/* save spheres of annihilation */
X+ 	for (sp=spheres; sp; sp=sp->p)
X+ 		lwrite((char*)sp,sizeof(struct sphere));	
X+ 
X+ 	time(&zzz);			
X+ 	lprint((long)(zzz-initialtime));
X+ 	lwrite((char*)&zzz,sizeof(long));
X+ 
X+ 	if (fstat(lfd,&statbuf)< 0) lprint(0L);
X+ 	else 
X+ 		lprint((long)statbuf.st_ino); /* inode # */
X+ 
X+ 	lwclose();	
X+ 	lastmonst[0] = 0;
X+ 	lcreat((char*)0);  
X+ 	nosignal=0;
X+ 	return(0);
X+ }
X+ 
X+ restoregame(fname)
X+ char *fname;
X+ {
X+ 	register int i,k;
X+ 	register struct sphere *sp,*sp2;
X+ 	struct stat filetimes;
X+         Saved_Level *storage;
X+ 
X+ 
X+ 	cursors(); 
X+ 	lprcat("\nRestoring . . .");  
X+ 	lflush();
X+ 	if (lopen(fname, 1) <= 0) {
X+ 		lcreat((char*)0); 
X+ 		lprintf("\nCan't open file <%s> to restore game\n",fname);
X+ 		nap(2000); 
X+ 		c[GOLD]=c[BANKACCOUNT]=0;  
X+ 		died(-265); 
X+ 		return;
X+ 	}
X+ 
X+ 	lrfill((char*)beenhere,MAXLEVEL+MAXVLEVEL);
X+ 	for (k=0; k<MAXLEVEL+MAXVLEVEL; k++)
X+ 		if (beenhere[k]) {
X+ #ifdef SWAPPING
X+                         storage = alloc_level(k);
X+ #else
X+ 			storage = saved_levels[k];
X+ #endif
X+ 			lrfill((char*)storage, sizeof(Saved_Level));
X+                 }
X+ 
X+ 	lrfill((char*)&c[0],100*sizeof(long));	
X+ 	gtime = lrint();
X+ 	level = c[CAVELEVEL] = lgetc();
X+ 
X+ 	playerx = lgetc();		
X+ 	playery = lgetc();
X+ 
X+ 	lrfill((char*)iven,26);
X+ 	lrfill((char*)ivenarg,26*sizeof(short));
X+ 	lrfill((char*)char_class,20);		
X+ 
X+ 	for (k=0; k<MAXSCROLL; k++)  scrollname[k][0] = lgetc();
X+ 	for (k=0; k<MAXPOTION; k++)  potionname[k][0] = lgetc();
X+ 
X+ 	lrfill((char*)spelknow,SPNUM);		
X+ 
X+ 	wizard = lgetc();
X+ 	rmst = lgetc();			/*	random monster creation flag */
X+ 
X+ 	for (i=0; i<90; i++)	
X+ 		itm[i].qty = lgetc();
X+ 
X+ 	lrfill((char*)course,25);			
X+ 	cheat = lgetc();
X+ 
X+ 	/* genocide info */
X+ 	for (i=0; i<MAXMONST; i++) monster[i].genocided=lgetc(); 
X+ 
X+ 	for (sp=0,i=0; i<c[SPHCAST]; i++) {
X+ 		sp2 = sp;
X+ 		sp = (struct sphere *)malloc(sizeof(struct sphere));
X+ 		if (sp==0) { 
X+ 			fprintf(stderr, "Can't malloc() for sphere space\n"); 
X+ 			break; 
X+ 		}
X+ 		/* get spheres of annihilation */
X+ 		lrfill((char*)sp,sizeof(struct sphere));	
X+ 		sp->p=0;	/* null out pointer */
X+ 		if (i==0) spheres=sp;	/* beginning of list */
X+ 		else sp2->p = sp;
X+ 	}
X+ 
X+ 
X+ 	time(&zzz);
X+ 	initialtime = zzz-lrint();
X+ 
X+ 	fstat(fd,&filetimes);/*get the creation and modification time of file*/
X+ 
X+ 	lrfill((char*)&zzz,sizeof(long));	
X+ 
X+ 	zzz += 6;
X+ #ifndef __TURBOC__
X+ 	if (filetimes.st_ctime > zzz) 
X+ 		fsorry();	/*file create time	*/
X+ 	else if (filetimes.st_mtime > zzz) 
X+ 		fsorry(); /*	file modify time*/
X+ #endif
X+ 
X+ 
X+ 	if (c[HP]<0) { 
X+ 		died(284); 
X+ 		return; 
X+ 	}	/* died a post mortem death */
X+ 
X+ 	oldx = oldy = 0;
X+ 
X+ 	i = lrint();  /* inode # */
X+ #ifndef __TURBOC__
X+ 	if (i && (filetimes.st_ino!=i)) 
X+ 		fsorry();	/* different inode number, file was copied */
X+ #endif
X+ 
X+ 	lrclose();
X+ 
X+ 	if (strcmp(fname,ckpfile) == 0) {
X+ 		if (lappend(fname, 1) < 0) 
X+ 			fcheat();  
X+ 		else { 
X+ 			lprc(' '); 
X+ 			lwclose(); 
X+ 		}
X+ 		lcreat((char*)0);
X+ 	}
X+ 	else if (unlink(fname) < 0) 
X+ 		fcheat(); /* can't unlink save file */
X+ 
X+ 	/*	for the greedy cheater checker	*/
X+ 	/* for (k=0; k<6; k++) if (c[k]>99) greedy();
X+ 	if (c[HPMAX]>999 || c[SPELLMAX]>125) greedy(); */
X+ 	if (c[LEVEL]==25 && c[EXPERIENCE]>skill[24]) {
X+ 		long tmp = c[EXPERIENCE]-skill[24]; /* amount to go up */
X+ 		c[EXPERIENCE] = skill[24];
X+ 		raiseexperience((long)tmp);
X+ 	}
X+ 	getlevel();  
X+ 	lasttime=gtime;
X+ 
X+ 	for (k=0; k<26; k++) 
X+ 		if (iven[k] == OLARNEYE) {
X+ 			monstnamelist[DEMONLORD] = '1';
X+ 			monstnamelist[DEMONLORD+1] = '2';
X+ 			monstnamelist[DEMONLORD+2] = '3';
X+ 			monstnamelist[DEMONLORD+3] = '4';
X+ 			monstnamelist[DEMONLORD+4] = '5';
X+ 			monstnamelist[DEMONLORD+5] = '6';
X+ 			monstnamelist[DEMONLORD+6] = '7';
X+ 			monstnamelist[DEMONPRINCE] = '9';
X+ 			monstnamelist[LUCIFER] = '0';
X+ 			break;
X+ 		}
X+ }
X+ 
X+ /*
X+ 	subroutine to not allow greedy cheaters
X+  */
X+ greedy()
X+ {
X+ 	if (wizard) return;
X+ 
X+ lprcat("\n\nI am so sorry, but your character is a little TOO good!  Since this\n");
X+ lprcat("cannot normally happen from an honest game, I must assume that you cheated.\n");
X+ lprcat("In that you are GREEDY as well as a CHEATER, I cannot allow this game\n");
X+ 	lprcat("to continue.\n"); 
X+ 	nap(5000);  
X+ 	c[GOLD]=c[BANKACCOUNT]=0;  
X+ 	died(-267); 
X+ 	return;
X+ }
X+ 
X+ /*
X+ 	subroutine to not allow altered save files and terminate the attempted
X+ 	restart
X+  */
X+ fsorry()
X+ {
X+ 	if(cheat) return;
X+ lprcat("\nSorry, but your savefile has been altered.\n");
X+ lprcat("However, seeing as I am a good sport, I will let you play.\n");
X+ lprcat("Be advised though, you won't be placed on the scoreboard.");
X+ 	cheat = 1;	
X+ 	nap(4000);
X+ }
X+ 
X+ /*
X+ 	subroutine to not allow game if save file can't be deleted
X+  */
X+ fcheat()
X+ {
X+ 	if (wizard) return;
X+ 	if(cheat) return;
X+ 
X+ lprcat("\nSorry, but your savefile can't be deleted.  This can only mean\n");
X+ lprcat("that you tried to CHEAT by protecting the directory the savefile\n");
X+ lprcat("is in.  Since this is unfair to the rest of the Ularn community, I\n");
X+ lprcat("cannot let you play this game.\n");
X+ 	nap(5000);  
X+ 	c[GOLD]=c[BANKACCOUNT]=0;  
X+ 	died(-268); 
X+ 	return;
X+ }
X+ 
X+ init_cells()
X+ {
X+   int i, missing=0;
X+ 
X+   for (i=0; i<NLEVELS; i++) {
X+ #ifdef __MSDOS__
X+     if (coreleft() <= LEFTOVERS)
X+       saved_levels[i] = NULL;
X+     else
X+ #endif
X+     saved_levels[i] = (Saved_Level *)malloc(sizeof(Saved_Level));
X+ #ifdef SWAPPING
X+     if (saved_levels[i] == NULL) {
X+       ++missing;
X+       slot_in_use[i] = -1;
X+     }
X+     else slot_in_use[i] = 0;
X+ 
X+     level_locs[i] = -1;
X+     slot_time[i] = 0;
X+     swap_slot_in_use[i] = -1;
X+ #else
X+     if (saved_levels[i] == NULL) died(-285);
X+ #endif /* SWAPPING */
X+   }
X+ 
X+ /* must have at least one save area available */
X+ 
X+ #ifdef SWAPPING
X+   if (saved_levels[0] == NULL) died(-285);
X+ 
X+   if (missing) {
X+     printf("Couldn't allocate space for %d levels\n", missing);
X+     nap(2000);
X+   }
X+ #endif
X  }
Xdiff -c orig/scores.c new/scores.c
X*** orig/scores.c	Sun Jul 16 01:07:15 1989
X--- new/scores.c	Sun Jul 16 04:41:43 1989
X***************
X*** 63,68 ****
X--- 63,74 ----
X  static struct scofmt sco[SCORESIZE];	/* the structure for the scoreboard  */
X  static struct wscofmt winr[SCORESIZE];	/* struct for the winning scoreboard */
X  
X+ #ifdef __MSDOS__
X+ # define SAMEGUY(rec) (strcmp((rec).who, logname) == 0)
X+ #else
X+ # define SAMEGUY(rec) ((rec).suid == userid)
X+ #endif
X+ 
X  static char	*whydead[] = {
X  "quit", 					/* 0 */
X  "suspended", 
X***************
X*** 106,112 ****
X--- 112,122 ----
X  {
X  	FILE *fp;
X  
X+ #ifdef __MSDOS__
X+ 	if ((fp = fopen(scorefile, "rb")) == (FILE *)NULL) {
X+ #else
X  	if ((fp = fopen(scorefile, "r")) == (FILE *)NULL) {
X+ #endif
X  		fprintf(stderr, "Can't open scorefile for reading\n"); 
X  		fflush(stderr);
X  		return(-1); 
X***************
X*** 139,145 ****
X--- 149,159 ----
X  {
X  	FILE *fp;
X  
X+ #ifdef __MSDOS__
X+ 	if ((fp = fopen(scorefile, "wb")) == (FILE *)NULL) {
X+ #else
X  	if ((fp = fopen(scorefile, "w")) == (FILE *)NULL) {
X+ #endif
X  		lprcat("Can't open scorefile for writing\n"); 
X  		lflush();
X  		return(-1); 
X***************
X*** 203,209 ****
X  		return(0);	/* can't find scoreboard */
X  
X  	for (i = 0; i < SCORESIZE; i++)	/* search through winners scoreboard */
X! 		if (winr[i].suid == userid)
X  			if (winr[i].score > 0) {
X  				c[HARDGAME] = winr[i].hardlev + 1;
X  				outstanding_taxes = winr[i].taxes;
X--- 217,223 ----
X  		return(0);	/* can't find scoreboard */
X  
X  	for (i = 0; i < SCORESIZE; i++)	/* search through winners scoreboard */
X! 		if (SAMEGUY(winr[i]))
X  			if (winr[i].score > 0) {
X  				c[HARDGAME] = winr[i].hardlev + 1;
X  				outstanding_taxes = winr[i].taxes;
X***************
X*** 234,240 ****
X  	for (i = 0; i < SCORESIZE; i++)
X  
X  		/* look for players winning entry */
X! 		if (winr[i].suid == userid)
X  
X  			/* search for a winning entry for the player */ {
X  			if (winr[i].score > 0) 
X--- 248,254 ----
X  	for (i = 0; i < SCORESIZE; i++)
X  
X  		/* look for players winning entry */
X! 		if (SAMEGUY(winr[i]))
X  
X  			/* search for a winning entry for the player */ {
X  			if (winr[i].score > 0) 
X***************
X*** 281,287 ****
X  			if (p->order == i) {
X  			    if (p->score) {
X  			      count++;
X! 			      printf("%-10ld%8d%8d Mobuls  (%s) %s\n",
X  				    (long)p->score,
X  				    p->hardlev, 
X  				    p->timeused, 
X--- 295,301 ----
X  			if (p->order == i) {
X  			    if (p->score) {
X  			      count++;
X! 			      printf("%-10ld%8d%8ld Mobuls  (%s) %s\n",
X  				    (long)p->score,
X  				    p->hardlev, 
X  				    p->timeused, 
X***************
X*** 490,496 ****
X  
X  	if (winner) {
X  		for (i = 0; i < SCORESIZE; i++)
X! 			if (sco[i].suid == userid)
X  				sco[i].score = 0;
X  		taxes = score * TAXRATE;
X  		score += 100000 * c[HARDGAME];	/* bonus for winning */
X--- 504,510 ----
X  
X  	if (winner) {
X  		for (i = 0; i < SCORESIZE; i++)
X! 			if (SAMEGUY(sco[i]))
X  				sco[i].score = 0;
X  		taxes = score * TAXRATE;
X  		score += 100000 * c[HARDGAME];	/* bonus for winning */
X***************
X*** 497,503 ****
X  
X  /* if he has a slot on the winning scoreboard update it if greater score*/
X  		for (i = 0; i < SCORESIZE; i++) 
X! 			if (winr[i].suid == userid) { 
X  				new1sub(score, i, whoo, taxes); 
X  				return; 
X  			}
X--- 511,517 ----
X  
X  /* if he has a slot on the winning scoreboard update it if greater score*/
X  		for (i = 0; i < SCORESIZE; i++) 
X! 			if (SAMEGUY(winr[i])) {
X  				new1sub(score, i, whoo, taxes); 
X  				return; 
X  			}
X***************
X*** 511,517 ****
X  	} else if (!cheat) /* for not winning scoreboard */ {
X  	/* if he has a slot on the scoreboard update it if greater score */
X  		for (i = 0; i < SCORESIZE; i++) 
X! 			if (sco[i].suid == userid) { 
X  				new2sub(score, i, whoo, whyded); 
X  				return; 
X  			}
X--- 525,531 ----
X  	} else if (!cheat) /* for not winning scoreboard */ {
X  	/* if he has a slot on the scoreboard update it if greater score */
X  		for (i = 0; i < SCORESIZE; i++) 
X! 			if (SAMEGUY(sco[i])) {
X  				new2sub(score, i, whoo, whyded); 
X  				return; 
X  			}
Xdiff -c orig/signal.c new/signal.c
X*** orig/signal.c	Sun Jul 16 01:00:34 1989
X--- new/signal.c	Sun Jul 16 04:38:11 1989
X***************
X*** 5,10 ****
X--- 5,16 ----
X  #define BIT(a) (1<<((a)-1))
X  extern char savefilename[],wizard,predostuff,nosignal;
X  
X+ #ifdef __MSDOS__
X+ # define VOID void
X+ #else
X+ # define VOID
X+ #endif
X+ 
X  s2choose()	/* text to be displayed if ^C during intro screen */
X  {
X  	cursor(1,24); 
X***************
X*** 16,22 ****
X  	lflush(); 
X  }
X  
X! cntlc()	/* what to do for a ^C */
X  {
X  	if (nosignal) 
X  		return;	/* don't do anything if inhibited */
X--- 22,28 ----
X  	lflush(); 
X  }
X  
X! VOID cntlc()	/* what to do for a ^C */
X  {
X  	if (nosignal) 
X  		return;	/* don't do anything if inhibited */
X***************
X*** 27,33 ****
X--- 33,41 ----
X  	else 
X  		showplayer();
X  	lflush();
X+ #ifndef __MSDOS__
X  	signal(SIGQUIT,cntlc);	
X+ #endif
X  	signal(SIGINT,cntlc);
X  }
X  
X***************
X*** 70,106 ****
X  /*
X   *	subroutine to issue the needed signal traps  called from main()
X   */
X! sigill()  { sigpanic(SIGILL); }	 
X  sigtrap() { sigpanic(SIGTRAP); }
X  sigiot()  { sigpanic(SIGIOT); }   
X  sigemt()  { sigpanic(SIGEMT); }
X- sigfpe()  { sigpanic(SIGFPE); }   
X  sigbus()  { sigpanic(SIGBUS); }
X- sigsegv() { sigpanic(SIGSEGV); }  
X  sigsys()  { sigpanic(SIGSYS); }
X  sigpipe() { sigpanic(SIGPIPE); }  
X! sigterm() { sigpanic(SIGTERM); }
X  
X  sigsetup()
X  {
X- 	signal(SIGQUIT, cntlc); 		
X  	signal(SIGINT,  cntlc); 
X  	signal(SIGKILL, SIG_IGN);		
X  	signal(SIGHUP,  sgam);
X- 	signal(SIGILL,  sigill);		
X  	signal(SIGTRAP, sigtrap);
X  	signal(SIGIOT,  sigiot);		
X  	signal(SIGEMT,  sigemt);
X- 	signal(SIGFPE,  sigfpe);		
X  	signal(SIGBUS,  sigbus);
X- 	signal(SIGSEGV, sigsegv);		
X  	signal(SIGSYS,  sigsys);
X  	signal(SIGPIPE, sigpipe);		
X- 	signal(SIGTERM, sigterm);
X  #ifdef SIGTSTP
X  	signal(SIGTSTP,tstop);		
X  	signal(SIGSTOP,tstop);
X  #endif /* SIGTSTP */
X  }
X  
X  #ifdef BSD	/* for BSD UNIX? */
X--- 78,120 ----
X  /*
X   *	subroutine to issue the needed signal traps  called from main()
X   */
X! VOID sigill()  { sigpanic(SIGILL); }	 
X! VOID sigfpe()  { sigpanic(SIGFPE); }   
X! VOID sigsegv() { sigpanic(SIGSEGV); }  
X! VOID sigterm() { sigpanic(SIGTERM); }
X! 
X! #ifndef __MSDOS__
X  sigtrap() { sigpanic(SIGTRAP); }
X  sigiot()  { sigpanic(SIGIOT); }   
X  sigemt()  { sigpanic(SIGEMT); }
X  sigbus()  { sigpanic(SIGBUS); }
X  sigsys()  { sigpanic(SIGSYS); }
X  sigpipe() { sigpanic(SIGPIPE); }  
X! #endif
X  
X  sigsetup()
X  {
X  	signal(SIGINT,  cntlc); 
X+ 	signal(SIGILL,  sigill);		
X+ 	signal(SIGFPE,  sigfpe);		
X+ 	signal(SIGSEGV, sigsegv);		
X+ 	signal(SIGTERM, sigterm);
X+ 
X+ #ifndef __MSDOS__
X+ 	signal(SIGQUIT, cntlc); 		
X  	signal(SIGKILL, SIG_IGN);		
X  	signal(SIGHUP,  sgam);
X  	signal(SIGTRAP, sigtrap);
X  	signal(SIGIOT,  sigiot);		
X  	signal(SIGEMT,  sigemt);
X  	signal(SIGBUS,  sigbus);
X  	signal(SIGSYS,  sigsys);
X  	signal(SIGPIPE, sigpipe);		
X  #ifdef SIGTSTP
X  	signal(SIGTSTP,tstop);		
X  	signal(SIGSTOP,tstop);
X  #endif /* SIGTSTP */
X+ #endif /* __MSDOS__ */
X  }
X  
X  #ifdef BSD	/* for BSD UNIX? */
X***************
X*** 137,142 ****
X--- 151,157 ----
X  	"","","","" };
X  
X  #else  /* SYSV */
X+ # ifndef __MSDOS__
X  static char *signame[NSIG] = { 
X  	"",
X  	"SIGHUP",  /*	1	 hangup */
X***************
X*** 159,164 ****
X--- 174,207 ----
X  	"SIGCLD",  /*	18	 child death */
X  	"SIGPWR"   /*	19	 power fail */
X  };
X+ # else /* __MSDOS__ */
X+ static char *signame[] = {
X+   "",         /*  0 */
X+   "",         /*  1 */
X+   "SIGINT",   /*  2 */
X+   "",         /*  3 */
X+   "SIGILL",   /*  4 */
X+   "",         /*  5 */
X+   "",         /*  6 */
X+   "",         /*  7 */
X+   "SIGFPE",   /*  8 */
X+   "",         /*  9 */
X+   "",         /* 10 */
X+   "SIGSEGV",  /* 11 */
X+   "",         /* 12 */
X+   "",         /* 13 */
X+   "",         /* 14 */
X+   "SIGTERM",  /* 15 */
X+   "SIGUSR1",  /* 16 */
X+   "SIGUSR2",  /* 17 */
X+   "",         /* 18 */
X+   "",         /* 19 */
X+   "SIGUSR3",  /* 20 */
X+   "SIGBREAK", /* 21 */
X+   "SIGABRT",  /* 22 */
X+ };
X+ # endif /* __MSDOS__ */
X+ 
X  #endif /* BSD */
X  
X  /*
X***************
X*** 173,177 ****
X--- 216,224 ----
X  	sleep(2);
X  	sncbr();
X  	savegame(savefilename); 
X+ #ifdef __MSDOS__
X+         exit(10);
X+ #else
X  	kill(getpid(),sig); /* this will terminate us */
X+ #endif
X  }
Xdiff -c orig/store.c new/store.c
X*** orig/store.c	Sun Jul 16 01:07:20 1989
X--- new/store.c	Sun Jul 16 04:43:41 1989
X***************
X*** 216,227 ****
X  				outofstock(); 
X  			else if (pocketfull()) 
X  				handsfull(); 
X! 			else if (c[GOLD] < itm[i].price*10) 
X  				nogold(); 
X  			else { 	
X  				if (itm[i].mem != 0) 
X  					*itm[i].mem[itm[i].arg] = ' ';
X! 				c[GOLD] -= itm[i].price*10;
X  				itm[i].qty--;  
X  				take(itm[i].obj,itm[i].arg);
X  				if (itm[i].qty==0) 
X--- 216,227 ----
X  				outofstock(); 
X  			else if (pocketfull()) 
X  				handsfull(); 
X! 			else if (c[GOLD] < itm[i].price*10L) 
X  				nogold(); 
X  			else { 	
X  				if (itm[i].mem != 0) 
X  					*itm[i].mem[itm[i].arg] = ' ';
X! 				c[GOLD] -= itm[i].price*10L;
X  				itm[i].qty--;  
X  				take(itm[i].obj,itm[i].arg);
X  				if (itm[i].qty==0) 
X***************
X*** 284,290 ****
X  	}
X  	else lprintf("%s",objectname[itm[i].obj]);
X  	cursor( j+31,k );  
X! 	lprintf("%6d",(long)(itm[i].price*10));
X  }
X  
X  
X--- 284,290 ----
X  	}
X  	else lprintf("%s",objectname[itm[i].obj]);
X  	cursor( j+31,k );  
X! 	lprintf("%6d",((long)itm[i].price*10));
X  }
X  
X  
X***************
X*** 464,470 ****
X  /*
X   *	for the first national bank of Ularn
X   */
X! int lasttime=0;	/* last time he was in bank */
X  obank()
X  {
X  	banktitle("    Welcome to the First National Bank of Ularn.");
X--- 464,470 ----
X  /*
X   *	for the first national bank of Ularn
X   */
X! long lasttime=0;	/* last time he was in bank */
X  obank()
X  {
X  	banktitle("    Welcome to the First National Bank of Ularn.");
X***************
X*** 626,640 ****
X  				for (i=0; i<26; i++) { 	
X  					if (gemvalue[i]) {
X  						if (iven[i]==OLARNEYE) {
X! 						monstnamelist[DEMONLORD]=' ';
X! 						monstnamelist[DEMONLORD+1]=' ';
X! 						monstnamelist[DEMONLORD+2]= ' ';
X! 						monstnamelist[DEMONLORD+3]= ' ';
X! 						monstnamelist[DEMONLORD+4]= ' ';
X! 						monstnamelist[DEMONLORD+5]= ' ';
X! 						monstnamelist[DEMONLORD+6]= ' ';
X! 						monstnamelist[DEMONPRINCE]= ' ';
X! 						monstnamelist[LUCIFER] = ' ';
X  						}
X  						c[GOLD]+=gemvalue[i];  
X  						iven[i]=0;
X--- 626,641 ----
X  				for (i=0; i<26; i++) { 	
X  					if (gemvalue[i]) {
X  						if (iven[i]==OLARNEYE) {
X!                                                   char c = objnamelist[0];
X! 						  monstnamelist[DEMONLORD  ]=c;
X! 						  monstnamelist[DEMONLORD+1]=c;
X! 						  monstnamelist[DEMONLORD+2]=c;
X! 						  monstnamelist[DEMONLORD+3]=c;
X! 						  monstnamelist[DEMONLORD+4]=c;
X! 						  monstnamelist[DEMONLORD+5]=c;
X! 						  monstnamelist[DEMONLORD+6]=c;
X! 						  monstnamelist[DEMONPRINCE]=c;
X! 						  monstnamelist[LUCIFER]    =c;
X  						}
X  						c[GOLD]+=gemvalue[i];  
X  						iven[i]=0;
X***************
X*** 651,665 ****
X  					break;
X  				}
X  				if (iven[i]==OLARNEYE) {
X! 					monstnamelist[DEMONLORD]=' ';
X! 					monstnamelist[DEMONLORD+1]=' ';
X! 					monstnamelist[DEMONLORD+2]= ' ';
X! 					monstnamelist[DEMONLORD+3]= ' ';
X! 					monstnamelist[DEMONLORD+4]= ' ';
X! 					monstnamelist[DEMONLORD+5]= ' ';
X! 					monstnamelist[DEMONLORD+6]= ' ';
X! 					monstnamelist[DEMONPRINCE]= ' ';
X! 					monstnamelist[LUCIFER] = ' ';
X  				}
X  				c[GOLD]+=gemvalue[i];  
X  				iven[i]=0;
X--- 652,667 ----
X  					break;
X  				}
X  				if (iven[i]==OLARNEYE) {
X! 					char c = objnamelist[0];
X! 					monstnamelist[DEMONLORD  ] = c;
X! 					monstnamelist[DEMONLORD+1] = c;
X! 					monstnamelist[DEMONLORD+2] = c;
X! 					monstnamelist[DEMONLORD+3] = c;
X! 					monstnamelist[DEMONLORD+4] = c;
X! 					monstnamelist[DEMONLORD+5] = c;
X! 					monstnamelist[DEMONLORD+6] = c;
X! 					monstnamelist[DEMONPRINCE] = c;
X! 					monstnamelist[LUCIFER]     = c;
X  				}
X  				c[GOLD]+=gemvalue[i];  
X  				iven[i]=0;
X***************
X*** 685,691 ****
X  appraise(gemstone)
X  int gemstone;
X  {
X! 	register int j,amt;
X  
X  	for (j=0; j<26; j++)
X  		if (iven[j]==gemstone) {
X--- 687,694 ----
X  appraise(gemstone)
X  int gemstone;
X  {
X! 	register int j;
X!         register long amt;
X  
X  	for (j=0; j<26; j++)
X  		if (iven[j]==gemstone) {
X***************
X*** 731,737 ****
X  
X  otradepost()
X  {
X! 	int i,j,value,isub,izarg;
X  
X  	dnditm = dndcount = 0;
X  	nosignal = 1; /* disable signals */
X--- 734,741 ----
X  
X  otradepost()
X  {
X! 	int i,j,isub,izarg;
X!         long value;
X  
X  	dnditm = dndcount = 0;
X  	nosignal = 1; /* disable signals */
X***************
X*** 1116,1121 ****
X--- 1120,1126 ----
X  		lprcat("\nSo, what are ya? ");
X  		lflush();
X  
X+ 		i=0;
X  		while (i<'a' || i>'h') 
X  			i=getcharacter();
X  
Xdiff -c orig/tok.c new/tok.c
X*** orig/tok.c	Sun Jul 16 01:07:17 1989
X--- new/tok.c	Sun Jul 16 04:49:51 1989
X***************
X*** 43,57 ****
X  		if (ckpflag)
X  			/* check for periodic checkpointing */
X  			if ( c[BYTESIN] == 1 || (c[BYTESIN] % 400) == 0) {
X  			    wait((int *)0);/* wait for other forks to finish */
X  				if (fork() == 0) { 
X  					savegame(ckpfile); 
X  					exit(0); 
X  				}
X  			}
X  		flushall();
X! 		if (read(0,&cc,1) != 1) 
X! 			return(lastok = -1);
X  
X  		if (cc == '!')	/* shell escape */
X  		{ 	
X--- 43,60 ----
X  		if (ckpflag)
X  			/* check for periodic checkpointing */
X  			if ( c[BYTESIN] == 1 || (c[BYTESIN] % 400) == 0) {
X+ #ifdef __MSDOS__
X+ 				savegame(ckpfile);
X+ #else
X  			    wait((int *)0);/* wait for other forks to finish */
X  				if (fork() == 0) { 
X  					savegame(ckpfile); 
X  					exit(0); 
X  				}
X+ #endif /* __MSDOS__ */
X  			}
X  		flushall();
X! 		cc = getcharacter();
X  
X  		if (cc == '!')	/* shell escape */
X  		{ 	
X***************
X*** 60,65 ****
X--- 63,71 ----
X  			sncbr();
X  			cl_dn(0,0);
X  			lflush();
X+ #ifdef __MSDOS__
X+ 			system("COMMAND");
X+ #else
X  			if ((ic=fork())==0) {
X  				execl("/bin/csh", "/bin/csh", (char *)0);	
X  				exit(1);
X***************
X*** 73,78 ****
X--- 79,85 ----
X  				fflush(stderr);
X  				sleep(2);
X  			}
X+ #endif
X  			setscroll();
X  			scbr();
X  			return(lastok = 'L'-64);	/* redisplay screen */
X***************
X*** 105,115 ****
X--- 112,126 ----
X  		} /* gobble up the byte */
X  	}
X  #else /* SYSV */
X+ # ifdef __MSDOS__
X+ 	while (kbhit()) (void)getch();
X+ # else
X  #  ifdef TCIFLUSH
X  	tcflush(0, TCIFLUSH);		/* SYSV w/POSIX 1003 tcflush() */
X  #  else
X          ioctl(0, TCFLSH);		/* standard ioctl */
X  #  endif /* TCIFLUSH */
X+ # endif /* __MSDOS__ */
X  #endif /* BSD */
X  }
X  
X***************
X*** 120,126 ****
X  sethard(hard)
X  int hard;
X  {
X! 	register int j,k,i;
X  
X  	if (restorflag==0)  {      /* don't set c[HARDGAME] if restoring game */
X  		if (hashewon() == 0) {
X--- 131,138 ----
X  sethard(hard)
X  int hard;
X  {
X! 	register int j,k;
X! 	long i;
X  
X  	if (restorflag==0)  {      /* don't set c[HARDGAME] if restoring game */
X  		if (hashewon() == 0) {
X***************
X*** 130,136 ****
X  		else  if (hard > c[HARDGAME]) c[HARDGAME] = hard;
X  	}
X  
X! 	if (k=c[HARDGAME])
X  		for (j=0; j<=MAXMONST+8; j++) {
X  			i = ((6+k)*monster[j].hitpoints+1)/6;
X  			monster[j].hitpoints = (i<0) ? 32767 : i;
X--- 142,148 ----
X  		else  if (hard > c[HARDGAME]) c[HARDGAME] = hard;
X  	}
X  
X! 	if ((k=c[HARDGAME])!=0)
X  		for (j=0; j<=MAXMONST+8; j++) {
X  			i = ((6+k)*monster[j].hitpoints+1)/6;
X  			monster[j].hitpoints = (i<0) ? 32767 : i;
X***************
X*** 155,163 ****
X  	extern int char_picked;
X  	int flag=1;
X  
X! 	if (lopen(optsfile) < 0) {
X  		strcpy(logname,loginname); 
X! 		return; /* user name if no character name */
X  	}
X  	i = " ";
X  	while (*i) {
X--- 167,175 ----
X  	extern int char_picked;
X  	int flag=1;
X  
X! 	if (lopen(optsfile, 0) < 0) {
X  		strcpy(logname,loginname); 
X! 		return -1; /* user name if no character name */
X  	}
X  	i = " ";
X  	while (*i) {
X***************
X*** 167,172 ****
X--- 179,191 ----
X  		case 'b':	
X  			if (strcmp(i,"bold-off") == 0)  
X  				boldon=0;
X+ #ifdef __MSDOS__
X+ 			else if (strcmp(i, "background:") == 0) {
X+ 				extern int bg_color;
X+ 				if ((i = lgetw())==0) break;
X+ 				bg_color = parse_color(i, bg_color);
X+ 			}
X+ #endif
X  			break;
X  
X  		case 'e':	
X***************
X*** 177,182 ****
X--- 196,208 ----
X  		case 'f':	
X  			if (strcmp(i,"female") == 0)	
X  				sex=0; /* male or female */
X+ #ifdef __MSDOS__
X+ 			else if (strcmp(i, "foreground:") == 0) {
X+ 				extern int fg_color;
X+ 				if ((i = lgetw())==0) break;
X+ 				fg_color = parse_color(i, fg_color);
X+ 			}
X+ #endif
X  			break;
X  
X  			/* name favorite monster */
X***************
X*** 210,215 ****
X--- 236,247 ----
X  				nowelcome=1;
X  			else if (strcmp(i,"no-beep") == 0) 
X  				nobeep=1;
X+ #ifdef __MSDOS__
X+ 			else if (strcmp(i, "nansi") == 0) {
X+ 				extern int nansi;
X+ 				nansi=1;
X+ 			}
X+ #endif
X  			break;
X  
X  		case 'c':
X***************
X*** 247,253 ****
X--- 279,366 ----
X  				flag=0;
X  			}
X  			break;
X+ 		case 'g':
X+ 			if (strcmp(i, "graphics:") == 0) {
X+ 				int c;
X+ 				if ((i=lgetw())==0) break;
X+ 				c = atoi(i);
X+ 				if (c <= 0 || c > 255) break;
X+ 				objnamelist[0] = c;
X+ 				monstnamelist[INVISIBLESTALKER] = c;
X+ 				monstnamelist[DEMONLORD  ] = c;
X+ 				monstnamelist[DEMONLORD+1] = c;
X+ 				monstnamelist[DEMONLORD+2] = c;
X+ 				monstnamelist[DEMONLORD+3] = c;
X+ 				monstnamelist[DEMONLORD+4] = c;
X+ 				monstnamelist[DEMONLORD+5] = c;
X+ 				monstnamelist[DEMONLORD+6] = c;
X+ 				monstnamelist[DEMONPRINCE] = c;
X+ 				monstnamelist[LUCIFER]     = c;
X+ 				objnamelist[OTRAPARROWIV]  = c;
X+ 				objnamelist[OIVDARTRAP]    = c;
X+ 				objnamelist[OIVTRAPDOOR]   = c;
X+ 				objnamelist[OIVTELETRAP]   = c;
X+ 				if ((i=lgetw())==0) break;
X+ 				c = atoi(i);
X+ 				if (c <= 0 || c > 255) break;
X+ 				objnamelist[OWALL] = c;
X+ 			}
X+ 			break;
X+ #ifdef __MSDOS__
X+ 		case 'k':
X+ 			if (strcmp(i, "keypad") == 0) {
X+ 				extern int keypad;
X+ 				keypad = 1;
X+ 			}
X+ 			break;
X+ 		case 'r':
X+ 			if (strcmp(i, "rawio") == 0) {
X+ 				extern int rawio;
X+ 				rawio = 1;
X+ 			}
X+ 			break;
X+ 		case 'l':
X+ 			if (strcmp(i, "larn-path:") == 0) {
X+ 				extern char larnpath[];
X+ 				if ((i=lgetw())==0) break;
X+ 				if (strlen(i)>=SAVEFILENAMESIZE-1)
X+ 					i[SAVEFILENAMESIZE-2]=0;
X+ 				strcpy(larnpath,i); 
X+ 				i = larnpath + strlen(larnpath) - 1;
X+ 				if (i >= larnpath &&
X+ 					!(*i == '/' || *i == '\\')) {
X+ 					*++i = '\\';
X+ 					*++i = '\0';
X+ 				}
X+ 				i = " ";
X+ 			}
X+ 			break;
X+ 
X+ #endif
X  		};
X  	}
X  	if (flag)  strcpy(logname,loginname);
X+ 	return 0;
X  }
X+ 
X+ 
X+ #ifdef __MSDOS__
X+ 
X+ static char *colors[8] = { "bla", "r", "g", "y", "blu", "m", "c", "w" };
X+ 
X+ int parse_color(name, old)
X+ char *name;
X+ int old;
X+ {
X+ 	int i;
X+ 
X+ 	for (i=0; i<8; i++)
X+ 		if (strncmp(name, colors[i], strlen(colors[i])) == 0) return i;
X+ 
X+ 	printf("Unknown color name %s\n", name);
X+ 	nap(2000);
X+ 
X+ 	return old;
X+ }
X+ 
X+ #endif  /* __MSDOS__ */
Xdiff -c orig/ularn.lnk new/ularn.lnk
X*** orig/ularn.lnk	Sun Jul 16 05:19:29 1989
X--- new/ularn.lnk	Sun Jul 16 04:59:42 1989
X***************
X*** 0 ****
X--- 1,8 ----
X+ c:\l\tc\lib\c0h.obj +
X+ bill.obj config.obj create.obj data.obj diag.obj display.obj +
X+ fortune.obj global.obj help.obj io.obj main.obj monster.obj +
X+ moreobj.obj movem.obj object.obj regen.obj savelev.obj scores.obj +
X+ signal.obj store.obj tok.obj nap.obj
X+ ularn.exe
X+ ularn.map
X+ c:\l\tc\lib\emu.lib c:\l\tc\lib\mathh.lib c:\l\tc\lib\ch.lib
SHAR_EOF
if test 55551 -ne "`wc -c < 'patch02.2'`"
then
	echo shar: error transmitting "'patch02.2'" '(should have been 55551 characters)'
fi
fi # end of overwriting check
#	End of shell archive
exit 0