/* /lib/clean.c * From the Nightmare IV LPC Library * the central object of the entire mudlib * created by Descartes of Borg 940210 * Version: @(#) clean.c 1.3@(#) * Last Modified: 96/12/16 */ #include <clean_up.h> private static int NoClean = 0; /* ******************* clean.c attributes ************************* */ int GetNoClean() { return NoClean; } static int SetNoClean(int x) { return (NoClean = x); } /* ******************* clean.c events ************************* */ /** * Destruct() and eventDestruct() differ in that external objects use * eventDestruct() to ask permission for destructing an object. Destruct() * really should be called eventInternalDestruct() or something for * naming consistency, but the Destruct() name remains for historical * purposes. To destruct this_object(), call Destruct(). To destruct * another object, call ob->eventDestruct(). */ static int Destruct() { object env; object *inv; int i; if( !this_object() ) { return 1; } env = environment(); if( env ) { foreach(object ob in all_inventory()) { if( ob ) { ob->eventMove(env); } } } remove_call_out(); destruct(this_object()); return !(this_object()); } int eventDestruct() { return Destruct(); } /* ******************* clean.c driver applies ********************* */ int clean_up(int ref_exists) { object array inv; object env; if( NoClean || ref_exists ) { return NEVER_AGAIN; } if( !this_object() ) { return NEVER_AGAIN; } env = environment(); if( env ) { if( env->isBag() ) { return TRY_AGAIN_LATER; } if( env->GetProperty("storage room") ) { return TRY_AGAIN_LATER; } } inv = deep_inventory(this_object()); if( sizeof(filter(inv, (: userp :))) ) { return TRY_AGAIN_LATER; } if( !env ) { catch(inv->eventDestruct()); if( this_object() ) { Destruct(); } if( this_object() ) { destruct(this_object()); } return NEVER_AGAIN; } if( userp(env) ) { return TRY_AGAIN_LATER; } return env->clean_up(); }