- Fixed: Skin definitions were never freed.

- Fixed: Names in terrain definitions were never freed. Replacing them with
  FNames would have been a good idea anyway.
- Fixed: The lock definitions were never freed.
- Fixed: FDoorAnimation was missing a destructor.
- Fixed: animation and switch definitions were never freed.
- Replaced all other places where FindType was used with FNames with 
  IFindType.

SVN r90 (trunk)
This commit is contained in:
Christoph Oelckers 2006-05-09 15:07:45 +00:00
parent ace3ed1188
commit 763efb3682
11 changed files with 108 additions and 32 deletions

View file

@ -1,4 +1,12 @@
May 9, 2006 (Changes by Graf Zahl)
- Fixed: Skin definitions were never freed.
- Fixed: Names in terrain definitions were never freed. Replacing them with
FNames would have been a good idea anyway.
- Fixed: The lock definitions were never freed.
- Fixed: FDoorAnimation was missing a destructor.
- Fixed: animation and switch definitions were never freed.
- Replaced all other places where FindType was used with FNames with
IFindType.
- Fixed: If you want to use a name as the missile parameter for the basic
attack functions the type search in DoAttack must be case insensitive.
- Fixed: APowerup::DoEffect must do more thorough checks before resetting

View file

@ -2011,6 +2011,7 @@ void D_DoomMain (void)
Wads.InitMultipleFiles (&wadfiles);
// [RH] Initialize localizable strings.
GStrings.LoadStrings (false);
@ -2080,6 +2081,7 @@ void D_DoomMain (void)
FActorInfo::StaticSetActorNums ();
// [RH] User-configurable startup strings. Because BOOM does.
static const char *startupString[5] = {
"STARTUP1", "STARTUP2", "STARTUP3", "STARTUP4", "STARTUP5"

View file

@ -85,6 +85,15 @@ static bool keysdone=false; // have the locks been initialized?
static int currentnumber; // number to be assigned to next key
static bool ignorekey; // set to true when the current lock is not being used
static void ClearLocks();
static struct LockDeleter
{
~LockDeleter()
{
ClearLocks();
}
} DeleteTheLocks;
static const char * keywords_lock[]={
"ANY",

View file

@ -480,6 +480,25 @@ void P_SpawnDoorRaiseIn5Mins (sector_t *sec)
TArray<FDoorAnimation> DoorAnimations;
FDoorAnimation::~FDoorAnimation()
{
if (TextureFrames != NULL)
{
delete [] TextureFrames;
TextureFrames = NULL;
}
if (OpenSound != NULL)
{
delete [] OpenSound;
OpenSound = NULL;
}
if (CloseSound != NULL)
{
delete [] CloseSound;
CloseSound = NULL;
}
}
// EV_SlidingDoor : slide a door horizontally
// (animate midtexture, then set noblocking line)
//

View file

@ -142,7 +142,19 @@ struct FAnimDef
};
};
TArray<FAnimDef *> Anims;
class DeletingAnimArray : public TArray<FAnimDef *>
{
public:
~DeletingAnimArray()
{
for(unsigned i=0;i<Size();i++)
{
if ((*this)[i] != NULL) free((*this)[i]);
(*this)[i]=NULL;
}
}
};
static DeletingAnimArray Anims;
// killough 3/7/98: Initialize generalized scrolling
static void P_SpawnScrollers();

View file

@ -578,6 +578,8 @@ struct FDoorAnimation
int NumTextureFrames;
char *OpenSound;
char *CloseSound;
~FDoorAnimation();
};
extern TArray<FDoorAnimation> DoorAnimations;

View file

@ -114,7 +114,19 @@ static WORD AddSwitchDef (FSwitchDef *def);
// CHANGE THE TEXTURE OF A WALL SWITCH TO ITS OPPOSITE
//
static TArray<FSwitchDef *> SwitchList;
class DeletingSwitchArray : public TArray<FSwitchDef *>
{
public:
~DeletingSwitchArray()
{
for(unsigned i=0;i<Size();i++)
{
if ((*this)[i] != NULL) free((*this)[i]);
(*this)[i]=NULL;
}
}
};
static DeletingSwitchArray SwitchList;
//
// P_InitSwitchList

View file

@ -125,10 +125,10 @@ static void ParseOuter ();
static void ParseSplash ();
static void ParseTerrain ();
static void ParseFloor ();
static int FindSplash (const char *name);
static int FindTerrain (const char *name);
static int FindSplash (FName name);
static int FindTerrain (FName name);
static void GenericParse (FGenericParse *parser, const char **keywords,
void *fields, const char *type, const char *name);
void *fields, const char *type, FName name);
static void ParseDamage (int keyword, void *fields);
static void ParseFriction (int keyword, void *fields);
@ -136,7 +136,7 @@ static void ParseFriction (int keyword, void *fields);
// PUBLIC DATA DEFINITIONS -------------------------------------------------
byte *TerrainTypes;
TArray<byte>TerrainTypes;
TArray<FSplashDef> Splashes;
TArray<FTerrainDef> Terrains;
@ -268,8 +268,8 @@ void P_InitTerrainTypes ()
int size;
size = (TexMan.NumTextures()+1)*sizeof(byte);
TerrainTypes = (byte *)M_Malloc (size);
memset (TerrainTypes, 0, size);
TerrainTypes.Resize(size);
memset (&TerrainTypes[0], 0, size);
MakeDefaultTerrain ();
@ -295,7 +295,7 @@ static void MakeDefaultTerrain ()
FTerrainDef def;
memset (&def, 0, sizeof(def));
def.Name = copystring ("Solid");
def.Name = "Solid";
def.Splash = -1;
Terrains.Push (def);
}
@ -399,13 +399,15 @@ void ParseSplash ()
int splashnum;
FSplashDef *splashdef;
bool isnew = false;
FName name;
SC_MustGetString ();
splashnum = (int)FindSplash (sc_String);
name = sc_String;
splashnum = (int)FindSplash (name);
if (splashnum < 0)
{
FSplashDef def;
def.Name = copystring (sc_String);
def.Name = name;
splashnum = (int)Splashes.Push (def);
isnew = true;
}
@ -446,16 +448,17 @@ void ParseSplash ()
void ParseTerrain ()
{
int terrainnum;
const char *name;
FName name;
SC_MustGetString ();
terrainnum = (int)FindTerrain (sc_String);
name = sc_String;
terrainnum = (int)FindTerrain (name);
if (terrainnum < 0)
{
FTerrainDef def;
memset (&def, 0, sizeof(def));
def.Splash = -1;
def.Name = copystring (sc_String);
def.Name = name;
terrainnum = (int)Terrains.Push (def);
}
@ -549,7 +552,7 @@ static void ParseFriction (int keyword, void *fields)
//==========================================================================
static void GenericParse (FGenericParse *parser, const char **keywords,
void *fields, const char *type, const char *name)
void *fields, const char *type, FName name)
{
bool notdone = true;
int keyword;
@ -578,7 +581,7 @@ static void GenericParse (FGenericParse *parser, const char **keywords,
if (val == 0)
{
Printf ("Unknown sound %s in %s %s\n",
sc_String, type, name);
sc_String, type, name.GetChars());
}
break;
@ -599,13 +602,13 @@ static void GenericParse (FGenericParse *parser, const char **keywords,
if (!info->IsDescendantOf (RUNTIME_CLASS(AActor)))
{
Printf ("%s is not an Actor (in %s %s)\n",
sc_String, type, name);
sc_String, type, name.GetChars());
info = NULL;
}
else if (info == NULL)
{
Printf ("Unknown actor %s in %s %s\n",
sc_String, type, name);
sc_String, type, name.GetChars());
}
}
SET_FIELD (const TypeInfo *, info);
@ -618,7 +621,7 @@ static void GenericParse (FGenericParse *parser, const char **keywords,
if (val == -1)
{
Printf ("Splash %s is not defined yet (in %s %s)\n",
sc_String, type, name);
sc_String, type, name.GetChars());
}
break;
@ -683,13 +686,13 @@ static void ParseFloor ()
//
//==========================================================================
int FindSplash (const char *name)
int FindSplash (FName name)
{
unsigned int i;
for (i = 0; i < Splashes.Size (); i++)
{
if (stricmp (Splashes[i].Name, name) == 0)
if (Splashes[i].Name == name)
{
return (int)i;
}
@ -703,13 +706,13 @@ int FindSplash (const char *name)
//
//==========================================================================
int FindTerrain (const char *name)
int FindTerrain (FName name)
{
unsigned int i;
for (i = 0; i < Terrains.Size (); i++)
{
if (stricmp (Terrains[i].Name, name) == 0)
if (Terrains[i].Name == name)
{
return (int)i;
}

View file

@ -36,15 +36,17 @@
#include "dobject.h"
#include "m_fixed.h"
#include "tarray.h"
#include "name.h"
extern byte *TerrainTypes;
extern TArray<byte> TerrainTypes;
// at game start
void P_InitTerrainTypes ();
struct FSplashDef
{
const char *Name;
FName Name;
int SmallSplashSound;
int NormalSplashSound;
const TypeInfo *SmallSplash;
@ -60,7 +62,7 @@ struct FSplashDef
struct FTerrainDef
{
const char *Name;
FName Name;
int Splash;
int DamageAmount;
int DamageMOD;

View file

@ -785,6 +785,13 @@ void R_InitSprites ()
qsort (&skins[1], numskins-1, sizeof(FPlayerSkin), skinsorter);
}
static struct SkinDeleter
{
~SkinDeleter()
{
if (skins!=NULL) delete[] skins;
}
} DeleteTheSkins;
//

View file

@ -1015,7 +1015,7 @@ void A_NoBlocking (AActor *actor)
{
if (di->Name != NAME_None)
{
const TypeInfo *ti = TypeInfo::FindType(di->Name);
const TypeInfo *ti = TypeInfo::IFindType(di->Name);
if (ti) P_DropItem (actor, ti, di->amount, di->probability);
}
di = di->Next;
@ -3618,7 +3618,7 @@ void FinishThingdef()
v = defaults->AmmoType1;
if (v != NAME_None && v.IsValidName())
{
defaults->AmmoType1 = TypeInfo::FindType(v.GetChars());
defaults->AmmoType1 = TypeInfo::IFindType(v.GetChars());
if (!defaults->AmmoType1)
{
SC_ScriptError("Unknown ammo type '%s' in '%s'\n", v.GetChars(), ti->Name+1);
@ -3632,7 +3632,7 @@ void FinishThingdef()
v = defaults->AmmoType2;
if (v != NAME_None && v.IsValidName())
{
defaults->AmmoType2 = TypeInfo::FindType(v.GetChars());
defaults->AmmoType2 = TypeInfo::IFindType(v.GetChars());
if (!defaults->AmmoType2)
{
SC_ScriptError("Unknown ammo type '%s' in '%s'\n", v.GetChars(), ti->Name+1);
@ -3646,7 +3646,7 @@ void FinishThingdef()
v = defaults->SisterWeaponType;
if (v != NAME_None && v.IsValidName())
{
defaults->SisterWeaponType = TypeInfo::FindType(v.GetChars());
defaults->SisterWeaponType = TypeInfo::IFindType(v.GetChars());
if (!defaults->SisterWeaponType)
{
SC_ScriptError("Unknown sister weapon type '%s' in '%s'\n", v.GetChars(), ti->Name+1);
@ -3677,7 +3677,7 @@ void FinishThingdef()
v = defaults->WeaponClass;
if (v != NAME_None)
{
defaults->WeaponClass = TypeInfo::FindType(v.GetChars());
defaults->WeaponClass = TypeInfo::IFindType(v.GetChars());
if (!defaults->WeaponClass)
{
SC_ScriptError("Unknown weapon type '%s' in '%s'\n", v.GetChars(), ti->Name+1);
@ -3695,6 +3695,6 @@ void FinishThingdef()
{
char fmt[20];
sprintf(fmt, "QuestItem%d", i+1);
QuestItemClasses[i]=TypeInfo::FindType(fmt);
QuestItemClasses[i]=TypeInfo::IFindType(fmt);
}
}