// 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 "item_special_effect.h" #include "nel/misc/algo.h" #include "nel/misc/i18n.h" #include "../sheet_manager.h" using namespace std; using namespace NLMISC; CItemSpecialEffectHelper::CItemSpecialEffectHelper() { // Register special effects registerItemSpecialEffect("ISE_FIGHT_ADD_CRITICAL"); registerItemSpecialEffect("ISE_FIGHT_VAMPIRISM"); registerItemSpecialEffect("ISE_MAGIC_DIVINE_INTERVENTION"); registerItemSpecialEffect("ISE_MAGIC_SHOOT_AGAIN"); registerItemSpecialEffect("ISE_CRAFT_ADD_STAT_BONUS"); registerItemSpecialEffect("ISE_CRAFT_ADD_LIMIT"); registerItemSpecialEffect("ISE_FORAGE_ADD_RM"); registerItemSpecialEffect("ISE_FORAGE_NO_RISK"); } CItemSpecialEffectHelper* CItemSpecialEffectHelper::getInstance() { // Singleton static CItemSpecialEffectHelper* instance = NULL; if (instance == NULL) instance = new CItemSpecialEffectHelper; return instance; } void CItemSpecialEffectHelper::registerItemSpecialEffect(const string &name) { // store parameters to be replaced in UIstring vector params; // get ui string ucstring ucs = CI18N::get("uiItemFX_" + name); CSString p, s = ucs.toString(); // locate and store parameters // %p : percent // %n : integer // %r : real // %s : string p = s.splitTo('%', true); while (p.size() > 0 && s.size() > 0) { if (s[0] == 'p' || s[0] == 'n' || s[0] == 'r' || s[0] == 's') { string tmp = "%"; tmp += s[0]; if (s.size() >=2 && isdigit(s[1])) tmp += s[1]; params.push_back(tmp); } p = s.splitTo('%', true); } effectMap.insert(make_pair(name, params)); } void CItemSpecialEffectHelper::getItemSpecialEffectText(const CItemSheet *pIS, ucstring &itemText) { // check if some effects are present on this item bool firstEffect = false; ucstring effects; effects += getEffect(pIS->getEffect1(), firstEffect); effects += getEffect(pIS->getEffect2(), firstEffect); effects += getEffect(pIS->getEffect3(), firstEffect); effects += getEffect(pIS->getEffect4(), firstEffect); if(!effects.empty()) effects += "\n"; // Display special effects info. strFindReplace(itemText, "%special_effects", effects); } ucstring CItemSpecialEffectHelper::getEffect(const std::string &effect, bool &first) { ucstring result; CSString eff = effect; if (eff.empty()) return result; // Get name id of effect CSString name = toUpper(eff.splitTo(':', true)); // Extract parameters from sheet vector params; CSString param = eff.splitTo(':', true); while (!param.empty()) { params.push_back(param); param = eff.splitTo(':', true); } // Check number of arguments uint n = (uint)(effectMap[name]).size(); if (params.size() != n) { nlinfo("Bad arguments for : %s", effect.c_str()); return result; } // Get translated ui string result = CI18N::get("uiItemFX_" + name); // Add endline if it's not the first if (!first) first = true; else result = "\n" + result; // Replace each parameters with value from sheet //nlinfo("name = %s", name.c_str()); for (uint i=0 ; i