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,7 +2341,8 @@ int32 field::check_synchro_material(card* pcard, int32 findex1, int32 findex2, i ...@@ -2341,7 +2341,8 @@ 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))
return FALSE;
effect* pcheck = tuner->is_affected_by_effect(EFFECT_SYNCHRO_CHECK); effect* pcheck = tuner->is_affected_by_effect(EFFECT_SYNCHRO_CHECK);
if(pcheck) if(pcheck)
pcheck->get_value(tuner); pcheck->get_value(tuner);
...@@ -2364,7 +2365,25 @@ int32 field::check_tuner_material(card* pcard, card* tuner, int32 findex1, int32 ...@@ -2364,7 +2365,25 @@ int32 field::check_tuner_material(card* pcard, card* tuner, int32 findex1, int32
pduel->restore_assumes(); pduel->restore_assumes();
return TRUE; 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(); int32 lv = pcard->get_level();
card_vector nsyn; card_vector nsyn;
int32 mcount = 1; int32 mcount = 1;
...@@ -2377,6 +2396,14 @@ int32 field::check_tuner_material(card* pcard, card* tuner, int32 findex1, int32 ...@@ -2377,6 +2396,14 @@ int32 field::check_tuner_material(card* pcard, card* tuner, int32 findex1, int32
pduel->restore_assumes(); pduel->restore_assumes();
return FALSE; 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--; min--;
max--; max--;
nsyn.push_back(smat); nsyn.push_back(smat);
...@@ -2396,7 +2423,14 @@ int32 field::check_tuner_material(card* pcard, card* tuner, int32 findex1, int32 ...@@ -2396,7 +2423,14 @@ int32 field::check_tuner_material(card* pcard, card* tuner, int32 findex1, int32
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))
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) if(pcheck)
pcheck->get_value(pm); pcheck->get_value(pm);
if(pm->current.location == LOCATION_MZONE && !pm->is_position(POS_FACEUP)) 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 ...@@ -2406,35 +2440,56 @@ int32 field::check_tuner_material(card* pcard, card* tuner, int32 findex1, int32
nsyn.push_back(pm); nsyn.push_back(pm);
pm->sum_param = pm->get_synchro_level(pcard); pm->sum_param = pm->get_synchro_level(pcard);
} }
}
} else { } else {
for(uint8 p = 0; p < 2; ++p) { card_vector cv;
for(auto cit = player[p].list_mzone.begin(); cit != player[p].list_mzone.end(); ++cit) { 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; 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) if(pcheck)
pcheck->get_value(pm); pcheck->get_value(pm);
if(pm->current.location == LOCATION_MZONE && !pm->is_position(POS_FACEUP))
continue;
if(!pduel->lua->check_matching(pm, findex2, 0)) if(!pduel->lua->check_matching(pm, findex2, 0))
continue; continue;
nsyn.push_back(pm); nsyn.push_back(pm);
pm->sum_param = pm->get_synchro_level(pcard); pm->sum_param = pm->get_synchro_level(pcard);
} }
} }
}
}
if(!(core.global_flag & GLOBALFLAG_SCRAP_CHIMERA)) { if(!(core.global_flag & GLOBALFLAG_SCRAP_CHIMERA)) {
if(check_with_sum_limit_m(nsyn, lv, 0, min, max, mcount)) { if(check_with_sum_limit_m(nsyn, lv, 0, min, max, mcount)) {
pduel->restore_assumes(); pduel->restore_assumes();
return TRUE; return TRUE;
} }
} else { pduel->restore_assumes();
return FALSE;
}
effect* pscrap = 0; effect* pscrap = 0;
for(auto cit = nsyn.begin(); cit != nsyn.end(); ++cit) { for(auto cit = nsyn.begin(); cit != nsyn.end(); ++cit) {
pscrap = (*cit)->is_affected_by_effect(EFFECT_SCRAP_CHIMERA); pscrap = (*cit)->is_affected_by_effect(EFFECT_SCRAP_CHIMERA);
if(pscrap) if(pscrap)
break; 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; card_vector nsyn_filtered;
for(auto cit = nsyn.begin(); cit != nsyn.end(); ++cit) { for(auto cit = nsyn.begin(); cit != nsyn.end(); ++cit) {
if(!pscrap->get_value(*cit)) if(!pscrap->get_value(*cit))
...@@ -2471,15 +2526,6 @@ int32 field::check_tuner_material(card* pcard, card* tuner, int32 findex1, int32 ...@@ -2471,15 +2526,6 @@ int32 field::check_tuner_material(card* pcard, card* tuner, int32 findex1, int32
return TRUE; return TRUE;
} }
} }
} else {
if(check_with_sum_limit_m(nsyn, 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,7 +4632,14 @@ int32 field::select_synchro_material(int16 step, uint8 playerid, card* pcard, in ...@@ -4620,7 +4632,14 @@ 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))
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) if(pcheck)
pcheck->get_value(pm); pcheck->get_value(pm);
if(pm->current.location == LOCATION_MZONE && !pm->is_position(POS_FACEUP)) 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 ...@@ -4630,22 +4649,34 @@ int32 field::select_synchro_material(int16 step, uint8 playerid, card* pcard, in
core.select_cards.push_back(pm); core.select_cards.push_back(pm);
pm->sum_param = pm->get_synchro_level(pcard); 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) {
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; 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) if(pcheck)
pcheck->get_value(pm); pcheck->get_value(pm);
if(pm->current.location == LOCATION_MZONE && !pm->is_position(POS_FACEUP))
continue;
if(!pduel->lua->check_matching(pm, -1, 0)) if(!pduel->lua->check_matching(pm, -1, 0))
continue; continue;
core.select_cards.push_back(pm); core.select_cards.push_back(pm);
pm->sum_param = pm->get_synchro_level(pcard); pm->sum_param = pm->get_synchro_level(pcard);
} }
} }
}
}
if(core.global_flag & GLOBALFLAG_SCRAP_CHIMERA) { if(core.global_flag & GLOBALFLAG_SCRAP_CHIMERA) {
effect* peffect = 0; effect* peffect = 0;
for(auto cit = core.select_cards.begin(); cit != core.select_cards.end(); ++cit) { 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