#define MONSTER_HAND "/obj/handlers/monster_handler" mixed *spells; void create() { spells = ({ }); } void do_shadow() { int i, num; object ob; string fname; /* do we wint the sleaze of the year award???? */ this_object()->shadow_death(); fname = (string)MONSTER_HAND->query_shadow_name(); rm(fname+".c"); for (i=0;i<sizeof(spells);i+=2) write_file(fname+".c", "inherit \"/std/trigger/"+spells[i]+"\";\n"); write_file(fname+".c", read_file("/std/living/mon-shadow.c")); ob = clone_object(fname); ob->setup_shadow(this_object()); rm(fname+".c"); } int add_triggered_action(string name, string trigger, mixed ob, string func) { int i, j; if ((i=member_array(trigger, spells)) == -1) { spells += ({ trigger, ({ name, ({ ob, func }) }) }); do_shadow(); } else if ((j=member_array(name, spells[i+1])) == -1) spells[i+1] += ({ name, ({ ob, func }) }); else spells[i+1][j+1] = ({ ob, func }); } int remove_trigger(string name) { int i; if ((i=member_array(name, spells)) == -1) return 0; spells = delete(spells, i, 2); if (!sizeof(spells)) this_object()->shadow_death(); else do_shadow(); return 1; } int remove_triggered_action(string trigger, string name) { int i, j; if ((i=member_array(trigger, spells)) == -1) return 0; if ((j=member_array(name, spells[i+1])) == -1) return 0; spells[i+1] = delete(spells[i+1], i, 2); if (!sizeof(spells[i+1])) remove_trigger(trigger); return 1; } mixed *query_actions(string trigger) { int i; if ((i=member_array(trigger, spells)) == -1) return ({ }); return spells[i+1]; } mixed *query_spells() { return spells; }