[comp.bugs.misc] Fixes for nethack on MS-DOS using MSC4.0

iverson@cory.Berkeley.EDU (Tim Iverson) (12/30/87)

Run this through patch (on the original distribution) to get nethack running
on MS-DOS.  These are context diffs, so if you've changed your version a
little, it might still work.  There's only one bug left that I know of -
occasionaly, the game hangs if you keep your dog around.  Since I dispose of
my dog right away, this is no problem for me.  Anyway, nethack has finally
become more trouble than it's worth, so this is probably the last time I do
something with it.  Despite this, I'll still help you if you have problems
with the patches.  :-)


- Tim Iverson
  iverson@cory.Berkeley.EDU
  ucbvax!cory!iverson

-------------------------------------------------------------------------
Only in old: Fixes.2.2
Only in old: Guidebook
Only in old: Guidebook.mn
Only in old: MANIFEST
diff -sct old/Make.ini ./Make.ini
*** old/Make.ini	Sat Dec  5 11:39:44 1987
--- ./Make.ini	Mon Dec 28 16:28:43 1987
***************
*** 1,42 ****
! #       SCCS Id: @(#)Make.ini   1.4     87/08/08
! # This is a sample `make.ini' file for NDMAKE v3.7.  You will probably want
! # to customize it for your system.
  
- 
- 
  # The order to search for rules and files is specified by .SUFFIXES
! .SUFFIXES : .exe .obj .c .for .asm
  
! # A few macros.
! CFLAGS = -A$(MODEL)
! MODEL = S
! SETARGV = $(LIB)\$(MODEL)SETARGV
! LIBS =
! BIN =
! LFLAGS =
  
- # A universally useful target.
- clean:
-         +-erase *.bak
-         +-erase *.map
- 
- # .BEFORE and .AFTER can be used to turn DPATH off and on.
- .BEFORE:; @+echo For help with ndmake, use the command `make -h'
- .AFTER:; @+echo All done.
- 
- 
  # DEFAULT RULES
! # To produce a `.obj' file from a `.asm' file using MASM.
! .asm.obj:; masm $*.asm;
  
! # To produce a `.obj' file from a `.c' file using Microsoft C. 
! .c.obj:; msc $(CFLAGS) -I\c $*.c
  
- # To produce a `.obj' file from a `.for' file using Microsoft Fortran.
- .for.obj:
-         for1 $*.for;
-         pas2
- 
  # To produce a `.exe' file from an `.obj' file.  Note that there is a
  # problem because LIBS may be different for linking `.obj' files
  # produced by different compilers (C, FORTRAN, PASCAL, etc).  To avoid
--- 1,33 ----
! # Print the `make -h' message
! #.HELP
  
  # The order to search for rules and files is specified by .SUFFIXES
! .SUFFIXES : .com .exe .obj .c .asm
  
! # macros for microsoft C
! CC      = cl
! MEM     = S
! CPU     = 2
! WARN    = 3
! CSIGN   = -J
! OPTIONS = -Ot
! LOPTS   = /noi
! FP      = -FPa
! LIBS    =
! CFLAGS  =
! SARGV   = c:\msc\obj\$(MEM)setargv.obj
! C_ALWAYS= -nologo -A$(MEM) -Zp -G$(CPU) -W$(WARN) $(CSIGN) $(FP) -DLINT_ARGS
! COPTS   = ${C_ALWAYS} ${OPTIONS} ${CFLAGS}
  
  # DEFAULT RULES
! # To produce a `.obj' file from a `.asm' file.
! .asm.obj:;
!         masm $*.asm;
  
! # To produce a `.obj' file from a `.c' file.
! # .c.obj:; cl $(COPTS) -c $*.c
! .c.obj :; $(CC) $(COPTS) -Fo$@ -c $<
  
  # To produce a `.exe' file from an `.obj' file.  Note that there is a
  # problem because LIBS may be different for linking `.obj' files
  # produced by different compilers (C, FORTRAN, PASCAL, etc).  To avoid
***************
*** 44,67 ****
  # the FORTRAN compiler produce `.fbj' files, etc.  Then you could write
  # specific rules for `.cbj.exe' and `.fbj.exe' which would use the correct
  # libraries.
! .obj.exe:
!         link $*.obj $(SETARGV), $@,, $(LIBS) $(LFLAGS);
  
  # To produce a `.exe' file from a `.asm' file.
! .asm.exe:
          masm $*.asm;
!         link $*.obj, $@,, $(LIBS)
          erase $*.obj
  
! # To produce a `.exe' file from a `.c' file.
! .c.exe:
!         msc $(CFLAGS) -I\c $*.c
!         link $*.obj $(SETARGV), $@,, $(LIBS) $(LFLAGS)
          erase $*.obj
  
! # To produce a `.exe' file from a `.for' file.
! .for.exe:
!         for1 $*.for;
!         pas2
!         link $*.obj, $@,, $(LIB)\FORTRAN.LIB
!         erase $*.obj
--- 35,65 ----
  # the FORTRAN compiler produce `.fbj' files, etc.  Then you could write
  # specific rules for `.cbj.exe' and `.fbj.exe' which would use the correct
  # libraries.
! .obj.exe :; link $* $(SARGV), $@, nul, ${LIBS} ${LOPTS};
  
  # To produce a `.exe' file from a `.asm' file.
! .asm.exe :
          masm $*.asm;
!         link $*.obj, $@ $(LOPTS);
          erase $*.obj
  
! # To produce a `.com' file from a `.asm' file.
! .asm.com : 
!         masm $*.asm;
!         link $*.obj, $* $(LOPTS);
!         exe2bin $*.exe $*.com
!         erase $*.exe
          erase $*.obj
  
! # To produce a `.exe' file from a `.c' file.
! .c.exe :
!         $(CC) $(COPTS) -Fo$*.obj -c $<
!         link $* $(SARGV), $@, nul, $(LIBS) $(LOPTS);
!         del $*.obj
!  
! # To produce a `.com' file from a `.c' file.
! .c.com :
!         $(CC) $(COPTS) -Fo$*.obj -c $<
!         link $* $(SARGV), $@,nul, $(LIBS) $(LOPTS);
!         exe2bin $*.exe $*.com
!         del $*.exe
Only in old: Makefile.att
diff -sct old/Makefile.pc ./Makefile.pc
*** old/Makefile.pc	Sat Dec  5 11:38:28 1987
--- ./Makefile.pc	Mon Dec 28 19:05:27 1987
***************
*** 1,27 ****
! #       SCCS Id: @(#)Makefile.pc        2.2     87/11/11
! #       Makefile for NetHack (PC) version 1.0 written using
! #       Microsoft(tm) "C" v3.0 or better.
  # 
  # Large memory model, register bug, remove stack probes:
! WIZARD=
! V = 35
! CFLAGS = -A$(MODEL) -DREGBUG -DLINT_ARGS -DVER=$V $(WIZARD) -Ot -Gs -Gt100
  
! LIBS =
! LFLAGS =
! MODEL = L
! SETARGV = $(LIB)\$(MODEL)SETARGV
! .SUFFIXES: .exe .obj .c
! .c.obj:; cl $(CFLAGS) -c $*.c
! .c.exe:;
!     cl $(CFLAGS) -c $*.c
!     link $*.obj $(SETARGV), $@,, $(LIBS) $(LFLAGS);
  
  # The game name
! GAME = hack.exe
  
  # The game directory
! GAMEDIR = \h
  
  # All object modules
  OBJS = decl.obj apply.obj bones.obj cmd.obj do.obj dothrow.obj\
--- 1,24 ----
! # Makefile for compiling nethack using MSC 4.0 and ndmake43
  # 
  # Large memory model, register bug, remove stack probes:
! V = 22
! WARN = 1
! CSIGN =
! CFLAGS = -DREGBUG -DVER=$V -Ot -Gt32 -I/tmp
  
! # this is the termcap library - you'll need to make this yourself
! LIBS = ${MEM}termcap
! MEM = L
  
+ #this turns on file glob'ing - useless for hack
+ #       it also uses lots of space in the run file.
+ #SARGV = $(LIB)\$(MODEL)SETARGV
+ 
  # The game name
! GAME = nhack.exe
  
  # The game directory
! GAMEDIR = \usr\games\nh
  
  # All object modules
  OBJS = decl.obj apply.obj bones.obj cmd.obj do.obj dothrow.obj\
***************
*** 38,48 ****
          wizard.obj worm.obj worn.obj write.obj zap.obj \
          version.obj rnd.obj alloc.obj msdos.obj
  
! # The main target - you may want to try both of these alternatives.
  #
  $(GAME) : $(OBJS)
! #       link $(OBJS), $(GAME) /NOIG /STACK:4000 /CP:1;
! #       link $(OBJS), $(GAME) /NOIG /STACK:0xa00 /CP:1;
  
  
  #       variable auxilary files.
--- 35,44 ----
          wizard.obj worm.obj worn.obj write.obj zap.obj \
          version.obj rnd.obj alloc.obj msdos.obj
  
! # The main target
  #
  $(GAME) : $(OBJS)
!         link $(OBJS), $(GAME), nul, $(LIBS) /noi /stack:0xf00 /seg:1024;
  
  
  #       variable auxilary files.
***************
*** 50,79 ****
  VARAUX = data rumors
  
  install : $(GAME) $(VARAUX)
!         - exepack $(GAME) $(GAMEDIR)\$(GAME)
!         - exemod $(GAMEDIR)\$(GAME) /max 1
  
  clean :
!         erase $(GAME)
! 
! spotless: clean
          erase *.obj
!         erase main.c
!         erase tty.c
!         erase unix.c
  
! srcs :
!         copy makefile \tmp
!         copy *.c \tmp
!         copy *.h \tmp
!         copy \local\make\make.doc \tmp
!         copy \local\make\make.ini \tmp
!         copy \bin\make.exe \tmp
!         cd \tmp
!         time
!         touch *.*
!         arc m hack$Vs * *.*
!         cd $(CWD)
  
  
  #       Other dependencies
--- 46,68 ----
  VARAUX = data rumors
  
  install : $(GAME) $(VARAUX)
!         exemod $(GAME) /min 1 /max 1
!         mv $(GAME) $(GAMEDIR)/$(GAME)
! #       game is too big to run exepack (even with 640k!)
! #       exepack $(GAME) $(GAMEDIR)\$(GAME)
  
  clean :
!         erase *.bat
!         erase *.bak
!         erase *.exe
          erase *.obj
!         erase tags
  
! # this must be done in a subshell (otherwise 'cd' is meaningless)
! # this is a feature of ndmake - probably will choke other pc MAKEs, but
! # will work fine on unix MAKEs
! zoo : clean
!         ( cd /tmp ; zoo aP: nhack$(V) $(CWD)/* ; mv nhack$(V).zoo $(CWD) )
  
  
  #       Other dependencies
***************
*** 80,88 ****
  #
  RUMORFILES= rumors.bas rumors.kaa rumors.mrx
  
! makedefs.exe:   makedefs.c alloc.obj config.h
!         cl -AL makedefs.c alloc.obj
  
  
  rumors :  config.h $(RUMORFILES) makedefs.exe
          makedefs.exe -r
--- 69,78 ----
  #
  RUMORFILES= rumors.bas rumors.kaa rumors.mrx
  
! makedefs.obj: config.h
  
+ makedefs.exe:   makedefs.obj alloc.obj
+         link makedefs.obj alloc.obj, makedefs $(LOPTS);
  
  rumors :  config.h $(RUMORFILES) makedefs.exe
          makedefs.exe -r
***************
*** 103,115 ****
          makedefs.exe -t
  
  main.obj :  pcmain.c hack.h
!         $(CC) $(CFLAGS) -Fo$@ -c pcmain.c
  
  tty.obj :  pctty.c hack.h msdos.h
!         $(CC) $(CFLAGS) -Fo$@ -c pctty.c
  
  unix.obj :  pcunix.c hack.h mkroom.h
!         $(CC) $(CFLAGS) -Fo$@ -c pcunix.c
  
  decl.obj :  hack.h mkroom.h
  apply.obj :  hack.h edog.h mkroom.h
--- 93,105 ----
          makedefs.exe -t
  
  main.obj :  pcmain.c hack.h
!         $(CC) $(COPTS) -Fo$@ -c pcmain.c
  
  tty.obj :  pctty.c hack.h msdos.h
!         $(CC) $(COPTS) -Fo$@ -c pctty.c
  
  unix.obj :  pcunix.c hack.h mkroom.h
!         $(CC) $(COPTS) -Fo$@ -c pcunix.c
  
  decl.obj :  hack.h mkroom.h
  apply.obj :  hack.h edog.h mkroom.h
Only in old: Makefile.tcc
Only in old: Makefile.unix
Only in old: Makefile.xenix
Only in old: Maketcc.ini
Only in old: NetHack.cnf
Files old/README and ./README are identical
Files old/README.OLD and ./README.OLD are identical
Files old/README.ORIG and ./README.ORIG are identical
diff -sct old/alloc.c ./alloc.c
*** old/alloc.c	Sat Dec  5 11:39:04 1987
--- ./alloc.c	Mon Dec 28 19:05:28 1987
***************
*** 26,34 ****
  alloc(lth)
  register unsigned lth;
  {
          register char *ptr;
  
!         if(!(ptr = malloc(lth)))
                  panic("Cannot get %d bytes", lth);
          return((long *) ptr);
  }
--- 26,35 ----
  alloc(lth)
  register unsigned lth;
  {
+         extern char *calloc(int, int);
          register char *ptr;
  
!         if (!(ptr = calloc(1, lth)))
                  panic("Cannot get %d bytes", lth);
          return((long *) ptr);
  }
diff -sct old/apply.c ./apply.c
*** old/apply.c	Wed Dec  2 21:55:58 1987
--- ./apply.c	Mon Dec 28 19:05:29 1987
***************
*** 82,93 ****
  #endif
          case BLINDFOLD:
                  if (Blindfolded) {
!                     Blindfolded = 0;
!                     if (!Blinded)       Blinded = 1;    /* see on next move */
!                     else                pline("You still cannot see.");
                  } else {
!                     Blindfolded = 1;
!                     seeoff(0);
                  }
                  break;
          default:
--- 82,95 ----
  #endif
          case BLINDFOLD:
                  if (Blindfolded) {
!                     Blindfolded = 0;    /* not blindfolded anymore */
!                     if (!Blinded)
!                         Blinded = 1;    /* see on next move */
!                     else
!                         pline("You still cannot see.");
                  } else {
!                     Blindfolded = ~TIMEOUT;     /* blindfolds stay on until */
!                     seeoff(0);                  /* taken off - no timeout   */
                  }
                  break;
          default:
Files old/bones.c and ./bones.c are identical
Files old/cmd.c and ./cmd.c are identical
diff -sct old/config.h ./config.h
*** old/config.h	Sat Dec  5 11:37:30 1987
--- ./config.h	Mon Dec 28 19:05:30 1987
***************
*** 18,32 ****
   * Also, the code for suspend and various ioctls is only given for BSD4.2
   */
  /* #define MSDOS        /* define for MS-DOS (actually defined by compiler) */
! #define UNIX            /* delete if no fork(), exec() available */
  /* #define      GENIX           /* Yet Another Unix Clone */
! #define BSD             /* defind for 4.n BSD  */
  /* #define SYSV         /* define for System V */
  
  /* #define BETA         /* if a beta-test copy  [MRS] */
  #define VERSION "2.2a"  /* version number. */
  
! #define PYRAMID_BUG     /* avoid a bug on the Pyramid */
  /* #define APOLLO               /* same for the Apollo */
  /* #define STUPID               /* avoid some complicated expressions if
                             your C compiler chokes on them */
--- 18,32 ----
   * Also, the code for suspend and various ioctls is only given for BSD4.2
   */
  /* #define MSDOS        /* define for MS-DOS (actually defined by compiler) */
! /* #define      UNIX            /* delete if no fork(), exec() available */
  /* #define      GENIX           /* Yet Another Unix Clone */
! /* #define BSD          /* defind for 4.n BSD  */
  /* #define SYSV         /* define for System V */
  
  /* #define BETA         /* if a beta-test copy  [MRS] */
  #define VERSION "2.2a"  /* version number. */
  
! /* #define PYRAMID_BUG  /* avoid a bug on the Pyramid */
  /* #define APOLLO               /* same for the Apollo */
  /* #define STUPID               /* avoid some complicated expressions if
                             your C compiler chokes on them */
***************
*** 37,43 ****
  #define signal  ssignal
  #endif
  
! #define WIZARD  "mike"  /* the person allowed to use the -D option */
  #define RECORD  "record"/* the file containing the list of topscorers */
  #define NEWS    "news"  /* the file containing the latest hack news */
  #define HELP    "help"  /* the file containing a description of the commands */
--- 37,43 ----
  #define signal  ssignal
  #endif
  
! /*#define WIZARD  "Zardoz"/* the person allowed to use the -D option */
  #define RECORD  "record"/* the file containing the list of topscorers */
  #define NEWS    "news"  /* the file containing the latest hack news */
  #define HELP    "help"  /* the file containing a description of the commands */
***************
*** 93,99 ****
   * If you define HACKDIR, then this will be the default playground;
   * otherwise it will be the current directory.
   */
! #define HACKDIR "/usr/games/lib/nethackdir"
  
  /*
   * Some system administrators are stupid enough to make Hack suid root
--- 93,99 ----
   * If you define HACKDIR, then this will be the default playground;
   * otherwise it will be the current directory.
   */
! #define HACKDIR "/usr/games/nh/nhdir"
  
  /*
   * Some system administrators are stupid enough to make Hack suid root
***************
*** 113,119 ****
  
  /* size of terminal screen is (at least) (ROWNO+2) by COLNO */
  #define COLNO   80
! #define ROWNO   22
  
  #ifdef BSD
  #include <strings.h>            /* declarations for strcat etc. */
--- 113,119 ----
  
  /* size of terminal screen is (at least) (ROWNO+2) by COLNO */
  #define COLNO   80
! #define ROWNO   23
  
  #ifdef BSD
  #include <strings.h>            /* declarations for strcat etc. */
***************
*** 221,227 ****
  #define SAC             /* Soldiers, barracks by Steve Creps */
  
  #if defined(MSDOS) && defined(GRAPHICS)
! #define MSDOSCOLOR
  #endif
  
  /*
--- 221,227 ----
  #define SAC             /* Soldiers, barracks by Steve Creps */
  
  #if defined(MSDOS) && defined(GRAPHICS)
! /* #define MSDOSCOLOR   /* colors are extremely repulsive */
  #endif
  
  /*
Only in .: core
Only in .: data.bas
Only in old: data.base
diff -sct old/date.h ./date.h
*** old/date.h	Wed Dec  2 22:14:00 1987
--- ./date.h	Mon Dec 28 19:05:30 1987
***************
*** 1,3 ****
  /*      SCCS Id: @(#)date.h     1.4     87/08/08 */
  
! char datestring[] = "Mon Nov 30 01:25:12 1987";
--- 1,3 ----
  /*      SCCS Id: @(#)date.h     1.4     87/08/08 */
  
! char datestring[] = "Thu Dec 24 00:34:16 1987";
Files old/decl.c and ./decl.c are identical
Files old/do.c and ./do.c are identical
Files old/do_name.c and ./do_name.c are identical
Files old/do_wear.c and ./do_wear.c are identical
diff -sct old/dog.c ./dog.c
*** old/dog.c	Sat Dec  5 11:38:34 1987
--- ./dog.c	Mon Dec 28 19:05:32 1987
***************
*** 8,14 ****
  #include "mkroom.h"
  
  #ifdef  DOGNAME
! char dogname[63];
  #endif  /* DOGNAME */
  
  struct permonst li_dog =
--- 8,14 ----
  #include "mkroom.h"
  
  #ifdef  DOGNAME
! char dogname[63] = "";
  #endif  /* DOGNAME */
  
  struct permonst li_dog =
***************
*** 21,27 ****
  struct monst *
  makedog(){
  register struct monst *mtmp = makemon(&li_dog,u.ux,u.uy);
!         if(!mtmp) return((struct monst *) 0); /* dogs were genocided */
  #ifdef  DOGNAME
          if (dogname[0]) {
                  register struct monst *mtmp2;
--- 21,28 ----
  struct monst *
  makedog(){
  register struct monst *mtmp = makemon(&li_dog,u.ux,u.uy);
!         if(!mtmp) return((struct monst *) 0);   /* dogs were genocided */
!         *NAME(mtmp) = '\0';     /* make sure unamed dogs have no name */
  #ifdef  DOGNAME
          if (dogname[0]) {
                  register struct monst *mtmp2;
Files old/dogmove.c and ./dogmove.c are identical
Files old/dothrow.c and ./dothrow.c are identical
Files old/eat.c and ./eat.c are identical
Files old/edog.h and ./edog.h are identical
Files old/end.c and ./end.c are identical
Files old/engrave.c and ./engrave.c are identical
Files old/eshk.h and ./eshk.h are identical
Files old/extern.h and ./extern.h are identical
diff -sct old/fight.c ./fight.c
*** old/fight.c	Wed Dec  2 21:57:08 1987
--- ./fight.c	Mon Dec 28 19:05:35 1987
***************
*** 27,33 ****
  schar tmp;
  boolean vis;
          if(!magr || !mdef) return(0);           /* mike@genat */
!         if(index("Eauy", pa->mlet)) return(0);
          if(magr->mfroz) return(0);              /* riv05!a3 */
          tmp = pd->ac + pa->mlevel;
          if(mdef->mconf || mdef->mfroz || mdef->msleep){
--- 27,36 ----
  schar tmp;
  boolean vis;
          if(!magr || !mdef) return(0);           /* mike@genat */
! 
!         /* was "Eauy" - this lets unicorns fight like they used to */
!         if(index("Eay", pa->mlet)) return(0);
! 
          if(magr->mfroz) return(0);              /* riv05!a3 */
          tmp = pd->ac + pa->mlevel;
          if(mdef->mconf || mdef->mfroz || mdef->msleep){
***************
*** 316,322 ****
              else
  #endif
                  if(obj->otyp == KATANA
!                    && !strcmp(ONAME(obj), "Snickersnee")) tmp += rnd(5);
  
              else if(mon->data->mlet == 'O' && obj->otyp == TWO_HANDED_SWORD
                      && !strcmp(ONAME(obj), "Orcrist"))  tmp += rnd(10);
--- 319,325 ----
              else
  #endif
                  if(obj->otyp == KATANA
!                    && !strcmp(ONAME(obj), "Narsil")) tmp += rnd(5);
  
              else if(mon->data->mlet == 'O' && obj->otyp == TWO_HANDED_SWORD
                      && !strcmp(ONAME(obj), "Orcrist"))  tmp += rnd(10);
***************
*** 461,477 ****
           * invisible.
           */
          /*  changes by wwp 5/16/85 */
          if (!Blind && !Confusion && !Hallucination
              && mdat->mlet == 'd' && mtmp->mtame) {
!                 char *dname;            /* added by Janet Walz (walz@mimsy) */
                  mtmp->mflee = 1;
                  mtmp->mfleetim = rnd(6);
!                 if (dname = NAME(mtmp))
!                     pline("You stop to avoid hitting %s.",dname);
                  else
                      pline("You stop to avoid hitting your dog.");
                  return(TRUE);
          }
          if (flags.confirm && (mtmp->mpeaceful || mtmp->mtame) && ! Confusion
              && !Hallucination && !Invisible)
  
--- 464,485 ----
           * invisible.
           */
          /*  changes by wwp 5/16/85 */
+ #ifdef  DOG_LOVER
+         /* this prevents your dog from ever being hit by you - real stupid,
+          * I *like* killing my dog!
+          */
          if (!Blind && !Confusion && !Hallucination
              && mdat->mlet == 'd' && mtmp->mtame) {
!                 char *dogname = NAME(mtmp);
                  mtmp->mflee = 1;
                  mtmp->mfleetim = rnd(6);
!                 if (*dogname)
!                     pline("You stop to avoid hitting %s.", dogname);
                  else
                      pline("You stop to avoid hitting your dog.");
                  return(TRUE);
          }
+ #endif  /* DOG_LOVER */
          if (flags.confirm && (mtmp->mpeaceful || mtmp->mtame) && ! Confusion
              && !Hallucination && !Invisible)
  
***************
*** 517,523 ****
          tmp = u.uluck + (u.mtimedone ? mons[u.umonnum].mlevel : u.ulevel) +
                          mdat->ac + abon();
          if (u.usym=='y' || u.usym=='F') tmp=100;
!         if (index("uEa",u.usym)) return(TRUE);
  #else
          tmp = u.uluck + u.ulevel + mdat->ac + abon();
  #endif
--- 525,534 ----
          tmp = u.uluck + (u.mtimedone ? mons[u.umonnum].mlevel : u.ulevel) +
                          mdat->ac + abon();
          if (u.usym=='y' || u.usym=='F') tmp=100;
!         /* was "uEa" - stupid.  Why can't unicorns hit monsters? 
!          * Now, if you are polymorphed into a unicorn, you can still fight.
!          */
!         if (index("Ea", u.usym)) return(TRUE);
  #else
          tmp = u.uluck + u.ulevel + mdat->ac + abon();
  #endif
Only in .: fixes_2.2
Files old/flag.h and ./flag.h are identical
diff -sct old/fountain.c ./fountain.c
*** old/fountain.c	Sat Dec  5 11:37:38 1987
--- ./fountain.c	Mon Dec 28 19:05:36 1987
***************
*** 55,61 ****
              pline("You have unleashed a water demon!");
  
          /* Give those on low levels a (slightly) better chance of survival */
!             if ( rnd(100) > (80 + dlevel)) {
                  pline("Grateful for his release, he grants you a wish!");
                  makewish();
                  mondied(mtmp);
--- 55,61 ----
              pline("You have unleashed a water demon!");
  
          /* Give those on low levels a (slightly) better chance of survival */
!             if ( rnd(100) > (80 + u.ulevel - u.uluck)) {
                  pline("Grateful for his release, he grants you a wish!");
                  makewish();
                  mondied(mtmp);
***************
*** 95,101 ****
                          pline("Water gushes forth from the overflowing fountain!");
                      else
                          pline("Your thirst is quenched.");
!                     return;
                  }
                  mx = somex();
                  my = somey();
--- 95,101 ----
                          pline("Water gushes forth from the overflowing fountain!");
                      else
                          pline("Your thirst is quenched.");
!                     return(0);
                  }
                  mx = somex();
                  my = somey();
***************
*** 123,129 ****
          if (!rn2(3) && (levl[u.ux][u.uy].typ == FOUNTAIN)) {
                  pline("The fountain dries up!");
                  levl[u.ux][u.uy].typ = ROOM;
!                 if(Invis) newsym(u.ux, u.uy);
          }
  }
  
--- 123,129 ----
          if (!rn2(3) && (levl[u.ux][u.uy].typ == FOUNTAIN)) {
                  pline("The fountain dries up!");
                  levl[u.ux][u.uy].typ = ROOM;
!                 if(Invisible) newsym(u.ux, u.uy);
          }
  }
  
***************
*** 259,264 ****
--- 259,273 ----
                          /* Be *REAL* nice to him */
          pline("A murky hand from the depths reaches up to bless the sword.");
          pline("As the hand retreats, the fountain disappears!");
+ 
+                         /* gotta do this stuff first cause oname free()'s
+                          * the pointer that is passed to it - ugly.
+                          */
+ #ifdef KAA
+                         obj->dknown = 1;        /* blessed */
+ #endif
+                         obj->cursed = 0;
+                         obj->rustfree = 1;
  #ifndef RPH
                          if(obj->spe < 5) obj->spe = 5;
  #else
***************
*** 265,277 ****
                          /* otherwise +rnd(10) / +5 "Super"sword */
                          oname(obj, "Excalibur");
  #endif
- #ifdef KAA
-                         obj->dknown = 1;        /* blessed */
- #endif
-                         obj->cursed = 0;
-                         obj->rustfree = 1;
                          levl[u.ux][u.uy].typ = ROOM;
!                         if(Invis) newsym(u.ux, u.uy);
                          return(0);
                  } else pline ("Well, it looks wet now.");
          else {
--- 274,281 ----
                          /* otherwise +rnd(10) / +5 "Super"sword */
                          oname(obj, "Excalibur");
  #endif
                          levl[u.ux][u.uy].typ = ROOM;
!                         if(Invisible) newsym(u.ux, u.uy);
                          return(0);
                  } else pline ("Well, it looks wet now.");
          else {
Files old/func_tab.h and ./func_tab.h are identical
Files old/gen.h and ./gen.h are identical
Files old/gold.h and ./gold.h are identical
diff -sct old/hack.c ./hack.c
*** old/hack.c	Wed Dec  2 15:55:02 1987
--- ./hack.c	Mon Dec 28 19:05:37 1987
***************
*** 524,530 ****
                          flags.botl = 1;
                          freegold(gold);
                          if(flags.run) nomul(0);
!                         if(Invis) newsym(u.ux,u.uy);
          }
  
  
--- 524,530 ----
                          flags.botl = 1;
                          freegold(gold);
                          if(flags.run) nomul(0);
!                         if(Invisible) newsym(u.ux,u.uy);
          }
  
  
diff -sct old/hack.h ./hack.h
*** old/hack.h	Sat Dec  5 11:39:52 1987
--- ./hack.h	Mon Dec 28 19:05:37 1987
***************
*** 69,75 ****
  #else
  #define MAX_CARR_CAP    500
  #endif
! #ifdef RPH
  #define MAXLEVEL        60
  #else
  #define MAXLEVEL        40
--- 69,75 ----
  #else
  #define MAX_CARR_CAP    500
  #endif
! #if     defined(RPH) && !defined(MSDOS) /* 60 is too big for floppies */
  #define MAXLEVEL        60
  #else
  #define MAXLEVEL        40
Only in old: help
Only in old: hh
Files old/invent.c and ./invent.c are identical
Files old/ioctl.c and ./ioctl.c are identical
diff -sct old/lev.c ./lev.c
*** old/lev.c	Wed Dec  2 22:03:22 1987
--- ./lev.c	Mon Dec 28 19:05:38 1987
***************
*** 174,180 ****
          int monsindex;
          extern struct permonst li_dog, dog, la_dog;
  #ifdef KAA
-         int mi;
          extern struct permonst hell_hound;
  # ifdef HARD
          extern struct permonst d_lord, d_prince;
--- 174,179 ----
***************
*** 191,220 ****
                  /* store an index where the pointer used to be */
                  permonstp = mtmp->data;
                  if (permonstp == &li_dog)
!                         monsindex = mi = -1;    /* fake index */
                  else if (permonstp == &dog)
!                         monsindex = --mi;       /* fake index */
                  else if (permonstp == &la_dog)
!                         monsindex = --mi;       /* fake index */
  #ifdef KAA
                  else if (permonstp == &hell_hound)
!                         monsindex = --mi;       /* fake index */
  # ifdef HARD
                  else if (permonstp == &d_lord)
!                         monsindex = --mi;       /* fake index */
  
                  else if (permonstp == &d_prince)
!                         monsindex = --mi;       /* fake index */
  # endif
  # ifdef KJSMODS
                  else if (permonstp == &pm_guard)
!                         monsindex = -mi;        /* fake index */
  
                  else if (permonstp == &pm_ghost)
!                         monsindex = -mi;        /* fake index */
  
                  else if (permonstp == &pm_eel)
!                         monsindex = -mi;        /* fake index */
  # endif
  #endif
                  else                    
--- 190,219 ----
                  /* store an index where the pointer used to be */
                  permonstp = mtmp->data;
                  if (permonstp == &li_dog)
!                         monsindex = -1; /* fake index */
                  else if (permonstp == &dog)
!                         monsindex = -2; /* fake index */
                  else if (permonstp == &la_dog)
!                         monsindex = -3; /* fake index */
  #ifdef KAA
                  else if (permonstp == &hell_hound)
!                         monsindex = -4; /* fake index */
  # ifdef HARD
                  else if (permonstp == &d_lord)
!                         monsindex = -5; /* fake index */
  
                  else if (permonstp == &d_prince)
!                         monsindex = -6; /* fake index */
  # endif
  # ifdef KJSMODS
                  else if (permonstp == &pm_guard)
!                         monsindex = -7; /* fake index */
  
                  else if (permonstp == &pm_ghost)
!                         monsindex = -8; /* fake index */
  
                  else if (permonstp == &pm_eel)
!                         monsindex = -9; /* fake index */
  # endif
  #endif
                  else                    
Only in old: make.exe
Files old/makedefs.c and ./makedefs.c are identical
diff -sct old/makemon.c ./makemon.c
*** old/makemon.c	Sat Dec  5 11:37:12 1987
--- ./makemon.c	Mon Dec 28 19:05:39 1987
***************
*** 40,46 ****
          boolean anything = (!ptr);
          int zlevel = dlevel;
  #ifdef BVH
!         if(has_amulet()) zlevel = 40;
  #endif
          /* if a monster already exists at the position, return */
          if(x != 0 || y != 0) if(m_at(x,y)) return((struct monst *) 0);
--- 40,46 ----
          boolean anything = (!ptr);
          int zlevel = dlevel;
  #ifdef BVH
!         if(has_amulet()) zlevel = MAXLEVEL;
  #endif
          /* if a monster already exists at the position, return */
          if(x != 0 || y != 0) if(m_at(x,y)) return((struct monst *) 0);
***************
*** 54,60 ****
                  if(index(fut_geno, 'm')) nleft++;  /* only 1 minotaur */
                  if(index(fut_geno, '@')) nleft++;
                  if(nleft <= 0)
!                     return((struct monst *) 0); /* no more monsters! */
  
                  /* determine the strongest monster to make. */
  #ifdef ROCKMOLE
--- 54,64 ----
                  if(index(fut_geno, 'm')) nleft++;  /* only 1 minotaur */
                  if(index(fut_geno, '@')) nleft++;
                  if(nleft <= 0)
! #ifdef  HARD
!                         goto gen2many;          /* make a demon! */
! #else
!                         return (struct monst *) 0;
! #endif  /* HARD */
  
                  /* determine the strongest monster to make. */
  #ifdef ROCKMOLE
***************
*** 77,93 ****
                                  /* since this is a random monster, make 
                                     a Kobold instead of a Kop. */
                                  ptr = &kobold;
- # else
-                                 deep--;
  # endif
                                  continue;
                          }
  #endif /* KOPS /**/
                          if(deep-- <= 0) goto gotmon;
                  }
!                 /* this can happen if you are deep in the dungeon and 
!                    mostly weak monsters have been genocided. */
!                 return((struct monst *) 0);
          }
  gotmon:
  #if defined(KJSMODS) && defined(ROCKMOLE)
--- 81,114 ----
                                  /* since this is a random monster, make 
                                     a Kobold instead of a Kop. */
                                  ptr = &kobold;
  # endif
+                                 deep--;
                                  continue;
                          }
  #endif /* KOPS /**/
                          if(deep-- <= 0) goto gotmon;
                  }
! 
! #ifdef  HARD
!                 /* fool adventurer genocided too many monsters, now
!                  * he gets to fight various hellspawn ...
!                  * (70% demons, 20% lords, 10% princes)
!                  */
! gen2many:       switch (rn2(10))
!                 {
!                 default:
!                         ptr = PM_DEMON;
!                         break;
!                 case 3: case 8:
!                         ptr = &d_lord;
!                         break;
!                 case 5:
!                         ptr = &d_prince;
!                         break;
!                 }
! #else
!                 return (struct monst *) 0;
! #endif  /* HARD */
          }
  gotmon:
  #if defined(KJSMODS) && defined(ROCKMOLE)
***************
*** 137,149 ****
                          mtmp->cham = 0;
                  else {
                          mtmp->cham = 1;
                          (void) newcham(mtmp,
                                  &mons[zlevel+14+rn2(CMNUM-14-zlevel)]);
                  }
  #else
                  mtmp->cham = 1;
                  (void) newcham(mtmp, &mons[zlevel+14+rn2(CMNUM-14-zlevel)]);
! #endif
          }
          if(ptr->mlet == 'I' || ptr->mlet == ';')
                  mtmp->minvis = 1;
--- 158,178 ----
                          mtmp->cham = 0;
                  else {
                          mtmp->cham = 1;
+ #ifndef RPH
                          (void) newcham(mtmp,
                                  &mons[zlevel+14+rn2(CMNUM-14-zlevel)]);
+ #else
+                         (void) newcham(mtmp, (struct permonst *) 0);
+ #endif  /* RPH */
                  }
  #else
                  mtmp->cham = 1;
+ #ifndef RPH
                  (void) newcham(mtmp, &mons[zlevel+14+rn2(CMNUM-14-zlevel)]);
! #else
!                 (void) newcham(mtmp, (struct permonst *) 0);
! #endif  /* RPH */
! #endif  /* DGKMOD */
          }
          if(ptr->mlet == 'I' || ptr->mlet == ';')
                  mtmp->minvis = 1;
Files old/mfndpos.h and ./mfndpos.h are identical
Files old/mhitu.c and ./mhitu.c are identical
Files old/mklev.c and ./mklev.c are identical
diff -sct old/mkmaze.c ./mkmaze.c
*** old/mkmaze.c	Sat Dec  5 11:38:42 1987
--- ./mkmaze.c	Mon Dec 28 19:05:41 1987
***************
*** 71,81 ****
              (void) mkobj_at(ROCK_SYM, zx, zy);  /* put a rock on top of it */
          }
  
          for(x = 2; x < COLNO-1; x++)
                  for(y = 2; y < ROWNO-1; y++) {
                          switch(levl[x][y].typ) {
                          case HWALL:
!                                 levl[x][y].scrsym = HWALL_SYM;
                                  break;
                          case ROOM:
                                  levl[x][y].scrsym = ROOM_SYM;
--- 71,92 ----
              (void) mkobj_at(ROCK_SYM, zx, zy);  /* put a rock on top of it */
          }
  
+         /* cosmetic changes - change some of the HWALLs to VWALLs so
+          * that vertical corridors are enclosed by vertical walls, not
+          * horizontal ones.   This is much much easier on the eyes.
+          */
+ #define LSYM    levl[x-1][y].typ
+ #define RSYM    levl[x+1][y].typ
          for(x = 2; x < COLNO-1; x++)
                  for(y = 2; y < ROWNO-1; y++) {
                          switch(levl[x][y].typ) {
                          case HWALL:
!                                 if (LSYM != HWALL && RSYM != HWALL) {
!                                         levl[x][y].scrsym = VWALL_SYM;
!                                         levl[x][y].typ = VWALL;
!                                 }
!                                 else
!                                         levl[x][y].scrsym = HWALL_SYM;
                                  break;
                          case ROOM:
                                  levl[x][y].scrsym = ROOM_SYM;
***************
*** 82,87 ****
--- 93,112 ----
                                  break;
                          }
                  }
+ 
+         /* more cosmetics for the maze - get rid of horizontal intrusions */
+         for(x = 2; x < COLNO-1; x++)
+         {
+                 for(y = 3; y < ROWNO-2; y++) if (levl[x][y].typ == HWALL
+                         && levl[x][y-1].typ == VWALL
+                         && levl[x][y+1].typ == VWALL)
+                 {
+                         levl[x][y].typ = VWALL;
+                         levl[x][y].scrsym = VWALL_SYM;
+                 }
+         }
+ #undef  LSYM
+ #undef  RSYM
          for(x = rn1(8,11); x; x--) {
                  mazexy(&mm);
                  (void) mkobj_at(rn2(2) ? GEM_SYM : 0, mm.x, mm.y);
Files old/mkobj.c and ./mkobj.c are identical
Files old/mkroom.h and ./mkroom.h are identical
Files old/mkshop.c and ./mkshop.c are identical
diff -sct old/mon.c ./mon.c
*** old/mon.c	Wed Dec  2 15:55:54 1987
--- ./mon.c	Mon Dec 28 19:05:42 1987
***************
*** 485,491 ****
                  HTelepat = 0;
                  u.uluck -= 2;
          }
!         if(mtmp->mpeaceful || mtmp->mtame) u.uluck--;
          if(mdat->mlet == 'u') u.uluck -= 5;
          if((int)u.uluck < LUCKMIN) u.uluck = LUCKMIN;
  
--- 485,501 ----
                  HTelepat = 0;
                  u.uluck -= 2;
          }
!         if(mtmp->mpeaceful || mtmp->mtame)
!         {
!                 /* number of sadistic acts that are good luck, "sadist = 1"
!                  * means that the 1st act increases luck, the second does
!                  * nothing, the rest decrease luck
!                  */
!                 static int sadist = 1;
! 
!                 if (sadist-- > 0)       ++u.uluck;
!                 else if (sadist < 0)    --u.uluck;
!         }
          if(mdat->mlet == 'u') u.uluck -= 5;
          if((int)u.uluck < LUCKMIN) u.uluck = LUCKMIN;
  
***************
*** 686,691 ****
--- 696,712 ----
  {
          register mhp, hpn, hpd;
  
+ #ifdef RPH
+         /* mdat = 0 -> caller wants a random monster shape */
+         if (mdat == 0) {
+                 int spread = 21 - u.ulevel + u.uluck / 2;
+                 /* ie. min monster is mons[CMNUM - 1 - 20 - u.uluck], max is
+                  * mons[CMNUM - 1].  spread gets smaller as adventurer gains
+                  * experience, get bigger as adv. gains luck.
+                  */
+                 mdat = &mons[CMNUM - spread + rn2(spread)];
+         }
+ #endif  
          if(mdat == mtmp->data) return(0);       /* still the same monster */
  #ifndef NOWORM
          if(mtmp->wormno) wormdead(mtmp);        /* throw tail away */
diff -sct old/monmove.c ./monmove.c
*** old/monmove.c	Wed Dec  2 22:08:10 1987
--- ./monmove.c	Mon Dec 28 19:05:43 1987
***************
*** 31,37 ****
--- 31,41 ----
          register tmp, nearby, scared, onscary;
  
          if(mtmp->cham && !rn2(6))
+ #ifndef RPH
                  (void) newcham(mtmp, &mons[dlevel+14+rn2(CMNUM-14-dlevel)]);
+ #else
+                 (void) newcham(mtmp, (struct permonst *) 0);
+ #endif  /* RPH */
          mdat = mtmp->data;
          if(mdat->mlevel < 0)
                  panic("bad monster %c (%d)",mdat->mlet,mdat->mlevel);
***************
*** 420,430 ****
--- 424,452 ----
                    && IS_ROCK(levl[mtmp->mx][mtmp->my].typ) &&
                    levl[mtmp->mx][mtmp->my].typ != POOL){
                     register int pile = rnd(25);
+ 
                     /* Just ate something. */
+ #ifdef  MOLE_DOORS
+                 /* old style rockmoles can leave doors behind; real
+                  * stupid hack - do they carry around a bunch of
+                  * doors and install them after they eat the rock
+                  * or what?  If you like this, #define MOLE_DOORS
+                  */
                     if(levl[mtmp->mx][mtmp->my].typ == 0)
                       levl[mtmp->mx][mtmp->my].typ = CORR;
                     else if(IS_WALL(levl[mtmp->mx][mtmp->my].typ))
                       levl[mtmp->mx][mtmp->my].typ = DOOR;
+ #else
+                 /* if this is a maze, use room symbols otherwise, use
+                  * corridor symbols.  More "realistic" (ha!) and also makes
+                  * rockmoles a little harder to track - no trail of doors.
+                  */
+                 if (!xdnstair || IS_WALL(levl[mtmp->mx][mtmp->my].typ))
+                         levl[mtmp->mx][mtmp->my].typ = ROOM;
+                 else
+                         levl[mtmp->mx][mtmp->my].typ = CORR;
+ #endif  /* MOLE_DOORS */
+ 
                     mnewsym(mtmp->mx,mtmp->my);
                     /* Left behind a pile? */
                     if(pile < 5) {
Files old/monst.c and ./monst.c are identical
Files old/monst.h and ./monst.h are identical
diff -sct old/msdos.c ./msdos.c
*** old/msdos.c	Wed Dec  2 22:00:44 1987
--- ./msdos.c	Mon Dec 28 19:05:44 1987
***************
*** 517,544 ****
                          }
                          (void) strncpy(SAVEF, bufp, PATHLEN);
                          append_slash(SAVEF);
  #ifdef GRAPHICS
!                 } else if (!strncmp(buf, "GRAPHICS", 4)) {
!                         char translate[17];
!                         short i;
  
!                      if ((i = sscanf(bufp, "%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u",
!                                 &translate[0], &translate[1], &translate[2],
!                                 &translate[3], &translate[4], &translate[5],
!                                 &translate[6], &translate[7], &translate[8],
!                                 &translate[9], &translate[10], &translate[11],
!                                 &translate[12], &translate[13], &translate[14],
!                                 &translate[15], &translate[16])) < 0) {
!                                         msmsg ("Syntax error in GRAPHICS\n");
!                                         getreturn("to continue");
                          }
!                         translate[i] = '\0';
  #endif /* GRAPHICS /**/
  /*
   * You could have problems here if you configure FOUNTAINS, SPIDERS or NEWCLASS
   * in or out and forget to change the tail entries in your graphics string.
   */
- #define SETPCHAR(f, n)  showsyms.f = (strlen(translate) > n) ? translate[n] : defsyms.f
                          SETPCHAR(stone, 0);
                          SETPCHAR(vwall, 1);
                          SETPCHAR(hwall, 2);
--- 517,554 ----
                          }
                          (void) strncpy(SAVEF, bufp, PATHLEN);
                          append_slash(SAVEF);
+                 }
  #ifdef GRAPHICS
!                 else if (!strncmp(buf, "GRAPHICS", 4)) {
!                         unsigned int gvals[17];
!                         int num_gvals;
  
!                         /* set gvals array to zero */
!                         memset((char *) gvals, 0, sizeof gvals);
! 
!                         /* get the values from the file into gvals */
!                         if (sscanf(bufp, "%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u",
!                                 &gvals[0], &gvals[1], &gvals[2],
!                                 &gvals[3], &gvals[4], &gvals[5],
!                                 &gvals[6], &gvals[7], &gvals[8],
!                                 &gvals[9], &gvals[10], &gvals[11],
!                                 &gvals[12], &gvals[13], &gvals[14],
!                                 &gvals[15], &gvals[16]) < 0)
!                         {
!                                 msmsg ("Syntax error in GRAPHICS\n");
!                                 getreturn("to continue");
                          }
! #define SETPCHAR(f, n)  showsyms.f = gvals[n] ? gvals[n]  : defsyms.f
! 
! #else   /* no GRAPHICS */
! 
! #define SETPCHAR(f, n)  showsyms.f = defsyms.f
! 
  #endif /* GRAPHICS /**/
  /*
   * You could have problems here if you configure FOUNTAINS, SPIDERS or NEWCLASS
   * in or out and forget to change the tail entries in your graphics string.
   */
                          SETPCHAR(stone, 0);
                          SETPCHAR(vwall, 1);
                          SETPCHAR(hwall, 2);
Files old/msdos.h and ./msdos.h are identical
Only in old: nansi.sys
Only in old: nethack.6
diff -sct old/nethack.cnf ./nethack.cnf
*** old/nethack.cnf	Sat Dec  5 11:40:02 1987
--- ./nethack.cnf	Mon Dec 28 19:05:44 1987
***************
*** 1,8 ****
! HACKDIR=c:\games\nethack
! SAVE=c:\games\nethack\save
! LEVELS=c:\games\nethack\save
! OPTIONS=male,rawio,IBMBIOS,no rest_on_space,time,packorder:"/!?=)[%(*0
! OPTIONS=silent,endgame:10t/0a
  # The 9 GRAPHICS characters are:
  # vertical wall, horizontal wall, top left corner, top right corner
  # bottom left corner, bottom right corner, door, floor, corridor
--- 1,83 ----
! # A '#' at the beginning of a line means the rest of the line is a comment.
! 
! # This configuration file is set up for three cases, a person with a hard
! # disk as drive C:, 1 person with two floppy disks, and several people
! # with two floppy disks.  The default configuration is the second one.
! # To change configuration, comment out the unwanted configurations, and
! # remove the comment from the configuration you want.
! 
! # I use OPTIONS=name:NickD-W, silent, rawio, IBMBIOS
! 
! # A hard disk configuration.
! #
! HACKDIR=c:\usr\games\nh\nhdir
! SAVE=save;n
! #RAMDISK=c:\tmp\
! LEVELS=c:\tmp
! OPTIONS=name:Baalgor-W, nopickup, silent, rawio, IBMBIOS
! 
! # A 2-floppy configuration.
! #
! # HACKDIR=a:\
! # LEVELS=b:\
! # SAVE=b:\
! # OPTIONS=name:YourName-W
! # RAMDISK=c:
! 
! # The 17 default GRAPHICS characters (in order) are:
! # stone                 ' '
! # vertical wall         '|'
! # horizontal wall       '-'
! # top left corner       '-'
! # top right corner      '-'
! # bottom left corner    '-'
! # bottom right corner   '-'
! # door                  '+'
! # room floor            '.'
! # corridor floor        '#'
! # up stairs             '>'
! # down stairs           '<'
! # trap                  '^'
! # pool                  '}'
! # fountain              '{'
! # throne                '\'
! # web                   '"'
! 
! # An example using the IBM graphics character set.
! # These change the defaults to something more pleasant on the IBM PC
! # A zero will act as a place holder & will cause the default to be used.
! GRAPHICS = 0 179 196 218 191 192 217 206 250 176
! 
! 
! #     Special section for DEC Rainbow owners.
! #
! #  You *must* include the option `DECRainbow' in the OPTIONS line
! #  if you want to use line-drawing charcters.  Also, you must *not*
! #  use the option `rawio' or your system will hang!
! #
! #  You can select the "Rainbow line-drawing character set"
! #  for drawing the dungeon.  For *graphics* characters,
! #  128 has been added to the decimal value of the character.
! #  Adding 128 lets PC HACK know you want it to use the line-drawing
! #  character set.  Non-graphical characters are indicated by
! #  their decimal value.  You can mix both types of characters in
! #  the GRAPHICS line.
! #
! #  A recommended configuration for the Rainbow using the
! #  line-drawing character set, two floppies and no ramdisk is:
! # SAVE=b:\
! # LEVELS=b:\
! # OPTIONS=name:YourName,DECRainbow
! # GRAPHICS = 248 241 236 235 237 234 238 254 225 
! 
! 
! # this is the start of the screwed up hack.cnf that came with nethack 2.2
! 
! #HACKDIR=c:\usr\games\nh
! #SAVE=c:\usr\games\nh\save
! #LEVELS=c:\tmp
! #OPTIONS=male,rawio,IBMBIOS,no rest_on_space,no time,packorder:"/!?=)[%(*0
! #OPTIONS=silent,endgame:10t/0a
  # The 9 GRAPHICS characters are:
  # vertical wall, horizontal wall, top left corner, top right corner
  # bottom left corner, bottom right corner, door, floor, corridor
***************
*** 9,12 ****
  # An example using the IBM graphics character set.
  # from hack.35: GRAPHICS = 186 205 201 187 200 188 206 249 177
  # from hack.36: GRAPHICS = 179 196 218 191 192 217 206 250 176
! GRAPHICS = 186 205 201 187 200 188 206 249 177
--- 84,87 ----
  # An example using the IBM graphics character set.
  # from hack.35: GRAPHICS = 186 205 201 187 200 188 206 249 177
  # from hack.36: GRAPHICS = 179 196 218 191 192 217 206 250 176
! #GRAPHICS = 186 205 201 187 200 188 206 249 177
Only in old: nethack.sh
Only in old: netquest.sh
Only in .: nhack.diff
Only in old: nhack22.zoo
Files old/o_init.c and ./o_init.c are identical
Files old/obj.h and ./obj.h are identical
Files old/objclass.h and ./objclass.h are identical
Files old/objects.h and ./objects.h are identical
Files old/objnam.c and ./objnam.c are identical
Only in .: old
Files old/onames.h and ./onames.h are identical
diff -sct old/options.c ./options.c
*** old/options.c	Wed Dec  2 22:05:58 1987
--- ./options.c	Mon Dec 28 19:05:47 1987
***************
*** 313,319 ****
                          option_help();
                          return;
                  }
!                 pline("Bad option: %s.  Type `O help<cr>' for help.", opts);
                  return;
          }
  #ifdef DGK
--- 313,319 ----
                          option_help();
                          return;
                  }
!                 pline("Bad option: %s.  Type 'O help<cr>' for help.", opts);
                  return;
          }
  #ifdef DGK
***************
*** 435,475 ****
          (void) sprintf(buf, "To set options use OPTIONS=<options> in %s", configfile);
          Page_line(buf);
  #else
!         Page_line("To set options use `HACKOPTIONS=\"<options>\"' in your environment");
  #endif
  
!         Page_line("or give the command \"O\" followed by the line <options> while playing.");
          Page_line("Here <options> is a list of options separated by commas.");
          Page_line("");
  
  #ifdef DGK
!         Page_line("Boolean options are confirm, pickup, rawio, silent, sortpack, time, IBMBIOS,")
!         Page_line("and DECRainbow.  These can be negated by prefixing them with '!' or \"no\".");
  #else
          Page_line("Boolean options are rest_on_space, news, time, null tombstone, and (fe)male,");
!         Page_line("These can be negated by prefixing them with '!' or \"no\".");
  #endif
          Page_line("");
  
!         Page_line("The compound options are `name', (eg. name:Merlin-W,),");
  #ifdef  DOGNAME
!         Page_line("`dogname', the name of your (first) dog (eg. dogname:Fang,),");
  #endif
  
  #ifdef SORTING
!         Page_line("`packorder'; the order that items should appear in your pack");
          (void)sprintf(buf, "(the default is:  packorder:%s ), ", packorder);
          Page_line(buf);
  #endif
  
  #ifdef GRAPHICS
!         Page_line("`endgame', and `graphics'.");
  #else
!         Page_line("and `endgame'.");
  #endif
          Page_line("");
  
!         Page_line("The `endgame' option is followed by a description of which parts of");
          Page_line("the scorelist you wish to see.  You might for example say:");
          Page_line("");
          Page_line("\"endgame:own scores/5 top scores/4 around my score\".");
--- 435,475 ----
          (void) sprintf(buf, "To set options use OPTIONS=<options> in %s", configfile);
          Page_line(buf);
  #else
!         Page_line("To set options use 'HACKOPTIONS=\"<options>\"' in your environment");
  #endif
  
!         Page_line("or give the command 'O' followed by the line <options> while playing.");
          Page_line("Here <options> is a list of options separated by commas.");
          Page_line("");
  
  #ifdef DGK
!         Page_line("Boolean options are confirm, pickup, rawio, silent, sortpack, time, IBMBIOS,");
!         Page_line("and DECRainbow.  These can be negated by prefixing them with '!' or 'no'.");
  #else
          Page_line("Boolean options are rest_on_space, news, time, null tombstone, and (fe)male,");
!         Page_line("These can be negated by prefixing them with '!' or 'no'.");
  #endif
          Page_line("");
  
!         Page_line("The compound options are 'name', (eg. name:Merlin-W,),");
  #ifdef  DOGNAME
!         Page_line("'dogname', the name of your (first) dog (eg. dogname:Fang,),");
  #endif
  
  #ifdef SORTING
!         Page_line("'packorder'; the order that items should appear in your pack");
          (void)sprintf(buf, "(the default is:  packorder:%s ), ", packorder);
          Page_line(buf);
  #endif
  
  #ifdef GRAPHICS
!         Page_line("'endgame', and 'graphics'.");
  #else
!         Page_line("and 'endgame'.");
  #endif
          Page_line("");
  
!         Page_line("The 'endgame' option is followed by a description of which parts of");
          Page_line("the scorelist you wish to see.  You might for example say:");
          Page_line("");
          Page_line("\"endgame:own scores/5 top scores/4 around my score\".");
diff -sct old/pager.c ./pager.c
*** old/pager.c	Wed Dec  2 22:19:38 1987
--- ./pager.c	Mon Dec 28 19:05:47 1987
***************
*** 238,244 ****
                  if(!*s)
                          return(0);      /* suppress blank lines at top */
                  putchar('\n');
!                 cury++;
                  cmore("q\033");
                  if(morc) {
                          morc = 0;
--- 238,244 ----
                  if(!*s)
                          return(0);      /* suppress blank lines at top */
                  putchar('\n');
!                 cury++; curx = 1;
                  cmore("q\033");
                  if(morc) {
                          morc = 0;
***************
*** 252,258 ****
                  }
          }
          xputs(s); xputc('\n');
!         cury++;
          return(0);
  }
  
--- 252,258 ----
                  }
          }
          xputs(s); xputc('\n');
!         cury++; curx = 1;
          return(0);
  }
  
***************
*** 344,350 ****
              } else {                                    /* feed to pager */
                  set_pager(0);
                  for (tl = texthead; tl; tl = tl->next_line) {
!                     if (page_line (tl->line_text)) {
                          set_pager(2);
                          goto cleanup;
                      }
--- 344,350 ----
              } else {                                    /* feed to pager */
                  set_pager(0);
                  for (tl = texthead; tl; tl = tl->next_line) {
!                     if (page_line(tl->line_text)) {
                          set_pager(2);
                          goto cleanup;
                      }
diff -sct old/pcmain.c ./pcmain.c
*** old/pcmain.c	Wed Dec  2 22:10:42 1987
--- ./pcmain.c	Mon Dec 28 19:05:48 1987
***************
*** 131,138 ****
                                  clearlocks();
                                  exit(0);
                          }
                          break;
! #endif
                  case 'u':
                          if(argv[0][2])
                            (void) strncpy(plname, argv[0]+2, sizeof(plname)-1);
--- 131,139 ----
                                  clearlocks();
                                  exit(0);
                          }
+ # endif /* MSDOS */
                          break;
! #endif  /* WIZARD */
                  case 'u':
                          if(argv[0][2])
                            (void) strncpy(plname, argv[0]+2, sizeof(plname)-1);
***************
*** 149,155 ****
                  case 'R':
                          ramdisk = FALSE;
                          break;
! #endif
                  default:
                          /* allow -T for Tourist, etc. */
                          (void) strncpy(pl_character, argv[0]+1,
--- 150,156 ----
                  case 'R':
                          ramdisk = FALSE;
                          break;
! #endif /* DGK */
                  default:
                          /* allow -T for Tourist, etc. */
                          (void) strncpy(pl_character, argv[0]+1,
diff -sct old/pctty.c ./pctty.c
*** old/pctty.c	Sat Dec  5 11:38:52 1987
--- ./pctty.c	Mon Dec 28 19:05:48 1987
***************
*** 145,151 ****
          register foo;
  
          flags.move = 1;
!         if(!Invisible) curs_on_u(); else home();
          multi = 0;
  #ifdef DGK
          while((foo = readchar()) >= '0' && foo <= '9') {
--- 145,151 ----
          register foo;
  
          flags.move = 1;
!         curs_on_u();    /* always put cursor on you */
          multi = 0;
  #ifdef DGK
          while((foo = readchar()) >= '0' && foo <= '9') {
***************
*** 288,291 ****
          }
  
  }
! #endif COM_COMPL
--- 288,291 ----
          }
  
  }
! #endif /* COM_COMPL */
Files old/pcunix.c and ./pcunix.c are identical
Files old/permonst.h and ./permonst.h are identical
Files old/polyself.c and ./polyself.c are identical
Files old/potion.c and ./potion.c are identical
Files old/pray.c and ./pray.c are identical
diff -sct old/pri.c ./pri.c
*** old/pri.c	Wed Dec  2 22:11:12 1987
--- ./pri.c	Mon Dec 28 19:05:50 1987
***************
*** 377,384 ****
          (void) sprintf(newbot,
  #ifdef GOLD_ON_BOTL
  # ifdef SPELLS
!                 "Lev %-2d Gp %-5lu Hp %3d(%d) Ep %3d(%d) Ac %-2d  ",
!                 dlevel, u.ugold,
  #  ifdef KAA
                  u.mtimedone ? u.mh : u.uhp, u.mtimedone ? u.mhmax : u.uhpmax,
                  u.uen, u.uenmax, u.uac);
--- 377,384 ----
          (void) sprintf(newbot,
  #ifdef GOLD_ON_BOTL
  # ifdef SPELLS
!                 "%d Lev %-2d Gp %-5lu Hp %3d(%d) Ep %3d(%d) Ac %-2d  ",
!                 u.uluck, dlevel, u.ugold,
  #  ifdef KAA
                  u.mtimedone ? u.mh : u.uhp, u.mtimedone ? u.mhmax : u.uhpmax,
                  u.uen, u.uenmax, u.uac);
***************
*** 386,393 ****
                  u.uhp, u.uhpmax, u.uen, u.uenmax, u.uac);
  #  endif
  # else
!                 "Level %-2d  Gold %-5lu  Hp %3d(%d)  Ac %-2d  ",
!                 dlevel, u.ugold,
  #  ifdef KAA
                  u.mtimedone ? u.mh : u.uhp, u.mtimedone ? u.mhmax : u.uhpmax,
                  u.uac);
--- 386,393 ----
                  u.uhp, u.uhpmax, u.uen, u.uenmax, u.uac);
  #  endif
  # else
!                 "%d Level %-2d  Gold %-5lu  Hp %3d(%d)  Ac %-2d  ",
!                 u.uluck, dlevel, u.ugold,
  #  ifdef KAA
                  u.mtimedone ? u.mh : u.uhp, u.mtimedone ? u.mhmax : u.uhpmax,
                  u.uac);
***************
*** 397,404 ****
  # endif
  #else
  # ifdef SPELLS
!                 "Level %-2d Hp %3d(%d) Energy %3d(%d) Ac %-2d ",
!                 dlevel,
  #  ifdef KAA
                  u.mtimedone ? u.mh : u.uhp, u.mtimedone ? u.mhmax, u.uhpmax,
                  u.uen, u.uenmax, u.uac);
--- 397,404 ----
  # endif
  #else
  # ifdef SPELLS
!                 "%d Level %-2d Hp %3d(%d) Energy %3d(%d) Ac %-2d ",
!                 u.uluck, dlevel,
  #  ifdef KAA
                  u.mtimedone ? u.mh : u.uhp, u.mtimedone ? u.mhmax, u.uhpmax,
                  u.uen, u.uenmax, u.uac);
***************
*** 406,413 ****
                  u.uhp, u.uhpmax, u.uen, u.uenmax, u.uac);
  #  endif
  # else
!                 "Level %-2d   Hp %3d(%d)   Ac %-2d   ",
!                 dlevel,
  #  ifdef KAA
                  u.mtimedone ? u.mh : u.uhp, u.mtimedone ? u.mhmax, u.uhpmax,
                  u.uac);
--- 406,413 ----
                  u.uhp, u.uhpmax, u.uen, u.uenmax, u.uac);
  #  endif
  # else
!                 "%d Level %-2d   Hp %3d(%d)   Ac %-2d   ",
!                 u.uluck, dlevel,
  #  ifdef KAA
                  u.mtimedone ? u.mh : u.uhp, u.mtimedone ? u.mhmax, u.uhpmax,
                  u.uac);
diff -sct old/prisym.c ./prisym.c
*** old/prisym.c	Sat Dec  5 11:37:42 1987
--- ./prisym.c	Mon Dec 28 19:05:51 1987
***************
*** 101,108 ****
          }
  }
  
! curs_on_u(){
!         curs(u.ux, u.uy+2);
  }
  
  pru()
--- 101,109 ----
          }
  }
  
! curs_on_u()
! {
!         curs(u.ux, u.uy + 2);
  }
  
  pru()
diff -sct old/read.c ./read.c
*** old/read.c	Wed Dec  2 21:58:08 1987
--- ./read.c	Mon Dec 28 19:05:51 1987
***************
*** 43,49 ****
            pline("As you read the scroll, it disappears.");
          if(confused) {
            if (Hallucination)
!               pline("Being so trippy, you screw up ... ");
            else
                pline("Being confused, you mispronounce the magic words ... ");
          }
--- 43,49 ----
            pline("As you read the scroll, it disappears.");
          if(confused) {
            if (Hallucination)
!               pline("Being tripped out, you screw up ... ");
            else
                pline("Being confused, you mispronounce the magic words ... ");
          }
Files old/rip.c and ./rip.c are identical
Files old/rm.h and ./rm.h are identical
Files old/rnd.c and ./rnd.c are identical
Only in .: rumors.bas
Only in old: rumors.base
Files old/rumors.c and ./rumors.c are identical
Files old/rumors.kaa and ./rumors.kaa are identical
Files old/rumors.mrx and ./rumors.mrx are identical
diff -sct old/save.c ./save.c
*** old/save.c	Wed Dec  2 22:14:32 1987
--- ./save.c	Mon Dec 28 19:05:52 1987
***************
*** 369,398 ****
                  if(!mtmp->m_id)
                          mtmp->m_id = flags.ident++;
                  monsindex = *((int *)&mtmp->data);
!                 if (monsindex == (mi = -1))     /* Special fake index */
                          mtmp->data = &li_dog;
!                 else if (monsindex == --mi)     /* Special fake index */
                          mtmp->data = &dog;
!                 else if (monsindex == --mi)     /* Special fake index */
                          mtmp->data = &la_dog;
  #ifdef KAA
!                 else if (monsindex == --mi)
                          mtmp->data = &hell_hound;
  # ifdef HARD
!                 else if (monsindex == --mi)
                          mtmp->data = &d_lord;
  
!                 else if (monsindex == --mi)
                          mtmp->data = &d_prince;
  # endif
  # ifdef KJSMODS
!                 else if (monsindex == --mi)
                          mtmp->data = &pm_guard;
  
!                 else if (monsindex == --mi)
                          mtmp->data = &pm_ghost;
  
!                 else if (monsindex == --mi)
                          mtmp->data = &pm_eel;
  # endif
  #endif
--- 369,398 ----
                  if(!mtmp->m_id)
                          mtmp->m_id = flags.ident++;
                  monsindex = *((int *)&mtmp->data);
!                 if (monsindex == -1)    /* Special fake index */
                          mtmp->data = &li_dog;
!                 else if (monsindex == -2)       /* Special fake index */
                          mtmp->data = &dog;
!                 else if (monsindex == -3)       /* Special fake index */
                          mtmp->data = &la_dog;
  #ifdef KAA
!                 else if (monsindex == -4)
                          mtmp->data = &hell_hound;
  # ifdef HARD
!                 else if (monsindex == -5)
                          mtmp->data = &d_lord;
  
!                 else if (monsindex == -6)
                          mtmp->data = &d_prince;
  # endif
  # ifdef KJSMODS
!                 else if (monsindex == -7)
                          mtmp->data = &pm_guard;
  
!                 else if (monsindex == -8)
                          mtmp->data = &pm_ghost;
  
!                 else if (monsindex == -9)
                          mtmp->data = &pm_eel;
  # endif
  #endif
Files old/search.c and ./search.c are identical
diff -sct old/shk.c ./shk.c
*** old/shk.c	Wed Dec  2 15:53:26 1987
--- ./shk.c	Mon Dec 28 19:05:54 1987
***************
*** 547,552 ****
--- 547,553 ----
  addtobill(obj) register struct obj *obj; {
  register struct bill_x *bp;
  char    buf[40];
+ extern char *typename(int);
          if(!inshop() ||
          (u.ux == ESHK(shopkeeper)->shk.x && u.uy == ESHK(shopkeeper)->shk.y) ||
          (u.ux == ESHK(shopkeeper)->shd.x && u.uy == ESHK(shopkeeper)->shd.y) ||
Files old/shknam.c and ./shknam.c are identical
diff -sct old/sit.c ./sit.c
*** old/sit.c	Sat Dec  5 11:39:30 1987
--- ./sit.c	Mon Dec 28 19:05:54 1987
***************
*** 133,139 ****
                  if (!rn2(3) && IS_THRONE(levl[u.ux][u.uy].typ)) {
  
                          pline("The throne vanishes in a puff of logic.");
! /*                      levl[u.ux][u.uy].scrsym = ROOM_SYM; */
                          levl[u.ux][u.uy].typ = ROOM;
                  }
  
--- 133,139 ----
                  if (!rn2(3) && IS_THRONE(levl[u.ux][u.uy].typ)) {
  
                          pline("The throne vanishes in a puff of logic.");
!                         levl[u.ux][u.uy].scrsym = ROOM_SYM;
                          levl[u.ux][u.uy].typ = ROOM;
                  }
  
diff -sct old/spell.c ./spell.c
*** old/spell.c	Wed Dec  2 22:14:46 1987
--- ./spell.c	Mon Dec 28 19:05:55 1987
***************
*** 29,35 ****
              return(0);
          }
          booktype = book->otyp;
!         oops = !rn2(u.ulevel - objects[booktype].spl_lev + 7);
          switch(booktype)  {
  
  /* level 1 spells */
--- 29,35 ----
              return(0);
          }
          booktype = book->otyp;
!         oops = !rn2(u.ulevel + u.uluck + 7 - objects[booktype].spl_lev);
          switch(booktype)  {
  
  /* level 1 spells */
***************
*** 305,311 ****
--- 305,315 ----
                          mtmp = makedog();
                          if(mtmp) {
                                  /* make it into something else */
+ #ifndef RPH
                                  (void) newcham(mtmp, &mons[dlevel+14+rn2(CMNUM-14-dlevel)]);
+ #else
+                                 (void) newcham(mtmp, (struct permonst *) 0);
+ #endif  /* RPH */
                                  if(confused)
                                          mtmp->mtame = mtmp->mpeaceful = 0;
                          }
Files old/spell.h and ./spell.h are identical
Files old/steal.c and ./steal.c are identical
Only in .: termcap
Only in old: termcap.arc
diff -sct old/termcap.c ./termcap.c
*** old/termcap.c	Sat Dec  5 11:37:46 1987
--- ./termcap.c	Mon Dec 28 19:05:55 1987
***************
*** 3,14 ****
  
  #include <stdio.h>
  #include <ctype.h>      /* for isdigit() */
  #include "hack.h"       /* for ROWNO, COLNO, *HI, *HE */
  #ifdef GENIX
  #define void    int     /* jhn - mod to prevent compiler from bombing */
  #endif
  
! extern char *tgetstr(), *tgoto(), *getenv();
  extern long *alloc();
  
  #ifndef TERMINFO
--- 3,17 ----
  
  #include <stdio.h>
  #include <ctype.h>      /* for isdigit() */
+ #ifdef MSDOS
+ #include <termcap.h>
+ #endif
  #include "hack.h"       /* for ROWNO, COLNO, *HI, *HE */
  #ifdef GENIX
  #define void    int     /* jhn - mod to prevent compiler from bombing */
  #endif
  
! extern char *getenv();
  extern long *alloc();
  
  #ifndef TERMINFO
***************
*** 25,31 ****
  char *CD;               /* tested in pri.c: docorner() */
  int CO, LI;             /* used in pri.c and whatis.c */
  
! #ifdef MSDOS
  static char tgotobuf[20];
  #define tgoto(fmt, x, y)        (sprintf(tgotobuf, fmt, y+1, x+1), tgotobuf)
  #endif /* MSDOS /**/
--- 28,34 ----
  char *CD;               /* tested in pri.c: docorner() */
  int CO, LI;             /* used in pri.c and whatis.c */
  
! #if defined(MSDOS) && defined(UNDEF)
  static char tgotobuf[20];
  #define tgoto(fmt, x, y)        (sprintf(tgotobuf, fmt, y+1, x+1), tgotobuf)
  #endif /* MSDOS /**/
***************
*** 32,38 ****
  
  startup()
  {
! #ifdef MSDOS
          HO = "\033[H";
          CL = "\033[2J";
          CE = "\033[K";
--- 35,41 ----
  
  startup()
  {
! #if defined(MSDOS) && defined(UNDEF)
          HO = "\033[H";
          CL = "\033[2J";
          CE = "\033[K";
***************
*** 175,180 ****
--- 178,187 ----
  
          if (y == cury && x == curx)
                  return;
+ #ifdef  MSDOS
+         cmov(x, y);
+         return;
+ #endif  /* MSDOS */
          if(!ND && (curx != x || x <= 3)) {      /* Extremely primitive */
                  cmov(x, y);                     /* bunker!wtm */
                  return;
Only in old: termcap.cnf
Files old/timeout.c and ./timeout.c are identical
Files old/topl.c and ./topl.c are identical
Files old/topten.c and ./topten.c are identical
Files old/track.c and ./track.c are identical
Files old/trap.c and ./trap.c are identical
Files old/trap.h and ./trap.h are identical
Files old/u_init.c and ./u_init.c are identical
Only in old: unixmain.c
Only in old: unixtty.c
Only in old: unixunix.c
Files old/vault.c and ./vault.c are identical
Files old/version.c and ./version.c are identical
Files old/wield.c and ./wield.c are identical
Files old/wizard.c and ./wizard.c are identical
Files old/worm.c and ./worm.c are identical
Files old/worn.c and ./worn.c are identical
Files old/write.c and ./write.c are identical
Files old/wseg.h and ./wseg.h are identical
diff -sct old/you.h ./you.h
*** old/you.h	Sat Dec  5 11:39:38 1987
--- ./you.h	Mon Dec 28 19:06:00 1987
***************
*** 79,85 ****
  #define Blindfolded     u.uprops[BLINDFOLDED].p_flgs
  #define Blind           (Blinded || Blindfolded)
  #define PROP(x) (x-RIN_ADORNMENT)       /* convert ring to index in uprops */
!         struct prop uprops[LAST_RING+11];
  
          unsigned umconf;
          char *usick_cause;
--- 79,85 ----
  #define Blindfolded     u.uprops[BLINDFOLDED].p_flgs
  #define Blind           (Blinded || Blindfolded)
  #define PROP(x) (x-RIN_ADORNMENT)       /* convert ring to index in uprops */
!         struct prop uprops[LAST_RING+12];
  
          unsigned umconf;
          char *usick_cause;
Files old/zap.c and ./zap.c are identical