
AddFun()
********


FUNKTION
========

   void AddFun(string fun, int next);


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

   /std/transport.c


ARGUMENTE
=========

   fun
        Name der Funktion.
   next
        Zeit bis zur naechsten Fahrplanstation.


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

   Dem Fahrplan wird der Aufruf der Funktion fun, die im Transporter
   definiert sein muss, hinzugefuegt. Nach Aufruf der Funktion vergehen
   next Sekunden, bis die naechste Station angefahren wird.


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

   keiner


HINWEISE
========

   Die genannte Funktion <fun> wird per call_other() an this_object()
   gerufen, d.h. ihre Sichtbarkeit muss static oder public sein.


BEISPIELE
=========

   Wenn ein zufaellig ausgewaehlter Passagier eines Schiffes unterwegs
   seekrank werden soll, koennte man das wie folgt realisieren:

   protected void create() {
     ...
     AddFun("seekrank", 5);
     ...
   }

   seekrank() {
     // soll nicht immer passieren
     if (random(5))
       return;

     // Opfer auswaehlen
     object* passagiere = QueryPassengers();
     object opfer;
     if (sizeof(passagiere))
       opfer = passagiere[random(sizeof(passagiere))];

     tell_object(opfer,
       "Du wirst seekrank! Schnell stuerzt Du zur Reling, um Dich zu\n"
       "uebergeben.\n");
     tell_room(this_object(),
       sprintf("%s ueberkommt die Seekrankheit!\n"
               "%s stuerzt an die Reling, um sich zu uebergeben.\n",
               opfer->Name(WEN),
               capitalize(opfer->QueryPronoun(WER))), ({ opfer }) );
   }


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

   AddRoute(), AddMsg(), /std/transport.c

Last modified: 15.01.2020, Arathorn
