// --[ Method ]--------------------------------------------------------------- // // - Class : CEffect // - prototype : bool Parse(CAdvancedParser* pParser) // // - Purpose : Parses an effect. The parser has only the text data of // the effect, not of the whole script. // // ----------------------------------------------------------------------------- bool CEffect::Parse(CAdvancedParser* pParser) { assert(pParser); assert(pParser->Ready()); // General info pParser->ResetPos(); if(!pParser->ReadKeyFloat("#Begin", '=', &m_fBegin, CParser::SEARCH_WHOLEDATA)) return false; if(!pParser->ReadKeyFloat("#End", '=', &m_fEnd, CParser::SEARCH_WHOLEDATA)) return false; if(!pParser->ReadKeyInt ("#Layer", '=', &m_nLayer, CParser::SEARCH_WHOLEDATA)) return false; // Resources int nError = 0; pParser->ResetPos(); while(-1 != pParser->Find("#Resource", CParser::SEARCH_FROMCURPOS)) { std::string strClass, strName, strValue; if(!pParser->ReadKeyString("#Name", '=', &strName, CParser::SEARCH_INCURLINE)) nError++; if(!pParser->ReadKeyString("#Class", '=', &strClass, CParser::SEARCH_INCURLINE)) nError++; if(!pParser->ReadKeyString("#Value", '=', &strValue, CParser::SEARCH_INCURLINE)) nError++; if(nError) { LOG.Write("\nERROR - CEffect::Parse(): Error parsing resource."); return false; } int i = GetResourceIndex(strName); if(i == -1) { LOG.Write("\nERROR - CEffect::Parse(): Resource \"%s\" doesn't belong to this effect.", strName.data()); return false; } std::string strClassAux; GetResourceClassName(i, &strClassAux); if(strClassAux != strClass) { LOG.Write("\nERROR - CEffect::Parse(): Error parsing resource \"%s\". Class=%s (expected %s)", strName.data(), strClass.data(), strClassAux.data()); return false; } if(!SetResourceValue(i, strValue)) { LOG.Write("\nERROR - CEffect::Parse(): Error setting resource \"%s\" value.", strName.data()); return false; } } // Variables pParser->ResetPos(); while(-1 != pParser->Find("#Var", CParser::SEARCH_FROMCURPOS)) { std::string strClass, strName; if(!pParser->ReadKeyString("#Name", '=', &strName, CParser::SEARCH_INCURLINE)) nError++; if(!pParser->ReadKeyString("#Class", '=', &strClass, CParser::SEARCH_INCURLINE)) nError++; if(nError) { LOG.Write("\nERROR - CEffect::Parse(): Error parsing var."); return false; } CVar* pVar = GetVar(strName); if(!pVar) { LOG.Write("\nERROR - CEffect::Parse(): Error parsing var. \"%s\" doesn't belong to this effect", strName.data()); return false; } if(pVar->GetClassName() != strClass) { LOG.Write("\nERROR - CEffect::Parse(): Error parsing var \"%s\". Class=%s (expected %s)", strName.data(), strClass.data(), pVar->GetClassName().data()); return false; } if(!pVar->Parse(pParser)) { LOG.Write("\nERROR - CEffect::Parse(): Error parsing var \"%s\" (CVar::Parse() failed).", strName.data()); return false; } } // Commands pParser->ResetPos(); while(-1 != pParser->Find("#Command", CParser::SEARCH_FROMCURPOS)) { std::string strCommand; float fTime; if(!pParser->ReadStringBetweenChars('<', '>', &strCommand, CParser::SEARCH_INCURLINE, true)) nError++; if(!pParser->ReadKeyFloat ("#Time", '=', &fTime, CParser::SEARCH_INCURLINE)) nError++; if(nError) { LOG.Write("\nERROR - CEffect::Parse(): Error parsing command."); return false; } AddCommand(fTime, strCommand); } return true; }