add Actor type registration

This commit is contained in:
Chris Danford
2005-02-09 05:31:14 +00:00
parent 1de61aa8ae
commit 8c53c62f2b
3 changed files with 53 additions and 2 deletions
+30
View File
@@ -15,10 +15,36 @@
#include "XmlFile.h"
#include "FontCharAliases.h"
#include "LuaManager.h"
#include "MessageManager.h"
#include "arch/Dialog/Dialog.h"
// Actor registration
static map<CString,CreateActorFn> *g_pmapRegistrees = NULL;
void ActorUtil::Register( const CString& sClassName, CreateActorFn pfn )
{
if( g_pmapRegistrees == NULL )
g_pmapRegistrees = new map<CString,CreateActorFn>;
map<CString,CreateActorFn>::iterator iter = g_pmapRegistrees->find( sClassName );
ASSERT_M( iter == g_pmapRegistrees->end(), ssprintf("Actor class '%s' already registered.", sClassName.c_str()) );
(*g_pmapRegistrees)[sClassName] = pfn;
}
Actor* ActorUtil::Create( const CString& sClassName, const CString& sDir, const XNode* pNode )
{
map<CString,CreateActorFn>::iterator iter = g_pmapRegistrees->find( sClassName );
ASSERT_M( iter != g_pmapRegistrees->end(), ssprintf("Actor '%s' is not registered.",sClassName.c_str()) )
CreateActorFn pfn = iter->second;
return pfn( sDir, pNode );
}
Actor* ActorUtil::LoadFromActorFile( const CString& sAniDir, const XNode* pNode )
{
ASSERT( pNode );
@@ -63,6 +89,10 @@ Actor* ActorUtil::LoadFromActorFile( const CString& sAniDir, const XNode* pNode
p->LoadFromNode( sAniDir, pNode );
pActor = p;
}
else if( sType == "GenreDisplay" )
{
pActor = ActorUtil::Create( sType, sAniDir, pNode );
}
else if( sType == "ActorFrame" )
{
ActorFrame *p = new ActorFrame;