Commit 6f3d6507 authored by VanillaSalt's avatar VanillaSalt

update tribute summon

parent f33afa5d
......@@ -2627,12 +2627,23 @@ int32 field::check_tribute(card* pcard, int32 min, int32 max, group* mg, uint8 t
return FALSE;
int32 s;
if(toplayer == pcard->current.controler) {
int32 ct = get_tofield_count(toplayer, LOCATION_MZONE);
if(ct <= 0) {
if(max <= 0)
return FALSE;
for(auto it = release_list.begin(); it != release_list.end(); ++it) {
if((*it)->current.sequence < 5)
ct++;
}
if(ct <= 0)
return FALSE;
}
s = release_list.size();
max -= (int32)ex_list.size();
} else {
s = ex_list.size();
}
int32 fcount = get_useable_count(toplayer, LOCATION_MZONE, pcard->current.controler, LOCATION_REASON_TOFIELD);
int32 fcount = get_mzone_limit(toplayer, pcard->current.controler, LOCATION_REASON_TOFIELD);
if(s < -fcount + 1)
return FALSE;
if(max < 0)
......
......@@ -975,45 +975,19 @@ int32 field::swap_control(uint16 step, effect* reason_effect, uint8 reason_playe
if(!pcard->is_affect_by_effect(reason_effect))
return FALSE;
}
int32 max = 5;
effect_set eset;
filter_player_effect(p1, EFFECT_MAX_MZONE, &eset);
for (int32 i = 0; i < eset.size(); ++i) {
pduel->lua->add_param(p1, PARAM_TYPE_INT);
pduel->lua->add_param(reason_player, PARAM_TYPE_INT);
pduel->lua->add_param(LOCATION_REASON_CONTROL, PARAM_TYPE_INT);
int32 v = eset[i]->get_value(3);
if (max > v)
max = v;
}
std::set<card*> cset;
cset.insert(targets1->container.begin(), targets1->container.end());
for(int32 i = 0; i < 5; ++i) {
card* pcard = player[p1].list_mzone[i];
if(pcard)
cset.insert(pcard);
int32 ct = get_useable_count(p1, LOCATION_MZONE, reason_player, LOCATION_REASON_CONTROL);
for(auto cit = targets1->container.begin(); cit != targets1->container.end(); ++cit) {
if((*cit)->current.sequence >= 5)
ct--;
}
if((int32)cset.size() > max)
if(ct < 0)
return FALSE;
max = 5;
eset.clear();
filter_player_effect(p2, EFFECT_MAX_MZONE, &eset);
for (int32 i = 0; i < eset.size(); ++i) {
pduel->lua->add_param(p2, PARAM_TYPE_INT);
pduel->lua->add_param(reason_player, PARAM_TYPE_INT);
pduel->lua->add_param(LOCATION_REASON_CONTROL, PARAM_TYPE_INT);
int32 v = eset[i]->get_value(3);
if (max > v)
max = v;
}
cset.clear();
cset.insert(targets2->container.begin(), targets2->container.end());
for(int32 i = 0; i < 5; ++i) {
card* pcard = player[p2].list_mzone[i];
if(pcard)
cset.insert(pcard);
ct = get_useable_count(p2, LOCATION_MZONE, reason_player, LOCATION_REASON_CONTROL);
for(auto cit = targets2->container.begin(); cit != targets2->container.end(); ++cit) {
if((*cit)->current.sequence >= 5)
ct--;
}
if((int32)cset.size() > max)
if(ct < 0)
return FALSE;
for(auto cit = targets1->container.begin(); cit != targets1->container.end(); ++cit) {
card* pcard = *cit;
......@@ -5145,8 +5119,57 @@ int32 field::select_release_cards(int16 step, uint8 playerid, uint8 check_field,
int32 field::select_tribute_cards(int16 step, uint8 playerid, uint8 cancelable, int32 min, int32 max) {
switch(step) {
case 0: {
core.operated_set.clear();
int32 ct = get_tofield_count(playerid, LOCATION_MZONE);
if(ct > 0) {
returns.ivalue[0] = TRUE;
core.units.begin()->step = 1;
return FALSE;
}
core.select_cards.clear();
for(auto cit = core.release_cards.begin(); cit != core.release_cards.end(); ++cit) {
if((*cit)->current.sequence < 5)
core.select_cards.push_back(*cit);
}
pduel->write_buffer8(MSG_HINT);
pduel->write_buffer8(HINT_SELECTMSG);
pduel->write_buffer8(playerid);
pduel->write_buffer32(500);
if(core.release_cards_ex.empty() && core.release_cards_ex_sum.empty()
&& core.release_cards.size() == core.select_cards.size()) {
add_process(PROCESSOR_SELECT_TRIBUTE_P, 0, 0, 0, ((uint32)cancelable << 16) + playerid, (max << 16) + min);
return TRUE;
}
add_process(PROCESSOR_SELECT_CARD, 0, 0, 0, ((uint32)cancelable << 16) + playerid, 0x10001);
return FALSE;
}
case 1: {
if(returns.ivalue[0] == -1)
return TRUE;
card* pcard = core.select_cards[returns.bvalue[1]];
core.operated_set.insert(pcard);
auto it = std::find(core.release_cards.begin(), core.release_cards.end(), pcard);
core.release_cards.erase(it);
if(min <= (int32)pcard->release_param) {
if(max > 1 && (!core.release_cards.empty() || !core.release_cards_ex.empty() || !core.release_cards_ex_sum.empty()))
add_process(PROCESSOR_SELECT_YESNO, 0, 0, 0, playerid, 210);
else
core.units.begin()->step = 8;
} else
returns.ivalue[0] = TRUE;
return FALSE;
}
case 2: {
if(!returns.ivalue[0]) {
core.units.begin()->step = 8;
return FALSE;
}
if(!core.operated_set.empty()) {
min -= (*core.operated_set.begin())->release_param;
max--;
}
if(core.release_cards_ex.size() + core.release_cards_ex_sum.size() == 0
|| (get_useable_count(playerid, LOCATION_MZONE, playerid, LOCATION_REASON_TOFIELD) <= 0 && min < 2)) {
|| (get_mzone_limit(playerid, playerid, LOCATION_REASON_TOFIELD) <= 0 && min < 2)) {
core.select_cards.clear();
for(auto cit = core.release_cards.begin(); cit != core.release_cards.end(); ++cit)
core.select_cards.push_back(*cit);
......@@ -5155,7 +5178,8 @@ int32 field::select_tribute_cards(int16 step, uint8 playerid, uint8 cancelable,
pduel->write_buffer8(playerid);
pduel->write_buffer32(500);
add_process(PROCESSOR_SELECT_TRIBUTE_P, 0, 0, 0, ((uint32)cancelable << 16) + playerid, (max << 16) + min);
return TRUE;
core.units.begin()->step = 7;
return FALSE;
}
if(core.release_cards_ex.size() >= (uint32)max) {
core.select_cards.clear();
......@@ -5166,9 +5190,9 @@ int32 field::select_tribute_cards(int16 step, uint8 playerid, uint8 cancelable,
pduel->write_buffer8(playerid);
pduel->write_buffer32(500);
add_process(PROCESSOR_SELECT_TRIBUTE_P, 0, 0, 0, ((uint32)cancelable << 16) + playerid, (max << 16) + min);
return TRUE;
core.units.begin()->step = 7;
return FALSE;
}
core.operated_set.clear();
core.select_cards.clear();
int32 rmax = 0;
for(auto cit = core.release_cards.begin(); cit != core.release_cards.end(); ++cit)
......@@ -5183,12 +5207,12 @@ int32 field::select_tribute_cards(int16 step, uint8 playerid, uint8 cancelable,
} else if(!core.release_cards_ex_sum.empty())
add_process(PROCESSOR_SELECT_YESNO, 0, 0, 0, playerid, 92);
else
core.units.begin()->step = 2;
core.units.begin()->step = 4;
return FALSE;
}
case 1: {
case 3: {
if(!returns.ivalue[0]) {
core.units.begin()->step = 2;
core.units.begin()->step = 4;
return FALSE;
}
if(core.temp_var[0] == 0)
......@@ -5205,17 +5229,15 @@ int32 field::select_tribute_cards(int16 step, uint8 playerid, uint8 cancelable,
add_process(PROCESSOR_SELECT_CARD, 0, 0, 0, ((uint32)cancelable << 16) + playerid, 0x10001);
return FALSE;
}
case 2: {
case 4: {
if(returns.ivalue[0] == -1)
return TRUE;
for(int32 i = 0; i < returns.bvalue[0]; ++i) {
card* pcard = core.select_cards[returns.bvalue[i + 1]];
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_SUM);
}
return FALSE;
}
case 3: {
case 5: {
for(auto cit = core.release_cards_ex.begin(); cit != core.release_cards_ex.end(); ++cit)
core.select_cards.push_back(*cit);
pduel->write_buffer8(MSG_HINT);
......@@ -5225,7 +5247,7 @@ int32 field::select_tribute_cards(int16 step, uint8 playerid, uint8 cancelable,
add_process(PROCESSOR_SELECT_CARD, 0, 0, 0, ((uint32)cancelable << 16) + playerid, (core.release_cards_ex.size() << 16) + core.release_cards_ex.size());
return FALSE;
}
case 4: {
case 6: {
if(returns.ivalue[0] == -1)
return TRUE;
for(int32 i = 0; i < returns.bvalue[0]; ++i)
......@@ -5241,14 +5263,14 @@ int32 field::select_tribute_cards(int16 step, uint8 playerid, uint8 cancelable,
if(max > 0 && !core.release_cards.empty())
add_process(PROCESSOR_SELECT_YESNO, 0, 0, 0, playerid, 210);
else
core.units.begin()->step = 6;
core.units.begin()->step = 8;
} else
returns.ivalue[0] = TRUE;
return FALSE;
}
case 5: {
case 7: {
if(!returns.ivalue[0]) {
core.units.begin()->step = 6;
core.units.begin()->step = 8;
return FALSE;
}
core.select_cards.clear();
......@@ -5261,14 +5283,14 @@ int32 field::select_tribute_cards(int16 step, uint8 playerid, uint8 cancelable,
add_process(PROCESSOR_SELECT_TRIBUTE_P, 0, 0, 0, ((uint32)cancelable << 16) + playerid, (max << 16) + min);
return FALSE;
}
case 6: {
case 8: {
if(returns.ivalue[0] == -1)
return TRUE;
for(int32 i = 0; i < returns.bvalue[0]; ++i)
core.operated_set.insert(core.select_cards[returns.bvalue[i + 1]]);
return FALSE;
}
case 7: {
case 9: {
core.select_cards.clear();
returns.bvalue[0] = core.operated_set.size();
int32 i = 0;
......
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