Commit 9b4a241e authored by Chen Bill's avatar Chen Bill Committed by GitHub

card: add filter_effect_container (unordered_set) (#681)

parent 276f504b
...@@ -2611,6 +2611,13 @@ void card::filter_effect_container(const effect_container& container, uint32 cod ...@@ -2611,6 +2611,13 @@ void card::filter_effect_container(const effect_container& container, uint32 cod
eset.add_item(it->second); eset.add_item(it->second);
} }
} }
void card::filter_effect_container(const effect_container& container, uint32 code, effect_filter f, effect_collection& eset) {
auto rg = container.equal_range(code);
for (auto it = rg.first; it != rg.second; ++it) {
if (f(this, it->second))
eset.insert(it->second);
}
}
void card::filter_effect(uint32 code, effect_set* eset, uint8 sort) { void card::filter_effect(uint32 code, effect_set* eset, uint8 sort) {
filter_effect_container(single_effect, code, default_single_filter, *eset); filter_effect_container(single_effect, code, default_single_filter, *eset);
for (const auto& pcard : equiping_cards) for (const auto& pcard : equiping_cards)
...@@ -2865,12 +2872,11 @@ int32 card::check_set_procedure(effect* proc, uint8 playerid, uint8 ignore_count ...@@ -2865,12 +2872,11 @@ int32 card::check_set_procedure(effect* proc, uint8 playerid, uint8 ignore_count
return FALSE; return FALSE;
} }
void card::filter_spsummon_procedure(uint8 playerid, effect_set* peset, uint32 summon_type, material_info info) { void card::filter_spsummon_procedure(uint8 playerid, effect_set* peset, uint32 summon_type, material_info info) {
auto pr = field_effect.equal_range(EFFECT_SPSUMMON_PROC); effect_collection proc_set;
uint8 toplayer; filter_effect_container(field_effect, EFFECT_SPSUMMON_PROC, accept_filter, proc_set);
uint8 topos; for (auto& peffect : proc_set) {
for(auto eit = pr.first; eit != pr.second;) { uint8 toplayer{};
effect* peffect = eit->second; uint8 topos{};
++eit;
if(peffect->is_flag(EFFECT_FLAG_SPSUM_PARAM)) { if(peffect->is_flag(EFFECT_FLAG_SPSUM_PARAM)) {
topos = (uint8)peffect->s_range; topos = (uint8)peffect->s_range;
if(peffect->o_range == 0) if(peffect->o_range == 0)
...@@ -2894,10 +2900,9 @@ void card::filter_spsummon_procedure(uint8 playerid, effect_set* peset, uint32 s ...@@ -2894,10 +2900,9 @@ void card::filter_spsummon_procedure(uint8 playerid, effect_set* peset, uint32 s
} }
} }
void card::filter_spsummon_procedure_g(uint8 playerid, effect_set* peset) { void card::filter_spsummon_procedure_g(uint8 playerid, effect_set* peset) {
auto pr = field_effect.equal_range(EFFECT_SPSUMMON_PROC_G); effect_collection proc_set;
for(auto eit = pr.first; eit != pr.second;) { filter_effect_container(field_effect, EFFECT_SPSUMMON_PROC_G, accept_filter, proc_set);
effect* peffect = eit->second; for (auto& peffect : proc_set) {
++eit;
if(!peffect->is_available() || !peffect->check_count_limit(playerid)) if(!peffect->is_available() || !peffect->check_count_limit(playerid))
continue; continue;
if(current.controler != playerid && !peffect->is_flag(EFFECT_FLAG_BOTH_SIDE)) if(current.controler != playerid && !peffect->is_flag(EFFECT_FLAG_BOTH_SIDE))
......
...@@ -327,6 +327,7 @@ public: ...@@ -327,6 +327,7 @@ public:
template<typename T> template<typename T>
void filter_effect_container(const effect_container& container, uint32 code, effect_filter f, T& eset); void filter_effect_container(const effect_container& container, uint32 code, effect_filter f, T& eset);
void filter_effect_container(const effect_container& container, uint32 code, effect_filter f, effect_collection& eset);
void filter_effect(uint32 code, effect_set* eset, uint8 sort = TRUE); void filter_effect(uint32 code, effect_set* eset, uint8 sort = TRUE);
void filter_single_continuous_effect(uint32 code, effect_set* eset, uint8 sort = TRUE); void filter_single_continuous_effect(uint32 code, effect_set* eset, uint8 sort = TRUE);
void filter_self_effect(uint32 code, effect_set* eset, uint8 sort = TRUE); void filter_self_effect(uint32 code, effect_set* eset, uint8 sort = 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