/*
** dg_event.c: This file contains a simplified event system to allow
** DG Script triggers to use the "wait" command, causing a delay in the
** middle of a script.
**
** NOTE: This is NOT the dg events package that is available!
**
** By: Mark A. Heilpern (Sammy @ eQuoria MUD equoria.com:4000)
*/
#include "conf.h"
#include "sysdep.h"
#include "structs.h"
#include "utils.h"
#include "dg_event.h"
/*
** define statics
*/
static struct event_info *event_list = NULL;
/*
** Add an event to the current list
*/
struct event_info *
add_event(int time, EVENT(*func), void *info)
{
struct event_info *this_data, *prev, *curr;
CREATE(this_data, struct event_info, 1);
this_data->time_remaining = time;
this_data->func = func;
this_data->info = info;
/* sort the event into the list in next-to-fire order */
if (event_list==NULL)
event_list = this_data;
else if (this_data->time_remaining <= event_list->time_remaining) {
this_data->next = event_list;
event_list = this_data;
} else {
prev = event_list;
curr = prev->next;
while (curr && (curr->time_remaining > this_data->time_remaining)) {
prev = curr;
curr = curr->next;
}
this_data->next = curr;
prev->next = this_data;
}
return this_data;
}
void
remove_event(struct event_info *event)
{
struct event_info *curr;
if (event_list == event) {
event_list = event->next;
} else {
curr = event_list;
while (curr && (curr->next != event))
curr = curr->next;
if (!curr) return; /* failed to find it */
curr->next = curr->next->next;
}
free(event);
}
void
process_events(void)
{
struct event_info *e = event_list;
struct event_info *del;
while (e) {
if (--(e->time_remaining) == 0) {
e->func(e->info);
del = e;
e = e->next;
remove_event(del);
} else
e = e->next;
}
}