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

        void say(mixed *arr)
        void say(mixed *arr, object exclude)
        void say(mixed *arr, 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 Array <arr> ist, wird die Lfun catch_msg()
        in allen lebendigen Objekt im Raum aufgerufen, ausser im Objekt, das
        say() aufgerufen hat. Der Array <arr> wird als erstes Argument an
        catch_msg() uebergeben, das aufrufende Objekt als zweites Argument.

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

        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 Array <arr> veraendert, erhalten alle
        nachfolgenden Objekte das veraenderte <arr>.

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