SmaugWizard/Backup/
SmaugWizard/Backup/L/
SmaugWizard/Boards/
SmaugWizard/Building/
SmaugWizard/Corpses/
SmaugWizard/Councils/
SmaugWizard/Deity/
SmaugWizard/Gods/
SmaugWizard/MudProgs/
SmaugWizard/Player/L/
SmaugWizard/Src/
SmaugWizard/Src/res/
/****************************************************************************
 * [S]imulated [M]edieval [A]dventure multi[U]ser [G]ame      |				*
 * -----------------------------------------------------------|   \\._.//	*
 * SmaugWizard (C) 1998 by Russ Pillsbury (Windows NT version)|   (0...0)	*
 * -----------------------------------------------------------|    ).:.(	*
 * SMAUG (C) 1994, 1995, 1996 by Derek Snider                 |    {o o}	*
 * -----------------------------------------------------------|   / ' ' \	*
 * SMAUG code team: Thoric, Altrag, Blodkai, Narn, Haus,      |~'~.VxvxV.~'~*
 * Scryn, Swordbearer, Rennard, Tricops, and Gorog.           |				*
 * ------------------------------------------------------------------------ *
 * 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 Staerfeldt, Tom Madsen, and Katja Nyboe.    *
 ****************************************************************************/
// SysData.cpp

#include	"stdafx.h"

#define		SYSDATA_CPP

#include	"smaug.h"
#include	"objects.h"
#include	"rooms.h"
#include	"log.h"
#include	"SmaugFiles.h"
#include	"SysData.h"
#include	"SmaugWizDoc.h"


#if defined (KEY)
	#undef KEY
#endif

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


void CSystemData::Init ()
{
    // default system values
    Clear ();
    ReadAllMailLev = LEVEL_DEMI;
    ReadMailFreeLev = LEVEL_IMMORTAL;
    WriteMailFreeLev = LEVEL_IMMORTAL;
    TakeOthersMailLev = LEVEL_DEMI;
    MuseLevel = LEVEL_DEMI;
    ThinkLevel = LEVEL_HIGOD;
    BuildLevel = LEVEL_DEMI;
    LogLevel = LEVEL_LOG;
    ModifyProtoLevel = LEVEL_LESSER;
    OverridePrivateLev = LEVEL_GREATER;
    MsetPlayerLevel = LEVEL_LESSER;
    StunPlayerLev = 65;
    StunRegularLev = 15;
    PlrPlrDamage = 100;
    PlrMobDamage = 100;
    MobPlrDamage = 100;
    MobMobDamage = 100;
    GetObjNoTakeLevel = LEVEL_GREATER;
	m_RebootHour = 6;					// Six AM
	m_RebootDays = 3;					// 3 days
    SaveFrequency = 20;					// minutes
    m_SaveFlags = SV_DEATH | SV_PASSCHG | SV_AUTO | SV_PUT | SV_DROP
				  | SV_GIVE | SV_AUCTION | SV_ZAPDROP | SV_IDLE;

	m_AuthDelay = 30;					// seconds
	m_Port = 4000;

	m_RoomAuthStart = DEF_ROOM_AUTH_START;
	m_RoomSchool = DEF_ROOM_VNUM_SCHOOL;
	m_RoomHell = DEF_ROOM_VNUM_HELL;
	m_RoomTemple = DEF_ROOM_VNUM_TEMPLE;
	m_RoomAltar = DEF_ROOM_VNUM_ALTAR;
	m_RoomHallOfFallen = DEF_ROOM_VNUM_HALLOFFALLEN;
	m_RoomVoid = DEF_ROOM_VNUM_VOID;
	m_RoomChat = DEF_ROOM_VNUM_CHAT;
	m_RoomLimbo = DEF_ROOM_VNUM_LIMBO;
	m_RoomPoly = DEF_ROOM_VNUM_POLY;

	m_ObjMace = OBJ_VNUM_SCHOOL_MACE;
	m_ObjDagger = OBJ_VNUM_SCHOOL_DAGGER;
	m_ObjSword = OBJ_VNUM_SCHOOL_SWORD;
	m_ObjVest = OBJ_VNUM_SCHOOL_VEST;
	m_ObjShield = OBJ_VNUM_SCHOOL_SHIELD;
	m_ObjBanner = OBJ_VNUM_SCHOOL_BANNER;
	m_ObjGuide = OBJ_VNUM_GUIDE;

	m_LogFlags = -1;			// set them all to be default
	m_MaxStdSize = 1;
}


void CSystemData::Empty ()
{
	delete pTimeOfMax;
	STRFREE (pGuildOverseer);
	STRFREE (pGuildAdvisor);
	delete m_pLongTitle;
	delete m_pShortTitle;
	delete m_pSupreme;
	Clear ();
}


void CSystemData::Read (FILE *fp)
{
	char	*word, *pLine;
	BOOL	fMatch;

	for (;;) {
		fMatch = FALSE;
		if (! feof (fp)) {
			pLine = fread_line (fp);
			word = ParseWord (pLine);
		}
		else word = "End";

		switch (UPPER (word [0])) {
		  case '*':
			fMatch = TRUE;
			break;

		  case 'A':
			KEY ("AuthDelay",	m_AuthDelay,	ParseNumber (pLine));
			if (! str_cmp (word, "AutoReboot")) {
				m_bAutoReboot =
					(ParseString (pLine, fp)[0] == 'Y') ? TRUE : FALSE;
				fMatch = TRUE;
			}
			else if (! str_cmp (word, "AutoStart")) {
				m_bAutoStart =
					(ParseString (pLine, fp)[0] == 'Y') ? TRUE : FALSE;
				fMatch = TRUE;
			}
			break;

		  case 'B':
			KEY ("Build",	BuildLevel,		ParseNumber (pLine));
			break;

		  case 'D':
			KEY ("Damplrvsplr",		PlrPlrDamage,	  ParseNumber (pLine));
			KEY ("Damplrvsmob",		PlrMobDamage,	  ParseNumber (pLine));
			KEY ("Dammobvsplr",		MobPlrDamage,	  ParseNumber (pLine));
			KEY ("Dammobvsmob",		MobMobDamage,	  ParseNumber (pLine));
			break;

		  case 'E':
			if (!str_cmp (word, "End")) {
				if (!pTimeOfMax)
					pTimeOfMax = str_dup ("(not recorded)");
				return;
			}
			break;

		  case 'F':
			KEY ("Forcepc", ForcePcLevel, ParseNumber (pLine));
			break;

		  case 'G':
			KEY ("Guildoverseer",	pGuildOverseer,	ParseString (pLine, fp));
			KEY ("Guildadvisor",	pGuildAdvisor,	ParseString (pLine, fp));
			break;

		  case 'H':
			KEY ("Highplayers",		AlltimeMax,			ParseNumber (pLine));
			KEY ("Highplayertime",	pTimeOfMax,			ParseStringNohash (pLine, fp));
			break;

		  case 'L':
			KEY ("Log",				LogLevel,			ParseNumber (pLine));
			KEY ("LongTitle",		m_pLongTitle,		ParseStringNohash (pLine, fp));
			KEY ("Logging",			m_LogFlags,			ParseNumber (pLine));
			break;

		  case 'M':
			KEY ("Msetplayer",		MsetPlayerLevel,	ParseNumber (pLine));
			KEY ("Muse",			MuseLevel,			ParseNumber (pLine));
			KEY ("MaxStdErrSize",	m_MaxStdSize,		ParseNumber (pLine));
			break;

		  case 'N':
			KEY ("Nameresolving",	bNameResolving,		ParseNumber (pLine));
			break;

		  case 'O':
			KEY ("Overridepriv",	OverridePrivateLev,	ParseNumber (pLine));
            KEY ("OVnumMace",		m_ObjMace,			ParseNumber (pLine));
            KEY ("OVnumDagger",		m_ObjDagger,		ParseNumber (pLine));
            KEY ("OVnumSword",		m_ObjSword,			ParseNumber (pLine));
            KEY ("OVnumVest",		m_ObjVest,			ParseNumber (pLine));
            KEY ("OVnumShield",		m_ObjShield,		ParseNumber (pLine));
            KEY ("OVnumBanner",		m_ObjBanner,		ParseNumber (pLine));
            KEY ("OVnumGuide",		m_ObjGuide,			ParseNumber (pLine));
			break;

		  case 'P':
			KEY ("Protoflag",		ModifyProtoLevel,	ParseNumber (pLine));
			KEY ("Port",			m_Port,				ParseNumber (pLine));
			break;

		  case 'R':
			KEY ("Readallmail",		ReadAllMailLev,		ParseNumber (pLine));
			KEY ("Readmailfree",	ReadMailFreeLev,	ParseNumber (pLine));
			KEY ("RebootDelay",		m_RebootDelay,		ParseNumber (pLine));
			KEY ("RebootTime",		m_RebootHour,		ParseNumber (pLine));
			KEY ("RebootFreq",		m_RebootDays,		ParseNumber (pLine));
			KEY ("RestoreOnLevel",	m_bRestoreOnLevel,	ParseNumber (pLine));
			KEY ("RoomAuthStart",	m_RoomAuthStart,	ParseNumber (pLine));
			KEY ("RoomVnumSchool",	m_RoomSchool,		ParseNumber (pLine));
			KEY ("RoomVnumHell",	m_RoomHell,			ParseNumber (pLine));
			KEY ("RoomVnumTemple",	m_RoomTemple,		ParseNumber (pLine));
			KEY ("RoomVnumAltar",	m_RoomAltar,		ParseNumber (pLine));
			KEY ("RoomVnumFallen",	m_RoomHallOfFallen,	ParseNumber (pLine));
			KEY ("RoomVnumVoid",	m_RoomVoid,			ParseNumber (pLine));
			KEY ("RoomVnumChat",	m_RoomChat,			ParseNumber (pLine));
			KEY ("RoomVnumLimbo",	m_RoomLimbo,		ParseNumber (pLine));
			KEY ("RoomVnumPoly",	m_RoomPoly,			ParseNumber (pLine));
			break;

		  case 'S':
			KEY ("ShowLevel",		m_bShowLevel,		ParseNumber (pLine));
			KEY ("Stunplrvsplr",	StunPlayerLev,		ParseNumber (pLine));
			KEY ("Stunregular",		StunRegularLev,		ParseNumber (pLine));
			KEY ("Saveflags",		m_SaveFlags,		ParseNumber (pLine));
			KEY ("Savefreq",		SaveFrequency,		ParseNumber (pLine));
			KEY ("StartDelay",		m_StartDelay,		ParseNumber (pLine));
			KEY ("ShortTitle",		m_pShortTitle,		ParseStringNohash (pLine, fp));
			KEY ("SupremeEntity",	m_pSupreme,			ParseStringNohash (pLine, fp));
			break;

		  case 'T':
			KEY ("Takeothersmail",	TakeOthersMailLev,	ParseNumber (pLine));
			KEY ("Think",			ThinkLevel,			ParseNumber (pLine));
			break;


		  case 'W':
			KEY ("Waitforauth",		m_Authorization,	ParseNumber (pLine));
			KEY ("Writemailfree",	WriteMailFreeLev,	ParseNumber (pLine));
			break;
		}

		if (! fMatch)
			bug ("CSystemData::Read: no match: %s", word);
	}
}


// Save system info to data file
void CSystemData::Save ()
{
	FILE	*fp;

	if ((fp = fopen (FileTable.GetName (SM_SYS_FILE), "w")) == NULL) {
		bug ("CSystemData::Save: fopen");
		perror (FileTable.GetName (SM_SYS_FILE));
		return;
	}

	fprintf (fp, "#SYSTEM\n");
	fprintf (fp, "Highplayers    %d\n", AlltimeMax);
	fprintf (fp, "Highplayertime %s~\n", pTimeOfMax);
	fprintf (fp, "Nameresolving  %d\n", bNameResolving);
	fprintf (fp, "Waitforauth    %d\n", m_Authorization);
	fprintf (fp, "AuthDelay      %d\n", m_AuthDelay);
	fprintf (fp, "Readallmail    %d\n", ReadAllMailLev);
	fprintf (fp, "Readmailfree   %d\n", ReadMailFreeLev);
	fprintf (fp, "Writemailfree  %d\n", WriteMailFreeLev);
	fprintf (fp, "Takeothersmail %d\n", TakeOthersMailLev);
	fprintf (fp, "Muse           %d\n", MuseLevel);
	fprintf (fp, "Think          %d\n", ThinkLevel);
	fprintf (fp, "Build          %d\n", BuildLevel);
	fprintf (fp, "Log            %d\n", LogLevel);
	fprintf (fp, "Protoflag      %d\n", ModifyProtoLevel);
	fprintf (fp, "Overridepriv   %d\n", OverridePrivateLev);
	fprintf (fp, "Msetplayer     %d\n", MsetPlayerLevel);
	fprintf (fp, "Stunplrvsplr   %d\n", StunPlayerLev);
	fprintf (fp, "Stunregular    %d\n", StunRegularLev);
	fprintf (fp, "Damplrvsplr    %d\n", PlrPlrDamage);
	fprintf (fp, "Damplrvsmob    %d\n", PlrMobDamage);
	fprintf (fp, "Dammobvsplr    %d\n", MobPlrDamage);
	fprintf (fp, "Dammobvsmob    %d\n", MobMobDamage);
	fprintf (fp, "Forcepc        %d\n", ForcePcLevel);
	fprintf (fp, "Guildoverseer  %s~\n", pGuildOverseer);
	fprintf (fp, "Guildadvisor   %s~\n", pGuildAdvisor);
	fprintf (fp, "Saveflags      %d\n", m_SaveFlags);
	fprintf (fp, "Savefreq       %d\n", SaveFrequency);
	fprintf (fp, "Port           %d\n", m_Port);
	fprintf (fp, "AutoReboot     %c~\n", m_bAutoReboot ? 'Y' : 'N');
	fprintf (fp, "RebootDelay    %d\n", m_RebootDelay);
	fprintf (fp, "AutoStart      %c~\n", m_bAutoStart ? 'Y' : 'N');
	fprintf (fp, "StartDelay     %d\n", m_StartDelay);
	fprintf (fp, "LongTitle      %s~\n", m_pLongTitle);
	fprintf (fp, "ShortTitle     %s~\n", m_pShortTitle);
	fprintf (fp, "RebootTime     %u~\n", m_RebootHour);
	fprintf (fp, "RebootFreq     %u~\n", m_RebootDays);
	fprintf (fp, "SupremeEntity  %s~\n", m_pSupreme);
	fprintf (fp, "RoomAuthStart  %d~\n", m_RoomAuthStart);
	fprintf (fp, "RoomVnumSchool %d~\n", m_RoomSchool);
	fprintf (fp, "RoomVnumTemple %d~\n", m_RoomTemple);
	fprintf (fp, "RoomVnumAltar  %d~\n", m_RoomAltar);
	fprintf (fp, "RoomVnumFallen %d~\n", m_RoomHallOfFallen);
	fprintf (fp, "RoomVnumVoid   %d~\n", m_RoomVoid);
	fprintf (fp, "RoomVnumHell   %d~\n", m_RoomHell);
	fprintf (fp, "RoomVnumChat   %d~\n", m_RoomChat);
	fprintf (fp, "RoomVnumLimbo  %d~\n", m_RoomLimbo);
	fprintf (fp, "RoomVnumPoly   %d~\n", m_RoomPoly);
	fprintf (fp, "Logging        %d~\n", m_LogFlags);
	fprintf (fp, "MaxStdErrSize  %d~\n", m_MaxStdSize);

	fprintf (fp, "OVnumMace     %d~\n", m_ObjMace);
	fprintf (fp, "OVnumDagger   %d~\n", m_ObjDagger);
	fprintf (fp, "OVnumSword    %d~\n", m_ObjSword);
	fprintf (fp, "OVnumVest     %d~\n", m_ObjVest);
	fprintf (fp, "OVnumShield   %d~\n", m_ObjShield);
	fprintf (fp, "OVnumBanner   %d~\n", m_ObjBanner);
	fprintf (fp, "OVnumGuide    %d~\n", m_ObjGuide);

	fprintf (fp, "ShowLevel      %d~\n", m_bShowLevel);
	fprintf (fp, "RestoreOnLevel %d~\n", m_bRestoreOnLevel);

	fprintf (fp, "End\n\n");
	fprintf (fp, "#END\n");

	fclose (fp);
}


// Load the sysdata file
BOOL CSystemData::Load ()
{
	FILE	*fp;
	BOOL	bFound = FALSE;
	char	*pLine;

	if (IsLoaded ()) then return TRUE;

	Init ();
	if ((fp = fopen (FileTable.GetName (SM_SYS_FILE), "r"))) {
		bFound = TRUE;
		for (;;) {
			char	letter;
			char	*word;

			pLine = fread_line (fp);
			letter = *pLine++;
			if (letter == '*')
				continue;

			if (letter != '#') {
				bug ("CSystemData::Load: # not found.");
				break;
			}

			word = ParseWord (pLine);
			if (! str_cmp (word, "SYSTEM")) {
				Read (fp);
				break;
			}
			else if (! str_cmp (word, "END"	))
				break;
			else {
				bug ("CSystemData::Load: bad section.");
				break;
			}
		}
		fclose (fp);
	}

	if (! pGuildOverseer) then pGuildOverseer = str_dup ("");
	if (! pGuildAdvisor) then pGuildAdvisor = str_dup ("");
	if (! m_pLongTitle) then m_pLongTitle = str_dup ("");
	if (! m_pShortTitle) then m_pShortTitle = str_dup ("");

	m_bLoaded = TRUE;		// this will be true even if not found.
	return bFound;
}


int CSystemData::GetSaveFlag (const char *name)
{
	for (int x=0; x < DIM (SaveFlagNames); ++x)
		if (!str_cmp (name, SaveFlagNames [x]))
			return x;

	return -1;
}


void CSystemData::UpdateCounters (int count)
{
	if (count > MaxPlayers) then MaxPlayers = count;

	if (count > AlltimeMax) {
		AlltimeMax = count;
		delete pTimeOfMax;
		pTimeOfMax = str_dup (gpDoc->GetCurrentTimeString ());

		CString	Log;
		Log.Format ("Broke all-time maximum player record: %d", AlltimeMax);
		gpDoc->LogString (Log, LOG_COMM, LogLevel);
		to_channel (Log, CHANNEL_MONITOR, "Monitor", LEVEL_IMMORTAL);
		Save ();
	}
}


CString CSystemData::GetShortDesc ()
{
	char	buf [80];

	int		len = strlen (m_pShortTitle);
	char	c = m_pShortTitle [len];
	sprintf (buf, "%s %s", toupper (c) == 'S' ? "these" : "this",
		m_pShortTitle);

	return buf;
}


BOOL CSystemData::IsLoggingToScreen (LogTypes Type)
{
	switch (Type) {
	  case LOG_ALL:
	  case LOG_NORMAL: return TRUE;
	  case LOG_BOOT: return IsLogBootToScreen ();
	  case LOG_RESET: return IsLogResetsToScreen ();
	  case LOG_BUILD: return IsLogBuildToScreen ();
	  case LOG_BUG: return IsLogBugsToScreen ();
	  case LOG_PLAYER: return IsLogPlayersToScreen ();
	  case LOG_COMM: return IsLogCommToScreen ();
	}
	return FALSE;
}


void CSystemData::AddSentBytes (ULONG b)
{
	CTime	t = CTime::GetCurrentTime ();

	if (t.GetDay () != m_ByteTime.GetDay ()) {
		m_SDayKbytes = 0;
		m_SHourBytes = 0;
	}
	if (t.GetHour () != m_ByteTime.GetHour ()) {
		LogBytes ();
		m_SDayKbytes += m_SHourBytes / 1024;
		m_SHourBytes = 0;
	}

	m_SHourBytes += b;
	m_ByteTime = t;
}


void CSystemData::LogBytes ()
{
	gpDoc->LogStringf (LOG_NORMAL, 61,
		"%s - %lu Bytes in current hour, %lu KBytes today.\n",
		NCCP m_ByteTime.FormatGmt ("%a %b %d %Y  %H:%M:%S"), m_SHourBytes,
		m_SDayKbytes);
}