Mud20/accounts/
Mud20/accounts/c/
Mud20/accounts/f/
Mud20/accounts/k/
Mud20/accounts/s/
Mud20/accounts/t/
Mud20/area_current/
Mud20/area_current/newareas/
Mud20/bin/
Mud20/clans/
Mud20/gods/
Mud20/old-sources/
Mud20/player/
Mud20/player/a/del/
Mud20/player/b/
Mud20/player/b/bak/
Mud20/player/b/del/
Mud20/player/f/
Mud20/player/f/bak/
Mud20/player/f/del/
Mud20/player/k/
Mud20/player/k/bak/
Mud20/player/k/del/
Mud20/player/k/dmp/
Mud20/player/m/
Mud20/player/m/bak/
Mud20/player/o/
Mud20/player/o/bak/
Mud20/player/p/
Mud20/player/s/
Mud20/player/s/bak/
Mud20/player/s/del/
Mud20/player/t/
Mud20/player/t/del/
Mud20/player/v/
Mud20/public_html/
Mud20/races/
Mud20/skilltables/
__MACOSX/Mud20/accounts/
__MACOSX/Mud20/accounts/c/
__MACOSX/Mud20/accounts/f/
__MACOSX/Mud20/accounts/k/
__MACOSX/Mud20/accounts/s/
__MACOSX/Mud20/area_current/
__MACOSX/Mud20/area_current/core_areas/
__MACOSX/Mud20/area_current/helps/
__MACOSX/Mud20/area_current/newareas/
__MACOSX/Mud20/backups/
__MACOSX/Mud20/bin/
__MACOSX/Mud20/clans/
__MACOSX/Mud20/gods/
__MACOSX/Mud20/log/
__MACOSX/Mud20/old-sources/
__MACOSX/Mud20/player/
__MACOSX/Mud20/player/a/del/
__MACOSX/Mud20/player/b/
__MACOSX/Mud20/player/b/bak/
__MACOSX/Mud20/player/f/
__MACOSX/Mud20/player/f/bak/
__MACOSX/Mud20/player/f/del/
__MACOSX/Mud20/player/k/
__MACOSX/Mud20/player/k/bak/
__MACOSX/Mud20/player/k/del/
__MACOSX/Mud20/player/k/dmp/
__MACOSX/Mud20/player/m/
__MACOSX/Mud20/player/m/bak/
__MACOSX/Mud20/player/o/
__MACOSX/Mud20/player/o/bak/
__MACOSX/Mud20/player/p/
__MACOSX/Mud20/player/s/
__MACOSX/Mud20/player/s/bak/
__MACOSX/Mud20/player/t/del/
__MACOSX/Mud20/player/v/
__MACOSX/Mud20/public_html/
__MACOSX/Mud20/races/
__MACOSX/Mud20/skilltables/
/***************************************************************************
 * Mud20 1.0 by Todd H. Johnson (Kregor) a derivative of the Open Gaming   *
 * License by Wizards of the Coast. All comments referring to D20, OGL,    *
 * and SRD refer to the System Reference Document for the Open Gaming      *
 * system. Any inclusion of these derivatives must include credit to the   *
 * Mud20 system, the full and complete Open Gaming LIcense, and credit to  *
 * the respective authors. See ../doc/srd.txt for more information.        *
 *                                                                         *
 * Emud  2.2 by Igor van den Hoven, Michiel Lange, and Martin Bethlehem.   *
 *                                                                         *
 * MrMud 1.4 by David Bills, Dug Michael and Martin Gallwey                *
 *                                                                         *
 * Merc  2.1 Diku Mud improvments copyright (C) 1992, 1993 by Michael      *
 * Chastain, Michael Quan, and Mitchell Tse.                               *
 *                                                                         *
 * Original Diku Mud copyright (C) 1990 1991 by Sebastian Hammer,          *
 * Michael Seifert, Hans Henrik St{rfeld, Tom Madsen, and Katje Nyboe.     *
 ***************************************************************************/

/***************************************************************************
 * data.c: Functions to control read/write of flat file data						   *
 ***************************************************************************/

#include "mud.h"

#define SITEBAN_LIST				"data/siteban.lst"
#define SITEBAN_LIST_TMP		"data/siteban.tmp"
#define NSITEBAN_LIST				"data/nsiteban.lst"
#define NSITEBAN_LIST_TMP		"data/nsiteban.tmp"
#define PLAYER_LIST					"data/player.lst"
#define PLAYER_LIST_TMP			"data/player.tmp"
#define USAGE_LIST					"data/usage.lst"
#define USAGE_LIST_TMP			"data/usage.tmp"
#define VICTORY_LIST				"data/victory.lst"
#define VICTORY_LIST_TMP		"data/victory.tmp"
#define BOUNTY_LIST					"data/bounty.lst"
#define BOUNTY_LIST_TMP			"data/bounty.tmp"
#define HIGHSCORE_LIST			"data/hiscore.lst"
#define HIGHSCORE_LIST_TMP	"data/hiscore.tmp"
#define TIMEINFO_LIST				"data/timeinfo.lst"
#define TIMEINFO_LIST_TMP		"data/timeinfo.lst"

void del_data( CHAR_DATA *ch )
{
	HISCORE_DATA	* pHiscore;
	HISCORE_LIST	* pHilist;
	BOUNTY_DATA	* pBounty;
	int x;

	push_call("del_data(%p)",ch);

	for (x = 0 ; x < MOST_MOST ; x++)
	{
		pHilist = mud->high_scores[x];

		for (pHiscore = pHilist->first ; pHiscore ; pHiscore = pHiscore->next)
		{
			if (pHiscore->vnum == ch->pcdata->pvnum)
			{
				UNLINK(pHiscore, pHilist->first, pHilist->last, next, prev);
				pHiscore->vnum		= -1;
				pHiscore->score	=  0;
				STRFREE(pHiscore->player);
				pHiscore->player	= STRDUPE(str_empty);
				LINK(pHiscore, pHilist->first, pHilist->last, next, prev);

				break;
			}
		}
	}

	for (pBounty = mud->f_bounty ; pBounty ; pBounty = pBounty->next)
	{
		if (!strcasecmp(pBounty->name, ch->name))
		{
			remove_bounty(pBounty);
			break;
		}
	}

	if (ch->pcdata->pvnum && pvnum_index[ch->pcdata->pvnum])
	{
		SET_BIT(pvnum_index[ch->pcdata->pvnum]->flags, PVNUM_DELETED);

		save_players();
	}
	pop_call();
	return;
}

void load_hiscores( void )
{
	HISCORE_DATA *hiscore;
	FILE *fpList;
	char letter;
	int x;

	push_call("load_hiscores()");

	log_printf( "Loading %s...", HIGHSCORE_LIST );

	close_reserve();

	if ((fpList = my_fopen(HIGHSCORE_LIST, "r", FALSE)) == NULL)
	{
		perror( HIGHSCORE_LIST );
		exit( 1 );
	}

	for ( ; ; )
	{
		letter = fread_letter( fpList );

		if (letter != 'H')
		{
			if (letter != '$')
			{
				log_printf("***WARNING*** load_hiscores: bad format");
			}
			fread_to_eol(fpList);
			break;
		}
		ALLOCMEM(hiscore, HISCORE_DATA, 1);
		x				= fread_number( fpList );
		hiscore->vnum		= fread_number( fpList );
		hiscore->score		= fread_number( fpList );
		hiscore->player	= fread_string( fpList );
		LINK(hiscore, mud->high_scores[x]->first, mud->high_scores[x]->last, next, prev);
	}

	if (fpList)
	{
		my_fclose( fpList );
	}

	open_reserve();

	pop_call();
	return;
}


void save_hiscores( )
{
	HISCORE_DATA *hiscore;
	FILE *fpout;
	int x, y;

	push_call("save_hiscores()");

	close_reserve();

	if ((fpout = my_fopen(HIGHSCORE_LIST_TMP, "w", FALSE)) == NULL)
	{
		perror(HIGHSCORE_LIST_TMP);
		open_reserve();
		pop_call();
		return;
	}

	for (x = 0 ; x < MOST_MOST ; x++)
	{
		for (y = 0, hiscore = mud->high_scores[x]->first ; hiscore && y < MAX_HISCORE ; hiscore = hiscore->next, y++)
		{
			fprintf(fpout, "H %2d %6d %6d %s~\n", x, hiscore->vnum, hiscore->score, hiscore->player);
		}
	}

	fprintf( fpout, "$\nXXXXXXXXXX\n#%s\n", HIGHSCORE_LIST );

	my_fclose( fpout );

	if (is_valid_save(HIGHSCORE_LIST_TMP, HIGHSCORE_LIST ))
	{
		rename (HIGHSCORE_LIST_TMP, HIGHSCORE_LIST);
	}
	open_reserve();

	pop_call();
	return;
}

void load_players( void )
{
	char letter;
	FILE *fpList;
	PVNUM_DATA *player;
	int vnum;

	push_call("load_players(void)");

	log_printf("Loading %s...", PLAYER_LIST);

	close_reserve();

	if ((fpList = my_fopen(PLAYER_LIST, "r", FALSE)) == NULL)
	{
		perror( PLAYER_LIST );
		exit( 1 );
	}

	for ( ; ; )
	{
		letter = fread_letter( fpList );

		if (letter != 'P')
		{
			if (letter != '$')
			{
				log_printf("***WARNING*** load_players: bad format");
			}
			fread_to_eol(fpList);
			break;
		}
		vnum = fread_number( fpList );

		ALLOCMEM(player, PVNUM_DATA, 1);
		player->date  = fread_number( fpList );
		player->flags = fread_number( fpList );
		player->name  = fread_string( fpList );

		pvnum_index[vnum] = player;
	}

	if (fpList)
	{
		my_fclose( fpList );
	}

	open_reserve();

	pop_call();
	return;
}

void save_players( )
{
	FILE *fpout;
	int vnum;

	push_call("save_players()");

	close_reserve();

	if ((fpout = my_fopen(PLAYER_LIST_TMP, "w", FALSE)) == NULL)
	{
		perror(PLAYER_LIST_TMP);
		open_reserve();
		pop_call();
		return;
	}

	for (vnum = 0 ; vnum < MAX_PVNUM ; vnum++)
	{
		if (pvnum_index[vnum])
		{
			fprintf( fpout, "P %5d %10ld %10d %s~\n", vnum, pvnum_index[vnum]->date, pvnum_index[vnum]->flags, pvnum_index[vnum]->name);
		}
	}

	fprintf( fpout, "$\nXXXXXXXXXX\n#%s\n", PLAYER_LIST );

	my_fclose( fpout );

	if (is_valid_save(PLAYER_LIST_TMP, PLAYER_LIST ))
	{
		rename (PLAYER_LIST_TMP, PLAYER_LIST);
	}
	else
	{
		log_printf("Invalid save: %s", PLAYER_LIST);
	}
	open_reserve();

	pop_call();
	return;
}


void load_sites( void )
{
	FILE *fp;
	BAN_DATA *siteban;
	char letter;

	push_call("load_sites()");

	log_printf("Loading %s...", SITEBAN_LIST );

	close_reserve();

	if ((fp = my_fopen(SITEBAN_LIST, "r", FALSE)) == NULL)
	{
		perror(SITEBAN_LIST);
		exit (1);
	}

	for ( ; ; )
	{
		letter = fread_letter(fp);

		if (letter != 'B')
		{
			if (letter != '$')
			{
				log_printf("***WARNING*** load_sites: bad format");
			}
			fread_to_eol(fp);
			break;
		}
		ALLOCMEM(siteban, BAN_DATA, 1);
		siteban->name		= fread_string(fp);
		siteban->banned_by	= fread_string(fp);
		siteban->date		= fread_number(fp);
		LINK(siteban, mud->f_ban, mud->l_ban, next, prev);
	}

	if (fp)
	{
		my_fclose(fp);
	}

	open_reserve();

	pop_call();
	return;
}


void save_sites( )
{
	BAN_DATA *siteban;
	FILE *fpout;

	push_call("save_sites()");

	close_reserve();

	if ((fpout = my_fopen(SITEBAN_LIST_TMP, "w", FALSE)) == NULL)
	{
		perror(SITEBAN_LIST_TMP);
		open_reserve();
		pop_call();
		return;
	}

	for (siteban = mud->f_ban ; siteban ; siteban = siteban->next)
	{
		fprintf(fpout, "B %12s~ %12s~ %ld\n",siteban->name, siteban->banned_by, siteban->date);
	}

	fprintf(fpout,"$\nXXXXXXXXXXXXXXXXX\n#%s\n", SITEBAN_LIST);

	if (fpout)
	{
		my_fclose(fpout);
	}

	if (is_valid_save(SITEBAN_LIST_TMP, SITEBAN_LIST))
	{
		rename(SITEBAN_LIST_TMP, SITEBAN_LIST);
	}
	else
	{
		log_printf("Invalid save: %s", SITEBAN_LIST);
	}

	open_reserve();

	pop_call();
	return;
}


void load_nsites( void )
{
	FILE *fp;
	BAN_DATA *siteban;
	char letter;

	push_call("load_sites()");

	log_printf("Loading %s...", NSITEBAN_LIST );

	close_reserve();

	if ((fp = my_fopen(NSITEBAN_LIST, "r", FALSE)) == NULL)
	{
		perror(NSITEBAN_LIST);
		exit (1);
	}

	for ( ; ; )
	{
		letter = fread_letter(fp);

		if (letter != 'B')
		{
			if (letter != '$')
			{
				log_printf("***WARNING*** load_sites: bad format");
			}
			fread_to_eol(fp);
			break;
		}
		ALLOCMEM(siteban, BAN_DATA, 1);
		siteban->name		= fread_string(fp);
		siteban->banned_by	= fread_string(fp);
		siteban->date		= fread_number(fp);
		LINK(siteban, mud->f_nban, mud->l_nban, next, prev);
	}

	if (fp)
	{
		my_fclose(fp);
	}

	open_reserve();

	pop_call();
	return;
}


void save_nsites( )
{
	BAN_DATA *siteban;
	FILE *fpout;

	push_call("save_sites()");

	close_reserve();

	if ((fpout = my_fopen(NSITEBAN_LIST_TMP, "w", FALSE)) == NULL)
	{
		perror(NSITEBAN_LIST_TMP);
		open_reserve();
		pop_call();
		return;
	}

	for (siteban = mud->f_nban ; siteban ; siteban = siteban->next)
	{
		fprintf(fpout, "B %12s~ %12s~ %ld\n",siteban->name, siteban->banned_by, siteban->date);
	}

	fprintf(fpout,"$\nXXXXXXXXXXXXXXXXX\n#%s\n", NSITEBAN_LIST);

	if (fpout)
	{
		my_fclose(fpout);
	}

	if (is_valid_save(NSITEBAN_LIST_TMP, NSITEBAN_LIST))
	{
		rename(NSITEBAN_LIST_TMP, NSITEBAN_LIST);
	}
	else
	{
		log_printf("Invalid save: %s", NSITEBAN_LIST);
	}

	open_reserve();

	pop_call();
	return;
}


void load_victors( void )
{
	FILE *fp;
	int i;
	char *ptx;

	push_call("load_victors()");

	log_printf( "Loading %s...", VICTORY_LIST );

	close_reserve();

	if ((fp = my_fopen(VICTORY_LIST, "r", FALSE)) == NULL)
	{
		perror(VICTORY_LIST);
		exit(1);
	}

	for (i = 0 ; i < VICTORY_LIST_SIZE ; i++)
	{
		ptx = fread_string( fp );
		if (ptx[0] != 'Z')
		{
			if (ptx[0] != '$')
			{
				log_printf("***WARNING*** load_victors: bad format");
			}
			break;
		}
		victory_list[i] = STRALLOC(ptx);
	}
	if (fp)
	{
		my_fclose(fp);
	}

	open_reserve();

	pop_call();
	return;
}

void save_victors( void )
{
	FILE *fp;
	int i;

	push_call("save_victors()");

	close_reserve();

	if ((fp = my_fopen(VICTORY_LIST_TMP, "w", FALSE)) == NULL)
	{
		perror(VICTORY_LIST_TMP);
		open_reserve();
		pop_call();
		return;
	}

	for (i = 0 ; i < VICTORY_LIST_SIZE ; i++)
	{
		fprintf (fp, "%s~\n", victory_list[i]);
	}
	fprintf(fp, "$~\nXXXXXXXXXX\n#%s\n", VICTORY_LIST);

	if (fp)
	{
		my_fclose( fp );
	}

	if (is_valid_save(VICTORY_LIST_TMP, VICTORY_LIST))
	{
		rename(VICTORY_LIST_TMP, VICTORY_LIST );
	}
	else
	{
		log_printf("Invalid save: %s", VICTORY_LIST);
	}

	open_reserve();

	pop_call();
	return;
}


void load_usage(void)
{
	FILE *fp;
	int day, hour;

	push_call("load_usage()");

	log_printf( "Loading %s...", USAGE_LIST );

	close_reserve();

	if ((fp = my_fopen(USAGE_LIST, "r", FALSE)) == NULL)
	{
		perror(USAGE_LIST);
		exit(1);
	}

	for (hour = 0 ; hour < 24 ; hour++)
	{
		for (day = 0 ; day < 7 ; day++)
		{
			mud->usage->players[hour][day] = fread_number(fp);
		}
	}

	if (fp)
	{
		my_fclose(fp);
	}

	open_reserve();

	pop_call();
	return;
}

void save_usage( void)
{
	FILE *fp;
	int hour;

	push_call("save_usage()");

	close_reserve();

	if ((fp = my_fopen(USAGE_LIST_TMP, "w", FALSE)) == NULL)
	{
		perror(USAGE_LIST_TMP);
		open_reserve();
		pop_call();
		return;
	}

	for (hour = 0 ; hour < 24 ; hour++)
	{
		fprintf(fp, "%3d %3d %3d %3d %3d %3d %3d\n",
			mud->usage->players[hour][0],
			mud->usage->players[hour][1],
			mud->usage->players[hour][2],
			mud->usage->players[hour][3],
			mud->usage->players[hour][4],
			mud->usage->players[hour][5],
			mud->usage->players[hour][6]);
	}
	fprintf( fp, "\nXXXXXXXXXX\n#%s\n", USAGE_LIST );

	if (fp)
	{
		my_fclose( fp );
	}

	if (is_valid_save(USAGE_LIST_TMP, USAGE_LIST))
	{
		rename(USAGE_LIST_TMP, USAGE_LIST);
	}
	else
	{
		log_printf("Invalid save: %s", USAGE_LIST);
	}

	open_reserve();

	pop_call();
	return;
}

void load_timeinfo( void )
{
	FILE *fp;

	push_call("load_timeinfo()");

	log_printf( "Loading %s...", TIMEINFO_LIST );

	close_reserve();

	if ((fp = my_fopen(TIMEINFO_LIST, "r", FALSE)) == NULL)
	{
		perror(TIMEINFO_LIST);
		exit (1);
	}

	mud->time_info->hour  = fread_number(fp);
	mud->time_info->day   = fread_number(fp);
	mud->time_info->month = fread_number(fp);
	mud->time_info->year  = fread_number(fp);

	if (fp)
	{
		my_fclose(fp);
	}

	open_reserve();

	pop_call();
	return;
}


void save_timeinfo( void)
{
	FILE *fp;

	push_call("save_pvnum()");

	close_reserve();

	if ((fp = my_fopen(TIMEINFO_LIST_TMP, "w", FALSE)) == NULL)
	{
		perror(TIMEINFO_LIST_TMP);
		open_reserve();
		pop_call();
		return;
	}

	fprintf( fp, "%u %u %u %u\nXXXXXXXXXX\n#%s\n",
		mud->time_info->hour,
		mud->time_info->day,
		mud->time_info->month,
		mud->time_info->year,
		TIMEINFO_LIST );

	if (fp)
	{
		my_fclose( fp );
	}

	if (is_valid_save(TIMEINFO_LIST_TMP, TIMEINFO_LIST))
	{
		rename(TIMEINFO_LIST_TMP, TIMEINFO_LIST);
	}
	else
	{
		log_printf("Invalid save: %s", TIMEINFO_LIST);
	}

	open_reserve();

	pop_call();
	return;
}


void load_bounties(void)
{
	FILE *fp;
	BOUNTY_DATA *bounty;
	char letter;

	push_call("load_bounties()");

	log_printf("Loading %s...", BOUNTY_LIST);

	close_reserve();

	if ((fp = my_fopen(BOUNTY_LIST, "r", FALSE)) == NULL)
	{
		perror(BOUNTY_LIST);
		exit (1);
	}

	for ( ; ; )
	{
		letter = fread_letter(fp);

		if (letter != 'B')
		{
			if (letter != '$')
			{
				log_printf("***WARNING*** load_bounties: bad format");
			}
			fread_to_eol(fp);
			break;
		}
		ALLOCMEM(bounty, BOUNTY_DATA, 1);
		bounty->name	= fread_string(fp);
		bounty->pvnum	= fread_number(fp);
		bounty->amount	= fread_number(fp);
		bounty->expires	= fread_number(fp);
		bounty->area	= fread_number(fp);
		bounty->crime	= fread_number(fp);
		bounty->punishment	= fread_number(fp);
		bounty->victim	= fread_number(fp);
		bounty->pcvictim	= fread_number(fp);
		sort_bounty( bounty );
	}

	if (fp)
	{
		my_fclose(fp);
	}

	open_reserve();

	pop_call();
	return;
}

void save_bounties(void)
{
	FILE *fp;
	BOUNTY_DATA *bounty;

	push_call("save_bounties()");

	close_reserve();

	if ((fp = my_fopen(BOUNTY_LIST_TMP, "w", FALSE)) == NULL)
	{
		perror(BOUNTY_LIST_TMP);
		open_reserve();
		pop_call();
		return;
	}

	for (bounty = mud->f_bounty ; bounty ; bounty = bounty->next)
	{
		fprintf(fp, "B %12s~ %9d %9d %9d %9d %9d %9d %9d %9d\n",
			bounty->name, bounty->pvnum, bounty->amount, bounty->expires, bounty->area, bounty->crime, bounty->punishment, bounty->victim, bounty->pcvictim);
	}

	fprintf(fp,"$\nXXXXXXXXXXXXXXXXX\n#%s\n", BOUNTY_LIST);

	if (fp)
	{
		my_fclose(fp);
	}

	if (is_valid_save(BOUNTY_LIST_TMP, BOUNTY_LIST))
	{
		rename(BOUNTY_LIST_TMP, BOUNTY_LIST);
	}
	else
	{
		log_printf("Invalid save: %s", BOUNTY_LIST);
	}

	open_reserve();

	pop_call();
	return;
}

void load_notes( void )
{
	FILE *fp;
	NOTE_DATA *pnote = NULL;
	char *word;

	push_call("load_notes(void)");

	close_reserve();

	if ((fp = my_fopen(NOTE_FILE, "r", FALSE)) == NULL)
	{
		perror(NOTE_FILE);
		pop_call();
		return;
	}

	for ( ; ; )
	{
		word	= feof(fp) ? "End" : fread_word( fp );

		if (!strcasecmp(word, "Sender"))
		{
			ALLOCMEM(pnote, NOTE_DATA, 1);

			pnote->sender		= fread_string(fp);	fread_word(fp);
			pnote->date		= fread_string(fp);	fread_word(fp);
			pnote->time		= fread_number(fp); fread_word(fp);
			pnote->to_list		= fread_string(fp);	fread_word(fp);
			pnote->subject 	= fread_string(fp);	fread_word(fp);
			pnote->topic		= fread_number(fp); fread_word(fp);
			pnote->text		= fread_string(fp);	fread_word(fp);
			pnote->room_vnum	= fread_number(fp);	fread_to_eol(fp);

			LINK(pnote, mud->f_note, mud->l_note, next, prev);
		}
		else if (!strcasecmp(word, "End"))
		{
			if (fp)
			{
				my_fclose(fp);
			}
			open_reserve();

			pop_call();
			return;
		}
		else if (strcasecmp(word, ""))
		{
			log_printf("Load notes: no match: %s", word);
			fread_to_eol( fp );
		}
	}
	pop_call();
	return;
}