🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

1 total messages Started by Tim Iverson Wed, 30 Dec 1987 04:51
Fixes for nethack on MS-DOS using MSC4.0
#92
Author: Tim Iverson
Date: Wed, 30 Dec 1987 04:51
2029 lines
71995 bytes

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
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads