SYNOPSIS
        void say(string str);
        void say(string str, object exclude);
        void say(string str, object *excludes);

        void say(mixed *|mapping|struct|object msg);
        void say(mixed *|mapping|struct|object msg, object exclude);
        void say(mixed *|mapping|struct|object msg, object *excludes);

BESCHREIBUNG
        Es bestehen zwei Hauptanwendungen fuer say():

        Wenn das erste Argument ein String <str> ist, wird er an alle
        lebendigen Objekte im aktuellen Raum gesendet, ausser zum Objekt,
        das die Funktion aufgerufen hat.

        Ist die Nachricht ein String, wird der Text an interaktive Objekte
        direkt ausgegeben, fuer andere Objekte wird die lfun catch_tell()
        in diesen aufgerufen.
        Falls ein Lewebesen die Funktion catch_tell() definiert (-> shadow),
        so wird der Text hier ausgewertet und nicht an den User ausgegeben.

        Wenn das zweite Argument, die Nachricht, kein String ist, wird in
        allen Lebewesen, die den Text erhalten, catch_msg() anstatt
        catch_tell() aufgerufen.

        Mit dem Array <*exclude> kann man verhindern, dass die Nachricht an
        die darin enthaltenen Objekte gesendet wird. Der Sender muss nicht
        noch einmal aufgefuehrt werden.
        Das ist sinnvoll, wenn zB eine Spielergruppe Ausloeser einer Meldung
        ist und diese selbst nicht erhalten soll.

        Das aufrufende Objekt wird nach folgenden Regeln bestimmt:
          - Wenn say() aus einem lebendigen Objekt aufgerufen wird, gilt
            dieses als das aufrufende Objekt.
          - Wenn say() aus einem nicht-lebendigen Objekt als Resultat einer
            Handlung eines Benutzers aufgerufen wird (das heisst,
            this_player() ist gueltig), gilt this_player() als aufrufendes
            Objekt.
          - In allen anderen Faellen (Aufruf aus reset zB) gilt das Objekt,
            das say() aufgerufen hat, als aufrufendes Objekt.

BEMERKUNGEN
        - fuer laengere Meldungen sollte break_string() verwendet werden
        - wird in einem catch_msg() der Wert von <msg> veraendert, erhalten
          alle nachfolgenden Objekte das veraenderte <msg> (Referenz!)

        - say(<str>) ist verhaltensgleich zu
          tell_room(environment(), <str>, ({this_player()||this_object()}))

BEISPIELE
        // Folgende Aufrufe sind gleich, wenn sie durch ein Spielerkommando
        // in einem nicht lebendigen Objekt aufgeloest werden:

            say("Hi!\n");
            say("Hi!\n", this_player());

        // Das folgende Beispiel zeigt, wie say() zusammen mit catch_tell()
        // funktioniert. Das zweite Objekt darf nicht lebendig sein, damit
        // write() an den aktuellen Benutzer geht.

        Objekt 1 (living):
            void catch_tell(string str) {
                write("Empfangen: "+str+"\n");
            }

        Objekt 2 (nicht living):
            void func() {
                ...
                say("HiHo!\n");
                ...
            }

        // Ein etwas komplexeres Beispiel zeigt das Zusammenspiel von say()
        // und catch_msg(). Auch hier wird ein nicht-lebendiges Objekt
        // verwendet, das die Nachricht ausgibt, sodass das 'wer' in
        // catch_msg() auf den aktuellen Benutzer zeigt.

        Object 1 (living):
            void catch_msg(mixed *arr, object who) {
                foreach(mixed element: arr)
                    tell_object(who, sprintf("%O\n", element));
            }

        Object 2 (nicht living):
            void func() {
                ...
                say( ({ "Hello", "there!" }) );
                ...
            }

SIEHE AUCH
        Aehnlich:   tell_room(E), write(E), shout(E), tell_object(E),
                    printf(E)
        Verwandt:   catch_tell(E), catch_msg(A)
        Sonstiges:  object_name(E)

7.Aug 2007 Gloinson