create()

FUNKTION:
     protected void create();
     void create();

DEFINIERT IN:
     allen Standardobjekten

ARGUMENTE:
     keine

BESCHREIBUNG:
     Diese Funktion wird aufgerufen, wenn ein Objekt geladen oder geclont
     wird.
     In dieser Funktion wird das Objekt initialisiert und konfiguriert.
     Waehrend des create() kann es einen this_player()/this_interactive()
     geben, muss aber nicht!
     Im create() hat das Objekt noch kein environment().
     create() wird nur gerufen, wenn das Objekte geclont oder explizit geladen
     wird. Wenn es aufgrund eines inherit in einem anderen Objekt vom Driver
     geladen wird, wird das create() nicht ausgefuehrt (s. create_super()).

RUeCKGABEWERT:
     keiner

BEMERKUNGEN:
     Erbt man von anderen Objekten, so besteht die erste Aktion innerhalb
     von create() normalerweise darin, in diesen Objekten create()
     aufzurufen.
     Die Funktion kann protected oder static sein (aber nicht private). Es
     duerfte fuer die meisten Objekte sinnvoll sein, create() protected zu
     deklarieren.

     Um Speicher zu sparen, kann man bei Blueprints von der Konfigurierung
     absehen (siehe Beispiel). Dies sollte man allerdings nicht bei Objekten
     machen, von denen keine Clones erzeugt werden sollen (zB. bei Raeumen). 

     Man sollte bei Abbruch des create() in BP unbedingt set_next_reset(-1);
     rufen, da sonst die (nicht konfigurierte) BP resetten kann und dann
     buggt.

BEISPIELE:
     Ein Gegenstand wuerde wie folgt konfiguriert:

     inherit "std/thing";

     #include <properties.h>

     create()
     {
       // Wenn wir die Blueprint sind: NICHT konfigurieren!
       // Bei normalen Raeumen oder Transportern sind diese beiden
       // Zeilen wegzulassen!!!
       if (!clonep(this_object())) {
           set_next_reset(-1);    // wichtig, damit die BP nicht resettet.
           return;
       }

       // Ansonsten die allgemeinen Eigenschaften von /std/thing
       // konfigurieren...
       ::create();

       // ...und nun unsere speziellen Eigenschaften:
       SetProp(P_NAME, "Muell");
       SetProp(P_SHORT, "Muell");
       SetProp(P_LONG, "Voellig unnuetzer Muell!\n");
       SetProp(P_ARTICLE, 0);
       SetProp(P_VALUE, 0);
       SetProp(P_GENDER, MALE);
     }

SIEHE AUCH:
     create(L), reset(L)
     hook(C), create(H), create_ob(H), create_super(H, reset(H)
     create(A), reset(A)
----------------------------------------------------------------------------
22.10.2007, Zesstra
