typedef struct single_trigger SINGLE_TRIGGER;	/* Holds triggers */
typedef struct code_segment CODE;		/* Holds trigger code */
typedef struct script_info SCRIPT_INFO;		/* Holds info of a single trigger running */

/* M = Mob, R = Room, O = Object */

#define TENTERS			 1	/* MR */
#define TLEAVES			 2	/* MR */
#define TCREATED		 3	/* M */
#define TCOMMAND		 4	/* MRO */
#define TMOVES			 5	/* MO */
#define TDESTROYED		 6	/* MO */
#define TSAYS			 7	/* MOR */
#define TTELLS	 		 8	/* M */
#define TEVERY_HOUR		 9	/* MOR */
#define TEVERY_QUICKTICK	10	/* MOR */
#define TEVERY_REGENTICK	11	/* MR */
#define TAT_HOUR		12	/* MOR */
#define TGIVEN			13	/* MOR */
#define TDROPPED		14	/* RO */

/* New below */

#define TEQUIPPED		15	/* O */
#define TATTACKED		16	/* M */
#define TOBJ_SACCED		17	/* OR */
#define TGIVEN_MONEY		18	/* M */

#define TMAX_TRIGGERS		19

/* Script_info are running scripts.. we need to update these often */

struct script_info
  {
    SCRIPT_INFO *next;
    SINGLE_TRIGGER *called_by;	/* Trigger it was called by */
    CHAR_DATA *current;		/* Person currently being looked at by the script */
    CHAR_DATA *mob;		/* If a mob is executing this is the mob */
    ROOM_DATA *room;		/* If a room is executing this is the room */
    SINGLE_OBJECT *obj;		/* If an obj is executing this is the obj */
    short delay_ticks;
    char tick_type;		/* 1=quick, 2=heartbeat, 3=hour, 4=superquick */
    short current_line;		/* Line of code it will execute next */
    char code_seg[10];		/* Current label of code we're in */
    int accumulator;		/* Single register process */
  };

/*Hashed by first letter of label */
struct code_segment
  {
    CODE *next;
    char label[10];
    char *code;
  };

struct single_trigger
  {
    SINGLE_TRIGGER *next;
    char trigger_id[20];
    int trigger_type;		/* Trigger type */
    char *keywords;		/* General keywords */
    int attached_to_room;
    int attached_to_mob;
    int attached_to_obj;
    char interrupted;		/* Will the trigger reset if it is interrupted? */
    char leaves_room;		/* Will the script stop if the player leaves the room? */
    char players_only;		/* Will this script trigger on players only? */
    char code_label[10];	/* Label of code to execute */
    char handle_leave[10];	/* Code label to jump to if char leaves (for ROOM AND MOB only) */
    SCRIPT_INFO *running_info;
  };

extern CHAR_DATA *debugger;
extern CODE *code_list[256];	/* hashed by starting letter */
extern SCRIPT_INFO *info_list;	/* vnum % 256 for hash table */
extern SINGLE_TRIGGER *trigger_list[TMAX_TRIGGERS];	/* Hashed by trigger type */

void load_triggers(void);
void load_code(void);
void end_script(SCRIPT_INFO *);
void execute_code(SCRIPT_INFO *);