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

