#pragma once #include "EqExpr.h" #include #include "SStringDB.h" #include "StringDBHelper.h" /// 2011.03.22 - prodongi namespace rp { // template namespace template< typename numeric_t > struct expr_functions : public expr< numeric_t > { /** @class Replace @brief 사용: rep( A, '1', B, '2', C ) @warning 설명: 문자열 A 에서 1 -> B, 2 -> C 로 치환한다. */ class Replace : public Function { public: virtual IExpressionPtr create() { return new Replace(); } virtual void push_back( IExpressionPtr expr ) { while( !expr->empty() ) { IExpressionPtr arg = expr->back(); expr->pop_back(); mArgs.push_back( arg ); } } virtual numeric_t toNumber() const { if( mArgs.empty() ) return 0.f; return (float)::atof( toString().c_str() ); } virtual std::string toString() const { if( mArgs.empty() ) return ""; unsigned int argCount = (unsigned int)mArgs.size(); std::string buffer = mArgs[ 0 ]->toString(); if( argCount > 1 ) { ArgContainer::const_iterator it = mArgs.begin() + 1, end = mArgs.end(); while( it != end ) { std::string source( (*it)->toString() ); std::string dest; ++it; if( it != end ) { dest = (*it)->toString(); ++it; } nsl::replace( buffer, source, dest ); } } return buffer; } }; /** @class StringDb @brief 사용: $1005 or $(1000+x) 등등 @warning 설명: 스트링 DB 에서 1005 번을 찾아 문자열로 치환한다. */ class StringDb : public Function { public: virtual IExpressionPtr create() { return new StringDb(); } virtual numeric_t toNumber() const { if( mArgs.empty() ) return 0.f; int id = mArgs[ 0 ]->toNumber(); return ::atof( GetStringDB().GetString( id ) ); } virtual std::string toString() const { if( mArgs.empty() ) return ""; int id = mArgs[ 0 ]->toNumber(); return GetStringDB().GetString( id ); } }; /// TenacityDb_NameId class TenacityDb_NameId : public Function { public: virtual IExpressionPtr create() { return new TenacityDb_NameId(); } virtual numeric_t toNumber() const { if( mArgs.empty() ) return 0.f; int id = mArgs[ 0 ]->toNumber(); return GetTenacityDB().GetNameID( id ); } virtual std::string toString() const { if( mArgs.empty() ) return ""; int id = mArgs[ 0 ]->toNumber(); std::string nameId; ntos( (int)GetTenacityDB().GetNameID( id ), nameId ); return nameId; } }; /// 2011.04.27 SkillDb_NameId - prodongi class SkillDb_NameId : public Function { public: virtual IExpressionPtr create() { return new SkillDb_NameId(); } virtual numeric_t toNumber() const { if( mArgs.empty() ) return 0.f; int id = mArgs[ 0 ]->toNumber(); return GetSkillDB().GetStringID(id); } virtual std::string toString() const { if( mArgs.empty() ) return ""; int id = mArgs[ 0 ]->toNumber(); std::string nameId; ntos( (int)GetSkillDB().GetStringID( id ), nameId ); return nameId; } }; /// ItemDb_Item class ItemDb_Item : public Function { public: virtual IExpressionPtr create() { return new ItemDb_Item(); } virtual numeric_t toNumber() const { if( mArgs.empty() ) return 0.f; int id = (int)mArgs[ 0 ]->toNumber(); return (int)GetItemDB().GetItemData( id ); } virtual std::string toString() const { if( mArgs.empty() ) return ""; int id = (int)mArgs[ 0 ]->toNumber(); std::string itemInstance; ntos( (int)GetItemDB().GetItemData( id ), itemInstance ); return itemInstance; } }; /// ItemDb_NameId class ItemDb_NameId : public Function { public: virtual IExpressionPtr create() { return new ItemDb_NameId(); } virtual numeric_t toNumber() const { if( mArgs.empty() ) return 0.f; int id = (int)mArgs[ 0 ]->toNumber(); const ItemBaseEx_info* item = GetItemDB().GetItemData( id ); if( !item ) return 0.f; return (int)item->nNameId; } virtual std::string toString() const { if( mArgs.empty() ) return ""; int id = (int)mArgs[ 0 ]->toNumber(); const ItemBaseEx_info* item = GetItemDB().GetItemData( id ); if( !item ) return ""; std::string nameId; ntos( (int)item->nNameId, nameId ); return nameId; } }; /// 2011.03.17 - prodongi class RaceName : public Function { public: virtual IExpressionPtr create() { return new RaceName(); } virtual numeric_t toNumber() const { if( mArgs.empty() ) return 0.f; int id = (int)mArgs[ 0 ]->toNumber(); return id; } virtual std::string toString() const { if( mArgs.empty() ) return ""; int id = (int)mArgs[ 0 ]->toNumber(); std::string name; int stringId = 0; if (8 == id) { name = GetStringDB().GetString(8034); } else { if (1 & id) name += GetStringDB().GetString(3); if (2 & id) name += GetStringDB().GetString(2); if (4 & id) name += GetStringDB().GetString(1); } return name; } }; /// 2011.03.17 - prodongi class AttributeName : public Function { public: virtual IExpressionPtr create() { return new AttributeName(); } virtual numeric_t toNumber() const { if( mArgs.empty() ) return 0.f; int id = (int)mArgs[ 0 ]->toNumber(); return id; } virtual std::string toString() const { if( mArgs.empty() ) return ""; int id = (int)mArgs[ 0 ]->toNumber(); return StringDBHelper::getDmgAttriName(id); } }; /// 2011.03.18 계열 이름 - prodongi class DescentName : public Function { public: virtual IExpressionPtr create() { return new DescentName(); } virtual numeric_t toNumber() const { if( mArgs.empty() ) return 0.f; int id = (int)mArgs[ 0 ]->toNumber(); return id; } virtual std::string toString() const { if( mArgs.empty() ) return ""; int id = (int)mArgs[ 0 ]->toNumber(); return StringDBHelper::getDescentName(id); } }; /// 2011.03.18 비트 셋 이름 - prodongi class BitSetNameA : public Function { public: virtual IExpressionPtr create() { return new BitSetNameA(); } virtual numeric_t toNumber() const { if( mArgs.empty() ) return 0.f; int id = (int)mArgs[ 0 ]->toNumber(); return id; } virtual std::string toString() const { if( mArgs.empty() ) return ""; unsigned int BitsetID = (int)mArgs[ 0 ]->toNumber(); std::string str; StringDBHelper::getBitSetANameList(BitsetID, ", ", str); return str; } }; /// 2011.04.12 비트 셋 이름 - prodongi class BitSetNameB : public Function { public: virtual IExpressionPtr create() { return new BitSetNameB(); } virtual numeric_t toNumber() const { if( mArgs.empty() ) return 0.f; int id = (int)mArgs[ 0 ]->toNumber(); return id; } virtual std::string toString() const { if( mArgs.empty() ) return ""; unsigned int BitsetID = (int)mArgs[ 0 ]->toNumber(); std::string str; StringDBHelper::getBitSetBNameList(BitsetID, ", ", str); return str; } }; }; // expr_functions } // rp