Commit 1db16596 authored by VanillaSalt's avatar VanillaSalt

add EFFECT_TUNER_MATERIAL_LIMIT

parent ff62da1f
...@@ -415,6 +415,7 @@ inline effect_flag operator|(effect_flag flag1, effect_flag flag2) ...@@ -415,6 +415,7 @@ inline effect_flag operator|(effect_flag flag1, effect_flag flag2)
//#define EFFECT_REMOVE_FUSION_ATTRIBUTE 350 //#define EFFECT_REMOVE_FUSION_ATTRIBUTE 350
#define EFFECT_CHANGE_FUSION_ATTRIBUTE 351 #define EFFECT_CHANGE_FUSION_ATTRIBUTE 351
#define EFFECT_EXTRA_FUSION_MATERIAL 352 #define EFFECT_EXTRA_FUSION_MATERIAL 352
#define EFFECT_TUNER_MATERIAL_LIMIT 353
#define EVENT_STARTUP 1000 #define EVENT_STARTUP 1000
#define EVENT_FLIP 1001 #define EVENT_FLIP 1001
......
...@@ -2341,144 +2341,190 @@ int32 field::check_synchro_material(card* pcard, int32 findex1, int32 findex2, i ...@@ -2341,144 +2341,190 @@ int32 field::check_synchro_material(card* pcard, int32 findex1, int32 findex2, i
return FALSE; return FALSE;
} }
int32 field::check_tuner_material(card* pcard, card* tuner, int32 findex1, int32 findex2, int32 min, int32 max, card* smat, group* mg) { int32 field::check_tuner_material(card* pcard, card* tuner, int32 findex1, int32 findex2, int32 min, int32 max, card* smat, group* mg) {
if(tuner && tuner->is_position(POS_FACEUP) && (tuner->get_type() & TYPE_TUNER) && tuner->is_can_be_synchro_material(pcard)) { if(!tuner || !tuner->is_position(POS_FACEUP) || !(tuner->get_type() & TYPE_TUNER) || !tuner->is_can_be_synchro_material(pcard))
effect* pcheck = tuner->is_affected_by_effect(EFFECT_SYNCHRO_CHECK); return FALSE;
effect* pcheck = tuner->is_affected_by_effect(EFFECT_SYNCHRO_CHECK);
if(pcheck)
pcheck->get_value(tuner);
if((mg && !mg->has_card(tuner)) || !pduel->lua->check_matching(tuner, findex1, 0)) {
pduel->restore_assumes();
return FALSE;
}
effect* pcustom = tuner->is_affected_by_effect(EFFECT_SYNCHRO_MATERIAL_CUSTOM, pcard);
if(pcustom) {
if(!pcustom->target) {
pduel->restore_assumes();
return FALSE;
}
pduel->lua->add_param(pcustom, PARAM_TYPE_EFFECT);
pduel->lua->add_param(pcard, PARAM_TYPE_CARD);
pduel->lua->add_param(findex2, PARAM_TYPE_INDEX);
pduel->lua->add_param(min, PARAM_TYPE_INT);
pduel->lua->add_param(max, PARAM_TYPE_INT);
if(pduel->lua->check_condition(pcustom->target, 5)) {
pduel->restore_assumes();
return TRUE;
}
pduel->restore_assumes();
return FALSE;
}
int32 playerid = pcard->current.controler;
//int32 ct = get_useable_count(pcard, playerid, LOCATION_MZONE, playerid, LOCATION_REASON_TOFIELD);
int32 location = LOCATION_MZONE;
effect* ptuner = tuner->is_affected_by_effect(EFFECT_TUNER_MATERIAL_LIMIT);
if(ptuner) {
if(ptuner->value)
location = ptuner->value;
if(ptuner->s_range && ptuner->s_range > min)
min = ptuner->s_range;
if(ptuner->o_range && ptuner->o_range < max)
max = ptuner->o_range;
if(min > max) {
pduel->restore_assumes();
return FALSE;
}
}
int32 lv = pcard->get_level();
card_vector nsyn;
int32 mcount = 1;
nsyn.push_back(tuner);
tuner->sum_param = tuner->get_synchro_level(pcard);
if(smat) {
if(pcheck) if(pcheck)
pcheck->get_value(tuner); pcheck->get_value(smat);
if((mg && !mg->has_card(tuner)) || !pduel->lua->check_matching(tuner, findex1, 0)) { if(!smat->is_position(POS_FACEUP) || !smat->is_can_be_synchro_material(pcard, tuner) || !pduel->lua->check_matching(smat, findex2, 0)) {
pduel->restore_assumes(); pduel->restore_assumes();
return FALSE; return FALSE;
} }
effect* pcustom = tuner->is_affected_by_effect(EFFECT_SYNCHRO_MATERIAL_CUSTOM, pcard); if(ptuner && ptuner->target) {
if(pcustom) { pduel->lua->add_param(ptuner, PARAM_TYPE_EFFECT);
if(!pcustom->target) { pduel->lua->add_param(smat, PARAM_TYPE_CARD);
if(!pduel->lua->get_function_value(ptuner->target, 2)) {
pduel->restore_assumes(); pduel->restore_assumes();
return FALSE; return FALSE;
} }
pduel->lua->add_param(pcustom, PARAM_TYPE_EFFECT); }
pduel->lua->add_param(pcard, PARAM_TYPE_CARD); min--;
pduel->lua->add_param(findex2, PARAM_TYPE_INDEX); max--;
pduel->lua->add_param(min, PARAM_TYPE_INT); nsyn.push_back(smat);
pduel->lua->add_param(max, PARAM_TYPE_INT); smat->sum_param = smat->get_synchro_level(pcard);
if(pduel->lua->check_condition(pcustom->target, 5)) { mcount++;
if(min == 0) {
if(check_with_sum_limit_m(nsyn, lv, 0, 0, 0, 2)) {
pduel->restore_assumes(); pduel->restore_assumes();
return TRUE; return TRUE;
} }
} else { if(max == 0) {
int32 lv = pcard->get_level(); pduel->restore_assumes();
card_vector nsyn; return FALSE;
int32 mcount = 1;
nsyn.push_back(tuner);
tuner->sum_param = tuner->get_synchro_level(pcard);
if(smat) {
if(pcheck)
pcheck->get_value(smat);
if(!smat->is_position(POS_FACEUP) || !smat->is_can_be_synchro_material(pcard, tuner) || !pduel->lua->check_matching(smat, findex2, 0)) {
pduel->restore_assumes();
return FALSE;
}
min--;
max--;
nsyn.push_back(smat);
smat->sum_param = smat->get_synchro_level(pcard);
mcount++;
if(min == 0) {
if(check_with_sum_limit_m(nsyn, lv, 0, 0, 0, 2)) {
pduel->restore_assumes();
return TRUE;
}
if(max == 0) {
pduel->restore_assumes();
return FALSE;
}
}
} }
if(mg) { }
for(auto cit = mg->container.begin(); cit != mg->container.end(); ++cit) { }
card* pm = *cit; if(mg) {
if(pm != tuner && pm != smat && pm->is_can_be_synchro_material(pcard, tuner)) { for(auto cit = mg->container.begin(); cit != mg->container.end(); ++cit) {
if(pcheck) card* pm = *cit;
pcheck->get_value(pm); if(pm == tuner || pm == smat || !pm->is_can_be_synchro_material(pcard, tuner))
if(pm->current.location == LOCATION_MZONE && !pm->is_position(POS_FACEUP)) continue;
continue; if(ptuner && ptuner->target) {
if(!pduel->lua->check_matching(pm, findex2, 0)) pduel->lua->add_param(ptuner, PARAM_TYPE_EFFECT);
continue; pduel->lua->add_param(pm, PARAM_TYPE_CARD);
nsyn.push_back(pm); if(!pduel->lua->get_function_value(ptuner->target, 2))
pm->sum_param = pm->get_synchro_level(pcard); continue;
}
}
} else {
for(uint8 p = 0; p < 2; ++p) {
for(auto cit = player[p].list_mzone.begin(); cit != player[p].list_mzone.end(); ++cit) {
card* pm = *cit;
if(pm && pm != tuner && pm != smat && pm->is_position(POS_FACEUP) && pm->is_can_be_synchro_material(pcard, tuner)) {
if(pcheck)
pcheck->get_value(pm);
if(!pduel->lua->check_matching(pm, findex2, 0))
continue;
nsyn.push_back(pm);
pm->sum_param = pm->get_synchro_level(pcard);
}
}
}
} }
if(!(core.global_flag & GLOBALFLAG_SCRAP_CHIMERA)) { if(pcheck)
if(check_with_sum_limit_m(nsyn, lv, 0, min, max, mcount)) { pcheck->get_value(pm);
pduel->restore_assumes(); if(pm->current.location == LOCATION_MZONE && !pm->is_position(POS_FACEUP))
return TRUE; continue;
} if(!pduel->lua->check_matching(pm, findex2, 0))
} else { continue;
effect* pscrap = 0; nsyn.push_back(pm);
for(auto cit = nsyn.begin(); cit != nsyn.end(); ++cit) { pm->sum_param = pm->get_synchro_level(pcard);
pscrap = (*cit)->is_affected_by_effect(EFFECT_SCRAP_CHIMERA); }
if(pscrap) } else {
break; card_vector cv;
} if(location & LOCATION_MZONE) {
if(pscrap) { cv.insert(cv.end(), player[0].list_mzone.begin(), player[0].list_mzone.end());
card_vector nsyn_filtered; cv.insert(cv.end(), player[1].list_mzone.begin(), player[1].list_mzone.end());
for(auto cit = nsyn.begin(); cit != nsyn.end(); ++cit) { }
if(!pscrap->get_value(*cit)) if(location & LOCATION_HAND)
nsyn_filtered.push_back(*cit); cv.insert(cv.end(), player[playerid].list_hand.begin(), player[playerid].list_hand.end());
} for(auto cit = cv.begin(); cit != cv.end(); ++cit) {
if(nsyn_filtered.size() == nsyn.size()) { card* pm = *cit;
if(check_with_sum_limit_m(nsyn, lv, 0, min, max, mcount)) { if(!pm || pm == tuner || pm == smat || !pm->is_can_be_synchro_material(pcard, tuner))
pduel->restore_assumes(); continue;
return TRUE; if(ptuner && ptuner->target) {
} pduel->lua->add_param(ptuner, PARAM_TYPE_EFFECT);
} else { pduel->lua->add_param(pm, PARAM_TYPE_CARD);
bool mfiltered = true; if(!pduel->lua->get_function_value(ptuner->target, 2))
for(int32 i = 0; i < mcount; ++i) { continue;
if(pscrap->get_value(nsyn[i])) }
mfiltered = false; if(pcheck)
} pcheck->get_value(pm);
if(mfiltered && check_with_sum_limit_m(nsyn_filtered, lv, 0, min, max, mcount)) { if(pm->current.location == LOCATION_MZONE && !pm->is_position(POS_FACEUP))
pduel->restore_assumes(); continue;
return TRUE; if(!pduel->lua->check_matching(pm, findex2, 0))
} continue;
for(int32 i = 0; i < mcount; ++i) { nsyn.push_back(pm);
if(nsyn[i]->is_affected_by_effect(EFFECT_SCRAP_CHIMERA)) { pm->sum_param = pm->get_synchro_level(pcard);
pduel->restore_assumes(); }
return FALSE; }
} if(!(core.global_flag & GLOBALFLAG_SCRAP_CHIMERA)) {
} if(check_with_sum_limit_m(nsyn, lv, 0, min, max, mcount)) {
card_vector nsyn_removed; pduel->restore_assumes();
for(auto cit = nsyn.begin(); cit != nsyn.end(); ++cit) { return TRUE;
if(!(*cit)->is_affected_by_effect(EFFECT_SCRAP_CHIMERA)) }
nsyn_removed.push_back(*cit); pduel->restore_assumes();
} return FALSE;
if(check_with_sum_limit_m(nsyn_removed, lv, 0, min, max, mcount)) { }
pduel->restore_assumes(); effect* pscrap = 0;
return TRUE; for(auto cit = nsyn.begin(); cit != nsyn.end(); ++cit) {
} pscrap = (*cit)->is_affected_by_effect(EFFECT_SCRAP_CHIMERA);
} if(pscrap)
} else { break;
if(check_with_sum_limit_m(nsyn, lv, 0, min, max, mcount)) { }
pduel->restore_assumes(); if(!pscrap) {
return TRUE; if(check_with_sum_limit_m(nsyn, lv, 0, min, max, mcount)) {
} pduel->restore_assumes();
} return TRUE;
}
pduel->restore_assumes();
return FALSE;
}
card_vector nsyn_filtered;
for(auto cit = nsyn.begin(); cit != nsyn.end(); ++cit) {
if(!pscrap->get_value(*cit))
nsyn_filtered.push_back(*cit);
}
if(nsyn_filtered.size() == nsyn.size()) {
if(check_with_sum_limit_m(nsyn, lv, 0, min, max, mcount)) {
pduel->restore_assumes();
return TRUE;
}
} else {
bool mfiltered = true;
for(int32 i = 0; i < mcount; ++i) {
if(pscrap->get_value(nsyn[i]))
mfiltered = false;
}
if(mfiltered && check_with_sum_limit_m(nsyn_filtered, lv, 0, min, max, mcount)) {
pduel->restore_assumes();
return TRUE;
}
for(int32 i = 0; i < mcount; ++i) {
if(nsyn[i]->is_affected_by_effect(EFFECT_SCRAP_CHIMERA)) {
pduel->restore_assumes();
return FALSE;
} }
} }
card_vector nsyn_removed;
for(auto cit = nsyn.begin(); cit != nsyn.end(); ++cit) {
if(!(*cit)->is_affected_by_effect(EFFECT_SCRAP_CHIMERA))
nsyn_removed.push_back(*cit);
}
if(check_with_sum_limit_m(nsyn_removed, lv, 0, min, max, mcount)) {
pduel->restore_assumes();
return TRUE;
}
} }
pduel->restore_assumes(); pduel->restore_assumes();
return FALSE; return FALSE;
......
...@@ -4602,9 +4602,21 @@ int32 field::select_synchro_material(int16 step, uint8 playerid, card* pcard, in ...@@ -4602,9 +4602,21 @@ int32 field::select_synchro_material(int16 step, uint8 playerid, card* pcard, in
return FALSE; return FALSE;
} }
case 4: { case 4: {
card* tuner = core.limit_tuner;
int32 playerid = pcard->current.controler;
//int32 ct = get_useable_count(pcard, playerid, LOCATION_MZONE, playerid, LOCATION_REASON_TOFIELD);
int32 location = LOCATION_MZONE;
effect* ptuner = tuner->is_affected_by_effect(EFFECT_TUNER_MATERIAL_LIMIT);
if(ptuner) {
if(ptuner->value)
location = ptuner->value;
if(ptuner->s_range && ptuner->s_range > min)
min = ptuner->s_range;
if(ptuner->o_range && ptuner->o_range < max)
max = ptuner->o_range;
}
int32 lv = pcard->get_level(); int32 lv = pcard->get_level();
int32 mcount = 1; int32 mcount = 1;
card* tuner = core.limit_tuner;
effect* pcheck = tuner->is_affected_by_effect(EFFECT_SYNCHRO_CHECK); effect* pcheck = tuner->is_affected_by_effect(EFFECT_SYNCHRO_CHECK);
core.must_select_cards.clear(); core.must_select_cards.clear();
core.must_select_cards.push_back(tuner); core.must_select_cards.push_back(tuner);
...@@ -4620,30 +4632,49 @@ int32 field::select_synchro_material(int16 step, uint8 playerid, card* pcard, in ...@@ -4620,30 +4632,49 @@ int32 field::select_synchro_material(int16 step, uint8 playerid, card* pcard, in
if(mg) { if(mg) {
for(auto cit = mg->container.begin(); cit != mg->container.end(); ++cit) { for(auto cit = mg->container.begin(); cit != mg->container.end(); ++cit) {
card* pm = *cit; card* pm = *cit;
if(pm != tuner && pm != smat && pm->is_can_be_synchro_material(pcard, tuner)) { if(pm == tuner || pm == smat || !pm->is_can_be_synchro_material(pcard, tuner))
if(pcheck) continue;
pcheck->get_value(pm); if(ptuner && ptuner->target) {
if(pm->current.location == LOCATION_MZONE && !pm->is_position(POS_FACEUP)) pduel->lua->add_param(ptuner, PARAM_TYPE_EFFECT);
continue; pduel->lua->add_param(pm, PARAM_TYPE_CARD);
if(!pduel->lua->check_matching(pm, -1, 0)) if(!pduel->lua->get_function_value(ptuner->target, 2))
continue; continue;
core.select_cards.push_back(pm);
pm->sum_param = pm->get_synchro_level(pcard);
} }
if(pcheck)
pcheck->get_value(pm);
if(pm->current.location == LOCATION_MZONE && !pm->is_position(POS_FACEUP))
continue;
if(!pduel->lua->check_matching(pm, -1, 0))
continue;
core.select_cards.push_back(pm);
pm->sum_param = pm->get_synchro_level(pcard);
} }
} else { } else {
for(uint8 np = 0; np < 2; ++np) { card_vector cv;
for(auto cit = player[np].list_mzone.begin(); cit != player[np].list_mzone.end(); ++cit) { if(location & LOCATION_MZONE) {
card* pm = *cit; cv.insert(cv.end(), player[0].list_mzone.begin(), player[0].list_mzone.end());
if(pm && pm != tuner && pm != smat && pm->is_position(POS_FACEUP) && pm->is_can_be_synchro_material(pcard, tuner)) { cv.insert(cv.end(), player[1].list_mzone.begin(), player[1].list_mzone.end());
if(pcheck) }
pcheck->get_value(pm); if(location & LOCATION_HAND)
if(!pduel->lua->check_matching(pm, -1, 0)) cv.insert(cv.end(), player[playerid].list_hand.begin(), player[playerid].list_hand.end());
continue; for(auto cit = cv.begin(); cit != cv.end(); ++cit) {
core.select_cards.push_back(pm); card* pm = *cit;
pm->sum_param = pm->get_synchro_level(pcard); if(!pm || pm == tuner || pm == smat || !pm->is_can_be_synchro_material(pcard, tuner))
} continue;
if(ptuner && ptuner->target) {
pduel->lua->add_param(ptuner, PARAM_TYPE_EFFECT);
pduel->lua->add_param(pm, PARAM_TYPE_CARD);
if(!pduel->lua->get_function_value(ptuner->target, 2))
continue;
} }
if(pcheck)
pcheck->get_value(pm);
if(pm->current.location == LOCATION_MZONE && !pm->is_position(POS_FACEUP))
continue;
if(!pduel->lua->check_matching(pm, -1, 0))
continue;
core.select_cards.push_back(pm);
pm->sum_param = pm->get_synchro_level(pcard);
} }
} }
if(core.global_flag & GLOBALFLAG_SCRAP_CHIMERA) { if(core.global_flag & GLOBALFLAG_SCRAP_CHIMERA) {
......
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