serialize cvars

This commit is contained in:
Ricardo Luís Vaz Silva 2023-11-25 22:27:28 -03:00 committed by Rachael Alexanderson
commit aed85a25a2
9 changed files with 115 additions and 5 deletions

View file

@ -646,6 +646,15 @@ static int propcmp(const void * a, const void * b)
//==========================================================================
void InitImports();
struct UserInfoCVarNamePlayer
{
FBaseCVar** addr;
FString name;
int pnum;
};
TArray<UserInfoCVarNamePlayer> LoadGameUserInfoCVars;
void InitThingdef()
{
// Some native types need size and serialization information added before the scripts get compiled.
@ -803,6 +812,79 @@ void InitThingdef()
auto fspp = NewStruct("FSpawnParticleParams", nullptr);
fspp->Size = sizeof(FSpawnParticleParams);
fspp->Align = alignof(FSpawnParticleParams);
auto cvst = NewStruct("CVar", nullptr, true);
NewPointer(cvst, false)->InstallHandlers(
[](FSerializer &arc, const char *key, const void *addr)
{
const FBaseCVar * self = *(const FBaseCVar**)addr;
if(self)
{
arc.BeginObject(key);
if(self->pnum != -1)
{
int32_t pnum = self->pnum;
FName name = self->userinfoName;
arc("name", name);
arc("player", pnum);
}
else
{
FString name = self->GetName();
arc("name", name);
}
arc.EndObject();
}
},
[](FSerializer &arc, const char *key, void *addr)
{
FBaseCVar ** self = (FBaseCVar**)addr;
FString name;
arc.BeginObject(key);
arc("name", name);
FBaseCVar * backing = FindCVar(name.GetChars(), nullptr);
if(!backing)
{
I_Error("Attempt to load pointer to inexisted CVar '%s'", name.GetChars());
}
else if((backing->GetFlags() & (CVAR_USERINFO|CVAR_IGNORE)) == CVAR_USERINFO)
{
if(int pnum; arc.ReadOptionalInt("player", pnum))
{
*self = nullptr;
LoadGameUserInfoCVars.Push({self, name, pnum}); // this needs to be done later, since userinfo isn't loaded yet
arc.EndObject();
return true;
}
}
*self = backing;
arc.EndObject();
return true;
}
);
}
void SetupLoadingCVars()
{
LoadGameUserInfoCVars.Clear();
}
void FinishLoadingCVars()
{
for(UserInfoCVarNamePlayer &cvar : LoadGameUserInfoCVars)
{
(*cvar.addr) = GetCVar(cvar.pnum, cvar.name.GetChars());
}
}
void SynthesizeFlagFields()