/** Letzte Aenderung:
// 01.04.2008 - Objekte des VC werden jetzt im memory gespeichert
//            - Kleinere Aenderungen im Code.
// 01.01.2007 - Grundlegende Ueberarbeitung, Vanion
//            - Verwaltung der Objekte in einer Liste
//              Dadurch kann ls die VC-Objekte darstellen
//            - Genauere Ueberpruefung der Dateinamen auf 
//              Korrektheit. Falls ein illegaler Zugriff
//              stattfindet, wirds geloggt.
//
*/

#pragma strict_types
#pragma no_clone
#pragma no_shadow
#pragma no_inherit
#pragma verbose_errors
#pragma combine_strings
//#pragma pedantic
#pragma warn_deprecated

#include "haus.h"
#include <thing/properties.h>
#include <wizlevels.h>

#define MEMORY "/secure/memory"

private nosave mapping objects;
private nosave int show_clone_list;

/**
 Initialisierung
*/
void create()
{
  seteuid(getuid());

  // Zeiger auf Cloneliste holen
  if (call_other(MEMORY,"HaveRights")) {
    // Objektpointer laden
    objects = (mixed) call_other(MEMORY,"Load","objects");

    // Hats geklappt?
    if (!mappingp(objects)) 
    // vermutlich noch nicht initialisiert.
    // Zeiger erzeugen
    objects = ([]); 
    call_other(MEMORY,"Save","objects",objects); // Und in den Memory schreiben
  } else {
    // Wenn ich keinen Zeiger habe, muss ich halt einen lokalen nehmen.

    objects = ([]);
  }

  show_clone_list = 0; 
}

/**
 Die Funktion wird vom GameDriver aufgerufen. Wenn die Namen-
 konventionen passen, erzeugt compile_object ein passendes Objekt
 und gibt es zurueck
 \param name Name des zu ladenden Objekts
 \return Das geladene und initialisierte Objekt
*/
object compile_object(string name)
{
  object ob;

  if (name[<6..<3] == "haus" )
  {
    ob = (object) (VERWALTER)->_LadeHaus(name[0..<7]);
  }
  else if (name[<7..<4] == "raum" )
  {
    ob = (object) (VERWALTER)->_LadeRaum(name[0..<8], to_int(name[<3..<3]));
  } 
  else 
  {
    log_file("seher/haeuser/vc_load_error", 
      dtime(time())+"\n Falscher Objektname: "+name+"\n"+
  	         " PO:  "+object_name(previous_object(1))+",\n"+
  	         " PPO: "+object_name(previous_object(2))+",\n"+
  	         " TI:  "+object_name(this_interactive())+".\n\n");
  	return 0;
  }
  
  // Objekt speichern (fuer ls)
  if (objectp(ob)) objects[name] = ob;

  return ob;
}

/**
  Soll die Liste der Objekte zum VC per QueryObjects ausgegeben werden oder nicht?
*/
  
int ToggleCloneList()
{
  show_clone_list ^= 1;
  tell_object(this_player(), "Die Clone List wird nun "+
        (show_clone_list?"":"nicht mehr ")+"angezeigt.\n");
}

/**
 return all cloned virtual objects, wird zum Beispiel fuer "ls" benutzt.
*/
mixed QueryObjects()
{
  if (show_clone_list)
    return m_values(objects)-({0});
  else 
    return ({});
}

/**
  Nur EM und Maintainer duerfen die sicheren Funktionen nutzen
*/
int secure()
{
	if (ARCH_SECURITY || IS_MAINTAINER(this_interactive())) 
	  return 1;
	else  
	  return 0;
}

/*
/**
 Die Funktion versucht, die Clones dieses VCs aus der Objekt List 
 zu regenerieren
*/
/*
int regenerate_clone_list()
{
	if (sizeof(objects)==0)
	HDEBUG("Tbd: regenerate_clone_list im vc");
	
	return 1;
}
*/

/**
  Die Funktion zerstoert alle bereits geclonten Seherhausobjekte
  Das gibt wirklich nur irre wenige Momente, wo das nicht schlecht ist.
*/
int desctruct_all_my_clones()
{
  mixed ob;

  if (!secure()) return 0;

  if(!mappingp(objects)) return 0;
  
  for(ob = QueryObjects(); sizeof(ob); ob = ob[1..])
  {
    if(objectp(ob[0]))
    {
      ob[0]->remove();
      if(objectp(ob[0])) destruct(ob[0]);
    }
  }
   
  return 1;
}

