/* * File: AppHdr.h * Summary: Precompiled header used by Crawl. * Written by: Jesse Jones * * Abstract: CodeWarrior and MSVC both support precompiled headers which can * significantly speed up compiles. Unlike CodeWarrior MSVC imposes * some annoying restrictions on precompiled headers: the precompiled * header *must* be the first include in all cc files. Any includes or * other statements that occur before the pch include are ignored. This * is really stupid and can lead to bizarre errors, but it does mean * that we shouldn't run into any problems on systems without precompiled * headers. * * Copyright © 1999 Jesse Jones. */ #ifndef APPHDR_H #define APPHDR_H #include "platform.h" #ifdef TARGET_COMPILER_VC /* Disable warning about: 4290: the way VC handles the throw() specifier 4267: "possible loss of data" when switching data types without a cast */ #pragma warning (disable: 4290 4267) /* Don't define min and max as macros, define them via STL */ #define NOMINMAX #endif // The maximum memory that the user-script Lua interpreter can // allocate, in kilobytes. This limit is enforced to prevent // badly-written or malicious user scripts from consuming too much // memory. // #define CLUA_MAX_MEMORY_USE (2 * 1024) // Enable support for Unicode character glyphs. Note that this needs // to be accompanied by changes to linker and compiler options and may // not be available on all platforms. In most cases you want to set // this option from your makefile, not directly in AppHdr.h (See // INSTALL for more details.) // // #define UNICODE_GLYPHS // Uncomment to prevent Crawl from looking for a list of saves when // asking the player to enter a name. This can speed up startup // considerably if you have a lot of saves lying around (even more so // if the saves are zipped). // // #define DISABLE_SAVEGAME_LISTS // Uncomment to prevent Crawl from remembering startup preferences. // // #define DISABLE_STICKY_STARTUP_OPTIONS // // Define 'UNIX' if the target OS is UNIX-like. // #if defined(TARGET_OS_MACOSX) || defined(TARGET_OS_LINUX) || \ defined(TARGET_OS_FREEBSD) || defined(TARGET_OS_NETBSD) || \ defined(TARGET_OS_OPENBSD) || defined(TARGET_COMPILER_CYGWIN) || \ defined(TARGET_OS_SOLARIS) #ifndef UNIX #define UNIX #endif #endif // // OS X's Terminal.app has color handling problems; dark grey is // especially bad, so we'll want to remap that. OS X is otherwise // Unix-ish, so we shouldn't need other special handling. // #define COL_TO_REPLACE_DARKGREY BLUE // // MinGW // #if defined(TARGET_COMPILER_MINGW) #ifndef REGEX_PCRE #define REGEX_PCRE #endif #endif // ========================================================================= // System Defines // ========================================================================= // Define plain_term for Unix and dos_term for DOS. #ifdef UNIX // Uncomment if you're running Crawl with dgamelaunch and have // problems viewing games in progress. This affects how Crawl // clears the screen (see DGL_CLEAR_SCREEN) below. // // #define DGAMELAUNCH #ifndef TARGET_COMPILER_MINGW #define MULTIUSER #define USE_UNIX_SIGNALS #endif // If this is defined, Crawl will attempt to save and exit when it // receives a hangup signal. #define SIGHUP_SAVE #define FILE_SEPARATOR '/' #define CHARACTER_SET 0 #ifndef USE_TILE #define USE_ASCII_CHARACTERS #define USE_CURSES #endif #define EOL "\n" // Unix builds use curses/ncurses, which supports colour. // // This will allow using the standout attribute in curses to // mark friendly monsters... results depend on the type of // term used... under X Windows try "rxvt". #define USE_COLOUR_OPTS // More sophisticated character handling #define CURSES_USE_KEYPAD // How long (milliseconds) curses should wait for additional characters // after seeing an Escape (0x1b) keypress. May not be available on all // curses implementations. #define CURSES_SET_ESCDELAY 20 // Use this to seed the PRNG with a bit more than just time()... turning // this off is perfectly okay, the game just becomes more exploitable // with a bit of hacking (ie only by people who know how). // // For now, we'll make it default to on for Linux (who should have // no problems with compiling this). #ifndef TARGET_COMPILER_MINGW #define USE_MORE_SECURE_SEED #endif // Use POSIX regular expressions #ifndef REGEX_PCRE #define REGEX_POSIX #endif // If you have libpcre, you can use that instead of POSIX regexes - // uncomment the line below and add -lpcre to your makefile. // #define REGEX_PCRE // Uncomment (and edit as appropriate) to play sounds. // // WARNING: Enabling sounds may compromise security if Crawl is installed // setuid or setgid. Filenames passed to this command *are not // validated in any way*. // // #define SOUND_PLAY_COMMAND "/usr/bin/play -v .5 %s 2>/dev/null &" // For cases when the game will be played on terms that don't support the // curses "bold == lighter" 16 colour mode. -- bwr // // Darkgrey is a particular problem in the 8 colour mode. Popular values // for replacing it around here are: WHITE, BLUE, and MAGENTA. This // option has no affect in 16 colour mode. -- bwr // // #define USE_8_COLOUR_TERM_MAP // #define COL_TO_REPLACE_DARKGREY MAGENTA #include "libunix.h" #elif defined(TARGET_OS_DOS) #define SHORT_FILE_NAMES #define EOL "\r\n" #define CHARACTER_SET A_ALTCHARSET #define FILE_SEPARATOR '\\' #include #include "libdos.h" #include #define round(x) floor((x)+0.5) // Use Perl-compatible regular expressions. libpcre must be available and // linked in. This is optional. #ifndef REGEX_PCRE #define REGEX_PCRE #endif #elif defined(TARGET_OS_WINDOWS) #if !defined(USE_TILE) #include "libw32c.h" #endif #define EOL "\n" #define CHARACTER_SET A_ALTCHARSET #define getstr(X,Y) get_console_string(X,Y) // NT and better are happy with /; I'm not sure how 9x reacts. #define FILE_SEPARATOR '/' #define ALT_FILE_SEPARATOR '\\' // Uncomment to play sounds. winmm must be linked in if this is uncommented. // #define WINMM_PLAY_SOUNDS // Use Perl-compatible regular expressions. libpcre must be available and // linked in. This is optional. #ifndef REGEX_PCRE #define REGEX_PCRE #endif #else #error Missing platform #define or unsupported compiler. #endif // ========================================================================= // Defines for dgamelaunch-specific things. // ========================================================================= #ifdef DGAMELAUNCH // DGL_CLEAR_SCREEN specifies the escape sequence to use to clear // the screen (used only when DGAMELAUNCH is defined). We make no // attempt to discover an appropriate escape sequence for the // term, assuming that dgamelaunch admins can adjust this as // needed. // // Why this is necessary: dgamelaunch's ttyplay initialises // playback by jumping to the last screen clear and playing back // from there. For that to work, ttyplay must be able to recognise // the clear screen sequence, and ncurses clear()+refresh() // doesn't do the trick. // #define DGL_CLEAR_SCREEN "\033[2J" #ifndef USE_MORE_SECURE_SEED #error DGAMELAUNCH builds should define USE_MORE_SECURE_SEED #endif // This secures the PRNG itself by hashing the values with SHA256. // It doesn't have much point if USE_MORE_SECURE_SEED is not used. // PRNG will be about 15 times slower when this is turned on, but // even with that the cpu time used by the PRNG is relatively small. #define MORE_HARDENED_PRNG // Startup preferences are saved by player name rather than uid, // since all players use the same uid in dgamelaunch. #ifndef DGL_NO_STARTUP_PREFS_BY_NAME #define DGL_STARTUP_PREFS_BY_NAME #endif // Increase the size of the topscores file for public servers. #ifndef SCORE_FILE_ENTRIES #define SCORE_FILE_ENTRIES 1000 #endif // If defined, the hiscores code dumps preformatted verbose and terse // death message strings in the logfile for the convenience of logfile // parsers. #define DGL_EXTENDED_LOGFILES // Basic messaging for dgamelaunch, based on SIMPLE_MAIL for // NetHack and Slash'EM. I'm calling this "messaging" because that's // closer to reality. #define DGL_SIMPLE_MESSAGING // How often we check for messages. This is not once per turn, but once // per player-input. Message checks are not performed if the keyboard // buffer is full, so messages should not interrupt macros. #define DGL_MESSAGE_CHECK_INTERVAL 1 // Record game milestones in an xlogfile. #define DGL_MILESTONES // Record where players are currently. #define DGL_WHEREIS // Uses -macro.txt as the macro file if uncommented. // #define DGL_NAMED_MACRO_FILE // Uses Options.macro_dir as the full path to the macro file. Mutually // exclusive with DGL_NAMED_MACRO_FILE. #define DGL_MACRO_ABSOLUTE_PATH // Makes the game ask the user to hit Enter after bailing out with // an error message. #define DGL_PAUSE_AFTER_ERROR // Enable core dumps. Note that this will not create core dumps if // Crawl is installed setuid or setgid, but dgamelaunch installs should // not be installing Crawl set[ug]id anyway. #define DGL_ENABLE_CORE_DUMP // Use UTC for dgamelaunch servers. #define TIME_FN gmtime #endif #ifndef TIME_FN #define TIME_FN localtime #endif #if defined(REGEX_POSIX) && defined(REGEX_PCRE) #error You can use either REGEX_POSIX or REGEX_PCRE, or neither, but not both. #endif #if defined(UNICODE_GLYPHS) && !defined(UNICODE_LOCALE) #define UNICODE_LOCALE "en_US.UTF-8" #endif // ========================================================================= // Debugging Defines // ========================================================================= #ifdef FULLDEBUG // Bounds checking and asserts #define DEBUG 1 // Outputs many "hidden" details, defaults to wizard on. #define DEBUG_DIAGNOSTICS 1 // Scan for bad items before every input (may be slow) // // This function might slow things down quite a bit // on slow machines because it's going to go through // every item on the level and do string comparisons // against the name. Still, it is nice to know the // turn in which "bad" items appear. #define DEBUG_ITEM_SCAN 1 #define DEBUG_MONS_SCAN 1 #endif #ifdef _DEBUG // this is how MSVC signals a debug build #define DEBUG 1 #else // #define DEBUG 0 // leave this undefined for those lamers who use #ifdef #endif #ifdef DEBUG #if __MWERKS__ #define MSIPL_DEBUG_MODE #endif #else #if !defined(NDEBUG) #define NDEBUG // used by #endif #endif #ifdef USE_TILE #ifdef __cplusplus #include "libgui.h" #include "tilesdl.h" #endif #endif // ========================================================================= // Lua user scripts (NOTE: this may also be enabled in your makefile!) // ========================================================================= // // Enables Crawl's Lua bindings for user scripts. See the section on // Lua in INSTALL for more information. NOTE: CLUA_BINDINGS is enabled // by default in all standard makefiles. Commenting it out here may // not be sufficient to disable user-Lua - you must also check your // makefile and remove -DCLUA_BINDINGS. You can use V in-game to check // whether user-scripts are enabled. // // #define CLUA_BINDINGS // ========================================================================= // Game Play Defines // ========================================================================= // number of older messages stored during play and in save files #define NUM_STORED_MESSAGES 1000 // clamp time between command inputs at 5 minutes when reporting play time. #define IDLE_TIME_CLAMP (5 * 60) // Set this to the number of runes that will be required to enter Zot's // domain. You shouldn't set this really high unless you want to // make players spend far too much time in Pandemonium/The Abyss. // // Traditional setting of this is one rune, but three is pretty standard now. #define NUMBER_OF_RUNES_NEEDED 3 // Number of top scores to keep. See above for the dgamelaunch setting. #ifndef SCORE_FILE_ENTRIES #define SCORE_FILE_ENTRIES 100 #endif // Option to allow scoring of wizard characters. Note that even if // you define this option, wizard characters are still tagged as such // in the score file. // #define SCORE_WIZARD_CHARACTERS // ================================================= -------------------------- //jmf: New defines for a bunch of optional features. // ================================================= -------------------------- // Use special colours for various channels of messages #define USE_COLOUR_MESSAGES // Wizard death option (needed to test new death messages) #define USE_OPTIONAL_WIZARD_DEATH // Semi-Controlled Blink #define USE_SEMI_CONTROLLED_BLINK // Use new system for weighting str and dex based on weapon type, -- bwr #define USE_NEW_COMBAT_STATS // mv: (new 9 Aug 01) turns off missile trails, might be slow on some computers // #define MISSILE_TRAILS_OFF // bwr: set this to non-zero if you want to know the pluses, "runed" status // of the monster's weapons in the hiscore file. #define HISCORE_WEAPON_DETAIL 1 // ====================== ----------------------------------------------------- //jmf: end of new defines // ====================== ----------------------------------------------------- #ifdef MULTIUSER // If you are installing Crawl for multiple users, define SAVE_DIR // to the directory where saves, bones, and score file will go... // end it with a '/'. Since all player files will be in the same // directory, the players UID will be appended when this option is // set. // // If you want to build Crawl that only one user will use, you do not need // to set SAVE_DIR_PATH (and do not need to run make install). // // Setting it to nothing or not setting it will cause all game files to // be dumped in the current directory. // // #define SAVE_DIR_PATH "/opt/crawl/lib/" // #define SAVE_DIR_PATH "" // Define SAVE_PACKAGE_CMD to a command to compress and bundle the save // game files into a single unit... the two %s will be replaced with the // players save file name. Define LOAD_UNPACKAGE_CMD to undo this process // the %s is the same as above. The second %s in LOAD_UNPACKAGE_CMD // is for the output directory. // // PACKAGE_SUFFIX is used when the package file name is needed // /* FIXME: Unless sanitized elsewhere in the codebase, a specially crafted save directory or character name will allow arbitrary code execution with escalated privileges (namely, with group "games"). FIXME: replace system(3) with fork(2) and execve(2). */ // The default behaviour is to compress with tar on Unices, zip on Windows/DOS. // To avoid compression entirely, define SAVE_PACKAGE_NONE. #ifndef SAVE_PACKAGE_NONE #ifdef USE_TAR #define PACKAGE_SUFFIX ".tar.gz" #define SAVE_PACKAGE_CMD "tar" #define LOAD_UNPACKAGE_CMD "tar -zxf %s"PACKAGE_SUFFIX" -C %s" #define UNPACK_SPECIFIC_FILE_CMD LOAD_UNPACKAGE_CMD " %s" #else #ifdef USE_ZIP #define PACKAGE_SUFFIX ".zip" #define SAVE_PACKAGE_CMD "/usr/bin/zip -m -q -j" #define LOAD_UNPACKAGE_CMD "/usr/bin/unzip -q -o %s"PACKAGE_SUFFIX" -d %s" #define UNPACK_SPECIFIC_FILE_CMD LOAD_UNPACKAGE_CMD " %s" #endif #endif #endif // SAVE_PACKAGE_NONE // This defines the chmod permissions for score and bones files. #define SHARED_FILES_CHMOD_PRIVATE 0664 #define SHARED_FILES_CHMOD_PUBLIC 0664 // If we're on a multiuser system, file locking of shared files is // very important (else things will just keep getting corrupted) #define USE_FILE_LOCKING // Define this if you'd rather have the game block on locked files, // commenting it will poll the file lock once a second for thirty // seconds before giving up. #define USE_BLOCKING_LOCK // some files needed for file locking #include #include #include #include #endif /* MULTIUSER */ #if defined(DGL_SIMPLE_MESSAGING) && !defined(USE_FILE_LOCKING) #error Must define USE_FILE_LOCKING for DGL_SIMPLE_MESSAGING #endif #if !defined(DB_NDBM) && !defined(DB_DBH) && !defined(USE_SQLITE_DBM) #define USE_SQLITE_DBM #endif // Uncomment these if you can't find these functions on your system // #define NEED_USLEEP #ifdef __cplusplus // Must include libutil.h here if one of the above is defined. #include "libutil.h" template < class T > inline void UNUSED(const volatile T &) { } // And now headers we want precompiled #include "externs.h" #include "version.h" #ifdef TARGET_COMPILER_VC #include "libw32c.h" #endif #endif // __cplusplus #endif // APPHDR_H