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

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

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


[[This posting contains patches to allow Ularn to compile and run on
  MS-DOS systems, using Turbo C v2.0.]]

#! /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.1
# This archive created: Sun Jul 16 07:21:26 1989
export PATH; PATH=/bin:$PATH
echo shar: extracting "'patch02.1'" '(50636 characters)'
if test -f 'patch02.1'
then
	echo shar: will not over-write existing file "'patch02.1'"
else
sed 's/^X//' << \SHAR_EOF > 'patch02.1'
Xdiff -c orig/README.dos new/README.dos
X*** orig/README.dos	Sun Jul 16 05:19:15 1989
X--- new/README.dos	Sun Jul 16 04:59:16 1989
X***************
X*** 0 ****
X--- 1,84 ----
X+ 
X+   This set of patches will allow Ularn to compile and run under Mess-Dos
X+ using Turbo C v2.0. Installation instructions, in brief:
X+ 
X+   1. Apply the patches.
X+   2. Edit ularn.lnk, and change the directory names to wherever you keep the
X+      Turbo C libraries.
X+   3. Rename 'makefile.tcc' to 'makefile'.
X+   4. Run make.
X+   5. Copy ularn.exe and the data files ufortune, uhelp, and umaps to wherever
X+      you want to keep them.
X+   6. You must have ANSI.SYS (or NANSI.SYS) installed in order to use Ularn.
X+   7. When running the program, you can specify your character name on the
X+      command line by using 'ularn character-name'. If you don't specify a
X+      name on the command line or in an options file, you will be asked to
X+      enter a name when the game starts.
X+ 
X+ 
X+   The changes that I made fall into several classes:
X+ 
X+ New features:
X+ 
X+   1. Graphics characters. You can specify arbitrary character codes to be
X+ used for drawing the floor and walls of the dungeon. This is done by a
X+ line in the options file of the form 'graphics: floor-code wall-code'.
X+ For example, I use 'graphics: 176 178'.
X+ 
X+   2. Swapping. If memory is limited, levels that are not currently in use
X+ will be swapped out to disk. This feature is enabled by defining the
X+ symbol SWAPPING when compiling savelev.c.
X+ 
X+   Warning: the savefile format has been changed. Finish any old games before
X+ installing this version!
X+ 
X+ 
X+ Modifications for MS-DOS:
X+ 
X+   1. Location of options file. If an options file is specified on the command
X+ line, Ularn will look for it there and abort if it isn't found. Otherwise,
X+ Ularn will try to open the file 'ularnopt', first in the current directory,
X+ and then in the directory in which ularn.exe is located.
X+ 
X+   2. Location of data files. Ularn expects its data files to be in the
X+ directory that ularn.exe is located in. This can be overridden by using
X+ the 'larn-path:' keyword in the options file.
X+ 
X+   3. Character name and save files. The character name can be specified on
X+ the command line ('ularn character-name') or in the options file. If it
X+ is given by both methods, the name specified on the command line takes
X+ precedence. If it is given by neither, you will be asked to enter a name
X+ when the game starts. The name used for the save file will be the first
X+ eight characters of your character's name, followed by '.sav'. This can
X+ be overridden, however, by using the 'savefile:' keyword in the options
X+ file.
X+ 
X+   4. Keypad support. If you have an IBM compatible and want to use the
X+ keypad for movement, include the 'keypad' keyword in the options file.
X+ You can then move around using the eight directional keys (Num Lock
X+ should be _off_). You can run in a given direction by shifting a directional
X+ key. Ins is equivalent to 'i' and Del is equivalent to '.'.
X+ 
X+   5. NANSI support. If you are using NANSI.SYS instead of ANSI.SYS, you
X+ should include the 'nansi' keyword in the options file. Ularn will then
X+ use the insert-line and delete-line control sequences. If you have an IBM
X+ compatible, you can also set the 'rawio' option, which results in faster
X+ output.
X+ 
X+   6. Screen color. You can specify the foreground and background colors
X+ of the screen by using the options 'foreground:' and 'background:', e.g.,
X+ 'foreground: magenta' or 'background: blue'. Most combinations look pretty
X+ ghastly, though.
X+ 
X+ 
X+ Bug fixes:
X+ 
X+   Mostly int/long mismatches. I also ran across a TC code generation bug
X+ and had to rearrange several lines to avoid it. I'm sure there are still
X+ some left, but I've already spent too much time ... um ... _testing_ this
X+ program... :-)
X+ 
X+ Enjoy,
X+ 
X+ Scott Snyder
X+ ssnyder@tybalt.caltech.edu
Xdiff -c orig/Makefile.tcc new/Makefile.tcc
X*** orig/Makefile.tcc	Sun Jul 16 05:19:07 1989
X--- new/Makefile.tcc	Sun Jul 16 04:59:02 1989
X***************
X*** 0 ****
X--- 1,57 ----
X+ #       your favorite compiler
X+ CC      =       tcc
X+ 
X+ #       user id of wizard       (wizard password is defined in config.c)
X+ WIZID   =       0
X+ 
X+ #       name of program
X+ GAME    =       Ularn.exe
X+ 
X+ #       program options
X+ OPTIONS =       -DWIZID=$(WIZID)
X+ 
X+ #       compile flags
X+ CFLAGS = -v -mh $(OPTIONS)
X+ 
X+ #       link flags
X+ LDFLAGS = /v
X+ 
X+ #       the object files
X+ OBJ     = 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+ 
X+ #       the source files
X+ SRC     = bill.c config.c create.c data.c diag.c display.c fortune.c\
X+         global.c help.c io.c main.c monster.c moreobj.c movem.c object.c\
X+         regen.c savelev.c scores.c signal.c store.c tok.c nap.c
X+ 
X+ #       the header file
X+ HDR     = header.h
X+ 
X+ UTIL = to_ansi.exe
X+ UTIL_OBJ = to_ansi.obj
X+ UTIL_SRC = to_ansi.c
X+ 
X+ ##########################################################################
X+ 
X+ love:   $(GAME) Uhelp
X+ 
X+ $(GAME): $(OBJ)
X+         tlink $(LDFLAGS) @ularn.lnk
X+ 
X+ .c.obj:
X+         $(CC) -c $(CFLAGS) $.
X+ 
X+ $(OBJ): header.h
X+ 
X+ $(UTIL): $(UTIL_SRC)
X+         tcc $(UTIL_SRC)
X+ 
X+ #$(UTIL): $(UTIL_OBJ)
X+ #       $(CC) $(UTIL_OBJ)
X+ 
X+ Uhelp: $(UTIL) Uhelp.no_control
X+         makehelp
X+ 
Xdiff -c orig/Uhelp.no_control new/Uhelp.no_control
X*** orig/Uhelp.no_control	Sun Jul 16 01:06:32 1989
X--- new/Uhelp.no_control	Sun Jul 16 05:03:58 1989
X***************
X*** 1,4 ****
X! 5    Welcome to the game of Ularn.  At this moment, you face a great problem.
X  Your daughter has contracted a strange disease, and none of your home remedies
X  seem to have any effect.  You sense that she is in mortal danger, and you must
X  try to save her.  Time ago you heard of a land of great danger and opportunity.
X--- 1,4 ----
X! 6    Welcome to the game of Ularn.  At this moment, you face a great problem.
X  Your daughter has contracted a strange disease, and none of your home remedies
X  seem to have any effect.  You sense that she is in mortal danger, and you must
X  try to save her.  Time ago you heard of a land of great danger and opportunity.
X***************
X*** 107,118 ****
X  				  letter of name is monster's character.
X      savefile: save-file-name      full pathname of savefile
X      character: character	  choose your character
X  
X  Your name and monster names must be enclosed in double quotation marks and may
X  be up to 34 characters long.  Longer names are truncated.  Anything enclosed in
X  quotation marks is considered one word, and must be separated from other words
X  by whitespace.
X- 
X  	       ^[[7mExplanation of the Ularn scoreboard facility^[[m
X  
X      Ularn supports TWO scoreboards, one for winners, and one for deceased
X--- 107,118 ----
X  				  letter of name is monster's character.
X      savefile: save-file-name      full pathname of savefile
X      character: character	  choose your character
X+     graphics: floor-chr wall-chr  char codes to use to draw floor and walls
X  
X  Your name and monster names must be enclosed in double quotation marks and may
X  be up to 34 characters long.  Longer names are truncated.  Anything enclosed in
X  quotation marks is considered one word, and must be separated from other words
X  by whitespace.
X  	       ^[[7mExplanation of the Ularn scoreboard facility^[[m
X  
X      Ularn supports TWO scoreboards, one for winners, and one for deceased
X***************
X*** 129,134 ****
X--- 129,155 ----
X  at the time of his death.
X  
X  
X+ 
X+ 
X+ 
X+ 
X+ 
X+ 
X+ 
X+                      ^[[7mAdditional options for MS-DOS^[[m
X+ 
X+   If you are running Ularn under MSDOS, there are several other options
X+ which can be in your 'ularnopt' file:
X+ 
X+ 	Word                     Meaning
X+     larn-path: directory          the directory where the data files are kept
X+     background: color             the background screen color
X+     foreground: color             the foreground screel color
X+     nansi                         you have NANSI.SYS installed instead of
X+                                   ANSI.SYS.
X+     rawio                         faster screen output (requires NANSI.SYS and
X+                                   an IBM compatible)
X+     keypad                        use the numeric keypad for movement
X  
X  
X  
Xdiff -c orig/bill.c new/bill.c
X*** orig/bill.c	Sun Jul 16 00:59:47 1989
X--- new/bill.c	Sun Jul 16 04:38:37 1989
X***************
X*** 3,8 ****
X--- 3,9 ----
X  #include "header.h"
X  
X  static char mail600[32];
X+ 
X  /*
X   *	function to create the tax bill for the user
X   */
X***************
X*** 9,20 ****
X  static int pid;
X  letter1()
X  {
X  	sprintf(mail600, "/tmp/#%dmail600",pid); /* prepare path */
X! 	if (lcreat(mail600) < 0) { 
X  		write(1,"can't write 600 letter\n",23); 
X  		return(0);
X  	}
X  lprcat("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
X  lprcat("From:"); 
X  lprcat("  the URS (Ularn Revenue Service)\n");
X  lprcat("\nSubject:"); 
X--- 10,25 ----
X  static int pid;
X  letter1()
X  {
X+ #ifdef __MSDOS__
X+         clear();
X+ #else
X  	sprintf(mail600, "/tmp/#%dmail600",pid); /* prepare path */
X! 	if (lcreat(mail600,0) < 0) { 
X  		write(1,"can't write 600 letter\n",23); 
X  		return(0);
X  	}
X  lprcat("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
X+ #endif
X  lprcat("From:"); 
X  lprcat("  the URS (Ularn Revenue Service)\n");
X  lprcat("\nSubject:"); 
X***************
X*** 31,48 ****
X  lprcat("\nof this notice, and is due within 5 days.  Failure to pay will");
X  lprcat("\nmean penalties.  Once again, congratulations, We look forward");
X  lprcat("\nto your future successful expeditions.\n");
X  	lwclose(); 
X  	return(1);
X  }
X  
X  letter2()
X  {
X  	sprintf(mail600,"/tmp/#%dmail600",pid); /* prepare path */
X! 	if (lcreat(mail600) < 0) { 
X  		write(1,"can't write 601 letter\n",23); 
X  		return(0);
X  	}
X  lprcat("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
X  lprcat("From:"); 
X  lprcat("  His Majesty King Wilfred of Ularndom\n");
X  lprcat("\nSubject:"); 
X--- 36,62 ----
X  lprcat("\nof this notice, and is due within 5 days.  Failure to pay will");
X  lprcat("\nmean penalties.  Once again, congratulations, We look forward");
X  lprcat("\nto your future successful expeditions.\n");
X+ 
X+ #ifdef __MSDOS__
X+         retcont();
X+ #else
X  	lwclose(); 
X+ #endif
X  	return(1);
X  }
X  
X  letter2()
X  {
X+ #ifdef __MSDOS__
X+         clear();
X+ #else
X  	sprintf(mail600,"/tmp/#%dmail600",pid); /* prepare path */
X! 	if (lcreat(mail600,0) < 0) { 
X  		write(1,"can't write 601 letter\n",23); 
X  		return(0);
X  	}
X  lprcat("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
X+ #endif
X  lprcat("From:"); 
X  lprcat("  His Majesty King Wilfred of Ularndom\n");
X  lprcat("\nSubject:"); 
X***************
X*** 56,73 ****
X  lprcat("\nhonour of Knightess of the realm.  Upon thy name shall it be written. . .");
X  lprcat("\nBravery and courage be yours.");
X  lprcat("\nMay you live in happiness forevermore . . .\n");
X  lwclose(); 
X  return(1);
X  }
X  
X  letter3()
X  {
X  	sprintf(mail600,"/tmp/#%dmail600",pid); /* prepare path */
X! 	if (lcreat(mail600) < 0) { 
X  		write(1,"can't write 602 letter\n",23); 
X  		return(0);
X  	}
X  	lprcat("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
X  	lprcat("From:"); 
X  	lprcat("  Count Endelford\n");
X  	lprcat("\nSubject:"); 
X--- 70,95 ----
X  lprcat("\nhonour of Knightess of the realm.  Upon thy name shall it be written. . .");
X  lprcat("\nBravery and courage be yours.");
X  lprcat("\nMay you live in happiness forevermore . . .\n");
X+ #ifdef __MSDOS__
X+ retcont();
X+ #else
X  lwclose(); 
X+ #endif
X  return(1);
X  }
X  
X  letter3()
X  {
X+ #ifdef __MSDOS__
X+         clear();
X+ #else
X  	sprintf(mail600,"/tmp/#%dmail600",pid); /* prepare path */
X! 	if (lcreat(mail600,0) < 0) { 
X  		write(1,"can't write 602 letter\n",23); 
X  		return(0);
X  	}
X  	lprcat("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
X+ #endif
X  	lprcat("From:"); 
X  	lprcat("  Count Endelford\n");
X  	lprcat("\nSubject:"); 
X***************
X*** 83,100 ****
X  lprcat("With several attempts I have yet to endure the");
X  lprcat(" caves,\nand you, a nobody, makes the journey!  From this time");
X  lprcat(" onward, bewarned\nupon our meeting you shall pay the price!\n");
X  	lwclose(); 
X  	return(1);
X  }
X  
X  letter4()
X  {
X  	sprintf(mail600,"/tmp/#%dmail600",pid); /* prepare path */
X! 	if (lcreat(mail600) < 0) { 
X  		write(1,"can't write 603 letter\n",23); 
X  		return(0);
X  	}
X  	lprcat("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
X  	lprcat("From:"); 
X  	lprcat("  Mainair, Duke of Ularnty\n");
X  	lprcat("\nSubject:"); 
X--- 105,130 ----
X  lprcat("With several attempts I have yet to endure the");
X  lprcat(" caves,\nand you, a nobody, makes the journey!  From this time");
X  lprcat(" onward, bewarned\nupon our meeting you shall pay the price!\n");
X+ #ifdef __MSDOS__
X+         retcont();
X+ #else
X  	lwclose(); 
X+ #endif
X  	return(1);
X  }
X  
X  letter4()
X  {
X+ #ifdef __MSDOS__
X+         clear();
X+ #else
X  	sprintf(mail600,"/tmp/#%dmail600",pid); /* prepare path */
X! 	if (lcreat(mail600,0) < 0) { 
X  		write(1,"can't write 603 letter\n",23); 
X  		return(0);
X  	}
X  	lprcat("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
X+ #endif
X  	lprcat("From:"); 
X  	lprcat("  Mainair, Duke of Ularnty\n");
X  	lprcat("\nSubject:"); 
X***************
X*** 105,122 ****
X  lprcat("\nyearn to behold his anger and jealously.  Should ye choose to");
X  lprcat("\nunleash some of thy wealth upon those who be unfortunate, I,");
X  	lprcat("\nDuke Mainair, Shall equal thy gift also.\n");
X  	lwclose(); 
X  	return(1);
X  }
X  
X  letter5()
X  {
X  	sprintf(mail600,"/tmp/#%dmail600",pid); /* prepare path */
X! 	if (lcreat(mail600) < 0) { 
X  		write(1,"can't write 604 letter\n",23); 
X  		return(0);
X  	}
X  	lprcat("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
X  	lprcat("From:"); 
X  	lprcat("  St. Mary's Children's Home\n");
X  	lprcat("\nSubject:"); 
X--- 135,160 ----
X  lprcat("\nyearn to behold his anger and jealously.  Should ye choose to");
X  lprcat("\nunleash some of thy wealth upon those who be unfortunate, I,");
X  	lprcat("\nDuke Mainair, Shall equal thy gift also.\n");
X+ #ifdef __MSDOS__
X+         retcont();
X+ #else
X  	lwclose(); 
X  	return(1);
X+ #endif
X  }
X  
X  letter5()
X  {
X+ #ifdef __MSDOS__
X+         clear();
X+ #else
X  	sprintf(mail600,"/tmp/#%dmail600",pid); /* prepare path */
X! 	if (lcreat(mail600,0) < 0) { 
X  		write(1,"can't write 604 letter\n",23); 
X  		return(0);
X  	}
X  	lprcat("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
X+ #endif
X  	lprcat("From:"); 
X  	lprcat("  St. Mary's Children's Home\n");
X  	lprcat("\nSubject:"); 
X***************
X*** 133,150 ****
X  lprcat("\ngood food.  Could you possibly find it in your heart to help us");
X  	lprcat("\nin our plight?  Whatever you could give will help much.");
X  	lprcat("\n(your gift is tax deductible)\n");
X  	lwclose(); 
X  	return(1);
X  }
X  
X  letter6()
X  {
X  	sprintf(mail600,"/tmp/#%dmail600",pid); /* prepare path */
X! 	if (lcreat(mail600) < 0) { 
X  		write(1,"can't write 605 letter\n",23); 
X  		return(0);
X  	}
X  	lprcat("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
X  	lprcat("From:"); 
X  	lprcat("  The National Dianthroritis Society of Ularn\n");
X  	lprcat("\nSubject:"); 
X--- 171,196 ----
X  lprcat("\ngood food.  Could you possibly find it in your heart to help us");
X  	lprcat("\nin our plight?  Whatever you could give will help much.");
X  	lprcat("\n(your gift is tax deductible)\n");
X+ #ifdef __MSDOS__
X+         retcont();
X+ #else
X  	lwclose(); 
X+ #endif
X  	return(1);
X  }
X  
X  letter6()
X  {
X+ #ifdef __MSDOS__
X+         clear();
X+ #else
X  	sprintf(mail600,"/tmp/#%dmail600",pid); /* prepare path */
X! 	if (lcreat(mail600,0) < 0) { 
X  		write(1,"can't write 605 letter\n",23); 
X  		return(0);
X  	}
X  	lprcat("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
X+ #endif
X  	lprcat("From:"); 
X  	lprcat("  The National Dianthroritis Society of Ularn\n");
X  	lprcat("\nSubject:"); 
X***************
X*** 159,165 ****
X--- 205,215 ----
X  lprcat("\ndreaded disease, and you can help today.  Could you please see it");
X  lprcat("\nin your heart to give generously?  Your continued good health");
X  	lprcat("\ncan be your everlasting reward.\n");
X+ #ifdef __MSDOS__
X+         retcont();
X+ #else
X  	lwclose(); 
X+ #endif
X  	return(1);
X  }
X  
X***************
X*** 175,191 ****
X--- 225,247 ----
X  	register int i;
X  	char buf[128];
X  
X+ #ifndef __MSDOS__
X  	wait(0);  
X  	pid=getpid();
X  	if (fork() == 0) {
X+ #endif
X  		resetscroll();
X  		for (i=0; i<sizeof(pfn)/sizeof(int (*)()); i++)
X  			if ((*pfn[i])()) {
X+ #ifndef __MSDOS__
X  				sleep(20);  
X  				sprintf(buf,"mail %s < %s",loginname,mail600);
X  				system(buf);  
X  				unlink(mail600);
X+ #endif
X  			}
X+ #ifndef __MSDOS__
X  		exit(0);
X  	}
X+ #endif
X  }
Xdiff -c orig/config.c new/config.c
X*** orig/config.c	Sun Jul 16 01:06:34 1989
X--- new/config.c	Sun Jul 16 04:49:20 1989
X***************
X*** 7,32 ****
X   */
X  #include "header.h"
X  
X  /* the game save filename   */
X  char savefilename[SAVEFILENAMESIZE] = 	HOME;
X  
X  /* the score file	    	*/
X! char scorefile[sizeof(HOME)+sizeof(SCORENAME)] =	HOME;
X  
X  /* the logging file    	*/
X! char logfile[sizeof(HOME)+sizeof(LOGFNAME)]  =	HOME;
X  
X  /* the help text file	*/
X! char helpfile[sizeof(HOME)+sizeof(HELPNAME)] =	HOME;
X  
X  /* the maze data file	*/
X! char larnlevels[sizeof(HOME)+sizeof(LEVELSNAME)] = 	HOME;
X  
X  /* the fortune data file */
X! char fortfile[sizeof(HOME)+sizeof(FORTSNAME)] =	HOME;
X  
X  /* the .Ularnopts filename */
X! char optsfile[128] ="/.Ularnopts";	/* the option file */
X  
X  char diagfile[] ="Diagfile";		/* the diagnostic filename	*/
X  char ckpfile[] ="Ularn.ckp";		/* the checkpoint filename	*/
X--- 7,43 ----
X   */
X  #include "header.h"
X  
X+ #ifdef __MSDOS__
X+ 
X+ # define HOMESIZE SAVEFILENAMESIZE
X+ # define HOME ""
X+ 
X+ #else
X+ 
X+ # define HOMESIZE sizeof(HOME)
X+ 
X+ #endif
X+ 
X  /* the game save filename   */
X  char savefilename[SAVEFILENAMESIZE] = 	HOME;
X  
X  /* the score file	    	*/
X! char scorefile[HOMESIZE+sizeof(SCORENAME)] =	HOME;
X  
X  /* the logging file    	*/
X! char logfile[HOMESIZE+sizeof(LOGFNAME)]  =	HOME;
X  
X  /* the help text file	*/
X! char helpfile[HOMESIZE+sizeof(HELPNAME)] =	HOME;
X  
X  /* the maze data file	*/
X! char larnlevels[HOMESIZE+sizeof(LEVELSNAME)] = 	HOME;
X  
X  /* the fortune data file */
X! char fortfile[HOMESIZE+sizeof(FORTSNAME)] =	HOME;
X  
X  /* the .Ularnopts filename */
X! char optsfile[SAVEFILENAMESIZE] ="/.Ularnopts";	/* the option file */
X  
X  char diagfile[] ="Diagfile";		/* the diagnostic filename	*/
X  char ckpfile[] ="Ularn.ckp";		/* the checkpoint filename	*/
Xdiff -c orig/create.c new/create.c
X*** orig/create.c	Sun Jul 16 01:02:19 1989
X--- new/create.c	Sun Jul 16 04:44:41 1989
X***************
X*** 136,142 ****
X  			for (i=mxl; i<mxh; i++)		
X  				for (j=myl; j<myh; j++) {  	
X  					item[i][j]=0;
X! 					if ((mitem[i][j]=z)) 
X  						hitp[i][j]=monster[z].hitpoints;
X  				}
X  		}
X--- 136,142 ----
X  			for (i=mxl; i<mxh; i++)		
X  				for (j=myl; j<myh; j++) {  	
X  					item[i][j]=0;
X! 					if ((mitem[i][j]=z)!=0) 
X  						hitp[i][j]=monster[z].hitpoints;
X  				}
X  		}
X***************
X*** 219,225 ****
X  	register int i,j;
X  	int it,arg,mit,marg;
X  
X! 	if (lopen(larnlevels)<0) {
X  		write(1,"Can't open the maze data file\n",30);	 
X  		died(-282); 
X  		return(0);
X--- 219,225 ----
X  	register int i,j;
X  	int it,arg,mit,marg;
X  
X! 	if (lopen(larnlevels, 0)<0) {
X  		write(1,"Can't open the maze data file\n",30);	 
X  		died(-282); 
X  		return(0);
X***************
X*** 630,636 ****
X  		if ((item[x][y]==0) && (mitem[x][y]==0) && 
X                      ((playerx!=x) || (playery!=y))) {
X  			mitem[x][y] = what;  
X! 			know[x][y]=0;
X  			hitp[x][y] = monster[what].hitpoints;  
X  			return(0);
X  		}
X--- 630,636 ----
X  		if ((item[x][y]==0) && (mitem[x][y]==0) && 
X                      ((playerx!=x) || (playery!=y))) {
X  			mitem[x][y] = what;  
X! 			if (know[x][y]) know[x][y] = 2;
X  			hitp[x][y] = monster[what].hitpoints;  
X  			return(0);
X  		}
Xdiff -c orig/data.c new/data.c
X*** orig/data.c	Sun Jul 16 01:00:56 1989
X--- new/data.c	Sun Jul 16 04:40:23 1989
X***************
X*** 74,87 ****
X  
X  char *lpbuf,*lpnt,
X       *inbuffer,*lpend;  /* input/output pointers to the buffers */
X- struct cel *cell;	/*	pointer to the dungeon storage	*/
X  short hitp[MAXX][MAXY];	/*	monster hp on level		*/
X  short iarg[MAXX][MAXY];	/*	arg for the item array	*/
X  char item[MAXX][MAXY];	/*	objects in maze if any	*/
X! char know[MAXX][MAXY];	/*	1 or 0 if here before	*/
X  char mitem[MAXX][MAXY];	/*	monster item array 	*/
X  char moved[MAXX][MAXY];	/*	monster movement flags  */
X! char stealth[MAXX][MAXY];/*  0=sleeping 1=awake monst   */
X  char iven[26];		/*	inventory for player	*/
X  short ivenarg[26];	/*	inventory args for player	*/
X  char lastmonst[40];	/*this has the name of the current monster*/
X--- 74,87 ----
X  
X  char *lpbuf,*lpnt,
X       *inbuffer,*lpend;  /* input/output pointers to the buffers */
X  short hitp[MAXX][MAXY];	/*	monster hp on level		*/
X  short iarg[MAXX][MAXY];	/*	arg for the item array	*/
X  char item[MAXX][MAXY];	/*	objects in maze if any	*/
X! char know[MAXX][MAXY];	/*	1 or 0 if here before; 2 if we know there's */
X! 			/*	 floor here, but not what's on top */
X  char mitem[MAXX][MAXY];	/*	monster item array 	*/
X  char moved[MAXX][MAXY];	/*	monster movement flags  */
X! char stealth[MAXX][MAXY];    /*  0=sleeping 1=awake monst   */
X  char iven[26];		/*	inventory for player	*/
X  short ivenarg[26];	/*	inventory args for player	*/
X  char lastmonst[40];	/*this has the name of the current monster*/
X***************
X*** 796,798 ****
X--- 796,799 ----
X  char nplt[] = { 0, 0, 0, 0, 1, 1, 2, 2, 3, 4 };
X  char ndgg[] = { 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 4, 5 };
X  char nsw[] = { 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 3 };
X+ 
Xdiff -c orig/diag.c new/diag.c
X*** orig/diag.c	Sun Jul 16 01:02:52 1989
X--- new/diag.c	Sun Jul 16 04:54:19 1989
X***************
X*** 2,8 ****
X  #include "header.h"
X  
X  extern long int initialtime;
X! extern int rmst,maxitm,lasttime;
X  extern char nosignal;
X  
X  char *cdef[] = {
X--- 2,8 ----
X  #include "header.h"
X  
X  extern long int initialtime;
X! extern int maxitm;
X  extern char nosignal;
X  
X  char *cdef[] = {
X***************
X*** 75,81 ****
X  
X  	fprintf(dfile, "Hit points: %2ld(%2ld)\n", c[HP], c[HPMAX]);
X  
X! 	fprintf(dfile, "gold: %ld  Experience: %ld  Character level: %d  Level in caverns: %ld\n",
X  	(long) c[GOLD],
X  	(long) c[EXPERIENCE],
X  	(long) c[LEVEL],
X--- 75,81 ----
X  
X  	fprintf(dfile, "Hit points: %2ld(%2ld)\n", c[HP], c[HPMAX]);
X  
X! 	fprintf(dfile, "gold: %ld  Experience: %ld  Character level: %ld  Level in caverns: %d\n",
X  	(long) c[GOLD],
X  	(long) c[EXPERIENCE],
X  	(long) c[LEVEL],
X***************
X*** 193,448 ****
X  	/* east west walls of this line	*/
X  	for (i = 0; i < MAXY; i++) {			
X  		for (j = 0; j < MAXX; j++)
X! 			if (k = mitem[j][i])
X  				fprintf(dfile, "%c", monstnamelist[k]);
X  			else
X  				fprintf(dfile, "%c", objnamelist[item[j][i]]);
X  		fprintf(dfile, "\n");
X  	}
X- }
X- /*
X- 	to save the game in a file
X-  */
X- static long int zzz=0;
X- savegame(fname)
X- char *fname;
X- {
X- 	register int i,k;
X- 	register struct sphere *sp;
X- 	struct stat statbuf;
X- 
X- 	nosignal=1;  
X- 	lflush();	
X- 	savelevel();
X- 	ointerest();
X- 	if (lcreat(fname) < 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- 			lwrite((char*)&cell[k*MAXX*MAXY],sizeof(struct cel)*MAXY*MAXX);
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- 
X- 	cursors(); 
X- 	lprcat("\nRestoring . . .");  
X- 	lflush();
X- 	if (lopen(fname) <= 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- 			lrfill((char*)&cell[k*MAXX*MAXY],sizeof(struct cel)*MAXY*MAXX);
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- 	if (filetimes.st_ctime > zzz) 
X- 		fsorry();	/*file create time	*/
X- 	else if (filetimes.st_mtime > zzz) 
X- 		fsorry(); /*	file modify time*/
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- 	if (i && (filetimes.st_ino!=i)) 
X- 		fsorry();	/* different inode number, file was copied */
X- 
X- 	lrclose();
X- 
X- 	if (strcmp(fname,ckpfile) == 0) {
X- 		if (lappend(fname) < 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--- 193,202 ----
X  	/* east west walls of this line	*/
X  	for (i = 0; i < MAXY; i++) {			
X  		for (j = 0; j < MAXX; j++)
X! 			if ((k = mitem[j][i])!=0)
X  				fprintf(dfile, "%c", monstnamelist[k]);
X  			else
X  				fprintf(dfile, "%c", objnamelist[item[j][i]]);
X  		fprintf(dfile, "\n");
X  	}
X  }
Xdiff -c orig/display.c new/display.c
X*** orig/display.c	Sun Jul 16 01:02:58 1989
X--- new/display.c	Sun Jul 16 04:46:58 1989
X***************
X*** 1,7 ****
X  /*	display.c */
X  #include "header.h"
X  
X! #define makecode(_a,_b,_c) (((_a)<<16) + ((_b)<<8) + (_c))
X  
X  static int minx,maxx,miny,maxy,k,m;
X  static char bot1f=0,bot2f=0,bot3f=0;
X--- 1,7 ----
X  /*	display.c */
X  #include "header.h"
X  
X! #define makecode(_a,_b,_c) (((long)(_a)<<16) + ((_b)<<8) + (_c))
X  
X  static int minx,maxx,miny,maxy,k,m;
X  static char bot1f=0,bot2f=0,bot3f=0;
X***************
X*** 200,206 ****
X  }
X  
X  botsub(idx,str)
X! register int idx;
X  char *str;
X  {
X  	register int x,y;
X--- 200,206 ----
X  }
X  
X  botsub(idx,str)
X! register long idx;
X  char *str;
X  {
X  	register int x,y;
X***************
X*** 274,281 ****
X  	for (i=d_ymin; i<d_ymax; i++)
X  		for (j=d_xmin; j<d_xmax; j++)
X  			if (know[j][i]==0)  screen[j][i] = ' ';  
X  			else
X! 				if (k=mitem[j][i])  {
X  				  if (k==MIMIC)
X  					screen[j][i] = 
X  						monstnamelist[rund(MAXMONST)];
X--- 274,283 ----
X  	for (i=d_ymin; i<d_ymax; i++)
X  		for (j=d_xmin; j<d_xmax; j++)
X  			if (know[j][i]==0)  screen[j][i] = ' ';  
X+ 			else if (know[j][i]==2)
X+ 				screen[j][i] = objnamelist[0];
X  			else
X! 				if ((k=mitem[j][i])!=0)  {
X  				  if (k==MIMIC)
X  					screen[j][i] = 
X  						monstnamelist[rund(MAXMONST)];
X***************
X*** 284,291 ****
X  				}
X  			else
X  				if ((k=item[j][i])==OWALL) 
X! 					screen[j][i] = '#';
X! 					else screen[j][i] = ' ';
X  
X  	for (i=d_ymin; i<d_ymax; i++) {
X  		j=d_xmin;  
X--- 286,294 ----
X  				}
X  			else
X  				if ((k=item[j][i])==OWALL) 
X! 					screen[j][i] = objnamelist[OWALL];
X! 				else
X! 					screen[j][i] = objnamelist[0];
X  
X  	for (i=d_ymin; i<d_ymax; i++) {
X  		j=d_xmin;  
X***************
X*** 316,325 ****
X  
X  	for (lastx=lasty=127, i=d_ymin; i<d_ymax; i++)
X  	  for (j=d_xmin; j<d_xmax; j++) {
X! 		if (k=item[j][i])
X  			if (k != OWALL)
X  				if ((know[j][i]) && (mitem[j][i]==0))
X! 					if (objnamelist[k]!=' ') {
X  						if (lasty!=i+1 || lastx!=j)
X  						   cursor(lastx=j+1,lasty=i+1);
X  						else lastx++;
X--- 319,328 ----
X  
X  	for (lastx=lasty=127, i=d_ymin; i<d_ymax; i++)
X  	  for (j=d_xmin; j<d_xmax; j++) {
X! 		if ((k=item[j][i])!=0)
X  			if (k != OWALL)
X  				if ((know[j][i]) && (mitem[j][i]==0))
X! 					if (objnamelist[k]!=objnamelist[0]) {
X  						if (lasty!=i+1 || lastx!=j)
X  						   cursor(lastx=j+1,lasty=i+1);
X  						else lastx++;
X***************
X*** 370,379 ****
X  
X  	for (j=miny; j<=maxy; j++)
X  		for (m=minx; m<=maxx; m++)
X! 			if (know[m][j]==0) {
X  				cursor(m+1,j+1);
X  				x=maxx;  
X! 				while (know[x][j]) --x;
X  				for (i=m; i<=x; i++) {
X  				  if ((k=mitem[i][j]) != 0) {
X  				    if (k==MIMIC)
X--- 373,382 ----
X  
X  	for (j=miny; j<=maxy; j++)
X  		for (m=minx; m<=maxx; m++)
X! 			if ((know[m][j] & 1)==0) {
X  				cursor(m+1,j+1);
X  				x=maxx;  
X! 				while (know[x][j] & 1) --x;
X  				for (i=m; i<=x; i++) {
X  				  if ((k=mitem[i][j]) != 0) {
X  				    if (k==MIMIC)
Xdiff -c orig/fortune.c new/fortune.c
X*** orig/fortune.c	Sun Jul 16 01:03:01 1989
X--- new/fortune.c	Sun Jul 16 04:58:04 1989
X***************
X*** 31,37 ****
X  		}
X  
X  		/* read in the entire fortune file */
X! 		if (read(fd,base,stat.st_size) != stat.st_size) {
X  			close(fd); 
X  			fd= -1; 
X  			free((char*)base); 
X--- 31,37 ----
X  		}
X  
X  		/* read in the entire fortune file */
X! 		if ((stat.st_size = read(fd,base,stat.st_size)) == -1) {
X  			close(fd); 
X  			fd= -1; 
X  			free((char*)base); 
Xdiff -c orig/global.c new/global.c
X*** orig/global.c	Sun Jul 16 01:02:28 1989
X--- new/global.c	Sun Jul 16 04:46:04 1989
X***************
X*** 300,309 ****
X  
X  	if (lev < 5) 
X  		while (tmp==WATERLORD) 
X! 			tmp=rnd((x=monstlevel[lev-1])?x:1);
X  
X  	else while (tmp==WATERLORD)
X! 		tmp=rnd((x=monstlevel[lev-1]-monstlevel[lev-4])?x:1)+monstlevel[lev-4];
X  
X  	while (monster[tmp].genocided && tmp<MAXMONST) tmp++; /* genocided? */
X  
X--- 300,310 ----
X  
X  	if (lev < 5) 
X  		while (tmp==WATERLORD) 
X! 			tmp=rnd(((x=monstlevel[lev-1])!=0)?x:1);
X  
X  	else while (tmp==WATERLORD)
X! 		tmp=rnd(((x=monstlevel[lev-1]-monstlevel[lev-4])!=0)?x:1)
X! 			+monstlevel[lev-4];
X  
X  	while (monster[tmp].genocided && tmp<MAXMONST) tmp++; /* genocided? */
X  
X***************
X*** 858,875 ****
X  	case OLANCE:			
X  		c[LANCEDEATH]=0;	
X  		return;
X! 	case OLARNEYE:
X! 		monstnamelist[DEMONLORD] = ' ';
X! 		monstnamelist[DEMONLORD+1] = ' ';
X! 		monstnamelist[DEMONLORD+2] = ' ';
X! 		monstnamelist[DEMONLORD+3] = ' ';
X! 		monstnamelist[DEMONLORD+4] = ' ';
X! 		monstnamelist[DEMONLORD+5] = ' ';
X! 		monstnamelist[DEMONLORD+6] = ' ';
X! 		monstnamelist[DEMONPRINCE] = ' ';
X! 		monstnamelist[LUCIFER] = ' ';
X  		cursors();
X  		return;
X  	case OPOTION:	
X  	case OSCROLL:	
X  		return;
X--- 859,878 ----
X  	case OLANCE:			
X  		c[LANCEDEATH]=0;	
X  		return;
X! 	case 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  		cursors();
X  		return;
X+         }
X  	case OPOTION:	
X  	case OSCROLL:	
X  		return;
Xdiff -c orig/header.h new/header.h
X*** orig/header.h	Sun Jul 16 01:06:56 1989
X--- new/header.h	Sun Jul 16 06:14:28 1989
X***************
X*** 2,20 ****
X  #include <sys/types.h>
X  #include <sys/stat.h>
X  
X! #ifdef BSD
X  #    include <sys/timeb.h>
X  #    include <sys/time.h>
X  #    include <sgtty.h>
X! #else
X  #    include <sys/times.h>
X  #    include <termio.h>
X! #endif
X  
X  #include <fcntl.h>
X  #include <ctype.h>
X! #include <varargs.h>
X! #include <pwd.h>
X  #include <signal.h>
X  #include <stdio.h>
X  
X--- 2,26 ----
X  #include <sys/types.h>
X  #include <sys/stat.h>
X  
X! #ifndef __MSDOS__
X! # include <pwd.h>
X! # ifdef BSD
X  #    include <sys/timeb.h>
X  #    include <sys/time.h>
X  #    include <sgtty.h>
X! # else
X  #    include <sys/times.h>
X  #    include <termio.h>
X! # endif
X! #endif /* __MSDOS__ */
X  
X  #include <fcntl.h>
X  #include <ctype.h>
X! #ifdef __TURBOC__
X! # include <stdarg.h>
X! #else
X! # include <varargs.h>
X! #endif
X  #include <signal.h>
X  #include <stdio.h>
X  
X***************
X*** 69,84 ****
X  	char	qty;
X  };
X  
X- /*	this is the structure that holds the entire dungeon specifications	*/
X- struct cel
X- {
X- 	short	hitp;	/*	monster's hit points	*/
X- 	char	mitem;	/*	the monster ID		*/
X- 	char	item;	/*	the object's ID		*/
X- 	short	iarg;	/*	the object's argument	*/
X- 	char	know;	/*	have we been here before*/
X- };
X- 
X  /* this is the structure for maintaining & moving the spheres of annihilation */
X  struct sphere
X  {
X--- 75,80 ----
X***************
X*** 397,403 ****
X  extern int dayplay,enable_scroll,srcount,stayflag,yrepcount,userid,lfd,fd;
X  extern long initialtime,outstanding_taxes,skill[],gtime,c[],cbak[];
X  extern unsigned long randx;
X- extern struct cel *cell;
X  extern struct monst monster[];
X  extern struct sphere *spheres;
X  extern struct _itm itm[];
X--- 393,398 ----
X***************
X*** 454,461 ****
X  	/* macro to seed the random number generator */
X  #define srand(x) (randx=x)
X  	/* macros to generate random numbers   1<=rnd(N)<=N   0<=rund(N)<=N-1 */
X! #define rnd(x)  ((((randx=randx*1103515245+12345)>>7)%(x))+1)
X! #define rund(x) ((((randx=randx*1103515245+12345)>>7)%(x)))
X  	/* macros for miscellaneous data conversion */
X  #define min(x,y) (((x)>(y))?(y):(x))
X  #define max(x,y) (((x)>(y))?(x):(y))
X--- 449,458 ----
X  	/* macro to seed the random number generator */
X  #define srand(x) (randx=x)
X  	/* macros to generate random numbers   1<=rnd(N)<=N   0<=rund(N)<=N-1 */
X! #define rnd(x)  ((int)((((randx=randx*1103515245+12345)>>7)%(x))+1))
X! #define rund(x) ((int)((((randx=randx*1103515245+12345)>>7)%(x))))
X! #define rndl(x)  ((((randx=randx*1103515245+12345)>>7)%(x))+1)
X! #define rundl(x) ((((randx=randx*1103515245+12345)>>7)%(x)))
X  	/* macros for miscellaneous data conversion */
X  #define min(x,y) (((x)>(y))?(y):(x))
X  #define max(x,y) (((x)>(y))?(x):(y))
Xdiff -c orig/help.c new/help.c
X*** orig/help.c	Sun Jul 16 01:01:55 1989
X--- new/help.c	Sun Jul 16 04:54:28 1989
X***************
X*** 86,92 ****
X   */
X  openhelp()
X  {
X! 	if (lopen(helpfile)<0) {
X  		lprintf("Can't open help file \"%s\" ",helpfile);
X  		lflush(); 
X  		sleep(4);	
X--- 86,92 ----
X   */
X  openhelp()
X  {
X! 	if (lopen(helpfile, 0)<0) {
X  		lprintf("Can't open help file \"%s\" ",helpfile);
X  		lflush(); 
X  		sleep(4);	
Xdiff -c orig/io.c new/io.c
X*** orig/io.c	Sun Jul 16 01:01:07 1989
X--- new/io.c	Sun Jul 16 04:37:38 1989
X***************
X*** 30,38 ****
X   *
X   *	FILE OPEN / CLOSE ROUTINES
X   *
X!  *	lcreat(filename)		create a new file for write
X!  *	lopen(filename)			open a file for read
X!  *	lappend(filename)		open for append to an existing file
X   *	lrclose()			close the input file
X   *	lwclose()			close output file
X   *	lflush()			flush the output buffer
X--- 30,38 ----
X   *
X   *	FILE OPEN / CLOSE ROUTINES
X   *
X!  *	lcreat(filename, mode)		create a new file for write
X!  *	lopen(filename, mode)		open a file for read
X!  *	lappend(filename, mode)		open for append to an existing file
X   *	lrclose()			close the input file
X   *	lwclose()			close output file
X   *	lflush()			flush the output buffer
X***************
X*** 55,71 ****
X   * Note: ** entries are available only in termcap mode.
X   */
X  #include "header.h"
X  
X! #ifdef BSD
X  #    define	GTTY(arg)	(ioctl(0, TIOCGETP, arg))
X  #    define	STTY(arg)	(ioctl(0, TIOCSETP, arg))
X  	static struct sgttyb inittyb, curttyb;
X! #else /* SYSV */
X  #    define GTTY(arg)		(ioctl(0, TCGETA, arg))
X  #    define STTY(arg)		(ioctl(0, TCSETAW, arg))
X  #    define SPEED(x)	((x).c_cflag & CBAUD)
X  	static struct termio inittyb, curttyb;
X! #endif /* BSD */
X  
X  #define	ON	1
X  #define OFF	0
X--- 55,84 ----
X   * Note: ** entries are available only in termcap mode.
X   */
X  #include "header.h"
X+ #ifdef __MSDOS__
X+ # include <dos.h>
X  
X! static short inittyb, curttyb;
X! # define GTTY(arg) (-((*(arg)=(ioctl(0, 0, arg)&0xff)) == ((-1)&0xff)))
X! # define STTY(arg) (-(ioctl(0, 1, (int *)(*(arg)))==-1))
X! 
X! int keypad=0, rawio=0, nansi=0;
X! int fg_color = 7, bg_color = 0;
X! static int echo = 1;
X! 
X! #else /* __MSDOS__ */
X! 
X! #  ifdef BSD
X  #    define	GTTY(arg)	(ioctl(0, TIOCGETP, arg))
X  #    define	STTY(arg)	(ioctl(0, TIOCSETP, arg))
X  	static struct sgttyb inittyb, curttyb;
X! #  else /* SYSV */
X  #    define GTTY(arg)		(ioctl(0, TCGETA, arg))
X  #    define STTY(arg)		(ioctl(0, TCSETAW, arg))
X  #    define SPEED(x)	((x).c_cflag & CBAUD)
X  	static struct termio inittyb, curttyb;
X! #  endif /* BSD */
X! #endif /* __MSDOS__ */
X  
X  #define	ON	1
X  #define OFF	0
X***************
X*** 117,122 ****
X--- 130,136 ----
X  	}
X  	curttyb = inittyb;
X  #ifndef BSD
X+ # ifndef __MSDOS__
X  	ospeed = SPEED(inittyb);
X  	/* do not expand tabs - they might be needed inside a cm sequence */
X  	if(curttyb.c_oflag & TAB3) {
X***************
X*** 123,128 ****
X--- 137,143 ----
X  		curttyb.c_oflag &= ~TAB3;
X  		setctty();
X  	}
X+ # endif /* __MSDOS__ */
X  #endif /* BSD */
X  	setuptty();
X  }
X***************
X*** 158,167 ****
X  **	function to setup all required terminal modes for game
X  */
X  setuptty(){
X- 	int change = 0;
X  #ifdef BSD
X  	scbr();
X! #else /* SYSV */
X  	if((curttyb.c_lflag & ECHO) != OFF){
X  		curttyb.c_lflag &= ~ECHO;
X  		change++;
X--- 173,183 ----
X  **	function to setup all required terminal modes for game
X  */
X  setuptty(){
X  #ifdef BSD
X  	scbr();
X! #else
X! # ifdef SYSV
X! 	int change = 0;
X  	if((curttyb.c_lflag & ECHO) != OFF){
X  		curttyb.c_lflag &= ~ECHO;
X  		change++;
X***************
X*** 176,181 ****
X--- 192,204 ----
X  	}
X  	if(change)
X  		setctty();
X+ # else /* __MSDOS__ */
X+ 	scbr();
X+ 	if (rawio) {
X+ 	curttyb |= 0x20;
X+ 		setctty();
X+ 	}
X+ # endif
X  #endif /* BSD */
X  }
X  
X***************
X*** 186,199 ****
X   */
X  scbr()
X  {
X! #ifdef BSD
X  	curttyb.sg_flags |= CBREAK;
X  	curttyb.sg_flags &= ~ECHO;
X! #else /* SYSV */
X  	curttyb.c_lflag &= ~ECHO;
X  	curttyb.c_lflag &= ~ICANON;
X! #endif /* BSD */
X  	setctty();
X  }
X  
X  /*
X--- 209,226 ----
X   */
X  scbr()
X  {
X! #ifdef __MSDOS__
X! 	echo = 0;
X! #else
X! # ifdef BSD
X  	curttyb.sg_flags |= CBREAK;
X  	curttyb.sg_flags &= ~ECHO;
X! # else /* SYSV */
X  	curttyb.c_lflag &= ~ECHO;
X  	curttyb.c_lflag &= ~ICANON;
X! # endif /* BSD */
X  	setctty();
X+ #endif /* __MSDOS__ */
X  }
X  
X  /*
X***************
X*** 203,216 ****
X   */
X  sncbr()
X  {
X! #ifdef BSD
X   	curttyb.sg_flags &= ~CBREAK;
X  	curttyb.sg_flags |= ECHO;
X! #else /* SYSV */
X  	curttyb.c_lflag |= ECHO;
X  	curttyb.c_lflag |= ICANON;
X! #endif /* BSD */
X  	setctty();
X  }
X  
X  /*
X--- 230,247 ----
X   */
X  sncbr()
X  {
X! #ifdef __MSDOS__
X! 	echo = 1;
X! #else
X! # ifdef BSD
X   	curttyb.sg_flags &= ~CBREAK;
X  	curttyb.sg_flags |= ECHO;
X! # else /* SYSV */
X  	curttyb.c_lflag |= ECHO;
X  	curttyb.c_lflag |= ICANON;
X! # endif /* BSD */
X  	setctty();
X+ #endif /* not __MSDOS__ */
X  }
X  
X  /*
X***************
X*** 220,227 ****
X--- 251,291 ----
X  {
X  	char byt;
X  
X+ #ifdef __MSDOS__
X+ static int kpd_trans[] = {
X+ 	'y', 'k', 'u', -1,
X+ 	'h', '.', 'l', -1,
X+ 	'b', 'j', 'n',
X+ 	'i', '.',
X+ };
X+ static int kpd_shift_trans[] = {
X+ 	'i', 'B', 'J', 'N', 'H', '.', 'L', 'Y', 'K', 'U',
X+ };
X+ 
X  	lflush();		/* be sure output buffer is flushed */
X+ try_again:
X+ 	byt = echo ? getche() : getch();
X+ 	if (byt == '\r') byt = '\n';
X+ 	if (echo) return byt;
X+ 	if (keypad && byt == '\0') { /* translate extended scan codes */
X+ 		byt = getch();
X+ 		if (byt < 71 || byt >= 71 + sizeof(kpd_trans)/sizeof(kpd_trans[0]))
X+ 			goto try_again;
X+ 		byt = kpd_trans[byt-71];
X+ 		if (byt == -1) goto try_again;
X+ 	}
X+ 	else if (keypad && isdigit(byt)) {
X+ 		union REGS regs;
X+ 		regs.h.ah = 2;
X+ 		int86(0x16, &regs, &regs);  /* get shift state */
X+ 		if (regs.h.al & 0x03)  /* is either shift key down? */
X+ 			byt = kpd_shift_trans[byt-'0'];
X+ 		}
X+ 
X+ #else
X+ 	lflush();		/* be sure output buffer is flushed */
X  	read(0,&byt,1); 	/* get byte from terminal */
X+ #endif
X  	return(byt);
X  }
X  
X***************
X*** 254,270 ****
X--- 318,347 ----
X   *	Returns nothing of value.
X   */
X  /*VARARGS*/
X+ #ifdef __TURBOC__
X+ lprintf(char *fmt, ...)
X+ #else
X  lprintf(va_alist)
X  va_dcl
X+ #endif
X  {
X  	va_list ap;	/* pointer for variable argument list */
X+ #ifndef __TURBOC__
X  	char *fmt;
X+ #endif
X  	char *outb,*tmpb;
X  	long wide,left,cont,n;		/* data for lprintf	*/
X  	char db[12];			/* %d buffer in lprintf	*/
X  
X+ #ifdef __TURBOC__
X+ 	va_start(ap, fmt); /* initialize the varargs pointer */
X+ #else
X  	va_start(ap);	/* initialize the var args pointer */
X+ #endif
X+ 
X+ #ifndef __TURBOC__        
X  	fmt = va_arg(ap, char *);	/* pointer to format string */
X+ #endif
X  	if (lpnt >= lpend) lflush(); 
X  	outb = lpnt;
X  	for ( ; ; ) {
X***************
X*** 310,316 ****
X  			case 's':	
X  				tmpb = va_arg(ap, char *);
X  				if (wide==0)  { 
X! 					while (*outb++ = *tmpb++);  
X  					--outb; 
X  				} 
X  				else {
X--- 387,393 ----
X  			case 's':	
X  				tmpb = va_arg(ap, char *);
X  				if (wide==0)  { 
X! 					while ((*outb++ = *tmpb++)!=0);  
X  					--outb; 
X  				} 
X  				else {
X***************
X*** 318,324 ****
X  					if (left)  
X  						while (n-- > 0) 
X  							*outb++ = ' ';
X! 					while (*outb++ = *tmpb++)
X  						;  
X  					--outb;
X  					if (left==0)  
X--- 395,401 ----
X  					if (left)  
X  						while (n-- > 0) 
X  							*outb++ = ' ';
X! 					while ((*outb++ = *tmpb++)!=0)
X  						;  
X  					--outb;
X  					if (left==0)  
X***************
X*** 437,444 ****
X  
X  	if (ipoint != iepoint)  
X  		return(inbuffer[ipoint++]);
X- 	if (iepoint!=MAXIBUF)   
X- 		return(0);
X  	if ((i=read(fd,inbuffer,MAXIBUF))<=0) {
X  		if (i!=0)  
X  			fprintf(stderr,"error reading from input file\n");
X--- 514,519 ----
X***************
X*** 567,585 ****
X  }
X  
X  /*
X!  *	lcreat(filename)			Create a new file for write
X   *		char *filename;
X   *
X   *	lcreat((char*)0); means to the terminal
X   *	Returns -1 if error, otherwise the file descriptor opened.
X   */
X! lcreat(str)
X  char *str;
X  {
X  	lpnt = lpbuf;	
X  	lpend = lpbuf+BUFBIG;
X  	if (str==0) return(lfd=1);
X! 	if ((lfd=creat(str,0644)) < 0) {
X  		lfd=1; 
X  		lprintf("error creating file <%s>\n",str); 
X  		lflush(); 
X--- 642,668 ----
X  }
X  
X  /*
X!  *	lcreat(filename, mode)			Create a new file for write
X   *		char *filename;
X+  *		int mode;
X   *
X+  *	mode is 0 for text files and 1 for binary files.
X   *	lcreat((char*)0); means to the terminal
X   *	Returns -1 if error, otherwise the file descriptor opened.
X   */
X! lcreat(str, mode)
X  char *str;
X+ int mode;
X  {
X  	lpnt = lpbuf;	
X  	lpend = lpbuf+BUFBIG;
X  	if (str==0) return(lfd=1);
X! #ifdef __MSDOS__
X! 	mode = (mode ? O_BINARY : O_TEXT) | O_WRONLY | O_CREAT | O_TRUNC;
X! #else
X! 	mode = O_WRONLY | O_CREAT | O_TRUNC;
X! #endif
X! 	if ((lfd=open(str,mode,0644)) < 0) {
X  		lfd=1; 
X  		lprintf("error creating file <%s>\n",str); 
X  		lflush(); 
X***************
X*** 589,606 ****
X  }
X  
X  /*
X!  *	lopen(filename)			Open a file for read
X   *		char *filename;
X   *
X   *	lopen(0) means from the terminal
X   *	Returns -1 if error, otherwise the file descriptor opened.
X   */
X! lopen(str)
X  char *str;
X  {
X  	ipoint = iepoint = MAXIBUF;
X  	if (str==0) return(fd=0);
X! 	if ((fd=open(str,0)) < 0) {
X  		lwclose(); 
X  		lfd=1; 
X  		lpnt=lpbuf; 
X--- 672,697 ----
X  }
X  
X  /*
X!  *	lopen(filename, mode)		Open a file for read
X   *		char *filename;
X+  *		int mode;
X   *
X+  *	mode is 0 for text files and 1 for binary files.
X   *	lopen(0) means from the terminal
X   *	Returns -1 if error, otherwise the file descriptor opened.
X   */
X! lopen(str, mode)
X  char *str;
X+ int mode;
X  {
X  	ipoint = iepoint = MAXIBUF;
X  	if (str==0) return(fd=0);
X! #ifdef __MSDOS__
X! 	mode = (mode ? O_BINARY : O_TEXT) | O_RDONLY;
X! #else
X! 	mode = O_RDONLY;
X! #endif
X! 	if ((fd=open(str,mode)) < 0) {
X  		lwclose(); 
X  		lfd=1; 
X  		lpnt=lpbuf; 
X***************
X*** 610,628 ****
X  }
X  
X  /*
X!  *	lappend(filename)		Open for append to an existing file
X   *		char *filename;
X   *
X   *	lappend(0) means to the terminal
X   *	Returns -1 if error, otherwise the file descriptor opened.
X   */
X! lappend(str)
X  char *str;
X  {
X  	lpnt = lpbuf;	
X  	lpend = lpbuf+BUFBIG;
X  	if (str==0) return(lfd=1);
X! 	if ((lfd=open(str,2)) < 0) {
X  		lfd=1; 
X  		return(-1);
X  	}
X--- 701,727 ----
X  }
X  
X  /*
X!  *	lappend(filename, mode)		Open for append to an existing file
X   *		char *filename;
X+  *		int mode;
X   *
X+  *	mode is 0 for text files and 1 for binary files.
X   *	lappend(0) means to the terminal
X   *	Returns -1 if error, otherwise the file descriptor opened.
X   */
X! lappend(str, mode)
X  char *str;
X+ int mode;
X  {
X  	lpnt = lpbuf;	
X  	lpend = lpbuf+BUFBIG;
X  	if (str==0) return(lfd=1);
X! #ifdef __MSDOS__
X! 	mode = (mode ? O_BINARY : O_TEXT) | O_WRONLY | O_APPEND;
X! #else
X! 	mode = O_WRONLY | O_APPEND;
X! #endif
X! 	if ((lfd=open(str,mode)) < 0) {
X  		lfd=1; 
X  		return(-1);
X  	}
X***************
X*** 664,670 ****
X  	if (lpnt >= lpend) 
X  		lflush(); 
X  	str2 = lpnt;
X! 	while (*str2++ = *str++)
X  		;
X  	lpnt = str2 - 1;
X  }
X--- 763,769 ----
X  	if (lpnt >= lpend) 
X  		lflush(); 
X  	str2 = lpnt;
X! 	while ((*str2++ = *str++)!=0)
X  		;
X  	lpnt = str2 - 1;
X  }
X***************
X*** 708,713 ****
X--- 807,813 ----
X   */
X  init_term()
X  {
X+ #ifndef __MSDOS__
X  	char termbuf[1024];
X  	char *capptr = cap+10;
X  	char *term;
X***************
X*** 760,768 ****
X  		fflush(stderr);
X  		exit(1);
X  	}
X  	/* get memory for decoded output buffer*/
X  	if ((outbuf=malloc(BUFBIG+16))==0) {
X! 	  fprintf(stderr,"Error malloc'ing memory for decoded output buffer\n");
X  		fflush(stderr);
X  		died(-285);	/* malloc() failure */
X  	}
X--- 860,896 ----
X  		fflush(stderr);
X  		exit(1);
X  	}
X+ #else /* __MSDOS__ */
X+ 
X+ 	static char sobuf[20], sebuf[20];
X+ 
X+ 	CM = "\033[%d;%dH";  /* Cursor motion */
X+ 	CE = "\033[K";       /* Clear to eoln */
X+ 	CL = "\033[2J";      /* Clear screen */
X+ 
X+ 	/* OPTIONAL */
X+ 	if (nansi) {
X+ 		AL = "\033[L";       /* Insert line */
X+ 		DL = "\033[M";       /* Delete line */
X+ 	}
X+ 	else {
X+ 		AL = NULL;           /* Insert line */
X+ 		DL = NULL;           /* Delete line */
X+ 	}
X+ 
X+ 	sprintf(sobuf, "\033[1;%d;%dm", fg_color + 30, bg_color + 40);
X+ 	sprintf(sebuf, "\033[0;%d;%dm", fg_color + 30, bg_color + 40);
X+ 
X+ 	SO = sobuf;      /* Begin standout mode */
X+ 	SE = sebuf;      /* End standout mode */
X+ 	CD = NULL;  /* Clear to end of display */
X+ 
X+ 	puts(sebuf);
X+ #endif /* __MSDOS__ */
X+ 
X  	/* get memory for decoded output buffer*/
X  	if ((outbuf=malloc(BUFBIG+16))==0) {
X! 		fprintf(stderr,"Error malloc'ing memory for decoded output buffer\n");
X  		fflush(stderr);
X  		died(-285);	/* malloc() failure */
X  	}
X***************
X*** 839,844 ****
X--- 967,990 ----
X  {
X  	enable_scroll = -1;
X  }
X+ 
X+ #ifdef __MSDOS__
X+ 
X+ void tputs(char *s, int x, int (*outch)())
X+ {
X+   while (*s) (*outch)(*s++);
X+   ++x;
X+ }
X+ 
X+ char *tgoto(char *s, int x, int y)
X+ {
X+   static char buf[12];
X+ 
X+   sprintf(buf, s, y+1, x+1);
X+   return buf;
X+ }
X+ 
X+ #endif  /* __MSDOS__ */
X  
X  /*
X   *	lflush()					Flush the output buffer
SHAR_EOF
if test 50636 -ne "`wc -c < 'patch02.1'`"
then
	echo shar: error transmitting "'patch02.1'" '(should have been 50636 characters)'
fi
fi # end of overwriting check
#	End of shell archive
exit 0