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

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

DESCRIPTION
        There are two major modes of calling:

        If the first argument is a string <str>, it will be send to
        all livings in the current room except to the initiator.

        If the first argument is an array/mapping/struct/object <msg>, the
        lfun catch_msg() of all living objects except the initiator will be
        called.
        This <msg> will be given as first argument to the lfun, and
        the initiating object as the second.
        CAVEAT: If the lfun catch_msg() modifies the content of <msg>, all
        subsequent objects will receive the modified <msg>.

        By specifying a second argument to the efun one can exclude
        more objects than just the initiator. If the second argument
        is a single object <exclude>, both the given object and the
        initiator are excluded from the call. If the second argument
        is an array <excludes>, all objects and just the objects in
        this array are excluded from the call.

        The 'initiator' is determined according to these rules:
          - if the say() is called from within a living object, this
            becomes the initiator
          - if the say() is called from within a dead object as result
            of a user action (i.e. this_player() is valid), this_player()
            becomes the initiator.
          - Else the object calling the say() becomes the initiator.

EXAMPLES
        say("Hi!\n");
        say("Hi!\n", this_player());
        Both calls are equal when called by a not living object.

        Object 1 (living):
           void catch_tell(string str) {
              write("Received: "+str+"\n");
           }
        Object 2 (not living):
           void func() {
              ...
              say("HiHo!\n");
              ...
           }

        This examples shows how say() together with catch_tell()
        works. The 2nd object must not be living so the write() will
        go to the current user.


        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 (not living):
           void func() {
              ...
              say( ({ "Hello", "there!" }) );
              ...
           }

        This is a bit complex example to demonstrate how say() and
        catch_msg() works. Here we also use a non living object to
        send the message so the who in catch_msg() will be the current
        user.

HISTORY
        LDMud 3.3.686 added the use of a mapping/struct/object as second
        argument.

SEE ALSO
        write(E), tell_object(E), tell_room(E)
