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.

        Wenn das erste Argument ein nicht-String <msg> ist, wird die Lfun
        catch_msg() in allen lebendigen Objekt im Raum aufgerufen, ausser im
        Objekt, das say() aufgerufen hat. Der Wert <msg> wird als erstes
        Argument an catch_msg() uebergeben, das aufrufende Objekt als zweites
        Argument.

        MERKE: Wenn die Lfun catch_msg() den Wert <msg> veraendert, erhalten
        alle nachfolgenden Objekte das veraenderte <msg>.

        Wird der Efun say() ein zweites Argument angegeben, kann man andere
        Objekte als nur das aufrufende Objekt ausschliessen. Wenn das zweite
        Argument ein einzelnes Objekt <exclude> ist, werden das aufrufende
        Objekt und <exclude> von der Meldung ausgeschlossen. Wenn das zweite
        Argument ein Array <excludes> ist, werden alle Objekte aus dieser
        Liste zusaetzlich zum aufrufenden Objekt als Empfaenger von say()
        ausgeschlossen.

        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 gilt das Objekt, das say() aufgerufen
            hat, als aufrufendes Objekt.

BEISPIELE
        Folgende Aufrufe sind gleich, wenn sie aus einem nicht lebendigen
        Objekt aufgerufen 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, sodass
        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) {
                int i;
                if (!arr) return;
                for (i=0;i<sizeof(arr);i++)
                    tell_object(who, (stringp(arr[i]) ? arr[i] : "-/-")+"\n");
            }

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

ANMERKUNGEN
        Wenn die Lfun catch_msg() den Wert <msg> veraendert, erhalten alle
        nachfolgenden Objekte das veraenderte <msg>.

GESCHICHTE
        LDMud 3.3.686 erlaubt die Verwendung eines mapping/struct/object als
        zweites Argument.

SIEHE AUCH
        write(E), tell_object(E), tell_room(E)
