- Added Gez's actor replacement per skill submission.

SVN r1681 (trunk)
This commit is contained in:
Christoph Oelckers 2009-06-26 17:17:52 +00:00
commit 5a80938b11
5 changed files with 103 additions and 9 deletions

View file

@ -48,9 +48,13 @@
#include "p_local.h"
#include "templates.h"
#include "cmdlib.h"
#include "g_level.h"
extern void LoadActors ();
extern TArray<FSkillInfo> AllSkills;
//==========================================================================
//
//
@ -164,9 +168,10 @@ void FActorInfo::RegisterIDs ()
//
//==========================================================================
FActorInfo *FActorInfo::GetReplacement ()
FActorInfo *FActorInfo::GetReplacement (bool lookskill)
{
if (Replacement == NULL)
FName skillrepname = AllSkills[gameskill].GetReplacement(this->Class->TypeName);
if (Replacement == NULL && (!lookskill || skillrepname == NAME_None))
{
return this;
}
@ -174,7 +179,18 @@ FActorInfo *FActorInfo::GetReplacement ()
// potential infinite recursion.
FActorInfo *savedrep = Replacement;
Replacement = NULL;
FActorInfo *rep = savedrep->GetReplacement ();
FActorInfo *rep = savedrep;
// Handle skill-based replacement here. It has precedence on DECORATE replacement
// in that the skill replacement is applied first, followed by DECORATE replacement
// on the actor indicated by the skill replacement.
if (lookskill && skillrepname != NAME_None && PClass::FindClass(skillrepname) != NULL)
{
rep = PClass::FindClass(skillrepname)->ActorInfo;
}
// Now handle DECORATE replacement chain
// Skill replacements are not recursive, contrarily to DECORATE replacements
rep = rep->GetReplacement(false);
// Reset the temporarily NULLed field
Replacement = savedrep;
return rep;
}
@ -184,9 +200,10 @@ FActorInfo *FActorInfo::GetReplacement ()
//
//==========================================================================
FActorInfo *FActorInfo::GetReplacee ()
FActorInfo *FActorInfo::GetReplacee (bool lookskill)
{
if (Replacee == NULL)
FName skillrepname = AllSkills[gameskill].GetReplacedBy(this->Class->TypeName);
if (Replacee == NULL && (!lookskill || skillrepname == NAME_None))
{
return this;
}
@ -194,7 +211,12 @@ FActorInfo *FActorInfo::GetReplacee ()
// potential infinite recursion.
FActorInfo *savedrep = Replacee;
Replacee = NULL;
FActorInfo *rep = savedrep->GetReplacee ();
FActorInfo *rep = savedrep;
if (lookskill && skillrepname != NAME_None && PClass::FindClass(skillrepname) != NULL)
{
rep = PClass::FindClass(skillrepname)->ActorInfo;
}
rep = rep->GetReplacee (false);
Replacee = savedrep;
return rep;
}