ALERROR CEffectCreator::CreateSimpleFromXML (SDesignLoadCtx &Ctx, CXMLElement *pDesc, const CString &sUNID, CEffectCreator **retpCreator) // CreateSimpleFromXML // // Creates the creator from an XML element { ALERROR error; CEffectCreator *pCreator; // Create the effect based on the tag if (error = CreateFromTag(pDesc->GetTag(), &pCreator)) { Ctx.sError = strPatternSubst(CONSTLIT("Invalid painter tag: %s"), pDesc->GetTag()); return error; } if (pCreator == NULL) return ERR_MEMORY; pCreator->m_sUNID = sUNID; // Type-specific creation if (error = pCreator->OnEffectCreateFromXML(Ctx, pDesc, sUNID)) return error; // Done *retpCreator = pCreator; return NOERROR; }
ALERROR CEffectCreator::CreateBeamEffect (SDesignLoadCtx &Ctx, CXMLElement *pDesc, const CString &sUNID, CEffectCreator **retpCreator) // CreateBeamEffect // // Create a beam effect { ALERROR error; // Create the effect CEffectCreator *pCreator = new CBeamEffectCreator; pCreator->m_sUNID = sUNID; // Type-specific creation if (error = pCreator->OnEffectCreateFromXML(Ctx, pDesc, sUNID)) return error; // Done *retpCreator = pCreator; return NOERROR; }
ALERROR CEffectCreator::CreateFromXML (SDesignLoadCtx &Ctx, CXMLElement *pDesc, const CString &sUNID, CEffectCreator **retpCreator) // CreateFromXML // // Creates the creator from an XML element { ALERROR error; CEffectCreator *pCreator; // Basic info CString sEffectUNID = sUNID; if (sEffectUNID.IsBlank()) { DWORD dwUNID = pDesc->GetAttributeInteger(UNID_ATTRIB); if (dwUNID) sEffectUNID = strFromInt(dwUNID, FALSE); else sEffectUNID = STR_NO_UNID; } // Create the effect based on the child tag if (pDesc->GetContentElementCount() == 0) { *retpCreator = NULL; return NOERROR; } else if (pDesc->GetContentElementCount() == 1) { if (error = CreateSimpleFromXML(Ctx, pDesc->GetContentElement(0), sEffectUNID, &pCreator)) return error; } else { pCreator = new CEffectGroupCreator; if (pCreator == NULL) return ERR_MEMORY; pCreator->m_sUNID = sEffectUNID; // Type-specific creation if (error = pCreator->OnEffectCreateFromXML(Ctx, pDesc, sEffectUNID)) return error; } // Sound Effect (resolved later) pCreator->m_dwSoundUNID = pDesc->GetAttributeInteger(SOUND_ATTRIB); pCreator->m_iSound = -1; // Done *retpCreator = pCreator; return NOERROR; }