/***************************************************************************
 *  file: db.h , Database module.                          Part of DIKUMUD *
 *  Usage: Loading/Saving chars booting world.                             *
 *  Copyright (C) 1990, 1991 - see 'license.doc' for complete information. *
 *                                                                         *
 *  Copyright (C) 1992, 1993 Michael Chastain, Michael Quan, Mitchell Tse  *
 *  Performance optimization and bug fixes by MERC Industries.             *
 *  You can use our stuff in any way you like whatsoever so long as this   *
 *  copyright notice remains intact.  If you like it please drop a line    *
 *  to mec@garnet.berkeley.edu.                                            *
 *                                                                         *
 *  This is free software and you are benefitting.  We hope that you       *
 *  share your changes too.  What goes around, comes around.               *
 ***************************************************************************/


/* data files used by the game system */

#define DFLT_DIR          "../lib"        /* default data directory     */
#define SAVE_DIR          "../save"       /* save directory             */

#define WORLD_FILE        "tinyworld.wld" /* room definitions           */
#define MOB_FILE          "tinyworld.mob" /* monster prototypes         */
#define OBJ_FILE          "tinyworld.obj" /* object prototypes          */
#define ZONE_FILE         "tinyworld.zon" /* zone defs & command tables */
#define SHOP_FILE         "tinyworld.shp" /* shop messages and markups  */
#define GREETINGS_FILE    "greetings.txt" /* initial greetings screen   */
#define CREDITS_FILE      "credits.txt"   /* for the 'credits' command  */
#define NEWS_FILE         "news.txt"      /* for the 'news' command     */
#define MOTD_FILE         "motd.txt"      /* messages of today          */
#define STORY_FILE        "story.txt"     /* game story                 */
#define TIME_FILE         "time.txt"      /* game calendar information  */
#define IDEA_FILE         "ideas.txt"     /* for the 'idea'-command     */
#define TYPO_FILE         "typos.txt"     /*         'typo'             */
#define BUG_FILE          "bugs.txt"      /*         'bug'              */
#define MESS_FILE         "messages.txt"  /* damage message             */
#define SOCIAL_FILE       "social.txt"    /* messgs for social acts     */
#define HELP_KWRD_FILE    "help_key.txt"  /* for HELP <keywrd>          */
#define HELP_PAGE_FILE    "help.txt"      /* for HELP <CR>              */
#define INFO_FILE         "info.txt"      /* for INFO                   */
#define WIZLIST_FILE      "wizlist.txt"   /* for WIZLIST                */
#define POSEMESS_FILE     "poses.txt"     /* for 'pose'-command         */

/* public procedures in db.c */

void boot_db(void);
int create_entry(char *name);
void zone_update(void);
void init_char(struct char_data *ch);
void clear_char(struct char_data *ch);
void clear_object(struct obj_data *obj);
void reset_char(struct char_data *ch);
void free_char(struct char_data *ch);
int real_room(int virtual);
char *fread_string(FILE *fl);
int real_object(int virtual);
int real_mobile(int virtual);

#define REAL 0
#define VIRTUAL 1

struct obj_data *read_object(int nr, int eq_level);
struct char_data *read_mobile(int nr, int type);


/* structure for the reset commands */
struct reset_com
{
    char command;   /* current command                      */ 
    bool if_flag;   /* if TRUE: exe only if preceding exe'd */
    int arg1;       /*                                      */
    int arg2;       /* Arguments to the command             */
    int arg3;       /*                                      */

    /* 
    *  Commands:              *
    *  'M': Read a mobile     *
    *  'O': Read an object    *
    *  'P': Put obj in obj    *
    *  'G': Obj to char       *
    *  'E': Obj to char equip *
    *  'D': Set state of door *
    */
};



/* zone definition structure. for the 'zone-table'   */
struct zone_data
{
    char *name;             /* name of this zone                  */
    int lifespan;           /* how long between resets (minutes)  */
    int age;                /* current age of this zone (minutes) */
    int top;                /* upper limit for rooms in this zone */

    int reset_mode;         /* conditions for reset (see below)   */
    struct reset_com *cmd;  /* command table for reset             */

    /*
    *  Reset mode:                              *
    *  0: Don't reset, and don't update age.    *
    *  1: Reset if no PC's are located in zone. *
    *  2: Just reset.                           *
    */
};




/* element in monster and object index-tables   */
struct index_data
{
    int virtual;    /* virtual number of this mob/obj           */
    long pos;       /* file position of this field              */
    int number;     /* number of existing units of this mob/obj */
    int (*func)();  /* special procedure for this mob/obj       */
};




struct help_index_element
{
    char *keyword;
    long pos;
};

extern const int exp_table[36+1];
extern const char *title_table[4][36][2];