#include <dirs.h>
#include <tasks.h>
inherit COMMAND_BASE;
mixed cmd( object *indirect_obs, string *args) {
   string verb, word, *bits, *exits;
   object ob;
   
   if ( !creatorp(TP) )
      return 0;
   if ( this_player()->query_property( "dead" ) )
      return notify_fail( "You're dead.  You can't shove anything.\n" );
   if ( !living( indirect_obs[ 0 ] ) )
      return notify_fail( "You can't shove "+
            (string)indirect_obs[ 0 ]->the_short() +
            "; try dragging it.\n" );
   verb = args[ 1 ];
   bits = explode( args[ 1 ], " " );
   if ( sizeof( bits ) > 1 )
      word = implode( bits[ 1 .. ], " " );
   else
      word = "";
   if ( LENGTHEN[ verb ] )
      verb = LENGTHEN[ verb ];
   exits = (string *)environment( this_player() )->query_exits();
   if ( !exits )
      return notify_fail( "There don't seem to be any exits here.\n" );
   /*
    * Put this here, because the same message is needed, but "verb"
    * may change.
    */
   notify_fail( "There is no exit \""+ verb +"\".\n" );
   if ( member_array( verb, exits ) != -1 ) {
      if ( environment( this_player() )->query_relative( verb ) )
         return 0;
   } else {
      verb = (string)this_player()->reorient_rel( verb );
      if ( member_array( verb, exits ) == -1 )
         return 0;
      verb = (string)indirect_obs[ 0 ]->find_rel( verb );
   }
   foreach(ob in indirect_obs) {
     if(this_player() == ob)
       continue;
     
     if(!ob->exit_command( verb ) )
       return notify_fail( "Ack!  Something went wrong!\n" );
   }
   return 1;
} /* cmd() */
mixed *query_patterns() {
   return ({ "<indirect:living> <word'direction'> [stealthily]",
         (: cmd($1, $4) :),
               });
} /* query_patterns() */