/*	SCCS Id: @(#)global.h	3.4	2003/08/31	*/
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed.  See license for details. */

#ifndef GLOBAL_H
#define GLOBAL_H

#include <stdio.h>

/* #define ALPHA */	/* if an alpha-test copy */
/* #define BETA */	/* if an alpha- or beta-test copy */
/* #define OBJ_SANITY *//* Object sanity checks for all players */

/*
 * Files expected to exist in the playground directory if file areas are not
 * enabled and in the named areas otherwise.
 * [WAC] - put a NH_ prefix on all the names to prevent conflicts
 */

#define NH_RECORD		"record"  /* a file containing list of topscorers */
#define NH_RECORD_AREA	FILE_AREA_VAR
#define NH_HELP		"help"	  /* a file containing command descriptions */
#define NH_HELP_AREA	FILE_AREA_SHARE
#define NH_SHELP		"hh"		/* abbreviated form of the same */
#define NH_SHELP_AREA	FILE_AREA_SHARE
#define NH_DEBUGHELP	"wizhelp"	/* a file containing debug mode cmds */
#define NH_DEBUGHELP_AREA	FILE_AREA_SHARE
#define NH_RUMORFILE	"rumors"	/* a file with fortune cookies */
#define NH_RUMORAREA	FILE_AREA_SHARE
#define NH_ORACLEFILE	"oracles"	/* a file with oracular information */
#define NH_ORACLEAREA	FILE_AREA_SHARE
#define NH_DATAFILE	"data"	/* a file giving the meaning of symbols used */
#define NH_DATAAREA	FILE_AREA_SHARE
#define NH_CMDHELPFILE	"cmdhelp"	/* file telling what commands do */
#define NH_CMDHELPAREA	FILE_AREA_SHARE
#define NH_HISTORY		"history"	/* a file giving nethack's history */
#define NH_HISTORY_AREA	FILE_AREA_SHARE
#define NH_LICENSE		"license"	/* file with license information */
#define NH_LICENSE_AREA	FILE_AREA_DOC
#define NH_OPTIONFILE	"opthelp"	/* a file explaining runtime options */
#define NH_OPTIONAREA	FILE_AREA_SHARE
#define NH_OPTIONS_USED	"options"	/* compile-time options, for #version */
#define NH_OPTIONS_USED_AREA FILE_AREA_SHARE
#ifdef SHORT_FILENAMES
# define NH_GUIDEBOOK       "guideboo.txt"        /* Nethack Guidebook*/
#else
#define NH_GUIDEBOOK       "Guidebook.txt"       /* Nethack Guidebook*/
#endif
#define NH_GUIDEBOOK_AREA	FILE_AREA_DOC

#define LEV_EXT	".lev"		/* extension for special level files */


/* Assorted definitions that may depend on selections in config.h. */

/*
 * for DUMB preprocessor and compiler, e.g., cpp and pcc supplied
 * with Microport SysV/AT, which have small symbol tables;
 * DUMB if needed is defined in CFLAGS
 */
#ifdef DUMB
#ifdef BITFIELDS
#undef BITFIELDS
#endif
#ifndef STUPID
#define STUPID
#endif
#endif	/* DUMB */

/*
 * type xchar: small integers in the range 0 - 127, usually coordinates
 * although they are nonnegative they must not be declared unsigned
 * since otherwise comparisons with signed quantities are done incorrectly
 */
typedef schar	xchar;
#ifndef SKIP_BOOLEAN
typedef xchar	boolean;		/* 0 or 1 */
#endif

#ifndef TRUE		/* defined in some systems' native include files */
#define TRUE	((boolean)1)
#define FALSE	((boolean)0)
#endif

#ifndef STRNCMPI
# if !defined(__SASC_60) && !defined(__MINGW32__) /* SAS/C already shifts to stricmp */
#  define strcmpi(a,b) strncmpi((a),(b),-1)
# endif
#endif

/* comment out to test effects of each #define -- these will probably
 * disappear eventually
 */
#ifdef INTERNAL_COMP
# define RLECOMP	/* run-length compression of levl array - JLee */
# define ZEROCOMP	/* zero-run compression of everything - Olaf Seibert */
#endif

/* #define SPECIALIZATION */	/* do "specialized" version of new topology */


#ifdef BITFIELDS
#define Bitfield(x,n)	unsigned x:n
#else
#define Bitfield(x,n)	uchar x
#endif

#ifdef UNWIDENED_PROTOTYPES
# define CHAR_P char
# define SCHAR_P schar
# define UCHAR_P uchar
# define XCHAR_P xchar
# define SHORT_P short
#ifndef SKIP_BOOLEAN
# define BOOLEAN_P boolean
#endif
# define ALIGNTYP_P aligntyp
#else
# ifdef WIDENED_PROTOTYPES
#  define CHAR_P int
#  define SCHAR_P int
#  define UCHAR_P int
#  define XCHAR_P int
#  define SHORT_P int
#  define BOOLEAN_P int
#  define ALIGNTYP_P int
# endif
#endif
#if defined(ULTRIX_PROTO) && !defined(__STDC__)
/* The ultrix 2.0 and 2.1 compilers (on Ultrix 4.0 and 4.2 respectively) can't
 * handle "struct obj *" constructs in prototypes.  Their bugs are different,
 * but both seem to work if we put "void*" in the prototype instead.  This
 * gives us minimal prototype checking but avoids the compiler bugs.
 *
 * OBJ_P and MONST_P should _only_ be used for declaring function pointers.
 */
#define OBJ_P void*
#define MONST_P void*
#else
#define OBJ_P struct obj*
#define MONST_P struct monst*
#endif

#define SIZE(x)	(int)(sizeof(x) / sizeof(x[0]))


/* A limit for some NetHack int variables.  It need not, and for comparable
 * scoring should not, depend on the actual limit on integers for a
 * particular machine, although it is set to the minimum required maximum
 * signed integer for C (2^15 -1).
 */
#define LARGEST_INT	32767


#ifdef REDO
#define Getchar pgetchar
#endif


#include "coord.h"
/*
 * Automatic inclusions for the subsidiary files.
 * Please don't change the order.  It does matter.
 */

#ifdef VMS
#include "vmsconf.h"
#endif

#ifdef UNIX
#include "unixconf.h"
#endif

#ifdef OS2
#include "os2conf.h"
#endif

#ifdef MSDOS
#include "pcconf.h"
#endif

#ifdef TOS
#include "tosconf.h"
#endif

#ifdef AMIGA
#include "amiconf.h"
#endif

#ifdef MAC
#include "macconf.h"
#endif

#ifdef __BEOS__
#include "beconf.h"
#endif

#ifdef WIN32
#ifdef WIN_CE
#include "wceconf.h"
#else
#include "ntconf.h"
#endif
#endif

#ifndef FILE_AREAS

#define fopen_datafile_area(area, filename, mode, use_spfx) \
 		fopen_datafile(filename, mode, use_spfx)
#define lock_file_area(area, filename, prefix, retryct) \
 		lock_file(filename, prefix, retryct)
#define unlock_file_area(area, filename) unlock_file(filename)
#define dlb_fopen_area(area, name, mode) dlb_fopen(name, mode)

/*
 * ALI
 *
 * By defining these, functions can pass them around even though they're
 * not actually used. This can make the code easier to read at the cost
 * of some efficiency. Given the high overhead of dealing with files anyway,
 * this is often a good trade-off.
 */

#define FILE_AREA_VAR		NULL
#define FILE_AREA_SAVE		NULL
#define FILE_AREA_LEVL		NULL
#define FILE_AREA_BONES		NULL
#define FILE_AREA_SHARE		NULL
#define FILE_AREA_UNSHARE	NULL

#endif

/* Displayable name of this port; don't redefine if defined in *conf.h */
#ifndef PORT_ID
# ifdef AMIGA
#  define PORT_ID	"Amiga"
# endif
# ifdef MAC
#  define PORT_ID	"Mac"
#  if 0
#  ifdef MAC_MPW_PPC
#   define PORT_SUB_ID "PPC"
#  else
#   ifdef MAC_MPW_68K
#    define PORT_SUB_ID "68K"
#   endif
#  endif
#  endif
# endif
# ifdef MSDOS
#  ifdef PC9800
#  define PORT_ID	"PC-9800"
#  else
#  define PORT_ID	"PC"
#  endif
#  ifdef DJGPP
#  define PORT_SUB_ID	"djgpp"
#  else
#   ifdef OVERLAY
#  define PORT_SUB_ID	"overlaid"
#   else
#  define PORT_SUB_ID	"non-overlaid"
#   endif
#  endif
# endif
# ifdef OS2
#  define PORT_ID	"OS/2"
# endif
# ifdef TOS
#  define PORT_ID	"ST"
# endif
# ifdef UNIX
#  define PORT_ID	"Unix"
# endif
# ifdef VMS
#  define PORT_ID	"VMS"
# endif
# ifdef WIN32
#  define PORT_ID	"Windows"
#  ifndef PORT_SUB_ID
#   if defined(MSWIN_GRAPHICS) || defined(GTK_GRAPHICS)
#    define PORT_SUB_ID	"graphical"
#   else
#    define PORT_SUB_ID	"tty"
#   endif
#  endif
# endif
#endif

#if defined(MICRO)
#if !defined(AMIGA) && !defined(TOS) && !defined(OS2_HPFS)
#define SHORT_FILENAMES		/* filenames are 8.3 */
#endif
#endif

#ifdef VMS
/* vms_exit() (sys/vms/vmsmisc.c) expects the non-VMS EXIT_xxx values below.
 * these definitions allow all systems to be treated uniformly, provided
 * main() routines do not terminate with return(), whose value is not
 * so massaged.
 */
# ifdef EXIT_SUCCESS
#  undef EXIT_SUCCESS
# endif
# ifdef EXIT_FAILURE
#  undef EXIT_FAILURE
# endif
#endif

#ifndef EXIT_SUCCESS
# define EXIT_SUCCESS 0
#endif
#ifndef EXIT_FAILURE
# define EXIT_FAILURE 1
#endif

#if defined(X11_GRAPHICS) || defined(QT_GRAPHICS) || defined(GNOME_GRAPHICS) || defined(MSWIN_GRAPHICS)
# ifndef USE_TILES
#  define USE_TILES		/* glyph2tile[] will be available */
# endif
#endif
#if defined(AMII_GRAPHICS) || defined(GEM_GRAPHICS) || defined(GTK_GRAPHICS)
# ifndef USE_TILES
#  define USE_TILES
# endif
#endif
#if defined(GL_GRAPHICS) || defined(SDL_GRAPHICS)
# ifndef USE_TILES
#  define USE_TILES
# endif
#endif

#define Sprintf  (void) sprintf
#define Strcat   (void) strcat
#define Strcpy   (void) strcpy
#ifdef NEED_VARARGS
#define Vprintf  (void) vprintf
#define Vfprintf (void) vfprintf
#define Vsprintf (void) vsprintf
#endif


/* primitive memory leak debugging; see alloc.c */
#ifdef MONITOR_HEAP
extern long *FDECL(nhalloc, (unsigned int,const char *,int));
extern void FDECL(nhfree, (genericptr_t,const char *,int));
#ifdef INTERNAL_MALLOC
extern void FDECL(monitor_heap_push, (const char *, int));
extern unsigned long FDECL(monitor_heap_pop, (const char *, int, unsigned long));
extern void FDECL(monitor_heap_set_subid, (const char *, int ));
extern size_t NDECL(monitor_heap_getmem);
extern boolean FDECL(monitor_heap_trace, (boolean flag));
extern void NDECL(monitor_heap_mark);
#endif
# ifndef __FILE__
#  define __FILE__ ""
# endif
# ifndef __LINE__
#  define __LINE__ 0
# endif
# define alloc(a) nhalloc(a,__FILE__,(int)__LINE__)
# define free(a) nhfree(a,__FILE__,(int)__LINE__)
#else	/* !MONITOR_HEAP */
extern long *FDECL(alloc, (unsigned int));		/* alloc.c */
#endif

/* Used for consistency checks of various data files; declare it here so
   that utility programs which include config.h but not hack.h can see it. */
struct version_info {
	unsigned long	incarnation;	/* actual version number */
	unsigned long	feature_set;	/* bitmask of config settings */
	unsigned long	entity_count;	/* # of monsters and objects */
	unsigned long	struct_sizes;	/* size of key structs */
};

/*
 * Configurable internal parameters.
 *
 * Please be very careful if you are going to change one of these.  Any
 * changes in these parameters, unless properly done, can render the
 * executable inoperative.
 */

/* size of terminal screen is (at least) (ROWNO+3) by COLNO */
#define COLNO	80
#define ROWNO	21

#define MAXNROFROOMS	40	/* max number of rooms per level */
#define MAX_SUBROOMS	24	/* max # of subrooms in a given room */
#define DOORMAX		120	/* max number of doors per level */

#define BUFSZ		256	/* for getlin buffers */
#define QBUFSZ		128	/* for building question text */
#define TBUFSZ		300	/* toplines[] buffer max msg: 3 81char names */
				/* plus longest prefix plus a few extra words */

#define PL_NSIZ		32	/* name of player, ghost, shopkeeper */
#define PL_CSIZ		32	/* sizeof pl_character */
#define PL_FSIZ		32	/* fruit name */
#define PL_PSIZ		63	/* player-given names for pets, other
				 * monsters, objects */

#define MAXDUNGEON	32	/* current maximum number of dungeons */
#define MAXLEVEL	50	/* max number of levels in one dungeon */
#define MAXSTAIRS	1	/* max # of special stairways in a dungeon */
#define ALIGNWEIGHT	10	/* generation weight of alignment */

#define MAXULEV		30	/* max character experience level */

#define MAXMONNO	120	/* extinct monst after this number created */
#define MHPMAX		500	/* maximum monster hp */

#endif /* GLOBAL_H */
