/**
* This is a changer and handler rolled into one. The base
* object stores all the situations and the clones of it
* point its sitdata for theirs.
*
* The situations for the base object may be setup
* using the setup_situations function which is only
* called on the base, not the clones. Otherwise
* you can call add_situations as usual but you its good
* to check that the room's changer is not a clone first.
*/
#include <situations.h>
inherit "/std/room/basic/situation_changer";
void add_situation( mixed label, class situation sit ) {
if (!clonep()) ::add_situation( label, sit );
else write("You can't add situations to a clone of this object.");
}
/* The base object will be used to manage a room */
object set_room(object room_o) {
// tell_creator("shaggy","set room on %O\n",TO);
if (clonep() ) {
object base;
base = find_object(base_name(TO));
if (!base) {
(base_name(TO))->parp();
base = find_object(base_name(TO));
}
// if (!base) tell_creator("shaggy","%O just wouldn't load!\n",base_name(TO));
if (!(base->query_room())) {
// tell_creator("shaggy","Using %O instead of %O\n",base,TO);
call_out( "dest_me", 2 );
return room_o->set_situation_changer( base );
}
sitdata = base->query_situations();
}
return ::set_room( room_o );
}
void dest_me() {
// tell_creator("shaggy","Test Desting %O %O\n,",TO,
// sizeof(children(base_name(TO))));
if (clonep()) ::dest_me();
else if (sizeof(children(base_name(TO)))==1) ::dest_me();
return;
}
void create() {
// tell_creator("shaggy","create on %O\n",TO);
if (!clonep()) TO->setup_situations();
}