/* /lib/clean.c
* From the Dead Souls 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>
#include <rooms.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, furn;
if( !this_object() ) {
return 1;
}
env = environment();
foreach(object ob in all_inventory()) {
if( ob ) {
if(env) ob->eventMove(env);
else ob->eventMove(ROOM_FURNACE);
}
}
if(this_object()){
if(living(this_object()) && furn = this_object()->GetProperty("furniture_object"))
if(objectp(furn)) furn->eventReleaseStand(this_object());
}
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(inv && sizeof(inv)){
if( sizeof(filter(inv, (: interactive($1) :))) ) {
return TRY_AGAIN_LATER;
}
if( sizeof(filter(inv, (: $1->GetNoClean() :))) ) {
return TRY_AGAIN_LATER;
}
}
if( !env ) {
if(this_object() && !strsrch(base_name(this_object()),"/lib/")){
return NEVER_AGAIN;
}
if(inv) catch(inv->eventMove(ROOM_FURNACE));
if( this_object() ) {
Destruct();
}
if( this_object() ) {
destruct(this_object());
}
return NEVER_AGAIN;
}
if( interactive(env) ) {
return TRY_AGAIN_LATER;
}
return env->clean_up();
}