Commit d5a848d9 authored by Chen Bill's avatar Chen Bill

use set in filter_matching_card, filter_field_card

parent 451dded1
...@@ -1447,7 +1447,7 @@ void field::filter_player_effect(uint8 playerid, uint32 code, effect_set* eset, ...@@ -1447,7 +1447,7 @@ void field::filter_player_effect(uint8 playerid, uint32 code, effect_set* eset,
int32 field::filter_matching_card(int32 findex, uint8 self, uint32 location1, uint32 location2, group* pgroup, card* pexception, group* pexgroup, uint32 extraargs, card** pret, int32 fcount, int32 is_target) { int32 field::filter_matching_card(int32 findex, uint8 self, uint32 location1, uint32 location2, group* pgroup, card* pexception, group* pexgroup, uint32 extraargs, card** pret, int32 fcount, int32 is_target) {
if(self != 0 && self != 1) if(self != 0 && self != 1)
return FALSE; return FALSE;
int32 count = 0; card_set result;
uint32 location = location1; uint32 location = location1;
for(uint32 p = 0; p < 2; ++p) { for(uint32 p = 0; p < 2; ++p) {
if(location & LOCATION_MZONE) { if(location & LOCATION_MZONE) {
...@@ -1460,12 +1460,9 @@ int32 field::filter_matching_card(int32 findex, uint8 self, uint32 location1, ui ...@@ -1460,12 +1460,9 @@ int32 field::filter_matching_card(int32 findex, uint8 self, uint32 location1, ui
*pret = pcard; *pret = pcard;
return TRUE; return TRUE;
} }
++count; result.insert(pcard);
if(fcount && count >= fcount) if(fcount && (int32)result.size() >= fcount)
return TRUE; return TRUE;
if(pgroup) {
pgroup->container.insert(pcard);
}
} }
} }
} }
...@@ -1479,12 +1476,9 @@ int32 field::filter_matching_card(int32 findex, uint8 self, uint32 location1, ui ...@@ -1479,12 +1476,9 @@ int32 field::filter_matching_card(int32 findex, uint8 self, uint32 location1, ui
*pret = pcard; *pret = pcard;
return TRUE; return TRUE;
} }
++count; result.insert(pcard);
if(fcount && count >= fcount) if(fcount && (int32)result.size() >= fcount)
return TRUE; return TRUE;
if(pgroup) {
pgroup->container.insert(pcard);
}
} }
} }
} }
...@@ -1498,12 +1492,9 @@ int32 field::filter_matching_card(int32 findex, uint8 self, uint32 location1, ui ...@@ -1498,12 +1492,9 @@ int32 field::filter_matching_card(int32 findex, uint8 self, uint32 location1, ui
*pret = pcard; *pret = pcard;
return TRUE; return TRUE;
} }
++count; result.insert(pcard);
if(fcount && count >= fcount) if (fcount && (int32)result.size() >= fcount)
return TRUE; return TRUE;
if(pgroup) {
pgroup->container.insert(pcard);
}
} }
} }
if(location & LOCATION_PZONE) { if(location & LOCATION_PZONE) {
...@@ -1517,12 +1508,9 @@ int32 field::filter_matching_card(int32 findex, uint8 self, uint32 location1, ui ...@@ -1517,12 +1508,9 @@ int32 field::filter_matching_card(int32 findex, uint8 self, uint32 location1, ui
*pret = pcard; *pret = pcard;
return TRUE; return TRUE;
} }
++count; result.insert(pcard);
if(fcount && count >= fcount) if(fcount && (int32)result.size() >= fcount)
return TRUE; return TRUE;
if(pgroup) {
pgroup->container.insert(pcard);
}
} }
} }
} }
...@@ -1535,12 +1523,9 @@ int32 field::filter_matching_card(int32 findex, uint8 self, uint32 location1, ui ...@@ -1535,12 +1523,9 @@ int32 field::filter_matching_card(int32 findex, uint8 self, uint32 location1, ui
*pret = *cit; *pret = *cit;
return TRUE; return TRUE;
} }
++count; result.insert(*cit);
if(fcount && count >= fcount) if(fcount && (int32)result.size() >= fcount)
return TRUE; return TRUE;
if(pgroup) {
pgroup->container.insert(*cit);
}
} }
} }
} }
...@@ -1553,12 +1538,9 @@ int32 field::filter_matching_card(int32 findex, uint8 self, uint32 location1, ui ...@@ -1553,12 +1538,9 @@ int32 field::filter_matching_card(int32 findex, uint8 self, uint32 location1, ui
*pret = *cit; *pret = *cit;
return TRUE; return TRUE;
} }
++count; result.insert(*cit);
if(fcount && count >= fcount) if(fcount && (int32)result.size() >= fcount)
return TRUE; return TRUE;
if(pgroup) {
pgroup->container.insert(*cit);
}
} }
} }
} }
...@@ -1571,12 +1553,9 @@ int32 field::filter_matching_card(int32 findex, uint8 self, uint32 location1, ui ...@@ -1571,12 +1553,9 @@ int32 field::filter_matching_card(int32 findex, uint8 self, uint32 location1, ui
*pret = pcard; *pret = pcard;
return TRUE; return TRUE;
} }
++count; result.insert(pcard);
if(fcount && count >= fcount) if(fcount && (int32)result.size() >= fcount)
return TRUE; return TRUE;
if(pgroup) {
pgroup->container.insert(pcard);
}
} }
} }
} }
...@@ -1589,12 +1568,9 @@ int32 field::filter_matching_card(int32 findex, uint8 self, uint32 location1, ui ...@@ -1589,12 +1568,9 @@ int32 field::filter_matching_card(int32 findex, uint8 self, uint32 location1, ui
*pret = *cit; *pret = *cit;
return TRUE; return TRUE;
} }
++count; result.insert(*cit);
if(fcount && count >= fcount) if(fcount && (int32)result.size() >= fcount)
return TRUE; return TRUE;
if(pgroup) {
pgroup->container.insert(*cit);
}
} }
} }
} }
...@@ -1607,18 +1583,17 @@ int32 field::filter_matching_card(int32 findex, uint8 self, uint32 location1, ui ...@@ -1607,18 +1583,17 @@ int32 field::filter_matching_card(int32 findex, uint8 self, uint32 location1, ui
*pret = *cit; *pret = *cit;
return TRUE; return TRUE;
} }
++count; result.insert(*cit);
if(fcount && count >= fcount) if(fcount && (int32)result.size() >= fcount)
return TRUE; return TRUE;
if(pgroup) {
pgroup->container.insert(*cit);
}
} }
} }
} }
location = location2; location = location2;
self = 1 - self; self = 1 - self;
} }
if (pgroup)
pgroup->container.insert(result.begin(), result.end());
return FALSE; return FALSE;
} }
// Duel.GetFieldGroup(), Duel.GetFieldGroupCount() // Duel.GetFieldGroup(), Duel.GetFieldGroupCount()
...@@ -1626,73 +1601,57 @@ int32 field::filter_field_card(uint8 self, uint32 location1, uint32 location2, g ...@@ -1626,73 +1601,57 @@ int32 field::filter_field_card(uint8 self, uint32 location1, uint32 location2, g
if(self != 0 && self != 1) if(self != 0 && self != 1)
return 0; return 0;
uint32 location = location1; uint32 location = location1;
uint32 count = 0; card_set result;
for(uint32 p = 0; p < 2; ++p) { for(uint32 p = 0; p < 2; ++p) {
if(location & LOCATION_MZONE) { if(location & LOCATION_MZONE) {
for(auto& pcard : player[self].list_mzone) { for(auto& pcard : player[self].list_mzone) {
if(pcard && !pcard->get_status(STATUS_SUMMONING | STATUS_SPSUMMON_STEP)) { if(pcard && !pcard->get_status(STATUS_SUMMONING | STATUS_SPSUMMON_STEP)) {
if(pgroup) result.insert(pcard);
pgroup->container.insert(pcard);
++count;
} }
} }
} }
if(location & LOCATION_SZONE) { if(location & LOCATION_SZONE) {
for(auto& pcard : player[self].list_szone) { for(auto& pcard : player[self].list_szone) {
if(pcard) { if(pcard) {
if(pgroup) result.insert(pcard);
pgroup->container.insert(pcard);
++count;
} }
} }
} }
if(location & LOCATION_FZONE) { if(location & LOCATION_FZONE) {
card* pcard = player[self].list_szone[5]; card* pcard = player[self].list_szone[5];
if(pcard) { if(pcard) {
if(pgroup) result.insert(pcard);
pgroup->container.insert(pcard);
++count;
} }
} }
if(location & LOCATION_PZONE) { if(location & LOCATION_PZONE) {
for(int32 i = 0; i < 2; ++i) { for(int32 i = 0; i < 2; ++i) {
card* pcard = player[self].list_szone[core.duel_rule >= 4 ? i * 4 : i + 6]; card* pcard = player[self].list_szone[core.duel_rule >= 4 ? i * 4 : i + 6];
if(pcard && pcard->current.pzone) { if(pcard && pcard->current.pzone) {
if(pgroup) result.insert(pcard);
pgroup->container.insert(pcard);
++count;
} }
} }
} }
if(location & LOCATION_HAND) { if(location & LOCATION_HAND) {
if(pgroup) result.insert(player[self].list_hand.begin(), player[self].list_hand.end());
pgroup->container.insert(player[self].list_hand.begin(), player[self].list_hand.end());
count += (uint32)player[self].list_hand.size();
} }
if(location & LOCATION_DECK) { if(location & LOCATION_DECK) {
if(pgroup) result.insert(player[self].list_main.rbegin(), player[self].list_main.rend());
pgroup->container.insert(player[self].list_main.rbegin(), player[self].list_main.rend());
count += (uint32)player[self].list_main.size();
} }
if(location & LOCATION_EXTRA) { if(location & LOCATION_EXTRA) {
if(pgroup) result.insert(player[self].list_extra.rbegin(), player[self].list_extra.rend());
pgroup->container.insert(player[self].list_extra.rbegin(), player[self].list_extra.rend());
count += (uint32)player[self].list_extra.size();
} }
if(location & LOCATION_GRAVE) { if(location & LOCATION_GRAVE) {
if(pgroup) result.insert(player[self].list_grave.rbegin(), player[self].list_grave.rend());
pgroup->container.insert(player[self].list_grave.rbegin(), player[self].list_grave.rend());
count += (uint32)player[self].list_grave.size();
} }
if(location & LOCATION_REMOVED) { if(location & LOCATION_REMOVED) {
if(pgroup) result.insert(player[self].list_remove.rbegin(), player[self].list_remove.rend());
pgroup->container.insert(player[self].list_remove.rbegin(), player[self].list_remove.rend());
count += (uint32)player[self].list_remove.size();
} }
location = location2; location = location2;
self = 1 - self; self = 1 - self;
} }
return count; if (pgroup)
pgroup->container.insert(result.begin(), result.end());
return result.size();
} }
effect* field::is_player_affected_by_effect(uint8 playerid, uint32 code) { effect* field::is_player_affected_by_effect(uint8 playerid, uint32 code) {
auto rg = effects.aura_effect.equal_range(code); auto rg = effects.aura_effect.equal_range(code);
......
...@@ -2642,7 +2642,7 @@ int32 scriptlib::duel_is_existing_matching_card(lua_State *L) { ...@@ -2642,7 +2642,7 @@ int32 scriptlib::duel_is_existing_matching_card(lua_State *L) {
uint32 location1 = (uint32)lua_tointeger(L, 3); uint32 location1 = (uint32)lua_tointeger(L, 3);
uint32 location2 = (uint32)lua_tointeger(L, 4); uint32 location2 = (uint32)lua_tointeger(L, 4);
uint32 fcount = (uint32)lua_tointeger(L, 5); uint32 fcount = (uint32)lua_tointeger(L, 5);
lua_pushboolean(L, pduel->game_field->filter_matching_card(1, (uint8)self, location1, location2, 0, pexception, pexgroup, extraargs, 0, fcount)); lua_pushboolean(L, pduel->game_field->filter_matching_card(1, (uint8)self, location1, location2, 0, pexception, pexgroup, extraargs, nullptr, fcount));
return 1; return 1;
} }
/** /**
...@@ -2990,7 +2990,7 @@ int32 scriptlib::duel_get_target_count(lua_State *L) { ...@@ -2990,7 +2990,7 @@ int32 scriptlib::duel_get_target_count(lua_State *L) {
uint32 location2 = (uint32)lua_tointeger(L, 4); uint32 location2 = (uint32)lua_tointeger(L, 4);
group* pgroup = pduel->new_group(); group* pgroup = pduel->new_group();
uint32 count = 0; uint32 count = 0;
pduel->game_field->filter_matching_card(1, (uint8)self, location1, location2, pgroup, pexception, pexgroup, extraargs, 0, 0, TRUE); pduel->game_field->filter_matching_card(1, (uint8)self, location1, location2, pgroup, pexception, pexgroup, extraargs, nullptr, 0, TRUE);
count = (uint32)pgroup->container.size(); count = (uint32)pgroup->container.size();
lua_pushinteger(L, count); lua_pushinteger(L, count);
return 1; return 1;
...@@ -3016,7 +3016,7 @@ int32 scriptlib::duel_is_existing_target(lua_State *L) { ...@@ -3016,7 +3016,7 @@ int32 scriptlib::duel_is_existing_target(lua_State *L) {
uint32 location1 = (uint32)lua_tointeger(L, 3); uint32 location1 = (uint32)lua_tointeger(L, 3);
uint32 location2 = (uint32)lua_tointeger(L, 4); uint32 location2 = (uint32)lua_tointeger(L, 4);
uint32 count = (uint32)lua_tointeger(L, 5); uint32 count = (uint32)lua_tointeger(L, 5);
lua_pushboolean(L, pduel->game_field->filter_matching_card(1, (uint8)self, location1, location2, 0, pexception, pexgroup, extraargs, 0, count, TRUE)); lua_pushboolean(L, pduel->game_field->filter_matching_card(1, (uint8)self, location1, location2, 0, pexception, pexgroup, extraargs, nullptr, count, TRUE));
return 1; return 1;
} }
/** /**
...@@ -3048,7 +3048,7 @@ int32 scriptlib::duel_select_target(lua_State *L) { ...@@ -3048,7 +3048,7 @@ int32 scriptlib::duel_select_target(lua_State *L) {
if(pduel->game_field->core.current_chain.size() == 0) if(pduel->game_field->core.current_chain.size() == 0)
return 0; return 0;
group* pgroup = pduel->new_group(); group* pgroup = pduel->new_group();
pduel->game_field->filter_matching_card(2, (uint8)self, location1, location2, pgroup, pexception, pexgroup, extraargs, 0, 0, TRUE); pduel->game_field->filter_matching_card(2, (uint8)self, location1, location2, pgroup, pexception, pexgroup, extraargs, nullptr, 0, TRUE);
pduel->game_field->core.select_cards.assign(pgroup->container.begin(), pgroup->container.end()); pduel->game_field->core.select_cards.assign(pgroup->container.begin(), pgroup->container.end());
pduel->game_field->add_process(PROCESSOR_SELECT_CARD, 0, 0, 0, playerid, min + (max << 16)); pduel->game_field->add_process(PROCESSOR_SELECT_CARD, 0, 0, 0, playerid, min + (max << 16));
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) {
......
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