Commit e4ab14fa authored by nanahira's avatar nanahira

add group metamethods

parent 370bf78f
......@@ -358,6 +358,11 @@ static const struct luaL_Reg grouplib[] = {
{ "IsContains", scriptlib::group_is_contains },
{ "SearchCard", scriptlib::group_search_card },
{ "GetBinClassCount", scriptlib::group_get_bin_class_count },
{ "__add", scriptlib::group_meta_add },
{ "__bor", scriptlib::group_meta_add },
{ "__sub", scriptlib::group_meta_sub },
{ "__band", scriptlib::group_meta_band },
{ "__bxor", scriptlib::group_meta_bxor },
{ NULL, NULL }
};
......
......@@ -651,3 +651,120 @@ int32 scriptlib::group_get_bin_class_count(lua_State *L) {
lua_pushinteger(L, ans);
return 1;
}
int32 scriptlib::group_meta_add(lua_State* L) {
check_param_count(L, 2);
if(!check_param(L, PARAM_TYPE_CARD, 1, TRUE) && !check_param(L, PARAM_TYPE_GROUP, 1, TRUE))
luaL_error(L, "Parameter %d should be \"Card\" or \"Group\".", 1);
if(!check_param(L, PARAM_TYPE_CARD, 2, TRUE) && !check_param(L, PARAM_TYPE_GROUP, 2, TRUE))
luaL_error(L, "Parameter %d should be \"Card\" or \"Group\".", 2);
duel* pduel = interpreter::get_duel_info(L);
group* pgroup = pduel->new_group();
if(check_param(L, PARAM_TYPE_CARD, 1, TRUE)) {
card* ccard = *(card**) lua_touserdata(L, 1);
pgroup->container.insert(ccard);
} else if(check_param(L, PARAM_TYPE_GROUP, 1, TRUE)) {
group* cgroup = *(group**) lua_touserdata(L, 1);
for(auto cit = cgroup->container.begin(); cit != cgroup->container.end(); ++cit)
pgroup->container.insert(*cit);
}
if(check_param(L, PARAM_TYPE_CARD, 2, TRUE)) {
card* ccard = *(card**) lua_touserdata(L, 2);
pgroup->container.insert(ccard);
} else if(check_param(L, PARAM_TYPE_GROUP, 2, TRUE)) {
group* cgroup = *(group**) lua_touserdata(L, 2);
for(auto cit = cgroup->container.begin(); cit != cgroup->container.end(); ++cit)
pgroup->container.insert(*cit);
}
interpreter::group2value(L, pgroup);
return 1;
}
int32 scriptlib::group_meta_sub(lua_State* L) {
check_param_count(L, 2);
if(!check_param(L, PARAM_TYPE_CARD, 1, TRUE) && !check_param(L, PARAM_TYPE_GROUP, 1, TRUE))
luaL_error(L, "Parameter %d should be \"Card\" or \"Group\".", 1);
if(!check_param(L, PARAM_TYPE_CARD, 2, TRUE) && !check_param(L, PARAM_TYPE_GROUP, 2, TRUE))
luaL_error(L, "Parameter %d should be \"Card\" or \"Group\".", 2);
duel* pduel = interpreter::get_duel_info(L);
group* pgroup = pduel->new_group();
if(check_param(L, PARAM_TYPE_CARD, 1, TRUE)) {
card* ccard = *(card**) lua_touserdata(L, 1);
pgroup->container.insert(ccard);
} else if(check_param(L, PARAM_TYPE_GROUP, 1, TRUE)) {
group* cgroup = *(group**) lua_touserdata(L, 1);
for(auto cit = cgroup->container.begin(); cit != cgroup->container.end(); ++cit)
pgroup->container.insert(*cit);
}
if(check_param(L, PARAM_TYPE_CARD, 2, TRUE)) {
card* ccard = *(card**) lua_touserdata(L, 2);
pgroup->container.erase(ccard);
} else if(check_param(L, PARAM_TYPE_GROUP, 2, TRUE)) {
group* cgroup = *(group**) lua_touserdata(L, 2);
for(auto cit = cgroup->container.begin(); cit != cgroup->container.end(); ++cit)
pgroup->container.erase(*cit);
}
interpreter::group2value(L, pgroup);
return 1;
}
int32 scriptlib::group_meta_band(lua_State* L) {
check_param_count(L, 2);
if(!check_param(L, PARAM_TYPE_CARD, 1, TRUE) && !check_param(L, PARAM_TYPE_GROUP, 1, TRUE))
luaL_error(L, "Parameter %d should be \"Card\" or \"Group\".", 1);
if(!check_param(L, PARAM_TYPE_CARD, 2, TRUE) && !check_param(L, PARAM_TYPE_GROUP, 2, TRUE))
luaL_error(L, "Parameter %d should be \"Card\" or \"Group\".", 2);
duel* pduel = interpreter::get_duel_info(L);
group* pgroup = pduel->new_group();
field::card_set check_set;
if(check_param(L, PARAM_TYPE_CARD, 1, TRUE)) {
card* ccard = *(card**) lua_touserdata(L, 1);
check_set.insert(ccard);
} else if(check_param(L, PARAM_TYPE_GROUP, 1, TRUE)) {
group* cgroup = *(group**) lua_touserdata(L, 1);
check_set = cgroup->container;
}
if(check_param(L, PARAM_TYPE_CARD, 2, TRUE)) {
card* ccard = *(card**) lua_touserdata(L, 2);
if(check_set.find(ccard) != check_set.end())
pgroup->container.insert(ccard);
} else if(check_param(L, PARAM_TYPE_GROUP, 2, TRUE)) {
group* cgroup = *(group**) lua_touserdata(L, 2);
for(auto cit = cgroup->container.begin(); cit != cgroup->container.end(); ++cit)
if(check_set.find(*cit) != check_set.end())
pgroup->container.insert(*cit);
}
interpreter::group2value(L, pgroup);
return 1;
}
int32 scriptlib::group_meta_bxor(lua_State* L) {
check_param_count(L, 2);
if(!check_param(L, PARAM_TYPE_CARD, 1, TRUE) && !check_param(L, PARAM_TYPE_GROUP, 1, TRUE))
luaL_error(L, "Parameter %d should be \"Card\" or \"Group\".", 1);
if(!check_param(L, PARAM_TYPE_CARD, 2, TRUE) && !check_param(L, PARAM_TYPE_GROUP, 2, TRUE))
luaL_error(L, "Parameter %d should be \"Card\" or \"Group\".", 2);
duel* pduel = interpreter::get_duel_info(L);
group* pgroup = pduel->new_group();
if(check_param(L, PARAM_TYPE_CARD, 1, TRUE)) {
card* ccard = *(card**) lua_touserdata(L, 1);
pgroup->container.insert(ccard);
} else if(check_param(L, PARAM_TYPE_GROUP, 1, TRUE)) {
group* cgroup = *(group**) lua_touserdata(L, 1);
for(auto cit = cgroup->container.begin(); cit != cgroup->container.end(); ++cit)
pgroup->container.insert(*cit);
}
if(check_param(L, PARAM_TYPE_CARD, 2, TRUE)) {
card* ccard = *(card**) lua_touserdata(L, 2);
if(pgroup->container.find(ccard) != pgroup->container.end())
pgroup->container.erase(ccard);
else
pgroup->container.insert(ccard);
} else if(check_param(L, PARAM_TYPE_GROUP, 2, TRUE)) {
group* cgroup = *(group**) lua_touserdata(L, 2);
for(auto cit = cgroup->container.begin(); cit != cgroup->container.end(); ++cit) {
if(pgroup->container.find(*cit) != pgroup->container.end())
pgroup->container.erase(*cit);
else
pgroup->container.insert(*cit);
}
}
interpreter::group2value(L, pgroup);
return 1;
}
......@@ -570,6 +570,13 @@ public:
static int32 duel_swap_deck_and_grave(lua_State *L);
static int32 duel_majestic_copy(lua_State *L);
//group metamethods
//__len is in the group lib, which is same as group_get_count
static int32 group_meta_add(lua_State *L);
static int32 group_meta_sub(lua_State *L);
static int32 group_meta_band(lua_State *L);
static int32 group_meta_bxor(lua_State *L);
//preload
static int32 debug_message(lua_State *L);
static int32 debug_add_card(lua_State *L);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment