// Ryzom - MMORPG Framework // Copyright (C) 2010 Winch Gate Property Limited // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as // published by the Free Software Foundation, either version 3 of the // License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #include "stdpch.h" #include "unblock_titles_sheet.h" #include "nel/georges/u_form_elm.h" #include "nel/misc/common.h" #include "game_share/fame.h" using namespace std; using namespace NLMISC; using namespace NLGEORGES; // Tokenize a string with space as separator static void tokenize (const string &zeString, vector &tokens) { tokens.clear(); string sTmp = zeString; while (!sTmp.empty()) { while (((sTmp[0] == ' ')||(sTmp[0] == ':')) && !sTmp.empty()) sTmp = sTmp.substr(1,sTmp.size()); if (sTmp.empty()) break; string::size_type nextseppos1 = sTmp.find(' '); string::size_type nextseppos2 = sTmp.find(':'); if ((nextseppos1 == string::npos) && (nextseppos2 == string::npos)) { tokens.push_back(sTmp); sTmp = ""; } else { if ((nextseppos1 != string::npos) && (nextseppos2 != string::npos)) nextseppos1 = min(nextseppos1, nextseppos2); else if (nextseppos2 != string::npos) nextseppos1 = nextseppos2; tokens.push_back (sTmp.substr(0, nextseppos1)); sTmp = sTmp.substr(nextseppos1+1, sTmp.size()); } } } // *************************************************************************** void CUnblockTitlesSheet::build(const UFormElm &item) { TitlesUnblock.resize (CHARACTER_TITLE::NB_CHARACTER_TITLE); const UFormElm *arrayTUElt = NULL; if( item.getNodeByName( &arrayTUElt, "Titles" ) ) { if( arrayTUElt ) { sint32 tmpLevel, tmpQuality; uint NbTitlesUnblock; nlverify( arrayTUElt->getArraySize( NbTitlesUnblock ) ); for (uint i = 0; i < NbTitlesUnblock; ++i) { const UFormElm* TUElt = NULL; if( ! ( arrayTUElt->getArrayNode( &TUElt, i ) && TUElt ) ) { nlwarning(" can't get array node of TitleUnblock in sheet"); } else { // Skill string TitleName; TUElt->getValueByName( TitleName, "Title" ); CHARACTER_TITLE::ECharacterTitle title = CHARACTER_TITLE::toCharacterTitle ( TitleName ); //nlassert( skill != SKILLS::unknown ); if (title >= CHARACTER_TITLE::NB_CHARACTER_TITLE) continue; bool bReserved = false; if( ! TUElt->getValueByName( bReserved, "Reserved" ) ) { nlwarning(" can't get node Reserved in sheet"); } string strSkillsNeeded; if( ! TUElt->getValueByName( strSkillsNeeded, "SkillsNeeded" ) ) { nlwarning(" can't get node SkillsNeeded in sheet"); } string strBricksNeeded; if( ! TUElt->getValueByName( strBricksNeeded, "BricksNeeded" ) ) { nlwarning(" can't get node SkillsNeeded in sheet"); } string strMinFames; if( ! TUElt->getValueByName( strMinFames, "MinFames" ) ) { nlwarning(" can't get node MinFames in sheet"); } string strMaxFames; if( ! TUElt->getValueByName( strMaxFames, "MaxFames" ) ) { nlwarning(" can't get node MaxFames in sheet"); } // cf TPVPClan enum (pvp_clan.h) if( ! TUElt->getValueByName( TitlesUnblock[title].CivNeeded, "CivNeeded" ) ) { nlwarning(" can't get node CivNeeded in sheet"); } // cf TPVPClan enum (pvp_clan.h) if( ! TUElt->getValueByName( TitlesUnblock[title].CultNeeded, "CultNeeded" ) ) { nlwarning(" can't get node CultNeeded in sheet"); } if( ! TUElt->getValueByName( TitlesUnblock[title].CharOldness, "CharOldness" ) ) { nlwarning(" can't get node CharOldness in sheet"); } if( ! TUElt->getValueByName( TitlesUnblock[title].CharPlayedTime, "CharPlayedTime" ) ) { nlwarning(" can't get node CharPlayedTime in sheet"); } if( ! TUElt->getValueByName( TitlesUnblock[title].AccountOldness, "AccountOldness" ) ) { nlwarning(" can't get node AccountOldness in sheet"); } if( ! TUElt->getValueByName( TitlesUnblock[title].AuthorRating, "AuthorRating" ) ) { nlwarning(" can't get node AuthorRating in sheet"); } if( ! TUElt->getValueByName( TitlesUnblock[title].AMRating, "AMRating" ) ) { nlwarning(" can't get node AMRating in sheet"); } if( ! TUElt->getValueByName( TitlesUnblock[title].OrganizerRating, "OrganizerRating" ) ) { nlwarning(" can't get node OrganizerRating in sheet"); } string strItemsNeeded; if( ! TUElt->getValueByName( strItemsNeeded, "ItemsNeeded" ) ) { nlwarning(" can't get node ItemsNeeded in sheet"); } uint j; TitlesUnblock[title].Reserved = bReserved; if( !strSkillsNeeded.empty() ) { uint16 skillsNeededSz = (uint16)TitlesUnblock[title].SkillsNeeded.size(); TitlesUnblock[title].SkillsNeeded.resize(skillsNeededSz+1); TitlesUnblock[title].SkillsLevelNeeded.resize(skillsNeededSz+1); vector vSkill; tokenize(strSkillsNeeded, vSkill); for (j = 0; j < vSkill.size()/2; ++j) { TitlesUnblock[title].SkillsNeeded[skillsNeededSz].push_back(vSkill[j*2]); fromString(vSkill[j*2+1], tmpLevel); TitlesUnblock[title].SkillsLevelNeeded[skillsNeededSz].push_back(tmpLevel); } } if( !strBricksNeeded.empty() ) { vector vBrick; tokenize(strBricksNeeded, vBrick); for (j = 0; j < vBrick.size(); ++j) { TitlesUnblock[title].BricksNeeded.push_back(CSheetId(vBrick[j]+".sbrick")); } } if( !strMinFames.empty() ) { vector vFame; tokenize(strMinFames, vFame); for (j = 0; j < vFame.size()/2; ++j) { PVP_CLAN::TPVPClan clan = PVP_CLAN::fromString(vFame[j*2]); if( clan != PVP_CLAN::Unknown ) { uint32 factionIndex = PVP_CLAN::getFactionIndex( clan ); nlassert(factionIndex != CStaticFames::INVALID_FACTION_INDEX); TitlesUnblock[title].MinFames.push_back(factionIndex); fromString(vFame[j*2+1], tmpLevel); TitlesUnblock[title].MinFameLevels.push_back(tmpLevel); } } } if( !strMaxFames.empty() ) { vector vFame; tokenize(strMaxFames, vFame); for (j = 0; j < vFame.size()/2; ++j) { PVP_CLAN::TPVPClan clan = PVP_CLAN::fromString(vFame[j*2]); if( clan != PVP_CLAN::Unknown ) { uint32 factionIndex = PVP_CLAN::getFactionIndex( clan ); nlassert(factionIndex != CStaticFames::INVALID_FACTION_INDEX); TitlesUnblock[title].MaxFames.push_back(factionIndex); fromString(vFame[j*2+1], tmpLevel); TitlesUnblock[title].MaxFameLevels.push_back(tmpLevel); } } } if( !strItemsNeeded.empty() ) { uint16 itemsNeededSz = (uint16)TitlesUnblock[title].ItemsNeeded.size(); TitlesUnblock[title].ItemsNeeded.resize(itemsNeededSz+1); TitlesUnblock[title].ItemsQualityNeeded.resize(itemsNeededSz+1); vector vItem; tokenize(strItemsNeeded, vItem); for (j = 0; j < vItem.size()/2; ++j) { TitlesUnblock[title].ItemsNeeded[itemsNeededSz].push_back(CSheetId(vItem[j*2]+".sitem")); fromString(vItem[j*2+1], tmpQuality); TitlesUnblock[title].ItemsQualityNeeded[itemsNeededSz].push_back(tmpQuality); } } } } } } }