/***************************************************************************
 *  File: olc.h                                                            *
 *                                                                         *
 *  Much time and thought has gone into this software and you are          *
 *  benefitting.  We hope that you share your changes too.  What goes      *
 *  around, comes around.                                                  *
 *                                                                         *
 *  This code was freely distributed with the The Isles 1.1 source code,   *
 *  and has been used here for OLC - OLC would not be what it is without   *
 *  all the previous coders who released their source code.                *
 *                                                                         *
 ***************************************************************************/
/*
 * This is a header file for all the OLC files.  Feel free to copy it into
 * merc.h if you wish.  Many of these routines may be handy elsewhere in
 * the code.  -Jason Dinkel
 */


/*
 * The version info.  Please use this info when reporting bugs.
 * It is displayed in the game by typing 'version' while editing.
 * Do not remove these from the code - by request of Jason Dinkel
 */
#define VERSION	"ILAB Online Creation [Beta 1.0, ROM 2.3 modified]\n\r" \
		"     Port a ROM 2.4 v1.8\n\r"
#define AUTHOR	"     By Jason(jdinkel@mines.colorado.edu)\n\r"   \
                "     Modified for use with ROM 2.3\n\r"          \
                "     By Hans Birkeland (hansbi@ifi.uio.no)\n\r"  \
                "     Modificado para uso en ROM 2.4b6\n\r"	  \
                "     Por Ivan Toledo (itoledo@ctcreuna.cl)\n\r"  \
                "     Modified for use with RaM Fire\n\r"         \
		"     By Nick Phillips (eudoxus@fastmail.fm)\n\r"
#define DATE	"     (Apr. 7, 1995 - ROM mod, Apr 16, 1995)\n\r" \
		"     (Port a ROM 2.4 - Nov 2, 1996)\n\r"         \
		"     Version actual : 1.8 - Sep 8, 1998\n\r"     \
		"     (Ported to RaM Fire - Dec 9, 2008\n\r"
#define CREDITS "     Original by Surreality(cxw197@psu.edu) and Locke(locke@lm.com)"



/*
 * New typedefs.
 */
typedef	bool OLC_FUN		args( ( CHAR_DATA *ch, char *argument ) );
#define DECLARE_OLC_FUN( fun )	OLC_FUN    fun


/* Command procedures needed ROM OLC */
/*
void                    do_help( CHAR_DATA *ch, const char *argument );
void spell_null( int sn, int level, CHAR_DATA *ch, void *vo, int target );
*/




/*
 * Connected states for editor.
 */
#define ED_NONE		0
#define ED_AREA		1
#define ED_ROOM		2
#define ED_OBJECT	3
#define ED_MOBILE	4
#define ED_MPCODE	5
#define ED_HELP		6



/*
 * Interpreter Prototypes
 */
void    aedit( CHAR_DATA *ch, const char *argument );
void    redit( CHAR_DATA *ch, const char *argument );
void    medit( CHAR_DATA *ch, const char *argument );
void    oedit( CHAR_DATA *ch, const char *argument );
void	mpedit( CHAR_DATA *ch, const char *argument );
void	hedit( CHAR_DATA *ch, const char *argument );


/*
 * OLC Constants
 */
#define MAX_MOB	1		/* Default maximum number for resetting mobs */



/*
 * Structure for an OLC editor command.
 */
struct olc_cmd_type
{
    const char * const	name;
    bool (*olc_fun)( CHAR_DATA *ch, const char *argument );
};



/*
 * Structure for an OLC editor startup command.
 */
struct	editor_cmd_type
{
    const char * const	name;
    void (*do_fun)( CHAR_DATA *ch, const char *argument );
};



/*
 * Utils.
 */
AREA_DATA *get_vnum_area( int vnum );
AREA_DATA *get_area_data( int vnum );
int flag_value( const struct flag_type *flag_table, const char *argument );
const char *flag_string( const struct flag_type *flag_table, int bits );
void add_reset( ROOM_INDEX_DATA *room, RESET_DATA *pReset, int index );



/*
 * Interpreter Table Prototypes
 */
extern const struct olc_cmd_type	aedit_table[];
extern const struct olc_cmd_type	redit_table[];
extern const struct olc_cmd_type	oedit_table[];
extern const struct olc_cmd_type	medit_table[];
extern const struct olc_cmd_type	mpedit_table[];
extern const struct olc_cmd_type	hedit_table[];


/*
 * Editor Commands.
 */
/*
void                    do_aedit( CHAR_DATA *ch, const char *argument );
void                    do_redit( CHAR_DATA *ch, const char *argument );
void                    do_oedit( CHAR_DATA *ch, const char *argument );
void                    do_medit( CHAR_DATA *ch, const char *argument );
void                    do_mpedit( CHAR_DATA *ch, const char *argument );
void                    do_hedit( CHAR_DATA *ch, const char *argument );
*/

/*
 * General Functions
 */
bool show_commands( CHAR_DATA *ch, const char *argument );
bool show_help( CHAR_DATA *ch, const char *argument );
bool edit_done( CHAR_DATA *ch );
bool show_version( CHAR_DATA *ch, const char *argument );



/*
 * Area Editor Prototypes
 */
bool                    aedit_show( CHAR_DATA *ch, const char *argument );
bool                    aedit_create( CHAR_DATA *ch, const char *argument );
bool                    aedit_name( CHAR_DATA *ch, const char *argument );
bool                    aedit_file( CHAR_DATA *ch, const char *argument );
bool                    aedit_age( CHAR_DATA *ch, const char *argument );
/* DECLARE_OLC_FUN( aedit_recall	);       ROM OLC */
bool                    aedit_reset( CHAR_DATA *ch, const char *argument );
bool                    aedit_security( CHAR_DATA *ch, const char *argument );
bool                    aedit_builder( CHAR_DATA *ch, const char *argument );
bool                    aedit_vnum( CHAR_DATA *ch, const char *argument );
bool                    aedit_lvnum( CHAR_DATA *ch, const char *argument );
bool                    aedit_uvnum( CHAR_DATA *ch, const char *argument );
bool                    aedit_credits( CHAR_DATA *ch, const char *argument );


/*
 * Room Editor Prototypes
 */
bool                    redit_show( CHAR_DATA *ch, const char *argument );
bool                    redit_create( CHAR_DATA *ch, const char *argument );
bool                    redit_name( CHAR_DATA *ch, const char *argument );
bool                    redit_desc( CHAR_DATA *ch, const char *argument );
bool                    redit_ed( CHAR_DATA *ch, const char *argument );
bool                    redit_format( CHAR_DATA *ch, const char *argument );
bool                    redit_north( CHAR_DATA *ch, const char *argument );
bool                    redit_south( CHAR_DATA *ch, const char *argument );
bool                    redit_east( CHAR_DATA *ch, const char *argument );
bool                    redit_west( CHAR_DATA *ch, const char *argument );
bool                    redit_up( CHAR_DATA *ch, const char *argument );
bool                    redit_down( CHAR_DATA *ch, const char *argument );
bool                    redit_mreset( CHAR_DATA *ch, const char *argument );
bool                    redit_oreset( CHAR_DATA *ch, const char *argument );
bool                    redit_mlist( CHAR_DATA *ch, const char *argument );
bool                    redit_rlist( CHAR_DATA *ch, const char *argument );
bool                    redit_olist( CHAR_DATA *ch, const char *argument );
bool                    redit_mshow( CHAR_DATA *ch, const char *argument );
bool                    redit_oshow( CHAR_DATA *ch, const char *argument );
bool                    redit_heal( CHAR_DATA *ch, const char *argument );
bool                    redit_mana( CHAR_DATA *ch, const char *argument );
bool                    redit_clan( CHAR_DATA *ch, const char *argument );
bool                    redit_owner( CHAR_DATA *ch, const char *argument );
bool                    redit_room( CHAR_DATA *ch, const char *argument );
bool                    redit_sector( CHAR_DATA *ch, const char *argument );


/*
 * Object Editor Prototypes
 */
bool                    oedit_show( CHAR_DATA *ch, const char *argument );
bool                    oedit_create( CHAR_DATA *ch, const char *argument );
bool                    oedit_name( CHAR_DATA *ch, const char *argument );
bool                    oedit_short( CHAR_DATA *ch, const char *argument );
bool                    oedit_long( CHAR_DATA *ch, const char *argument );
bool                    oedit_addaffect( CHAR_DATA *ch, const char *argument );
bool                    oedit_addapply( CHAR_DATA *ch, const char *argument );
bool                    oedit_delaffect( CHAR_DATA *ch, const char *argument );
bool                    oedit_value0( CHAR_DATA *ch, const char *argument );
bool                    oedit_value1( CHAR_DATA *ch, const char *argument );
bool                    oedit_value2( CHAR_DATA *ch, const char *argument );
bool                    oedit_value3( CHAR_DATA *ch, const char *argument );
bool                    oedit_value4( CHAR_DATA *ch, const char *argument );
bool                    oedit_weight( CHAR_DATA *ch, const char *argument );
bool                    oedit_cost( CHAR_DATA *ch, const char *argument );
bool                    oedit_ed( CHAR_DATA *ch, const char *argument );
/* ROM */
bool                    oedit_extra( CHAR_DATA *ch, const char *argument );
bool                    oedit_wear( CHAR_DATA *ch, const char *argument );
bool                    oedit_type( CHAR_DATA *ch, const char *argument );
bool                    oedit_affect( CHAR_DATA *ch, const char *argument );
bool                    oedit_material( CHAR_DATA *ch, const char *argument );
bool                    oedit_level( CHAR_DATA *ch, const char *argument );
bool                    oedit_condition( CHAR_DATA *ch, const char *argument );

/*
 * Mobile Editor Prototypes
 */
bool                    medit_show( CHAR_DATA *ch, const char *argument );
bool                    medit_create( CHAR_DATA *ch, const char *argument );
bool                    medit_name( CHAR_DATA *ch, const char *argument );
bool                    medit_short( CHAR_DATA *ch, const char *argument );
bool                    medit_long( CHAR_DATA *ch, const char *argument );
bool                    medit_shop( CHAR_DATA *ch, const char *argument );
bool                    medit_desc( CHAR_DATA *ch, const char *argument );
bool                    medit_level( CHAR_DATA *ch, const char *argument );
bool                    medit_align( CHAR_DATA *ch, const char *argument );
bool                    medit_spec( CHAR_DATA *ch, const char *argument );
/* ROM */
bool                    medit_sex( CHAR_DATA *ch, const char *argument );
bool                    medit_act( CHAR_DATA *ch, const char *argument );
bool                    medit_affect( CHAR_DATA *ch, const char *argument );
bool                    medit_ac( CHAR_DATA *ch, const char *argument );
bool                    medit_form( CHAR_DATA *ch, const char *argument );
bool                    medit_part( CHAR_DATA *ch, const char *argument );
bool                    medit_imm( CHAR_DATA *ch, const char *argument );
bool                    medit_res( CHAR_DATA *ch, const char *argument );
bool                    medit_vuln( CHAR_DATA *ch, const char *argument );
bool                    medit_material( CHAR_DATA *ch, const char *argument );
bool                    medit_off( CHAR_DATA *ch, const char *argument );
bool                    medit_size( CHAR_DATA *ch, const char *argument );
bool                    medit_hitdice( CHAR_DATA *ch, const char *argument );
bool                    medit_manadice( CHAR_DATA *ch, const char *argument );
bool                    medit_damdice( CHAR_DATA *ch, const char *argument );
bool                    medit_race( CHAR_DATA *ch, const char *argument );
bool                    medit_position( CHAR_DATA *ch, const char *argument );
bool                    medit_gold( CHAR_DATA *ch, const char *argument );
bool                    medit_hitroll( CHAR_DATA *ch, const char *argument );
bool                    medit_damtype( CHAR_DATA *ch, const char *argument );
bool                    medit_group( CHAR_DATA *ch, const char *argument );
bool                    medit_addmprog( CHAR_DATA *ch, const char *argument );
bool                    medit_delmprog( CHAR_DATA *ch, const char *argument );

/* Mobprog editor */
bool                    mpedit_create( CHAR_DATA *ch, const char *argument );
bool                    mpedit_code( CHAR_DATA *ch, const char *argument );
bool                    mpedit_show( CHAR_DATA *ch, const char *argument );
bool                    mpedit_list( CHAR_DATA *ch, const char *argument );

/* Help editors */
bool                    hedit_keyword( CHAR_DATA *ch, const char *argument );
bool                    hedit_text( CHAR_DATA *ch, const char *argument );
bool                    hedit_new( CHAR_DATA *ch, const char *argument );
bool                    hedit_level( CHAR_DATA *ch, const char *argument );
bool                    hedit_delete( CHAR_DATA *ch, const char *argument );
bool                    hedit_show( CHAR_DATA *ch, const char *argument );
bool                    hedit_list( CHAR_DATA *ch, const char *argument );

/*
 * Macros
 */
#define TOGGLE_BIT(var, bit)    ((var) ^= (bit))

/* Return pointers to what is being edited. */
#define EDIT_MOB(Ch, Mob)	( Mob = (MOB_INDEX_DATA *)Ch->desc->pEdit )
#define EDIT_OBJ(Ch, Obj)	( Obj = (OBJ_INDEX_DATA *)Ch->desc->pEdit )
#define EDIT_ROOM(Ch, Room)	( Room = Ch->in_room )
#define EDIT_AREA(Ch, Area)	( Area = (AREA_DATA *)Ch->desc->pEdit )
#define EDIT_MPCODE(Ch, Code)   ( Code = (MPROG_CODE*)Ch->desc->pEdit )


/*
 * Prototypes
 */
/* mem.c - memory prototypes. */
#define ED	EXTRA_DESCR_DATA
RESET_DATA	*new_reset_data( void );
void		free_reset_data( RESET_DATA *pReset );
AREA_DATA	*new_area( void );
void		free_area( AREA_DATA *pArea );
EXIT_DATA	*new_exit( void );
void		free_exit( EXIT_DATA *pExit );
/*
ED 		*new_extra_descr( void );
void		free_extra_descr( ED *pExtra );
*/
ROOM_INDEX_DATA *new_room_index( void );
void		free_room_index( ROOM_INDEX_DATA *pRoom );
/*
AFFECT_DATA	*new_affect( void );
void		free_affect( AFFECT_DATA* pAf );
*/
SHOP_DATA	*new_shop( void );
void		free_shop( SHOP_DATA *pShop );
OBJ_INDEX_DATA	*new_obj_index( void );
void		free_obj_index( OBJ_INDEX_DATA *pObj );
MOB_INDEX_DATA	*new_mob_index( void );
void		free_mob_index( MOB_INDEX_DATA *pMob );
#undef	ED

void		show_liqlist( CHAR_DATA *ch );
void		show_damlist( CHAR_DATA *ch );

const char *	mprog_type_to_name( int type );
MPROG_LIST      *new_mprog( void );
void            free_mprog( MPROG_LIST *mp );
MPROG_CODE	*new_mpcode(void);
void		free_mpcode( MPROG_CODE *pMcode);