Files
2026-08-08 19:30:03 -07:00

166 lines
6.3 KiB
C++

#pragma once
#include "autocomplete.h"
#include "../callback.h"
#include "../containers/hashindex.h"
#include "../containers/list.h"
#include "../filesystem/file.h"
#include "../text/str.h"
enum cvarFlags_t : int {
CVAR_BOOL = 0x00000001,
CVAR_INTEGER = 0x00000002,
CVAR_FLOAT = 0x00000004,
CVAR_CHEAT = 0x00000008,
CVAR_NOCHEAT = 0x00000010,
CVAR_INIT = 0x00004000,
CVAR_ROM = 0x00008000,
CVAR_ARCHIVE = 0x00010000,
CVAR_MODIFIED = 0x00020000,
CVAR_MODIFIED2 = 0x00040000
};
class idCVar {
public:
using valueCompletion_t = void (*)(idAutoComplete& completion);
struct cvarCallback_t {
idCallback* callback;
cvarCallback_t* next;
};
idCVar(const char* name, const char* value, int flags,
const char* description, valueCompletion_t completion = nullptr);
idCVar(const char* name, const char* value, int flags,
const char* description, float valueMin, float valueMax,
valueCompletion_t completion = nullptr);
idCVar(const char* name, const char* value, int flags,
const char* description, const char** valueStrings,
valueCompletion_t completion = nullptr);
const char* GetName() const { return name; }
const char* GetString() const { return valueString.c_str(); }
bool GetBool() const { return valueInteger != 0; }
int GetInteger() const { return valueInteger; }
float GetFloat() const { return valueFloat; }
const char* GetDescription() const { return description; }
int GetFlags() const { return flags; }
float GetMinValue() const { return valueMin; }
float GetMaxValue() const { return valueMax; }
const char** GetValueStrings() const { return valueStrings; }
valueCompletion_t GetValueCompletion() const { return valueCompletion; }
void Reset();
bool Set(const char* newValue, bool force = false);
void SetString(const char* newValue, bool force = false);
void SetBool(bool newValue, bool force = false);
void SetInteger(int newValue, bool force = false);
void SetFloat(float newValue, bool force = false);
static void RegisterStaticVars();
idStr valueString;
int valueInteger;
float valueFloat;
const char* name;
const char* resetString;
const char* description;
int flags;
float valueMin;
float valueMax;
const char** valueStrings;
valueCompletion_t valueCompletion;
cvarCallback_t* onChange;
idCVar* next;
protected:
void Init(const char* name, const char* value, int flags,
const char* description, float valueMin, float valueMax,
const char** valueStrings, valueCompletion_t completion);
void UpdateValue();
};
class idCVarSystem {
public:
virtual ~idCVarSystem();
virtual int NumCVars() const = 0;
virtual const idCVar* FindByIndex(int index) const = 0;
virtual idCVar* Find(const char* name) const = 0;
virtual bool CvarExists(const char* name,
bool searchForCvarString) const = 0;
virtual void FindCvarsByPrefix(const char* prefix,
idList<idCVar*>& cvars) const = 0;
virtual void SetCVarString(const char* name, const char* value,
int flags = 0) = 0;
virtual void SetCVarBool(const char* name, bool value, int flags = 0) = 0;
virtual void SetCVarInteger(const char* name, int value,
int flags = 0) = 0;
virtual void SetCVarFloat(const char* name, float value,
int flags = 0) = 0;
virtual const char* GetCVarString(const char* name,
const char* defaultValue = "") const = 0;
virtual bool GetCVarBool(const char* name, bool defaultValue = false) const = 0;
virtual int GetCVarInteger(const char* name, int defaultValue = 0) const = 0;
virtual float GetCVarFloat(const char* name,
float defaultValue = 0.0f) const = 0;
virtual bool Command(const idCmdArgs& args) = 0;
virtual void CommandCompletion(idAutoComplete& completion) = 0;
virtual void SetModifiedFlags(int flags) = 0;
virtual int GetModifiedFlags() const = 0;
virtual void ClearModifiedFlags(int flags) = 0;
virtual void ResetFlaggedVariables(int flags) = 0;
virtual void WriteFlaggedVariables(int flags, idFile* file) const = 0;
virtual void ReportModifiedCVars() = 0;
virtual void ClearModifiedCVars() = 0;
};
class idCVarSystemLocal : public idCVarSystem {
public:
idCVarSystemLocal();
~idCVarSystemLocal() override;
int NumCVars() const override { return cvars.Num(); }
const idCVar* FindByIndex(int index) const override { return cvars[index]; }
idCVar* Find(const char* name) const override;
bool CvarExists(const char* name,
bool searchForCvarString) const override;
void FindCvarsByPrefix(const char* prefix,
idList<idCVar*>& found) const override;
void SetCVarString(const char* name, const char* value,
int flags) override;
void SetCVarBool(const char* name, bool value, int flags) override;
void SetCVarInteger(const char* name, int value, int flags) override;
void SetCVarFloat(const char* name, float value, int flags) override;
const char* GetCVarString(const char* name,
const char* defaultValue) const override;
bool GetCVarBool(const char* name, bool defaultValue) const override;
int GetCVarInteger(const char* name, int defaultValue) const override;
float GetCVarFloat(const char* name, float defaultValue) const override;
bool Command(const idCmdArgs& args) override;
void CommandCompletion(idAutoComplete& completion) override;
void SetModifiedFlags(int flags) override;
int GetModifiedFlags() const override { return modifiedFlags; }
void ClearModifiedFlags(int flags) override;
void ResetFlaggedVariables(int flags) override;
void WriteFlaggedVariables(int flags, idFile* file) const override;
void ReportModifiedCVars() override;
void ClearModifiedCVars() override;
static void ListCvars(const idCmdArgs& args);
idList<idCVar*, TAG_CVAR> cvars;
idHashIndex cvarHash;
int modifiedFlags;
};
extern idCVarSystem* cvarSystem;
#if INTPTR_MAX == INT32_MAX
static_assert(sizeof(idCVar::cvarCallback_t) == 8,
"Recovered idCVar callback ABI changed");
static_assert(sizeof(idCVar) == 80, "Recovered idCVar ABI changed");
static_assert(sizeof(idCVarSystem) == 4,
"Recovered idCVarSystem ABI changed");
static_assert(sizeof(idCVarSystemLocal) == 56,
"Recovered idCVarSystemLocal ABI changed");
#endif