Configure()

  public mixed Configure(mixed data)

DEFINIERT IN:
   Beliebigen Objekten

ARGUMENTE:
   <data>
     0 fuer Datenabfrage
     beliebige Daten, die ein Configure(0) vorher lieferte

BESCHREIBUNG:
   Viele Objekte werden fuer bestimmte Spieler konfiguriert und so
   personalisiert. Sie enthalten zusaetzlich zu den Daten, welche waehrend des
   create() gesetzt wurden, noch weitere spieler-individuelle Daten.
   Damit diese Objekte im Bedarfsfall neu erstellt werden koennen, sollte ein
   geeignetes Configure() definfiert werden, um diese Daten abzurufen und in
   einem neuen Clone (oder neugeladener Blueprint) wieder zu setzen.
   
   Existiert Configure() im Objekt, MUSS dieses bei einem Aufruf mit
   <data>==0 (d.h. Configure(0)) alle individuellen Daten zurueckliefern,
   die noetig sind, um den aktuellen Zustand des Objektes spaeter
   wiederherzustellen.
   Das Objekt darf nach dem Zurueckgeben dieser Daten diese NICHT mehr
   veraendern, d.h. es muss ggf. eine Kopie erstellt werden (copy, deep_copy)

   Genau diese Daten werden in einem neu geclonten Objekt durch den Aufruf
   von Configure(data) wieder gesetzt. Das Configure MUSS genau die Daten, die
   es im alten Objekt zurueckliefert, wieder akzeptieren.

RUeCKGABEWERT:
   Wenn <data>==0:
     Alle individuellen Daten in einer beliebigen Form. Ein Mapping bietet
     sich jedoch an.
     Nicht erlaubt sind: Objekte und Closures.

   Wenn <data>!=0:
     1, wenn die Daten zur Konfiguration akzeptiert wurden.
     0, sonst.

BEMERKUNGEN:
   Configure() ist nicht verpflichtet, erneut Daten zu akzeptieren, wenn es
   bereits einmal mit gueltigen Daten aufgerufen wurde.
   Das Zurueckschreiben der Daten kann auch nach Ablauf laengerer Zeit
   und/oder in einer anderen Uptime erfolgen.

BEISPIELE:
   Ein Objekt, welches ein anderes Objekt sicher ersetzt, d.h. die
   individuelle Konfiguration bleibt erhalten:
   mixed data;
   if (call_resolved(data,ob,"Configure",0) == 1) {
     string obname = load_name(ob);
     ob->remove();
     ob = clone_object(obname);
     if (data) {
       if (ob->Configure(data) == 1) {
         printf("Instanz von %s erfolgreich ersetzt, neues Objekt: %O\n",
             obname,ob);
       }
       else {
         raise_error(sprintf("Configure() in %O akzeptierte Daten nicht!\n",
             ob));
       }
     }
   }
   else {
     printf(break_string(
         "Das Objekt %O definiert keine Funktion Configure(). Es kann "
         "nicht sicher ersetzt werden, da unbekannt ist, ob es individuelle "
         "Daten enthaelt.",78));
   }

LETZTE AeNDERUNG:
26.09.2011, Zesstra

