muddy/
muddy/CVS/
muddy/area/
muddy/area/CVS/
muddy/clans/CVS/
muddy/classes/CVS/
muddy/doc/
muddy/doc/CVS/
muddy/etc/CVS/
muddy/etc/i3/
muddy/etc/i3/CVS/
muddy/imc/CVS/
muddy/lang/CVS/
muddy/licenses/CVS/
muddy/msgdb/CVS/
muddy/new/CVS/
muddy/notes/
muddy/player/
muddy/races/CVS/
muddy/religions/CVS/
muddy/src/CVS/
muddy/src/comm/CVS/
muddy/src/db/CVS/
muddy/src/intermud/
muddy/src/intermud/CVS/
muddy/src/irc/CVS/
muddy/src/olc/CVS/
/* $Id: event.h,v 1.666 2004/09/20 10:49:48 shrike Exp $                             */

/************************************************************************************
 *  Contains information on the event system structures etc...                      *
 ************************************************************************************/

/************************************************************************************
 *    Copyright 2004 Astrum Metaphora consortium                                    *
 *                                                                                  *
 *    Licensed under the Apache License, Version 2.0 (the "License");               *
 *    you may not use this file except in compliance with the License.              *
 *    You may obtain a copy of the License at                                       *
 *                                                                                  *
 *    http://www.apache.org/licenses/LICENSE-2.0                                    *
 *                                                                                  *
 *    Unless required by applicable law or agreed to in writing, software           *
 *    distributed under the License is distributed on an "AS IS" BASIS,             *
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.      *
 *    See the License for the specific language governing permissions and           *
 *    limitations under the License.                                                *
 *                                                                                  *
 ************************************************************************************/

/************************************************************************************
 *  Original code by DalekenMUD 1.12 (C) 2000                                       *
 *  Adapted for current codebase by Shrike aka Sauron at 2004                       *
 ***********************************************************************************/


#ifndef _EVENT_H_
#define _EVENT_H_

typedef struct          plane_data              PLANE_DATA;
typedef struct          event_data              EVENT;
typedef unsigned char   uint_8;

#define MAX_EVENT_HASH  256   /* The hash bucket size.      */
#define MAX_EVENT_DATA  4     /* The amount of data required. */


/*
 * Target type identifier.
 */
#define ENV_TARGET_VOID       0
#define ENV_TARGET_CHAR       1
#define ENV_TARGET_OBJ        2
#define ENV_TARGET_ROOM       3
#define ENV_TARGET_AREA       4
#define ENV_TARGET_PLANE      5


/*
 * Special Event flags.
 * These flags are set/unset in the event table.  Individual events may
 * override this by setting them on the flags and the value will be toggled,
 * using an XOR (^).
 * E = only used when set on an event.
 * T = only used when set in the event table.
 */
#define EVENT_LOADING         1     /* Event has just been loaded.       (E) */
#define EVENT_TEMPORARY       2     /* Event doesn't need saving etc...      */
#define EVENT_DEATH_REMOVE    4     /* Event removed when target killed.     */
#define EVENT_NO_QUIT         8     /* Target cannot be removed.             */
#define EVENT_STACKABLE       16    /* Multiple events can be added.     (T) */

typedef struct multi_target_type    ENV_TARGET_TYPE;
typedef void   EVENT_CALLBACK       args(( EVENT *ev));

#define DECLARE_EVENT_CALLBACK( evf )     EVENT_CALLBACK evf


/*
 * This is where OO programming would REALLY come in handy.
 * Programming like this is a little ugly.
 * Still, this could be a useful structure, think about how act() works...
 */
struct multi_target_type
{
    uint_8  type;
    union
    {
      void        *typeless;
      OBJ_DATA    *obj;
      CHAR_DATA   *ch;
      ROOM_INDEX_DATA   *room;
      AREA_DATA   *area;
      PLANE_DATA  *plane;
    }       target;
};


/*
 * The information required for an event.
 * Some effort could be made to slightly reduce the size required.
 */
struct event_data
{
    EVENT                    *next_local;
    EVENT                    *next_global;
    ENV_TARGET_TYPE           actor;            /* Where the event was generated.    */
    time_t                    when;             /* Which game pulse it goes off on.  */
    int                       flags;            /* See above for flag descriptions.  */
    int                       type;             /* Determines the callback function. */
                                                /* Storage elements, used for miscellaneous
                                                   information, normally dependant on the event. */
    const char               *text;
    int                       data[ MAX_EVENT_DATA ];
    ENV_TARGET_TYPE           extra;
};


/*
 * The event table.
 */
struct event_table_type
{
    const char          *name;
    int                 *type;
    EVENT_CALLBACK      *callback;
    int                  flags;
};

extern struct event_table_type event_table [];


/*
 * Function declarations.
 */

void event_update             args((void));
EVENT *load_event             args((FILE *fp));
void save_event               args((FILE *fp, EVENT *e));
void inject_events            args((CHAR_DATA *ch));
EVENT *create_char_event      args((CHAR_DATA *ch, int type, int delay));
EVENT *create_obj_event       args((OBJ_DATA *obj, int type, int delay));
EVENT *create_room_event      args((ROOM_INDEX_DATA *room, int type, int delay));
EVENT *create_area_event      args((AREA_DATA *area, int type, int delay));
EVENT *create_plane_event     args((PLANE_DATA *plane, int type, int delay));
EVENT *create_typeless_event  args((void *vo, int type, int delay));
EVENT *duplicate_event        args((EVENT *e, int delay));
void event_remove_global      args((EVENT *e));
void event_remove_local       args((EVENT **list, EVENT *e));
void strip_events             args((EVENT **list, int type));
int get_time_left             args((EVENT *e, int type));
void set_timer                args((OBJ_DATA *obj, int pulses));
void set_timer_tick           args((OBJ_DATA *obj, int ticks));
void set_imp_timer            args((OBJ_DATA *obj));


EVENT *new_event              args(( void ));
void   free_event             args(( EVENT *e ));
const char *print_event       args(( EVENT *e ));


/* for mud programs */
/*
void add_mob_triggers         args((CHAR_DATA *mob));
void add_mob_fight_triggers   args((CHAR_DATA *mob));
void add_obj_triggers         args((OBJ_DATA *obj));
void add_room_triggers        args((ROOM_INDEX_DATA *room));
*/
/* callback.c */
/*
int event_lookup        args( ( const char *name ) );
struct event_table_type *event_table_lookup     args( ( const char *name ) );
*/


/*
 * Event callback types and functions.
 */
/* Player actions */
/*
extern int evn_picklock;
DECLARE_EVENT_CALLBACK( ecb_finish_pick         );
extern int evn_picktrap;
DECLARE_EVENT_CALLBACK( ecb_pick_trap           );
extern int evn_mercenary;
DECLARE_EVENT_CALLBACK( ecb_mercenary           );
extern int evn_gate_demon;
DECLARE_EVENT_CALLBACK( ecb_gate_demon          );
extern int evn_raised_undead;
DECLARE_EVENT_CALLBACK( ecb_raised_undead );
extern int evn_swan_song;
DECLARE_EVENT_CALLBACK( ecb_swan_song           );
extern int evn_char_fall;
DECLARE_EVENT_CALLBACK( ecb_char_fall           );
extern int evn_char_sink;
DECLARE_EVENT_CALLBACK( ecb_char_sink           );
extern int evn_char_drown;
DECLARE_EVENT_CALLBACK( ecb_char_drown          );
extern int evn_char_suffocate;
DECLARE_EVENT_CALLBACK( ecb_char_suffocate      );
extern int evn_web_struggle;
DECLARE_EVENT_CALLBACK( ecb_web_struggle  );
extern int evn_stand_up;
DECLARE_EVENT_CALLBACK( ecb_stand_up            );
extern int evn_regeneration;
DECLARE_EVENT_CALLBACK( ecb_regeneration  );

extern int evn_plant_grow;
DECLARE_EVENT_CALLBACK( ecb_plant_grow          );
extern int evn_plant_die;
DECLARE_EVENT_CALLBACK( ecb_plant_die           );
extern int evn_explode;
DECLARE_EVENT_CALLBACK( ecb_explode       );
*/
extern int evn_obj_decay;
extern int evn_imp_grab;
/*
DECLARE_EVENT_CALLBACK( ecb_obj_decay           );

DECLARE_EVENT_CALLBACK( ecb_imp_grab            );
extern int evn_obj_fall;
DECLARE_EVENT_CALLBACK( ecb_obj_fall            );
extern int evn_spec_fun;
DECLARE_EVENT_CALLBACK( ecb_spec_fun            );
extern int evn_class_action;
DECLARE_EVENT_CALLBACK( ecb_class_action  );
extern int evn_hunt_fleer;
DECLARE_EVENT_CALLBACK( ecb_hunt_fleer          );
extern int evn_scavenge;
DECLARE_EVENT_CALLBACK( ecb_scavenge            );
extern int evn_wander;
DECLARE_EVENT_CALLBACK( ecb_wander        );
extern int evn_cone_remove;
DECLARE_EVENT_CALLBACK( ecb_cone_remove         );
extern int evn_room_violence;
DECLARE_EVENT_CALLBACK( ecb_room_violence );
*/
extern int evn_prog_trigger;
/*
DECLARE_EVENT_CALLBACK( ecb_prog_trigger  );
extern int evn_prog_wait;
DECLARE_EVENT_CALLBACK( ecb_prog_wait           );

extern int evn_area_reset;
DECLARE_EVENT_CALLBACK( ecb_area_reset          );
*/

DECLARE_EVENT_CALLBACK(ecb_char_test);
extern int evn_char_test;

#endif