/
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/
#pragma save_binary
#define MASTER "/secure/master"
#define PEOPLER "/obj/handlers/peopler"
#define COL "%^CYAN%^"
#define TB(x) if(find_player("bannor")) tell_object(find_player("bannor"),x);
 
varargs object *wiz_present( string str, object onobj, int nogoout );
string  desc_object( mixed o );
string  desc_f_object( object o );
 
static void wiz_commands()
{
    if( "/obj/handlers/cregrade"->query_cre_grade(
                (string)this_object()->query_name() ) > 19 )
    {
        add_action( "function2", "ca*ll" );
        add_action( "parse_frogs", ";*" );
    }
    add_action( "dest", "dest*ruct" );
    add_action( "show_stats", "st*at" );
    add_action( "home", "ho*me" );
    add_action( "trans", "tra*ns" );
}                               /* wiz_commands() */
 
/*
   ** commands in the app_commands will go to all players with
   ** level >= 20. This includes players who have opted to
   ** remain players rather than advancing to wizard. As such
   ** we must be careful in what we place here
 */
 
static void app_commands()
{
    add_action( "whereis", "whe*reis" );
    add_action( "get_pathof", "pat*hof" );
    add_action( "get_creator", "cr*eator" );
    add_action( "get_inv", "inv" );
    add_action( "teleport", "go*to" );
    add_action( "upgrade_player", "upg*rade" );
    add_action( "find_shadows", "sh*adows" );
    add_action( "do_find", "find" );
    add_action( "do_debug", "dump" );
    add_action( "do_debug", "debug" );
    add_action( "do_debug", "data" );
}                               /* app_commands() */
 
static  all_commands()
{
}                               /* all_obj_commands() */
 
int     whereis( string str )
{
    object *ov, e;
    int     i;
 
    notify_fail( "Where is what?\n" );
    ov = wiz_present( str, this_player() );
    if( !sizeof( ov ) )
        return 0;
 
    for( i = 0; i < sizeof( ov ); i++ )
    {
        if( ov[ i ]->query_hidden() )
            continue;
        write( desc_object( ov[ i ] ) + " is : \n" );
        e = ov[ i ];
        while( e = environment( e ) )
            write( "  in " + desc_f_object( e ) + "\n" );
    }
    return 1;
}                               /* whereis() */
 
/* This is for querying about objects who don't want to be destructed */
static object discard_obj;
 
int     affirmative( string s ) /* returns true if s is a 'yes' equiv response */
{
    s = lower_case( s );
    return( s == "y" || s == "yes" || s == "ok" || s == "please" );
}                               /* affirmative() */
 
/* is there an error?  print it */
void    handle_error( string erm, string desc )
{
    if( erm )
    {
        write( desc + " failed : " + erm );
    }
}                               /* handle_error() */
 
int     teleport( string str )
{
    object  dest;
    string *names, nick;
 
    if( !str )
    {
        notify_fail( "Teleport where?\n" );
        return 0;
    }
    nick = (string)this_player()->expand_nickname( str );
    dest = find_living( nick );
    if( dest )
    {
        if( dest = environment( dest ) )
        {
            if( dest == environment() )
            {
                notify_fail( "You look around and realise you are already there.\n" );
                return 0;
            }
            this_player()->move_player( "X", dest );
            return 1;
        }
        else
        {
            notify_fail( capitalize( nick ) + " is not standing in a location.\n" );
            return 0;
        }
    }
    else
    {
        names = (string *)this_object()->get_cfiles( str );
        if( sizeof( names ) )
        {
            str = names[ 0 ];
        }
        else
        {
            notify_fail( "No such room.\n" );
            return 0;
        }
        if( !(dest = find_object( str )) )
        {
            catch( str->come_and_see_the_stars() );
            dest = find_object( str );
        }
        if( !dest )
        {
            notify_fail( "Failed to load " + str + "\n" );
            return 0;
        }
        else
            if( !dest->query_property( "location" ) )
            {
                notify_fail( "Not a room: " + str + "\n" );
                return 0;
            }
            else
            {
                if( dest == environment() )
                {
                    notify_fail( "You look around and realise you are already there.\n" );
                    return 0;
                }
                this_player()->move_player( "X", dest );
                return 1;
            }
    }
}                               /* teleport() */
 
static int     get_pathof( string str )
{
    object *ov;
    int     i;
 
    notify_fail( "Pathof what?\n" );
    ov = wiz_present( str, this_player() );
    if( !sizeof( ov ) )
        return 0;
 
    for( i = 0; i < sizeof( ov ); i++ )
    {
        if( !ov[ i ] )
            continue;
/*
   if (sizeof(ov) > 1) {
 */
        write( "Path of " + desc_object( ov[ i ] ) + " in " +
               desc_object( environment( ov[ i ] ) ) + ":\n" );
/*
   }
 */
        write( file_name( ov[ i ] ) + "\n" );
    }
    return 1;
}                               /* get_pathof() */
 
int     get_inv( string str )
{
    object *ov, obj;
    int     i;
 
    notify_fail( "Inv of what?\n" );    /* thanks for the great error message ! */
 
    if( !str )
    {
        ov = ({ this_player() });
    }
    else
    {
        sscanf( str, "of %s", str );
        ov = wiz_present( str, this_player() );
    }
    if( !sizeof( ov ) )
        return 0;
 
    for( i = 0; i < sizeof( ov ); i++ )
    {
        if( !ov[ i ] )
            continue;
        write( "Inv of " + desc_object( ov[ i ] ) + " in " +
               desc_object( environment( ov[ i ] ) ) + ":\n" );
        obj = first_inventory( ov[ i ] );
        while( obj )
        {
            write( "  " + desc_f_object( obj ) + "\n" );
            obj = next_inventory( obj );
        }
    }
    return 1;
}                               /* inv() */
 
int     get_creator( string str )
{
    object *ov;
    int     i;
 
    notify_fail( "Creator of what?\n" );
    ov = wiz_present( str, this_player() );
    if( !sizeof( ov ) )
        return 0;
 
    for( i = 0; i < sizeof( ov ); i++ )
    {
        write( "Creator of " + desc_object( ov[ i ] ) + ": " +
               "secure/master"->creator_file( file_name( ov[ i ] ) ) + ", uid: " +
               getuid( ov[ i ] ) + ", euid: " + geteuid( ov[ i ] ) + "\n" );
    }
    return 1;
}                               /* get_creator() */
 
static object *dest_obj;
static int objn, majd;
 
void    ask_dest()
{
    if( !pointerp( dest_obj ) || objn >= sizeof( dest_obj ) )
    {
        write( "No more things to dest.\n" );
        dest_obj = 0;           /* wipe array to free memory */
        return;
    }
    write( "Dest object " + desc_object( dest_obj[ objn ] ) + " ? " );
    input_to( "dest_answer" );
    return;
}                               /* ask_dest() */
 
void    dest_answer( string s )
{
    string  err, shrt;
 
    if( affirmative( s ) )
    {
        if( majd )
        {
            shrt = (string)dest_obj[ objn ]->short();
 
            err = catch( dest_obj[ objn ]->dwep() );
            handle_error( err, "DWEP" );
            if( dest_obj[ objn ] )
            {
                write( "It REALLY doesn't want to be dested.\n" );
                err = catch( destruct( dest_obj[ objn ] ) );
                handle_error( err, "destruct()" );
            }
            majd = 0;
            if( dest_obj[ objn ] )
                write( "It didn't dest.\n" );
            else
            {
                say( (string)this_player()->query_cap_name() + " disintegrates " +
                     (shrt ? shrt : "something") + ".\n" );
                write( "Ok.\n" );
            }
            objn++;
            ask_dest();
            return;
        }
        else
        {
            err = catch( dest_obj[ objn ]->dest_me() );
            handle_error( err, "dest_me" );
            if( dest_obj[ objn ] )
            {
                write( "This object does NOT want to be dested.  Are you sure? " );
                majd = 1;
                input_to( "dest_answer" );
                return;
            }
            write( "Ok.\n" );
            objn++;
            ask_dest();
            return;
        }
    }
    else
        if( s == "q" || s == "quit" )
        {
            write( "Ok.  No more objects will be destd.\n" );
            dest_obj = 0;
            return;
        }
    write( "Ok.  Not destd.\n" );
    objn++;
    ask_dest();
    return;
}                               /* dest_answer() */
 
int     dest( string str )
{
    object *ob;
    int     i;
    string  qstr, err, shrt, dobj;
 
    dest_obj = ({ });
 
    notify_fail( "Can't find " + str + " to dest.\n" );
 
    if( sscanf( str, "query %s", qstr ) == 1 )
    {
        dest_obj = wiz_present( qstr, this_player() );
        if( !sizeof( dest_obj ) )
            return 0;
        objn = 0;
        majd = 0;               /* MAJOR dest needed */
        ask_dest();
        return 1;
    }
 
    ob = wiz_present( str, this_player() );
    if( !sizeof( ob ) )
        return 0;
 
    for( i = 0; i < sizeof( ob ); i++ )
    {
        if( interactive( ob[ i ] ) )
        {
            write( COL + "You DON'T destruct " + ob[ i ]->query_cap_name() + ".%^RESET%^\n" );
            if( this_player() != ob[ i ] )
                log_file( "ILLEGAL", this_player()->query_cap_name() +
                          " tried to dest " + ob[ i ]->query_cap_name() + "\n" );
            continue;
        }
        catch( shrt = (string)ob[ i ]->short() );
 
        dobj = desc_object( ob[ i ] );
        err = catch( ob[ i ]->dest_me() );
        handle_error( err, "dest_me" );
        if( ob[ i ] )
            dest_obj += ({ ob[ i ] });
        else
        {
            write( "You destruct " + dobj + ".\n" );
            say( (string)this_player()->query_cap_name() + " disintegrates " +
                 (shrt ? shrt : "something") + ".\n" );
        }
    }
    if( sizeof( dest_obj ) > 0 )
    {
        objn = 0;
        majd = 0;
        ask_dest();
        return 1;
    }
    return 1;
}                               /* dest() */
 
string  desc_object( mixed o )
{
    string  str;
 
    if( !o )
        return "** Null-space **";
    if( !catch( str = (string)o->short() ) && str )
                return str;
 
    if( !catch( str = (string)o->query_name() ) && str )
        return str;
    return file_name( o );
}                               /* desc_object() */
 
string  desc_f_object( object o )
{
    string  str, tmp;
 
    str = desc_object( o );
    if( o && str != file_name( o ) )
    {
        if( tmp )
            str += " (" + tmp + ")";
        else
            str += " (" + file_name( o ) + ")";
    }
    return str;
}                               /* desc_f_object() */
 
object *wzpresent2( string str, mixed onobj )
{
    int     i;
    object *obs, obj, *obs2;
    string  s1, s2;
 
    if( pointerp( onobj ) )
    {
        obs = ({ });
        for( i = 0; i < sizeof( onobj ); i++ )
            obs += wzpresent2( str, onobj[ i ] );
        return obs;
    }
 
    if( str == "all" )
        return all_inventory( onobj );
 
/* every fish */
 
    if( sscanf( str, "every %s", s1 ) == 1 )
    {
        obs2 = all_inventory( onobj );
        obs = ({ });
        for( i = 0; i < sizeof( obs2 ); i++ )
            if( obs2[ i ]->id( s1 ) )
                obs += ({ obs2[ i ] });
        return obs;
    }
 
    obs2 = find_match( str, onobj );
    if( sizeof( obs2 ) )
    {
        return obs2;
    }
 
    if( obj = present( str, onobj ) )
        return({ obj });
    for( obj = first_inventory( onobj ); obj; obj = next_inventory( obj ) )
    {
        s2 = file_name( obj );
        if( sscanf( s2, "%s" + str + "#%d", s1, i )
                || sscanf( s2, "%s#" + str, s1 ) )
        {
            return({ obj });
        }
    }
    return({ });
}                               /* wiz_present2() */
 
varargs object *wiz_present( string str, object onobj, int nogoout )
{
/* nogoout is so that it WON'T check the environment of onobj */
    int     i, j;
    object  ob, *obs, *obs2, *users_ob, *temp_ob;
    string  s1, s2, *sts, temp;
 
    if( !str || !onobj )
    {
        return({ });
    }
 
/* all the simple ones first */
 
    if( str[ 0..1 ] == "@@" )
    {                           /* Multiple find_living - Newstyle, 17/12/93 */
        str = str[ 2..strlen( str ) - 1 ];
        str = (string)this_player()->expand_nickname( str );
        ob = find_living( str );
        if( !ob )
        {
            notify_fail( "No matches on mutliple find-living.\n" );
            return({ });
        }
        obs = ({ });
        while( ob->id( str ) )
        {
            obs += ({ ob });
            ob = next_living( ob );
        }
        return obs;
    }
 
    if( str[ 0 ] == '@' )
    {
        if( ob = find_living( 
                                 (string)this_player()->expand_nickname( extract( str, 1 ) ) ) )
            return({ ob });
        notify_fail( "Unable to find living object: " + extract( str, 1 ) + ".\n" );
        return({ });
    }
 
    if( str == "me" )
        return({ this_player() });
 
    if( str == "here" )
        return({ environment( this_player() ) });
 
    if( str == "everyone" )
        return users();
 
    if( str == "creators" )
    {
        obs = users();
        for( i = 0; i < sizeof( obs ); i++ )
            if( !obs[ i ]->query_creator() )
            {
                obs = delete( obs, i, 1 );
                i--;
            }
        return obs;
    }
 
    if( str[ 0 ] == '/' )
    {
        if( ob = find_object( str ) )
            return({ ob });
        if( sizeof( (sts = (string *)this_object()->get_cfiles( str )) ) )
        {
            obs = ({ });
            for( i = 0; i < sizeof( obs ); i++ )
                if( (ob = find_object( sts[ i ] )) )
                    obs += ({ ob });
            return obs;
        }
        notify_fail( "No loaded object: " + str + ".\n" );
        return({ });
    }
 
/* (fish) == environment of fish */
 
    if( str[ 0 ] == '(' && str[ strlen( str ) - 1 ] == ')' )
    {
        obs = wiz_present( extract( str, 1, strlen( str ) - 2 ), onobj );
        if( !sizeof( obs ) )
            return obs;
        for( i = 0; i < sizeof( obs ); i++ )
            obs[ i ] = environment( obs[ i ] );
        return obs;
    }
 
/* handle "fish on fish2" */
 
    if( sscanf( str, "%s on %s", s1, s2 ) == 2 ||
            sscanf( str, "%s in %s", s1, s2 ) == 2 )
    {
        obs = wiz_present( s2, onobj );
        if( !sizeof( obs ) )
            return obs;
        obs2 = ({ });
        for( i = 0; i < sizeof( obs ); i++ )
            obs2 += wiz_present( s1, obs[ i ], 1 );
        return obs2;
    }
 
/* fish and fish2 */
 
    if( sscanf( str, "%s and %s", s1, s2 ) == 2 )
    {
        obs = wiz_present( s1, onobj );
        obs2 = wiz_present( s2, onobj );
        for( i = 0; i < sizeof( obs ); i++ )    /* remove duplicates ... */
            if( member_array( obs[ i ], obs2 ) < 0 )
                obs2 += ({ obs[ i ] });
        return obs2;
    }
 
/* fish except fish2 */
 
    if( sscanf( str, "%s except %s", s1, s2 ) == 2 ||
            sscanf( str, "%s but %s", s1, s2 ) == 2 )
    {
        obs = wiz_present( s1, onobj );
        obs2 = wiz_present( s2, onobj );
        for( i = 0; i < sizeof( obs2 ); i++ )
            while( (j = member_array( obs2[ i ], obs )) > -1 )
                obs = delete( obs, j--, 1 );
        return obs;
    }
 
/* children of fish */
 
    if( sscanf( str, "children of %s", s1 ) == 1 )
    {
        obs = wiz_present( s1, onobj );
        obs2 = ({ });
        for( i = 0; i < sizeof( obs ); i++ )
        {
            s1 = file_name( obs[ i ] );
            sscanf( s1, "%s#%d", s1, j );
            obs2 += children( s1 );
        }
        return obs2;
    }
 
    if( sscanf( str, "player %s", s1 ) )
        return({ find_player( s1 ) });
 
    if( !sizeof( obs2 = wzpresent2( str, onobj ) ) && !nogoout )
    {
        obs2 = wzpresent2( str, environment( onobj ) );
    }
 
    if( sizeof( obs2 ) )
        return obs2;
 
/* check for a find_match locally */
 
    obs2 = find_match( str, onobj );
    if( sizeof( obs2 ) > 0 )
        return obs2;
 
/* default to return find_living ...  */
 
    if( ob = find_living( (string)this_player()->expand_nickname( str ) ) )
        return({ ob });
 
    return({ });
}                               /* wiz_present() */
 
static mixed *parse_args( string str, string close )
{
    mixed * args, *m, *m2;
    object *obs;
    string  s1, s2, s3, s4, s5, s6, s7;
    int     i;
    mapping map;
 
    args = ({ });
    while( strlen( str ) )
    {
        while( strlen( str ) && str[ 0 ] == ' ' )
            str = str[ 1..1000 ];
        if( !strlen( str ) || str[ 0..0 ] == close )
            return({ args, str[ 1..1000 ] });
        switch( str[ 0 ] )
        {
            case '\'':
                if( sscanf( str, "'%s'%s", s1, s2 ) != 2 )
                {
                    write( "Unterminated string.\n" );
                    return 0;
                }
                args += ({ replace( s1, "\\n", "\n" ) });
                str = s2;
                break;
            case '`':
                if( sscanf( str, "`%s`%s", s1, s2 ) != 2 )
                {
                    write( "Unterminated string.\n" );
                    return 0;
                }
                args += ({ replace( s1, "\\n", "\n" ) });
                str = s2;
                break;
            case '"':
                if( sscanf( str, "\"%s\"%s", s1, s2 ) != 2 )
                {
                    write( "Unterminated string.\n" );
                    return 0;
                }
                args += ({ replace( s1, "\\n", "\n" ) });
                str = s2;
                break;
            case '{':
                m = parse_args( str[ 1..1000 ], "}" );
                if( !m )
                    return 0;
                args += ({ m[ 0 ] });
                str = m[ 1 ];
                break;
            case '[':
                str = str[ 1..1000 ];
                map = ([ ]);
                while( 1 )
                {
                    m = parse_args( str, ":" );
/* Ok...  if we cannot find another : maybe we are at the end? */
                    if( !m )
                    {
                        while( strlen( str ) && str[ 0 ] == ' ' )
                            str = str[ 1..1000 ];
                        if( str[ 0 ] == ']' )
                            break;
                    }
                    if( !(m2 = parse_args( str, "," )) )
                    {
                        if( !(m2 = parse_args( str, "]" )) )
                            return 0;
                        if( sizeof( m[ 0 ] ) )
                            map[ m[ 0 ][ 0 ] ] = (sizeof( m2[ 0 ] ) ? m2[ 0 ][ 0 ] : 0);
                        break;
                    }
                    if( sizeof( m[ 0 ] ) )
                        map[ m[ 0 ][ 0 ] ] = (sizeof( m2[ 0 ] ) ? m2[ 0 ][ 0 ] : 0);
                }
                args += ({ map });
                break;
            case '|':
                if( sscanf( str, "|%s|%s", s1, s2 ) != 2 )
                {
                    write( "Unmatched |\n" );
                    return 0;
                }
                obs = wiz_present( str, this_player() );
                if( !sizeof( obs ) )
                    args += ({ this_player() });
                else
                    if( sizeof( obs ) == 1 )
                        args += ({ obs[ 0 ] });
                    else
                        args += ({ obs });
                str = s2;
                break;
            case '0'..'9':
            case '-':
                if( sscanf( str, "%d%s", i, str ) != 2 )
                {
                    write( "Number expected.\n" );
                    return 0;
                }
                args += ({ i });
                break;
            default:
                s2 = s3 = 0;
                sscanf( str, "%s,%s", s4, s2 );
                sscanf( str, "%s" + close + "%s", s5, s3 );
                if( sscanf( str, "%s->%s", s6, s7 ) == 2 &&
                        (!s3 || strlen( s5 ) > strlen( s6 )) &&
                        (!s2 || strlen( s4 ) > strlen( s6 )) )
                {
/* Now we do something trully revolting.... */
                    while( s7[ 0 ] == ' ' )
                        s7 = s7[ 1..1000 ];
                    if( sscanf( s7, "%s(%s", s1, s7 ) != 2 )
                    {
                        write( "'(' expected.\nLine left unprocessed" + s7 + "\n" );
                        return 0;
                    }
                    obs = wiz_present( s6, this_player() );
                    if( !sizeof( obs ) )
                    {
                        write( "The object " + s6 + " needs to exist.\n" );
                        return 0;
                    }
                    m = parse_args( s7, ")" );
                    if( !m )
                        return 0;
                    if( sizeof( m[ 0 ] ) < 6 )
                        m[ 0 ] += allocate( 6 - sizeof( m[ 0 ] ) );
                    obs = map_array( obs, "mapped_call", this_object(), ({ s1 }) +m[ 0 ] );
                    if( sizeof( obs ) == 1 )
                        args += obs;
                    else
                        args += ({ obs });
                    str = m[ 1 ];
                    break;
                }
                else
                    if( s2 && s3 )
                        if( strlen( s4 ) < strlen( s5 ) )
                        {
                            s1 = ",";
                            str = s4;
                        }
                        else
                        {
                            s1 = close;
                            s2 = s3;
                            str = s5;
                        }
                    else
                        if( s2 )
                        {
                            s1 = ",";
                            str = s4;
                        }
                        else
                            if( s3 )
                            {
                                s1 = close;
                                s2 = s3;
                                str = s5;
                            }
                            else
                            {
                                s1 = "";
                                s2 = "";
                            }
                obs = wiz_present( str, this_player() );
                if( !sizeof( obs ) )
                {
                    if( str[ 0 ] >= '0' && str[ 0 ] <= '9' || str[ 0 ] == '-' )
                    {
                        sscanf( str, "%d%s", i, str );
                        args += ({ i });
                    }
                    else
                        args += ({ replace( str, "\\n", "\n" ) });
                }
                else
                    if( sizeof( obs ) == 1 )
                        args += ({ obs[ 0 ] });
                    else
                        args += ({ obs });
                str = s1 + s2;
                break;
        }
/* Skip rubbish and if we dont have a comma we have finished. */
        while( strlen( str ) && str[ 0 ] == ' ' )
            str = str[ 1..1000 ];
        if( !strlen( str ) )
            return({ args, str });
        if( str[ 0..0 ] == close )
            return({ args, str[ 1..1000 ] });
        if( str[ 0 ] != ',' )
        {
            write( "Parse error reading arguments, ',' or '" + close + "' expected.\n" );
            write( "Line left unprocessed " + str + "\n" );
            return 0;
        }
        str = str[ 1..1000 ];
    }
    return({ args, str });
}                               /* parse_args() */
 
void    inform_of_call( object ob, mixed *argv )
{
    string  str;
    int     i;
 
    str = this_object()->query_cap_name() + " calls " + argv[ 0 ] + "(";
    for( i = 1; i < sizeof( argv ); )
    {
        str += replace( sprintf( "%O", argv[ i ] ), "\n", " " );
        if( ++i < sizeof( argv ) )
            str += ",";
    }
/* Arggghhh!  This is annoying me.
   /* Same comment here.
   ob->event_inform(this_object(), str + ") on you", "call");
 */
}                               /* inform_of_call() */
 
static mixed mapped_call( object ob, mixed *argv )
{
    inform_of_call( ob, argv );
    return call_other( ob, argv[ 0 ], argv[ 1 ], argv[ 2 ], argv[ 3 ],
                       argv[ 4 ], argv[ 5 ], argv[ 6 ] );
}                               /* mapped_call() */
 
/* Free form parse_args code */
static int parse_frogs( string str )
{
    mixed   junk;
 
    if( this_player( 1 ) != this_object() )
        return 0;
/* We are not as such looking for an end thingy of any sort... */
    junk = parse_args( str, ";" );
/* It has already printed an error, so we return 1... */
    if( !junk )
        return 1;
    write( "The line " + str + " Returns: \n" );
    printf( "%O\n", junk[ 0 ] );
    return 1;
}                               /* parse_forgs() */
 
static  function2( str )
{
    /* call fish(x,y,z) object */
    mixed * args;
    string *s, s1, s2;
    string  fn, os;
    string *argv;
    object *ov, retobj;
    object  fish, shad, f, file;
    int     i;
 
    if( this_player( 1 ) != this_object() )
        return 0;
    if( !str )
    {
        notify_fail( "USAGE : call lfun(arg[,arg[,arg...]]) object[s]\n" );
        return 0;
    }
    s = explode( "&" + str + "&", ")" );
    if( sizeof( s ) < 2 || sscanf( s[ 0 ], "%s(%s", s1, s2 ) != 2 )
    {
        notify_fail( "USAGE : call lfun(arg[,arg[,arg...]]) object[s]\n" );
        return 0;
    }
    fn = replace( s1[ 1..1000 ], " ", "" );
    s[ 0 ] = s2;
    args = parse_args( implode( s, ")" ), ")" );
    if( !args )
        return 1;
    argv = args[ 0 ];
    os = args[ 1 ][ 0..strlen( args[ 1 ] ) - 2 ];
    while( strlen( os ) && os[ 0 ] == ' ' )
        os = os[ 1..1000 ];
    notify_fail( "Can't find object " + os + ".\n" );
    ov = wiz_present( os, this_object() );
 
    if( !sizeof( ov ) )
        return 0;
 
    if( sizeof( argv ) < 6 )
        argv += allocate( 6 - sizeof( argv ) );
    for( i = 0; i < sizeof( ov ); i++ )
    {
        fish = ov[ i ];
        while( shad = shadow( fish, 0 ) )
        {
            fish = shad;
            if( f = function_exists( fn, fish ) )
                file = f;
        }
        if( !file )
            file = function_exists( fn, ov[ i ] );
        if( file )
        {
            retobj = call_other( ov[ i ], fn, argv[ 0 ], argv[ 1 ], argv[ 2 ],
                                 argv[ 3 ], argv[ 4 ], argv[ 5 ] );
            inform_of_call( ov[ i ], ({ fn }) +argv );
            write( "*** function on '" + desc_object( ov[ i ] ) + "' found in " +
                   file + " ***\n" );
            write( "Returned: " );
            printf( "%O\n", retobj );
        }
        else
            write( "*** function on '" + desc_object( ov[ i ] ) + "' Not found ***\n" );
        file = 0;
    }
    return 1;
}                               /* function2() */
 
static int do_find( string str )
{
    string  func, thing, s, ping;
    object *obs, fish;
    int     i;
 
    notify_fail( "Usage: find function() <object(s)>\n" );
    if( !str )
        return 0;
    if( sscanf( str, "%s() %s", func, thing ) != 2 )
        if( sscanf( str, "%s %s", func, thing ) != 2 )
            return 0;
 
    obs = wiz_present( thing, this_object() );
 
    if( !sizeof( obs ) )
    {
        notify_fail( "Can't find " + thing + ".\n" );
        return 0;
    }
    s = "";
    for( i = 0; i < sizeof( obs ); i++ )
    {
        if( ping = function_exists( func, obs[ i ] ) )
            s += "*** " + desc_object( obs[ i ] ) + ": " + func + "() found in " + ping + "\n";
        else
            s += "*** " + desc_object( obs[ i ] ) + ": " + func + "() not found.\n";
        fish = obs[ i ];
        while( fish = shadow( fish, 0 ) )
            if( function_exists( func, fish ) )
                s += "      Shadowed by " + file_name( fish ) + "\n";
    }
    write( s );
    return 1;
}                               /* do_find() */
 
int     show_stats( string str )
{
    object *ob;
    mixed   ob1;
    string  s, bing;
    int     i, j;
 
    bing = "";
    str = (string)this_object()->expand_nickname( str );
    ob = wiz_present( str, this_object() );
    if( !sizeof( ob ) )
    {
        write( "No such object.\n" );
        return 1;
    }
    for( j = 0; j < sizeof( ob ); j++ )
    {
        ob1 = (mixed)ob[ j ]->stats();
        if( !pointerp( ob1 ) )
            continue;
        s = "";
        for( i = 0; i < sizeof( ob1 ); i++ )
            if( ob1[ i ][ 1 ] )
                s += ob1[ i ][ 0 ] + ": " + ob1[ i ][ 1 ] + "\n";
        bing += sprintf( "%-*#s\n\n\n", this_object()->query_cols(), s );
    }
    this_object()->more_string( bing );
    return 1;
}                               /* show_stats() */
 
int     home()
{
    notify_fail( "Useage : alias home goto <wherever>\n" );
    return 0;
}                               /* home() */
 
int     trans( string str )
{
    object *obs;
    int     i;
 
    if( this_player( 1 ) != this_object() )
        return 0;
    if( !str || !(sizeof( obs = wiz_present( str, this_object() ) )) )
    {
        write( "Transport who ?\n" );
        return 1;
    }
    for( i = 0; i < sizeof( obs ); i++ )
    {
        if( environment( obs[ i ] ) == environment() )
        {
            write( desc_object( obs[ i ] ) + " is already here.\n" );
            continue;
        }
        tell_object( obs[ i ], "You are magically transfered somewhere.\n" );
        obs[ i ]->move_player( "X", file_name( environment( this_player() ) ) );
    }
    return 1;
}                               /* trans() */
 
int     upgrade_player()
{
    object  ob;
 
    ob = clone_object( "/secure/upgrade" );
    ob->new_player( this_object() );
    return 1;
}                               /* upgrade_player() */
 
int     find_shadows( string s )
{
    object *objs, *shadows;
    object  nobj;
    int     i, j;
 
    if( !s || s == "" )
        s = "me";
    objs = wiz_present( s, this_object() );
    if( sizeof( objs ) == 0 )
    {
        notify_fail( "Can't find object.\n" );
        return 0;
    }
 
    for( i = 0; i < sizeof( objs ); i++ )
    {
        shadows = ({ });
        nobj = objs[ i ];
        while( nobj = shadow( nobj, 0 ) )
            shadows += ({ nobj });
        if( !sizeof( shadows ) )
        {
            write( desc_f_object( objs[ i ] ) + " is not being shadowed.\n" );
        }
        else
        {
            write( desc_f_object( objs[ i ] ) + " is being shadowed by:\n" );
            for( j = 0; j < sizeof( shadows ); j++ )
                write( "    " + file_name( shadows[ j ] ) + "\n" );
        }
    }
    return 1;
}                               /* find_shadows() */
 
int     do_debug( string str )
{
    object *obs;
 
    if( !str )
    {
        notify_fail( "Usage: " + query_verb() + " <object>\n" );
        return 0;
    }
    if( !sizeof( obs = wiz_present( str, this_object() ) ) )
    {
        notify_fail( "Object " + str + " not found.\n" );
        return 0;
    }
    debug_info( (query_verb() == "dump" ? 0 : 1), obs[ 0 ] );
    return 1;
}                               /* do_debug() */