Files
2026-06-01 12:46:52 +02:00

392 lines
7.0 KiB
Objective-C

#pragma once
#include "EqExpr.h"
#include <toolkit/nsl.h>
#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