MudOSa4DGD/
MudOSa4DGD/bin/
MudOSa4DGD/data/
MudOSa4DGD/doc/
MudOSa4DGD/doc/driver/
MudOSa4DGD/doc/efun/bitstrings/
MudOSa4DGD/doc/efun/command/
MudOSa4DGD/doc/efun/communication/
MudOSa4DGD/doc/efun/heart_beat/
MudOSa4DGD/doc/efun/interactive/
MudOSa4DGD/doc/efun/inventory/
MudOSa4DGD/doc/efun/living/
MudOSa4DGD/doc/efun/mappings/
MudOSa4DGD/doc/efun/strings/
MudOSa4DGD/doc/efun/uid/
MudOSa4DGD/doc/funs/
MudOSa4DGD/doc/language/
MudOSa4DGD/mudlib/dgd/doc/
MudOSa4DGD/mudlib/dgd/lib/include/dgd/
MudOSa4DGD/mudlib/dgd/lib/std/
MudOSa4DGD/mudlib/dgd/lib/sys/
MudOSa4DGD/mudlib/dgd/log/
MudOSa4DGD/mudlib/log/
MudOSa4DGD/mudlib/std/include/
MudOSa4DGD/mudlib/std/obj/
/*
 * trigger.c
 *
 * Support trigger-function as replacement for add_action.
 * Add_action is emulated through macros using triggers.
 *
 * (C) Frank Schmidt, Jesus@NorseMUD
 *
 */

/* mapping for the triggers in object */
private static mapping __triggers;



/* add a trigger to this object */
void add_trigger(mixed verb, mixed func) {
  if (!arrayp(verb)) {
    mixed *t;
    /* is <func> a string (function in this object)? */
    if (stringp(func))
      func = _FP(this_object(), func);
    /* make a mapping? */
    if (!mapp(__triggers))
      __triggers = ([ ]);
    /* make a verb-instance? */
    if (!arrayp(t=__triggers[verb]) || !::sizeof(t))
      __triggers[verb] = ({ func });
    else {
      /* add verb instance with <func> */
      t -= ({ func });
      t += ({ func });
    }
  }
  else {
    /* do this function for all <verb>s */
    map_array(verb, "add_trigger", this_object(), func);
  }
}


/* remove a trigger in this object */
varargs int remove_trigger(mixed verb, mixed func) {
  if (mapp(__triggers)) {
    if (!arrayp(verb)) {
      mixed *t;
      /* do we have a verb-instance? */
      if (arrayp(t=__triggers[verb]) && ::sizeof(t)) {
	if (func) {
	  /* is <func> a string (function in this object)? */
	  if (stringp(func))
	    func = _FP(this_object(), func);
	  /* remove verb instance with <func> */
	  if (!::sizeof(t -= ({ func }))) {
	    /* remove map instance completely */
	    map_delete(__triggers, verb);
	  }
	  return 1;
	}
	else {
	  if (::sizeof(t))
	    /* remove last added verb instance */
	    t = array_delete(t, ::sizeof(t)-1);
	  return 1;
	}
      }
    }
    else {
      /* do this function for all <verb>s */
      map_array(verb, "remove_trigger", this_object(), func);
      return 1;
    }
  }
  return 0;
}


/* get trigger-status */
varargs mixed query_triggers(string verb) {
  if (mapp(__triggers)) {
    if (stringp(verb)) {
      /* empty verbs ("") always matches */
      mixed *extra, *funcs;
      if (arrayp(extra=__triggers[""])) {
	if (arrayp(funcs=__triggers[verb]))
	  return extra + funcs;
	return copy(extra);
      }
      /* return triggers matching verb */
      return copy(__triggers[verb]);
    }
    return copy(__triggers);
  }
  return ([ ]);
}