/**************************************************************
 * FFTacticsMUD : main.h                                      *
 **************************************************************
 * (c) 2002 Damien Dailidenas (Trenton). All rights reserved. *
 **************************************************************/

#define args(list) list

#include <string>
#include "colors.h"
#include "commands.h"
#include "skills.h"
#include "ch.h"
#include "area.h"
#include "obj.h"
#include "battle.h"
#include "jobs.h"

#define DB_LOC	"localhost"
#define DB_NAME	"FFTacticsMUD"
#define DB_USER	"username"
#define DB_PASS	"password"

#define ENDL "\n\r"

typedef long 	long 		llong;

#define MSL 			4608
#define MIL 			256

#define PPS			4
#define PULSE_TICK		(60 * PPS)

struct TID {
    int hour, day, month, year;
};

struct social_type {
  const char *social, *to_ch, *to_room;
};

struct wiznet_type {
  char *name;
  long flag;
};

struct connected_type {
  char *status;
};

struct colors {
  char *code;
};

struct weather_type {
  char *condition;
};

struct month {
  char *name;
  short length;
};

#define A	1
#define B	2
#define C	4
#define D	8
#define E	16
#define F	32
#define G	64
#define H	128
#define I	256
#define J	512

#define DIR_N		0
#define DIR_E		1
#define DIR_S		2
#define DIR_W		3
#define DIR_NE          4
#define DIR_NW          5
#define DIR_SE          6
#define DIR_SW          7
#define DIR_UP		8
#define DIR_DOWN	9

template <class T>
inline void zap(T& x) {
  assert(x != NULL);
  delete x;
  x = NULL;
}

template <class T*>
inline void zap(T*& x) {
  assert(x != NULL);
  delete x;
  x = NULL;
}

template <class T>
inline void zap_array(T& x) {
  assert(x != NULL);
  delete [] x;
  x = NULL;
}

#define MIN(a, b)		((a) < (b) ? (b) : (a))
#define MAX(a, b)		((a) > (b) ? (b) : (a))
#define UMAX(a, b)		((a) > (b) ? (a) : (b))
#define URANGE(a, b, c)		((b) < (a) ? (a) : ((b) > (c) ? (c) : (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_SET(flag, bit)	((flag) & (bit))
#define SET_BIT(var, bit)	((var) |= (bit))
#define REM_BIT(var, bit)	((var) &= ~(bit))
#define IS_INVIS(ch)		(IS_SET(ch->act, PLR_INVIS))
#define IS_OMNIPOTENT(ch)	(IS_SET(ch->act, PLR_OMNIPOTENT))
#define WAIT_STATE(ch, npulse)	((ch)->wait = UMAX((ch)->wait, (npulse)))
#define PERS(ch, looker) 	((ch)->name)

extern	const	struct	month		month_table[];
extern	const 	struct	weather_type	weather_table[];
extern	const	struct	status_type	status_table[];
extern	const	struct	npc_type	npc_table[];
extern	const	struct	wiznet_type	wiznet_table[];
extern	const	struct	connected_type	connected_table[];
extern	const	struct	social_type	social_table[];
extern	const	struct	colors		color[];
extern 	const   struct 	flag_type 	sector_flags[];
extern 	const   struct 	flag_type 	act_flags[];
extern  const   char 	*dir_name[];
extern	const	char	*sh_dir_name[];
extern  const   short   rev_dir[];
extern  string  lcom;
extern	string	lfun;

extern	time_t current_time;
extern	TID time_info;
extern	string str_boot_time;

void 	reboot 			args(());
void 	copyover_recover 	args(());
string  print_flags		args((int flag));
int	gcf			args((int x, int y));
long	flag_convert		args((char letter));
int	num_range		args((int from, int to));
int	num_percent		args(());
long    number_mm       	args(());
void	append_file		args((CH *ch, const string str_file, const string str = ""));
void	update_handler		args(());
void 	mysql			args((CH *ch, const string query));
bool 	can_equip		args((const CH *ch, const OBJ *obj, const short loc));
short	get_status_id		args((STATUSTYPE *type));
void    wiz_echo              	args((const string str, long flag = 0));
OBJ 	*create_obj		args((const string name));
OBJ	*create_obj		args((const short id));
void	load_global_settings	args(());

//commands.cpp
string cmd_name args((const short id));
short cmd_id args((DO_FUN *fun));

//desc.cpp
bool write_to_desc args((const short desc, const string str));

//main.cpp
void bug args((const string str));

//misc.cpp
void mysql_print_res args((CH *ch, const string query));

//move.cpp
short dir_id args((const string str));

//room.cpp
ROOM *get_room_by_id args((const string str));

//startup.cpp
void startup args(());
void load_battle_areas args(());
void load_shops args(());
long db_read_flags args((const string str_flags));

//status.cpp
short get_status_id_by_name args((const string name));

//string.cpp
int number_arg args((const string str1, string &str2));
void log_string args((const string str));
string str_time args(());
string f_str_box args((const string str, const bool line_t = true, const bool line_b = true, const string c_box = "{3"));
string f_str args((const string str));
string str_bar args((const llong stat, const llong max, const string color));
string capitalize args((const string str));
bool check_name args((const string name));
string colour args((const char type));
string header args((const string str, const bool center = false, const string color="{3"));
string clock args((const long minutes));
bool is_num args((const string str));
bool find args((const string str1, const string str2, const bool case_ = false));
void split args((string &args, string &arg));
int strlen args((const string str));
string str_comma args((const llong number));
string dialogue_box(const string name, const string str, const bool more=false);