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

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

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

     create()
     {
       ...

       AddFun("seekrank", 5);
       ...
     }

     seekrank()
     {
       object *passagiere, opfer;

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

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

       // Und viel Spass...
       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",
                 capitalize(opfer->name(WEN)),
                 capitalize(opfer->QueryPronoun(WER))), ({ opfer }) );
     }

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

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


Last modified: Wed May 8 10:16:46 1996 by Wargon

