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