/
rogue24b3/
rogue24b3/data/
/***************************************************************************\
[*]    ___    ____   ____   __   __  ____ [*]   ROGUE: ROM With Attitude  [*]
[*]   /#/ )  /#/  ) /#/  ) /#/  /#/ /#/   [*]    All rights reserved      [*]
[*]  /#/ <  /#/  / /#/ _  /#/  /#/ /#/--  [*]   Copyright(C) 2000-2001    [*]
[*] /#/   \(#(__/ (#(__/ (#(__/#/ (#(___  [*] Kenneth Conley (Mendanbar)  [*]
[*]  Expression of Digital Creativity..   [*]  scmud@mad.scientist.com    [*]
[-]---------------------------------------+-+-----------------------------[-]
[*] File: system.cpp                                                      [*]
[*] Usage: Storing Valuable Information and Stats                         [*]
\***************************************************************************/

#include "merc.h"
#include "recycle.h"
#include "staffcmds.h"

struct  SystemData {
	UInt32	all_time_max;
	char *	time_of_max;
	UInt32	player_database;
};

SystemData	SData;

void save_sys_data(void);
void load_sys_data(void);

#if defined(KEY)
#undef KEY
#endif

#define SYS_FILE	"../data/system.txt"

#define KEY(literal, field, value)	\
	if (!str_cmp(word, literal))	\
	{				\
		field  = value;		\
		fMatch = TRUE;		\
		break;			\
	}

void save_sys_data( void ) {
    FILE *fp;

    fclose(fpReserve);
    if (!(fp = fopen(SYS_FILE, "w"))) {
	mudlogf(BRF, LVL_STAFF, TRUE, "SYSERR: Unable to open %s file.", SYS_FILE);
	return;
    }

    fprintf(fp, "#SYSTEM\n");

    fprintf(fp, "MaxHigh %d\n", SData.all_time_max);
    fprintf(fp, "HighTime %s~\n", SData.time_of_max);

    fprintf(fp, "End\n");
    fclose(fp);
    fpReserve = fopen(NULL_FILE, "r");
}

void load_sys_data( void ) {
    FILE *fp;
    char *word;
    bool fMatch = FALSE, drop_out = FALSE;

    if (!(fp = fopen(SYS_FILE, "r"))) {
	mudlogf(BRF, LVL_STAFF, TRUE, "SYSERR: Unable to open %s for reading." SYS_FILE);
	return;
    }

    fread_to_eol(fp);
    while (!drop_out) {
	word = feof(fp) ? str_dup("End") : fread_word(fp);
	fMatch = FALSE;

	switch (UPPER(word[0])) {
	    default:
	    case '*':
		fMatch = TRUE;
		fread_to_eol(fp);
		break;
	    case 'H':
		KEY("HighTime", SData.time_of_max, fread_string(fp));
		break;
	    case 'M':
		KEY("MaxHigh", SData.all_time_max, fread_number(fp));
		break;
	    case 'E':
		if (!str_cmp(word, "End"))
			drop_out = TRUE;
		break;
	}
	if (!fMatch)	fread_to_eol(fp);
    }
    fclose(fp);
}

void sys_update( void ) {
    CHAR_DATA	*vch;
    DESCRIPTOR_DATA *d;
    UInt32	temp = 0;
    time_t	ct = time(0);
    char	buf[MAX_INPUT_LENGTH];
    char	*time_s = asctime(localtime(&ct));

    *(time_s + strlen(time_s) - 1) = '\0';

    for (d = descriptor_list; d != NULL; d = d->next) {
	if (STATE(d) == CON_PLAYING)	temp++;
    }

    if (temp > SData.all_time_max) {
	SData.all_time_max	= temp;
	sprintf(buf, "%-19.19s", time_s);
	SData.time_of_max	= str_dup(buf);
	save_sys_data();
	mudlogf(NRM, LVL_STAFF, TRUE,
	"BOOTHIGH: New record high of %d players.", SData.all_time_max);
    }
    if (SData.all_time_max >= 50)
	info(NULL, 0, "`y[`bINFO`y]`w Rogue has reached a record high %d players!`n\n\r", SData.all_time_max);
}

int get_record_high( void ) {
    return SData.all_time_max;
}

char *get_record_string( void ) {
    if (SData.time_of_max[0])
	return SData.time_of_max;
    else
	return "(not recorded)";
}

void set_player_database(int num) {
    SData.player_database = num;
}

int get_player_database( void ) {
    return SData.player_database;
}