Commit 8f5aacef authored by salix5's avatar salix5

update Duel.CheckReleaseGroup, CheckReleaseGroupEx

Duel.CheckReleaseGroup
add 1st param: reason

Duel.CheckReleaseGroupEx
add 1st param: reason

target function of EFFECT_CANNOT_RELEASE
add 4th param: reason
parent 88ce3d3f
...@@ -3584,7 +3584,7 @@ int32 card::is_releasable_by_summon(uint8 playerid, card *pcard) { ...@@ -3584,7 +3584,7 @@ int32 card::is_releasable_by_summon(uint8 playerid, card *pcard) {
return FALSE; return FALSE;
return TRUE; return TRUE;
} }
int32 card::is_releasable_by_nonsummon(uint8 playerid) { int32 card::is_releasable_by_nonsummon(uint8 playerid, uint32 reason) {
if(is_status(STATUS_SUMMONING)) if(is_status(STATUS_SUMMONING))
return FALSE; return FALSE;
if(overlay_target) if(overlay_target)
...@@ -3593,7 +3593,7 @@ int32 card::is_releasable_by_nonsummon(uint8 playerid) { ...@@ -3593,7 +3593,7 @@ int32 card::is_releasable_by_nonsummon(uint8 playerid) {
return FALSE; return FALSE;
if((current.location == LOCATION_HAND) && (data.type & (TYPE_SPELL | TYPE_TRAP))) if((current.location == LOCATION_HAND) && (data.type & (TYPE_SPELL | TYPE_TRAP)))
return FALSE; return FALSE;
if(!pduel->game_field->is_player_can_release(playerid, this)) if(!pduel->game_field->is_player_can_release(playerid, this, reason))
return FALSE; return FALSE;
if(is_affected_by_effect(EFFECT_UNRELEASABLE_NONSUM)) if(is_affected_by_effect(EFFECT_UNRELEASABLE_NONSUM))
return FALSE; return FALSE;
......
...@@ -361,7 +361,7 @@ public: ...@@ -361,7 +361,7 @@ public:
int32 is_removeable(uint8 playerid, uint8 pos, uint32 reason); int32 is_removeable(uint8 playerid, uint8 pos, uint32 reason);
int32 is_removeable_as_cost(uint8 playerid, uint8 pos); int32 is_removeable_as_cost(uint8 playerid, uint8 pos);
int32 is_releasable_by_summon(uint8 playerid, card* pcard); int32 is_releasable_by_summon(uint8 playerid, card* pcard);
int32 is_releasable_by_nonsummon(uint8 playerid); int32 is_releasable_by_nonsummon(uint8 playerid, uint32 reason = 0u);
int32 is_releasable_by_effect(uint8 playerid, effect* reason_effect); int32 is_releasable_by_effect(uint8 playerid, effect* reason_effect);
int32 is_capable_send_to_grave(uint8 playerid); int32 is_capable_send_to_grave(uint8 playerid);
int32 is_capable_send_to_hand(uint8 playerid); int32 is_capable_send_to_hand(uint8 playerid);
......
...@@ -1695,10 +1695,10 @@ effect* field::is_player_affected_by_effect(uint8 playerid, uint32 code) { ...@@ -1695,10 +1695,10 @@ effect* field::is_player_affected_by_effect(uint8 playerid, uint32 code) {
} }
return 0; return 0;
} }
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) { 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) {
uint32 rcount = 0; uint32 rcount = 0;
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) if(pcard && pcard != exc && !(exg && exg->has_card(pcard)) && pcard->is_releasable_by_nonsummon(playerid, reason)
&& (!use_con || pduel->lua->check_matching(pcard, fun, exarg))) { && (!use_con || pduel->lua->check_matching(pcard, fun, exarg))) {
if(release_list) if(release_list)
release_list->insert(pcard); release_list->insert(pcard);
...@@ -1708,7 +1708,7 @@ int32 field::get_release_list(uint8 playerid, card_set* release_list, card_set* ...@@ -1708,7 +1708,7 @@ int32 field::get_release_list(uint8 playerid, card_set* release_list, card_set*
} }
if(use_hand) { if(use_hand) {
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) if(pcard && pcard != exc && !(exg && exg->has_card(pcard)) && pcard->is_releasable_by_nonsummon(playerid, reason)
&& (!use_con || pduel->lua->check_matching(pcard, fun, exarg))) { && (!use_con || pduel->lua->check_matching(pcard, fun, exarg))) {
if(release_list) if(release_list)
release_list->insert(pcard); release_list->insert(pcard);
...@@ -1720,7 +1720,7 @@ int32 field::get_release_list(uint8 playerid, card_set* release_list, card_set* ...@@ -1720,7 +1720,7 @@ int32 field::get_release_list(uint8 playerid, card_set* release_list, card_set*
int32 ex_oneof_max = 0; int32 ex_oneof_max = 0;
for(auto& pcard : player[1 - playerid].list_mzone) { for(auto& pcard : player[1 - playerid].list_mzone) {
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) && (!use_con || pduel->lua->check_matching(pcard, fun, exarg))) { && pcard->is_releasable_by_nonsummon(playerid, reason) && (!use_con || pduel->lua->check_matching(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)
...@@ -1743,10 +1743,10 @@ int32 field::get_release_list(uint8 playerid, card_set* release_list, card_set* ...@@ -1743,10 +1743,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) { 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) {
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); get_release_list(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);
...@@ -3222,7 +3222,7 @@ int32 field::is_player_can_spsummon_monster(uint8 playerid, uint8 toplayer, uint ...@@ -3222,7 +3222,7 @@ int32 field::is_player_can_spsummon_monster(uint8 playerid, uint8 toplayer, uint
temp_card->data.clear(); temp_card->data.clear();
return result; return result;
} }
int32 field::is_player_can_release(uint8 playerid, card * pcard) { int32 field::is_player_can_release(uint8 playerid, card* pcard, uint32 reason) {
effect_set eset; effect_set eset;
filter_player_effect(playerid, EFFECT_CANNOT_RELEASE, &eset); filter_player_effect(playerid, EFFECT_CANNOT_RELEASE, &eset);
for(int32 i = 0; i < eset.size(); ++i) { for(int32 i = 0; i < eset.size(); ++i) {
...@@ -3231,7 +3231,8 @@ int32 field::is_player_can_release(uint8 playerid, card * pcard) { ...@@ -3231,7 +3231,8 @@ int32 field::is_player_can_release(uint8 playerid, card * pcard) {
pduel->lua->add_param(eset[i], PARAM_TYPE_EFFECT); pduel->lua->add_param(eset[i], PARAM_TYPE_EFFECT);
pduel->lua->add_param(pcard, PARAM_TYPE_CARD); pduel->lua->add_param(pcard, PARAM_TYPE_CARD);
pduel->lua->add_param(playerid, PARAM_TYPE_INT); pduel->lua->add_param(playerid, PARAM_TYPE_INT);
if (pduel->lua->check_condition(eset[i]->target, 3)) pduel->lua->add_param(reason, PARAM_TYPE_INT);
if (pduel->lua->check_condition(eset[i]->target, 4))
return FALSE; return FALSE;
} }
return TRUE; return TRUE;
......
...@@ -447,8 +447,8 @@ public: ...@@ -447,8 +447,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); 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 = 0u);
int32 check_release_list(uint8 playerid, int32 count, int32 use_con, int32 use_hand, int32 fun, int32 exarg, card* exc, group* exg); int32 check_release_list(uint8 playerid, int32 count, int32 use_con, int32 use_hand, int32 fun, int32 exarg, card* exc, group* exg, uint32 reason = 0u);
int32 get_summon_release_list(card* target, card_set* release_list, card_set* ex_list, card_set* ex_list_oneof, group* mg = NULL, 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 = NULL, 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);
...@@ -510,7 +510,7 @@ public: ...@@ -510,7 +510,7 @@ public:
int32 is_player_can_flipsummon(uint8 playerid, card* pcard); int32 is_player_can_flipsummon(uint8 playerid, card* pcard);
int32 is_player_can_spsummon_monster(uint8 playerid, uint8 toplayer, uint8 sumpos, uint32 sumtype, card_data* pdata); int32 is_player_can_spsummon_monster(uint8 playerid, uint8 toplayer, uint8 sumpos, uint32 sumtype, card_data* pdata);
int32 is_player_can_spsummon_count(uint8 playerid, uint32 count); int32 is_player_can_spsummon_count(uint8 playerid, uint32 count);
int32 is_player_can_release(uint8 playerid, card* pcard); int32 is_player_can_release(uint8 playerid, card* pcard, uint32 reason = 0u);
int32 is_player_can_place_counter(uint8 playerid, card* pcard, uint16 countertype, uint16 count); int32 is_player_can_place_counter(uint8 playerid, card* pcard, uint16 countertype, uint16 count);
int32 is_player_can_remove_counter(uint8 playerid, card* pcard, uint8 s, uint8 o, uint16 countertype, uint16 count, uint32 reason); int32 is_player_can_remove_counter(uint8 playerid, card* pcard, uint8 s, uint8 o, uint16 countertype, uint16 count, uint32 reason);
int32 is_player_can_remove_overlay_card(uint8 playerid, card* pcard, uint8 s, uint8 o, uint16 count, uint32 reason); int32 is_player_can_remove_overlay_card(uint8 playerid, card* pcard, uint8 s, uint8 o, uint16 count, uint32 reason);
......
...@@ -2645,25 +2645,27 @@ int32 scriptlib::duel_get_release_group_count(lua_State *L) { ...@@ -2645,25 +2645,27 @@ int32 scriptlib::duel_get_release_group_count(lua_State *L) {
return 1; return 1;
} }
int32 scriptlib::duel_check_release_group(lua_State *L) { int32 scriptlib::duel_check_release_group(lua_State *L) {
check_param_count(L, 4); const int32 must_param = 5;
int32 playerid = (int32)lua_tointeger(L, 1); check_param_count(L, must_param);
uint32 reason = (uint32)lua_tointeger(L, 1);
int32 playerid = (int32)lua_tointeger(L, 2);
if(playerid != 0 && playerid != 1) if(playerid != 0 && playerid != 1)
return 0; return 0;
int32 use_con = FALSE; int32 use_con = FALSE;
if(!lua_isnil(L, 2)) { if(!lua_isnil(L, 3)) {
check_param(L, PARAM_TYPE_FUNCTION, 2); check_param(L, PARAM_TYPE_FUNCTION, 3);
use_con = TRUE; use_con = TRUE;
} }
uint32 fcount = (uint32)lua_tointeger(L, 4);
card* pexception = 0; card* pexception = 0;
group* pexgroup = 0; group* pexgroup = 0;
if(check_param(L, PARAM_TYPE_CARD, 4, TRUE)) if(check_param(L, PARAM_TYPE_CARD, 5, TRUE))
pexception = *(card**) lua_touserdata(L, 4); pexception = *(card**) lua_touserdata(L, 5);
else if(check_param(L, PARAM_TYPE_GROUP, 4, TRUE)) else if(check_param(L, PARAM_TYPE_GROUP, 5, TRUE))
pexgroup = *(group**) lua_touserdata(L, 4); pexgroup = *(group**) lua_touserdata(L, 5);
uint32 extraargs = lua_gettop(L) - 4; uint32 extraargs = lua_gettop(L) - must_param;
duel* pduel = interpreter::get_duel_info(L); duel* pduel = interpreter::get_duel_info(L);
uint32 fcount = (uint32)lua_tointeger(L, 3); int32 result = pduel->game_field->check_release_list(playerid, fcount, use_con, FALSE, 2, extraargs, pexception, pexgroup, reason);
int32 result = pduel->game_field->check_release_list(playerid, fcount, use_con, FALSE, 2, extraargs, pexception, pexgroup);
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;
...@@ -2706,25 +2708,27 @@ int32 scriptlib::duel_select_release_group(lua_State *L) { ...@@ -2706,25 +2708,27 @@ int32 scriptlib::duel_select_release_group(lua_State *L) {
}); });
} }
int32 scriptlib::duel_check_release_group_ex(lua_State *L) { int32 scriptlib::duel_check_release_group_ex(lua_State *L) {
check_param_count(L, 4); const int32 must_param = 5;
int32 playerid = (int32)lua_tointeger(L, 1); check_param_count(L, must_param);
uint32 reason = (uint32)lua_tointeger(L, 1);
int32 playerid = (int32)lua_tointeger(L, 2);
if(playerid != 0 && playerid != 1) if(playerid != 0 && playerid != 1)
return 0; return 0;
int32 use_con = FALSE; int32 use_con = FALSE;
if(!lua_isnil(L, 2)) { if(!lua_isnil(L, 3)) {
check_param(L, PARAM_TYPE_FUNCTION, 2); check_param(L, PARAM_TYPE_FUNCTION, 3);
use_con = TRUE; use_con = TRUE;
} }
uint32 fcount = (uint32)lua_tointeger(L, 4);
card* pexception = 0; card* pexception = 0;
group* pexgroup = 0; group* pexgroup = 0;
if(check_param(L, PARAM_TYPE_CARD, 4, TRUE)) if(check_param(L, PARAM_TYPE_CARD, 5, TRUE))
pexception = *(card**) lua_touserdata(L, 4); pexception = *(card**) lua_touserdata(L, 5);
else if(check_param(L, PARAM_TYPE_GROUP, 4, TRUE)) else if(check_param(L, PARAM_TYPE_GROUP, 5, TRUE))
pexgroup = *(group**) lua_touserdata(L, 4); pexgroup = *(group**) lua_touserdata(L, 5);
uint32 extraargs = lua_gettop(L) - 4; uint32 extraargs = lua_gettop(L) - must_param;
duel* pduel = interpreter::get_duel_info(L); duel* pduel = interpreter::get_duel_info(L);
uint32 fcount = (uint32)lua_tointeger(L, 3); int32 result = pduel->game_field->check_release_list(playerid, fcount, use_con, TRUE, 2, extraargs, pexception, pexgroup, reason);
int32 result = pduel->game_field->check_release_list(playerid, fcount, use_con, TRUE, 2, extraargs, pexception, pexgroup);
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;
......
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