Commit 62ce34a1 authored by VanillaSalt's avatar VanillaSalt

fix

parent bc98ce92
...@@ -242,10 +242,11 @@ uint32 card::get_code() { ...@@ -242,10 +242,11 @@ uint32 card::get_code() {
return code; return code;
} }
uint32 card::get_another_code() { uint32 card::get_another_code() {
effect_set eset, eset2; if(is_affected_by_effect(EFFECT_CHANGE_CODE))
return 0;
effect_set eset;
filter_effect(EFFECT_ADD_CODE, &eset); filter_effect(EFFECT_ADD_CODE, &eset);
filter_effect(EFFECT_CHANGE_CODE, &eset2); if(!eset.size())
if(!eset.size() || eset2.size())
return 0; return 0;
uint32 otcode = eset.get_last()->get_value(this); uint32 otcode = eset.get_last()->get_value(this);
if(get_code() != otcode) if(get_code() != otcode)
...@@ -1521,21 +1522,23 @@ void card::filter_disable_related_cards() { ...@@ -1521,21 +1522,23 @@ void card::filter_disable_related_cards() {
int32 card::filter_summon_procedure(uint8 playerid, effect_set* peset, uint8 ignore_count, uint8 min_tribute) { int32 card::filter_summon_procedure(uint8 playerid, effect_set* peset, uint8 ignore_count, uint8 min_tribute) {
effect_set eset; effect_set eset;
filter_effect(EFFECT_LIMIT_SUMMON_PROC, &eset); filter_effect(EFFECT_LIMIT_SUMMON_PROC, &eset);
for(int32 i = 0; i < eset.size(); ++i) if(eset.size()) {
for(int32 i = 0; i < eset.size(); ++i) {
if(eset[i]->check_count_limit(playerid) && is_summonable(eset[i], min_tribute) if(eset[i]->check_count_limit(playerid) && is_summonable(eset[i], min_tribute)
&& pduel->game_field->is_player_can_summon(eset[i]->get_value(this), playerid, this)) && pduel->game_field->is_player_can_summon(eset[i]->get_value(this), playerid, this))
peset->add_item(eset[i]); peset->add_item(eset[i]);
if(eset.size()) { }
if(peset->size()) if(peset->size())
return -1; return -1;
return -2; return -2;
} }
eset.clear(); eset.clear();
filter_effect(EFFECT_SUMMON_PROC, &eset); filter_effect(EFFECT_SUMMON_PROC, &eset);
for(int32 i = 0; i < eset.size(); ++i) for(int32 i = 0; i < eset.size(); ++i) {
if(eset[i]->check_count_limit(playerid) && is_summonable(eset[i], min_tribute) if(eset[i]->check_count_limit(playerid) && is_summonable(eset[i], min_tribute)
&& pduel->game_field->is_player_can_summon(eset[i]->get_value(this), playerid, this)) && pduel->game_field->is_player_can_summon(eset[i]->get_value(this), playerid, this))
peset->add_item(eset[i]); peset->add_item(eset[i]);
}
if(!pduel->game_field->is_player_can_summon(SUMMON_TYPE_NORMAL, playerid, this)) if(!pduel->game_field->is_player_can_summon(SUMMON_TYPE_NORMAL, playerid, this))
return FALSE; return FALSE;
int32 rcount = get_summon_tribute_count(); int32 rcount = get_summon_tribute_count();
...@@ -1561,21 +1564,23 @@ int32 card::filter_summon_procedure(uint8 playerid, effect_set* peset, uint8 ign ...@@ -1561,21 +1564,23 @@ int32 card::filter_summon_procedure(uint8 playerid, effect_set* peset, uint8 ign
int32 card::filter_set_procedure(uint8 playerid, effect_set* peset, uint8 ignore_count, uint8 min_tribute) { int32 card::filter_set_procedure(uint8 playerid, effect_set* peset, uint8 ignore_count, uint8 min_tribute) {
effect_set eset; effect_set eset;
filter_effect(EFFECT_LIMIT_SET_PROC, &eset); filter_effect(EFFECT_LIMIT_SET_PROC, &eset);
for(int32 i = 0; i < eset.size(); ++i) if(eset.size()) {
for(int32 i = 0; i < eset.size(); ++i) {
if(eset[i]->check_count_limit(playerid) && is_summonable(eset[i], min_tribute) if(eset[i]->check_count_limit(playerid) && is_summonable(eset[i], min_tribute)
&& pduel->game_field->is_player_can_mset(eset[i]->get_value(this), playerid, this)) && pduel->game_field->is_player_can_mset(eset[i]->get_value(this), playerid, this))
peset->add_item(eset[i]); peset->add_item(eset[i]);
if(eset.size()) { }
if(peset->size()) if(peset->size())
return -1; return -1;
return -2; return -2;
} }
eset.clear(); eset.clear();
filter_effect(EFFECT_SET_PROC, &eset); filter_effect(EFFECT_SET_PROC, &eset);
for(int32 i = 0; i < eset.size(); ++i) for(int32 i = 0; i < eset.size(); ++i) {
if(eset[i]->check_count_limit(playerid) && is_summonable(eset[i], min_tribute) if(eset[i]->check_count_limit(playerid) && is_summonable(eset[i], min_tribute)
&& pduel->game_field->is_player_can_mset(eset[i]->get_value(this), playerid, this)) && pduel->game_field->is_player_can_mset(eset[i]->get_value(this), playerid, this))
peset->add_item(eset[i]); peset->add_item(eset[i]);
}
if(!pduel->game_field->is_player_can_mset(SUMMON_TYPE_NORMAL, playerid, this)) if(!pduel->game_field->is_player_can_mset(SUMMON_TYPE_NORMAL, playerid, this))
return FALSE; return FALSE;
int32 rcount = get_set_tribute_count(); int32 rcount = get_set_tribute_count();
...@@ -2402,17 +2407,18 @@ int32 card::is_capable_be_battle_target(card* pcard) { ...@@ -2402,17 +2407,18 @@ int32 card::is_capable_be_battle_target(card* pcard) {
int32 card::is_capable_be_effect_target(effect* peffect, uint8 playerid) { int32 card::is_capable_be_effect_target(effect* peffect, uint8 playerid) {
if(is_status(STATUS_SUMMONING) || is_status(STATUS_BATTLE_DESTROYED)) if(is_status(STATUS_SUMMONING) || is_status(STATUS_BATTLE_DESTROYED))
return FALSE; return FALSE;
effect_set eset,eset2; effect_set eset;
filter_effect(EFFECT_CANNOT_BE_EFFECT_TARGET, &eset); filter_effect(EFFECT_CANNOT_BE_EFFECT_TARGET, &eset);
for(int32 i = 0; i < eset.size(); ++i) { for(int32 i = 0; i < eset.size(); ++i) {
pduel->lua->add_param(playerid, PARAM_TYPE_INT); pduel->lua->add_param(playerid, PARAM_TYPE_INT);
if(eset[i]->get_value(peffect, 1)) if(eset[i]->get_value(peffect, 1))
return FALSE; return FALSE;
} }
peffect->handler->filter_effect(EFFECT_CANNOT_SELECT_EFFECT_TARGET, &eset2); eset.clear();
for(int32 i = 0; i < eset2.size(); ++i) { peffect->handler->filter_effect(EFFECT_CANNOT_SELECT_EFFECT_TARGET, &eset);
for(int32 i = 0; i < eset.size(); ++i) {
pduel->lua->add_param(this, PARAM_TYPE_CARD); pduel->lua->add_param(this, PARAM_TYPE_CARD);
if(eset2[i]->get_value(peffect, 1)) if(eset[i]->get_value(peffect, 1))
return FALSE; return FALSE;
} }
return TRUE; return TRUE;
......
...@@ -1163,6 +1163,21 @@ int32 field::summon(uint16 step, uint8 sumplayer, card * target, effect * proc, ...@@ -1163,6 +1163,21 @@ int32 field::summon(uint16 step, uint8 sumplayer, card * target, effect * proc,
return TRUE; return TRUE;
if(!is_player_can_summon(SUMMON_TYPE_DUAL, sumplayer, target)) if(!is_player_can_summon(SUMMON_TYPE_DUAL, sumplayer, target))
return TRUE; return TRUE;
} else {
if(!ignore_count && !core.extra_summon[sumplayer] && core.summon_count[sumplayer] >= get_summon_count_limit(sumplayer)) {
effect* pextra = target->is_affected_by_effect(EFFECT_EXTRA_SUMMON_COUNT);
if(pextra && !(pextra->flag & EFFECT_FLAG_FUNC_VALUE)) {
int32 count = pextra->get_value();
if(min_tribute < count) {
min_tribute = count;
core.units.begin()->arg2 = ignore_count + (min_tribute << 8);
}
}
}
effect_set eset;
int32 res = target->filter_summon_procedure(sumplayer, &eset, ignore_count, min_tribute);
if((proc && res < 0) || res == -2)
return TRUE;
} }
if(check_unique_onfield(target, sumplayer)) if(check_unique_onfield(target, sumplayer))
return TRUE; return TRUE;
...@@ -1183,32 +1198,18 @@ int32 field::summon(uint16 step, uint8 sumplayer, card * target, effect * proc, ...@@ -1183,32 +1198,18 @@ int32 field::summon(uint16 step, uint8 sumplayer, card * target, effect * proc,
return FALSE; return FALSE;
} }
case 1: { case 1: {
if(!ignore_count && !core.extra_summon[sumplayer] && core.summon_count[sumplayer] >= get_summon_count_limit(sumplayer)) {
effect* pextra = target->is_affected_by_effect(EFFECT_EXTRA_SUMMON_COUNT);
if(pextra && !(pextra->flag & EFFECT_FLAG_FUNC_VALUE)) {
int32 count = pextra->get_value();
if(min_tribute < count) {
min_tribute = count;
core.units.begin()->arg2 = ignore_count + (min_tribute << 8);
}
}
}
effect_set eset;
int32 res = target->filter_summon_procedure(sumplayer, &eset, ignore_count, min_tribute);
if(proc && res < 0)
return TRUE;
if(proc) { if(proc) {
core.units.begin()->step = 3; core.units.begin()->step = 3;
return FALSE; return FALSE;
} }
effect_set eset;
int32 res = target->filter_summon_procedure(sumplayer, &eset, ignore_count, min_tribute);
core.select_effects.clear(); core.select_effects.clear();
core.select_options.clear(); core.select_options.clear();
if(res > 0) { if(res > 0) {
core.select_effects.push_back(0); core.select_effects.push_back(0);
core.select_options.push_back(1); core.select_options.push_back(1);
} }
else if(res == -2)
return TRUE;
for(int32 i = 0; i < eset.size(); ++i) { for(int32 i = 0; i < eset.size(); ++i) {
core.select_effects.push_back(eset[i]); core.select_effects.push_back(eset[i]);
core.select_options.push_back(eset[i]->description); core.select_options.push_back(eset[i]->description);
...@@ -1659,19 +1660,9 @@ int32 field::mset(uint16 step, uint8 setplayer, card * target, effect * proc, ui ...@@ -1659,19 +1660,9 @@ int32 field::mset(uint16 step, uint8 setplayer, card * target, effect * proc, ui
return TRUE; return TRUE;
if(target->is_affected_by_effect(EFFECT_CANNOT_MSET)) if(target->is_affected_by_effect(EFFECT_CANNOT_MSET))
return TRUE; return TRUE;
if(!ignore_count && core.summon_count[setplayer] >= get_summon_count_limit(setplayer)) if(!ignore_count && (core.extra_summon[setplayer] || !target->is_affected_by_effect(EFFECT_EXTRA_SET_COUNT))
&& core.summon_count[setplayer] >= get_summon_count_limit(setplayer))
return TRUE; return TRUE;
effect_set eset;
target->filter_effect(EFFECT_MSET_COST, &eset);
for(int32 i = 0; i < eset.size(); ++i) {
if(eset[i]->operation) {
core.sub_solving_event.push_back(nil_event);
add_process(PROCESSOR_EXECUTE_OPERATION, 0, eset[i], 0, setplayer, 0);
}
}
return FALSE;
}
case 1: {
if(!ignore_count && !core.extra_summon[setplayer] && core.summon_count[setplayer] >= get_summon_count_limit(setplayer)) { if(!ignore_count && !core.extra_summon[setplayer] && core.summon_count[setplayer] >= get_summon_count_limit(setplayer)) {
effect* pextra = target->is_affected_by_effect(EFFECT_EXTRA_SET_COUNT); effect* pextra = target->is_affected_by_effect(EFFECT_EXTRA_SET_COUNT);
if(pextra && !(pextra->flag & EFFECT_FLAG_FUNC_VALUE)) { if(pextra && !(pextra->flag & EFFECT_FLAG_FUNC_VALUE)) {
...@@ -1682,15 +1673,28 @@ int32 field::mset(uint16 step, uint8 setplayer, card * target, effect * proc, ui ...@@ -1682,15 +1673,28 @@ int32 field::mset(uint16 step, uint8 setplayer, card * target, effect * proc, ui
} }
} }
} }
effect_set eset;
target->material_cards.clear(); target->material_cards.clear();
effect_set eset;
int32 res = target->filter_set_procedure(setplayer, &eset, ignore_count, min_tribute); int32 res = target->filter_set_procedure(setplayer, &eset, ignore_count, min_tribute);
if(proc && res < 0) if((proc && res < 0) || res == -2)
return TRUE; return TRUE;
eset.clear();
target->filter_effect(EFFECT_MSET_COST, &eset);
for(int32 i = 0; i < eset.size(); ++i) {
if(eset[i]->operation) {
core.sub_solving_event.push_back(nil_event);
add_process(PROCESSOR_EXECUTE_OPERATION, 0, eset[i], 0, setplayer, 0);
}
}
return FALSE;
}
case 1: {
if(proc) { if(proc) {
core.units.begin()->step = 3; core.units.begin()->step = 3;
return FALSE; return FALSE;
} }
effect_set eset;
int32 res = target->filter_set_procedure(setplayer, &eset, ignore_count, min_tribute);
core.select_effects.clear(); core.select_effects.clear();
core.select_options.clear(); core.select_options.clear();
if(res > 0) { if(res > 0) {
...@@ -2013,24 +2017,23 @@ int32 field::special_summon_rule(uint16 step, uint8 sumplayer, card * target, ui ...@@ -2013,24 +2017,23 @@ int32 field::special_summon_rule(uint16 step, uint8 sumplayer, card * target, ui
return FALSE; return FALSE;
if(target->current.location & (LOCATION_GRAVE + LOCATION_REMOVED) && !target->is_status(STATUS_REVIVE_LIMIT)) if(target->current.location & (LOCATION_GRAVE + LOCATION_REMOVED) && !target->is_status(STATUS_REVIVE_LIMIT))
return FALSE; return FALSE;
effect_set eset1; effect_set eset;
target->material_cards.clear();
card* tuner = core.limit_tuner; card* tuner = core.limit_tuner;
group* materials = core.limit_xyz; group* materials = core.limit_xyz;
group* syn = core.limit_syn; group* syn = core.limit_syn;
target->filter_spsummon_procedure(sumplayer, &eset1, summon_type); target->filter_spsummon_procedure(sumplayer, &eset, summon_type);
target->filter_spsummon_procedure_g(sumplayer, &eset1); target->filter_spsummon_procedure_g(sumplayer, &eset);
core.limit_tuner = tuner; core.limit_tuner = tuner;
core.limit_xyz = materials; core.limit_xyz = materials;
core.limit_syn = syn; core.limit_syn = syn;
if(!eset1.size()) if(!eset.size())
return TRUE; return TRUE;
effect_set eset2; eset.clear();
target->filter_effect(EFFECT_SPSUMMON_COST, &eset2); target->filter_effect(EFFECT_SPSUMMON_COST, &eset);
for(int32 i = 0; i < eset2.size(); ++i) { for(int32 i = 0; i < eset.size(); ++i) {
if(eset2[i]->operation) { if(eset[i]->operation) {
core.sub_solving_event.push_back(nil_event); core.sub_solving_event.push_back(nil_event);
add_process(PROCESSOR_EXECUTE_OPERATION, 0, eset2[i], 0, sumplayer, 0); add_process(PROCESSOR_EXECUTE_OPERATION, 0, eset[i], 0, sumplayer, 0);
} }
} }
return FALSE; return FALSE;
...@@ -2046,8 +2049,6 @@ int32 field::special_summon_rule(uint16 step, uint8 sumplayer, card * target, ui ...@@ -2046,8 +2049,6 @@ int32 field::special_summon_rule(uint16 step, uint8 sumplayer, card * target, ui
core.limit_tuner = tuner; core.limit_tuner = tuner;
core.limit_xyz = materials; core.limit_xyz = materials;
core.limit_syn = syn; core.limit_syn = syn;
if(!eset.size())
return TRUE;
core.select_effects.clear(); core.select_effects.clear();
core.select_options.clear(); core.select_options.clear();
for(int32 i = 0; i < eset.size(); ++i) { for(int32 i = 0; i < eset.size(); ++i) {
......
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