#include "cocos2d.h"
#include "LuaAction.h"
#include "tolua_fix.h"
USING_NS_CC;
void LuaParamNil::push(lua_State* L)
{
lua_pushnil(L);
}
const char* LuaParamNil::description()
{
return "nil";
}
LuaParamBool::LuaParamBool(BOOL p)
{
m_value = p;
}
void LuaParamBool::push(lua_State* L)
{
lua_pushboolean(L, m_value);
}
const char* LuaParamBool::description()
{
static char buff[64];
sprintf(buff, "bool<%d>", m_value);
return buff;
}
LuaParamInt::LuaParamInt(int p)
{
m_value = p;
}
void LuaParamInt::push(lua_State* L)
{
lua_pushnumber(L, m_value);
}
const char* LuaParamInt::description()
{
static char buff[64];
sprintf(buff, "int<%d>", m_value);
return buff;
}
LuaParamString::LuaParamString(const char* p)
{
m_value = p;
}
void LuaParamString::push(lua_State* L)
{
lua_pushstring(L, m_value.c_str());
}
const char* LuaParamString::description()
{
static char buff[64];
sprintf(buff, "string<%s>", m_value.c_str());
return buff;
}
LuaParamTable::~LuaParamTable()
{
map<int, BaseLuaParam*>::iterator iter1 = m_array.begin();
for (;iter1 != m_array.end(); iter1++)
{
delete (iter1->second);
}
m_array.clear();
map<string, BaseLuaParam*>::iterator iter2 = m_map.begin();
for (;iter2 != m_map.end(); iter2++)
{
delete (iter2->second);
}
m_map.clear();
}
void LuaParamTable::push(lua_State* L)
{
lua_newtable(L); //新建一个table并压入栈顶
map<int, BaseLuaParam*>::iterator iter = m_array.begin();
for(; iter != m_array.end(); iter++)
{
int num = iter->first;
(iter->second)->push(L);
lua_rawseti(L, -2, num);
}
map<string, BaseLuaParam*>::iterator iter2 = m_map.begin();
for (;iter2 != m_map.end(); iter2++)
{
(iter2->second)->push(L);
lua_setfield(L, -2, iter2->first.c_str());
}
}
const char* LuaParamTable::description()
{
static char buff[64];
sprintf(buff, "table<%d>", m_array.size());
return buff;
}
//设置一个key-table
void LuaParamTable::setTable(const char* key, LuaParamTable* p)
{
map<string, BaseLuaParam*>::iterator iter = m_map.find(key);
if (iter != m_map.end())
{
delete iter->second;
m_map.erase(iter);
}
m_map[key] = p;
}
//设置一个int-bool
void LuaParamTable::setBool(int index, BOOL p)
{
LuaParamBool* param = new LuaParamBool(p);
map<int, BaseLuaParam*>::iterator iter = m_array.find(index);
if (iter != m_array.end())
{
delete iter->second;
m_array.erase(iter);
}
m_array[index] = param;
}
//设置一个int-int
void LuaParamTable::setInt(int index, int p)
{
LuaParamInt* param = new LuaParamInt(p);
map<int, BaseLuaParam*>::iterator iter = m_array.find(index);
if (iter != m_array.end())
{
delete iter->second;
m_array.erase(iter);
}
m_array[index] = param;
}
//设置一个int-string
void LuaParamTable::setString(int index, const char* p)
{
LuaParamString* param = new LuaParamString(p);
map<int, BaseLuaParam*>::iterator iter = m_array.find(index);
if (iter != m_array.end())
{
delete iter->second;
m_array.erase(iter);
}
m_array[index] = param;
}
//设置一个int-table
void LuaParamTable::setTable(int index, LuaParamTable* p)
{
map<int, BaseLuaParam*>::iterator iter = m_array.find(index);
if (iter != m_array.end())
{
delete iter->second;
m_array.erase(iter);
}
m_array[index] = p;
}
//设置一个key-bool
void LuaParamTable::setBool(const char* key, BOOL p)
{
LuaParamBool* param = new LuaParamBool(p);
map<string, BaseLuaParam*>::iterator iter = m_map.find(key);
if (iter != m_map.end())
{
delete iter->second;
m_map.erase(iter);
}
m_map[key] = param;
}
//设置一个key-int
void LuaParamTable::setInt(const char* key, int p)
{
LuaParamInt* param = new LuaParamInt(p);
map<string, BaseLuaParam*>::iterator iter = m_map.find(key);
if (iter != m_map.end())
{
delete iter->second;
m_map.erase(iter);
}
m_map[key] = param;
}
//设置一个key-string
void LuaParamTable::setString(const char* key, const char* p)
{
LuaParamString* param = new LuaParamString(p);
map<string, BaseLuaParam*>::iterator iter = m_map.find(key);
if (iter != m_map.end())
{
delete iter->second;
m_map.erase(iter);
}
m_map[key] = param;
}
//index:起始1
int LuaParamTable::getIntByIndex(int index)
{
map<int, BaseLuaParam*>::iterator iter = m_array.find(index);
if(iter != m_array.end())
{
BaseLuaParam* param = m_array[index];
LuaParamInt* intparam = dynamic_cast<LuaParamInt*>(param);
if (param != NULL)
{
return intparam->getValue();
}
}
return 0;
}
//index:起始1
string LuaParamTable::getStringByIndex(int index)
{
map<int, BaseLuaParam*>::iterator iter = m_array.find(index);
if(iter != m_array.end())
{
BaseLuaParam* param = m_array[index];
LuaParamString* stringparam = dynamic_cast<LuaParamString*>(param);
if (param != NULL)
{
return stringparam->getValue();
}
}
return "";
}
//index:起始1
BOOL LuaParamTable::swapTableByIndex(int index, LuaParamTable* table)
{
map<int, BaseLuaParam*>::iterator iter = m_array.find(index);
if(iter != m_array.end())
{
BaseLuaParam* param = m_array[index];
LuaParamTable* stringparam = dynamic_cast<LuaParamTable*>(param);
if (param != NULL)
{
stringparam->swap(table);
return TRUE;
}
}
return FALSE;
}
//INT数组的容量
int LuaParamTable::getArraySize()
{
return m_array.size();
}
int LuaParamTable::getIntByKey(const char* key)
{
map<string, BaseLuaParam*>::iterator iter = m_map.find(key);
if (iter != m_map.end())
{
BaseLuaParam* param = iter->second;
LuaParamInt* intparam = dynamic_cast<LuaParamInt*>(param);
if (param != NULL)
{
return intparam->getValue();
}
}
return 0;
}
string LuaParamTable::getStringByKey(const char* key)
{
map<string, BaseLuaParam*>::iterator iter = m_map.find(key);
if (iter != m_map.end())
{
BaseLuaParam* param = iter->second;
LuaParamString* stringparam = dynamic_cast<LuaParamString*>(param);
if (param != NULL)
{
return stringparam->getValue();
}
}
return "";
}
BOOL LuaParamTable::swapTableByKey(const char* key, LuaParamTable* table)
{
map<string, BaseLuaParam*>::iterator iter = m_map.find(key);
if (iter != m_map.end())
{
BaseLuaParam* param = iter->second;
LuaParamTable* stringparam = dynamic_cast<LuaParamTable*>(param);
if (param != NULL)
{
stringparam->swap(table);
return TRUE;
}
}
return FALSE;
}
//获取MAP数组的容量
int LuaParamTable::getMapSize()
{
return m_map.size();
}
//将数据转移到指定的TABLE中
void LuaParamTable::swap(LuaParamTable* table)
{
m_array.swap(table->m_array);
m_map.swap(table->m_map);
}
lua_State * LuaAction::m_state = NULL;
LuaAction::LuaAction(void)
{
checkState();
m_resultnum = 0;//默认没有参数
}
void LuaAction::initState(lua_State* state)
{
CCAssert(m_state == NULL, "duplicate state !");
m_state = state;
}
//初始化STATE变量
void LuaAction::checkState()
{
CCAssert (m_state != NULL, "m_state is null! please call initState() first");
}
LuaAction::~LuaAction(void)
{
//函数参数和返回值
vector<BaseLuaParam*>::iterator iter = m_params.begin();
for (; iter != m_params.end(); iter++)
{
delete *iter;
}
m_params.clear();
iter = m_results.begin();
for (; iter != m_results.end(); iter++)
{
delete *iter;
}
m_results.clear();
}
//设置函数名
void LuaAction::setFunction(const char* func)
{
if (func == NULL || strlen(func) == 0)
{
return;
}
m_function = func;
}
//设置包名
void LuaAction::setModule(const char* module)
{
if (module == NULL)
{
m_module.empty();
}else
{
m_module = module;
}
}
//设置返回值的数量
void LuaAction::setResultNumber(int num)
{
if (num >= 0)
{
m_resultnum = num;
}
}
//添加一个空值
void LuaAction::addNilParam()
{