LPMUD/
LPMUD/BIN/
LPMUD/DOC/
LPMUD/MUDLIB/
LPMUD/MUDLIB/BANISH/
LPMUD/MUDLIB/D/
LPMUD/MUDLIB/DOC/
LPMUD/MUDLIB/DOC/DOMAINS/
LPMUD/MUDLIB/DOC/EFUN/
LPMUD/MUDLIB/DOC/EXAMPLES/
LPMUD/MUDLIB/DOC/EXAMPLES/ARMOUR/
LPMUD/MUDLIB/DOC/EXAMPLES/CONTAIN/
LPMUD/MUDLIB/DOC/EXAMPLES/FOOD/
LPMUD/MUDLIB/DOC/EXAMPLES/MAGIC/
LPMUD/MUDLIB/DOC/EXAMPLES/MONSTER/
LPMUD/MUDLIB/DOC/EXAMPLES/ROOM/
LPMUD/MUDLIB/DOC/EXAMPLES/WEAPONS/
LPMUD/MUDLIB/FUNCTION/
LPMUD/MUDLIB/INCLUDE/
LPMUD/MUDLIB/INCLUDE/FN_SPECS/
LPMUD/MUDLIB/INCLUDE/SKILLS/
LPMUD/MUDLIB/INFO/
LPMUD/MUDLIB/INHERIT/BASE/
LPMUD/MUDLIB/LOG/
LPMUD/MUDLIB/MANUALS/312/
LPMUD/MUDLIB/NEWS/
LPMUD/MUDLIB/OBJ/PARTY/
LPMUD/MUDLIB/OBJ/SHADOWS/
LPMUD/MUDLIB/OBJECTS/COMPONEN/
LPMUD/MUDLIB/OPEN/
LPMUD/MUDLIB/OPEN/LIBRARY/
LPMUD/MUDLIB/OPEN/PARTY/
LPMUD/MUDLIB/PLAYERS/
LPMUD/MUDLIB/PLAYERS/ZIL/
LPMUD/MUDLIB/ROOM/
LPMUD/MUDLIB/ROOM/CITY/ARENA/
LPMUD/MUDLIB/ROOM/CITY/CREATOR/
LPMUD/MUDLIB/ROOM/CITY/GARDEN/MONST/
LPMUD/MUDLIB/ROOM/CITY/OBJ/
LPMUD/MUDLIB/ROOM/CITY/PUB/
LPMUD/MUDLIB/ROOM/CITY/SHOP/
LPMUD/MUDLIB/ROOM/DEATH/
LPMUD/MUDLIB/ROOM/REGISTRY/
LPMUD/MUDLIB/SECURE/
LPMUD/MUDLIB/SECURE/UDP_CMD_/
LPMUD/MUDLIB/SKILLS/
LPMUD/MUDLIB/SKILLS/FIGHTER/
LPMUD/MUDLIB/SKILLS/THIEF/
LPMUD/MUDLIB/USR/
LPMUD/MUDLIB/USR/CREATORS/
LPMUD/MUDLIB/USR/PLAYERS/
/*
   Inherit this to start shadows, and helps to provide info about
   objects that are shadowing. shadow(ob,0) will return the last
   object that has shadowed ob. But there may be more then one
   active shadow. query_shadow_ob() will give the 'upper' most
   shadow object. query_shadow_list() will provide a list of all
   currently active shadows.
 */

object *shadows;

static status filter_zeros(object ob) { return (ob) ? 1 : 0; }

object *query_shadow_list() { 
  if(!shadows) shadows = ({});
  return shadows = filter_array(shadows,"filter_zeros",this_object());
}


/* don't call this or you will upset the list */

void set_shadow_list(object *arg) {
  string file;
  
  if(previous_object()) { /* lets restrict wizard damage */ 
   if(!sscanf(file_name(previous_object()),"obj/shadows/%s",file)) return;
  }
  shadows = arg;
}

object query_shadow_ob() { return this_object(); }


static void shadow_object(object ob) {
  object obj;
  int i;

  if(!ob) {
    destruct(this_object());
    return;
  }
  if(!shadows) shadows = ({});
  if((obj = shadow(ob,0))) {
    shadows = (object *)obj->query_shadow_list();
  }
  shadow(ob,1);
  shadows += ({ this_object(), });
  for(i = 0; i < sizeof(shadows); i++) {  /* all shadows have same list */
    if(shadows[i]) shadows[i]->set_shadow_list(shadows);
  }      
}