nakedmudv3.3/
nakedmudv3.3/lib/
nakedmudv3.3/lib/logs/
nakedmudv3.3/lib/misc/
nakedmudv3.3/lib/players/
nakedmudv3.3/lib/txt/
nakedmudv3.3/lib/world/
nakedmudv3.3/lib/world/examples/
nakedmudv3.3/lib/world/examples/mproto/
nakedmudv3.3/lib/world/examples/oproto/
nakedmudv3.3/lib/world/examples/reset/
nakedmudv3.3/lib/world/examples/rproto/
nakedmudv3.3/lib/world/examples/trigger/
nakedmudv3.3/lib/world/limbo/
nakedmudv3.3/lib/world/limbo/room/
nakedmudv3.3/lib/world/limbo/rproto/
nakedmudv3.3/src/alias/
nakedmudv3.3/src/char_vars/
nakedmudv3.3/src/editor/
nakedmudv3.3/src/example_module/
nakedmudv3.3/src/help/
nakedmudv3.3/src/set_val/
nakedmudv3.3/src/socials/
nakedmudv3.3/src/time/
#ifndef MUD_H
#define MUD_H
//*****************************************************************************
//
// mud.h
//
// this is the main header file for the MUD. All MUD-related source files should
// include this header.
//
//*****************************************************************************
#include <arpa/telnet.h>
#include "wrapsock.h"



//*****************************************************************************
// if you've installed a new module, you  need to put a define in here to let
// the rest of the MUD know that you've installed the module.
//*****************************************************************************

// mandatory modules. These are modules that the NakedMud core REQUIRES to run.
// They have simply been made modules for organizational ease.
#define MODULE_ITEMS
#define MODULE_OLC2
#define MODULE_SCRIPTS
#define MODULE_CHAR_VARS
#define MODULE_SET_VAL
#define MODULE_EDITOR

// here is where your optional modules will go
#define MODULE_ALIAS
#define MODULE_SOCIALS
#define MODULE_HELP
#define MODULE_TIME



//*****************************************************************************
// To avoid having to write some bulky structure names, we've typedef'd a
// bunch of shortforms for commonly used datatypes. If you make a new datatype
// that is used lots, put a typedef for it in here.
//*****************************************************************************
typedef struct socket_data                SOCKET_DATA;
typedef struct account_data               ACCOUNT_DATA;
typedef struct char_data                  CHAR_DATA;  
typedef struct storage_set                STORAGE_SET;
typedef struct storage_set_list           STORAGE_SET_LIST;
typedef struct prototype_data             PROTO_DATA;

typedef struct script_set_data            SCRIPT_SET;
typedef struct edesc_data                 EDESC_DATA;
typedef struct edesc_set_data             EDESC_SET;
typedef struct response_data              RESPONSE_DATA;

typedef struct script_data                SCRIPT_DATA;
typedef struct world_data                 WORLD_DATA;
typedef struct zone_data                  ZONE_DATA;
typedef struct room_data                  ROOM_DATA;
typedef struct exit_data                  EXIT_DATA;
typedef struct object_data                OBJ_DATA;
typedef struct shop_data                  SHOP_DATA;
typedef struct body_data                  BODY_DATA;
typedef struct reset_data                 RESET_DATA;
typedef struct reset_list                 RESET_LIST;

typedef long                              bitvector_t;
typedef unsigned char                     bool;



// these appear in so many places, we might as well just add 'em to our header
// here so we don't have to include them everywhere else. Only catch is we
// have to include them after all of our typedefs so the header files can use
// the typedefs.
#include "numbers.h"
#include "property_table.h"
#include "list.h"
#include "map.h"
#include "near_map.h"
#include "hashtable.h"
#include "set.h"
#include "buffer.h"
#include "bitvector.h"
#include "parse.h"
#include "command.h"



//*****************************************************************************
// Standard definitions
//*****************************************************************************

/* define TRUE and FALSE */
#ifndef FALSE
#define FALSE   0
#endif
#ifndef TRUE
#define TRUE    1
#endif

#define eTHIN   0
#define eBOLD   1

/* A few globals */
#define DFLT_PULSES_PER_SECOND 10
#define PULSES_PER_SECOND   mudsettingGetInt("pulses_per_second")
#define SECOND              * PULSES_PER_SECOND   /* used for figuring out how many pulses in a second*/
#define SECONDS             SECOND                /* same as above */
#define MINUTE              * 60 SECONDS          /* one minute */
#define MINUTES             MINUTE
#define MAX_INPUT_LEN      1024                   /* max length of a string someone can input */
#define SMALL_BUFFER       1024
#define MAX_BUFFER         8192                   /* seems like a decent amount         */
#define MAX_SCRIPT         16384                  /* max length of a script */
#define MAX_OUTPUT         8192                   /* well shoot me if it isn't enough   */
#define FILE_TERMINATOR    "EOF"                  /* end of file marker                 */
#define COPYOVER_FILE      "../.copyover.dat"     /* tempfile to store copyover data    */
#define EXE_FILE           "../src/NakedMud"      /* the name of the mud binary         */
#define DEFAULT_PORT       4000                   /* the default port we run on */
#define SCREEN_WIDTH       80                     // the width of a term screen
#define PARA_INDENT        0                      // num of spaces to start para

/* Thread States */
#define TSTATE_LOOKUP          0  /* Socket is in host_lookup        */
#define TSTATE_DONE            1  /* The lookup is done.             */
#define TSTATE_WAIT            2  /* Closed while in thread.         */
#define TSTATE_CLOSED          3  /* Closed, ready to be recycled.   */

/* Communication Ranges */
#define COMM_LOCAL             0  /* same room only                  */
#define COMM_GLOBAL            1  /* all over the game               */
#define COMM_LOG              10  /* admins only                     */

// these are there UIDs for things that have not yet been created
#define NOBODY               (-1)
#define NOTHING              (-1)
#define NOWHERE              (-1)

#define SOMWHERE        "somewhere"
#define SOMETHING       "something"
#define SOMEONE         "someone"
#define NOTHING_SPECIAL "you see nothing special."

// the room that new characters are dropped into
#define START_ROOM      mudsettingGetString("start_room")
#define DFLT_START_ROOM "tavern_entrance@examples"

#define WORLD_PATH     "../lib/world"



//*****************************************************************************
// core functions for working with new commands
//*****************************************************************************
void init_commands();
void show_commands(CHAR_DATA *ch, const char *user_groups);
void remove_cmd   (const char *cmd);
void add_cmd      (const char *cmd, const char *sort_by, COMMAND(func),
	           int min_pos, int max_pos, const char *user_group, 
		   bool mob_ok, bool interrupts);
void add_py_cmd   (const char *cmd, const char *sort_by, void *pyfunc,
		   int min_pos, int max_pos, const char *user_group,
		   bool mob_ok, bool interrupts);
bool cmd_exists   (const char *cmd);



//*****************************************************************************
// functions for setting and retreiving values of various mud settings. It's
// probably going to be common for people to add new settings that change how
// their mud will run (e.g. wizlock, newlock, max_level). Forcing people to
// handle all of this stuff through modules is really giving them more work
// than is neccessary. Instead, here we have a set of utilities that makes 
// doing this sort of stuff really easy. Whenever a new value is set, the
// settings are automagically saved. New variables can be created on the fly.
// There is no need to define keys anywhere. Conversion between types is
// handled automatically.
//*****************************************************************************
void init_mud_settings();

void mudsettingSetString(const char *key, const char *val);
void mudsettingSetDouble(const char *key, double val);
void mudsettingSetInt   (const char *key, int val);
void mudsettingSetLong  (const char *key, long val);
void mudsettingSetBool  (const char *key, bool val);

const char *mudsettingGetString(const char *key);
double      mudsettingGetDouble(const char *key);
int         mudsettingGetInt   (const char *key);
long        mudsettingGetLong  (const char *key);
bool        mudsettingGetBool  (const char *key);



//*****************************************************************************
// Global Variables
//*****************************************************************************
extern  LIST             *object_list; // all objects currently in the game
extern  LIST             *socket_list; // all sockets currently conencted
extern  LIST             *mobile_list; // all mobiles currently in the game
extern  LIST               *room_list; // all rooms currently in the game

extern  LIST          *mobs_to_delete; // mobs/objs/rooms that have had
extern  LIST          *objs_to_delete; // extraction and now need 
extern  LIST         *rooms_to_delete; // extract_final

extern  PROPERTY_TABLE     *mob_table; // a mapping between uid and mob
extern  PROPERTY_TABLE     *obj_table; // a mapping between uid and obj
extern  PROPERTY_TABLE    *room_table; // a mapping between uid and room
extern  PROPERTY_TABLE    *exit_table; // a mapping between uid and exit
extern  PROPERTY_TABLE    *sock_table; // a mapping between uid and socket

extern  bool                shut_down; // used for shutdown
extern  int                   mudport; // What port are we running on?
extern  BUFFER              *greeting; // the welcome greeting
extern  BUFFER                  *motd; // the MOTD message
extern  int                   control; // boot control socket thingy
extern  time_t           current_time; // let's cut down on calls to time()

extern  WORLD_DATA         *gameworld; // database and thing that holds rooms



//*****************************************************************************
// MCCP support
//*****************************************************************************
extern const unsigned char compress_will[];
extern const unsigned char compress_will2[];

#define TELOPT_COMPRESS       85
#define TELOPT_COMPRESS2      86
#define COMPRESS_BUF_SIZE   8192



//*****************************************************************************
// Prototype function declerations
//*****************************************************************************
char  *crypt                  ( const char *key, const char *salt );


/* interpret.c */
void  handle_cmd_input        ( SOCKET_DATA *dsock, char *arg );
void  do_cmd                  ( CHAR_DATA *ch, char *arg, bool aliases_ok);

/* io.c */
void    log_string            ( const char *txt, ... ) __attribute__ ((format (printf, 1, 2)));
void    bug                   ( const char *txt, ... ) __attribute__ ((format (printf, 1, 2)));
BUFFER *read_file             ( const char *file );

/* strings.c */
const char *one_arg_safe      ( const char *fStr, char *bStr );
char   *one_arg               ( char *fStr, char *bStr );
char   *two_args              ( char *from, char *arg1, char *arg2);
char   *three_args            ( char *from, char *arg1, char *arg2, char *arg3);
void    arg_num               ( const char *from, char *to, int num); 
bool    compares              ( const char *aStr, const char *bStr );
bool    is_prefix             ( const char *aStr, const char *bStr );
char   *capitalize            ( char *txt );
char   *strfind               (char *txt, char *sub);

/* mccp.c */
bool  compressStart     ( SOCKET_DATA *dsock, unsigned char teleopt );
bool  compressEnd       ( SOCKET_DATA *dsock, unsigned char teleopt, bool forced );

/* socket.c */
#define NUM_LINES_PER_PAGE  21
void  page_string           ( SOCKET_DATA *dsock, const char *string);
void  page_continue         ( SOCKET_DATA *dsock);
void  page_back             ( SOCKET_DATA *dsock);

//
// adds a new input handler onto the stack that allows a person to read 
// long pages of text (e.g. helpfiles in OLC)
void  start_reader          ( SOCKET_DATA *dsock, const char *text);

#endif  /* MUD_H */