/*
* This is the main headerfile
*/
#ifndef MUD_H
#define MUD_H
#include <zlib.h>
#include <pthread.h>
#include <arpa/telnet.h>
/* Mud_name: Global basic name of the mud
* called in several locations, like who, login
* screen, login infos, etc
*/
#define MUD_NAME "The world of Geshia"
#include "lang.h" /* Language File */
/************************
* 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 PULSES_PER_SECOND 5 /* must divide 1000 : 4, 5 or 8 works */
#define MAX_BUFFER 32768 /* seems like a decent amount */
#define MAX_OUTPUT 32768 /* well shoot me if it isn't enough */
#define MAX_HELP_ENTRY 32768 /* roughly 40 lines of blocktext */
#define MUDPORT 9009 /* just set whatever port you want */
#define FILE_TERMINATOR "EOF" /* end of file marker */
#define EXE_FILE "../src/SocketMud" /* the name of the mud binary */
#define DEFAULT_TITLE "the guest" /* Default title */
#define END_MARKER "END" /* End marker for data files */
/*
* Data Files
*/
#define TIME_FILE "../data/time.txt" /* The time file */
#define COPYOVER_FILE "../txt/copyover.dat" /* tempfile to store copyover data */
#define AREA_FILE "../data/areas.txt"
#define NOTE_FILE "../data/notes.txt"
#define NULL_FILE "/dev/null"
#define CHANGE2_FILE "../help/changes.txt"
extern FILE * fpReserve;
/* Connection states */
#define STATE_NEW_NAME 0
#define STATE_NEW_PASSWORD 1
#define STATE_VERIFY_PASSWORD 2
#define STATE_ASK_PASSWORD 3
#define STATE_PLAYING 4
#define STATE_CLOSED 5
/* Thread states - please do not change the order of these 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. */
/* player levels */
#define LEVEL_GUEST 1 /* Dead players and actual guests */
#define LEVEL_PLAYER 2 /* Almost everyone is this level */
#define LEVEL_ADMIN 3 /* Any admin without shell access */
#define LEVEL_GOD 4 /* Any admin with shell access */
/* Communication Ranges */
#define COMM_LOCAL 0 /* same room only */
#define COMM_CHAT 1 /* Global Chanel */
#define COMM_LOG 10 /* admins only */
/* define simple types */
typedef unsigned char bool;
typedef short int sh_int;
/******************************
* End of standard definitons *
******************************/
/***********************
* Defintion of Macros *
***********************/
#define UMIN(a, b) ((a) < (b) ? (a) : (b))
#define LOWER(c) ((c) >= 'A' && (c) <= 'Z' ? (c)+'a'-'A' : (c))
#define UPPER(c) ((c) >= 'a' && (c) <= 'z' ? (c)+'A'-'a' : (c))
#define IS_ADMIN(dMob) ((dMob->level) > LEVEL_PLAYER ? TRUE : FALSE)
#define IREAD(sKey, sPtr) \
{ \
if (compares(sKey, word)) \
{ \
int sValue = fread_number(fp); \
sPtr = sValue; \
found = TRUE; \
break; \
} \
}
#define SREAD(sKey, sPtr) \
{ \
if (compares(sKey, word)) \
{ \
sPtr = fread_string(fp); \
found = TRUE; \
break; \
} \
}
/*
* Reads a Knowledge string from file
*/
#define KREAD(sKey, dMob) \
{ \
if (compares(sKey, word)) \
{ \
int value = fread_number(fp); \
char * temp = fread_word(fp); \
int sn = find_knowledge(temp); \
if (sn < 0) \
{ \
log_string("load_player: KREAD unknown knowledge %s", temp); \
} \
else \
dMob->knowledge[sn] = value; \
found = TRUE; \
break; \
} \
}
/*
* LREAD()
* reads a Skill from file
*/
#define LREAD(sKey, dMob) \
{ \
if (compares(sKey, word)) \
{ \
int value = fread_number(fp); \
char * temp = fread_word(fp); \
int sn = find_skill(temp); \
if (sn < 0) \
{ \
log_string("load_player: LREAD unknown skill %s", temp); \
log_string("load_player: LREAD unknown skill %s", temp); \
} \
else \
dMob->skills[sn] = value; \
found = TRUE; \
break; \
} \
}
/*
* TREAD()
* reads a Knowledge from file
*/
#define TREAD(sKey, dMob) \
{ \
if (compares(sKey, word)) \
{ \
int value = fread_number(fp); \
char * temp = fread_word(fp); \
int sn = find_talent(temp); \
if (sn < 0) \
{ \
log_string("load_player: TREAD unknown Talent %s", temp); \
} \
else \
dMob->talents[sn] = value; \
found = TRUE; \
break; \
} \
}
/*
* AREAD()
* Reads an Attribute from File
*/
#define AREAD(sKey, dMob) \
{ \
if (compares(sKey, "Attribs")) \
{ \
dMob->attribs[0] = fread_number(fp);\
dMob->attribs[1] = fread_number(fp);\
dMob->attribs[2] = fread_number(fp);\
dMob->attribs[3] = fread_number(fp);\
dMob->attribs[4] = fread_number(fp);\
dMob->attribs[5] = fread_number(fp);\
dMob->attribs[6] = fread_number(fp);\
dMob->attribs[7] = fread_number(fp);\
found = TRUE; \
break; \
} \
}
/*
* BREAD()
* Reads an Attribute_max from File
*/
#define BREAD(sKey, dMob) \
{ \
if (compares(sKey, "Attribs_max")) \
{ \
dMob->attribs_max[0] = fread_number(fp);\
dMob->attribs_max[1] = fread_number(fp);\
dMob->attribs_max[2] = fread_number(fp);\
dMob->attribs_max[3] = fread_number(fp);\
dMob->attribs_max[4] = fread_number(fp);\
dMob->attribs_max[5] = fread_number(fp);\
dMob->attribs_max[6] = fread_number(fp);\
dMob->attribs_max[7] = fread_number(fp);\
found = TRUE; \
break; \
} \
}
/* VREAD()
* Reads Vitals from a file */
#define VREAD(sKey, dMob) \
{ \
if (compares(sKey, "HpMaStEg")) \
{ \
dMob->stats[0] = fread_number(fp); \
dMob->stats[1] = fread_number(fp); \
dMob->stats[2] = fread_number(fp); \
dMob->stats[3] = fread_number(fp); \
dMob->stats[4] = fread_number(fp); \
dMob->stats[5] = fread_number(fp); \
dMob->stats[6] = fread_number(fp); \
dMob->stats[7] = fread_number(fp); \
found = TRUE; \
break; \
} \
}
/* EREAD()
* Reads EOF from file */
#define EREAD(sKey) \
{ \
if (compares(word, "EOF")) \
{ \
done = TRUE; \
found = TRUE; \
break; \
} \
}
/***********************
* End of Macros *
***********************/
/******************************
* Bit flag Support *
******************************/
#define IS_SET(flag, bit) ((flag) & (bit))
#define SET_BIT(var, bit) ((var) |= (bit))
#define REMOVE_BIT(var, bit) ((var) &= ~(bit))
#define TOGGLE_BIT(var, bit) ((var) ^= (bit))
/* Easy reading */
#define A 0x1
#define B 0x2
#define C 0x4
#define D 0x8
#define E 0x10
#define F 0x20
#define G 0x40
#define H 0x80
#define I 0x100
#define J 0x200
#define K 0x400
#define L 0x800
#define M 0x1000
#define N 0x2000
#define O 0x4000
#define P 0x8000
#define Q 0x10000
#define R 0x20000
#define S 0x40000
#define T 0x80000
#define U 0x100000
#define V 0x200000
#define W 0x400000
#define X 0x800000
#define Y 0x1000000
#define Z 0x2000000
/* I honestly wont need all 26, i dont think at least, besides was too lazy to finish it*/
/******************************
* New structures *
******************************/
/* type defintions */
typedef struct dSocket D_SOCKET;
typedef struct dMobile D_MOBILE;
typedef struct help_data HELP_DATA;
typedef struct lookup_data LOOKUP_DATA;
/* Moved up here for strange mud.h i have going here */
#define D_S D_SOCKET
#define D_M D_MOBILE
/* Universal Includes */
#include "locations.h" /* AREA_DATA stuff */
#include "justify.h" /* Justification snippet from Richard Woolcock aka KaVir */
#include "random.h" /* Random Number generator */
#include "movement.h" /* Stuff for movement */
#include "world.h" /* Load/save World data */
#include "note.h" /* Note data */
#include "player.h" /* Player stuff */
#include "list.h" /* Jobo's Generic Linked List API */
#include "mobile.h" /* Mobile Stuff */
/* the actual structures */
struct dSocket
{
D_SOCKET * next;
D_MOBILE * player;
char * hostname;
char inbuf[MAX_BUFFER];
char outbuf[MAX_OUTPUT];
char next_command[MAX_BUFFER];
bool bust_prompt;
sh_int lookup_status;
sh_int state;
sh_int control;
sh_int top_output;
unsigned char compressing; /* MCCP support */
z_stream * out_compress; /* MCCP support */
unsigned char * out_compress_buf; /* MCCP support */
};
struct dMobile
{
D_MOBILE * next;
D_SOCKET * socket;
char * name; /* Player's Name */
char * password; /* Players Passwd */
bool is_npc; /* True if NPC */
sh_int level; /* Admin game level */
sh_int p_level; /* Player's In-game Level */
sh_int x; /* World Map Location X */
sh_int y; /* World Map Location Y */
sh_int z; /* World Map Location Z */
int i_x; /* Chunk location X */
int i_y; /* Chunk location Y */
long immortal_flags; /* Immortal Flags */
long player_flags; /* Player Flags */
sh_int view_x; /* Max view distance X */
sh_int view_y; /* Max view distance Y */
char * title; /* Title of the Player */
NOTE_DATA * in_progress; /* Note currently in progress */
sh_int stats[MAX_STATS]; /* Player's Statistics HpMaStFt */
sh_int attribs[MAX_ATTRIBS]; /* Player Attributes */
sh_int attribs_max[MAX_ATTRIBS];/* Max Player Attributes */
sh_int talents[MAX_TALENTS]; /* Player's Talents */
sh_int skills[MAX_SKILLS]; /* Player's Skills */
sh_int knowledge[MAX_KNOW]; /* Player's Knowledges */
sh_int talents_t[MAX_TALENTS]; /* Player's Talents */
sh_int skills_t[MAX_SKILLS]; /* Player's Skills */
sh_int knowledge_t[MAX_KNOW]; /* Player's Knowledges */
sh_int race; /* Player's Race */
sh_int class; /* Player's Class */
sh_int age; /* Player's Age */
sh_int xp; /* Player's XP, or Mobiles Value*/
};
struct help_data
{
HELP_DATA * next;
time_t load_time;
char * keyword;
char * text;
};
struct lookup_data
{
D_SOCKET * dsock; /* the socket we wish to do a hostlookup on */
char * buf; /* the buffer it should be stored in */
};
struct typCmd
{
char * cmd_name;
void (* cmd_funct)(D_MOBILE *dMOb, char *arg);
sh_int level;
};
typedef struct buffer_type
{
char * data; /* The data */
int len; /* The current len of the buffer */
int size; /* The allocated size of data */
} BUFFER;
/******************************
* End of new structures *
******************************/
/***************************
* System Flags *
***************************/
#define SYS_IS_MOBILE A /* Is a mobile */
/***************************
* Player Flags *
***************************/
#define PLR_CLEAR_SCREEN A /* Clear screen on look */
#define PLR_INFO_LOGIN B /* Display Logins */
#define PLR_INFO_LOGOUT C /* Display Logouts */
/***************************
* Immortal Flags *
***************************/
#define IMMORTAL_OMNI_VIEW A /* Bypass view block */
#define IMMORTAL_PASS_DOOR B /* Bypass terrain */
/***************************
* Global Variables *
***************************/
extern D_SOCKET * dsock_free; /* the socket free list */
extern D_SOCKET * dsock_list; /* the linked list of active sockets */
extern D_MOBILE * dmobile_free; /* the mobile free list */
extern D_MOBILE * dmobile_list; /* the mobile list of active mobiles */
extern HELP_DATA * help_list; /* the linked list of help files */
extern const struct typCmd tabCmd[]; /* the command table */
extern bool shut_down; /* used for shutdown */
extern char * greeting; /* the welcome greeting */
extern char * motd; /* the MOTD help file */
extern int control; /* boot control socket thingy */
extern time_t current_time; /* let's cut down on calls to time() */
/***************************
* End of Global Variables *
***************************/
/***********************
* 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
/***********************
* End of MCCP support *
***********************/
/***********************************
* Prototype function declerations *
***********************************/
#define buffer_new(size) __buffer_new ( size)
#define buffer_strcat(buffer,text) __buffer_strcat ( buffer, text )
char *crypt ( const char *key, const char *salt );
/*
* socket.c
*/
int init_socket ( void );
bool new_socket ( int sock );
void close_socket ( D_S *dsock, bool reconnect );
bool read_from_socket ( D_S *dsock );
bool text_to_socket ( D_S *dsock, const char *txt ); /* sends the output directly */
void text_to_buffer ( D_S *dsock, const char *txt ); /* buffers the output */
void text_to_mobile ( D_M *dMob, const char *txt ); /* buffers the output */
void next_cmd_from_buffer ( D_S *dsock );
bool flush_output ( D_S *dsock );
void handle_new_connections ( D_S *dsock, char *arg );
void clear_socket ( D_S *sock_new, int sock );
void recycle_sockets ( void );
void *lookup_address ( void *arg );
void send_to_char ( const char *txt, D_M *dMob );
#define stc send_to_char
/*
* interpret.c
*/
void handle_cmd_input ( D_S *dsock, char *arg );
bool is_number (char *arg);
char * one_argument (char *argument, char *arg_first);
/*
* io.c
*/
void log_string ( const char *txt, ... );
void bug ( const char *txt, ... );
time_t last_modified ( char *helpfile );
char *read_help_entry ( const char *helpfile ); /* pointer */
char *fread_line ( FILE *fp ); /* pointer */
char *fread_string ( FILE *fp ); /* allocated data */
char *fread_word ( FILE *fp ); /* pointer */
int fread_number ( FILE *fp ); /* just an integer */
/*
* strings.c
*/
char *one_arg ( char *fStr, char *bStr );
bool compares ( const char *aStr, const char *bStr );
bool is_prefix ( const char *aStr, const char *bStr );
char *capitalize ( char *txt );
BUFFER *__buffer_new ( int size );
void __buffer_strcat ( BUFFER *buffer, const char *text );
void buffer_free ( BUFFER *buffer );
void buffer_clear ( BUFFER *buffer );
int bprintf ( BUFFER *buffer, char *fmt, ... );
/*
* update.c
*/
#define PULSE_PER_SECOND 4
#define PULSE_WORLD (600 * PULSE_PER_SECOND)
#define PULSE_DOORS (60 * PULSE_PER_SECOND)
void update_handler ( void );
void update_weather ( void );
void close_doors ( void );
void save_time ( void );
void load_time ( void );
#define SUN_RISE 1
#define SUN_LIGHT 2
#define SUN_HIGH 3
#define SUN_SETTING 4
#define SUN_DARK 4
void cmd_time (D_M * ch, char *arg);
typedef struct time_data_data TIME_INFO_DATA;
extern TIME_INFO_DATA time_data;
struct time_data_data
{
int hour; /* Hour of the day */
int day; /* Day of the week */
int week; /* Week of the month*/
int month; /* Month of year */
int year; /* The year */
/* End dates, begin extras */
int sunlight; /* How much sunlight*/
};
/*
* help.c
*/
bool check_help ( D_M *dMob, char *helpfile );
void load_helps ( void );
void add_help ( HELP_DATA *help );
/*
* utils.c
*/
bool check_name ( const char *name );
void clear_mobile ( D_M *dMob );
void free_mobile ( D_M *dMob );
void ex_free_mob ( D_MOBILE * dMob );
void communicate ( D_M *dMob, char *txt, int range );
void mudwide_info (char * txt);
void load_muddata ( bool fCopyOver );
char * get_time ( void );
void copyover_recover ( void );
D_M * check_reconnect ( char *player );
D_M * get_dmob_world (D_MOBILE * dMob, char *name);
bool is_name (char *str, char *namelist);
bool str_prefix (const char *astr, const char *bstr);
void smash_space (char *str);
void smash_tidle (char *str);
/*
* action_safe.c
*/
void cmd_say ( D_M *dMob, char *arg );
void cmd_chat ( D_M *dMob, char *arg );
void cmd_quit ( D_M *dMob, char *arg );
void cmd_shutdown ( D_M *dMob, char *arg );
void cmd_commands ( D_M *dMob, char *arg );
void cmd_who ( D_M *dMob, char *arg );
void cmd_help ( D_M *dMob, char *arg );
void cmd_compress ( D_M *dMob, char *arg );
void cmd_save ( D_M *dMob, char *arg );
void cmd_copyover ( D_M *dMob, char *arg );
void cmd_linkdead ( D_M *dMob, char *arg );
void cmd_location ( D_M * ch, char *arg );
void cmd_number_here (D_MOBILE * ch, char * arg);
void cmd_recall (D_MOBILE * ch, char * arg);
char *return_who_level_name (D_M * ch);
void cmd_test2 (D_MOBILE * ch, char *arg);
/* act_player.c */
void cmd_title (D_M * ch, char *arg);
void cmd_config (D_MOBILE * ch, char * arg);
char * return_setting (D_M * ch, long bit);
void toggle_clear_screen (D_M * ch);
void toggle_logout (D_M * ch);
void toggle_login (D_M * ch);
void cmd_score (D_MOBILE * ch, char *arg);
void cmd_skills (D_M * ch, char *arg);
char * score_dots (int number);
/* builder.c */
void cmd_edit_box (D_MOBILE * ch, char * arg);
/* act_imm.c */
void cmd_echo (D_M * ch, char * arg);
void cmd_display_bits (D_M * ch, char * arg);
void cmd_omni_view (D_M * ch, char * arg);
void cmd_pass_door (D_M * ch, char * arg);
void cmd_advance (D_M * ch, char * arg);
void cmd_pset (D_M * ch, char * arg);
/*
* mccp.c
*/
bool compressStart ( D_S *dsock, unsigned char teleopt );
bool compressEnd ( D_S *dsock, unsigned char teleopt, bool forced );
/*
* save.c
*/
void save_player ( D_M *dMob );
D_M *load_player ( char *player );
D_M *load_profile ( char *player );
void tail();
/*******************************
* End of prototype declartion *
*******************************/
#define MAX_CHANGE 25
#define CHANGE_FILE "../data/changes.txt"
typedef struct change_data CHANGE_DATA;
struct change_data
{
CHANGE_DATA *next;
CHANGE_DATA *prev;
char *imm;
char *text;
char *date;
};
void do_delchange (D_MOBILE *ch, char *argument);
void do_changes(D_MOBILE *ch, char *argument);
void do_addchange( D_MOBILE *ch, char *argument );
void cmd_clearchanges (D_MOBILE * ch, char *arg);
#endif /* MUD_H */