nakedmud-mod/
nakedmud-mod/html/tutorials/
nakedmud-mod/html/tutorials/building_extras/
nakedmud-mod/html/tutorials/c/
nakedmud-mod/html/tutorials/reference/
nakedmud-mod/html/tutorials/scripting/
nakedmud-mod/html/tutorials/scripting_extras/
nakedmud-mod/lib/
nakedmud-mod/lib/help/A/
nakedmud-mod/lib/help/B/
nakedmud-mod/lib/help/C/
nakedmud-mod/lib/help/D/
nakedmud-mod/lib/help/G/
nakedmud-mod/lib/help/H/
nakedmud-mod/lib/help/J/
nakedmud-mod/lib/help/L/
nakedmud-mod/lib/help/M/
nakedmud-mod/lib/help/O/
nakedmud-mod/lib/help/P/
nakedmud-mod/lib/help/R/
nakedmud-mod/lib/help/S/
nakedmud-mod/lib/help/W/
nakedmud-mod/lib/logs/
nakedmud-mod/lib/misc/
nakedmud-mod/lib/players/
nakedmud-mod/lib/pymodules/polc/
nakedmud-mod/lib/txt/
nakedmud-mod/lib/world/
nakedmud-mod/lib/world/zones/examples/
nakedmud-mod/lib/world/zones/examples/mproto/
nakedmud-mod/lib/world/zones/examples/oproto/
nakedmud-mod/lib/world/zones/examples/reset/
nakedmud-mod/lib/world/zones/examples/rproto/
nakedmud-mod/lib/world/zones/examples/trigger/
nakedmud-mod/lib/world/zones/limbo/
nakedmud-mod/lib/world/zones/limbo/room/
nakedmud-mod/lib/world/zones/limbo/rproto/
nakedmud-mod/src/alias/
nakedmud-mod/src/dyn_vars/
nakedmud-mod/src/editor/
nakedmud-mod/src/example_module/
nakedmud-mod/src/help2/
nakedmud-mod/src/set_val/
nakedmud-mod/src/socials/
nakedmud-mod/src/time/
//*****************************************************************************
//
// triggers.c
//
// contains all of the functions for working with triggers. This has been
// separated off from scripts.c to keep things a bit more tidy.
//
//*****************************************************************************

#include "../mud.h"
#include "../utils.h"
#include "../storage.h"

#include "scripts.h"
#include "pyplugs.h"



//*****************************************************************************
// local datastructures, functions, and defines
//*****************************************************************************
struct trigger_data {
  char       *name; // a short description of what the trigger is intended for
  char       *type; // what type of hook does this trigger install itself as?
  char        *key; // our unique key for lookup in the world database
  BUFFER     *code; // the python script that is executed
  PyObject *pycode; // the compiled version of our python code
};



//*****************************************************************************
// implementation of triggers
//*****************************************************************************
TRIGGER_DATA  *newTrigger(void) {
  TRIGGER_DATA *data = malloc(sizeof(TRIGGER_DATA));
  data->name         = strdup("");
  data->type         = strdup("");
  data->key          = strdup("");
  data->code         = newBuffer(1);
  data->pycode       = NULL;
  return data;
}

void deleteTrigger(TRIGGER_DATA *trigger) {
  if(trigger->name) free(trigger->name);
  if(trigger->type) free(trigger->type);
  if(trigger->key)  free(trigger->key);
  deleteBuffer(trigger->code);
  Py_XDECREF(trigger->pycode);
  free(trigger);
}

STORAGE_SET *triggerStore(TRIGGER_DATA *trigger) {
  STORAGE_SET *set = new_storage_set();
  store_string(set, "name", trigger->name);
  store_string(set, "type", trigger->type);
  store_string(set, "code", bufferString(trigger->code));
  return set;
}

TRIGGER_DATA *triggerRead(STORAGE_SET *set) {
  TRIGGER_DATA *trigger = newTrigger();
  triggerSetName(trigger, read_string(set, "name"));
  triggerSetType(trigger, read_string(set, "type"));
  triggerSetCode(trigger, read_string(set, "code"));
  return trigger;
}

void triggerCopyTo(TRIGGER_DATA *from, TRIGGER_DATA *to) {
  triggerSetKey (to, triggerGetKey (from));
  triggerSetName(to, triggerGetName(from));
  triggerSetType(to, triggerGetType(from));
  triggerSetCode(to, triggerGetCode(from));
}

TRIGGER_DATA *triggerCopy(TRIGGER_DATA *trigger) {
  TRIGGER_DATA *newtrigger = newTrigger();
  triggerCopyTo(trigger, newtrigger);
  return newtrigger;
}

void triggerSetName(TRIGGER_DATA *trigger, const char *name) {
  if(trigger->name) free(trigger->name);
  trigger->name = strdupsafe(name);
}

void triggerSetType(TRIGGER_DATA *trigger, const char *type) {
  if(trigger->type) free(trigger->type);
  trigger->type = strdupsafe(type);
}

void triggerSetKey(TRIGGER_DATA *trigger, const char *key) {
  if(trigger->key) free(trigger->key);
  trigger->key = strdupsafe(key);
}

void triggerSetCode(TRIGGER_DATA *trigger, const char *code) {
  bufferClear(trigger->code);
  bufferCat(trigger->code, code);
  Py_XDECREF(trigger->pycode);
  trigger->pycode = NULL;
}

const char *triggerGetName(TRIGGER_DATA *trigger) {
  return trigger->name;
}

const char *triggerGetType(TRIGGER_DATA *trigger) {
  return trigger->type;
}

const char *triggerGetKey(TRIGGER_DATA *trigger) {
  return trigger->key;
}

const char *triggerGetCode(TRIGGER_DATA *trigger) {
  return bufferString(trigger->code);
}

BUFFER *triggerGetCodeBuffer(TRIGGER_DATA *trigger) {
  return trigger->code;
}

void triggerRun(TRIGGER_DATA *trigger, PyObject *dict) {
  // if we haven't yet run the trigger, compile the source code
  if(trigger->pycode == NULL)
    trigger->pycode = run_script_forcode(dict, bufferString(trigger->code),
					 get_key_locale(triggerGetKey(trigger)));
  // run right from the code
  else {
    run_code(trigger->pycode, dict, get_key_locale(triggerGetKey(trigger)));

    if(!last_script_ok())
      log_pyerr("Trigger %s terminated with an error:\r\n%s",
		trigger->key, bufferString(trigger->code));
  }
}