feat(console): add functions to reset and default cvars

This commit is contained in:
superp00t 2023-08-24 22:24:47 -04:00
parent 851c1aea5b
commit 17fc9017e0
2 changed files with 100 additions and 3 deletions

View File

@ -2,11 +2,12 @@
#include "console/Command.hpp"
#include "console/Types.hpp"
#include "console/Line.hpp"
#include "util/SFile.hpp"
#include <bc/os/File.hpp>
#include <storm/String.hpp>
const char* s_filename = nullptr;
bool CVar::m_needsSave;
TSHashTable<CVar, HASHKEY_STRI> CVar::s_registeredCVars;
@ -152,6 +153,25 @@ bool CVar::Set(const char* value, bool setValue, bool setReset, bool setDefault,
return true;
}
bool CVar::Reset() {
auto value = this->m_resetValue;
if (value.GetString() == nullptr) {
value = this->m_defaultValue;
}
this->InternalSet(value.GetString(), true, false, false, true);
}
bool CVar::Default() {
auto value = this->m_defaultValue;
if (value.GetString() == nullptr) {
value = this->m_resetValue;
}
this->InternalSet(value.GetString(), true, false, false, true);
return true;
}
int32_t CVar::Update() {
if (!(this->m_flags & 0x2)) {
return 0;
@ -194,7 +214,7 @@ int32_t CVar::Load(HOSFILE file) {
result = 0;
} else {
data[size] = '\0';
auto curr = data;
const char* curr = data;
// Skip over UTF-8 byte order mark
if ((((data != nullptr) && (2 < bytesRead)) && (data[0] == 0xef)) && ((data[1] == 0xbb && (data[2] == 0xbf)))) {
@ -211,7 +231,7 @@ int32_t CVar::Load(HOSFILE file) {
}
result = 1;
} while ((curr != nullptr) && (*curr != '\0'))
} while ((curr != nullptr) && (*curr != '\0'));
}
if (grown) {
@ -264,6 +284,62 @@ void CVar::Initialize(const char* filename) {
CVar::Load(s_filename);
}
int32_t CvarResetCommandHandler(const char* command, const char* arguments) {
char cvarName[256] = {0};
auto string = arguments;
SStrTokenize(&string, cvarName, sizeof(cvarName), " ,;\t\"\r\n", nullptr);
if (*cvarName) {
// reset a specific cvar
auto cvar = CVar::Lookup(cvarName);
if (cvar) {
cvar->Reset();
} else {
ConsoleWriteA("No such cvar \"%s\"\n", ERROR_COLOR, cvarName);
}
return 1;
} else {
// reset all cvars
ConsoleWrite("Resetting all cvars\n", DEFAULT_COLOR);
for (auto cvar = s_registeredCVars.Head(); cvar != nullptr; cvar = s_registeredCVars.Next(i)) {
cvar->Reset();
}
return 1;
}
}
int32_t CvarDefaultCommandHandler(const char* command, const char* arguments) {
char cvarName[256] = {0};
auto string = arguments;
SStrTokenize(&string, cvarName, sizeof(cvarName), " ,;\t\"\r\n", nullptr);
if (*cvarName) {
// restore a specific cvar
auto cvar = CVar::Lookup(cvarName);
if (cvar) {
cvar->Default();
} else {
ConsoleWriteA("No such cvar \"%s\"\n", ERROR_COLOR, cvarName);
}
return 1;
} else {
// restore all cvars
ConsoleWrite("Restoring all cvars\n", DEFAULT_COLOR);
for (auto cvar = s_registeredCVars.Head(); cvar != nullptr; cvar = s_registeredCVars.Next(i)) {
cvar->Default();
}
return 1;
}
}
int32_t CvarCommandHandler(const char* command, const char* arguments) {
auto cvar = CVar::Lookup(command);
STORM_ASSERT(cvar);
@ -283,6 +359,25 @@ int32_t CvarCommandHandler(const char* command, const char* arguments) {
return 1;
}
int32_t SetCommandHandler(const char* command, const char* arguments) {
char cvarValue[2048] = {0};
char cvarName[256] = {0};
auto str = arguments;
SStrTokenize(&str, cvarName, sizeof(cvarName), " ,;\t\"\r\n", nullptr);
SStrTokenize(&str, cvarValue, sizeof(cvarValue), " ,;\t\"\r\n", nullptr);
auto var = CVar::Lookup(cvarName);
if (var) {
var->Set(cvarValue, true, false, false);
} else {
CVar::Register(cvarName, "", 0, cvarValue, nullptr, )
}
return 1;
}
int32_t CvarListCommandHandler(const char* command, const char* arguments) {
char text[256];
char text2[256];

View File

@ -39,6 +39,8 @@ class CVar : public TSHashObject<CVar, HASHKEY_STRI> {
int32_t Load(HOSFILE fileHandle);
void InternalSet(const char*, bool, bool, bool, bool);
bool Set(const char*, bool, bool, bool, bool);
bool Reset();
bool Default();
int32_t Update();
};