Commit 91e9cb9e authored by VanillaSalt's avatar VanillaSalt

fix

parent ed356a14
......@@ -1614,48 +1614,24 @@ int32 field::get_release_list(uint8 playerid, card_set* release_list, card_set*
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) {
for(auto cit = player[playerid].list_mzone.begin(); cit != player[playerid].list_mzone.end(); ++cit) {
card* pcard = *cit;
if(pcard && pcard != exc && !(exg && exg->has_card(pcard)) && pcard->is_releasable_by_nonsummon(playerid)
&& (!use_con || pduel->lua->check_matching(pcard, fun, exarg))) {
count--;
if(count == 0)
return TRUE;
}
}
if(use_hand) {
for(auto cit = player[playerid].list_hand.begin(); cit != player[playerid].list_hand.end(); ++cit) {
card* pcard = *cit;
if(pcard && pcard != exc && !(exg && exg->has_card(pcard)) && pcard->is_releasable_by_nonsummon(playerid)
&& (!use_con || pduel->lua->check_matching(pcard, fun, exarg))) {
count--;
if(count == 0)
return TRUE;
}
}
}
bool ex_oneof = false;
for(auto cit = player[1 - playerid].list_mzone.begin(); cit != player[1 - playerid].list_mzone.end(); ++cit) {
card_set relcard;
card_set relcard_oneof;
get_release_list(playerid, &relcard, &relcard, &relcard_oneof, use_con, use_hand, fun, exarg, exc, exg);
bool has_oneof = false;
for(auto cit = core.must_select_cards.begin(); cit != core.must_select_cards.end(); ++cit) {
card* pcard = *cit;
if(pcard && pcard != exc && !(exg && exg->has_card(pcard)) && (!use_con || pcard->is_position(POS_FACEUP))
&& pcard->is_releasable_by_nonsummon(playerid) && (!use_con || pduel->lua->check_matching(pcard, fun, exarg))) {
pcard->release_param = 1;
if(pcard->is_affected_by_effect(EFFECT_EXTRA_RELEASE)) {
count--;
if(count == 0)
return TRUE;
} else if(!ex_oneof) {
effect* peffect = pcard->is_affected_by_effect(EFFECT_EXTRA_RELEASE_NONSUM);
if(!peffect || (peffect->is_flag(EFFECT_FLAG_COUNT_LIMIT) && peffect->count_limit == 0))
continue;
ex_oneof = true;
count--;
if(count == 0)
return TRUE;
}
}
auto it = relcard.find(pcard);
if(it != relcard.end())
relcard.erase(it);
else if(!has_oneof && relcard_oneof.find(pcard) != relcard_oneof.end())
has_oneof = true;
else
return FALSE;
}
return FALSE;
int32 rcount = (int32)relcard.size();
if(!has_oneof && !relcard_oneof.empty())
rcount++;
return (rcount >= count) ? TRUE : FALSE;
}
// return: the max release count of mg or all monsters on field
int32 field::get_summon_release_list(card* target, card_set* release_list, card_set* ex_list, card_set* ex_list_oneof, group* mg, uint32 ex, uint32 releasable, uint32 pos) {
......
......@@ -317,6 +317,7 @@ struct processor {
std::unordered_map<uint32, std::pair<uint32, uint32> > attack_counter;
std::unordered_map<uint32, std::pair<uint32, uint32> > chain_counter;
processor_list recover_damage_reserve;
effect_vector dec_count_reserve;
};
class field {
public:
......
......@@ -2253,7 +2253,7 @@ int32 scriptlib::duel_get_release_group(lua_State *L) {
hand = lua_toboolean(L, 2);
duel* pduel = interpreter::get_duel_info(L);
group* pgroup = pduel->new_group();
pduel->game_field->get_release_list(playerid, &(pgroup->container), &(pgroup->container), 0, FALSE, hand, 0, 0, 0, 0);
pduel->game_field->get_release_list(playerid, &pgroup->container, &pgroup->container, &pgroup->container, FALSE, hand, 0, 0, 0, 0);
interpreter::group2value(L, pgroup);
return 1;
}
......@@ -2293,7 +2293,9 @@ int32 scriptlib::duel_check_release_group(lua_State *L) {
uint32 extraargs = lua_gettop(L) - 4;
duel* pduel = interpreter::get_duel_info(L);
uint32 fcount = lua_tointeger(L, 3);
lua_pushboolean(L, pduel->game_field->check_release_list(playerid, fcount, use_con, FALSE, 2, extraargs, pexception, pexgroup));
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();
lua_pushboolean(L, result);
return 1;
}
int32 scriptlib::duel_select_release_group(lua_State *L) {
......@@ -2343,7 +2345,9 @@ int32 scriptlib::duel_check_release_group_ex(lua_State *L) {
uint32 extraargs = lua_gettop(L) - 4;
duel* pduel = interpreter::get_duel_info(L);
uint32 fcount = lua_tointeger(L, 3);
lua_pushboolean(L, pduel->game_field->check_release_list(playerid, fcount, use_con, TRUE, 2, extraargs, pexception, pexgroup));
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();
lua_pushboolean(L, result);
return 1;
}
int32 scriptlib::duel_select_release_group_ex(lua_State *L) {
......
......@@ -3495,6 +3495,8 @@ int32 field::release(uint16 step, group * targets, effect * reason_effect, uint3
return FALSE;
}
case 4: {
for(auto eit = core.dec_count_reserve.begin(); eit != core.dec_count_reserve.end(); ++eit)
(*eit)->dec_count();
core.operated_set.clear();
core.operated_set = targets->container;
returns.ivalue[0] = targets->container.size();
......@@ -5586,7 +5588,8 @@ int32 field::select_release_cards(int16 step, uint8 playerid, uint8 cancelable,
case 4: {
card* pcard = core.select_cards[returns.bvalue[1]];
core.operated_set.insert(pcard);
core.units.begin()->peffect = pcard->is_affected_by_effect(EFFECT_EXTRA_RELEASE_NONSUM);
effect* peffect = pcard->is_affected_by_effect(EFFECT_EXTRA_RELEASE_NONSUM);
core.dec_count_reserve.push_back(peffect);
max--;
if(max == 0 || core.release_cards.empty()) {
core.units.begin()->step = 6;
......@@ -5622,9 +5625,6 @@ int32 field::select_release_cards(int16 step, uint8 playerid, uint8 cancelable,
core.select_cards.push_back(*cit);
returns.bvalue[i + 1] = i;
}
effect* peffect = core.units.begin()->peffect;
if(peffect)
peffect->dec_count();
return TRUE;
}
}
......
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