Commit a42373cd authored by Chrono-Genex's avatar Chrono-Genex Committed by GitHub

update EFFECT_EXTRA_SYNCHRO_MATERIAL (#491)

parent 326801c1
......@@ -3891,8 +3891,6 @@ int32 card::is_can_be_synchro_material(card* scard, card* tuner) {
return FALSE;
if(!(get_synchro_type() & TYPE_MONSTER))
return FALSE;
if(scard && current.location == LOCATION_MZONE && current.controler != scard->current.controler && !is_affected_by_effect(EFFECT_SYNCHRO_MATERIAL))
return FALSE;
if(is_status(STATUS_FORBIDDEN))
return FALSE;
//special fix for scrap chimera, not perfect yet
......@@ -3905,6 +3903,19 @@ int32 card::is_can_be_synchro_material(card* scard, card* tuner) {
for(int32 i = 0; i < eset.size(); ++i)
if(eset[i]->get_value(scard))
return FALSE;
if(scard && !(current.location == LOCATION_MZONE && current.controler == scard->current.controler)) {
eset.clear();
filter_effect(EFFECT_EXTRA_SYNCHRO_MATERIAL, &eset);
if(eset.size()) {
for(int32 i = 0; i < eset.size(); ++i) {
if(!eset[i]->check_count_limit(scard->current.controler))
continue;
if(eset[i]->get_value(scard))
return TRUE;
}
return FALSE;
}
}
return TRUE;
}
int32 card::is_can_be_ritual_material(card* scard) {
......
......@@ -383,7 +383,7 @@ inline effect_flag operator|(effect_flag flag1, effect_flag flag2)
#define EFFECT_TOSS_DICE_REPLACE 221
#define EFFECT_FUSION_MATERIAL 230
#define EFFECT_CHAIN_MATERIAL 231
#define EFFECT_SYNCHRO_MATERIAL 232
#define EFFECT_EXTRA_SYNCHRO_MATERIAL 232
#define EFFECT_XYZ_MATERIAL 233
#define EFFECT_FUSION_SUBSTITUTE 234
#define EFFECT_CANNOT_BE_FUSION_MATERIAL 235
......
......@@ -2507,6 +2507,36 @@ int32 field::check_must_material(group* mg, uint8 playerid, uint32 limit) {
return FALSE;
return TRUE;
}
void field::get_synchro_material(uint8 playerid, card_set* material, effect* ptuner) {
if(ptuner && ptuner->value) {
int32 location = ptuner->value;
if(location & LOCATION_MZONE) {
for(auto& pcard : player[playerid].list_mzone) {
if(pcard)
material->insert(pcard);
}
}
if(location & LOCATION_HAND) {
for(auto& pcard : player[playerid].list_hand) {
if(pcard)
material->insert(pcard);
}
}
} else {
for(auto& pcard : player[playerid].list_mzone) {
if(pcard)
material->insert(pcard);
}
for(auto& pcard : player[1 - playerid].list_mzone) {
if(pcard && pcard->is_affected_by_effect(EFFECT_EXTRA_SYNCHRO_MATERIAL))
material->insert(pcard);
}
for(auto& pcard : player[playerid].list_hand) {
if(pcard && pcard->is_affected_by_effect(EFFECT_EXTRA_SYNCHRO_MATERIAL))
material->insert(pcard);
}
}
}
int32 field::check_synchro_material(card* pcard, int32 findex1, int32 findex2, int32 min, int32 max, card* smat, group* mg) {
if(mg) {
for(auto& tuner : mg->container) {
......@@ -2514,11 +2544,11 @@ int32 field::check_synchro_material(card* pcard, int32 findex1, int32 findex2, i
return TRUE;
}
} else {
for(uint8 p = 0; p < 2; ++p) {
for(auto& tuner : player[p].list_mzone) {
if(check_tuner_material(pcard, tuner, findex1, findex2, min, max, smat, mg))
return TRUE;
}
card_set material;
get_synchro_material(pcard->current.controler, &material);
for(auto& tuner : material) {
if(check_tuner_material(pcard, tuner, findex1, findex2, min, max, smat, mg))
return TRUE;
}
}
return FALSE;
......@@ -2691,13 +2721,8 @@ int32 field::check_tuner_material(card* pcard, card* tuner, int32 findex1, int32
pm->sum_param = pm->get_synchro_level(pcard);
}
} else {
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());
card_set cv;
get_synchro_material(playerid, &cv, ptuner);
for(auto& pm : cv) {
if(!pm || pm == tuner || pm == smat || must_list.find(pm) != must_list.end() || !pm->is_can_be_synchro_material(pcard, tuner))
continue;
......
......@@ -480,6 +480,7 @@ public:
void attack_all_target_check();
int32 get_must_material_list(uint8 playerid, uint32 limit, card_set* must_list);
int32 check_must_material(group* mg, uint8 playerid, uint32 limit);
void get_synchro_material(uint8 playerid, card_set* material, effect* ptuner = 0);
int32 check_synchro_material(card* pcard, int32 findex1, int32 findex2, int32 min, int32 max, card* smat, group* mg);
int32 check_tuner_material(card* pcard, card* tuner, int32 findex1, int32 findex2, int32 min, int32 max, card* smat, group* mg);
int32 check_other_synchro_material(const card_vector& nsyn, int32 lv, int32 min, int32 max, int32 mcount);
......
......@@ -3028,6 +3028,17 @@ int32 scriptlib::duel_set_synchro_material(lua_State *L) {
pduel->game_field->core.synchro_materials = pgroup->container;
return 0;
}
int32 scriptlib::duel_get_synchro_material(lua_State *L) {
check_param_count(L, 1);
int32 playerid = (int32)lua_tointeger(L, 1);
if(playerid != 0 && playerid != 1)
return 0;
duel* pduel = interpreter::get_duel_info(L);
group* pgroup = pduel->new_group();
pduel->game_field->get_synchro_material(playerid, &pgroup->container);
interpreter::group2value(L, pgroup);
return 1;
}
int32 scriptlib::duel_select_synchro_material(lua_State *L) {
check_param_count(L, 6);
check_param(L, PARAM_TYPE_CARD, 2);
......@@ -4746,6 +4757,7 @@ static const struct luaL_Reg duellib[] = {
{ "SelectFusionMaterial", scriptlib::duel_select_fusion_material },
{ "SetFusionMaterial", scriptlib::duel_set_fusion_material },
{ "SetSynchroMaterial", scriptlib::duel_set_synchro_material },
{ "GetSynchroMaterial", scriptlib::duel_get_synchro_material },
{ "SelectSynchroMaterial", scriptlib::duel_select_synchro_material },
{ "CheckSynchroMaterial", scriptlib::duel_check_synchro_material },
{ "SelectTunerMaterial", scriptlib::duel_select_tuner_material },
......
......@@ -5196,11 +5196,11 @@ int32 field::select_synchro_material(int16 step, uint8 playerid, card* pcard, in
core.select_cards.push_back(pm);
}
} else {
for(uint8 p = 0; p < 2; ++p) {
for(auto& tuner : player[p].list_mzone) {
if(check_tuner_material(pcard, tuner, -3, -2, min, max, smat, mg))
core.select_cards.push_back(tuner);
}
card_set material;
get_synchro_material(playerid, &material);
for(auto& tuner : material) {
if(check_tuner_material(pcard, tuner, -3, -2, min, max, smat, mg))
core.select_cards.push_back(tuner);
}
}
if(core.select_cards.size() == 0)
......@@ -5342,13 +5342,8 @@ int32 field::select_synchro_material(int16 step, uint8 playerid, card* pcard, in
pm->sum_param = pm->get_synchro_level(pcard);
}
} else {
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());
card_set cv;
get_synchro_material(playerid, &cv, ptuner);
for(auto& pm : cv) {
if(!pm || pm == tuner || pm == smat || must_list.find(pm) != must_list.end() || !pm->is_can_be_synchro_material(pcard, tuner))
continue;
......
......@@ -522,6 +522,7 @@ public:
static int32 duel_select_fusion_material(lua_State *L);
static int32 duel_set_fusion_material(lua_State *L);
static int32 duel_set_synchro_material(lua_State *L);
static int32 duel_get_synchro_material(lua_State *L);
static int32 duel_select_synchro_material(lua_State *L);
static int32 duel_check_synchro_material(lua_State *L);
static int32 duel_select_tuner_material(lua_State *L);
......
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