init()
******


FUNKTION
========

   public varargs void init(object origin);


DEFINIERT IN
============

   /std/room/description.c


ARGUMENTE
=========

   object origin
      Ursprungsumgebung der Bewegung / letzte Umgebung des Lebewesen
      (sofern existent)


BESCHREIBUNG
============

   init() wird immer dann aufgerufen, wenn ein lebendes Objekt in die
   Naehe anderer Objekte bewegt wird oder ein nicht lebendiges Objekt
   in die Naehe von Lebewesen gelangt. init() wird dabei in allen
   Objekten aufgerufen, bei denen es notwendig ist.

   Der Hauptzweck dieser Funktion besteht darin, den Objekten
   untereinander ihre jeweiligen Befehle zugaenglich zu machen.
   Waehrend dies in anderen MudLibs durch eine Reihe von
   add_action()-Aufrufen im Rumpf von init() geschah, geschieht dies
   in der MG-MudLib bei Objekten, die /std/thing/commands.c erben (das
   sind zB. alle Standardobjekte) quasi automatisch (dort werden die
   Befehle dann per AddCmd() im create() angemeldet, man spart sich
   die Implementierung von init(). Der andere Weg ist aber natuerlich
   immer noch moeglich.

   Der Ablauf der init()-Kette ist wie folgt:

      1. Ist das Objekt X, welches ins Zielobjekt D bewegt wurde, ein
         Lebewesen, so wird in D init() aufgerufen, wobei
         this_player() auf X gesetzt ist.

      2. Dann wird fuer jedes Objekt C in D folgendes ausgefuehrt:

         * Ist C ein Lebewesen, dann wird init() in X aufgerufen,
           wobei this_player() auf C gesetzt ist.

         * Ist X ein Lebewesen, dann wird init() in C aufgerufen,
           wobei this_player() auf X gesetzt ist.

      3. Schliesslich wird in dem Fall, dass D lebendig ist, in X
         init() aufgerufen, wobei this_player() auf D gesetzt ist.

   Das Argument <origin> kann genutzt werden, um herauszufinden, wo
   das Lebewesen nun eigentlich herkam.


RUeCKGABEWERT
=============

   keiner


BEMERKUNGEN
===========

   * Wenn man init() ueberschreibt und vergisst, in etwaigen geerbten
     Programmen das init() zu rufen, resultiert das in schweren Bugs

   * Das Argument <origin> gab es frueher nicht und es ist weitgehend
     optional. Die Standardlib uebergibt es, aber nicht alle
     (speziell) aeltere Programme uebergeben es weiter an ihre
     geerbten init().


BEISPIELE
=========

   D sei ein Raum, in dem sich das Lebewesen L1 sowie die Gegenstaende
   N1 und N2 befinden. Betritt ein Spieler X diesen Raum, so werden
   folgende init()s aufgerufen:

      1. D->init();  // this_player() == X

      2. X->init();  // this_player() == L1

      3. L1->init(); // this_player() == X

      4. N1->init(); // this_player() == X

      5. N2->init(); // this_player() == X

   Gelangt dagegen ein nichtlebendiges Objekt nach D, so sieht das
   Ganze wie folgt aus:

      1. X->init();    // this_player() == L1


SIEHE AUCH
==========

   exit(), AddCmd(), NotifyInsert()

   add_action(E)

Last modified: 07.03.2018, Zesstra
