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)
//#define EFFECT_REMOVE_FUSION_ATTRIBUTE 350
#define EFFECT_CHANGE_FUSION_ATTRIBUTE 351
#define EFFECT_EXTRA_FUSION_MATERIAL 352
#define EFFECT_TUNER_MATERIAL_LIMIT 353
#define EVENT_STARTUP 1000
#define EVENT_FLIP 1001
......
......@@ -2341,7 +2341,8 @@ int32 field::check_synchro_material(card* pcard, int32 findex1, int32 findex2, i
return FALSE;
}
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))
return FALSE;
effect* pcheck = tuner->is_affected_by_effect(EFFECT_SYNCHRO_CHECK);
if(pcheck)
pcheck->get_value(tuner);
......@@ -2364,7 +2365,25 @@ int32 field::check_tuner_material(card* pcard, card* tuner, int32 findex1, int32
pduel->restore_assumes();
return TRUE;
}
} else {
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;
......@@ -2377,6 +2396,14 @@ int32 field::check_tuner_material(card* pcard, card* tuner, int32 findex1, int32
pduel->restore_assumes();
return FALSE;
}
if(ptuner && ptuner->target) {
pduel->lua->add_param(ptuner, PARAM_TYPE_EFFECT);
pduel->lua->add_param(smat, PARAM_TYPE_CARD);
if(!pduel->lua->get_function_value(ptuner->target, 2)) {
pduel->restore_assumes();
return FALSE;
}
}
min--;
max--;
nsyn.push_back(smat);
......@@ -2396,7 +2423,14 @@ int32 field::check_tuner_material(card* pcard, card* tuner, int32 findex1, int32
if(mg) {
for(auto cit = mg->container.begin(); cit != mg->container.end(); ++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))
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))
......@@ -2406,35 +2440,56 @@ int32 field::check_tuner_material(card* pcard, card* tuner, int32 findex1, int32
nsyn.push_back(pm);
pm->sum_param = pm->get_synchro_level(pcard);
}
}
} else {
for(uint8 p = 0; p < 2; ++p) {
for(auto cit = player[p].list_mzone.begin(); cit != player[p].list_mzone.end(); ++cit) {
card_vector cv;
if(location & LOCATION_MZONE) {
cv.insert(cv.end(), player[0].list_mzone.begin(), player[0].list_mzone.end());
cv.insert(cv.end(), player[1].list_mzone.begin(), player[1].list_mzone.end());
}
if(location & LOCATION_HAND)
cv.insert(cv.end(), player[playerid].list_hand.begin(), player[playerid].list_hand.end());
for(auto cit = cv.begin(); cit != cv.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(!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, findex2, 0))
continue;
nsyn.push_back(pm);
pm->sum_param = pm->get_synchro_level(pcard);
}
}
}
}
if(!(core.global_flag & GLOBALFLAG_SCRAP_CHIMERA)) {
if(check_with_sum_limit_m(nsyn, lv, 0, min, max, mcount)) {
pduel->restore_assumes();
return TRUE;
}
} else {
pduel->restore_assumes();
return FALSE;
}
effect* pscrap = 0;
for(auto cit = nsyn.begin(); cit != nsyn.end(); ++cit) {
pscrap = (*cit)->is_affected_by_effect(EFFECT_SCRAP_CHIMERA);
if(pscrap)
break;
}
if(pscrap) {
if(!pscrap) {
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))
......@@ -2471,15 +2526,6 @@ int32 field::check_tuner_material(card* pcard, card* tuner, int32 findex1, int32
return TRUE;
}
}
} else {
if(check_with_sum_limit_m(nsyn, lv, 0, min, max, mcount)) {
pduel->restore_assumes();
return TRUE;
}
}
}
}
}
pduel->restore_assumes();
return FALSE;
}
......
......@@ -4602,9 +4602,21 @@ int32 field::select_synchro_material(int16 step, uint8 playerid, card* pcard, in
return FALSE;
}
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 mcount = 1;
card* tuner = core.limit_tuner;
effect* pcheck = tuner->is_affected_by_effect(EFFECT_SYNCHRO_CHECK);
core.must_select_cards.clear();
core.must_select_cards.push_back(tuner);
......@@ -4620,7 +4632,14 @@ int32 field::select_synchro_material(int16 step, uint8 playerid, card* pcard, in
if(mg) {
for(auto cit = mg->container.begin(); cit != mg->container.end(); ++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))
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))
......@@ -4630,22 +4649,34 @@ int32 field::select_synchro_material(int16 step, uint8 playerid, card* pcard, in
core.select_cards.push_back(pm);
pm->sum_param = pm->get_synchro_level(pcard);
}
}
} else {
for(uint8 np = 0; np < 2; ++np) {
for(auto cit = player[np].list_mzone.begin(); cit != player[np].list_mzone.end(); ++cit) {
card_vector cv;
if(location & LOCATION_MZONE) {
cv.insert(cv.end(), player[0].list_mzone.begin(), player[0].list_mzone.end());
cv.insert(cv.end(), player[1].list_mzone.begin(), player[1].list_mzone.end());
}
if(location & LOCATION_HAND)
cv.insert(cv.end(), player[playerid].list_hand.begin(), player[playerid].list_hand.end());
for(auto cit = cv.begin(); cit != cv.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(!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) {
effect* peffect = 0;
for(auto cit = core.select_cards.begin(); cit != core.select_cards.end(); ++cit) {
......
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