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 *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;

   /* 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( 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 ( creatorp(TP) && sscanf( word, "%*s@%*s" ) == 2 ) {
            "/net/daemon/out_tell"->do_tell( word+" "+words );
            return 1;
         }
         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) +
               " have 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 (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 });
      }
   }

   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 ({ "<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() */