/****************************************************************************
* [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);
}