
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
