From df17a60f5d34e313da1782b6c54887917bc3d5cd Mon Sep 17 00:00:00 2001 From: Randy Heit Date: Tue, 9 May 2006 03:40:15 +0000 Subject: [PATCH] - Fixed: The names in the Depths array in m_options.cpp were never freed. - Fixed: FDoomEdMap needed a destructor. - Fixed: Decal animators were never freed. - Fixed: Colormaps were never freed. - Fixed: Memory allocated in R_InitTranslationTables() was never freed. - Fixed: R_InitParticles() allocated way more memory than it needed to. (And the particle memory was never freed, either.) - Fixed: FMetaTable::FreeMeta() should use delete[] to free string metadata. - Fixed: FConfigFile::ClearCurrentSection() must cast the entry to a char * before deleting it, because that's the way it was allocated. - Fixed definitions of DeadZombieMan and DeadShotgunGuy in doom/deadthings.txt. Skip_super resets the dropitem list, so having it after "DropItem None" is pointless. - Fixed: Decorate DropItem information was never freed. - Fixed: FinishStates() allocated even 0-entry state arrays. - Fixed: Default actor instances were never freed. - Fixed: FRandomSoundList never freed its sound list. - Fixed: Level and cluster strings read from MAPINFO were never freed. - Fixed: Episode names were never freed. - Fixed: InverseColormap and GoldColormap were never freed. Since they're always allocated, they can just be arrays rather than pointers. - Fixed: FFont destructor never freed any of the character data or the font's name. - Fixed: Fonts were not freed at exit. - Fixed: FStringTable::LoadLanguage() did not call SC_Close(). - Fixed: When using the -iwad parameter, IdentifyVersion() did not release the buffer it created to hold the parameter's path. SVN r88 (trunk) --- docs/rh-log.txt | 26 ++++++++ src/configfile.cpp | 2 +- src/d_main.cpp | 10 ++- src/decallib.cpp | 31 ++++++---- src/decallib.h | 3 +- src/dobject.cpp | 15 ++++- src/g_level.cpp | 95 +++++++++++++++++++++++++++-- src/g_shared/a_weapons.cpp | 13 ---- src/info.cpp | 5 ++ src/info.h | 9 +-- src/infomacros.h | 11 +--- src/m_options.cpp | 17 +++++- src/p_mobj.cpp | 18 ------ src/r_data.cpp | 17 ++++++ src/r_draw.cpp | 13 ++-- src/r_main.h | 7 ++- src/r_things.cpp | 11 +++- src/s_advsound.cpp | 28 +++++++-- src/stringtable.cpp | 1 + src/thingdef.cpp | 67 ++++++++++++-------- src/thingdef_codeptr.cpp | 4 +- src/v_font.cpp | 19 +++++- src/v_font.h | 1 + src/v_palette.cpp | 6 +- src/v_palette.h | 4 +- wadsrc/decorate/doom/deadthings.txt | 12 ++-- 26 files changed, 314 insertions(+), 131 deletions(-) diff --git a/docs/rh-log.txt b/docs/rh-log.txt index 932d635a93..b64df9b922 100644 --- a/docs/rh-log.txt +++ b/docs/rh-log.txt @@ -1,4 +1,30 @@ May 8, 2006 +- Fixed: The names in the Depths array in m_options.cpp were never freed. +- Fixed: FDoomEdMap needed a destructor. +- Fixed: Decal animators were never freed. +- Fixed: Colormaps were never freed. +- Fixed: Memory allocated in R_InitTranslationTables() was never freed. +- Fixed: R_InitParticles() allocated way more memory than it needed to. (And the + particle memory was never freed, either.) +- Fixed: FMetaTable::FreeMeta() should use delete[] to free string metadata. +- Fixed: FConfigFile::ClearCurrentSection() must cast the entry to a char * + before deleting it, because that's the way it was allocated. +- Fixed definitions of DeadZombieMan and DeadShotgunGuy in doom/deadthings.txt. + Skip_super resets the dropitem list, so having it after "DropItem None" is + pointless. +- Fixed: Decorate DropItem information was never freed. +- Fixed: FinishStates() allocated even 0-entry state arrays. +- Fixed: Default actor instances were never freed. +- Fixed: FRandomSoundList never freed its sound list. +- Fixed: Level and cluster strings read from MAPINFO were never freed. +- Fixed: Episode names were never freed. +- Fixed: InverseColormap and GoldColormap were never freed. Since they're always + allocated, they can just be arrays rather than pointers. +- Fixed: FFont destructor never freed any of the character data or the font's name. +- Fixed: Fonts were not freed at exit. +- Fixed: FStringTable::LoadLanguage() did not call SC_Close(). +- Fixed: When using the -iwad parameter, IdentifyVersion() did not release the + buffer it created to hold the parameter's path. - Blends created with the ACS fade commands now degrade to transparent overlays when the menu is visible, so they can no longer obscure the menu. diff --git a/src/configfile.cpp b/src/configfile.cpp index af8545cb4e..6c5a2430f9 100644 --- a/src/configfile.cpp +++ b/src/configfile.cpp @@ -195,7 +195,7 @@ void FConfigFile::ClearCurrentSection () { next = entry->Next; delete[] entry->Value; - delete entry; + delete (char *)entry; entry = next; } CurrentSection->RootEntry = NULL; diff --git a/src/d_main.cpp b/src/d_main.cpp index f6084efac6..b9ae76e8b8 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -1550,17 +1550,16 @@ static EIWADType IdentifyVersion (const char *zdoom_wad) int pickwad; size_t i; bool iwadparmfound = false; + FString custwad; memset (wads, 0, sizeof(wads)); if (iwadparm) { - char *custwad = new char[strlen (iwadparm) + 5]; - strcpy (custwad, iwadparm); - FixPathSeperator (custwad); + custwad = iwadparm; + FixPathSeperator (custwad.GetChars()); if (CheckIWAD (custwad, wads)) { // -iwad parameter was a directory - delete[] custwad; iwadparm = NULL; } else @@ -2015,13 +2014,12 @@ void D_DoomMain (void) // [RH] Initialize localizable strings. GStrings.LoadStrings (false); - //P_InitXlat (); - // [RH] Moved these up here so that we can do most of our // startup output in a fullscreen console. CT_Init (); I_Init (); + V_Init (); // Base systems have been inited; enable cvar callbacks diff --git a/src/decallib.cpp b/src/decallib.cpp index fbe390d088..14a98e824c 100644 --- a/src/decallib.cpp +++ b/src/decallib.cpp @@ -92,10 +92,22 @@ struct FDecalAnimator virtual ~FDecalAnimator (); virtual DThinker *CreateThinker (DBaseDecal *actor, side_t *wall) const = 0; - char *Name; + FName Name; }; -static TArray Animators; +class FDecalAnimatorArray : public TArray +{ +public: + ~FDecalAnimatorArray() + { + for (unsigned int i = 0; i < Size(); ++i) + { + delete (*this)[i]; + } + } +}; + +FDecalAnimatorArray Animators; struct DDecalThinker : public DThinker { @@ -554,7 +566,7 @@ void FDecalLib::ParseDecalGroup () SC_MustGetString (); if (SC_Compare ("}")) { - group->Name = copystring (groupName); + group->Name = groupName; group->SpawnID = decalNum; AddDecal (group); break; @@ -835,7 +847,7 @@ void FDecalLib::AddDecal (const char *name, byte num, const FDecalTemplate &deca FDecalTemplate *newDecal = new FDecalTemplate; *newDecal = decal; - newDecal->Name = copystring (name); + newDecal->Name = name; newDecal->SpawnID = num; AddDecal (newDecal); } @@ -987,13 +999,11 @@ FDecalLib::FTranslation *FDecalLib::GenerateTranslation (DWORD start, DWORD end) FDecalBase::FDecalBase () { - Name = NULL; + Name = NAME_None; } FDecalBase::~FDecalBase () { - if (Name != NULL) - delete[] Name; } void FDecalTemplate::ApplyToDecal (DBaseDecal *decal, side_t *wall) const @@ -1101,16 +1111,11 @@ const FDecalTemplate *FDecalGroup::GetDecal () const FDecalAnimator::FDecalAnimator (const char *name) { - Name = copystring (name); + Name = name; } FDecalAnimator::~FDecalAnimator () { - if (Name != NULL) - { - delete[] Name; - Name = NULL; - } } IMPLEMENT_CLASS (DDecalFader) diff --git a/src/decallib.h b/src/decallib.h index 4994695cb8..db01d5c690 100644 --- a/src/decallib.h +++ b/src/decallib.h @@ -38,6 +38,7 @@ #include "doomtype.h" #include "tarray.h" +#include "name.h" class AActor; class FDecalTemplate; @@ -57,7 +58,7 @@ protected: virtual ~FDecalBase (); FDecalBase *Left, *Right; - char *Name; + FName Name; BYTE SpawnID; TArray Users; // Which actors generate this decal }; diff --git a/src/dobject.cpp b/src/dobject.cpp index 08d1d8d7f6..b474833d3b 100644 --- a/src/dobject.cpp +++ b/src/dobject.cpp @@ -118,6 +118,14 @@ static struct TypeInfoDataFreeer void TypeInfo::StaticFreeData (TypeInfo *type) { + if (type->ActorInfo != NULL) + { + if (type->ActorInfo->Defaults != NULL) + { + delete[] type->ActorInfo->Defaults; + type->ActorInfo->Defaults = NULL; + } + } if (type->bRuntimeClass) { if (type->Name != NULL) @@ -127,6 +135,11 @@ void TypeInfo::StaticFreeData (TypeInfo *type) type->Name = NULL; if (type->ActorInfo != NULL) { + if (type->ActorInfo->OwnedStates != NULL) + { + delete[] type->ActorInfo->OwnedStates; + type->ActorInfo->OwnedStates = NULL; + } delete type->ActorInfo; type->ActorInfo = NULL; } @@ -350,7 +363,7 @@ void FMetaTable::FreeMeta () switch (meta->Type) { case META_String: - delete meta->Value.String; + delete[] meta->Value.String; break; default: break; diff --git a/src/g_level.cpp b/src/g_level.cpp index 0c5d4e0590..2fdf713346 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -95,6 +95,17 @@ static void InitPlayerClasses (); static void ParseEpisodeInfo (); static void G_DoParseMapInfo (int lump); static void SetLevelNum (level_info_t *info, int num); +static void ClearEpisodes (); +static void ClearLevelInfoStrings (level_info_t *linfo); +static void ClearClusterInfoStrings (cluster_info_t *cinfo); + +static struct EpisodeKiller +{ + ~EpisodeKiller() + { + ClearEpisodes(); + } +} KillTheEpisodes; static FRandom pr_classchoice ("RandomPlayerClassChoice"); @@ -130,6 +141,23 @@ level_locals_t level; // info about current level static TArray wadclusterinfos; TArray wadlevelinfos; +static struct LevelClusterInfoKiller +{ + ~LevelClusterInfoKiller() + { + unsigned int i; + + for (i = 0; i < wadlevelinfos.Size(); ++i) + { + ClearLevelInfoStrings (&wadlevelinfos[i]); + } + for (i = 0; i < wadclusterinfos.Size(); ++i) + { + ClearClusterInfoStrings (&wadclusterinfos[i]); + } + } +} KillTheLevelAndClusterInfos; + // MAPINFO is parsed slightly differently when the map name is just a number. static bool HexenHack; @@ -532,8 +560,16 @@ static void G_DoParseMapInfo (int lump) { levelindex = wadlevelinfos.Reserve(1); } + else + { + ClearLevelInfoStrings (&wadlevelinfos[levelindex]); + } levelinfo = &wadlevelinfos[levelindex]; memcpy (levelinfo, &defaultinfo, sizeof(*levelinfo)); + if (levelinfo->music != NULL) + { + levelinfo->music = copystring (levelinfo->music); + } if (HexenHack) { levelinfo->WallHorizLight = levelinfo->WallVertLight = 0; @@ -612,6 +648,10 @@ static void G_DoParseMapInfo (int lump) { delete[] clusterinfo->messagemusic; } + if (clusterinfo->clustername != NULL) + { + delete[] clusterinfo->clustername; + } } memset (clusterinfo, 0, sizeof(cluster_info_t)); clusterinfo->cluster = sc_Number; @@ -623,18 +663,61 @@ static void G_DoParseMapInfo (int lump) break; case MITL_CLEAREPISODES: - for (int i = 0; i < EpiDef.numitems; ++i) - { - delete[] const_cast(EpisodeMenu[i].name); - EpisodeMenu[i].name = NULL; - } - EpiDef.numitems = 0; + ClearEpisodes (); break; } } SC_Close (); } +static void ClearLevelInfoStrings(level_info_t *linfo) +{ + if (linfo->music != NULL) + { + delete[] linfo->music; + linfo->music = NULL; + } + if (linfo->level_name != NULL) + { + delete[] linfo->level_name; + linfo->level_name = NULL; + } +} + +static void ClearClusterInfoStrings(cluster_info_t *cinfo) +{ + if (cinfo->exittext != NULL) + { + delete[] cinfo->exittext; + cinfo->exittext = NULL; + } + if (cinfo->entertext != NULL) + { + delete[] cinfo->entertext; + cinfo->entertext = NULL; + } + if (cinfo->messagemusic != NULL) + { + delete[] cinfo->messagemusic; + cinfo->messagemusic = NULL; + } + if (cinfo->clustername != NULL) + { + delete[] cinfo->clustername; + cinfo->clustername = NULL; + } +} + +static void ClearEpisodes() +{ + for (int i = 0; i < EpiDef.numitems; ++i) + { + delete[] const_cast(EpisodeMenu[i].name); + EpisodeMenu[i].name = NULL; + } + EpiDef.numitems = 0; +} + static void ParseMapInfoLower (MapInfoHandler *handlers, const char *strings[], level_info_t *levelinfo, diff --git a/src/g_shared/a_weapons.cpp b/src/g_shared/a_weapons.cpp index 8c1775290a..8714ad5fc7 100644 --- a/src/g_shared/a_weapons.cpp +++ b/src/g_shared/a_weapons.cpp @@ -31,19 +31,6 @@ BEGIN_DEFAULTS (AWeapon, Any, -1, 0) PROP_Inventory_PickupSound ("misc/w_pkup") END_DEFAULTS -ACTOR_STATE_NAMES(AWeapon) = -{ - { (FState *AActor::*)&AWeapon::UpState, "Up" }, - { (FState *AActor::*)&AWeapon::DownState, "Down" }, - { (FState *AActor::*)&AWeapon::ReadyState, "Ready" }, - { (FState *AActor::*)&AWeapon::AtkState, "Attack" }, - { (FState *AActor::*)&AWeapon::HoldAtkState, "HoldAttack" }, - { (FState *AActor::*)&AWeapon::AltAtkState, "AltAttack" }, - { (FState *AActor::*)&AWeapon::AltHoldAtkState, "AltHoldAttack" }, - { (FState *AActor::*)&AWeapon::FlashState, "Flash" }, - { 0, NAME_None } -}; - //=========================================================================== // // AWeapon :: Serialize diff --git a/src/info.cpp b/src/info.cpp index eadb3df45f..eedb2f60ad 100644 --- a/src/info.cpp +++ b/src/info.cpp @@ -303,6 +303,11 @@ FDoomEdMap DoomEdMap; FDoomEdMap::FDoomEdEntry *FDoomEdMap::DoomEdHash[DOOMED_HASHSIZE]; +FDoomEdMap::~FDoomEdMap() +{ + Empty(); +} + void FDoomEdMap::AddType (int doomednum, const TypeInfo *type) { unsigned int hash = (unsigned int)doomednum % DOOMED_HASHSIZE; diff --git a/src/info.h b/src/info.h index bc8638df06..c6fb60d513 100644 --- a/src/info.h +++ b/src/info.h @@ -353,12 +353,6 @@ enum ADEF_EOL = 0xED5E // End Of List }; -struct FStateName -{ - FState *AActor::*State; - FName Name; -}; - #if _MSC_VER // nonstandard extension used : zero-sized array in struct/union #pragma warning(disable:4200) @@ -378,7 +372,6 @@ struct FActorInfo TypeInfo *Class; FState *OwnedStates; BYTE *Defaults; - FStateName *StateNames; int NumOwnedStates; BYTE GameFilter; BYTE SpawnID; @@ -400,6 +393,8 @@ struct FActorInfo class FDoomEdMap { public: + ~FDoomEdMap(); + const TypeInfo *FindType (int doomednum) const; void AddType (int doomednum, const TypeInfo *type); void DelType (int doomednum); diff --git a/src/infomacros.h b/src/infomacros.h index 3c088abf95..655dc9601b 100644 --- a/src/infomacros.h +++ b/src/infomacros.h @@ -173,12 +173,12 @@ public: #define BEGIN_DEFAULTS(actor,game,ednum,spawnid) \ BEGIN_DEFAULTS_PRE(actor) \ - RUNTIME_CLASS(actor), &actor::States[0], NULL, NULL, countof(actor::States), \ + RUNTIME_CLASS(actor), &actor::States[0], NULL, countof(actor::States), \ BEGIN_DEFAULTS_POST(actor,game,ednum,spawnid) #define BEGIN_STATELESS_DEFAULTS(actor,game,ednum,spawnid) \ BEGIN_DEFAULTS_PRE(actor) \ - RUNTIME_CLASS(actor), NULL, NULL, NULL, 0, \ + RUNTIME_CLASS(actor), NULL, NULL, 0, \ BEGIN_DEFAULTS_POST(actor,game,ednum,spawnid) // IMPLEMENT_ACTOR combines IMPLEMENT_CLASS and BEGIN_DEFAULTS @@ -191,13 +191,6 @@ public: #define IMPLEMENT_ABSTRACT_ACTOR(actor) \ IMPLEMENT_STATELESS_ACTOR(actor,Any,-1,0) END_DEFAULTS -#define ACTOR_STATE_NAMES(actor) \ - extern FStateName actor##StateNames[]; \ - extern FActorInfo actor##ActorInfo; \ - struct actor##StateNamesAssignerClass { actor##StateNamesAssignerClass() { actor##ActorInfo.StateNames = actor##StateNames; } } \ - actor##StateNamesAssigner; \ - FStateName actor##StateNames[] - #define PROP_SeeSound(x) ADD_STRING_PROP(ADEF_SeeSound,"\1",x) #define PROP_AttackSound(x) ADD_STRING_PROP(ADEF_AttackSound,"\2",x) #define PROP_PainSound(x) ADD_STRING_PROP(ADEF_PainSound,"\3",x) diff --git a/src/m_options.cpp b/src/m_options.cpp index 5eb942b04f..4cffd35da0 100644 --- a/src/m_options.cpp +++ b/src/m_options.cpp @@ -799,6 +799,21 @@ EXTERN_CVAR (Bool, fullscreen) static value_t Depths[22]; +static struct DepthNameKiller +{ + ~DepthNameKiller() + { + for (int i = 0; i < countof(Depths); ++i) + { + if (Depths[i].name != NULL) + { + delete[] Depths[i].name; + Depths[i].name = NULL; + } + } + } +} KillTheDepthValues; + EXTERN_CVAR (Bool, vid_tft) // Defined below CUSTOM_CVAR (Int, menu_screenratios, 0, CVAR_ARCHIVE) { @@ -1155,7 +1170,7 @@ void M_OptInit (void) int currval = 0, dummy1, dummy2, i; char name[24]; - for (i = 1; i < 32; i++) + for (i = 1; i < 32 && currval < countof(Depths); i++) { I_StartModeIterator (i); if (I_NextMode (&dummy1, &dummy2, NULL)) diff --git a/src/p_mobj.cpp b/src/p_mobj.cpp index 3d5df1f47d..ae880ed81b 100644 --- a/src/p_mobj.cpp +++ b/src/p_mobj.cpp @@ -168,24 +168,6 @@ IMPLEMENT_POINTY_CLASS (AActor) DECLARE_POINTER (master) END_POINTERS -ACTOR_STATE_NAMES(AActor) = -{ - { &AActor::SpawnState, "Spawn" }, - { &AActor::SeeState, "See" }, - { &AActor::PainState, "Pain" }, - { &AActor::MeleeState, "Melee" }, - { &AActor::MissileState, "Missile" }, - { &AActor::CrashState, "Crash" }, - { &AActor::DeathState, "Death" }, - { &AActor::XDeathState, "XDeath" }, - { &AActor::BDeathState, "Burn" }, - { &AActor::IDeathState, "Ice" }, - { &AActor::EDeathState, "Disintegrate" }, - { &AActor::RaiseState, "Raise" }, - { &AActor::WoundState, "Wound" }, - { 0, NAME_None } -}; - AActor::~AActor () { // Please avoid calling the destructor directly (or through delete)! diff --git a/src/r_data.cpp b/src/r_data.cpp index 7ce35956de..b285ec1a45 100644 --- a/src/r_data.cpp +++ b/src/r_data.cpp @@ -2836,6 +2836,23 @@ int firstfakecmap; byte *realcolormaps; int lastusedcolormap; +static struct ColorMapKiller +{ + ~ColorMapKiller() + { + if (fakecmaps != NULL) + { + delete fakecmaps; + fakecmaps = NULL; + } + if (realcolormaps != NULL) + { + delete realcolormaps; + realcolormaps = NULL; + } + } +} KillTheColormaps; + void R_SetDefaultColormap (const char *name) { if (strnicmp (fakecmaps[0].name, name, 8) != 0) diff --git a/src/r_draw.cpp b/src/r_draw.cpp index e0231c297d..d7792aa6df 100644 --- a/src/r_draw.cpp +++ b/src/r_draw.cpp @@ -1212,18 +1212,19 @@ void R_DrawFogBoundary (int x1, int x2, short *uclip, short *dclip) // void R_InitTranslationTables () { - int i, j; - - // Diminishing translucency tables for shaded actors. Not really - // translation tables, but putting them here was convenient, particularly - // since translationtables[0] would otherwise be wasted. - translationtables[0] = new BYTE[256* + static BYTE MainTranslationTables[256* (NUMCOLORMAPS*16 // Shaded +MAXPLAYERS*2 // Players + PlayersExtra +8 // Standard (7 for Strife, 3 for the rest) +MAX_ACS_TRANSLATIONS // LevelScripted +BODYQUESIZE // PlayerCorpses )]; + int i, j; + + // Diminishing translucency tables for shaded actors. Not really + // translation tables, but putting them here was convenient, particularly + // since translationtables[0] would otherwise be wasted. + translationtables[0] = MainTranslationTables; // Player translations, one for each player translationtables[TRANSLATION_Players] = diff --git a/src/r_main.h b/src/r_main.h index dbce68da2a..75df83685c 100644 --- a/src/r_main.h +++ b/src/r_main.h @@ -23,6 +23,10 @@ #ifndef __R_MAIN_H__ #define __R_MAIN_H__ +// Number of diminishing brightness levels. +// There a 0-31, i.e. 32 LUT in the COLORMAP lump. +#define NUMCOLORMAPS 32 + #include "d_player.h" #include "r_data.h" #include "r_bsp.h" @@ -83,9 +87,6 @@ extern int r_Yaspect; // 16 discrete light levels. The terminology I use is borrowed from Build. // -// Number of diminishing brightness levels. -// There a 0-31, i.e. 32 LUT in the COLORMAP lump. -#define NUMCOLORMAPS 32 #define INVERSECOLORMAP 32 #define GOLDCOLORMAP 33 diff --git a/src/r_things.cpp b/src/r_things.cpp index a8be81df3d..5c1606d4ce 100644 --- a/src/r_things.cpp +++ b/src/r_things.cpp @@ -1975,6 +1975,14 @@ void R_DrawMasked (void) // [RH] Particle functions // +static void STACK_ARGS FreeParticles() +{ + if (Particles != NULL) + { + delete[] Particles; + } +} + void R_InitParticles () { char *i; @@ -1986,8 +1994,9 @@ void R_InitParticles () else if (NumParticles < 100) NumParticles = 100; - Particles = new particle_t[NumParticles * sizeof(particle_t)]; + Particles = new particle_t[NumParticles]; R_ClearParticles (); + atterm (FreeParticles); } void R_ClearParticles () diff --git a/src/s_advsound.cpp b/src/s_advsound.cpp index 70ba53ad1e..defe241b60 100644 --- a/src/s_advsound.cpp +++ b/src/s_advsound.cpp @@ -62,11 +62,31 @@ struct FRandomSoundList { + FRandomSoundList() + : Sounds(0), SfxHead(0), NumSounds(0) + { + } + ~FRandomSoundList() + { + if (Sounds != NULL) + { + delete[] Sounds; + Sounds = NULL; + } + } + WORD *Sounds; // A list of sounds that can result for the following id WORD SfxHead; // The sound id used to reference this list WORD NumSounds; }; +template<> +void CopyForTArray (FRandomSoundList &dst, FRandomSoundList &src) +{ + dst = src; +} + + struct FPlayerClassLookup { char Name[MAX_SNDNAME+1]; @@ -540,10 +560,6 @@ static void S_ClearSoundData() if (Ambients[i]) delete Ambients[i]; Ambients[i]=NULL; } - for(i=0;i 1) { // Only add non-empty random lists random.NumSounds = (WORD)list.Size(); - random.Sounds = new WORD[random.NumSounds]; - memcpy (random.Sounds, &list[0], sizeof(WORD)*random.NumSounds); S_sfx[random.SfxHead].link = (WORD)S_rnd.Push (random); S_sfx[random.SfxHead].bRandomHeader = true; + S_rnd[S_sfx[random.SfxHead].link].Sounds = new WORD[random.NumSounds]; + memcpy (S_rnd[S_sfx[random.SfxHead].link].Sounds, &list[0], sizeof(WORD)*random.NumSounds); } } break; diff --git a/src/stringtable.cpp b/src/stringtable.cpp index 3cd48be06f..f5b774e12f 100644 --- a/src/stringtable.cpp +++ b/src/stringtable.cpp @@ -267,6 +267,7 @@ void FStringTable::LoadLanguage (int lumpnum, DWORD code, bool exactMatch, int p } } } + SC_Close (); } // Replace \ escape sequences in a string with the escaped characters. diff --git a/src/thingdef.cpp b/src/thingdef.cpp index 4a7175f59c..25831cf47f 100644 --- a/src/thingdef.cpp +++ b/src/thingdef.cpp @@ -79,15 +79,6 @@ TArray DecalNames; // all state parameters TArray StateParameters; -//========================================================================== -// -// -//========================================================================== -inline char * MS_Strdup(const char * s) -{ - return *s? strdup(s):NULL; -} - //========================================================================== // // List of all flags @@ -953,12 +944,35 @@ enum struct FDropItem { - const char * Name; + FName Name; int probability; int amount; FDropItem * Next; }; -TArray DropItemList; + +static void FreeDropItemChain(FDropItem *chain) +{ + while (chain != NULL) + { + FDropItem *next = chain->Next; + delete chain; + chain = next; + } +} + +class FDropItemPtrArray : public TArray +{ +public: + ~FDropItemPtrArray() + { + for (unsigned int i = 0; i < Size(); ++i) + { + FreeDropItemChain ((*this)[i]); + } + } +}; + +FDropItemPtrArray DropItemList; //---------------------------------------------------------------------------- // @@ -999,7 +1013,7 @@ void A_NoBlocking (AActor *actor) while (di != NULL) { - if (stricmp (di->Name, "None") != 0) + if (di->Name != NAME_None) { const TypeInfo *ti = TypeInfo::FindType(di->Name); if (ti) P_DropItem (actor, ti, di->amount, di->probability); @@ -1032,7 +1046,7 @@ struct FBasicAttack { int MeleeDamage; int MeleeSound; - const char *MissileName; + FName MissileName; fixed_t MissileHeight; }; @@ -1165,7 +1179,7 @@ static void ResetBaggage (Baggage *bag) bag->DropItemList = NULL; bag->BAttack.MissileHeight = 32*FRACUNIT; bag->BAttack.MeleeSound = 0; - bag->BAttack.MissileName = NULL; + bag->BAttack.MissileName = NAME_None; bag->DropItemSet = false; bag->CurrentState = 0; bag->StateSet = false; @@ -1174,6 +1188,10 @@ static void ResetBaggage (Baggage *bag) static void ResetActor (AActor *actor, Baggage *bag) { memcpy (actor, GetDefault(), sizeof(AActor)); + if (bag->DropItemList != NULL) + { + FreeDropItemChain (bag->DropItemList); + } ResetBaggage (bag); } @@ -1373,7 +1391,7 @@ bool DoSpecialFunctions(FState & state, bool multistate, int * statecount, Bagga StateParameters[paramindex] = bag.BAttack.MeleeDamage; StateParameters[paramindex+1] = bag.BAttack.MeleeSound; - StateParameters[paramindex+2] = (intptr_t)bag.BAttack.MissileName; + StateParameters[paramindex+2] = bag.BAttack.MissileName; StateParameters[paramindex+3] = bag.BAttack.MissileHeight; state.Action = BasicAttacks[batk]; return true; @@ -1400,7 +1418,7 @@ static void RetargetStatePointers (intptr_t count, const char *target, FState ** { if (*probe == (FState *)count) { - *probe = target == NULL? NULL : (FState *)strdup (target); + *probe = target == NULL ? NULL : (FState *)copystring (target); } } } @@ -1463,7 +1481,7 @@ do_goto: SC_MustGetString(); // copy the text - this must be resolved later! if (laststate != NULL) { // Following a state definition: Modify it. - laststate->NextState=(FState*)strdup(statestring); + laststate->NextState = (FState*)copystring(statestring); } else if (lastlabel >= 0) { // Following a label: Retarget it. @@ -1667,7 +1685,7 @@ do_stop: case 'T': case 't': // String SC_MustGetString(); - v=(intptr_t)MS_Strdup(sc_String); + v = (intptr_t)(sc_String[0] ? copystring(sc_String) : NULL); break; case 'L': @@ -1858,7 +1876,7 @@ static FState *ResolveGotoLabel (AActor *actor, const TypeInfo *type, char *name { SC_ScriptError("Unknown state label %s", label); } - free(namestart); // free the allocated string buffer + delete[] namestart; // free the allocated string buffer return state; } @@ -1915,12 +1933,13 @@ static void FixStatePointersAgain (FActorInfo *actor, AActor *defaults, FState * static int FinishStates (FActorInfo *actor, AActor *defaults, Baggage &bag) { int count = StateArray.Size(); - FState *realstates = new FState[count]; - int i; - int currange; if (count > 0) { + FState *realstates = new FState[count]; + int i; + int currange; + memcpy(realstates, &StateArray[0], count*sizeof(FState)); actor->OwnedStates = realstates; actor->NumOwnedStates = count; @@ -2471,7 +2490,7 @@ static void ActorDropItem (AActor *defaults, Baggage &bag) FDropItem * di=new FDropItem; SC_MustGetString(); - di->Name=strdup(sc_String); + di->Name=sc_String; di->probability=255; di->amount=-1; if (SC_CheckNumber()) @@ -2763,7 +2782,7 @@ static void ActorMeleeSound (AActor *defaults, Baggage &bag) static void ActorMissileType (AActor *defaults, Baggage &bag) { SC_MustGetString(); - bag.BAttack.MissileName = MS_Strdup(sc_String); + bag.BAttack.MissileName = sc_String; } //========================================================================== diff --git a/src/thingdef_codeptr.cpp b/src/thingdef_codeptr.cpp index af78e7abdd..7464872971 100644 --- a/src/thingdef_codeptr.cpp +++ b/src/thingdef_codeptr.cpp @@ -191,7 +191,7 @@ static void DoAttack (AActor *self, bool domelee, bool domissile) int MeleeDamage=StateParameters[index]; int MeleeSound=StateParameters[index+1]; - const char *MissileName=(const char *)StateParameters[index+2]; + FName MissileName=(ENamedName)StateParameters[index+2]; fixed_t MissileHeight=StateParameters[index+3]; A_FaceTarget (self); @@ -202,7 +202,7 @@ static void DoAttack (AActor *self, bool domelee, bool domissile) P_DamageMobj (self->target, self, self, damage, MOD_HIT); P_TraceBleed (damage, self->target, self); } - else if (domissile && MissileName) + else if (domissile && MissileName != NAME_None) { const TypeInfo * ti=TypeInfo::FindType(MissileName); if (ti) diff --git a/src/v_font.cpp b/src/v_font.cpp index 618c97179e..3d604d247c 100644 --- a/src/v_font.cpp +++ b/src/v_font.cpp @@ -110,6 +110,17 @@ static const byte myislower[256] = FFont *FFont::FirstFont = NULL; +static struct FontsDeleter +{ + ~FontsDeleter() + { + while (FFont::FirstFont != NULL) + { + delete FFont::FirstFont; + } + } +} DeleteAllTheFonts; + #if defined(_MSC_VER) && _MSC_VER < 1310 template<> FArchive &operator<< (FArchive &arc, FFont* &font) #else @@ -262,7 +273,7 @@ FFont::~FFont () for (int i = 0; i < count; ++i) { - if (Chars[i].Pic != NULL && Chars[i].Pic->Name == 0) + if (Chars[i].Pic != NULL && Chars[i].Pic->Name[0] == 0) { delete Chars[i].Pic; } @@ -280,6 +291,11 @@ FFont::~FFont () delete[] PatchRemap; PatchRemap = NULL; } + if (Name) + { + delete[] Name; + Name = NULL; + } FFont **prev = &FirstFont; FFont *font = *prev; @@ -559,6 +575,7 @@ FFont::FFont () Chars = NULL; Ranges = NULL; PatchRemap = NULL; + Name = NULL; } FSingleLumpFont::FSingleLumpFont (const char *name, int lump) diff --git a/src/v_font.h b/src/v_font.h index 91ba9a9b60..9d7ff78b5f 100644 --- a/src/v_font.h +++ b/src/v_font.h @@ -108,6 +108,7 @@ protected: FFont *Next; static FFont *FirstFont; + friend struct FontsDeleter; #if defined(_MSC_VER) && _MSC_VER < 1310 template<> friend FArchive &operator<< (FArchive &arc, FFont* &font); diff --git a/src/v_palette.cpp b/src/v_palette.cpp index b0549a119d..5da61aa6a7 100644 --- a/src/v_palette.cpp +++ b/src/v_palette.cpp @@ -59,8 +59,8 @@ extern "C" { FDynamicColormap NormalLight; } FPalette GPalette; -BYTE *InverseColormap; -BYTE *GoldColormap; +BYTE InverseColormap[NUMCOLORMAPS*256]; +BYTE GoldColormap[NUMCOLORMAPS*256]; int Near255; FColorMatcher ColorMatcher; @@ -384,7 +384,6 @@ void InitPalette () // Doom invulnerability is an inverted grayscale // Strife uses it when firing the Sigil - InverseColormap = new BYTE[NUMCOLORMAPS*256]; shade = InverseColormap; for (c = 0; c < 256; c++) @@ -397,7 +396,6 @@ void InitPalette () } // Heretic invulnerability is a golden shade - GoldColormap = new BYTE[NUMCOLORMAPS*256]; shade = GoldColormap; for (c = 0; c < 256; c++) diff --git a/src/v_palette.h b/src/v_palette.h index ffa36a8a1e..1c80f5b33e 100644 --- a/src/v_palette.h +++ b/src/v_palette.h @@ -77,8 +77,8 @@ struct FDynamicColormap FDynamicColormap *Next; }; -extern BYTE *InverseColormap; -extern BYTE *GoldColormap; +extern BYTE InverseColormap[NUMCOLORMAPS*256]; +extern BYTE GoldColormap[NUMCOLORMAPS*256]; extern FPalette GPalette; extern "C" { extern FDynamicColormap NormalLight; diff --git a/wadsrc/decorate/doom/deadthings.txt b/wadsrc/decorate/doom/deadthings.txt index 435be5d433..db75f20da8 100644 --- a/wadsrc/decorate/doom/deadthings.txt +++ b/wadsrc/decorate/doom/deadthings.txt @@ -40,9 +40,9 @@ actor DeadMarine 15 actor DeadZombieMan : ZombieMan 18 { + Skip_Super Game Doom DropItem None - Skip_Super States { Spawn: @@ -54,9 +54,9 @@ actor DeadZombieMan : ZombieMan 18 actor DeadShotgunGuy : ShotgunGuy 19 { + Skip_Super Game Doom DropItem None - Skip_Super States { Spawn: @@ -68,8 +68,8 @@ actor DeadShotgunGuy : ShotgunGuy 19 actor DeadDoomImp : DoomImp 20 { - Game Doom Skip_Super + Game Doom States { Spawn: @@ -81,8 +81,8 @@ actor DeadDoomImp : DoomImp 20 actor DeadDemon : Demon 21 { - Game Doom Skip_Super + Game Doom States { Spawn: @@ -94,8 +94,8 @@ actor DeadDemon : Demon 21 actor DeadCacodemon : Cacodemon 22 { - Game Doom Skip_Super + Game Doom States { Spawn: @@ -113,8 +113,8 @@ actor DeadCacodemon : Cacodemon 22 actor DeadLostSoul : LostSoul 23 { - Game Doom Skip_Super + Game Doom States { Spawn: