/* NetHack 3.6	vmsconf.h	$NHDT-Date: 1555361299 2019/04/15 20:48:19 $  $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.30 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/*-Copyright (c) Robert Patrick Rankin, 2011. */
/* NetHack may be freely redistributed.  See license for details. */

#ifdef VMS
#ifndef VMSCONF_H
#define VMSCONF_H

/*
 * Edit these to choose values appropriate for your site.
 * WIZARD is the username allowed to use the debug option of nethack; no harm
 *   is done by leaving it as a username that doesn't exist at your site.
 * HACKDIR can be overridden at run-time with the logical name HACKDIR, as in
 *   $ define hackdir disk$users:[games.nethack]
 * Trailing NULs are present in the default values in order to make some
 *   extra room for patching longer values into an existing executable.
 */
#define Local_WIZARD "NHWIZARD\0\0\0\0"
#define Local_HACKDIR "DISK$USERS:[GAMES.NETHACK.3_5_X.PLAY]\0\0\0\0\0\0\0\0"

/*
 * This section cleans up the stuff done in config.h so that it
 * shouldn't need to be modified.  It's conservative so that if
 * config.h is actually edited, the changes won't impact us.
 */
#ifdef UNIX
#undef UNIX
#endif
#ifdef HACKDIR
#undef HACKDIR
#endif
#ifdef WIZARD_NAME
#undef WIZARD_NAME
#endif
#define HACKDIR Local_HACKDIR
#define WIZARD_NAME Local_WIZARD
#ifndef SYSCF
#define SYSCF
#endif

/* filenames require punctuation to avoid redirection via logical names */
#undef RECORD
#define RECORD "record;1" /* scoreboard file (retains high scores) */
#undef LOGFILE
#define LOGFILE "logfile;0" /* optional file (records all games) */
#undef SYSCF_FILE
#define SYSCF_FILE "sysconf;0"

#define HLOCK "perm;1" /* an empty file used for locking purposes */

/* want compression--for level & save files--performed within NetHack itself
 */
#ifdef COMPRESS
#undef COMPRESS
#endif
#ifndef INTERNAL_COMP
#define INTERNAL_COMP
#endif

/*
 * If nethack.exe will be installed with privilege so that the playground
 * won't need to be left unprotected, define SECURE to suppress a couple
 * of file protection fixups (protection of bones files and ownership of
 * save files).
 */
/* #define SECURE */

/*
 * If you use SECURE you'll need to link /noTraceback, in which case
 * there's no point trying to get extra PANICTRACE info and this might
 * as well be commented out.  When enabled, the sysconf file controls
 * how to handle it (note that we're hijacking the Unix GDB setting):
PANICTRACE_GDB=0  #behave as if PANICTRACE was disabled
PANICTRACE_GDB=1  #at conclusion of panic, show a call traceback and exit
PANICTRACE_GDB=2  #at conclusion of panic, show a call traceback and then
 *                # remain in the debugger for more interactive debugging
 *                # (not as useful as it might sound since we're normally
 *                # linked /noDebug so there's no symbol table accessible)
 */
#define PANICTRACE

/*
 * Put the readonly data files into a single container rather than into
 * separate files in the playground directory.
 */
#define DLB /* use data librarian code */

/*
 * Provide menu of saved games to choose from at start.
 * [Player needs to use ``nethack "-ugames"'' for this to work.]
 */
#define SELECTSAVED

/*
 * You may define TEXTCOLOR if your system has any terminals that recognize
 * ANSI color sequences of the form ``<ESCAPE>[#;#m'', where the first # is
 * a number between 40 and 47 represented background color, and the second
 * # is a number between 30 and 37 representing the foreground color.
 * GIGI terminals and DECterm windows on color VAXstations support these
 * color escape sequences, as do some 3rd party terminals and many micro
 * computers.
 */
/* #define TEXTCOLOR */

/*
 * If you define USE_QIO_INPUT, then you'll get raw characters from the
 * keyboard, not unlike those of the unix version of Nethack.  This will
 * allow you to use the Escape key in normal gameplay, and the appropriate
 * control characters in Wizard mode.  It will work most like the unix
 * version.
 * It will also avoid "<interrupt>" being displayed when ^Y is pressed.
 *
 * Otherwise, the VMS SMG calls will be used.  These calls block use of
 * the escape key, as well as certain control keys, so gameplay is not
 * the same, although the differences are fairly negligible.  You must
 * then use a VTxxx function key or two <escape>s to give an ESC response.
 */
#define USE_QIO_INPUT /* use SYS$QIOW instead of SMG$READ_KEYSTROKE */

/*
 * Allow the user to decide whether to pause via timer or excess screen
 * output for various display effects like explosions and moving objects.
 */
#define TIMED_DELAY /* enable the `timed_delay' run-time option */

/*
 * If you define MAIL, then NetHack will capture incoming broadcast
 * messages such as "New mail from so-and-so" and "Print job completed,"
 * and then deliver them to the player.  For mail and phone broadcasts
 * a scroll of mail will be created, which when read will cause NetHack
 * to prompt the player for a command to spawn in order to respond.  The
 * latter capability will not be available if SHELL is disabled below.
 * If you undefine MAIL, broadcasts will go straight to the terminal,
 * resulting in disruption of the screen display; use <ctrl/R> to redraw.
 */
#define MAIL /* enable broadcast trapping */

/*
 * SHELL enables the player to 'escape' into a spawned subprocess via
 * the '!' command.  Logout or attach back to the parent to resume play.
 * If the player attaches back to NetHack, then a subsequent escape will
 * re-attach to the existing subprocess.  Any such subprocess left over
 * at game exit will be deleted by an exit handler.
 * SUSPEND enables someone running NetHack in a subprocess to reconnect
 * to the parent process with the <ctrl/Z> command; this is not very
 * close to Unix job control, but it's better than nothing.
 */
#define SHELL   /* do not delete the '!' command */
#define SUSPEND /* don't delete the ^Z command, such as it is */

/*
 * Some terminals or terminal emulators send two character sequence "ESC c"
 * when Alt+c is pressed.  The altmeta run-time option allows the user to
 * request that "ESC c" be treated as M-c, which means that if nethack sees
 * ESC when it is waiting for a command, it will wait for another character
 * (even if user intended that ESC to be standalone to cancel a count prefix).
 */
#define ALTMETA /* support altmeta run-time option */

#define RANDOM /* use sys/share/random.c instead of vaxcrtl rand */

/* config.h defines USE_ISAAC64; we'll use it on Alpha or IA64 but not VAX;
   it overrides RANDOM */
#if (defined(VAX) || defined(vax) || defined(__vax)) && defined(USE_ISAAC64)
#undef ISAAC64
#endif

#define FCMASK 0660 /* file creation mask */

/*
 * 
 */
#define NO_VSNPRINTF /* Avoid vsnprintf, use less-safe vsprintf instead. */

/*
 * The remainder of the file should not need to be changed.
 */

/* data librarian defs */
#ifdef DLB
#define DLBFILE "nh-data.dlb"
/*
 * Since we can do without case insensitive filename comparison,
 * avoid enabling it because that requires compiling and linking
 * src/hacklib into util/dlb_main.
 */
/* # define FILENAME_CMP strcmpi */ /* case insensitive */
#endif

#if defined(VAXC) && !defined(ANCIENT_VAXC)
#ifdef volatile
#undef volatile
#endif
#ifdef const
#undef const
#endif
#endif

#ifdef __DECC
#define STRICT_REF_DEF /* used in lev_main.c */
#endif
#ifdef STRICT_REF_DEF
#define DEFINE_OSPEED
#endif

#ifndef alloca
/* bison generated foo_yacc.c might try to use alloca() */
#ifdef __GNUC__
#define alloca __builtin_alloca
#else
#define ALLOCA_HACK /* used in util/panic.c */
#endif
#endif

#ifdef _DECC_V4_SOURCE
/* <types.h> excludes some necessary typedefs when _DECC_V4_SOURCE is defined
 */
#include <types.h>
#ifndef __PID_T
#define __PID_T
typedef __pid_t pid_t;
#endif
#ifndef __UID_T
#define __UID_T
typedef __uid_t uid_t;
#endif
#ifndef __GID_T
#define __GID_T
typedef __gid_t gid_t;
#endif
#ifndef __MODE_T
#define __MODE_T
typedef __mode_t mode_t;
#endif
#endif /* _DECC_V4_SOURCE */

#include <time.h>
#if 0 /* <file.h> is missing for old gcc versions; skip it to save time */
#include <file.h>
#else /* values needed from missing include file */
#define O_RDONLY 0
#define O_WRONLY 1
#define O_RDWR 2
#define O_CREAT 0x200
#define O_TRUNC 0x400
#endif

#define tgetch vms_getchar

#if defined(__DECC_VER) && (__DECC_VER >= 50000000)
 /* for cc/Standard=ANSI89, suppress notification that '$' in identifiers
    is an extension; sys/vms/*.c needs it regardless of strict ANSI mode */
# pragma message disable DOLLARID
#endif

#include "system.h"

#define index strchr
#define rindex strrchr

/* Use the high quality random number routines. */
#ifndef USE_ISAAC64
# if defined(RANDOM)
#  define Rand() random()
/* VMS V7 adds these entry points to DECC$SHR; stick with the nethack-supplied
   code to avoid having to deal with version-specific conditionalized builds */
#  define random nh_random
#  define srandom nh_srandom
#  define initstate nh_initstate
#  define setstate nh_setstate
# else
#  define Rand() rand()
# endif
#endif

#ifndef __GNUC__
#ifndef bcopy
#define bcopy(s, d, n) memcpy((d), (s), (n)) /* vaxcrtl */
#endif
#endif
#define abort() vms_abort()             /* vmsmisc.c */
#define creat(f, m) vms_creat(f, m)     /* vmsfiles.c */
#define exit(sts) vms_exit(sts)         /* vmsmisc.c */
#define getuid() vms_getuid()           /* vmsunix.c */
#define link(f1, f2) vms_link(f1, f2)   /* vmsfiles.c */
#define open(f, k, m) vms_open(f, k, m) /* vmsfiles.c */
#define fopen(f, m) vms_fopen(f, m)     /* vmsfiles.c */
/* #define unlink(f0) vms_unlink(f0)       /* vmsfiles.c */
#ifdef VERYOLD_VMS
#define unlink(f0) delete (f0) /* vaxcrtl */
#else
#define unlink(f0) remove(f0) /* vaxcrtl, decc$shr */
#endif
#define C$$TRANSLATE(n) c__translate(n) /* vmsfiles.c */

/* VMS global names are case insensitive... */
#define An vms_an
#define The vms_the
#define Shk_Your vms_shk_your

/* avoid global symbol in Alpha/VMS V1.5 STARLET library (link trouble) */
#define ospeed vms_ospeed

/* used in several files which don't #include "extern.h" */
extern void FDECL(vms_exit, (int));
extern int FDECL(vms_open, (const char *, int, unsigned));
extern FILE *FDECL(vms_fopen, (const char *, const char *));
char *FDECL(vms_basename, (const char *)); /* vmsfiles.c */

#endif /* VMSCONF_H */
#endif /* VMS */
