/* Do not remove the headers from this file! see /USAGE for more info. */ /* * * Transient effects inheritable for diseases, intoxication, etc... * Midhir@Mutants and Machinery * July 15 1997 * */ #include <hooks.h> inherit OBJ; inherit M_GETTABLE; int effect_duration, effect_type; string effect_name; int is_transient_effect() { return 1; } //:HOOK another_effect_exists //Passed the object of the existing effect, used to perform extra //functionality if another effect with the same type/name exists. void another_effect_exists(object ob) { ob->add_effect_duration(effect_duration); this_object()->remove(); } //:FUNCTION set_effect_duration //Set the duration of the effect in number of heart_beats void set_effect_duration(int d) { effect_duration = d; } int query_effect_duration() { return effect_duration; } void add_effect_duration(int d) { effect_duration += d; } //:FUNCTION set_effect_type //Set the string type of effect this is, used to make sure only //one object of each type is in one inventory. void set_effect_type(int t) { effect_type = t; } int query_effect_type() { return effect_type; } //:FUNCTION set_effect_name //Sets the string name of the effect, this isn't currently used for //anything, but could be used for more descriptive names than set_effect_type. void set_effect_name(string n) { effect_name = n; } string query_effect_name() { return effect_name; } //:FUNCTION do_effect //overload this function to create effects. //The first argument is the object being afflicted. void do_effect(object affected) {} void heart_beat() { if (!environment()->is_living()) set_heart_beat(0); else set_heart_beat(1); do_effect(environment()); if (effect_duration <= 0) this_object()->remove(); effect_duration--; } void mudlib_setup() { set_attached(1); add_save(({"effect_duration"})); set_heart_beat(1); } varargs mixed move(object dest, string where) { foreach (object ob in all_inventory(dest)) { if (!ob->is_transient_effect()) continue; if (ob->query_effect_type() == effect_type && ob->query_effect_name() == effect_name) { call_hooks("another_effect_exists", HOOK_IGNORE, ob); return; } continue; } set_heart_beat(1); return ::move(dest, where); } mapping lpscript_attributes() { return object::lpscript_attributes()+m_gettable::lpscript_attributes(); }