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