reset()
=======

FUNKTION
--------
::

     void reset();
     protected void reset();

BESCHREIBUNG
------------
::

     reset() wird vom GameDriver in jedem Objekt aufgerufen, um dem Objekt
     die Gelegenheit zu geben, sich wieder in einen definierten Zustand zu
     versetzen: Raeume und Monster erzeugen per AddItem() eingefuegte und
     zwischenzeitlich entfernte Objekte neu, Tueren schliessen sich ...

     Solange das Objekt "benutzt" wird, wird reset() regelmaessig alle
     45 Minuten (+/-15 Minuten) mit einer Aufloesung von 2s aufgerufen
     (d.h. der Driver prueft und ruft nur alle 2 Sekunden reset() auf
     allen Objekten).

     Wird eine Objekt nicht mehr "benutzt", d.h. wird an einem Objekt nicht
     von aussen (durch call_other etc.) _nach_ einem reset() eine Methode
     bzw. LFun gerufen, so bekommt dieses Objekt keinen weiteren reset().

     Ein Funktionsaufruf am Objekt schaltet den reset() wieder ein.
     Bei einem Objekt in einem Container waere das zB das Benutzen des
     Containers (Hineinlegen/Herausnehmen/Hineinsehen). Das kann
     sehr lange dauern.

     Die Abschaltung kann man verhindern, indem man im reset() per call_out()
     eine Funktion im Objekt ruft. Dies aber bitte _nur_ machen, wenn das
     Objekt _unbedingt_ auf einen staendigen Reset angewiesen ist, auch wenn
     es nicht "benutzt" wird.

     Aendern laesst sich die Zeit zwischen den Aufrufen von reset() mit
     set_next_reset(). Die Aufloesung von 2s kann man nicht aendern.

BEMERKUNGEN
-----------
::

     - man kann reset() nutzen, um Ereignisse auszuloesen:
       - es ist billiger als lange call_out()
       - siehe Warnung bezueglich Abschalten des reset
     - man kann reset() als protected oder static definieren, wenn man nicht
       moechte, dass die Funktion von aussen gerufen werden kann. Dies
       verhindert Einflussnahme von aussen, kann aber auch Debugmassnahmen
       erschweren. Es ist aber dennoch fuer einige Objekte sinnvoll.
     - der Driver ruft reset() unabhaengig von zusaetzlichen, "manuellen"
       Rufen von reset()
       - keine Rufe von reset() mit call_out() aus reset() (Callout-Ketten-
         bildung droht), fuer solche Faelle ist set_next_reset(E) da!
     - bei Blueprints sollte der reset() in der Regel abgeschaltet werden,
       sofern er nicht auf wichtige Aufgaben in der BP zu tun hat:
       protected void create() {
         if(!clonep(ME)) {
             set_next_reset(-1);
             return;
         }
         ::create();
         ...
       }

BEISPIELE
---------
::

     // ein NPC, der bei jedem reset() schaut, ob um ihn herum bessere
     // Ausruestung liegt als die, die er selbst gerade traegt:

     ...
     void reset() {
       ::reset();

       if(clonep(this_object()) && environment()) {
         object o;
         o=first_inventory(environment());
         while(o) {
             look_for_good_weapons_and_use_them_if_better(o);
             o=next_inventory(o);
         }
       }
     }

     // ein reset fuer einen Gegenstand, der vielleicht in
     // in einem Container landet und dann weiter einen reset
     // bekommen muss/soll

     void reset() {
       // irgend ein Code hier
       call_other(this_object(), "???"); // einfach nur was aufrufen
     }

SIEHE AUCH
----------
::

     clean_up(), set_next_reset(E), query_next_reset(E)
     memory

letzte Aenderung: 2009-01-14 Rumata

