Commit 03e3b64b authored by nanahira's avatar nanahira
parents cbf40c34 c9c5ad88
...@@ -1638,6 +1638,13 @@ int32 field::check_release_list(uint8 playerid, int32 count, int32 use_con, int3 ...@@ -1638,6 +1638,13 @@ int32 field::check_release_list(uint8 playerid, int32 count, int32 use_con, int3
// 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_sum, 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_sum, group* mg, uint32 ex, uint32 releasable, uint32 pos) {
uint8 p = target->current.controler; uint8 p = target->current.controler;
card_set ex_tribute;
effect_set eset;
target->filter_effect(EFFECT_ADD_EXTRA_TRIBUTE, &eset);
for(int32 i = 0; i < eset.size(); ++i) {
if(eset[i]->get_value() & pos)
filter_inrange_cards(eset[i], &ex_tribute);
}
uint32 rcount = 0; uint32 rcount = 0;
for(auto cit = player[p].list_mzone.begin(); cit != player[p].list_mzone.end(); ++cit) { for(auto cit = player[p].list_mzone.begin(); cit != player[p].list_mzone.end(); ++cit) {
card* pcard = *cit; card* pcard = *cit;
...@@ -1660,13 +1667,17 @@ int32 field::get_summon_release_list(card* target, card_set* release_list, card_ ...@@ -1660,13 +1667,17 @@ int32 field::get_summon_release_list(card* target, card_set* release_list, card_
continue; continue;
if(mg && !mg->has_card(pcard)) if(mg && !mg->has_card(pcard))
continue; continue;
if(ex || pcard->is_affected_by_effect(EFFECT_EXTRA_RELEASE)) {
if(ex_list)
ex_list->insert(pcard);
if(pcard->is_affected_by_effect(EFFECT_DOUBLE_TRIBUTE, target)) if(pcard->is_affected_by_effect(EFFECT_DOUBLE_TRIBUTE, target))
pcard->release_param = 2; pcard->release_param = 2;
else else
pcard->release_param = 1; pcard->release_param = 1;
if(ex || pcard->is_affected_by_effect(EFFECT_EXTRA_RELEASE)) {
if(ex_list)
ex_list->insert(pcard);
rcount += pcard->release_param;
} else if(ex_tribute.find(pcard) != ex_tribute.end()) {
if(release_list)
release_list->insert(pcard);
rcount += pcard->release_param; rcount += pcard->release_param;
} else { } else {
effect* peffect = pcard->is_affected_by_effect(EFFECT_EXTRA_RELEASE_SUM); effect* peffect = pcard->is_affected_by_effect(EFFECT_EXTRA_RELEASE_SUM);
...@@ -1674,27 +1685,19 @@ int32 field::get_summon_release_list(card* target, card_set* release_list, card_ ...@@ -1674,27 +1685,19 @@ int32 field::get_summon_release_list(card* target, card_set* release_list, card_
continue; continue;
if(ex_list_sum) if(ex_list_sum)
ex_list_sum->insert(pcard); ex_list_sum->insert(pcard);
if(pcard->is_affected_by_effect(EFFECT_DOUBLE_TRIBUTE, target))
pcard->release_param = 2;
else
pcard->release_param = 1;
if(ex_sum_max < pcard->release_param) if(ex_sum_max < pcard->release_param)
ex_sum_max = pcard->release_param; ex_sum_max = pcard->release_param;
} }
} }
card_set cset; for(auto cit = ex_tribute.begin(); cit != ex_tribute.end(); ++cit) {
effect_set eset;
target->filter_effect(EFFECT_ADD_EXTRA_TRIBUTE, &eset);
for(int32 i = 0; i < eset.size(); ++i) {
if(eset[i]->get_value() & pos)
filter_inrange_cards(eset[i], &cset);
}
for(auto cit = cset.begin(); cit != cset.end(); ++cit) {
card* pcard = *cit; card* pcard = *cit;
if(pcard->current.location == LOCATION_MZONE || !pcard->is_releasable_by_summon(p, target)) if(pcard->current.location == LOCATION_MZONE || !pcard->is_releasable_by_summon(p, target))
continue; continue;
if(release_list) if(release_list)
release_list->insert(pcard); release_list->insert(pcard);
if(pcard->is_affected_by_effect(EFFECT_DOUBLE_TRIBUTE, target))
pcard->release_param = 2;
else
pcard->release_param = 1; pcard->release_param = 1;
rcount += pcard->release_param; rcount += pcard->release_param;
} }
...@@ -2740,7 +2743,8 @@ int32 field::check_other_synchro_material(const card_vector& nsyn, int32 lv, int ...@@ -2740,7 +2743,8 @@ int32 field::check_other_synchro_material(const card_vector& nsyn, int32 lv, int
} }
int32 field::check_tribute(card* pcard, int32 min, int32 max, group* mg, uint8 toplayer, uint32 zone, uint32 releasable, uint32 pos) { int32 field::check_tribute(card* pcard, int32 min, int32 max, group* mg, uint8 toplayer, uint32 zone, uint32 releasable, uint32 pos) {
int32 ex = FALSE; int32 ex = FALSE;
if(toplayer == 1 - pcard->current.controler) uint32 sumplayer = pcard->current.controler;
if(toplayer == 1 - sumplayer)
ex = TRUE; ex = TRUE;
card_set release_list, ex_list; card_set release_list, ex_list;
int32 m = get_summon_release_list(pcard, &release_list, &ex_list, 0, mg, ex, releasable, pos); int32 m = get_summon_release_list(pcard, &release_list, &ex_list, 0, mg, ex, releasable, pos);
...@@ -2750,12 +2754,12 @@ int32 field::check_tribute(card* pcard, int32 min, int32 max, group* mg, uint8 t ...@@ -2750,12 +2754,12 @@ int32 field::check_tribute(card* pcard, int32 min, int32 max, group* mg, uint8 t
return FALSE; return FALSE;
zone &= 0x1f; zone &= 0x1f;
int32 s = 0; int32 s = 0;
if(toplayer == pcard->current.controler) { if(toplayer == sumplayer) {
int32 ct = get_tofield_count(toplayer, LOCATION_MZONE, pcard->current.controler, LOCATION_REASON_TOFIELD, zone); int32 ct = get_tofield_count(toplayer, LOCATION_MZONE, sumplayer, LOCATION_REASON_TOFIELD, zone);
if(ct <= 0 && max <= 0) if(ct <= 0 && max <= 0)
return FALSE; return FALSE;
for(auto it = release_list.begin(); it != release_list.end(); ++it) { for(auto it = release_list.begin(); it != release_list.end(); ++it) {
if((*it)->current.location == LOCATION_MZONE) { if((*it)->current.location == LOCATION_MZONE && (*it)->current.controler == sumplayer) {
s++; s++;
if((zone >> (*it)->current.sequence) & 1) if((zone >> (*it)->current.sequence) & 1)
ct++; ct++;
...@@ -2767,7 +2771,7 @@ int32 field::check_tribute(card* pcard, int32 min, int32 max, group* mg, uint8 t ...@@ -2767,7 +2771,7 @@ int32 field::check_tribute(card* pcard, int32 min, int32 max, group* mg, uint8 t
} else { } else {
s = ex_list.size(); s = ex_list.size();
} }
int32 fcount = get_mzone_limit(toplayer, pcard->current.controler, LOCATION_REASON_TOFIELD); int32 fcount = get_mzone_limit(toplayer, sumplayer, LOCATION_REASON_TOFIELD);
if(s < -fcount + 1) if(s < -fcount + 1)
return FALSE; return FALSE;
if(max < 0) if(max < 0)
......
...@@ -5614,7 +5614,7 @@ int32 field::select_tribute_cards(int16 step, uint8 playerid, uint8 cancelable, ...@@ -5614,7 +5614,7 @@ int32 field::select_tribute_cards(int16 step, uint8 playerid, uint8 cancelable,
int32 rmax = 0; int32 rmax = 0;
core.select_cards.clear(); core.select_cards.clear();
for(auto cit = core.release_cards.begin(); cit != core.release_cards.end(); ++cit) { for(auto cit = core.release_cards.begin(); cit != core.release_cards.end(); ++cit) {
if((*cit)->current.location == LOCATION_MZONE && ((zone >> (*cit)->current.sequence) & 1)) if((*cit)->current.location == LOCATION_MZONE && (*cit)->current.controler == playerid && ((zone >> (*cit)->current.sequence) & 1))
core.select_cards.push_back(*cit); core.select_cards.push_back(*cit);
else else
rmax += (*cit)->release_param; rmax += (*cit)->release_param;
...@@ -5813,7 +5813,7 @@ int32 field::select_tribute_cards(int16 step, uint8 playerid, uint8 cancelable, ...@@ -5813,7 +5813,7 @@ int32 field::select_tribute_cards(int16 step, uint8 playerid, uint8 cancelable,
int32 rmax = 0; int32 rmax = 0;
core.select_cards.clear(); core.select_cards.clear();
for(auto cit = core.release_cards_ex.begin(); cit != core.release_cards_ex.end(); ++cit) { for(auto cit = core.release_cards_ex.begin(); cit != core.release_cards_ex.end(); ++cit) {
if((*cit)->current.location == LOCATION_MZONE && ((zone >> (*cit)->current.sequence) & 1)) if((*cit)->current.location == LOCATION_MZONE && (*cit)->current.controler == playerid && ((zone >> (*cit)->current.sequence) & 1))
core.select_cards.push_back(*cit); core.select_cards.push_back(*cit);
else else
rmax += (*cit)->release_param; rmax += (*cit)->release_param;
......
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