- use FSharedStringArena to handle AActor's tag strings properly. They were names before which are not case sensitive and could cause problems.

- fixed FSharedStringArena::FreeAll did not NULL TopBlock.
- bumped savegame version for above changes.


SVN r3100 (trunk)
This commit is contained in:
Christoph Oelckers 2011-01-12 00:17:13 +00:00
parent ac279d00c7
commit 789c937635
7 changed files with 41 additions and 7 deletions

View file

@ -39,6 +39,7 @@
#include "textures/textures.h"
#include "r_blend.h"
#include "s_sound.h"
#include "memarena.h"
struct subsector_t;
//
@ -760,6 +761,7 @@ public:
fixed_t GetGravity() const;
bool IsSentient() const;
const char *GetTag(const char *def = NULL) const;
void SetTag(const char *def);
// info for drawing
@ -855,7 +857,7 @@ public:
int activationtype; // How the thing behaves when activated with USESPECIAL or BUMPSPECIAL
int lastbump; // Last time the actor was bumped, used to control BUMPSPECIAL
int Score; // manipulated by score items, ACS or DECORATE. The engine doesn't use this itself for anything.
FNameNoInit Tag; // Strife's tag name. FIXME: should be case sensitive!
FString * Tag; // Strife's tag name.
AActor *BlockingMobj; // Actor that blocked the last move
line_t *BlockingLine; // Line that blocked the last move
@ -927,6 +929,7 @@ public:
private:
static AActor *TIDHash[128];
static inline int TIDHASH (int key) { return key & 127; }
static FSharedStringArena mStringPropertyData;
friend class FActorIterator;

View file

@ -373,4 +373,5 @@ void FSharedStringArena::FreeAll()
FreeBlocks = block;
}
memset(Buckets, 0, sizeof(Buckets));
TopBlock = NULL;
}

View file

@ -31,6 +31,9 @@
**
*/
#ifndef __MEMARENA_H
#define __MEMARENA_H
#include "zstring.h"
// A general purpose arena.
@ -81,3 +84,6 @@ protected:
private:
void *Alloc(size_t size) { return NULL; } // No access to FMemArena::Alloc for outsiders.
};
#endif

View file

@ -2709,7 +2709,7 @@ void DLevelScript::DoSetActorProperty (AActor *actor, int property, int value)
actor->Score = value;
case APROP_NameTag:
actor->Tag = FBehavior::StaticLookupString(value);
actor->SetTag(FBehavior::StaticLookupString(value));
break;
case APROP_DamageFactor:

View file

@ -300,7 +300,6 @@ void AActor::Serialize (FArchive &arc)
<< pushfactor
<< Species
<< Score
<< Tag
<< lastpush << lastbump
<< PainThreshold
<< DamageFactor
@ -309,6 +308,17 @@ void AActor::Serialize (FArchive &arc)
<< PoisonDamage << PoisonDuration << PoisonPeriod
<< ConversationRoot << Conversation;
{
FString tagstr;
if (arc.IsStoring() && Tag != NULL && Tag->Len() > 0) tagstr = *Tag;
arc << tagstr;
if (arc.IsLoading())
{
if (tagstr.Len() == 0) Tag = NULL;
else Tag = mStringPropertyData.Alloc(tagstr);
}
}
if (arc.IsLoading ())
{
touching_sectorlist = NULL;
@ -5521,11 +5531,13 @@ bool AActor::IsSentient() const
}
FSharedStringArena AActor::mStringPropertyData;
const char *AActor::GetTag(const char *def) const
{
if (Tag != NAME_None)
if (Tag != NULL)
{
const char *tag = Tag.GetChars();
const char *tag = Tag->GetChars();
if (tag[0] == '$')
{
return GStrings(tag + 1);
@ -5545,6 +5557,18 @@ const char *AActor::GetTag(const char *def) const
}
}
void AActor::SetTag(const char *def)
{
if (def == NULL || *def == 0)
{
Tag = NULL;
}
else
{
Tag = mStringPropertyData.Alloc(def);
}
}
void AActor::ClearCounters()
{

View file

@ -299,7 +299,7 @@ DEFINE_PROPERTY(skip_super, 0, Actor)
DEFINE_PROPERTY(tag, S, Actor)
{
PROP_STRING_PARM(str, 0);
defaults->Tag = str;
defaults->SetTag(str);
}
//==========================================================================

View file

@ -75,7 +75,7 @@
// SAVESIG should match SAVEVER.
// MINSAVEVER is the minimum level snapshot version that can be loaded.
#define MINSAVEVER 3085
#define MINSAVEVER 3100
#if SVN_REVISION_NUMBER < MINSAVEVER
// If we don't know the current revision write something very high to ensure that