skylib_fluffos_v3/
skylib_fluffos_v3/bin/
skylib_fluffos_v3/bin/db/
skylib_fluffos_v3/fluffos-2.9-ds2.04/
skylib_fluffos_v3/fluffos-2.9-ds2.04/ChangeLog.old/
skylib_fluffos_v3/fluffos-2.9-ds2.04/Win32/
skylib_fluffos_v3/fluffos-2.9-ds2.04/compat/
skylib_fluffos_v3/fluffos-2.9-ds2.04/compat/simuls/
skylib_fluffos_v3/fluffos-2.9-ds2.04/include/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/clone/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/command/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/data/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/etc/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/include/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/inherit/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/inherit/master/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/log/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/single/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/single/tests/compiler/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/single/tests/efuns/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/single/tests/operators/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/u/
skylib_fluffos_v3/fluffos-2.9-ds2.04/tmp/
skylib_fluffos_v3/fluffos-2.9-ds2.04/windows/
skylib_fluffos_v3/mudlib/
skylib_fluffos_v3/mudlib/cmds/
skylib_fluffos_v3/mudlib/cmds/admin/
skylib_fluffos_v3/mudlib/cmds/guild-race/
skylib_fluffos_v3/mudlib/cmds/living/broken/
skylib_fluffos_v3/mudlib/cmds/player/group_cmds/
skylib_fluffos_v3/mudlib/cmds/playtester/
skylib_fluffos_v3/mudlib/d/admin/
skylib_fluffos_v3/mudlib/d/admin/room/
skylib_fluffos_v3/mudlib/d/admin/room/we_care/
skylib_fluffos_v3/mudlib/d/admin/save/
skylib_fluffos_v3/mudlib/d/admin/text/
skylib_fluffos_v3/mudlib/d/learning/TinyTown/buildings/
skylib_fluffos_v3/mudlib/d/learning/TinyTown/map/
skylib_fluffos_v3/mudlib/d/learning/TinyTown/roads/
skylib_fluffos_v3/mudlib/d/learning/chars/
skylib_fluffos_v3/mudlib/d/learning/functions/
skylib_fluffos_v3/mudlib/d/learning/handlers/
skylib_fluffos_v3/mudlib/d/learning/help_topics/
skylib_fluffos_v3/mudlib/d/learning/help_topics/npcs/
skylib_fluffos_v3/mudlib/d/learning/help_topics/objects/
skylib_fluffos_v3/mudlib/d/learning/help_topics/rcs_demo/
skylib_fluffos_v3/mudlib/d/learning/help_topics/rcs_demo/RCS/
skylib_fluffos_v3/mudlib/d/learning/help_topics/rooms/
skylib_fluffos_v3/mudlib/d/learning/help_topics/rooms/crowd/
skylib_fluffos_v3/mudlib/d/learning/help_topics/rooms/situations/
skylib_fluffos_v3/mudlib/d/learning/save/
skylib_fluffos_v3/mudlib/d/learning/school/
skylib_fluffos_v3/mudlib/d/learning/school/add_sc/
skylib_fluffos_v3/mudlib/d/learning/school/characters/
skylib_fluffos_v3/mudlib/d/learning/school/general/
skylib_fluffos_v3/mudlib/d/learning/school/getting-started/
skylib_fluffos_v3/mudlib/d/learning/school/getting-started/basic_commands/
skylib_fluffos_v3/mudlib/d/learning/school/getting-started/edtutor/
skylib_fluffos_v3/mudlib/d/learning/school/getting-started/unix_tutor/
skylib_fluffos_v3/mudlib/d/learning/school/items/
skylib_fluffos_v3/mudlib/d/learning/school/npc_school/
skylib_fluffos_v3/mudlib/d/learning/school/room_school/
skylib_fluffos_v3/mudlib/d/learning/school/room_school/room_basic/
skylib_fluffos_v3/mudlib/d/learning/school/room_school/situations/
skylib_fluffos_v3/mudlib/d/learning/school/room_school/terrain_tutor/
skylib_fluffos_v3/mudlib/d/learning/text/
skylib_fluffos_v3/mudlib/d/liaison/
skylib_fluffos_v3/mudlib/d/mudlib/
skylib_fluffos_v3/mudlib/d/mudlib/changes/
skylib_fluffos_v3/mudlib/d/playtesters/
skylib_fluffos_v3/mudlib/d/playtesters/effects/
skylib_fluffos_v3/mudlib/d/playtesters/handlers/
skylib_fluffos_v3/mudlib/d/playtesters/items/
skylib_fluffos_v3/mudlib/d/sage/
skylib_fluffos_v3/mudlib/doc/
skylib_fluffos_v3/mudlib/doc/creator/
skylib_fluffos_v3/mudlib/doc/driver/
skylib_fluffos_v3/mudlib/doc/driver/efuns/arrays/
skylib_fluffos_v3/mudlib/doc/driver/efuns/buffers/
skylib_fluffos_v3/mudlib/doc/driver/efuns/calls/
skylib_fluffos_v3/mudlib/doc/driver/efuns/compile/
skylib_fluffos_v3/mudlib/doc/driver/efuns/filesystem/
skylib_fluffos_v3/mudlib/doc/driver/efuns/floats/
skylib_fluffos_v3/mudlib/doc/driver/efuns/functions/
skylib_fluffos_v3/mudlib/doc/driver/efuns/general/
skylib_fluffos_v3/mudlib/doc/driver/efuns/mappings/
skylib_fluffos_v3/mudlib/doc/driver/efuns/mixed/
skylib_fluffos_v3/mudlib/doc/driver/efuns/mudlib/
skylib_fluffos_v3/mudlib/doc/driver/efuns/numbers/
skylib_fluffos_v3/mudlib/doc/driver/efuns/parsing/
skylib_fluffos_v3/mudlib/doc/login/
skylib_fluffos_v3/mudlib/doc/lpc/basic_manual/
skylib_fluffos_v3/mudlib/doc/lpc/intermediate/
skylib_fluffos_v3/mudlib/doc/new/add_command/
skylib_fluffos_v3/mudlib/doc/new/events/
skylib_fluffos_v3/mudlib/doc/new/handlers/
skylib_fluffos_v3/mudlib/doc/new/living/race/
skylib_fluffos_v3/mudlib/doc/new/living/spells/
skylib_fluffos_v3/mudlib/doc/new/object/
skylib_fluffos_v3/mudlib/doc/new/player/
skylib_fluffos_v3/mudlib/doc/new/room/guild/
skylib_fluffos_v3/mudlib/doc/new/room/outside/
skylib_fluffos_v3/mudlib/doc/new/room/storeroom/
skylib_fluffos_v3/mudlib/doc/object/
skylib_fluffos_v3/mudlib/doc/playtesters/
skylib_fluffos_v3/mudlib/doc/policy/
skylib_fluffos_v3/mudlib/doc/weapons/
skylib_fluffos_v3/mudlib/global/
skylib_fluffos_v3/mudlib/global/creator/
skylib_fluffos_v3/mudlib/handlers/
skylib_fluffos_v3/mudlib/include/casino/
skylib_fluffos_v3/mudlib/include/cmds/
skylib_fluffos_v3/mudlib/include/effects/
skylib_fluffos_v3/mudlib/include/npc/
skylib_fluffos_v3/mudlib/include/room/
skylib_fluffos_v3/mudlib/include/shops/
skylib_fluffos_v3/mudlib/net/daemon/
skylib_fluffos_v3/mudlib/net/daemon/chars/
skylib_fluffos_v3/mudlib/net/inherit/
skylib_fluffos_v3/mudlib/net/obj/
skylib_fluffos_v3/mudlib/net/obj/BACKUPS/
skylib_fluffos_v3/mudlib/obj/amulets/
skylib_fluffos_v3/mudlib/obj/armours/plate/
skylib_fluffos_v3/mudlib/obj/b_day/
skylib_fluffos_v3/mudlib/obj/clothes/transport/horse/
skylib_fluffos_v3/mudlib/obj/faith/symbols/
skylib_fluffos_v3/mudlib/obj/fungi/
skylib_fluffos_v3/mudlib/obj/gatherables/
skylib_fluffos_v3/mudlib/obj/instruments/
skylib_fluffos_v3/mudlib/obj/media/
skylib_fluffos_v3/mudlib/obj/misc/player_shop/
skylib_fluffos_v3/mudlib/obj/monster/godmother/
skylib_fluffos_v3/mudlib/obj/monster/transport/
skylib_fluffos_v3/mudlib/obj/rings/
skylib_fluffos_v3/mudlib/obj/scabbards/
skylib_fluffos_v3/mudlib/obj/spells/
skylib_fluffos_v3/mudlib/obj/stationery/
skylib_fluffos_v3/mudlib/obj/stationery/envelopes/
skylib_fluffos_v3/mudlib/obj/toys/
skylib_fluffos_v3/mudlib/obj/vessels/
skylib_fluffos_v3/mudlib/obj/weapons/axes/
skylib_fluffos_v3/mudlib/obj/weapons/chains/
skylib_fluffos_v3/mudlib/obj/weapons/maces/BACKUPS/
skylib_fluffos_v3/mudlib/save/autodoc/
skylib_fluffos_v3/mudlib/save/book_handler/
skylib_fluffos_v3/mudlib/save/books/history/calarien/
skylib_fluffos_v3/mudlib/save/mail/
skylib_fluffos_v3/mudlib/save/new_soul/data/
skylib_fluffos_v3/mudlib/save/parcels/
skylib_fluffos_v3/mudlib/save/playerinfo/
skylib_fluffos_v3/mudlib/save/players/d/
skylib_fluffos_v3/mudlib/save/players/s/
skylib_fluffos_v3/mudlib/save/random_names/
skylib_fluffos_v3/mudlib/save/random_names/data/
skylib_fluffos_v3/mudlib/save/terrains/
skylib_fluffos_v3/mudlib/save/terrains/tutorial_desert/
skylib_fluffos_v3/mudlib/save/terrains/tutorial_grassy_field/
skylib_fluffos_v3/mudlib/save/terrains/tutorial_mountain/
skylib_fluffos_v3/mudlib/save/todo_lists/
skylib_fluffos_v3/mudlib/secure/
skylib_fluffos_v3/mudlib/secure/cmds/admin/
skylib_fluffos_v3/mudlib/secure/cmds/lord/
skylib_fluffos_v3/mudlib/secure/config/
skylib_fluffos_v3/mudlib/secure/handlers/autodoc/
skylib_fluffos_v3/mudlib/secure/handlers/intermud/
skylib_fluffos_v3/mudlib/secure/include/global/
skylib_fluffos_v3/mudlib/secure/save/
skylib_fluffos_v3/mudlib/secure/save/handlers/
skylib_fluffos_v3/mudlib/secure/std/
skylib_fluffos_v3/mudlib/secure/std/classes/
skylib_fluffos_v3/mudlib/secure/std/modules/
skylib_fluffos_v3/mudlib/std/creator/
skylib_fluffos_v3/mudlib/std/dom/
skylib_fluffos_v3/mudlib/std/effects/
skylib_fluffos_v3/mudlib/std/effects/external/
skylib_fluffos_v3/mudlib/std/effects/fighting/
skylib_fluffos_v3/mudlib/std/effects/magic/
skylib_fluffos_v3/mudlib/std/effects/magic/BACKUPS/
skylib_fluffos_v3/mudlib/std/effects/other/BACKUPS/
skylib_fluffos_v3/mudlib/std/effects/priest/
skylib_fluffos_v3/mudlib/std/effects/room/
skylib_fluffos_v3/mudlib/std/environ/
skylib_fluffos_v3/mudlib/std/guilds/
skylib_fluffos_v3/mudlib/std/guilds/old/
skylib_fluffos_v3/mudlib/std/languages/
skylib_fluffos_v3/mudlib/std/liquids/
skylib_fluffos_v3/mudlib/std/npc/
skylib_fluffos_v3/mudlib/std/npc/goals/
skylib_fluffos_v3/mudlib/std/npc/goals/basic/
skylib_fluffos_v3/mudlib/std/npc/goals/misc/
skylib_fluffos_v3/mudlib/std/npc/plans/
skylib_fluffos_v3/mudlib/std/npc/plans/basic/
skylib_fluffos_v3/mudlib/std/npc/types/
skylib_fluffos_v3/mudlib/std/npc/types/helper/
skylib_fluffos_v3/mudlib/std/npcs/
skylib_fluffos_v3/mudlib/std/outsides/
skylib_fluffos_v3/mudlib/std/races/shadows/
skylib_fluffos_v3/mudlib/std/room/basic/BACKUPS/
skylib_fluffos_v3/mudlib/std/room/basic/topography/
skylib_fluffos_v3/mudlib/std/room/controller/
skylib_fluffos_v3/mudlib/std/room/inherit/topography/
skylib_fluffos_v3/mudlib/std/room/topography/area/
skylib_fluffos_v3/mudlib/std/room/topography/iroom/
skylib_fluffos_v3/mudlib/std/room/topography/milestone/
skylib_fluffos_v3/mudlib/std/shadows/curses/
skylib_fluffos_v3/mudlib/std/shadows/disease/
skylib_fluffos_v3/mudlib/std/shadows/fighting/
skylib_fluffos_v3/mudlib/std/shadows/healing/
skylib_fluffos_v3/mudlib/std/shadows/magic/
skylib_fluffos_v3/mudlib/std/shadows/poison/
skylib_fluffos_v3/mudlib/std/shadows/room/
skylib_fluffos_v3/mudlib/std/shops/controllers/
skylib_fluffos_v3/mudlib/std/shops/objs/
skylib_fluffos_v3/mudlib/std/shops/player_shop/
skylib_fluffos_v3/mudlib/std/socket/
skylib_fluffos_v3/mudlib/std/soul/d/
skylib_fluffos_v3/mudlib/std/soul/e/
skylib_fluffos_v3/mudlib/std/soul/i/
skylib_fluffos_v3/mudlib/std/soul/j/
skylib_fluffos_v3/mudlib/std/soul/k/
skylib_fluffos_v3/mudlib/std/soul/l/
skylib_fluffos_v3/mudlib/std/soul/n/
skylib_fluffos_v3/mudlib/std/soul/o/
skylib_fluffos_v3/mudlib/std/soul/q/
skylib_fluffos_v3/mudlib/std/soul/r/
skylib_fluffos_v3/mudlib/std/soul/u/
skylib_fluffos_v3/mudlib/std/soul/v/
skylib_fluffos_v3/mudlib/std/soul/y/
skylib_fluffos_v3/mudlib/std/soul/z/
skylib_fluffos_v3/mudlib/std/stationery/
skylib_fluffos_v3/mudlib/w/
skylib_fluffos_v3/mudlib/w/default/
skylib_fluffos_v3/mudlib/w/default/armour/
skylib_fluffos_v3/mudlib/w/default/clothes/
skylib_fluffos_v3/mudlib/w/default/item/
skylib_fluffos_v3/mudlib/w/default/npc/
skylib_fluffos_v3/mudlib/w/default/room/
skylib_fluffos_v3/mudlib/w/default/weapon/
skylib_fluffos_v3/mudlib/www/
skylib_fluffos_v3/mudlib/www/java/
skylib_fluffos_v3/mudlib/www/secure/
skylib_fluffos_v3/mudlib/www/secure/lpc/advanced/
skylib_fluffos_v3/mudlib/www/secure/lpc/intermediate/
skylib_fluffos_v3/win32/
/**
 * This is the tell command.
 * @changed Added support for adverbs - Sandoz, July 2003.
 */

#include <drinks.h>
#include <player.h>

#define TELL_REPLY_PROPERTY "tell reply list"
#define CUT_THOUGH_PROPERTY "cut earmuffed tells"
#define FAIL_DONT_ASK       0
#define ASK                 1
#define CUT_DONT_ASK        2

inherit COMMAND_BASE;
inherit SPEECH_BASE;

/**
 * This method delegates tells from cres to earmuffed players.
 * All emoticon and "asks you" or "exclaims" stuff removed.
 */
void delayed_tell( string yesno, object *recipients, string mess ) {
    object  ob, *netdead;
    int disappeared;

    yesno = lower_case(yesno);

    if( yesno != "yes" && yesno != "y") {
        write("Ok, tell aborted.\n");
        return;
    }

    netdead = ({ });
    mess = replace( mess, "%^", " ");

    disappeared = sizeof( recipients ) - sizeof( recipients -= ({ 0 }) );

    foreach( ob in recipients ) {
        if( !interactive( ob ) )
            netdead += ({ ob });

        // Tell them even if they are net dead -
        // it'll end up in their tell history.
        ob->event_person_tell( TP, TP->query_cap_name()+" cuts "
            "through your ear muffs and tells "+
            query_multiple_short( recipients - ({ ob }) + ({"you"}) )+": ",
            mess );
    }

    if( sizeof(netdead) )
        write("Warning: "+query_multiple_short(netdead)+
            ( sizeof(netdead) == 1 ? " is" : " are")+" net dead.\n");

    if( disappeared )
        write("It seems "+disappeared+" person"+( disappeared > 1 ?
            "s have" : " has")+" disappeared.\n");

    // Ooops - no one left to talk to!
    if( !sizeof( recipients ) ) {
        write("No-one wanted to stay around long enough to hear what you "
            "had to say.\n");
        return;
    }

    my_mess("You tell "+TP->convert_message(
        query_multiple_short(recipients) )+": ", mess );

    TP->add_tell_history("You cut through earmuffs and tell "+
        CAP( TP->convert_message( query_multiple_short( recipients ) ) )+": ",
        mess );

    return;

} /* delayed_tell() */

/** @ignore yes */
int cmd( string arg, mixed thing, string adverb ) {
    object *earmuffed, *net_dead, *multiple_earmuffed, *cannot_see;
    object *obs, *ok, *fail;
    string word, mangle, lang, words, them_mess, me_mess, who;
    string *ok_string;
    int i, gag;
    mixed busy;

    if( adverb ) {
        if( adverb[0] != '@' || sizeof(adverb) < 2 ) {
            add_failed_mess("Invalid adverb syntax to tell.\n");
            return 0;
        }
        adverb[0] = ' ';
        adverb = replace_string( adverb, "_", " ");
    } else {
        adverb = "";
    }

    // Don't allow someone with tells ear muffed to use tell.
    if( TP->check_earmuffs("tell") ) {
        add_failed_mess("You have tells earmuffed.\n");
        return -1;
    }

    if( pointerp(thing) ) {
        words = arg;

        if( function_exists("trap_tell", ENV(TP) )  &&
            member_array( TO, previous_object(-1) ) == -1 ) {
            return ENV(TP)->trap_tell( words, thing, 0 );
        }
    } else if( !objectp( thing ) ) {
        string old;
        if( !arg || sscanf( old = arg, "%s %s", word, words ) != 2 )
            return 0;

        word = lower_case( word );
        word = TP->expand_nickname( word );

        if( sizeof( thing = explode( word, ",") ) == 1 ) {
            thing = find_player( word );
        } else {
            thing = map( thing, (: find_player :) );
            thing -= ({ 0 });
        }

        if( !thing ) {
            if( ( i = member_array('@', old ) ) != -1 ) {
                string empty, mud, *bits;

                who = old[0..i-1];
                i = sizeof( bits = explode( old[i+1..], " ") );

                while( i-- ) {
                    mud = INTERMUD_H->mud_exists( implode( bits[0..i], " ") );

                    if( mud ) {
                        if( !TP->query_creator() ) {
                            add_failed_mess("Sorry, only creators may send "
                                "intermud tells.\n");
                            return 0;
                        }

                        if( i == sizeof(bits) - 1 ) {
                            empty = mud;
                            continue;
                        }

                        words = implode( bits[i+1..], " ");

                        if( INTERMUD_H->tell( who, mud, words+"%^RESET%^") ) {
                            TP->event_person_tell( TP, "You tell "+CAP(who)+
                                "@"+mud+": ", words );
                            return 1;
                        } else {
                            add_failed_mess("There are no muds registered "
                                "with the name "+implode( map( bits[0..i],
                                (: CAP($1) :) ), " ")+".\n");
                            return 0;
                        }
                    }
                }

                if( empty ) {
                    add_failed_mess("You cannot send an empty tell to "+
                        CAP(who)+"@"+empty+".\n");
                    return 0;
                }

                add_failed_mess("There are no muds registered with that "
                    "name.\n");
                return 0;
            }

            add_failed_mess( CAP(word)+" is not logged in.\n");
            return 0;
        }

        if( ENV(TP) ) {
            if( function_exists("trap_tell", ENV(TP) ) &&
                member_array( TO, previous_object(-1) ) == -1 ) {
                return stringp(thing) ?
                    ENV(TP)->trap_tell( words, ({ thing }), 0 ):
                    ENV(TP)->trap_tell( words, thing, 0 );
            }
        }
    } else {
        words = arg;
    }

    if( !pointerp(thing) )
        obs = ({ thing });
    else
        obs = thing;

    if( !sizeof( obs -= ({ TP }) ) ) {
        add_failed_mess("Talking to yourself again.  I don't know.\n");
        return 0;
    }

    if( sizeof(obs) > 20 ) {
        add_failed_mess("You can only tell messages to up to 20 people.\n");
        return 0;
    }

    if( sizeof( fail = TP->query_ignoring(obs) ) )  {
        write("You are currently ignoring "+query_multiple_short(fail)+
            ", so "+( sizeof(fail) > 1 ? " they" : fail[0]->HE )+" couldn't "
            "reply anyway.\n");
        if( !sizeof( obs -= fail ) )
            return 1;
    }

    if( sizeof( fail = TP->query_ignored_by(obs) ) ) {
        if( !TP->query_creator() ) {
            write("You are currently being ignored by "+
                query_multiple_short(fail)+", so you cannot tell them "
                "anything.\n");
            if( !sizeof( obs -= fail ) )
                return 1;
        } else {
            write("Warning!  "+query_multiple_short(fail)+
                ( sizeof(fail) > 1 ? " have" : " has")+" you on ignore.\n");
        }
    }

    if( !TP->query_creator() && TP->adjust_sp( -TELL_COST ) < 0 )
        return notify_fail(NO_POWER);

    word = query_word_type( words, "");

    if( word != "")
        word = " "+word+"ing";

    if( TP->query_volume(D_ALCOHOL) )
        words = drunk_speech( words );

    // General speech modifications (curses, etc).
    if( stringp( mangle = TP->mangle_speech( words ) ) )
        words = mangle;

    if( ENV(TP) ) {
        if( function_exists("mangle_tell", ENV(TP) ) )
            words = ENV(TP)->mangle_tell( words, thing, 0 );
    }

    if( word != " asking") {
        me_mess = "tell";
    } else {
        me_mess = "ask";
        word = "";
    }

    net_dead = ({ });
    multiple_earmuffed = ({ });
    earmuffed = ({ });
    ok = ({ });
    cannot_see = ({ });

    foreach( thing in obs ) {
        if( TP->query_gagged() ) {
            if( !creatorp(thing) ) {
                obs -= ({ thing });
                gag = 1;
                continue;
            }
        }

        if( sizeof(obs) > 1 && thing->check_earmuffs("multiple-tell") ) {
            multiple_earmuffed += ({ thing });
        } else if( thing->check_earmuffs("tell") ) {
            if( TP->query_creator() &&
                TP->query_property(CUT_THOUGH_PROPERTY) == CUT_DONT_ASK ) {
                // A cre that doesn't care about earmuffs, so we warn the
                // cre and player, but don't add to the ear muffed array.
                write("You cut through "+thing->poss_short()+" earmuffs.\n");
                tell_object( thing, TP->the_short()+" cuts through your "
                    "earmuffs.\n");
                // Add to the array of people who get the message.
                ok += ({ thing });
            } else {
                // Ok, someone cares, so we add to earmuffed array.
                earmuffed += ({ thing });
            }
        } else if( !TP->query_invis() || reference_allowed( TP, thing ) ) {
            ok += ({ thing });
        } else {
            cannot_see += ({ thing });
            ok += ({ thing });
        }
    }

    if( !sizeof(obs) ) {
        tell_object( TP, "You have been gagged!  You will not be able to "
            "tell anything to players until the gag is removed.  Perhaps you "
            "should talk to a creator about this.\n");
        return 1;
    } else if( gag ) {
        tell_object( TP, "You have been gagged!  You will only be able to "
            "talk to creators until the gag is removed.  All non creators "
            "removed from this tell.\n");
    }

    ok_string = map( ok, (: $1->query_name() :) ) + ({ TP->query_name() });

    foreach( thing in ok ) {
        words = replace( words, "%^", " ");
        thing->event_person_tell( TP, CAP( TP->short( 0, 1 ) )+" "+me_mess+
            "s "+query_multiple_short( ok - ({ thing }) + ({"you"}) )+
            ( thing->check_earmuffs("emoticon") ? "" : adverb )+
            word + ": ", words );

        // Lasts for 15 minutes.
        thing->add_property( TELL_REPLY_PROPERTY, ok_string, 15 * 60 );

        if( !interactive(thing) && userp(thing) )
            net_dead += ({ thing });
    }

    if( sizeof(net_dead) )
        write("Warning: "+query_multiple_short( map( net_dead,
            (: $1->query_cap_name() :) ) ) + ( sizeof(net_dead) == 1 ?
            " is" : " are")+" net dead.\n");

    if( sizeof(multiple_earmuffed) )
        write( query_multiple_short(multiple_earmuffed)+
            ( sizeof(multiple_earmuffed) == 1 ? " has" : " have")+" multiple "
            "tells earmuffed.\n");

    if( sizeof( earmuffed ) ) {
        write( query_multiple_short(earmuffed)+
            ( sizeof(earmuffed) == 1 ? " has" : " have")+" tells "
            "earmuffed.\n");
        if( TP->query_creator() &&
            TP->query_property(CUT_THOUGH_PROPERTY) != FAIL_DONT_ASK ) {
            write("Cut through earmuffs? (y/n) ");
            input_to( (: delayed_tell :), earmuffed, words, lang );
        }
    }

    busy = TP->query_busy();

    if( busy == 1 ) {
        write("Warning! You have your busy flag on.\n");
    } else if( pointerp(busy) && sizeof( ok - busy ) ) {
        write("Warning! You are currently set as busy with "+
            query_multiple_short(busy)+".\n");
    }

    if( sizeof(cannot_see) )
        write("Warning! "+query_multiple_short(cannot_see)+" cannot see you "
            "and will not be able to respond.\n");

    if( sizeof(ok) ) {
        them_mess = TP->convert_message( CAP( query_multiple_short(ok) ) );
        my_mess("You "+me_mess+" "+them_mess +
            ( TP->check_earmuffs("emoticon") ? "" : adverb ) + word + ": ",
            words );

        TP->add_tell_history("You "+me_mess+" "+them_mess + word +
            ( thing->check_earmuffs("emoticon") ? "" : adverb )+": ",
            words );

    } else if( TP->query_creator() && !sizeof( earmuffed ) ) {
        // We don't want this message *and* the one about cutting
        // through ear muffs, so if the player is a cre and has
        // already gotten the (y/n) stuff, we skip this.
        add_failed_mess("It seems no one was listening.\n");
        return -1;
    }

    return 1;

} /* cmd() */

/** @ignore yes */
int reply_cmd( string mess, string adverb ) {
    string *rep;
    object *obs;

    if( !rep = TP->query_property(TELL_REPLY_PROPERTY) ) {
        add_failed_mess("No-one has told you anything in the last 15 "
            "minutes.\n");
        return 0;
    }

    if( !sizeof( obs = map( rep, (: find_player($1) :) ) - ({ 0 }) ) ) {
        add_failed_mess("None of "+query_multiple_short(rep)+" are currently "
            "online.\n");
        return 0;
    }

    return cmd( mess, obs, adverb );

} /* reply_cmd() */

/** @ignore yes */
mixed query_patterns() {
    mixed ret;

    ret = ({
        "<indirect:player> <string'message'>", (: cmd( $4[1], $1, 0 ) :),
        "reply <string'message'>", (: reply_cmd( $4[0], 0 ) :),
        "<indirect:player> <word'@adverb'> <string'message'>",
        (: cmd( $4[2], $1, $4[1] ) :),
        "reply <word'@adverb'> <string'message'>",
        (: reply_cmd( $4[1], $4[0] ) :),
    });

    if( TP->query_creator() )
        ret += ({"<string'player@mudname <message>'>",
            (: cmd( $4[0], 0, 0 ) :) });

    return ret;

} /* query_patterns() */