- fixed: The TouchedActors array in the Dehacked parser was not freed after parsing was done.

- Initialize the alt HUD explicitly in D_DoomMain.
- don't let S_UnloadReverbDef leave a broken list of sound environments behind.
- Added more code to explicitly delete data before initializing it.

SVN r3039 (trunk)
This commit is contained in:
Christoph Oelckers 2010-12-15 00:09:31 +00:00
parent 22372fff25
commit 770a879f6a
25 changed files with 156 additions and 38 deletions

View file

@ -2880,6 +2880,8 @@ void FinishDehPatch ()
// Now that all Dehacked patches have been processed, it's okay to free StateMap. // Now that all Dehacked patches have been processed, it's okay to free StateMap.
StateMap.Clear(); StateMap.Clear();
StateMap.ShrinkToFit(); StateMap.ShrinkToFit();
TouchedActors.Clear();
TouchedActors.ShrinkToFit();
} }
void ModifyDropAmount(AInventory *inv, int dropamount); void ModifyDropAmount(AInventory *inv, int dropamount);

View file

@ -122,6 +122,7 @@ extern void M_SetDefaultMode ();
extern void R_ExecuteSetViewSize (); extern void R_ExecuteSetViewSize ();
extern void G_NewInit (); extern void G_NewInit ();
extern void SetupPlayerClasses (); extern void SetupPlayerClasses ();
extern void HUD_InitHud();
const FIWADInfo *D_FindIWAD(TArray<FString> &wadfiles, const char *iwad, const char *basewad); const FIWADInfo *D_FindIWAD(TArray<FString> &wadfiles, const char *iwad, const char *basewad);
// PUBLIC FUNCTION PROTOTYPES ---------------------------------------------- // PUBLIC FUNCTION PROTOTYPES ----------------------------------------------
@ -2134,7 +2135,6 @@ void D_DoomMain (void)
R_Init (); R_Init ();
Printf ("DecalLibrary: Load decals.\n"); Printf ("DecalLibrary: Load decals.\n");
DecalLibrary.Clear ();
DecalLibrary.ReadAllDecals (); DecalLibrary.ReadAllDecals ();
// [RH] Add any .deh and .bex files on the command line. // [RH] Add any .deh and .bex files on the command line.
@ -2187,6 +2187,7 @@ void D_DoomMain (void)
//SBarInfo support. //SBarInfo support.
SBarInfo::Load(); SBarInfo::Load();
HUD_InitHud();
// [RH] User-configurable startup strings. Because BOOM does. // [RH] User-configurable startup strings. Because BOOM does.
static const char *startupString[5] = { static const char *startupString[5] = {

View file

@ -383,6 +383,7 @@ DBaseStatusBar *CreateCustomStatusBar(int script=0);
void ST_FormatMapName(FString &mapname, const char *mapnamecolor = ""); void ST_FormatMapName(FString &mapname, const char *mapnamecolor = "");
void ST_LoadCrosshair(bool alwaysload=false); void ST_LoadCrosshair(bool alwaysload=false);
void ST_Clear();
extern FTexture *CrosshairImage; extern FTexture *CrosshairImage;
#endif /* __SBAR_H__ */ #endif /* __SBAR_H__ */

View file

@ -423,6 +423,8 @@ static void FreeSBarInfoScript()
void SBarInfo::Load() void SBarInfo::Load()
{ {
FreeSBarInfoScript();
MugShotStates.Clear();
if(gameinfo.statusbar.IsNotEmpty()) if(gameinfo.statusbar.IsNotEmpty())
{ {
int lump = Wads.CheckNumForFullName(gameinfo.statusbar, true); int lump = Wads.CheckNumForFullName(gameinfo.statusbar, true);

View file

@ -769,14 +769,11 @@ static void DrawCoordinates(player_t * CPlayer)
// draw the overlay // draw the overlay
// //
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
void HUD_InitHud();
void DrawHUD() void DrawHUD()
{ {
player_t * CPlayer = StatusBar->CPlayer; player_t * CPlayer = StatusBar->CPlayer;
if (HudFont==NULL) HUD_InitHud();
players[consoleplayer].inventorytics = 0; players[consoleplayer].inventorytics = 0;
if (hud_althudscale && SCREENWIDTH>640) if (hud_althudscale && SCREENWIDTH>640)
{ {

View file

@ -197,6 +197,23 @@ void ST_LoadCrosshair(bool alwaysload)
CrosshairImage = TexMan[TexMan.CheckForTexture(name, FTexture::TEX_MiscPatch)]; CrosshairImage = TexMan[TexMan.CheckForTexture(name, FTexture::TEX_MiscPatch)];
} }
//---------------------------------------------------------------------------
//
// ST_Clear
//
//---------------------------------------------------------------------------
void ST_Clear()
{
if (StatusBar != NULL)
{
StatusBar->Destroy();
StatusBar = NULL;
}
CrosshairImage = NULL;
CrosshairNum = 0;
}
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// //
// Constructor // Constructor

View file

@ -44,6 +44,7 @@
#include "w_wad.h" #include "w_wad.h"
TArray<FKeySection> KeySections; TArray<FKeySection> KeySections;
extern TArray<FString> KeyConfWeapons;
static void LoadKeys (const char *modname, bool dbl) static void LoadKeys (const char *modname, bool dbl)
{ {
@ -159,6 +160,7 @@ void D_LoadWadSettings ()
ParsingKeyConf = true; ParsingKeyConf = true;
KeySections.Clear(); KeySections.Clear();
KeyConfWeapons.Clear();
while ((lump = Wads.FindLump ("KEYCONF", &lastlump)) != -1) while ((lump = Wads.FindLump ("KEYCONF", &lastlump)) != -1)
{ {

View file

@ -53,9 +53,10 @@
class DLoadSaveMenu : public DListMenu class DLoadSaveMenu : public DListMenu
{ {
DECLARE_CLASS(DLoadSaveMenu, DListMenu) DECLARE_CLASS(DLoadSaveMenu, DListMenu)
friend void ClearSaveGames();
protected: protected:
static TDeletingArray<FSaveGameNode*> SaveGames; static TArray<FSaveGameNode*> SaveGames;
static int LastSaved; static int LastSaved;
static int LastAccessed; static int LastAccessed;
@ -114,7 +115,7 @@ public:
IMPLEMENT_CLASS(DLoadSaveMenu) IMPLEMENT_CLASS(DLoadSaveMenu)
TDeletingArray<FSaveGameNode*> DLoadSaveMenu::SaveGames; TArray<FSaveGameNode*> DLoadSaveMenu::SaveGames;
int DLoadSaveMenu::LastSaved = -1; int DLoadSaveMenu::LastSaved = -1;
int DLoadSaveMenu::LastAccessed = -1; int DLoadSaveMenu::LastAccessed = -1;
@ -126,6 +127,21 @@ FSaveGameNode *quickSaveSlot;
// //
//============================================================================= //=============================================================================
void ClearSaveGames()
{
for(unsigned i=0;i<DLoadSaveMenu::SaveGames.Size(); i++)
{
delete DLoadSaveMenu::SaveGames[i];
}
DLoadSaveMenu::SaveGames.Clear();
}
//=============================================================================
//
// Save data maintenance (stored statically)
//
//=============================================================================
int DLoadSaveMenu::RemoveSaveSlot (int index) int DLoadSaveMenu::RemoveSaveSlot (int index)
{ {
FSaveGameNode *file = SaveGames[index]; FSaveGameNode *file = SaveGames[index];
@ -194,6 +210,8 @@ void DLoadSaveMenu::ReadSaveStrings ()
findstate_t c_file; findstate_t c_file;
FString filter; FString filter;
LastSaved = LastAccessed = -1;
quickSaveSlot = NULL;
filter = G_BuildSaveName ("*.zds", -1); filter = G_BuildSaveName ("*.zds", -1);
filefirst = I_FindFirst (filter.GetChars(), &c_file); filefirst = I_FindFirst (filter.GetChars(), &c_file);
if (filefirst != ((void *)(-1))) if (filefirst != ((void *)(-1)))

View file

@ -111,6 +111,22 @@ struct FListMenuDescriptor : public FMenuDescriptor
const PClass *mClass; const PClass *mClass;
FMenuDescriptor *mRedirect; // used to redirect overlong skill and episode menus to option menu based alternatives FMenuDescriptor *mRedirect; // used to redirect overlong skill and episode menus to option menu based alternatives
bool mCenter; bool mCenter;
void Reset()
{
// Reset the default settings (ignore all other values in the struct)
mSelectOfsX = 0;
mSelectOfsY = 0;
mSelector.SetInvalid();
mDisplayTop = 0;
mXpos = 0;
mYpos = 0;
mLinespacing = 0;
mNetgameMessage = "";
mFont = NULL;
mFontColor = CR_UNTRANSLATED;
mFontColor2 = CR_UNTRANSLATED;
}
}; };
struct FOptionMenuSettings struct FOptionMenuSettings
@ -141,6 +157,14 @@ struct FOptionMenuDescriptor : public FMenuDescriptor
void CalcIndent(); void CalcIndent();
FOptionMenuItem *GetItem(FName name); FOptionMenuItem *GetItem(FName name);
void Reset()
{
// Reset the default settings (ignore all other values in the struct)
mPosition = 0;
mScrollTop = 0;
mIndent = 0;
mDontDim = 0;
}
}; };

View file

@ -52,6 +52,8 @@
#include "optionmenuitems.h" #include "optionmenuitems.h"
void ClearSaveGames();
MenuDescriptorList MenuDescriptors; MenuDescriptorList MenuDescriptors;
static FListMenuDescriptor DefaultListMenuSettings; // contains common settings for all list menus static FListMenuDescriptor DefaultListMenuSettings; // contains common settings for all list menus
static FOptionMenuDescriptor DefaultOptionMenuSettings; // contains common settings for all Option menus static FOptionMenuDescriptor DefaultOptionMenuSettings; // contains common settings for all Option menus
@ -84,6 +86,8 @@ static void DeinitMenus()
} }
} }
DMenu::CurrentMenu = NULL; DMenu::CurrentMenu = NULL;
DefaultListMenuSettings.mItems.Clear();
ClearSaveGames();
} }
//============================================================================= //=============================================================================
@ -825,8 +829,11 @@ void M_ParseMenuDefs()
OptionSettings.mFontColorHeader = V_FindFontColor(gameinfo.mFontColorHeader); OptionSettings.mFontColorHeader = V_FindFontColor(gameinfo.mFontColorHeader);
OptionSettings.mFontColorHighlight = V_FindFontColor(gameinfo.mFontColorHighlight); OptionSettings.mFontColorHighlight = V_FindFontColor(gameinfo.mFontColorHighlight);
OptionSettings.mFontColorSelection = V_FindFontColor(gameinfo.mFontColorSelection); OptionSettings.mFontColorSelection = V_FindFontColor(gameinfo.mFontColorSelection);
DefaultListMenuSettings.Reset();
DefaultOptionMenuSettings.Reset();
atterm( DeinitMenus); atterm( DeinitMenus);
DeinitMenus();
while ((lump = Wads.FindLump ("MENUDEF", &lastlump)) != -1) while ((lump = Wads.FindLump ("MENUDEF", &lastlump)) != -1)
{ {
FScanner sc(lump); FScanner sc(lump);
@ -841,6 +848,10 @@ void M_ParseMenuDefs()
else if (sc.Compare("DEFAULTLISTMENU")) else if (sc.Compare("DEFAULTLISTMENU"))
{ {
ParseListMenuBody(sc, &DefaultListMenuSettings); ParseListMenuBody(sc, &DefaultListMenuSettings);
if (DefaultListMenuSettings.mItems.Size() > 0)
{
I_FatalError("You cannot add menu items to the menu default settings.");
}
} }
else if (sc.Compare("OPTIONVALUE")) else if (sc.Compare("OPTIONVALUE"))
{ {
@ -861,6 +872,10 @@ void M_ParseMenuDefs()
else if (sc.Compare("DEFAULTOPTIONMENU")) else if (sc.Compare("DEFAULTOPTIONMENU"))
{ {
ParseOptionMenuBody(sc, &DefaultOptionMenuSettings); ParseOptionMenuBody(sc, &DefaultOptionMenuSettings);
if (DefaultOptionMenuSettings.mItems.Size() > 0)
{
I_FatalError("You cannot add menu items to the menu default settings.");
}
} }
else else
{ {

View file

@ -4074,11 +4074,7 @@ static void P_Shutdown ()
P_DeinitKeyMessages (); P_DeinitKeyMessages ();
P_FreeLevelData (); P_FreeLevelData ();
P_FreeExtraLevelData (); P_FreeExtraLevelData ();
if (StatusBar != NULL) ST_Clear();
{
StatusBar->Destroy();
StatusBar = NULL;
}
} }
#if 0 #if 0

View file

@ -133,6 +133,7 @@ void SetupPlayerClasses ()
{ {
FPlayerClass newclass; FPlayerClass newclass;
PlayerClasses.Clear();
for (unsigned i=0; i<gameinfo.PlayerClasses.Size(); i++) for (unsigned i=0; i<gameinfo.PlayerClasses.Size(); i++)
{ {
newclass.Flags = 0; newclass.Flags = 0;

View file

@ -127,6 +127,22 @@ void R_SetDefaultColormap (const char *name)
} }
} }
//==========================================================================
//
// R_DeinitColormaps
//
//==========================================================================
void R_DeinitColormaps ()
{
fakecmaps.Clear();
if (realcolormaps != NULL)
{
delete[] realcolormaps;
realcolormaps = NULL;
}
}
//========================================================================== //==========================================================================
// //
// R_InitColormaps // R_InitColormaps
@ -141,6 +157,8 @@ void R_InitColormaps ()
FakeCmap cm; FakeCmap cm;
R_DeinitColormaps();
cm.name[0] = 0; cm.name[0] = 0;
cm.blend = 0; cm.blend = 0;
fakecmaps.Push(cm); fakecmaps.Push(cm);
@ -215,21 +233,6 @@ void R_InitColormaps ()
numfakecmaps = fakecmaps.Size(); numfakecmaps = fakecmaps.Size();
} }
//==========================================================================
//
// R_DeinitColormaps
//
//==========================================================================
void R_DeinitColormaps ()
{
if (realcolormaps != NULL)
{
delete[] realcolormaps;
realcolormaps = NULL;
}
}
//========================================================================== //==========================================================================
// //
// [RH] Returns an index into realcolormaps. Multiply it by // [RH] Returns an index into realcolormaps. Multiply it by

View file

@ -866,7 +866,10 @@ void R_InitSprites ()
numskins++; numskins++;
} }
SpriteFrames.Clear();
// [RH] Do some preliminary setup // [RH] Do some preliminary setup
if (skins != NULL) delete [] skins;
skins = new FPlayerSkin[numskins]; skins = new FPlayerSkin[numskins];
memset (skins, 0, sizeof(*skins) * numskins); memset (skins, 0, sizeof(*skins) * numskins);
for (i = 0; i < numskins; i++) for (i = 0; i < numskins; i++)

View file

@ -869,7 +869,9 @@ void R_DeinitTranslationTables()
translationtables[i][j] = NULL; translationtables[i][j] = NULL;
} }
} }
translationtables[i].Clear();
} }
BloodTranslationColors.Clear();
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------

View file

@ -587,6 +587,7 @@ void S_ParseReverbDef ()
int lump, lastlump = 0; int lump, lastlump = 0;
atterm (S_UnloadReverbDef); atterm (S_UnloadReverbDef);
S_UnloadReverbDef ();
while ((lump = Wads.FindLump ("REVERBS", &lastlump)) != -1) while ((lump = Wads.FindLump ("REVERBS", &lastlump)) != -1)
{ {
@ -597,15 +598,21 @@ void S_ParseReverbDef ()
void S_UnloadReverbDef () void S_UnloadReverbDef ()
{ {
ReverbContainer *probe = Environments; ReverbContainer *probe = Environments;
ReverbContainer **pNext = NULL;
while (probe != NULL) while (probe != NULL)
{ {
ReverbContainer *next = probe->Next; ReverbContainer *next = probe->Next;
if (!probe->Builtin) if (!probe->Builtin)
{ {
if (pNext != NULL) *pNext = probe->Next;
delete[] const_cast<char *>(probe->Name); delete[] const_cast<char *>(probe->Name);
delete probe; delete probe;
} }
else
{
pNext = &probe->Next;
}
probe = next; probe = next;
} }
Environments = &Off; Environments = &Off;

View file

@ -292,6 +292,7 @@ void S_Init ()
if (S_SoundCurve != NULL) if (S_SoundCurve != NULL)
{ {
delete[] S_SoundCurve; delete[] S_SoundCurve;
S_SoundCurve = NULL;
} }
// Heretic and Hexen have sound curve lookup tables. Doom does not. // Heretic and Hexen have sound curve lookup tables. Doom does not.

View file

@ -130,11 +130,11 @@ extern TArray<level_info_t> wadlevelinfos;
static void ParseStatistics(const char *fn, TArray<FStatistics> &statlist) static void ParseStatistics(const char *fn, TArray<FStatistics> &statlist)
{ {
statlist.Clear();
try try
{ {
FScanner sc; FScanner sc;
sc.OpenFile(fn); sc.OpenFile(fn);
statlist.Clear();
while (sc.GetString()) while (sc.GetString())
{ {

View file

@ -337,6 +337,8 @@ void LoadActors ()
{ {
int lastlump, lump; int lastlump, lump;
StateParams.Clear();
GlobalSymbols.ReleaseSymbols();
DropItemList.Clear(); DropItemList.Clear();
FScriptPosition::ResetErrorCounter(); FScriptPosition::ResetErrorCounter();
InitThingdef(); InitThingdef();

View file

@ -123,7 +123,8 @@ class FStateExpressions
TArray<FStateExpression> expressions; TArray<FStateExpression> expressions;
public: public:
~FStateExpressions(); ~FStateExpressions() { Clear(); }
void Clear();
int Add(FxExpression *x, const PClass *o, bool c); int Add(FxExpression *x, const PClass *o, bool c);
int Reserve(int num, const PClass *cls); int Reserve(int num, const PClass *cls);
void Set(int num, FxExpression *x, bool cloned = false); void Set(int num, FxExpression *x, bool cloned = false);

View file

@ -2765,7 +2765,7 @@ FStateExpressions StateParams;
// //
//========================================================================== //==========================================================================
FStateExpressions::~FStateExpressions() void FStateExpressions::Clear()
{ {
for(unsigned i=0; i<Size(); i++) for(unsigned i=0; i<Size(); i++)
{ {
@ -2774,6 +2774,7 @@ FStateExpressions::~FStateExpressions()
delete expressions[i].expr; delete expressions[i].expr;
} }
} }
expressions.Clear();
} }
//========================================================================== //==========================================================================

View file

@ -2050,6 +2050,11 @@ void V_InitFontColors ()
info.Index = -1; info.Index = -1;
TranslationParms[0].Clear();
TranslationParms[1].Clear();
TranslationLookup.Clear();
TranslationColors.Clear();
while ((lump = Wads.FindLump ("TEXTCOLO", &lastlump)) != -1) while ((lump = Wads.FindLump ("TEXTCOLO", &lastlump)) != -1)
{ {
if (gameinfo.flags & GI_NOTEXTCOLOR) if (gameinfo.flags & GI_NOTEXTCOLOR)
@ -2435,3 +2440,13 @@ void V_InitFonts()
} }
} }
} }
void V_ClearFonts()
{
while (FFont::FirstFont != NULL)
{
delete FFont::FirstFont;
}
FFont::FirstFont = NULL;
SmallFont = SmallFont2 = BigFont = ConFont = IntermissionFont = NULL;
}

View file

@ -128,7 +128,7 @@ protected:
static FFont *FirstFont; static FFont *FirstFont;
friend struct FontsDeleter; friend struct FontsDeleter;
friend void V_Shutdown(); friend void V_ClearFonts();
friend FArchive &SerializeFFontPtr (FArchive &arc, FFont* &font); friend FArchive &SerializeFFontPtr (FArchive &arc, FFont* &font);
}; };
@ -137,6 +137,7 @@ protected:
extern FFont *SmallFont, *SmallFont2, *BigFont, *ConFont, *IntermissionFont; extern FFont *SmallFont, *SmallFont2, *BigFont, *ConFont, *IntermissionFont;
void V_InitFonts(); void V_InitFonts();
void V_ClearFonts();
EColorRange V_FindFontColor (FName name); EColorRange V_FindFontColor (FName name);
PalEntry V_LogColorFromColorRange (EColorRange range); PalEntry V_LogColorFromColorRange (EColorRange range);
EColorRange V_ParseFontColor (const BYTE *&color_value, int normalcolor, int boldcolor); EColorRange V_ParseFontColor (const BYTE *&color_value, int normalcolor, int boldcolor);

View file

@ -1692,10 +1692,7 @@ void V_Shutdown()
s->ObjectFlags |= OF_YesReallyDelete; s->ObjectFlags |= OF_YesReallyDelete;
delete s; delete s;
} }
while (FFont::FirstFont != NULL) V_ClearFonts();
{
delete FFont::FirstFont;
}
} }
EXTERN_CVAR (Bool, vid_tft) EXTERN_CVAR (Bool, vid_tft)

View file

@ -156,16 +156,23 @@ struct XlatParseContext : public FParseContext
// //
//========================================================================== //==========================================================================
void P_ClearTranslator()
{
SimpleLineTranslations.Clear();
NumBoomish = 0;
SectorTranslations.Clear();
SectorMasks.Clear();
memset(LineFlagTranslations, 0, sizeof(LineFlagTranslations));
LastTranslator = "";
}
void P_LoadTranslator(const char *lumpname) void P_LoadTranslator(const char *lumpname)
{ {
// Only read the lump if it differs from the previous one. // Only read the lump if it differs from the previous one.
if (LastTranslator.CompareNoCase(lumpname)) if (LastTranslator.CompareNoCase(lumpname))
{ {
// Clear the old data before parsing the lump. // Clear the old data before parsing the lump.
SimpleLineTranslations.Clear(); P_ClearTranslator();
NumBoomish = 0;
SectorTranslations.Clear();
SectorMasks.Clear();
void *pParser = XlatParseAlloc(malloc); void *pParser = XlatParseAlloc(malloc);
@ -179,3 +186,5 @@ void P_LoadTranslator(const char *lumpname)
LastTranslator = lumpname; LastTranslator = lumpname;
} }
} }