area/
build/testing/
log/
player/
player/backup/
/***************************************************************************
 *  Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer,        *
 *  Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe.   *
 *                                                                         *
 *  Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael          *
 *  Chastain, Michael Quan, and Mitchell Tse.                              *
 *                                                                         *
 *  In order to use any part of this Merc Diku Mud, you must comply with   *
 *  both the original Diku license in 'license.doc' as well the Merc       *
 *  license in 'license.txt'.  In particular, you may not remove either of *
 *  these copyright notices.                                               *
 *                                                                         *
 *  Much time and thought has gone into this software and you are          *
 *  benefitting.  We hope that you share your changes too.  What goes      *
 *  around, comes around.                                                  *
 ***************************************************************************/
#include <glib.h>

#include <sys/types.h>
#include <ctype.h>
#ifdef unix
#include <unistd.h>
#endif
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <merc.h>
#include <lookup.h>
#include <recycle.h>
#include <tables.h>
#include <interp.h>
#include <olc.h>

extern CHAR_DATA  *reset_player args(( DESCRIPTOR_DATA *d, const char *name ));
bool    deadbeat		args( ( CHAR_DATA *ch, OBJ_DATA *obj ) );

char *print_flags(int flag)
{
	int count, pos = 0;
	static char buf[52];
	
	
	for (count = 0; count < 32;  count++)
	{
		if (IS_SET(flag,1<<count))
		{
			if (count < 26)
				buf[pos] = 'A' + count;
			else
				buf[pos] = 'a' + (count - 26);
			pos++;
		}
	}
	
	if (pos == 0)
	{
		buf[pos] = '0';
		pos++;
	}
	
	buf[pos] = '\0';
	
	return buf;
}



/*
 * Local functions.
 */
void	fwrite_char_old	args( ( CHAR_DATA *ch,  FILE *fp ) );
extern void	fwrite_char	args( ( CHAR_DATA *ch,  FILE *fp ) );
void	fwrite_pet	args( ( CHAR_DATA *ch,  FILE *fp ) );
void	fwrite_obj	args( ( CHAR_DATA *ch,  OBJ_DATA  *obj,	FILE *fp, int iNest ) );
void	fread_char_old	args( ( CHAR_DATA *ch,  FILE *fp ) );
extern void	fread_char	args( ( CHAR_DATA *ch,  FILE *fp ) );
void	fread_pet	args( ( CHAR_DATA *ch,  FILE *fp ) );
void	fread_obj	args( ( CHAR_DATA *ch,  FILE *fp ) );
void 	save_char_obj_finger 	args( ( CHAR_DATA *ch ) );

void    convert_old_new args( ( CHAR_DATA *ch ) );

void save_char_obj_backup( CHAR_DATA *ch )
{
	char chlevel [15];
	char buf [MAX_INPUT_LENGTH];
	char strsave[MAX_STRING_LENGTH];
	FILE *fp;
	
	/*players Don't save on Chaos Night!*/
    if (IS_SET(mudsetting->mud_setting, MS_CHAOS_NIGHT))
        return;

    if ( IS_NPC(ch) || ch->level < 2 )
		return;
	
	if ( ch->desc != NULL && ch->desc->original != NULL )
		ch = ch->desc->original;
	
	ch->save_time = current_time;
	fclose( fpReserve );
	sprintf( strsave, "%sstore/%s", PLAYER_DIR, capitalize(ch->name->str) );
	if ( ( fp = fopen( strsave, "w" ) ) == NULL )
	{
		fpReserve = fopen( NULL_FILE, "r" );
		bug( "Save_char_obj: fopen", 0 );
		fclose( fpReserve );
	}
	else
	{
		fwrite_char( ch, fp );
		
		if ( ch->carrying != NULL )
			fwrite_obj( ch, ch->carrying, fp, 0 );
		
		if ( ch->pet != NULL )
			fwrite_pet( ch, fp);

		fprintf( fp, "#END\n" );
		if      (ch->level >= 11) sprintf(chlevel,"<Implementor>");
		else if (ch->level == 10) sprintf(chlevel,"<High Judge>");
		else if (ch->level == 9 ) sprintf(chlevel,"<Judge>");
		else if (ch->level == 8 ) sprintf(chlevel,"<Enforcer>");
		else if (ch->level == 7 ) sprintf(chlevel,"<Quest Maker>");
		else if (ch->level == 6 ) sprintf(chlevel,"<Builder>");
		else if (ch->level == 5 ) sprintf(chlevel,"<Avatar>");
		else if (ch->level == 4 ) sprintf(chlevel,"<Avatar>");
		else if (ch->level == 3 ) sprintf(chlevel,"<Avatar>");
		else                      sprintf(chlevel,"<Mortal>");
		if (ch->lasttime->len > 1)
			sprintf(buf,"%s Last logged in on %s.\n\r", chlevel, ch->lasttime->str);
		else
			sprintf(buf,"%s New player logged in on %s.\n\r", chlevel, ch->createtime->str);
		fprintf( fp, buf);
	}
	fflush( fp );
	fclose( fp );
	fpReserve = fopen( NULL_FILE, "r" );
	return;
}


/*
 * Load a char and inventory into a new ch structure.
 */
bool load_char_obj( DESCRIPTOR_DATA *d, char *name )
{
/*
	static PC_DATA pcdata_zero;
*/
	char strsave[MAX_STRING_LENGTH];
	CHAR_DATA *ch;
	FILE *fp;
	bool found;
	bool valid_player = TRUE;
	int reason = 0;
	
    	ch = reset_player(d,name);	

	found = FALSE;

	/*
	 * Close the NULL reserve and open our player file
	 */
	fclose( fpReserve );
	sprintf( strsave, "%s%s", PLAYER_DIR, capitalize( name ) );
	if ( ( fp = fopen( strsave, "r" ) ) != NULL )
	{
		set_rObjNest_null();
		
		found = TRUE;
		for ( ; ; )
		{
			char letter;
			char *word;
			
			letter = fread_letter( fp );
			if ( letter == '*' )
			{
				fread_to_eol( fp );
				continue;
			}
			
			if ( letter != '#' )
			{
				valid_player = FALSE;
				reason = 1;
				break;
			}
			
			word = fread_word( fp );
			if ( !str_cmp( word, "PLAYERS" ) ) fread_char    ( ch, fp );
			else if ( !str_cmp( word, "OBJECT" ) ) fread_obj      ( ch, fp );
			else if ( !str_cmp( word, "PET"	   ) ) fread_pet      ( ch, fp );
			else if ( !str_cmp( word, "END"    ) ) break;
			else
			{
				valid_player = FALSE;
				reason = 2;
				break;
			}
			if (Player_Error == TRUE)
				valid_player = FALSE;
		}
		fclose( fp );
	}
	
	fpReserve = fopen( NULL_FILE, "r" );

	if (!valid_player){
		if (reason == 2)
			bug( "Load_char_obj: bad section.", 0 );
		if (reason == 1)
			bug( "Load_char_obj: # not found.", 0 );
		return FALSE;
	}

	return found;
}



bool load_char_short( DESCRIPTOR_DATA *d, char *name )
{
/*
	static PC_DATA pcdata_zero;
*/
	char strsave[MAX_STRING_LENGTH];
	CHAR_DATA *ch;
	FILE *fp;
	bool found;

        ch = reset_player(d,name);	
	
	found = FALSE;
	fclose( fpReserve );
	sprintf( strsave, "%s%s", PLAYER_DIR, capitalize( name ) );
	if ( ( fp = fopen( strsave, "r" ) ) != NULL )
	{
		set_rObjNest_null();
		
		found = TRUE;
		for ( ; ; )
		{
			char letter;
			char *word;
			
			letter = fread_letter( fp );
			if ( letter == '*' )
			{
				fread_to_eol( fp );
				continue;
			}
			
			if ( letter != '#' )
			{
				fpReserve = fopen( NULL_FILE, "r" );
				bug( "Load_char_obj: # not found.", 0 );
				fclose( fpReserve );
				break;
			}
			
			word = fread_word( fp );
			if      ( !str_cmp( word, "PLAYERS" ) ) fread_char ( ch, fp );
			else if ( !str_cmp( word, "OBJECT" ) ) break;
			else if ( !str_cmp( word, "END"    ) ) break;
			else
			{
				fpReserve = fopen( NULL_FILE, "r" );
				bug( "Load_char_obj: bad section.", 0 );
				fclose( fpReserve );
				break;
			}
		}
		fclose( fp );
	}
	
	fpReserve = fopen( NULL_FILE, "r" );
	return found;
}