RaM Fire Updated/
/*
 * RAM $Id: olc.h 81 2009-01-14 06:16:31Z ghasatta $
 */

/***************************************************************************
 *  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]\r\n" \
                "     Port a ROM 2.4 v1.8\r\n"
#define AUTHOR  "     By Jason(jdinkel@mines.colorado.edu)\r\n"   \
                "     Modified for use with ROM 2.3\r\n"          \
                "     By Hans Birkeland (hansbi@ifi.uio.no)\r\n"  \
                "     Modificado para uso en ROM 2.4b6\r\n"       \
                "     Por Ivan Toledo (itoledo@ctcreuna.cl)\r\n"  \
                "     Modified for use with RaM Fire\r\n"         \
                "     By Nick Phillips (eudoxus@fastmail.fm)\r\n"
#define DATE    "     (Apr. 7, 1995 - ROM mod, Apr 16, 1995)\r\n" \
                "     (Port a ROM 2.4 - Nov 2, 1996)\r\n"         \
                "     Version actual : 1.8 - Sep 8, 1998\r\n"     \
                "     (Ported to RaM Fire - Dec 9, 2008\r\n"
#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 );
void                    add_reset( ROOM_INDEX_DATA *room, RESET_DATA *pReset,
                                   int reset_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 run_olc_editor     args( ( DESCRIPTOR_DATA *d ) );
char                   *olc_ed_name args( ( CHAR_DATA *ch ) );
char                   *olc_ed_vnum args( ( CHAR_DATA *ch ) );

void                    show_olc_cmds( CHAR_DATA *ch,
                                       const struct olc_cmd_type *olc_table );
void                    display_resets( CHAR_DATA *ch );
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 );
void                    show_flag_cmds( CHAR_DATA *ch,
                                        const struct flag_type *flag_table );
void                    show_skill_cmds( CHAR_DATA *ch, int tar );
void                    show_spec_cmds( CHAR_DATA *ch );
bool                    check_range( int lower, int upper );
bool                    change_exit( CHAR_DATA *ch, const char *argument, int door );
int                     wear_loc( int bits, int count );
int                     wear_bit( int loc );
void                    show_obj_values( CHAR_DATA *ch, OBJ_INDEX_DATA *obj );
bool                    set_obj_values( CHAR_DATA *ch, OBJ_INDEX_DATA *pObj,
                                        int value_num, const char *argument );
bool                    set_value( CHAR_DATA *ch, OBJ_INDEX_DATA *pObj,
                                   const char *argument, int value );
bool                    oedit_values( CHAR_DATA *ch, const char *argument, int value );

/*
 * OLC Save
 */
char                   *fix_string( const char *str );
void                    save_area_list( void );
char                   *fwrite_flag( int flags, char buf[] );
void                    save_mobprogs( FILE * fp, AREA_DATA *pArea );
void                    save_mobile( FILE * fp, MOB_INDEX_DATA *pMobIndex );
void                    save_mobiles( FILE * fp, AREA_DATA *pArea );
void                    save_object( FILE * fp, OBJ_INDEX_DATA *pObjIndex );
void                    save_objects( FILE * fp, AREA_DATA *pArea );
void                    save_rooms( FILE * fp, AREA_DATA *pArea );
void                    save_specials( FILE * fp, AREA_DATA *pArea );
void                    save_door_resets( FILE * fp, AREA_DATA *pArea );
void                    save_resets( FILE * fp, AREA_DATA *pArea );
void                    save_shops( FILE * fp, AREA_DATA *pArea );
void                    save_helps( FILE * fp, HELP_AREA *ha );
void                    save_other_helps( CHAR_DATA *ch );
void                    save_area( AREA_DATA *pArea );

/*
 * String Editing Functions
 */
void                    string_edit( CHAR_DATA *ch, char **pString );
void                    string_append( CHAR_DATA *ch, std::string &pString );
void                    string_append( CHAR_DATA *ch, char **pString );
char                   *string_replace( char *orig, const char *pOld, const char *pNew );
void                    string_replace(std::string &orig, const char *pOld, const char *pNew);
void                    string_add( CHAR_DATA *ch, const char *argument );
char                   *format_string_const(const char *oldstring /* , bool fSpace */  );
char                   *format_string(char *oldstring);
void                    format_string(std::string &);
const char             *first_arg( const char *argument, char *arg_first, bool fCase );
char                   *string_unpad( char *argument );
char                   *string_proper( char *argument );
char                   *string_linedel( char *string, int line );
void                    string_linedel(std::string &string, int line);
char                   *string_lineadd( char *string, char *newstr, int line );
void                    string_lineadd(std::string &, char *newstr, int line);
const char                   *getline( const char *str, char *buf );
char                   *numlineas(const char *string );
size_t                  string_getline(const std::string &str, int line);

/*
 * 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_armor( 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 */
HELP_AREA              *get_help_area( HELP_DATA *help );
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
 */

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

const char             *mprog_type_to_name( int type );