/
LIB3/
LIB3/D/ADMIN/
LIB3/D/ADMIN/OBJ/
LIB3/D/ADMIN/ROOM/W/
LIB3/D/HOME/
LIB3/D/HOME/CITY/ARENA/
LIB3/D/HOME/CITY/ITEMS/
LIB3/D/HOME/CITY/POSTOFFI/
LIB3/DOC/
LIB3/GLOBAL/SPECIAL/
LIB3/GLOBAL/VIRTUAL/
LIB3/NET/
LIB3/NET/CONFIG/
LIB3/NET/DAEMON/CHARS/
LIB3/NET/GOPHER/
LIB3/NET/INHERIT/
LIB3/NET/OBJ/
LIB3/NET/SAVE/
LIB3/NET/VIRTUAL/
LIB3/OBJ/B_DAY/
LIB3/OBJ/HANDLERS/TERM_TYP/
LIB3/PLAYERS/B/
LIB3/PLAYERS/N/
LIB3/ROOM/
LIB3/SAVE/
LIB3/SAVE/BOARDS/
LIB3/SAVE/ENVIRON/
LIB3/SAVE/POST/
LIB3/STD/COMMANDS/SHADOWS/
LIB3/STD/CREATOR/
LIB3/STD/DOM/
LIB3/STD/EFFECTS/
LIB3/STD/EFFECTS/HEALING/
LIB3/STD/EFFECTS/OTHER/
LIB3/STD/EFFECTS/POISONS/
LIB3/STD/ENVIRON/
LIB3/STD/GUILDS/
LIB3/STD/LIQUIDS/
LIB3/STD/ROOM/
LIB3/STD/TRIGGER/SHADOW/
LIB3/W/
LIB3/W/BANNOR/
LIB3/W/NEWSTYLE/
/* allows someone to quitely pick something up.  Is based on the objects
 * bulk.  It is hard to palmn something big ;)
 */
#define SKILL "other.covert.sleight-of-hand"
#define COST 3
#define LEARN_LEVEL 3
#define TEACH_LEVEL 15

int     slip( string str )
{
    object *obs, *obs2, *fail, *t_p, *g_f, *from;
    int     i, j, ret, skill, g_p;
    string  s1;

    if( !str )
    {
	notify_fail( "Syntax: slip <objects> to <objects>\n" );
	return 0;
    }

    if( sscanf( str, "%s to %s", str, s1 ) != 2 )
    {
	notify_fail( "Syntax: slip <objects> to <objects>\n" );
	return 0;
    }
    obs = find_match( s1, environment( this_player() ) );
    if( !sizeof( obs ) )
    {
	notify_fail( "Slip to who?\n" );
	return 0;
    }

    skill = (int)this_player()->query_skill_bonus( SKILL );
    g_p = (int)this_player()->query_gp();

    for( i = 0; i < sizeof( obs ); i++ )
    {
	t_p = fail = g_f = ({ });
	obs2 = find_match( str, this_player() );
	for( j = 0; j < sizeof( obs2 ); j++ )
	    if( obs2[ j ]->move( obs[ i ] ) )
		fail += ({ obs2[ j ] });
	    else
		if( COST > g_p )
		    g_f += ({ obs2[ j ] });
		else
		{
		    if( skill < random( 200 ) * (1 + obs2[ j ]->query_weight()) )
			t_p += ({ obs2[ j ] });
		    this_player()->adjust_gp( -COST );
		    g_p -= COST;
		}
	if( sizeof( fail ) )
	    write( "You cannot slip " + query_multiple_short( fail ) +
		   " to " + obs[ i ]->query_cap_name() + ".\n" );
	if( sizeof( g_f ) )
	    write( "Not enough guild points to slip " + query_multiple_short( g_f ) +
		   " to " + obs[ i ]->query_cap_name() + ".\n" );
	fail += g_f;
	if( sizeof( t_p ) )
	    tell_room( environment( this_player() ),
		       this_player()->query_cap_name() + " tries to slip " +
		       query_multiple_short( t_p ) + " to " + obs[ i ]->query_cap_name() + ".\n",
		       ({ this_player(), obs[ i ] }) );
	if( sizeof( fail ) != sizeof( obs2 ) )
	{
	    write( "You slip " + query_multiple_short( obs2 - fail ) +
		   " to " + obs[ i ]->query_cap_name() + ".\n" );
	    ret += sizeof( obs2 - fail );
	    tell_object( obs[ i ], this_player()->query_cap_name() +
			 " slips " + query_multiple_short( obs2 - fail ) + " to you.\n" );
	}
    }

    notify_fail( "Oh no.\n" );
    if( ret )
	this_player()->adjust_gp( -ret * COST );
    return ret;
}

string  help()
{
    return
	"Syntax: slip <objects> to <objects>\n\n" +
	"This command allows you to slip things to players or containers " +
	"without generating a give message.  The use of this command will " +
	"cost you " + COST + " guild points for every object you slip to someone else." +
	"  It uses the skill " + SKILL + " for " +
	"determineing the skill bonus.\n\n" +
	"Example:\n" +
	"> slip frog to khaos\n" +
	"You slip a frog to Khaos.\n\n" +
	"See also:\n" +
	"  palm\n";
}

int     teach( object ob )
{
    if( this_player()->query_skill( SKILL ) < TEACH_LEVEL )
    {
	return -1;
    }
    if( ob->query_skill( SKILL ) < LEARN_LEVEL )
    {
	return -2;
    }
    ob->add_known_command( "slip" );
    return 1;
}