//*****************************************************************************
//
// hooks.c
//
// Hooks are chunks of code that attach on to parts of game code, but aren't
// really parts of the game code. Hooks can be used for a number of things. For
// instance: processing room descriptions by outside modules before they are
// displayed to a character, running triggers when certain events happen, or
// perhaps logging how many time a room is entered or exited. We would probably
// not want to hard-code any of these things into the core of the mud if they
// are fairly stand-alone. So instead, we write hooks that attach into the game
// and execute when certain events happen.
//
// Often events that will execute hooks are set off by someone or something
// taking an action. Thus, all hooks take 3 arguments (actor, acted, arg) to
// make it easy to handle these cases. These 3 arguments do not need to be used
// for all hooks, however.
//
//*****************************************************************************
#include "mud.h"
#include "utils.h"
#include "hooks.h"
//*****************************************************************************
// local functions, variables, and definitions
//*****************************************************************************
// the table of all our installed hooks
HASHTABLE *hook_table = NULL;
//*****************************************************************************
// implementation of hooks.h
//*****************************************************************************
void init_hooks(void) {
// make our table of hooks
hook_table = newHashtable();
}
void hookAdd(const char *type, void *hook) {
LIST *list = hashGet(hook_table, type);
if(list == NULL) {
list = newList();
hashPut(hook_table, type, list);
}
listQueue(list, hook);
}
void hookRun(const char *type, void *actor, void *acted, void *arg) {
LIST *list = hashGet(hook_table, type);
if(list != NULL) {
LIST_ITERATOR *hook_i = newListIterator(list);
void (* hook)(void *actor, void *acted, void *arg) = NULL;
ITERATE_LIST(hook, hook_i)
hook(actor, acted, arg);
deleteListIterator(hook_i);
}
}
void hookRemove(const char *type, void *hook) {
LIST *list = hashGet(hook_table, type);
if(list != NULL) listRemove(list, hook);
}