skylib_mudos_v1/
skylib_mudos_v1/bin/
skylib_mudos_v1/bin/db/
skylib_mudos_v1/mudlib/banish/a/
skylib_mudos_v1/mudlib/banish/b/
skylib_mudos_v1/mudlib/banish/c/
skylib_mudos_v1/mudlib/banish/d/
skylib_mudos_v1/mudlib/banish/e/
skylib_mudos_v1/mudlib/banish/f/
skylib_mudos_v1/mudlib/banish/g/
skylib_mudos_v1/mudlib/banish/h/
skylib_mudos_v1/mudlib/banish/j/
skylib_mudos_v1/mudlib/banish/l/
skylib_mudos_v1/mudlib/banish/m/
skylib_mudos_v1/mudlib/banish/n/
skylib_mudos_v1/mudlib/banish/o/
skylib_mudos_v1/mudlib/banish/p/
skylib_mudos_v1/mudlib/banish/r/
skylib_mudos_v1/mudlib/banish/s/
skylib_mudos_v1/mudlib/banish/t/
skylib_mudos_v1/mudlib/banish/u/
skylib_mudos_v1/mudlib/banish/w/
skylib_mudos_v1/mudlib/cmds/
skylib_mudos_v1/mudlib/cmds/admin/
skylib_mudos_v1/mudlib/cmds/guild-race/
skylib_mudos_v1/mudlib/cmds/guild-race/crafts/
skylib_mudos_v1/mudlib/cmds/guild-race/magic/
skylib_mudos_v1/mudlib/cmds/guild-race/other/
skylib_mudos_v1/mudlib/cmds/living/broken/
skylib_mudos_v1/mudlib/cmds/player/group_cmds/
skylib_mudos_v1/mudlib/d/admin/
skylib_mudos_v1/mudlib/d/admin/room/
skylib_mudos_v1/mudlib/d/admin/room/we_care/
skylib_mudos_v1/mudlib/d/admin/save/
skylib_mudos_v1/mudlib/d/admin/text/
skylib_mudos_v1/mudlib/d/learning/TinyTown/buildings/
skylib_mudos_v1/mudlib/d/learning/TinyTown/map/
skylib_mudos_v1/mudlib/d/learning/TinyTown/roads/
skylib_mudos_v1/mudlib/d/learning/chars/
skylib_mudos_v1/mudlib/d/learning/functions/
skylib_mudos_v1/mudlib/d/learning/handlers/
skylib_mudos_v1/mudlib/d/learning/help_topics/
skylib_mudos_v1/mudlib/d/learning/help_topics/npcs/
skylib_mudos_v1/mudlib/d/learning/help_topics/objects/
skylib_mudos_v1/mudlib/d/learning/help_topics/rcs_demo/
skylib_mudos_v1/mudlib/d/learning/help_topics/rcs_demo/RCS/
skylib_mudos_v1/mudlib/d/learning/help_topics/rooms/
skylib_mudos_v1/mudlib/d/learning/help_topics/rooms/crowd/
skylib_mudos_v1/mudlib/d/learning/help_topics/rooms/situations/
skylib_mudos_v1/mudlib/d/learning/save/
skylib_mudos_v1/mudlib/d/learning/school/
skylib_mudos_v1/mudlib/d/learning/school/add_sc/
skylib_mudos_v1/mudlib/d/learning/school/characters/
skylib_mudos_v1/mudlib/d/learning/school/general/
skylib_mudos_v1/mudlib/d/learning/school/getting-started/
skylib_mudos_v1/mudlib/d/learning/school/getting-started/basic_commands/
skylib_mudos_v1/mudlib/d/learning/school/getting-started/edtutor/
skylib_mudos_v1/mudlib/d/learning/school/getting-started/unix_tutor/
skylib_mudos_v1/mudlib/d/learning/school/items/
skylib_mudos_v1/mudlib/d/learning/school/npc_school/
skylib_mudos_v1/mudlib/d/learning/school/room_school/
skylib_mudos_v1/mudlib/d/learning/school/room_school/room_basic/
skylib_mudos_v1/mudlib/d/learning/school/room_school/situations/
skylib_mudos_v1/mudlib/d/learning/school/room_school/terrain_tutor/
skylib_mudos_v1/mudlib/d/learning/text/
skylib_mudos_v1/mudlib/d/liaison/
skylib_mudos_v1/mudlib/d/mudlib/
skylib_mudos_v1/mudlib/d/mudlib/changes/
skylib_mudos_v1/mudlib/d/playtesters/
skylib_mudos_v1/mudlib/d/playtesters/effects/
skylib_mudos_v1/mudlib/d/playtesters/handlers/
skylib_mudos_v1/mudlib/d/playtesters/items/
skylib_mudos_v1/mudlib/d/sage/
skylib_mudos_v1/mudlib/doc/
skylib_mudos_v1/mudlib/doc/creator/
skylib_mudos_v1/mudlib/doc/driver/
skylib_mudos_v1/mudlib/doc/driver/efuns/arrays/
skylib_mudos_v1/mudlib/doc/driver/efuns/buffers/
skylib_mudos_v1/mudlib/doc/driver/efuns/compile/
skylib_mudos_v1/mudlib/doc/driver/efuns/filesystem/
skylib_mudos_v1/mudlib/doc/driver/efuns/floats/
skylib_mudos_v1/mudlib/doc/driver/efuns/functions/
skylib_mudos_v1/mudlib/doc/driver/efuns/general/
skylib_mudos_v1/mudlib/doc/driver/efuns/mappings/
skylib_mudos_v1/mudlib/doc/driver/efuns/mixed/
skylib_mudos_v1/mudlib/doc/driver/efuns/mudlib/
skylib_mudos_v1/mudlib/doc/driver/efuns/numbers/
skylib_mudos_v1/mudlib/doc/driver/efuns/parsing/
skylib_mudos_v1/mudlib/doc/known_command/
skylib_mudos_v1/mudlib/doc/login/
skylib_mudos_v1/mudlib/doc/lpc/basic_manual/
skylib_mudos_v1/mudlib/doc/lpc/intermediate/
skylib_mudos_v1/mudlib/doc/new/add_command/
skylib_mudos_v1/mudlib/doc/new/events/
skylib_mudos_v1/mudlib/doc/new/handlers/
skylib_mudos_v1/mudlib/doc/new/living/race/
skylib_mudos_v1/mudlib/doc/new/living/spells/
skylib_mudos_v1/mudlib/doc/new/object/
skylib_mudos_v1/mudlib/doc/new/player/
skylib_mudos_v1/mudlib/doc/new/room/guild/
skylib_mudos_v1/mudlib/doc/new/room/outside/
skylib_mudos_v1/mudlib/doc/new/room/storeroom/
skylib_mudos_v1/mudlib/doc/object/
skylib_mudos_v1/mudlib/doc/playtesters/
skylib_mudos_v1/mudlib/doc/policy/
skylib_mudos_v1/mudlib/doc/weapons/
skylib_mudos_v1/mudlib/global/
skylib_mudos_v1/mudlib/global/creator/
skylib_mudos_v1/mudlib/global/handlers/
skylib_mudos_v1/mudlib/global/virtual/setup_compiler/
skylib_mudos_v1/mudlib/include/cmds/
skylib_mudos_v1/mudlib/include/effects/
skylib_mudos_v1/mudlib/include/npc/
skylib_mudos_v1/mudlib/include/room/
skylib_mudos_v1/mudlib/include/shops/
skylib_mudos_v1/mudlib/net/daemon/
skylib_mudos_v1/mudlib/net/daemon/chars/
skylib_mudos_v1/mudlib/net/inherit/
skylib_mudos_v1/mudlib/net/obj/
skylib_mudos_v1/mudlib/obj/amulets/
skylib_mudos_v1/mudlib/obj/b_day/
skylib_mudos_v1/mudlib/obj/clothes/
skylib_mudos_v1/mudlib/obj/dwarmours/plate/
skylib_mudos_v1/mudlib/obj/dwclothes/transport/horse/
skylib_mudos_v1/mudlib/obj/dwscabbards/
skylib_mudos_v1/mudlib/obj/dwweapons/axes/
skylib_mudos_v1/mudlib/obj/dwweapons/chains/
skylib_mudos_v1/mudlib/obj/faith/symbols/
skylib_mudos_v1/mudlib/obj/fungi/
skylib_mudos_v1/mudlib/obj/gatherables/
skylib_mudos_v1/mudlib/obj/instruments/
skylib_mudos_v1/mudlib/obj/magic/
skylib_mudos_v1/mudlib/obj/media/
skylib_mudos_v1/mudlib/obj/misc/player_shop/
skylib_mudos_v1/mudlib/obj/monster/godmother/
skylib_mudos_v1/mudlib/obj/monster/transport/
skylib_mudos_v1/mudlib/obj/rings/
skylib_mudos_v1/mudlib/obj/spells/
skylib_mudos_v1/mudlib/obj/stationery/
skylib_mudos_v1/mudlib/obj/stationery/envelopes/
skylib_mudos_v1/mudlib/obj/stationery/papers/
skylib_mudos_v1/mudlib/obj/toys/
skylib_mudos_v1/mudlib/obj/vessels/
skylib_mudos_v1/mudlib/obj/weapons/swords/
skylib_mudos_v1/mudlib/save/autodoc/
skylib_mudos_v1/mudlib/save/leaflets/
skylib_mudos_v1/mudlib/save/mail/
skylib_mudos_v1/mudlib/save/new_soul/data/
skylib_mudos_v1/mudlib/save/parcels/
skylib_mudos_v1/mudlib/save/playerinfo/
skylib_mudos_v1/mudlib/save/players/d/
skylib_mudos_v1/mudlib/save/random_names/
skylib_mudos_v1/mudlib/save/random_names/data/
skylib_mudos_v1/mudlib/save/terrains/
skylib_mudos_v1/mudlib/save/terrains/tutorial_desert/
skylib_mudos_v1/mudlib/save/terrains/tutorial_grassy_field/
skylib_mudos_v1/mudlib/save/terrains/tutorial_mountain/
skylib_mudos_v1/mudlib/save/todo_lists/
skylib_mudos_v1/mudlib/secure/
skylib_mudos_v1/mudlib/secure/cmds/admin/
skylib_mudos_v1/mudlib/secure/cmds/lord/
skylib_mudos_v1/mudlib/secure/config/
skylib_mudos_v1/mudlib/secure/handlers/autodoc/
skylib_mudos_v1/mudlib/secure/handlers/intermud/
skylib_mudos_v1/mudlib/secure/include/global/
skylib_mudos_v1/mudlib/secure/save/
skylib_mudos_v1/mudlib/secure/save/handlers/
skylib_mudos_v1/mudlib/secure/std/classes/
skylib_mudos_v1/mudlib/secure/std/modules/
skylib_mudos_v1/mudlib/std/commands/
skylib_mudos_v1/mudlib/std/commands/shadows/
skylib_mudos_v1/mudlib/std/creator/
skylib_mudos_v1/mudlib/std/dom/
skylib_mudos_v1/mudlib/std/effects/
skylib_mudos_v1/mudlib/std/effects/external/
skylib_mudos_v1/mudlib/std/effects/fighting/
skylib_mudos_v1/mudlib/std/effects/priest/
skylib_mudos_v1/mudlib/std/effects/room/
skylib_mudos_v1/mudlib/std/environ/
skylib_mudos_v1/mudlib/std/guilds/
skylib_mudos_v1/mudlib/std/guilds/old/
skylib_mudos_v1/mudlib/std/languages/
skylib_mudos_v1/mudlib/std/languages/BACKUPS/
skylib_mudos_v1/mudlib/std/liquids/
skylib_mudos_v1/mudlib/std/npc/
skylib_mudos_v1/mudlib/std/npc/goals/
skylib_mudos_v1/mudlib/std/npc/goals/basic/
skylib_mudos_v1/mudlib/std/npc/goals/misc/
skylib_mudos_v1/mudlib/std/npc/plans/
skylib_mudos_v1/mudlib/std/npc/plans/basic/
skylib_mudos_v1/mudlib/std/npc/types/
skylib_mudos_v1/mudlib/std/npc/types/helper/
skylib_mudos_v1/mudlib/std/npcs/
skylib_mudos_v1/mudlib/std/outsides/
skylib_mudos_v1/mudlib/std/races/shadows/
skylib_mudos_v1/mudlib/std/room/basic/topography/
skylib_mudos_v1/mudlib/std/room/controller/
skylib_mudos_v1/mudlib/std/room/inherit/topography/
skylib_mudos_v1/mudlib/std/room/topography/area/
skylib_mudos_v1/mudlib/std/room/topography/iroom/
skylib_mudos_v1/mudlib/std/room/topography/milestone/
skylib_mudos_v1/mudlib/std/shadows/curses/
skylib_mudos_v1/mudlib/std/shadows/disease/
skylib_mudos_v1/mudlib/std/shadows/fighting/
skylib_mudos_v1/mudlib/std/shadows/healing/
skylib_mudos_v1/mudlib/std/shadows/magic/
skylib_mudos_v1/mudlib/std/shadows/poison/
skylib_mudos_v1/mudlib/std/shadows/rituals/
skylib_mudos_v1/mudlib/std/shadows/room/
skylib_mudos_v1/mudlib/std/shops/controllers/
skylib_mudos_v1/mudlib/std/shops/objs/
skylib_mudos_v1/mudlib/std/shops/player_shop/
skylib_mudos_v1/mudlib/std/socket/
skylib_mudos_v1/mudlib/std/soul/
skylib_mudos_v1/mudlib/std/soul/d/
skylib_mudos_v1/mudlib/std/soul/e/
skylib_mudos_v1/mudlib/std/soul/i/
skylib_mudos_v1/mudlib/std/soul/j/
skylib_mudos_v1/mudlib/std/soul/k/
skylib_mudos_v1/mudlib/std/soul/l/
skylib_mudos_v1/mudlib/std/soul/n/
skylib_mudos_v1/mudlib/std/soul/o/
skylib_mudos_v1/mudlib/std/soul/q/
skylib_mudos_v1/mudlib/std/soul/u/
skylib_mudos_v1/mudlib/std/soul/v/
skylib_mudos_v1/mudlib/std/soul/y/
skylib_mudos_v1/mudlib/std/soul/z/
skylib_mudos_v1/mudlib/std/stationery/
skylib_mudos_v1/mudlib/w/
skylib_mudos_v1/mudlib/w/default/
skylib_mudos_v1/mudlib/w/default/armour/
skylib_mudos_v1/mudlib/w/default/clothes/
skylib_mudos_v1/mudlib/w/default/item/
skylib_mudos_v1/mudlib/w/default/npc/
skylib_mudos_v1/mudlib/w/default/room/
skylib_mudos_v1/mudlib/w/default/weapon/
skylib_mudos_v1/mudlib/www/
skylib_mudos_v1/mudlib/www/download/
skylib_mudos_v1/mudlib/www/java/
skylib_mudos_v1/mudlib/www/secure/
skylib_mudos_v1/mudlib/www/secure/lpc/advanced/
skylib_mudos_v1/mudlib/www/secure/lpc/intermediate/
skylib_mudos_v1/v22.2b14-DSv10/
skylib_mudos_v1/v22.2b14-DSv10/ChangeLog.old/
skylib_mudos_v1/v22.2b14-DSv10/Win32/
skylib_mudos_v1/v22.2b14-DSv10/compat/
skylib_mudos_v1/v22.2b14-DSv10/compat/simuls/
skylib_mudos_v1/v22.2b14-DSv10/include/
skylib_mudos_v1/v22.2b14-DSv10/mudlib/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/clone/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/command/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/data/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/etc/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/include/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/inherit/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/inherit/master/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/log/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/single/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/single/tests/compiler/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/single/tests/efuns/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/single/tests/operators/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/u/
skylib_mudos_v1/v22.2b14-DSv10/tmp/
skylib_mudos_v1/v22.2b14-DSv10/windows/
#include <drinks.h>
#include <language.h>
#include <player.h>

#define TELL_REPLY_PROPERTY "tell reply list"

/* Behaviour when we encounter ear muffs in player */
#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 function handles tells from cres to players who
 * have tells ear muffed. */
void delayed_tell( string yesno, object *recicipients, string message,
  string language );


#ifdef USE_SMILEYS
string *two_smileys = ({":)", ":(", ":P", ":p", ":b", ";)", 
  ";(", ";P", ";p", ";b", "=)", "=("});

string *three_smileys = ({":-)", ":-(", ":-P", ":-p", ":-b",
  ";-)", ";-(", ";-P", ";-p", ";-b", ":o)", ":o(", ":oP", 
  ":op", ":ob", ";o)", ";o(", ";oP", ";op", ";ob", "=-)",
  "=-(", "=o)", "=o("});
#endif

int cmd( string arg, mixed thing, int silent ) {
    string word;
    string mangle;
    string lang;
    string words;
    string emotion;
#ifdef USE_SMILEYS
    string smiley;
    string smiley_words;
#endif
    string them_mess;
    string temp;
    string me_mess;
    string mud;
    string msg, old, who, *words2;
    int index, intermud;
    string *ok_string;
    object *obs;
    object *net_dead;
    object *multiple_earmuffed;
    object *cannot_see;
    object *ok;
    object *fail;
    object *earmuffed; /* These people have ear muffed tells */
    mixed busy;
    int gag = 0;
    
    /* Don't allow someone with tells ear muffed to use tell. */
    if( TP->check_earmuffs("tell") ) {
        add_failed_mess( "You have tells ear muffed.\n" );
        /* return 0 gave us two messages to player. */
        return -1;
    }

    emotion = "";
    if (pointerp(thing)) {
        words = arg;
        if ( function_exists( "trap_tell", environment( TP ) )  &&
          member_array(this_object(), previous_object(-1)) == -1) {
            return (int)environment( TP )->trap_tell( words, thing, 0 );
        }
    } else if ( !objectp( thing ) ) {
        if ( !arg || sscanf( old=arg, "%s %s", word, words ) != 2 ) {
            return 0;
        }
        word = lower_case( word );
        word = (string)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 ((index = member_array('@', old)) != -1)
            {
                who = old[0..(index - 1)];
                words2 = explode(old[(index + 1)..], " ");

                for (int j = 0; j < sizeof(words2); j++)
                    if (INTERMUD_H -> mud_exists(implode(words2[0..j], " ")))
                    {
                        intermud = 1;
                        mud = INTERMUD_H -> mud_exists(implode(words2[0..j], " "));
                        msg = implode(words2[(j + 1)..], " ");
                    }

                if (intermud){
                    if (!creatorp(TP)){
                        add_failed_mess("Only creators may send remote tells.\n");
                        return 0;
                    }
                    if (INTERMUD_H -> tell(who, mud, msg + "%^RESET%^"))
                    {
                        TP -> event_person_tell(TP, "You tell " + CAP(who) + "@" +
                          CAP(mud) + ": ", msg, "common");
                        return 1;
                    } else {
                        add_failed_mess("No mud is registered with the name " + 
                          implode(map(explode(mud, " "), 
                              (: CAP($1) :)), " ") + ".\n");
                        return 0;
                    }
                }else{
                    add_failed_mess("No mud is registered with that name.\n");
                    return 0;
                }
            }
            //         }
            add_failed_mess( capitalize( word ) +" is not logged in.\n" );
            return 0;
        }
        if ( environment( TP ) ) {
            if ( function_exists( "trap_tell", environment( TP ) ) &&
              member_array(this_object(), previous_object(-1)) == -1) {
                return stringp(thing)?
                environment( TP )->trap_tell( words, ({ thing }), 0 ):
                environment( TP )->trap_tell( words, thing, 0 );
            }
        }
    } else {
        words = arg;
    }

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

    obs -= ({ this_player() });
    if ( !sizeof(obs) ) {
        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 up to 20 people a message.\n");
        return 0;
    }

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

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

    if ( !creatorp(TP) && ( TP->adjust_sp( -TELL_COST ) < 0 ) ) {
        return notify_fail( NO_POWER );
    }
    lang = (string)TP->query_current_language();
    if ( !LANGUAGE_HAND->query_language_spoken( lang ) ) {
        return notify_fail( capitalize( lang ) +
          " is not a spoken language.\n" );
    }
    if ( !LANGUAGE_HAND->query_language_distance( lang ) ) {
        return notify_fail( capitalize( lang ) +
          " is not able to be spoken at a distance.\n" );
    }

    // This is so small tells don't error.
#ifdef USE_SMILEYS
    if(sizeof(words) >= 3) {
        if(member_array(words[<3..], three_smileys) != -1) {
            smiley = words[<3..];
        } else if(member_array(words[<2..], two_smileys) != -1) {
            smiley = words[<2..];
        }
    } else if(member_array(words, three_smileys) != -1) {
        smiley = words;
    } else if(member_array(words, two_smileys) != -1) {
        smiley = words;
    }
#endif
    word = query_word_type(words, "");
    if(word != "") {
        word = " "+word+"ing";
    }
#ifdef USE_SMILEYS
    if(smiley) {
        // This is so we don't get errors with people telling each
        // other smileys on their own.
        if(sizeof(words) > 3) {
            smiley_words = words[0..<sizeof(smiley) + 1];
        } else {
            smiley_words = words;
        }
        word = query_word_type(smiley_words, "");
        if(word != "") {
            word = " "+word+"ing";
        }
    }
    switch(smiley) {
    case ":)" :
    case ":-)" :
    case ":o)" :
        emotion = " happily";
        break;
    case ":(" :
    case ":-(" :
    case ":o(" :
        emotion = " sadly";
        break;
    case "=)" :
    case "=-)" :
    case "=o)" :
        emotion = " innocently";
        break;
    case "=(" :
    case "=-(" :
    case "=o(" :
        emotion = " tearfully";
        break;
    case ";(" :
    case ";-(" :
    case ";o(" :
        emotion = " angrilly";
        break;
    case ";)" :
    case ";-)" :
    case ";o)" :
        emotion = " mischieviously";
        break;
    case ":P" :
    case ":-P" :
    case ":oP" :
    case ":p" :
    case ":-p" :
    case ":op" :
    case ":b" :
    case ":-b" :
    case ":ob" :
        emotion = " insanely";
        break;
    case "=P" :
    case "=-P" :
    case "=oP" :
    case "=p" :
    case "=-p" :
    case "=op" :
    case "=b" :
    case "=-b" :
    case "=ob" :
        emotion = " cheekily";
        break;
    case ";P" :
    case ";-P" :
    case ";oP" :
    case ";b" :
    case ";-b" :
    case ";ob" :
    case ";p" :
    case ";-p" :
    case ";op" :
        emotion = " evilly";
        break;
    default :
        emotion = "";
    }
#endif

    if ( TP->query_volume( D_ALCOHOL ) ) {
        words = drunk_speech( words );
    }
    // General speech modifications (curses, etc)
    mangle = TP->mangle_speech( words );
    if ( stringp( mangle ) ) {
        words = mangle;
    }
    if ( environment( TP ) ) {
        if ( function_exists( "mangle_tell", environment( TP ) ) ) {
            words = (string)environment( 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 = obs - ({thing});
                 gag = 1;
                 continue;
            }
        }

        if (sizeof(obs) > 1 && thing->check_earmuffs("multiple-tell")) {
            multiple_earmuffed += ({ thing });
        } else if( thing->check_earmuffs( "tell" ) ) {
            if( creatorp(TP) &&
              TP->query_property( CUT_THOUGH_PROPERTY ) == CUT_DONT_ASK ) {
                /* A cre that doesn't care about ear muffs, so we warn the
                 * cre and player, but don't add to the ear muffed array. */
                write( "You cut through the ear muffs of "+
                  thing->the_short() +".\n" );
                tell_object( thing, TP->the_short()
                  +" cuts through your ear muffs.\n" );
                /* Add to array of people who get the message. */
                ok += ({ thing });
            } else {
                /* Ok, someone cares, so we add to earmuffed array. */
                earmuffed += ({ thing });
            }
        } else if (!this_player()->query_invis() ||
          reference_allowed(this_player(), thing)) {
            /* All is hoopy. */
            ok += ({ thing });
        } else {
            cannot_see += ({ thing });
            ok += ({ thing });
        }
    }
    if(gag){
        tell_object(TP,"You have been gagged!  You will only be able "
                "to talk to anything until the gag is removed.  All "
                "non creators removed from this tell.\n");
    }
    if(!sizeof(obs)){
        tell_object(TP,"You have been gagged!  You will not be able "
                "to tell players anything until the gag is removed.  Perhaps you should "
                "talk to a creator about this.\n");
        return 1;
    }

    temp = emotion;
    ok_string = map(ok, (: $1->query_name() :)) +
    ({ this_player()->query_name() });
    foreach (thing in ok) {
        if(thing->query_earmuffs("emoticon")) {
            emotion = "";
        }
        words = replace(words, "%^", " ");
        thing->event_person_tell( TP, capitalize( (string)TP->short(0, 0) ) +
          " " + me_mess + "s "+
          query_multiple_short(ok - ({ thing }) + ({ "you" })) + emotion +
          word + ": ", words, lang );

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

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

    if ( !silent ) {
        if ( lang != "common" ) {
            word += " in "+ lang;
        }
        if ( sizeof(net_dead)) {
            write("Warning: "+query_multiple_short(
                map(net_dead, (: $1->query_cap_name() :)))+
              " "+ (sizeof(net_dead)>1?"are":"is")+" net dead.\n" );
        }
        if (sizeof(multiple_earmuffed)) {
            write(capitalize( query_multiple_short(multiple_earmuffed)) +
              (sizeof(multiple_earmuffed) > 1?" have ":" has ")+
              "multiple tells ear muffed.\n");
        }
        if( sizeof( earmuffed ) ) {
            write(capitalize( query_multiple_short(earmuffed)) +
              (sizeof(earmuffed) > 1?" have ":" has ")+
              "tells ear muffed.\n");
            if( creatorp(TP) &&
              TP->query_property( CUT_THOUGH_PROPERTY ) != FAIL_DONT_ASK ) {
                write( "Cut through ear muffs? (y/n) " );
                input_to( (: delayed_tell :), earmuffed, words, lang );
            }
        }
        emotion = temp;
        if(this_player()->query_earmuffs("emoticon")) {
            emotion = "";
        }
        busy = this_player()->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(capitalize( query_multiple_short(ok)));
            my_mess("You "+ me_mess +" "+ them_mess +
              emotion + word+": ", words);
            emotion = temp;
            if(this_player()->query_earmuffs("emoticon")) {
                emotion = "";
            }
            TP->add_tell_history( "You " + me_mess + " "+ them_mess + word +
              emotion+ ": ", words );
        } else if( creatorp(TP) && !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 0 gave two messages. */
            return -1; 
        }
    }
    TP->adjust_time_left( -5 );
    return 1;
} /* cmd() */

int reply_cmd(string mess) {
    string *rep;
    object *obs;

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

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

    return cmd(mess, obs, 0);
} /* reply_cmd() */

mixed *query_patterns() {
    return ({ "<indirect:player> <string'message'>", (: cmd($4[1], $1, 0) :),
      "reply <string'message'>", (: reply_cmd($4[0]) :),
      "<string>", (: cmd($4[0], 0, 0) :) });
    /*
        return ({ "<indirect:player> <string'message'>", (: cmd($4[1], $1, 0) :),
          "reply <string'message'>", (: reply_cmd($4[0]) :)});
    */
} /* query_patterns() */


/*
 * Tells from cres to ear muffed players.
 * All emoticon and "asks you" or "exclaims" stuff removed.
 */
void delayed_tell( string yesno, object *recicipients, string message,
  string language ) {
    object  ob, *netdead;
    int disappeared;

    /*
     * Tried to keep us out
     * But nothing stops creators
     * Except alter.net
     */

    /* Did they really want to break through? */
    if( !( yesno == "yes" || yesno == "y" ) ) {
        write("Ok, tell aborted.\n");
        return;
    }

    netdead = ({ });

    foreach( ob in recicipients ) {
        if( !ob ) {
            disappeared++;
            recicipients -= ({ ob });
        } else {
            if( !interactive( ob ) )
                netdead += ({ ob });
            /* Tell them even if they are net dead - it'll end up
             * in their tell history..? */
            message = replace(message, "%^", " ");
            ob->event_person_tell( TP, capitalize( TP->query_name() ) +
              " cuts through your ear muffs and tells " 
              + query_multiple_short( recicipients - ({ ob }) + ({ "you" }) )
              +": ", message, language );
        }
    }

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


    /* There's no way to get their names now, so we just tell the cre
     * how many recicipients disappeared. */
    if( disappeared )
        write( "It seems "+ disappeared +" person"+
          ( disappeared > 1 ? "s have" : " has" )
          +" disappeared.\n" );

    /* Ooops - no one left to talk to! */
    if( !sizeof( recicipients ) ) {
        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( recicipients ) )
      +": ", message );

    TP->add_tell_history( "You cut through ear muffs and tell "+
      TP->convert_message( capitalize(
          query_multiple_short( recicipients ) ) )
      +": ", message );

    return;
} /* delayed_tell() */