Commit 62ce34a1 authored by VanillaSalt's avatar VanillaSalt

fix

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