/
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/
inherit "std/object";

#define RESTORE_PATH  "save/library/"
#include "quest_handler.h"

string  player_name, player_title, *quests, text_file;
int    *times, *levels, *highest, quest_points;

void    init_data( string pl_name )
{
    player_name = pl_name;
    quests = ({ });
    times = ({ });
    levels = ({ });
    text_file = "";
    highest = ({ });
    player_title = 0;
    quest_points = 0;
}

int     get_data_file( string name )
{
    int     success;

    if( player_name != name )
    {
	success = restore_object( RESTORE_PATH + name );
	if( !success )
	{
	    init_data( name );
	}
	return success;
    }
    return 1;
}

void    save_data_file( string name )
{
    return( void ) save_object( RESTORE_PATH + name );
}

string  query_title( string name )
{
    get_data_file( name );
    return player_title;
}

string *query_quests( string name )
{
    get_data_file( name );
    if( !quests )
    {
	return({ });
    }
    return quests + ({ });
}

string  get_highest_quest( string name )
{
    int     loop, highest;
    string  quest_name;

    if( !get_data_file( name ) )
    {
	return "Sorry";
    }
    if( !sizeof( quests ) )
    {
	return "None";
    }
    for( highest = loop = 0; loop < sizeof( quests ); loop++ )
    {
	if( QUEST_HANDLER->query_quest_level( quests[ loop ] ) > highest )
	{
	    highest = (int)QUEST_HANDLER->query_quest_level( quests[ loop ] );
	    quest_name = quests[ loop ];
	}
    }
    return quest_name;
}

int     get_highest_quest_level( string name )
{
    int     highest;
    string  qu_name;

    if( !get_data_file( name ) )
    {
	return 0;
    }
    if( !sizeof( quests ) )
    {
	return 0;
    }
    qu_name = get_highest_quest( name );
    if( (highest = member_array( qu_name, quests )) == -1 )
    {
	return 0;
    }
    return levels[ highest ];
}

string  get_most_recent_quest( string name )
{
    int     loop, highest;
    string  quest_name;

    if( !get_data_file( name ) )
    {
	return "Sorry";
    }
    if( sizeof( quests ) == 0 )
    {
	return "None";
    }
    for( highest = loop = 0; loop < sizeof( quests ); loop++ )
    {
	if( times[ loop ] > highest )
	{
	    highest = times[ loop ];
	    quest_name = quests[ loop ];
	}
    }
    return quest_name;
}

int     get_most_recent_time( string name )
{
    int     loop, hightime;

    if( !get_data_file( name ) )
    {
	return -1;
    }
    if( sizeof( quests ) == 0 )
    {
	return 0;
    }
    for( hightime = loop = 0; loop < sizeof( quests ); loop++ )
    {
	if( times[ loop ] > hightime )
	{
	    hightime = times[ loop ];
	}
    }
    return hightime;
}

int     get_highest_quest_time( string name )
{
    int     hightime;
    string  temp;

    if( !get_data_file( name ) )
    {
	return -1;
    }
    if( sizeof( quests ) == 0 )
    {
	return 0;
    }
    temp = get_highest_quest( name );
    hightime = member_array( temp, quests );
    return times[ hightime ];
}

int     new_top_quest();

int     set_quest( string pl_name, string qu_name )
{
    int     qu_level, pos, tmp;
    object  ob;

    get_data_file( pl_name );
    if( member_array( qu_name, quests ) != -1 )
    {
	return 0;
    }
    quests += ({ qu_name });
    times += ({ time() });
    qu_level = (int)QUEST_HANDLER->query_quest_level( qu_name );
    quest_points += qu_level;
    levels += ({ qu_level });
    if( new_top_quest() )
    {
	highest += ({ member_array( qu_name, quests ) });
    }
    else
    {
	int     smallest, loop;

	for( smallest = 9999, loop = 0; loop < sizeof( quests ); loop++ )
	{
	    if( smallest > levels[ loop ] && (tmp = member_array( loop, highest )) != -1 )
	    {
		smallest = levels[ loop ];
		pos = tmp;
	    }
	}
	if( qu_level > smallest )
	{
	    highest[ pos ] = sizeof( quests ) - 1;
	}
    }
    QUEST_HANDLER->quest_completed( pl_name, qu_name, previous_object() );
    if( qu_level >= get_highest_quest_level( pl_name ) )
    {
	player_title = (string)QUEST_HANDLER->query_quest_title( qu_name );
    }
    seteuid( (string)"secure/master"->get_root_uid() );
    save_data_file( pl_name );
    seteuid( "Room" );
    if( ob = find_player( pl_name ) )
    {
	ob->set_title( player_title );
    }
    return 1;
}

int     query_quest_time( string pl_name, string qu_name )
{
    int     time;

    if( !get_data_file( name ) )
    {
	return 0;
    }
    time = member_array( qu_name, quests );
    if( time < 0 )
    {
	return 0;
    }
    return times[ time ];
}

int     new_top_quest()
{
    if( !sizeof( highest ) )
    {
	return 1;
    }
    if( sizeof( highest ) == 2 )
    {
	return 1;
    }
    if( sizeof( highest ) == 4 )
    {
	return 1;
    }
    if( sizeof( highest ) == 6 )
    {
	return 1;
    }
    if( sizeof( highest ) == 8 )
    {
	return 1;
    }
    if( !(sizeof( highest ) % 10) )
    {
	return 1;
    }
    return 0;
}

string  query_story( string name )
{
    string  story, *qu_names;
    int     loop, how_many;

    if( !get_data_file( name ) )
    {
	return "You can find nothing in the library on " + name + "\n";
    }
    story = "";
    if( text_file != "" )
    {
	return read_file( text_file );
    }
    if( !sizeof( quests ) )
    {
	return "That person has lead a most unadventureous life";
    }
    for( loop = 0; loop < sizeof( highest ); loop++ )
    {
	story += capitalize( player_name ) +
	    QUEST_HANDLER->query_quest_story( quests[ highest[ loop ] ] ) + "\n";
    }
    return story;
}

void    set_title( string who, string what )
{
    if( !"/secure/login"->test_user( who ) )
	return;
    get_data_file( who );
    player_title = what;
    save_data_file( who );
}

int     query_quest_done( string player, string quest )
{
    get_data_file( player );
    return( member_array( quest, quests ) != -1 );
}

int     query_quest_points( string name )
{
    get_data_file( name );
    return quest_points;
}