// This file contains detailed readme for each local_options option.

/****************************************************************************
 * EVERY time you change ANYTHING in this file, RECOMPILE from scratch.     *
 * (type "make clean" then "make" on a UNIX system) Failure to do so may    *
 * cause the driver to behave oddly.                                        *
 ****************************************************************************/

#ifndef _LOCAL_OPTIONS_H_
#define _LOCAL_OPTIONS_H_

/* NOTES:
 * Many of the configurable options are now set via the configuration file
 *  that is specified as the first argument to the driver.
 * See port.h for those #defines related to portability (compatibility) if
 *  you have problems compiling on your system.
 * Removing an efun from func_spec.c usually removes most, if not all,
 *  of the code associated with it.
 * Note that anything defined in this file is also visible to LPC files
 * surrounded by __.  So #define FOO in this file defines __FOO__ for
 * all LPC files.  This allows code like:
 *
 * #ifdef __SENSIBLE_MODIFIERS__
 * ...
 */

/****************************************************************************
 *                          COMPATIBILITY                                   *
 *                         ---------------                                  *
 * The MudOS driver and following this the extensions making up the FluffOS *
 * driver has evolved quite a bit over the years.  These defines are mainly *
 * to preserve old behavior in case people didn't want to rewrite the       *
 * relevant portions of their code.                                         *
 *                                                                          *
 * In most cases, code which needs these defines should be rewritten when   *
 * possible.  The 'Compat status' field is designed to give an idea how     *
 * likely it is that support for that option will be removed in the near    *
 * future.  Certain options are fairly easy to work around, and double      *
 * the size of the associated code, as well as the maintenance workload,    *
 * and can make the code significantly more complex or harder to read, so   *
 * supporting them indefinitely is impractical.                             *
 *                                                                          *
 * WARNING: If you are using software designed to run with the MudOS driver *
 *          it may assume certain settings of these options.  Check the     *
 *          instructions for details.                                       *
 ****************************************************************************/

/* NO_ADD_ACTION: define this to remove add_action, commands, livings, etc.
 * process_input() then becomes the only way to deal with player input.
 *
 * Compat status: next to impossible to simulate, hard to replace, and
 * very, very widely used.
 */
#undef NO_ADD_ACTION

/* NO_SNOOP: disables the snoop() efun and all related functionality.
 */
#undef NO_SNOOP

/* NO_ENVIRONMENT: define this to remove the handling of object containment
 * relationships by the driver
 *
 * Compat status: hard to simulate efficiently, and very widely used.
 */
#undef NO_ENVIRONMENT

/* NO_WIZARDS: for historical reasons, MudOS used to keep track of who
 * is and isn't a wizard.  Defining this removes that completely.
 * If this is defined, the wizardp() and related efuns don't exist.
 *
 * Also note that if it is not defined, then non-wizards are always put
 * in restricted mode when ed() is used, regardless of the setting of
 * the restrict parameter.
 *
 * Compat status: easy to simulate and dated.
 */
#undef NO_WIZARDS

/* NO_LIGHT: define this to disable the set_light() and driver maintenance
 *   of light levels in objects.  You can simulate it via LPC if you want...
 *
 * Compat status: Very dated, easy to simulate, and gross.
 */
#undef NO_LIGHT

/* SENSIBLE_MODIFIERS:
 * Turning this on changes a few things, which may break old code:
 *
 * (1) 'static' is not recognized; either 'nosave' or 'protected' must
 *     be used instead.
 * (2) The old meaning of 'public' is no longer allowed.  Explicit
 *     functions must be defined at each level to allow access to
 *     privately inherited functions.
 * (3) 'public' now means the default visibility.  Previously there was
 *     no keyword that meant this (before you ask, 'public' meant something
 *     else, and if you don't know that, you probably don't have any reason
 *     to care about the old meaning).
 */
#define SENSIBLE_MODIFIERS

/****************************************************************************
 *                           MISCELLANEOUS                                  *
 *                          ---------------                                 *
 * Various options that affect the way the driver behaves.                  *
 *                                                                          *
 * WARNING: If you are using software designed to run with the MudOS driver *
 *          it may assume certain settings of these options.  Check the     *
 *          instructions for details.                                       *
 ****************************************************************************/

/* DEFAULT_PRAGMAS:  This should be a sum of pragmas you want to always
 * be on, i.e.
 *
 * #define DEFAULT_PRAGMAS PRAGMA_STRICT_TYPES + PRAGMA_SAVE_TYPES
 *
 * will make every LPC file behave as if it had the lines:
 * #pragma strict_types
 * #pragma save_types
 *
 * for no default pragmas:
 * #define DEFAULT_PRAGMAS 0
 *
 * If you don't know what these are, 0 is a good choice.
 *
 * Supported pragmas:
 * PRAGMA_STRICT_TYPES: enforces strict type checking
 * PRAGMA_WARNINGS:     issues warnings about various dangerous things in
 *                      your code
 * PRAGMA_SAVE_TYPES:   save the types of function arguments for checking
 *                      calls to functions in this object by objects that
 *                      inherit it.
 * PRAGMA_OPTIMIZE:     make a second pass over the generated code to
 *                      optimize it further.
 * PRAGMA_ERROR_CONTEXT:include some text telling where on the line a
 *                      compilation error occured.
 */
#define DEFAULT_PRAGMAS PRAGMA_WARNINGS + PRAGMA_SAVE_TYPES + PRAGMA_ERROR_CONTEXT + PRAGMA_OPTIMIZE

/* SAVE_EXTENSION: defines the file extension used by save_object().
 *   and restore_object().  Some sysadmins run scripts that periodically
 *   scan for and remove files ending in .o (but many mudlibs are already
 *   set up to use .o thus we leave .o as the default).
 *   If you are changing this and using the builtin compression via
 *   PACKAGE_COMPRESS you might want to change SAVE_GZ_EXTENSION below too.
 */
#define SAVE_EXTENSION ".o"

/* PRIVS: define this if you want object privileges.  Your mudlib must
 *   explicitly make use of this functionality to be useful.  Defining this
 *   this will increase the size of the object structure by 4 bytes (8 bytes
 *   on the DEC Alpha) and will add a new master apply during object creation
 *   to "privs_file".  In general, privileges can be used to increase the
 *   granularity of security beyond the current root uid mechanism.
 *
 * [NOTE: for those who'd rather do such things at the mudlib level, look at
 *  the inherits() efun and the 'valid_object' apply to master.]
 */
#undef PRIVS

/* NO_SHADOWS: define this if you want to disable shadows in your driver.
 */
#undef NO_SHADOWS

/* USE_ICONV: Use iconv to translate input and output from/to the users char
 * encoding
 */
#undef USE_ICONV

/* IPV6: Use IP version 6 instead of 4, for most people the only difference
 * will be that numerical IP addresses get ::ffff: added in front.*/
#undef IPV6

/* static user space dtrace probes, try them if you have dtrace! */
#undef DTRACE

/****************************************************************************
 *                              PACKAGES                                    *
 *                              --------                                    *
 * Defining some/all of the following add certain efuns, and sometimes      *
 * add/remove code from the driver.                                         *
 *                                                                          *
 * if PACKAGE_XYZZY is defined here, then the code in packages/xyzzy.c      *
 * and the efuns in packages/xyzzy_spec.c will be added to the driver.      *
 ****************************************************************************/

/* base packages, you don't want to undef these two */
#define PACKAGE_OPS
#define PACKAGE_CORE

/* various miscellaneous efuns */
#define PACKAGE_CONTRIB

/* efuns that are only of use to those that know something about driver
   internals */
#define PACKAGE_DEVELOP

/* PACKAGE_MATH: determines whether or not the math efuns (for floats) are
   included.
 */
#define PACKAGE_MATH

/* PACKAGE_MATRIX: determines whether or not the 3d graphics efuns (for floats)
 *   are included - see packages/matrix.spec for a list.
 */
#undef PACKAGE_MATRIX

/* PACKAGE_MUDLIB_STATS: define this to enable domain and author stats
 *   maintenance by the driver.  These mudlib stats are more domain
 *   based than user based, and replaces the traditional wiz_list stats.
 */
#define PACKAGE_MUDLIB_STATS

/* PACKAGE_SOCKETS: define this to enable the socket efunctions.  This
 *   causes HAS_SOCKETS to be defined for all LPC objects.
 */
#define PACKAGE_SOCKETS

/* PACKAGE_PARSER: Natural language parsing efuns for interactive fiction
 *   type applications
 */
#undef PACKAGE_PARSER

/* PACKAGE_EXTERNAL: Allows the driver to exec() commands specified in the
 * config file.
 */
#define PACKAGE_EXTERNAL

/* PACKAGE_DB: efuns for external database access using msql */
#undef PACKAGE_DB

/* If PACKAGE_DB is defined above, you must pick at least one of the following supported
 * databases
 *
 * ATTENTION:
 * no two choices must use the same number and if more then one type is
 * choosen the mudlib should provide a corresponding headerfile for use with
 * efun::db_connect()
 */
#ifdef PACKAGE_DB
#define USE_MYSQL 1
#undef USE_MSQL
#undef USE_POSTGRES
#undef USE_SQLITE3

#define DEFAULT_DB  USE_MYSQL
#endif

/*PACKAGE_ASYNC: adds some efuns for asyncronous IO */
#define PACKAGE_ASYNC

/*PACKAGE_SHA1: adds a function to calculate the sha1 hash of a string
 * sha1(string).  Use PACKAGE_CRYPTO instead if possible. */
#define PACKAGE_SHA1

/*PACKAGE_CRYPTO: adds a function that does multiple hash types hash(hash,
 * string), needs openssl lib and includes and -lssl in system_libs*/
#undef PACKAGE_CRYPTO

/*
  PACKAGE_TRIM: efuns for remove leading / trailing whitepsaces (or chars in
  provided charset)
  Functions:
    - trim: Remove leading and trailing whitespaces (or in provided charset).
      Example:
        - "    my test   " : "my test"
    - ltrim: Remove leading whitespaces (and others).
      Example:
        - "    my test   " : "my test   "
    - rtrim: Remove trailing whitespaces (and others).
      Example:
        - "    my test   " : "    my test"

  Characters that remove by default: isspace() == 1, which is:
    ' ' (0x20)  space (SPC)
    '\t'  (0x09)  horizontal tab (TAB)
    '\n'  (0x0a)  newline (LF)
    '\v'  (0x0b)  vertical tab (VT)
    '\f'  (0x0c)  feed (FF)
    '\r'  (0x0d)  carriage return (CR)
 */
#define PACKAGE_TRIM

/*
   PACKAGE PCRE:
    efuns for perl compatible regular expressionsi
 */
#define PACKAGE_PCRE

/*PACKAGE DWLIB: some discworld mudlib simuls coded in C (well just one right
  now) */
#undef PACKAGE_DWLIB

/****************************************************************************
 *                            UID PACKAGE                                   *
 *                            -----------                                   *
 * UIDS are the basis for some mudlib security systems.  Basically, they're *
 * preserved for backwards compatibility, as several ways of breaking       *
 * almost any system which relies on them are known.  (No, it's not a flaw  *
 * of uids; only that b/c of the ease with which LPC objects can call       *
 * each other, it's far too easy to leave holes)                            *
 *                                                                          *
 * If you don't care about security, the first option is probably what you  *
 * want.                                                                    *
 ****************************************************************************/

/*
 * PACKAGE_UIDS: define this if you want a driver that does use uids.
 *
 */
#define PACKAGE_UIDS

#ifdef PACKAGE_UIDS
/* AUTO_SETEUID: when an object is created it's euid is automatically set to
 *   the equivalent of seteuid(getuid(this_object())).  undef AUTO_SETEUID
 *   if you would rather have the euid of the created object be set to 0.
 */
#define AUTO_SETEUID

/* AUTO_TRUST_BACKBONE: define this if you want objects with the backbone
 *   uid to automatically be trusted and to have their euid set to the uid of
 *   the object that forced the object's creation.
 */
#undef AUTO_TRUST_BACKBONE
#endif

/* PACKAGE_COMPRESS: Enable MCCP support and compressed save files
   SAVE_GZ_EXTENSION: save extension for compressed files
 */
#define PACKAGE_COMPRESS
#define SAVE_GZ_EXTENSION ".o.gz"

#undef PACKAGE_THREAD

#define PACKAGE_MATRIX

#endif /* _LOCAL_OPTIONS_H_ */
