本文整理汇总了C++中CDesignType::PrepareBindDesign方法的典型用法代码示例。如果您正苦于以下问题:C++ CDesignType::PrepareBindDesign方法的具体用法?C++ CDesignType::PrepareBindDesign怎么用?C++ CDesignType::PrepareBindDesign使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类CDesignType
的用法示例。
在下文中一共展示了CDesignType::PrepareBindDesign方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: BindDesign
//.........这里部分代码省略.........
}
}
// If this is a new game, then create all the Template types
if (Ctx.bNewGame)
{
m_DynamicUNIDs.DeleteAll();
m_DynamicTypes.DeleteAll();
if (error = FireOnGlobalTypesInit(Ctx))
return error;
if (error = CreateTemplateTypes(Ctx))
return error;
}
// Add all the dynamic types. These came either from the saved game file or
// from the Template types above.
for (i = 0; i < m_DynamicTypes.GetCount(); i++)
m_AllTypes.AddOrReplaceEntry(m_DynamicTypes.GetType(i));
// Initialize the byType lists
for (i = 0; i < m_AllTypes.GetCount(); i++)
{
CDesignType *pEntry = m_AllTypes.GetEntry(i);
m_ByType[pEntry->GetType()].AddEntry(pEntry);
}
// Set our adventure desc as current; since adventure descs are always
// loaded this is the only thing that we can use to tell if we should
// call global events.
//
// This must happen after Unbind (because that clears it) and before
// PrepareBindDesign.
//
// NOTE: m_pAdventureDesc can be NULL (e.g., in the intro screen).
if (m_pAdventureDesc)
m_pAdventureDesc->SetCurrentAdventure();
// Cache a map between currency name and economy type
// We need to do this before Bind because some types will lookup
// a currency name during Bind.
m_EconomyIndex.DeleteAll();
for (i = 0; i < GetCount(designEconomyType); i++)
{
CEconomyType *pEcon = CEconomyType::AsType(GetEntry(designEconomyType, i));
const CString &sName = pEcon->GetSID();
bool bUnique;
CEconomyType **ppDest = m_EconomyIndex.SetAt(sName, &bUnique);
if (!bUnique)
return pEcon->ComposeLoadError(Ctx, CONSTLIT("Currency ID must be unique"));
*ppDest = pEcon;
}
// Prepare to bind. This is used by design elements
// that need two passes to bind.
for (i = 0; i < m_AllTypes.GetCount(); i++)
{
CDesignType *pEntry = m_AllTypes.GetEntry(i);
if (error = pEntry->PrepareBindDesign(Ctx))
return error;
}
// Now call Bind on all active design entries
for (i = 0; i < evtCount; i++)
m_EventsCache[i]->DeleteAll();
for (i = 0; i < m_AllTypes.GetCount(); i++)
{
CDesignType *pEntry = m_AllTypes.GetEntry(i);
if (error = pEntry->BindDesign(Ctx))
return error;
// Cache some global events. We keep track of the global events for
// all types so that we can access them faster.
CacheGlobalEvents(pEntry);
}
// Finish binding. This pass is used by design elements
// that need to do stuff after all designs are bound.
for (i = 0; i < m_AllTypes.GetCount(); i++)
{
CDesignType *pEntry = m_AllTypes.GetEntry(i);
if (error = pEntry->FinishBindDesign(Ctx))
return error;
}
return NOERROR;
}
示例2: AddDynamicType
ALERROR CDesignCollection::AddDynamicType (SExtensionDesc *pExtension, DWORD dwUNID, const CString &sSource, bool bNewGame, CString *retsError)
// AddDynamicType
//
// Adds a dynamic type at runtime
{
ALERROR error;
// If we're pass game-create, the UNID must not already exist
if (!bNewGame && FindEntry(dwUNID))
{
if (retsError)
*retsError = strPatternSubst(CONSTLIT("Type already exists: %x"), dwUNID);
return ERR_FAIL;
}
// Add it to the dynamics table
CDesignType *pType;
if (error = m_DynamicTypes.DefineType(pExtension, dwUNID, sSource, &pType, retsError))
return error;
// Make sure that the type can be created at this point.
// For example, we can't create SystemMap types after the game has started.
switch (pType->GetType())
{
case designAdventureDesc:
case designGlobals:
case designImage:
case designSound:
case designEconomyType:
case designTemplateType:
{
m_DynamicTypes.Delete(dwUNID);
if (retsError)
*retsError = CONSTLIT("Dynamic design type not supported.");
return ERR_FAIL;
}
case designSystemType:
case designSystemTable:
case designSystemMap:
{
if (!bNewGame)
{
m_DynamicTypes.Delete(dwUNID);
if (retsError)
*retsError = CONSTLIT("Dynamic design type not supported after new game created.");
return ERR_FAIL;
}
}
}
// Since we've already bound, we need to simulate that here (although we
// [obviously] don't allow existing types to bind to dynamic types).
//
// We start by adding the type to the AllTypes list
m_AllTypes.AddOrReplaceEntry(pType);
// If this is new game time, then it means that we are inside of BindDesign. In
// that case, we don't do anything more (since BindDesign will take care of
// it).
if (!bNewGame)
{
// Next we add it to the specific type tables
m_ByType[pType->GetType()].AddEntry(pType);
// Bind
SDesignLoadCtx Ctx;
Ctx.pExtension = pExtension;
Ctx.bNewGame = bNewGame;
if (error = pType->PrepareBindDesign(Ctx))
{
m_AllTypes.Delete(dwUNID);
m_ByType[pType->GetType()].Delete(dwUNID);
m_DynamicTypes.Delete(dwUNID);
if (retsError)
*retsError = Ctx.sError;
return error;
}
if (error = pType->BindDesign(Ctx))
{
m_AllTypes.Delete(dwUNID);
m_ByType[pType->GetType()].Delete(dwUNID);
m_DynamicTypes.Delete(dwUNID);
if (retsError)
*retsError = Ctx.sError;
return error;
}
// Cache some global events
//.........这里部分代码省略.........
示例3: BindDesign
//.........这里部分代码省略.........
DEBUG_TRY
if (m_pAdventureDesc)
m_pAdventureDesc->SetCurrentAdventure();
DEBUG_CATCH_MSG("Crash setting current adventure.");
// Cache a map between currency name and economy type
// We need to do this before Bind because some types will lookup
// a currency name during Bind.
DEBUG_TRY
m_EconomyIndex.DeleteAll();
for (i = 0; i < GetCount(designEconomyType); i++)
{
CEconomyType *pEcon = CEconomyType::AsType(GetEntry(designEconomyType, i));
const CString &sName = pEcon->GetSID();
bool bUnique;
CEconomyType **ppDest = m_EconomyIndex.SetAt(sName, &bUnique);
if (!bUnique)
{
pEcon->ComposeLoadError(Ctx, CONSTLIT("Currency ID must be unique"));
*retsError = Ctx.sError;
return ERR_FAIL;
}
*ppDest = pEcon;
}
DEBUG_CATCH_MSG("Crash initializing economies.");
// Prepare to bind. This is used by design elements that need two passes
// to bind. We also use it to set up the inheritence hierarchy, which means
// that we rely on the map from UNID to valid design type (m_AllTypes)
m_DisplayAttribs.DeleteAll();
DEBUG_TRY
for (i = 0; i < m_AllTypes.GetCount(); i++)
{
CDesignType *pEntry = m_AllTypes.GetEntry(i);
if (error = pEntry->PrepareBindDesign(Ctx))
{
*retsError = Ctx.sError;
return error;
}
// We take this opportunity to build a list of display attributes
// defined by each type.
const CDisplayAttributeDefinitions &Attribs = pEntry->GetDisplayAttributes();
if (!Attribs.IsEmpty())
m_DisplayAttribs.Append(Attribs);
}
DEBUG_CATCH_MSG("Crash in PrepareBind.");
// Now call Bind on all active design entries
for (i = 0; i < evtCount; i++)
m_EventsCache[i]->DeleteAll();
DEBUG_TRY
for (i = 0; i < m_AllTypes.GetCount(); i++)
{
CDesignType *pEntry = m_AllTypes.GetEntry(i);
if (error = pEntry->BindDesign(Ctx))
{
*retsError = Ctx.sError;
return error;
}
// Cache some global events. We keep track of the global events for
// all types so that we can access them faster.
CacheGlobalEvents(pEntry);
}
DEBUG_CATCH_MSG("Crash in BindDesign.");
// Finish binding. This pass is used by design elements
// that need to do stuff after all designs are bound.
DEBUG_TRY
for (i = 0; i < m_AllTypes.GetCount(); i++)
{
CDesignType *pEntry = m_AllTypes.GetEntry(i);
if (error = pEntry->FinishBindDesign(Ctx))
{
*retsError = Ctx.sError;
return error;
}
}
DEBUG_CATCH_MSG("Crash in FinishBind.");
// Remember what we bound
m_BoundExtensions = BindOrder;
return NOERROR;
DEBUG_CATCH
}