gamevars.c: implement Gv_Clear() in terms of Gv_Free() + own code.

Also, some commenting.

git-svn-id: https://svn.eduke32.com/eduke32@3416 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
helixhorned 2013-01-20 21:17:10 +00:00
parent 142e36d6f4
commit 99fd67211d

View file

@ -41,9 +41,9 @@ extern void G_FreeMapState(int32_t mapnum);
static void Gv_Free(void) /* called from Gv_ReadSave() and Gv_ResetVars() */ static void Gv_Free(void) /* called from Gv_ReadSave() and Gv_ResetVars() */
{ {
// call this function as many times as needed. // call this function as many times as needed.
int32_t i=(MAXGAMEVARS-1); int32_t i;
// AddLog("Gv_Free");
for (; i>=0; i--) for (i=MAXGAMEVARS-1; i>=0; i--)
{ {
if ((aGameVars[i].dwFlags & GAMEVAR_USER_MASK) && aGameVars[i].val.plValues) if ((aGameVars[i].dwFlags & GAMEVAR_USER_MASK) && aGameVars[i].val.plValues)
{ {
@ -64,49 +64,33 @@ static void Gv_Free(void) /* called from Gv_ReadSave() and Gv_ResetVars() */
aGameArrays[i].dwFlags |= GAMEARRAY_RESET; aGameArrays[i].dwFlags |= GAMEARRAY_RESET;
} }
g_gameVarCount=g_gameArrayCount=0;
g_gameVarCount = g_gameArrayCount = 0;
hash_init(&h_gamevars); hash_init(&h_gamevars);
hash_init(&h_arrays); hash_init(&h_arrays);
return;
} }
static void Gv_Clear(void) static void Gv_Clear(void)
{ {
// only call this function ONCE... // only call this function ONCE...
int32_t i=(MAXGAMEVARS-1); int32_t i;
//AddLog("Gv_Clear"); Gv_Free();
for (; i>=0; i--) // Now, only do work that Gv_Free() hasn't done.
for (i=MAXGAMEVARS-1; i>=0; i--)
{ {
if (aGameVars[i].szLabel) Bfree(aGameVars[i].szLabel);
Bfree(aGameVars[i].szLabel);
aGameVars[i].szLabel=NULL; aGameVars[i].szLabel=NULL;
if ((aGameVars[i].dwFlags & GAMEVAR_USER_MASK) && aGameVars[i].val.plValues)
{
Bfree(aGameVars[i].val.plValues);
aGameVars[i].val.plValues=NULL;
}
aGameVars[i].val.lValue=0; aGameVars[i].val.lValue=0;
aGameVars[i].dwFlags |= GAMEVAR_RESET;
if (i >= MAXGAMEARRAYS) if (i >= MAXGAMEARRAYS)
continue; continue;
if (aGameArrays[i].szLabel)
Bfree(aGameArrays[i].szLabel);
aGameArrays[i].szLabel=NULL;
if ((aGameArrays[i].dwFlags & GAMEARRAY_NORMAL) && aGameArrays[i].plValues) Bfree(aGameArrays[i].szLabel);
{ aGameArrays[i].szLabel=NULL;
Bfree(aGameArrays[i].plValues);
aGameArrays[i].plValues=NULL;
}
aGameArrays[i].dwFlags |= GAMEARRAY_RESET;
} }
g_gameVarCount=g_gameArrayCount=0;
hash_init(&h_gamevars);
hash_init(&h_arrays);
return;
} }
#endif #endif
@ -511,20 +495,22 @@ int32_t Gv_NewVar(const char *pszLabel, intptr_t lValue, uint32_t dwFlags)
if (i == -1) if (i == -1)
i = g_gameVarCount; i = g_gameVarCount;
// Set values // If it's a user gamevar...
if ((aGameVars[i].dwFlags & GAMEVAR_SYSTEM) == 0) if ((aGameVars[i].dwFlags & GAMEVAR_SYSTEM) == 0)
{ {
// Allocate and set its label
if (aGameVars[i].szLabel == NULL) if (aGameVars[i].szLabel == NULL)
aGameVars[i].szLabel = (char *)Bcalloc(MAXVARLABEL,sizeof(uint8_t)); aGameVars[i].szLabel = (char *)Bcalloc(MAXVARLABEL,sizeof(uint8_t));
if (aGameVars[i].szLabel != pszLabel) if (aGameVars[i].szLabel != pszLabel)
Bstrcpy(aGameVars[i].szLabel,pszLabel); Bstrcpy(aGameVars[i].szLabel,pszLabel);
// and the flags
aGameVars[i].dwFlags=dwFlags; aGameVars[i].dwFlags=dwFlags;
if (aGameVars[i].dwFlags & GAMEVAR_USER_MASK) if (aGameVars[i].dwFlags & GAMEVAR_USER_MASK)
{ {
// only free if not system // only free if per-{actor,player}
if (aGameVars[i].val.plValues) Bfree(aGameVars[i].val.plValues);
Bfree(aGameVars[i].val.plValues);
aGameVars[i].val.plValues=NULL; aGameVars[i].val.plValues=NULL;
} }
} }
@ -539,6 +525,7 @@ int32_t Gv_NewVar(const char *pszLabel, intptr_t lValue, uint32_t dwFlags)
hash_add(&h_gamevars, aGameVars[i].szLabel, g_gameVarCount++, 0); hash_add(&h_gamevars, aGameVars[i].szLabel, g_gameVarCount++, 0);
} }
// Set initial values. (Or, override values for system gamevars.)
if (aGameVars[i].dwFlags & GAMEVAR_PERPLAYER) if (aGameVars[i].dwFlags & GAMEVAR_PERPLAYER)
{ {
if (!aGameVars[i].val.plValues) if (!aGameVars[i].val.plValues)