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
