Commit bfbd9ded authored by salix5's avatar salix5

add lua_State* to get_release_list

parent 554f5f8e
...@@ -1662,13 +1662,13 @@ effect* field::is_player_affected_by_effect(uint8 playerid, uint32 code) { ...@@ -1662,13 +1662,13 @@ effect* field::is_player_affected_by_effect(uint8 playerid, uint32 code) {
} }
return nullptr; return nullptr;
} }
int32 field::get_release_list(uint8 playerid, card_set* release_list, card_set* ex_list, card_set* ex_list_oneof, int32 use_con, int32 use_hand, int32 fun, int32 exarg, card* exc, group* exg, uint32 reason) { int32 field::get_release_list(lua_State* L, uint8 playerid, card_set* release_list, card_set* ex_list, card_set* ex_list_oneof, int32 use_con, int32 use_hand, int32 fun, int32 exarg, card* exc, group* exg, uint32 reason) {
uint32 rcount = 0; uint32 rcount = 0;
effect* re = core.reason_effect; effect* re = core.reason_effect;
for(auto& pcard : player[playerid].list_mzone) { for(auto& pcard : player[playerid].list_mzone) {
if(pcard && pcard != exc && !(exg && exg->has_card(pcard)) && pcard->is_releasable_by_nonsummon(playerid, reason) if(pcard && pcard != exc && !(exg && exg->has_card(pcard)) && pcard->is_releasable_by_nonsummon(playerid, reason)
&& (reason != REASON_EFFECT || pcard->is_releasable_by_effect(playerid, re)) && (reason != REASON_EFFECT || pcard->is_releasable_by_effect(playerid, re))
&& (!use_con || pduel->lua->check_matching(pcard, fun, exarg))) { && (!use_con || pduel->lua->check_filter(L, pcard, fun, exarg))) {
if(release_list) if(release_list)
release_list->insert(pcard); release_list->insert(pcard);
pcard->release_param = 1; pcard->release_param = 1;
...@@ -1679,7 +1679,7 @@ int32 field::get_release_list(uint8 playerid, card_set* release_list, card_set* ...@@ -1679,7 +1679,7 @@ int32 field::get_release_list(uint8 playerid, card_set* release_list, card_set*
for(auto& pcard : player[playerid].list_hand) { for(auto& pcard : player[playerid].list_hand) {
if(pcard && pcard != exc && !(exg && exg->has_card(pcard)) && pcard->is_releasable_by_nonsummon(playerid, reason) if(pcard && pcard != exc && !(exg && exg->has_card(pcard)) && pcard->is_releasable_by_nonsummon(playerid, reason)
&& (reason != REASON_EFFECT || pcard->is_releasable_by_effect(playerid, re)) && (reason != REASON_EFFECT || pcard->is_releasable_by_effect(playerid, re))
&& (!use_con || pduel->lua->check_matching(pcard, fun, exarg))) { && (!use_con || pduel->lua->check_filter(L, pcard, fun, exarg))) {
if(release_list) if(release_list)
release_list->insert(pcard); release_list->insert(pcard);
pcard->release_param = 1; pcard->release_param = 1;
...@@ -1692,7 +1692,7 @@ int32 field::get_release_list(uint8 playerid, card_set* release_list, card_set* ...@@ -1692,7 +1692,7 @@ int32 field::get_release_list(uint8 playerid, card_set* release_list, card_set*
if(pcard && pcard != exc && !(exg && exg->has_card(pcard)) && (pcard->is_position(POS_FACEUP) || !use_con) if(pcard && pcard != exc && !(exg && exg->has_card(pcard)) && (pcard->is_position(POS_FACEUP) || !use_con)
&& pcard->is_releasable_by_nonsummon(playerid, reason) && pcard->is_releasable_by_nonsummon(playerid, reason)
&& (reason != REASON_EFFECT || pcard->is_releasable_by_effect(playerid, re)) && (reason != REASON_EFFECT || pcard->is_releasable_by_effect(playerid, re))
&& (!use_con || pduel->lua->check_matching(pcard, fun, exarg))) { && (!use_con || pduel->lua->check_filter(L, pcard, fun, exarg))) {
pcard->release_param = 1; pcard->release_param = 1;
if(pcard->is_affected_by_effect(EFFECT_EXTRA_RELEASE)) { if(pcard->is_affected_by_effect(EFFECT_EXTRA_RELEASE)) {
if(ex_list) if(ex_list)
...@@ -1715,10 +1715,10 @@ int32 field::get_release_list(uint8 playerid, card_set* release_list, card_set* ...@@ -1715,10 +1715,10 @@ int32 field::get_release_list(uint8 playerid, card_set* release_list, card_set*
} }
return rcount + ex_oneof_max; return rcount + ex_oneof_max;
} }
int32 field::check_release_list(uint8 playerid, int32 count, int32 use_con, int32 use_hand, int32 fun, int32 exarg, card* exc, group* exg, uint32 reason) { int32 field::check_release_list(lua_State* L, uint8 playerid, int32 count, int32 use_con, int32 use_hand, int32 fun, int32 exarg, card* exc, group* exg, uint32 reason) {
card_set relcard; card_set relcard;
card_set relcard_oneof; card_set relcard_oneof;
get_release_list(playerid, &relcard, &relcard, &relcard_oneof, use_con, use_hand, fun, exarg, exc, exg, reason); get_release_list(L, playerid, &relcard, &relcard, &relcard_oneof, use_con, use_hand, fun, exarg, exc, exg, reason);
bool has_oneof = false; bool has_oneof = false;
for(auto& pcard : core.must_select_cards) { for(auto& pcard : core.must_select_cards) {
auto it = relcard.find(pcard); auto it = relcard.find(pcard);
......
...@@ -437,8 +437,8 @@ public: ...@@ -437,8 +437,8 @@ public:
int32 filter_field_card(uint8 self, uint32 location, uint32 location2, group* pgroup); int32 filter_field_card(uint8 self, uint32 location, uint32 location2, group* pgroup);
effect* is_player_affected_by_effect(uint8 playerid, uint32 code); effect* is_player_affected_by_effect(uint8 playerid, uint32 code);
int32 get_release_list(uint8 playerid, card_set* release_list, card_set* ex_list, card_set* ex_list_oneof, int32 use_con, int32 use_hand, int32 fun, int32 exarg, card* exc, group* exg, uint32 reason); int32 get_release_list(lua_State* L, uint8 playerid, card_set* release_list, card_set* ex_list, card_set* ex_list_oneof, int32 use_con, int32 use_hand, int32 fun, int32 exarg, card* exc, group* exg, uint32 reason);
int32 check_release_list(uint8 playerid, int32 count, int32 use_con, int32 use_hand, int32 fun, int32 exarg, card* exc, group* exg, uint32 reason); int32 check_release_list(lua_State* L, uint8 playerid, int32 count, int32 use_con, int32 use_hand, int32 fun, int32 exarg, card* exc, group* exg, uint32 reason);
int32 get_summon_release_list(card* target, card_set* release_list, card_set* ex_list, card_set* ex_list_oneof, group* mg = nullptr, uint32 ex = 0, uint32 releasable = 0xff00ff, uint32 pos = 0x1); int32 get_summon_release_list(card* target, card_set* release_list, card_set* ex_list, card_set* ex_list_oneof, group* mg = nullptr, uint32 ex = 0, uint32 releasable = 0xff00ff, uint32 pos = 0x1);
int32 get_summon_count_limit(uint8 playerid); int32 get_summon_count_limit(uint8 playerid);
int32 get_draw_count(uint8 playerid); int32 get_draw_count(uint8 playerid);
......
...@@ -2704,7 +2704,7 @@ int32 scriptlib::duel_get_release_group(lua_State *L) { ...@@ -2704,7 +2704,7 @@ int32 scriptlib::duel_get_release_group(lua_State *L) {
reason = (uint32)lua_tointeger(L, 3); reason = (uint32)lua_tointeger(L, 3);
duel* pduel = interpreter::get_duel_info(L); duel* pduel = interpreter::get_duel_info(L);
group* pgroup = pduel->new_group(); group* pgroup = pduel->new_group();
pduel->game_field->get_release_list(playerid, &pgroup->container, &pgroup->container, &pgroup->container, FALSE, hand, 0, 0, nullptr, nullptr, reason); pduel->game_field->get_release_list(L, playerid, &pgroup->container, &pgroup->container, &pgroup->container, FALSE, hand, 0, 0, nullptr, nullptr, reason);
interpreter::group2value(L, pgroup); interpreter::group2value(L, pgroup);
return 1; return 1;
} }
...@@ -2725,7 +2725,7 @@ int32 scriptlib::duel_get_release_group_count(lua_State *L) { ...@@ -2725,7 +2725,7 @@ int32 scriptlib::duel_get_release_group_count(lua_State *L) {
if (lua_gettop(L) >= 3) if (lua_gettop(L) >= 3)
reason = (uint32)lua_tointeger(L, 3); reason = (uint32)lua_tointeger(L, 3);
duel* pduel = interpreter::get_duel_info(L); duel* pduel = interpreter::get_duel_info(L);
lua_pushinteger(L, pduel->game_field->get_release_list(playerid, nullptr, nullptr, FALSE, FALSE, hand, 0, 0, nullptr, nullptr, reason)); lua_pushinteger(L, pduel->game_field->get_release_list(L, playerid, nullptr, nullptr, nullptr, FALSE, hand, 0, 0, nullptr, nullptr, reason));
return 1; return 1;
} }
int32 scriptlib::duel_check_release_group(lua_State *L) { int32 scriptlib::duel_check_release_group(lua_State *L) {
...@@ -2748,7 +2748,7 @@ int32 scriptlib::duel_check_release_group(lua_State *L) { ...@@ -2748,7 +2748,7 @@ int32 scriptlib::duel_check_release_group(lua_State *L) {
pexgroup = *(group**) lua_touserdata(L, 4); pexgroup = *(group**) lua_touserdata(L, 4);
uint32 extraargs = lua_gettop(L) - must_param; uint32 extraargs = lua_gettop(L) - must_param;
duel* pduel = interpreter::get_duel_info(L); duel* pduel = interpreter::get_duel_info(L);
int32 result = pduel->game_field->check_release_list(playerid, fcount, use_con, FALSE, 2, extraargs, pexception, pexgroup, REASON_COST); int32 result = pduel->game_field->check_release_list(L, playerid, fcount, use_con, FALSE, 2, extraargs, pexception, pexgroup, REASON_COST);
pduel->game_field->core.must_select_cards.clear(); pduel->game_field->core.must_select_cards.clear();
lua_pushboolean(L, result); lua_pushboolean(L, result);
return 1; return 1;
...@@ -2778,7 +2778,7 @@ int32 scriptlib::duel_select_release_group(lua_State *L) { ...@@ -2778,7 +2778,7 @@ int32 scriptlib::duel_select_release_group(lua_State *L) {
pduel->game_field->core.release_cards.clear(); pduel->game_field->core.release_cards.clear();
pduel->game_field->core.release_cards_ex.clear(); pduel->game_field->core.release_cards_ex.clear();
pduel->game_field->core.release_cards_ex_oneof.clear(); pduel->game_field->core.release_cards_ex_oneof.clear();
pduel->game_field->get_release_list(playerid, &pduel->game_field->core.release_cards, &pduel->game_field->core.release_cards_ex, &pduel->game_field->core.release_cards_ex_oneof, use_con, FALSE, 2, extraargs, pexception, pexgroup, REASON_COST); pduel->game_field->get_release_list(L, playerid, &pduel->game_field->core.release_cards, &pduel->game_field->core.release_cards_ex, &pduel->game_field->core.release_cards_ex_oneof, use_con, FALSE, 2, extraargs, pexception, pexgroup, REASON_COST);
pduel->game_field->add_process(PROCESSOR_SELECT_RELEASE, 0, 0, 0, playerid, (max << 16) + min); pduel->game_field->add_process(PROCESSOR_SELECT_RELEASE, 0, 0, 0, playerid, (max << 16) + min);
return lua_yieldk(L, 0, (lua_KContext)pduel, [](lua_State *L, int32 status, lua_KContext ctx) { return lua_yieldk(L, 0, (lua_KContext)pduel, [](lua_State *L, int32 status, lua_KContext ctx) {
duel* pduel = (duel*)ctx; duel* pduel = (duel*)ctx;
...@@ -2813,7 +2813,7 @@ int32 scriptlib::duel_check_release_group_ex(lua_State *L) { ...@@ -2813,7 +2813,7 @@ int32 scriptlib::duel_check_release_group_ex(lua_State *L) {
pexgroup = *(group**) lua_touserdata(L, 6); pexgroup = *(group**) lua_touserdata(L, 6);
uint32 extraargs = lua_gettop(L) - must_param; uint32 extraargs = lua_gettop(L) - must_param;
duel* pduel = interpreter::get_duel_info(L); duel* pduel = interpreter::get_duel_info(L);
int32 result = pduel->game_field->check_release_list(playerid, fcount, use_con, use_hand, 2, extraargs, pexception, pexgroup, reason); int32 result = pduel->game_field->check_release_list(L, playerid, fcount, use_con, use_hand, 2, extraargs, pexception, pexgroup, reason);
pduel->game_field->core.must_select_cards.clear(); pduel->game_field->core.must_select_cards.clear();
lua_pushboolean(L, result); lua_pushboolean(L, result);
return 1; return 1;
...@@ -2845,7 +2845,7 @@ int32 scriptlib::duel_select_release_group_ex(lua_State *L) { ...@@ -2845,7 +2845,7 @@ int32 scriptlib::duel_select_release_group_ex(lua_State *L) {
pduel->game_field->core.release_cards.clear(); pduel->game_field->core.release_cards.clear();
pduel->game_field->core.release_cards_ex.clear(); pduel->game_field->core.release_cards_ex.clear();
pduel->game_field->core.release_cards_ex_oneof.clear(); pduel->game_field->core.release_cards_ex_oneof.clear();
pduel->game_field->get_release_list(playerid, &pduel->game_field->core.release_cards, &pduel->game_field->core.release_cards_ex, &pduel->game_field->core.release_cards_ex_oneof, use_con, use_hand, 2, extraargs, pexception, pexgroup, reason); pduel->game_field->get_release_list(L, playerid, &pduel->game_field->core.release_cards, &pduel->game_field->core.release_cards_ex, &pduel->game_field->core.release_cards_ex_oneof, use_con, use_hand, 2, extraargs, pexception, pexgroup, reason);
pduel->game_field->add_process(PROCESSOR_SELECT_RELEASE, 0, 0, 0, playerid, (max << 16) + min); pduel->game_field->add_process(PROCESSOR_SELECT_RELEASE, 0, 0, 0, playerid, (max << 16) + min);
return lua_yieldk(L, 0, (lua_KContext)pduel, [](lua_State *L, int32 status, lua_KContext ctx) { return lua_yieldk(L, 0, (lua_KContext)pduel, [](lua_State *L, int32 status, lua_KContext ctx) {
duel* pduel = (duel*)ctx; duel* pduel = (duel*)ctx;
......
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