- replaced more dyn_casts and checks for RUNTIME_CLASS(PClassActor)

It is preferable to use IsDescendantOf wherever possible if we ever want to be able to separate PClass from PType.
This commit is contained in:
Christoph Oelckers 2017-04-12 10:20:58 +02:00
parent 5350721ec5
commit 9c9b2ccf6d
13 changed files with 28 additions and 23 deletions

View file

@ -1572,6 +1572,17 @@ template<class T> inline T *Spawn() // for inventory items we do not need coordi
return static_cast<T *>(AActor::StaticSpawn(RUNTIME_TEMPLATE_CLASS(T), DVector3(0, 0, 0), NO_REPLACE)); return static_cast<T *>(AActor::StaticSpawn(RUNTIME_TEMPLATE_CLASS(T), DVector3(0, 0, 0), NO_REPLACE));
} }
inline PClassActor *PClass::FindActor(FName name)
{
auto cls = FindClass(name);
return cls && cls->IsDescendantOf(RUNTIME_CLASS(AActor)) ? static_cast<PClassActor*>(cls) : nullptr;
}
inline PClassActor *ValidateActor(PClass *cls)
{
return cls && cls->IsDescendantOf(RUNTIME_CLASS(AActor)) ? static_cast<PClassActor*>(cls) : nullptr;
}
void PrintMiscActorInfo(AActor * query); void PrintMiscActorInfo(AActor * query);
AActor *P_LinePickActor(AActor *t1, DAngle angle, double distance, DAngle pitch, ActorFlags actorMask, uint32_t wallMask); AActor *P_LinePickActor(AActor *t1, DAngle angle, double distance, DAngle pitch, ActorFlags actorMask, uint32_t wallMask);

View file

@ -2827,7 +2827,7 @@ static bool LoadDehSupp ()
{ {
sc.ScriptError ("Can't find type %s", sc.String); sc.ScriptError ("Can't find type %s", sc.String);
} }
else if (!type->IsKindOf(RUNTIME_CLASS(PClassActor))) else if (!type->IsDescendantOf(RUNTIME_CLASS(AActor)))
{ {
sc.ScriptError ("%s is not an actor", sc.String); sc.ScriptError ("%s is not an actor", sc.String);
} }

View file

@ -2592,7 +2592,7 @@ void Net_DoCommand (int type, uint8_t **stream, int player)
char *classname = ReadString(stream); char *classname = ReadString(stream);
int removecount = 0; int removecount = 0;
PClassActor *cls = PClass::FindActor(classname); PClassActor *cls = PClass::FindActor(classname);
if (cls != NULL && cls->IsKindOf(RUNTIME_CLASS(PClassActor))) if (cls != NULL && cls->IsDescendantOf(RUNTIME_CLASS(AActor)))
{ {
removecount = RemoveClass(cls); removecount = RemoveClass(cls);
const PClass *cls_rep = cls->GetReplacement(); const PClass *cls_rep = cls->GetReplacement();

View file

@ -95,7 +95,7 @@ CCMD (dumpactors)
for (unsigned int i = 0; i < PClass::AllClasses.Size(); i++) for (unsigned int i = 0; i < PClass::AllClasses.Size(); i++)
{ {
PClass *cls = PClass::AllClasses[i]; PClass *cls = PClass::AllClasses[i];
PClassActor *acls = dyn_cast<PClassActor>(cls); PClassActor *acls = ValidateActor(cls);
if (acls != NULL) if (acls != NULL)
{ {
auto ainfo = acls->ActorInfo(); auto ainfo = acls->ActorInfo();

View file

@ -3229,7 +3229,7 @@ void PClass::Derive(PClass *newclass, FName name)
void PClass::InitializeDefaults() void PClass::InitializeDefaults()
{ {
if (IsKindOf(RUNTIME_CLASS(PClassActor))) if (IsDescendantOf(RUNTIME_CLASS(AActor)))
{ {
assert(Defaults == nullptr); assert(Defaults == nullptr);
Defaults = (uint8_t *)M_Malloc(Size); Defaults = (uint8_t *)M_Malloc(Size);

View file

@ -354,11 +354,6 @@ public:
static TArray<PClassActor *> AllActorClasses; static TArray<PClassActor *> AllActorClasses;
}; };
inline PClassActor *PClass::FindActor(FName name)
{
return dyn_cast<PClassActor>(FindClass(name));
}
struct FDoomEdEntry struct FDoomEdEntry
{ {
PClassActor *Type; PClassActor *Type;

View file

@ -9777,8 +9777,7 @@ scriptwait:
} }
else else
{ {
AInventory *item = activator->FindInventory (dyn_cast<PClassActor>( AInventory *item = activator->FindInventory (PClass::FindActor (FBehavior::StaticLookupString (STACK(1))));
PClass::FindClass (FBehavior::StaticLookupString (STACK(1)))));
if (item == NULL || !item->IsKindOf(NAME_Weapon)) if (item == NULL || !item->IsKindOf(NAME_Weapon))
{ {

View file

@ -367,7 +367,7 @@ static FStrifeDialogueNode *ReadRetailNode (FileReader *lump, uint32_t &prevSpea
node->SpeakerName = speech.Name; node->SpeakerName = speech.Name;
// The item the speaker should drop when killed. // The item the speaker should drop when killed.
node->DropType = dyn_cast<PClassActor>(GetStrifeType(speech.DropType)); node->DropType = GetStrifeType(speech.DropType);
// Items you need to have to make the speaker use a different node. // Items you need to have to make the speaker use a different node.
node->ItemCheck.Resize(3); node->ItemCheck.Resize(3);
@ -447,7 +447,7 @@ static FStrifeDialogueNode *ReadTeaserNode (FileReader *lump, uint32_t &prevSpea
node->SpeakerName = speech.Name; node->SpeakerName = speech.Name;
// The item the speaker should drop when killed. // The item the speaker should drop when killed.
node->DropType = dyn_cast<PClassActor>(GetStrifeType (speech.DropType)); node->DropType = GetStrifeType (speech.DropType);
// Items you need to have to make the speaker use a different node. // Items you need to have to make the speaker use a different node.
node->ItemCheck.Resize(3); node->ItemCheck.Resize(3);
@ -512,7 +512,7 @@ static void ParseReplies (FStrifeDialogueReply **replyptr, Response *responses)
reply->LogString = ""; reply->LogString = "";
// The item to receive when this reply is used. // The item to receive when this reply is used.
reply->GiveType = dyn_cast<PClassActor>(GetStrifeType (rsp->GiveType)); reply->GiveType = GetStrifeType (rsp->GiveType);
reply->ActionSpecial = 0; reply->ActionSpecial = 0;
// Do you need anything special for this reply to succeed? // Do you need anything special for this reply to succeed?

View file

@ -5041,7 +5041,7 @@ PClassActor *ClassForSpawn(FName classname)
{ {
I_Error("Attempt to spawn actor of unknown type '%s'\n", classname.GetChars()); I_Error("Attempt to spawn actor of unknown type '%s'\n", classname.GetChars());
} }
if (!cls->IsKindOf(RUNTIME_CLASS(PClassActor))) if (!cls->IsDescendantOf(RUNTIME_CLASS(AActor)))
{ {
I_Error("Attempt to spawn non-actor of type '%s'\n", classname.GetChars()); I_Error("Attempt to spawn non-actor of type '%s'\n", classname.GetChars());
} }
@ -5863,7 +5863,7 @@ AActor *P_SpawnMapThing (FMapThing *mthing, int position)
Printf ("%s at (%.1f, %.1f) has no frames\n", Printf ("%s at (%.1f, %.1f) has no frames\n",
i->TypeName.GetChars(), mthing->pos.X, mthing->pos.Y); i->TypeName.GetChars(), mthing->pos.X, mthing->pos.Y);
i = PClass::FindActor("Unknown"); i = PClass::FindActor("Unknown");
assert(i->IsKindOf(RUNTIME_CLASS(PClassActor))); assert(i->IsDescendantOf(RUNTIME_CLASS(AActor)));
} }
const AActor *info = GetDefaultByType (i); const AActor *info = GetDefaultByType (i);

View file

@ -120,7 +120,7 @@ PClassActor *FState::StaticFindStateOwner (const FState *state, PClassActor *inf
{ {
return info; return info;
} }
info = dyn_cast<PClassActor>(info->ParentClass); info = ValidateActor(info->ParentClass);
} }
return NULL; return NULL;
} }
@ -739,7 +739,7 @@ FState *FStateDefinitions::ResolveGotoLabel (AActor *actor, PClassActor *mytype,
// superclass, or it may be the name of any class that this one derives from. // superclass, or it may be the name of any class that this one derives from.
if (stricmp (classname, "Super") == 0) if (stricmp (classname, "Super") == 0)
{ {
type = dyn_cast<PClassActor>(type->ParentClass); type = ValidateActor(type->ParentClass);
actor = GetDefaultByType(type); actor = GetDefaultByType(type);
} }
else else

View file

@ -10982,7 +10982,7 @@ FxExpression *FxMultiNameState::Resolve(FCompileContext &ctx)
} }
else if (names[0] == NAME_Super) else if (names[0] == NAME_Super)
{ {
scope = dyn_cast<PClassActor>(clstype->ParentClass); scope = ValidateActor(clstype->ParentClass);
} }
else else
{ {

View file

@ -582,7 +582,7 @@ static FState *CheckState(FScanner &sc, PClass *type)
FState *state = NULL; FState *state = NULL;
sc.MustGetString(); sc.MustGetString();
PClassActor *info = dyn_cast<PClassActor>(type->ParentClass); PClassActor *info = ValidateActor(type->ParentClass);
if (info != NULL) if (info != NULL)
{ {
@ -999,7 +999,7 @@ PClassActor *CreateNewActor(const FScriptPosition &sc, FName typeName, FName par
sc.Message(MSG_ERROR, "'%s' inherits from a class with the same name", typeName.GetChars()); sc.Message(MSG_ERROR, "'%s' inherits from a class with the same name", typeName.GetChars());
break; break;
} }
p = dyn_cast<PClassActor>(p->ParentClass); p = ValidateActor(p->ParentClass);
} }
if (parent == NULL) if (parent == NULL)

View file

@ -1385,7 +1385,7 @@ void ZCCCompiler::CompileAllProperties()
bool ZCCCompiler::CompileProperties(PClass *type, TArray<ZCC_Property *> &Properties, FName prefix) bool ZCCCompiler::CompileProperties(PClass *type, TArray<ZCC_Property *> &Properties, FName prefix)
{ {
if (!type->IsKindOf(RUNTIME_CLASS(PClassActor))) if (!type->IsDescendantOf(RUNTIME_CLASS(AActor)))
{ {
Error(Properties[0], "Properties can only be defined for actors"); Error(Properties[0], "Properties can only be defined for actors");
return false; return false;
@ -2850,7 +2850,7 @@ void ZCCCompiler::CompileStates()
FString statename; // The state builder wants the label as one complete string, not separated into tokens. FString statename; // The state builder wants the label as one complete string, not separated into tokens.
FStateDefinitions statedef; FStateDefinitions statedef;
statedef.MakeStateDefines(dyn_cast<PClassActor>(c->Type()->ParentClass)); statedef.MakeStateDefines(ValidateActor(c->Type()->ParentClass));
int numframes = 0; int numframes = 0;
for (auto s : c->States) for (auto s : c->States)