void CVar::SetCVar(tstring sName, int iValue) { CVar* pVar = FindCVar(sName); if (!pVar) return; pVar->SetValue(iValue); }
tstring CVar::GetCVarValue(tstring sName) { CVar* pVar = FindCVar(sName); if (!pVar) return ""; return pVar->GetValue(); }
void CVar::SetCVar(tstring sName, float flValue) { CVar* pVar = FindCVar(sName); if (!pVar) return; pVar->SetValue(flValue); }
bool CVar::GetCVarBool(tstring sName) { CVar* pVar = FindCVar(sName); if (!pVar) return false; return pVar->GetBool(); }
int CVar::GetCVarInt(tstring sName) { CVar* pVar = FindCVar(sName); if (!pVar) return 0; return pVar->GetInt(); }
float CVar::GetCVarFloat(tstring sName) { CVar* pVar = FindCVar(sName); if (!pVar) return 0; return pVar->GetFloat(); }
cvar_t *cvar_t::cvar_forceset (const char *var_name, const char *val) { cvar_t *var, *dummy; if ( (var = FindCVar (var_name, &dummy)) ) var->ForceSet (val); return var; }
// // cvar_t::Transfer // // Copies the value from one cvar to another and then removes the source cvar // void cvar_t::Transfer(const char *fromname, const char *toname) { cvar_t *from, *to, *dummy; from = FindCVar(fromname, &dummy); to = FindCVar(toname, &dummy); if (from && to) { to->ForceSet(from->m_Value); to->ForceSet(from->m_String.c_str()); // remove the old cvar cvar_t *cur = ad.GetCVars(); while (cur->m_Next != from) cur = cur->m_Next; cur->m_Next = from->m_Next; } }
void cvar_t::InitSelf(const char* var_name, const char* def, const char* help, cvartype_t type, DWORD var_flags, void (*callback)(cvar_t &), float minval, float maxval) { cvar_t* dummy; cvar_t* var = FindCVar(var_name, &dummy); m_Callback = callback; m_String = ""; m_Value = 0.0f; m_Flags = 0; m_LatchedString = ""; m_HelpText = help; m_Type = type; if (var_flags & CVAR_NOENABLEDISABLE) { m_MinValue = minval; m_MaxValue = maxval; } else { m_MinValue = 0.0f; m_MaxValue = 1.0f; } if (def) m_Default = def; else m_Default = ""; if (var_name) { C_AddTabCommand(var_name); m_Name = var_name; m_Next = ad.GetCVars(); ad.GetCVars() = this; } else m_Name = ""; if (var) { ForceSet(var->m_String.c_str()); if (var->m_Flags & CVAR_AUTO) delete var; else var->~cvar_t(); } else if (def) ForceSet(def); m_Flags = var_flags | CVAR_ISDEFAULT; }
FBaseCVar *cvar_forceset (const char *var_name, const char *val) { FBaseCVar *var; UCVarValue vval; if ( (var = FindCVar (var_name, NULL)) ) { vval.String = const_cast<char *>(val); var->ForceSet (vval, CVAR_String); } return var; }
FBaseCVar *cvar_set (const char *var_name, const char *val) { FBaseCVar *var; if ( (var = FindCVar (var_name, NULL)) ) { UCVarValue value; value.String = const_cast<char *>(val); var->SetGenericRep (value, CVAR_String); } return var; }
FBaseCVar *C_CreateCVar(const char *var_name, ECVarType var_type, DWORD flags) { assert(FindCVar(var_name, NULL) == NULL); flags |= CVAR_AUTO; switch (var_type) { case CVAR_Bool: return new FBoolCVar(var_name, 0, flags); case CVAR_Int: return new FIntCVar(var_name, 0, flags); case CVAR_Float: return new FFloatCVar(var_name, 0, flags); case CVAR_String: return new FStringCVar(var_name, NULL, flags); case CVAR_Color: return new FColorCVar(var_name, 0, flags); default: return NULL; } }
void FGameConfigFile::AddAutoexec (DArgs *list, const char *game) { char section[64]; const char *key; const char *value; mysnprintf (section, countof(section), "%s.AutoExec", game); if (bMigrating) { FBaseCVar *autoexec = FindCVar ("autoexec", NULL); if (autoexec != NULL) { UCVarValue val; char *path; val = autoexec->GetGenericRep (CVAR_String); path = copystring (val.String); delete autoexec; SetSection (section, true); SetValueForKey ("Path", path); list->AppendArg (path); delete[] path; } } else { // If <game>.AutoExec section does not exist, create it // with a default autoexec.cfg file present. CreateStandardAutoExec(section, false); // Run any files listed in the <game>.AutoExec section if (!SectionIsEmpty()) { while (NextInSection (key, value)) { if (stricmp (key, "Path") == 0 && *value != '\0') { FString expanded_path = ExpandEnvVars(value); if (FileExists(expanded_path)) { list->AppendArg (ExpandEnvVars(value)); } } } } } }
cvar_t::~cvar_t () { if (m_Name.length()) { cvar_t *var, *dummy = NULL; var = FindCVar (m_Name.c_str(), &dummy); if (var == this) { if (dummy) dummy->m_Next = m_Next; else ad.GetCVars() = m_Next; } } }
void FGameConfigFile::ReadCVars (DWORD flags) { const char *key, *value; FBaseCVar *cvar; UCVarValue val; while (NextInSection (key, value)) { cvar = FindCVar (key, NULL); if (cvar == NULL) { cvar = new FStringCVar (key, NULL, CVAR_AUTO|CVAR_UNSETTABLE|CVAR_ARCHIVE|flags); } val.String = const_cast<char *>(value); cvar->SetGenericRep (val, CVAR_String); } }
FBaseCVar::~FBaseCVar () { if (Name) { FBaseCVar *var, *prev; var = FindCVar (Name, &prev); if (var == this) { if (prev) prev->m_Next = m_Next; else CVars = m_Next; } C_RemoveTabCommand(Name); delete[] Name; } }
void cvar_t::InitSelf (const char *var_name, const char *def, DWORD var_flags, void (*callback)(cvar_t &)) { cvar_t *var, *dummy; var = FindCVar (var_name, &dummy); m_Callback = callback; m_String = ""; m_Value = 0.0f; m_Flags = 0; m_LatchedString = ""; if (def) m_Default = def; else m_Default = ""; if (var_name) { C_AddTabCommand (var_name); m_Name = var_name; m_Next = ad.GetCVars(); ad.GetCVars() = this; } else m_Name = ""; if (var) { ForceSet (var->m_String.c_str()); if (var->m_Flags & CVAR_AUTO) delete var; else var->~cvar_t(); } else if (def) ForceSet (def); m_Flags = var_flags | CVAR_ISDEFAULT; }
FBaseCVar *GetCVar(AActor *activator, const char *cvarname) { FBaseCVar *cvar = FindCVar(cvarname, nullptr); // Either the cvar doesn't exist, or it's for a mod that isn't loaded, so return nullptr. if (cvar == nullptr || (cvar->GetFlags() & CVAR_IGNORE)) { return nullptr; } else { // For userinfo cvars, redirect to GetUserCVar if (cvar->GetFlags() & CVAR_USERINFO) { if (activator == nullptr || activator->player == nullptr) { return nullptr; } return GetUserCVar(int(activator->player - players), cvarname); } return cvar; } }
FBaseCVar::FBaseCVar (const char *var_name, DWORD flags, void (*callback)(FBaseCVar &)) { FBaseCVar *var; var = FindCVar (var_name, NULL); m_Callback = callback; Flags = 0; Name = NULL; if (var_name) { C_AddTabCommand (var_name); Name = copystring (var_name); m_Next = CVars; CVars = this; } if (var) { ECVarType type; UCVarValue value; value = var->GetFavoriteRep (&type); ForceSet (value, type); if (var->Flags & CVAR_AUTO) delete var; else var->~FBaseCVar(); Flags = flags; } else { Flags = flags | CVAR_ISDEFAULT; } }
void FGameConfigFile::DoGlobalSetup () { if (SetSection ("GlobalSettings.Unknown")) { ReadCVars (CVAR_GLOBALCONFIG); } if (SetSection ("GlobalSettings")) { ReadCVars (CVAR_GLOBALCONFIG); } if (SetSection ("LastRun")) { const char *lastver = GetValueForKey ("Version"); if (lastver != NULL) { double last = atof (lastver); if (last < 123.1) { FBaseCVar *noblitter = FindCVar ("vid_noblitter", NULL); if (noblitter != NULL) { noblitter->ResetToDefault (); } } if (last < 202) { // Make sure the Hexen hotkeys are accessible by default. if (SetSection ("Hexen.Bindings")) { SetValueForKey ("\\", "use ArtiHealth"); SetValueForKey ("scroll", "+showscores"); SetValueForKey ("0", "useflechette"); SetValueForKey ("9", "use ArtiBlastRadius"); SetValueForKey ("8", "use ArtiTeleport"); SetValueForKey ("7", "use ArtiTeleportOther"); SetValueForKey ("6", "use ArtiPork"); SetValueForKey ("5", "use ArtiInvulnerability2"); } } if (last < 204) { // The old default for vsync was true, but with an unlimited framerate // now, false is a better default. FBaseCVar *vsync = FindCVar ("vid_vsync", NULL); if (vsync != NULL) { vsync->ResetToDefault (); } } if (last < 206) { // spc_amp is now a float, not an int. if (spc_amp > 16) { spc_amp = spc_amp / 16.f; } } if (last < 207) { // Now that snd_midiprecache works again, you probably don't want it on. FBaseCVar *precache = FindCVar ("snd_midiprecache", NULL); if (precache != NULL) { precache->ResetToDefault(); } } if (last < 208) { // Weapon sections are no longer used, so tidy up the config by deleting them. const char *name; size_t namelen; bool more; more = SetFirstSection(); while (more) { name = GetCurrentSection(); if (name != NULL && (namelen = strlen(name)) > 12 && strcmp(name + namelen - 12, ".WeaponSlots") == 0) { more = DeleteCurrentSection(); } else { more = SetNextSection(); } } } if (last < 209) { // menu dimming is now a gameinfo option so switch user override off FBaseCVar *dim = FindCVar ("dimamount", NULL); if (dim != NULL) { dim->ResetToDefault (); } } if (last < 210) { if (SetSection ("Hexen.Bindings")) { // These 2 were misnamed in earlier versions SetValueForKey ("6", "use ArtiPork"); SetValueForKey ("5", "use ArtiInvulnerability2"); } } if (last < 213) { auto var = FindCVar("snd_channels", NULL); if (var != NULL) { // old settings were default 32, minimum 8, new settings are default 128, minimum 64. UCVarValue v = var->GetGenericRep(CVAR_Int); if (v.Int < 64) var->ResetToDefault(); } } if (last < 214) { FBaseCVar *var = FindCVar("hud_scale", NULL); if (var != NULL) var->ResetToDefault(); var = FindCVar("st_scale", NULL); if (var != NULL) var->ResetToDefault(); var = FindCVar("hud_althudscale", NULL); if (var != NULL) var->ResetToDefault(); var = FindCVar("con_scale", NULL); if (var != NULL) var->ResetToDefault(); var = FindCVar("con_scaletext", NULL); if (var != NULL) var->ResetToDefault(); var = FindCVar("uiscale", NULL); if (var != NULL) var->ResetToDefault(); } if (last < 215) { // Previously a true/false boolean. Now an on/off/auto tri-state with auto as the default. FBaseCVar *var = FindCVar("snd_hrtf", NULL); if (var != NULL) var->ResetToDefault(); } if (last < 216) { FBaseCVar *var = FindCVar("gl_texture_hqresize", NULL); if (var != NULL) { auto v = var->GetGenericRep(CVAR_Int); switch (v.Int) { case 1: gl_texture_hqresizemode = 1; gl_texture_hqresizemult = 2; break; case 2: gl_texture_hqresizemode = 1; gl_texture_hqresizemult = 3; break; case 3: gl_texture_hqresizemode = 1; gl_texture_hqresizemult = 4; break; case 4: gl_texture_hqresizemode = 2; gl_texture_hqresizemult = 2; break; case 5: gl_texture_hqresizemode = 2; gl_texture_hqresizemult = 3; break; case 6: gl_texture_hqresizemode = 2; gl_texture_hqresizemult = 4; break; case 7: gl_texture_hqresizemode = 3; gl_texture_hqresizemult = 2; break; case 8: gl_texture_hqresizemode = 3; gl_texture_hqresizemult = 3; break; case 9: gl_texture_hqresizemode = 3; gl_texture_hqresizemult = 4; break; case 10: gl_texture_hqresizemode = 4; gl_texture_hqresizemult = 2; break; case 11: gl_texture_hqresizemode = 4; gl_texture_hqresizemult = 3; break; case 12: gl_texture_hqresizemode = 4; gl_texture_hqresizemult = 4; break; case 18: gl_texture_hqresizemode = 4; gl_texture_hqresizemult = 5; break; case 19: gl_texture_hqresizemode = 4; gl_texture_hqresizemult = 6; break; case 13: gl_texture_hqresizemode = 5; gl_texture_hqresizemult = 2; break; case 14: gl_texture_hqresizemode = 5; gl_texture_hqresizemult = 3; break; case 15: gl_texture_hqresizemode = 5; gl_texture_hqresizemult = 4; break; case 16: gl_texture_hqresizemode = 5; gl_texture_hqresizemult = 5; break; case 17: gl_texture_hqresizemode = 5; gl_texture_hqresizemult = 6; break; case 20: gl_texture_hqresizemode = 6; gl_texture_hqresizemult = 2; break; case 21: gl_texture_hqresizemode = 6; gl_texture_hqresizemult = 3; break; case 22: gl_texture_hqresizemode = 6; gl_texture_hqresizemult = 4; break; case 23: gl_texture_hqresizemode = 6; gl_texture_hqresizemult = 5; break; case 24: gl_texture_hqresizemode = 6; gl_texture_hqresizemult = 6; break; case 0: default: gl_texture_hqresizemode = 0; gl_texture_hqresizemult = 1; break; } } } if (last < 217) { auto var = FindCVar("vid_scalemode", NULL); UCVarValue newvalue; newvalue.Int = 2; if (var != NULL) { UCVarValue v = var->GetGenericRep(CVAR_Int); if (v.Int == 3) var->SetGenericRep(newvalue, CVAR_Int); } } } } }
void FGameConfigFile::DoGlobalSetup () { if (SetSection ("GlobalSettings.Unknown")) { ReadCVars (CVAR_GLOBALCONFIG); } if (SetSection ("GlobalSettings")) { ReadCVars (CVAR_GLOBALCONFIG); } if (SetSection ("LastRun")) { const char *lastver = GetValueForKey ("Version"); if (lastver != NULL) { double last = atof (lastver); if (last < 123.1) { FBaseCVar *noblitter = FindCVar ("vid_noblitter", NULL); if (noblitter != NULL) { noblitter->ResetToDefault (); } } if (last < 202) { // Make sure the Hexen hotkeys are accessible by default. if (SetSection ("Hexen.Bindings")) { SetValueForKey ("\\", "use ArtiHealth"); SetValueForKey ("scroll", "+showscores"); SetValueForKey ("0", "useflechette"); SetValueForKey ("9", "use ArtiBlastRadius"); SetValueForKey ("8", "use ArtiTeleport"); SetValueForKey ("7", "use ArtiTeleportOther"); SetValueForKey ("6", "use ArtiEgg"); SetValueForKey ("5", "use ArtiInvulnerability"); } } if (last < 204) { // The old default for vsync was true, but with an unlimited framerate // now, false is a better default. FBaseCVar *vsync = FindCVar ("vid_vsync", NULL); if (vsync != NULL) { vsync->ResetToDefault (); } } if (last < 206) { // spc_amp is now a float, not an int. if (spc_amp > 16) { spc_amp = spc_amp / 16.f; } } if (last < 207) { // Now that snd_midiprecache works again, you probably don't want it on. FBaseCVar *precache = FindCVar ("snd_midiprecache", NULL); if (precache != NULL) { precache->ResetToDefault(); } } if (last < 208) { // Weapon sections are no longer used, so tidy up the config by deleting them. const char *name; size_t namelen; bool more; more = SetFirstSection(); while (more) { name = GetCurrentSection(); if (name != NULL && (namelen = strlen(name)) > 12 && strcmp(name + namelen - 12, ".WeaponSlots") == 0) { more = DeleteCurrentSection(); } else { more = SetNextSection(); } } } if (last < 209) { // menu dimming is now a gameinfo option so switch user override off FBaseCVar *dim = FindCVar ("dimamount", NULL); if (dim != NULL) { dim->ResetToDefault (); } } } } }
const Command* j1Console::CreateCommand(const char* name, j1Module* listener, uchar min_args, uchar max_args) { const Command* ret = nullptr; if(name != nullptr && strlen(name) < COMMAND_NAME_SIZE && FindCommand(name) == NULL && FindCVar(name) == nullptr) { Command com; strcpy_tolower(com.name, name); com.listener = listener; com.min_arguments = min_args; com.max_arguments = max_args; commands.PushBack(com); ret = &commands[commands.Count() - 1]; } return ret; }
const CVar* j1Console::CreateCVar(const char* name, const char* string, j1Module* listener, bool read_only, bool serialize) { CVar* ret = nullptr; if(name != nullptr && strlen(name) < COMMAND_NAME_SIZE && FindCommand(name) == nullptr && FindCVar(name) == nullptr) { CVar var; strcpy_tolower(var.name, name); var.listener = listener; var.read_only = read_only; var.serialize = serialize; var.type = CVar::is_string; cvars.PushBack(var); ret = &cvars[cvars.Count() - 1]; int len = strlen(string); ret->value.s = new char[len+1]; strcpy_s(ret->value.s, len + 1, string); } return ret; }
const CVar* j1Console::CreateCVar(const char* name, bool value, j1Module* listener, bool read_only, bool serialize) { CVar* ret = nullptr; if(name != nullptr && strlen(name) < COMMAND_NAME_SIZE && FindCommand(name) == nullptr && FindCVar(name) == nullptr) { CVar var; strcpy_tolower(var.name, name); var.listener = listener; var.read_only = read_only; var.serialize = serialize; var.value.b = value; var.type = CVar::is_bool; cvars.PushBack(var); ret = &cvars[cvars.Count() - 1]; } return ret; }
bool j1Console::ProcessString(const char* input) { bool ret = false; last_message.Clear(); if(input != nullptr && strlen(input) > 0 && strlen(input) < MAX_INPUT_LINE_SIZE) { char line[MAX_INPUT_LINE_SIZE]; strcpy_s(line, MAX_INPUT_LINE_SIZE, input); char* context = nullptr; char* token = strtok_s(line, " ", &context); arguments.Clear(); do { arguments.PushBack(p2SString(token)); } while(token = strtok_s(NULL, " ", &context)); uint nargs = arguments.Count() - 1; const Command* com = FindCommand(arguments[0].GetString()); if(com != nullptr && com->listener != nullptr) { if(nargs >= com->min_arguments && nargs <= com->max_arguments) { // If we reach this point we are ready to call a listener if(ret = com->listener->OnCommand(com, arguments, last_message)) last_error.create("No error"); else { last_error = last_message; last_message.Clear(); } } else last_error.create("Command arguments mismatch"); } else { const CVar* var = FindCVar(arguments[0].GetString()); if(var == nullptr) last_error.create("Command / CVar not found"); else { switch(nargs) { case 1: { if(((CVar*)var)->SetFromString(arguments[1].GetString()) == true) { if(var->listener != nullptr) var->listener->OnCVar(var); } } case 0: { char output[COMMAND_NAME_SIZE + 25]; sprintf_s(output, COMMAND_NAME_SIZE + 25, "%s: %s", var->name, var->Printable()); last_message += output; ret = true; } break; default: last_error.create("Command arguments mismatch"); break; } } } } else last_error.create("Invalid input line"); if(ret == true) Print(last_message.GetString()); else PrintError(last_error.GetString()); return ret; }
static const char *SetServerVar (char *name, ECVarType type, BYTE **stream, bool singlebit) { FBaseCVar *var = FindCVar (name, NULL); UCVarValue value; if (singlebit) { if (var != NULL) { int bitdata; int mask; value = var->GetFavoriteRep (&type); if (type != CVAR_Int) { return NULL; } bitdata = ReadByte (stream); mask = 1 << (bitdata & 31); if (bitdata & 32) { value.Int |= mask; } else { value.Int &= ~mask; } } } else { switch (type) { case CVAR_Bool: value.Bool = ReadByte (stream) ? 1 : 0; break; case CVAR_Int: value.Int = ReadLong (stream); break; case CVAR_Float: value.Float = ReadFloat (stream); break; case CVAR_String: value.String = ReadString (stream); break; default: break; // Silence GCC } } if (var) { var->ForceSet (value, type); } if (type == CVAR_String) { delete[] value.String; } if (var == &teamplay) { // Put players on teams if teamplay turned on for (int i = 0; i < MAXPLAYERS; ++i) { if (playeringame[i]) { UpdateTeam (i, players[i].userinfo.GetTeam(), true); } } } if (var) { value = var->GetGenericRep (CVAR_String); return value.String; } return NULL; }