Commit 6132d084 authored by nanahira's avatar nanahira

Merge branch 'master' of github.com:Fluorohydride/ygopro-core

parents 77e8bf10 095aee5e
...@@ -3035,6 +3035,16 @@ int32 card::is_not_tuner(card* scard) { ...@@ -3035,6 +3035,16 @@ int32 card::is_not_tuner(card* scard) {
return TRUE; return TRUE;
return FALSE; return FALSE;
} }
int32 card::is_tuner(card* scard) {
if (get_synchro_type() & TYPE_TUNER)
return TRUE;
effect_set eset;
filter_effect(EFFECT_TUNER, &eset);
for (int32 i = 0; i < eset.size(); ++i)
if (!eset[i]->value || eset[i]->get_value(scard))
return TRUE;
return FALSE;
}
int32 card::check_unique_code(card* pcard) { int32 card::check_unique_code(card* pcard) {
if(!unique_code) if(!unique_code)
return FALSE; return FALSE;
......
...@@ -340,6 +340,7 @@ public: ...@@ -340,6 +340,7 @@ public:
void fusion_select(uint8 playerid, group* fusion_m, card* cg, uint32 chkf, uint8 not_material); void fusion_select(uint8 playerid, group* fusion_m, card* cg, uint32 chkf, uint8 not_material);
int32 check_fusion_substitute(card* fcard); int32 check_fusion_substitute(card* fcard);
int32 is_not_tuner(card* scard); int32 is_not_tuner(card* scard);
int32 is_tuner(card* scard);
int32 check_unique_code(card* pcard); int32 check_unique_code(card* pcard);
void get_unique_target(card_set* cset, int32 controler, card* icard = 0); void get_unique_target(card_set* cset, int32 controler, card* icard = 0);
......
...@@ -487,6 +487,7 @@ inline effect_flag operator|(effect_flag flag1, effect_flag flag2) ...@@ -487,6 +487,7 @@ inline effect_flag operator|(effect_flag flag1, effect_flag flag2)
#define EFFECT_CHANGE_GRAVE_RACE 366 #define EFFECT_CHANGE_GRAVE_RACE 366
#define EFFECT_ACTIVATION_COUNT_LIMIT 367 #define EFFECT_ACTIVATION_COUNT_LIMIT 367
#define EFFECT_LIMIT_SPECIAL_SUMMON_POSITION 368 #define EFFECT_LIMIT_SPECIAL_SUMMON_POSITION 368
#define EFFECT_TUNER 369
//#define EVENT_STARTUP 1000 //#define EVENT_STARTUP 1000
#define EVENT_FLIP 1001 #define EVENT_FLIP 1001
......
...@@ -2514,13 +2514,26 @@ void field::attack_all_target_check() { ...@@ -2514,13 +2514,26 @@ void field::attack_all_target_check() {
if(!peffect->get_value(core.attack_target)) if(!peffect->get_value(core.attack_target))
core.attacker->attack_all_target = FALSE; core.attacker->attack_all_target = FALSE;
} }
int32 field::get_must_material_list(uint8 playerid, uint32 limit, card_set* must_list) {
effect_set eset;
filter_player_effect(playerid, limit, &eset);
for(int32 i = 0; i < eset.size(); ++i)
must_list->insert(eset[i]->handler);
return (int32)must_list->size();
}
int32 field::check_must_material(group* mg, uint8 playerid, uint32 limit) {
card_set must_list;
int32 m = get_must_material_list(playerid, limit, &must_list);
if(m <= 0)
return TRUE;
if(!mg)
return FALSE;
for(auto& pcard : must_list)
if(!mg->has_card(pcard))
return FALSE;
return TRUE;
}
int32 field::check_synchro_material(card* pcard, int32 findex1, int32 findex2, int32 min, int32 max, card* smat, group* mg) { int32 field::check_synchro_material(card* pcard, int32 findex1, int32 findex2, int32 min, int32 max, card* smat, group* mg) {
if(core.global_flag & GLOBALFLAG_MUST_BE_SMATERIAL) {
effect_set eset;
filter_player_effect(pcard->current.controler, EFFECT_MUST_BE_SMATERIAL, &eset);
if(eset.size())
return check_tuner_material(pcard, eset[0]->handler, findex1, findex2, min, max, smat, mg);
}
if(mg) { if(mg) {
for(auto& tuner : mg->container) { for(auto& tuner : mg->container) {
if(check_tuner_material(pcard, tuner, findex1, findex2, min, max, smat, mg)) if(check_tuner_material(pcard, tuner, findex1, findex2, min, max, smat, mg))
...@@ -2537,7 +2550,7 @@ int32 field::check_synchro_material(card* pcard, int32 findex1, int32 findex2, i ...@@ -2537,7 +2550,7 @@ 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->current.location == LOCATION_MZONE && !tuner->is_position(POS_FACEUP)) || !(tuner->get_synchro_type() & TYPE_TUNER) || !tuner->is_can_be_synchro_material(pcard)) if(!tuner || (tuner->current.location == LOCATION_MZONE && !tuner->is_position(POS_FACEUP)) || !tuner->is_tuner(pcard) || !tuner->is_can_be_synchro_material(pcard))
return FALSE; 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)
...@@ -2565,6 +2578,13 @@ int32 field::check_tuner_material(card* pcard, card* tuner, int32 findex1, int32 ...@@ -2565,6 +2578,13 @@ int32 field::check_tuner_material(card* pcard, card* tuner, int32 findex1, int32
return FALSE; return FALSE;
} }
int32 playerid = pcard->current.controler; int32 playerid = pcard->current.controler;
card_set must_list;
int32 mct = get_must_material_list(playerid, EFFECT_MUST_BE_SMATERIAL, &must_list);
auto tit = must_list.find(tuner);
if(tit != must_list.end()) {
mct--;
must_list.erase(tit);
}
int32 ct = get_spsummonable_count(pcard, playerid); int32 ct = get_spsummonable_count(pcard, playerid);
card_set handover_zone_cards; card_set handover_zone_cards;
if(ct <= 0) { if(ct <= 0) {
...@@ -2613,7 +2633,7 @@ int32 field::check_tuner_material(card* pcard, card* tuner, int32 findex1, int32 ...@@ -2613,7 +2633,7 @@ int32 field::check_tuner_material(card* pcard, card* tuner, int32 findex1, int32
if(smat) { if(smat) {
if(pcheck) if(pcheck)
pcheck->get_value(smat); pcheck->get_value(smat);
if(!smat->is_position(POS_FACEUP) || !smat->is_can_be_synchro_material(pcard, tuner) || !pduel->lua->check_matching(smat, findex2, 1)) { if((smat->current.location == LOCATION_MZONE && !smat->is_position(POS_FACEUP)) || !smat->is_can_be_synchro_material(pcard, tuner) || !pduel->lua->check_matching(smat, findex2, 1)) {
pduel->restore_assumes(); pduel->restore_assumes();
return FALSE; return FALSE;
} }
...@@ -2630,6 +2650,13 @@ int32 field::check_tuner_material(card* pcard, card* tuner, int32 findex1, int32 ...@@ -2630,6 +2650,13 @@ int32 field::check_tuner_material(card* pcard, card* tuner, int32 findex1, int32
nsyn.push_back(smat); nsyn.push_back(smat);
smat->sum_param = smat->get_synchro_level(pcard); smat->sum_param = smat->get_synchro_level(pcard);
mcount++; mcount++;
if(mct > 0) {
auto sit = must_list.find(smat);
if(sit != must_list.end()) {
mct--;
must_list.erase(sit);
}
}
if(ct <= 0) { if(ct <= 0) {
if(handover_zone_cards.find(smat) != handover_zone_cards.end()) if(handover_zone_cards.find(smat) != handover_zone_cards.end())
ct++; ct++;
...@@ -2645,9 +2672,34 @@ int32 field::check_tuner_material(card* pcard, card* tuner, int32 findex1, int32 ...@@ -2645,9 +2672,34 @@ int32 field::check_tuner_material(card* pcard, card* tuner, int32 findex1, int32
} }
} }
} }
if(mct > 0) {
for(auto& mcard : must_list) {
if(mcard == tuner || mcard == smat)
continue;
if(pcheck)
pcheck->get_value(mcard);
if((mcard->current.location == LOCATION_MZONE && !mcard->is_position(POS_FACEUP)) || !mcard->is_can_be_synchro_material(pcard, tuner) || !pduel->lua->check_matching(mcard, findex2, 1)) {
pduel->restore_assumes();
return FALSE;
}
if(ptuner && ptuner->target) {
pduel->lua->add_param(ptuner, PARAM_TYPE_EFFECT);
pduel->lua->add_param(mcard, PARAM_TYPE_CARD);
if(!pduel->lua->get_function_value(ptuner->target, 2)) {
pduel->restore_assumes();
return FALSE;
}
}
min--;
max--;
nsyn.push_back(mcard);
mcard->sum_param = mcard->get_synchro_level(pcard);
mcount++;
}
}
if(mg) { if(mg) {
for(auto& pm : mg->container) { for(auto& pm : mg->container) {
if(pm == tuner || pm == smat || !pm->is_can_be_synchro_material(pcard, tuner)) if(pm == tuner || pm == smat || must_list.find(pm) != must_list.end() || !pm->is_can_be_synchro_material(pcard, tuner))
continue; continue;
if(ptuner && ptuner->target) { if(ptuner && ptuner->target) {
pduel->lua->add_param(ptuner, PARAM_TYPE_EFFECT); pduel->lua->add_param(ptuner, PARAM_TYPE_EFFECT);
...@@ -2673,7 +2725,7 @@ int32 field::check_tuner_material(card* pcard, card* tuner, int32 findex1, int32 ...@@ -2673,7 +2725,7 @@ int32 field::check_tuner_material(card* pcard, card* tuner, int32 findex1, int32
if(location & LOCATION_HAND) if(location & LOCATION_HAND)
cv.insert(cv.end(), player[playerid].list_hand.begin(), player[playerid].list_hand.end()); cv.insert(cv.end(), player[playerid].list_hand.begin(), player[playerid].list_hand.end());
for(auto& pm : cv) { for(auto& pm : cv) {
if(!pm || pm == tuner || pm == smat || !pm->is_can_be_synchro_material(pcard, tuner)) if(!pm || pm == tuner || pm == smat || must_list.find(pm) != must_list.end() || !pm->is_can_be_synchro_material(pcard, tuner))
continue; continue;
if(ptuner && ptuner->target) { if(ptuner && ptuner->target) {
pduel->lua->add_param(ptuner, PARAM_TYPE_EFFECT); pduel->lua->add_param(ptuner, PARAM_TYPE_EFFECT);
...@@ -2888,12 +2940,8 @@ int32 field::check_xyz_material(card* scard, int32 findex, int32 lv, int32 min, ...@@ -2888,12 +2940,8 @@ int32 field::check_xyz_material(card* scard, int32 findex, int32 lv, int32 min,
if(min > max) if(min > max)
return FALSE; return FALSE;
} }
effect_set eset;
filter_player_effect(playerid, EFFECT_MUST_BE_XMATERIAL, &eset);
card_set mcset; card_set mcset;
for(int32 i = 0; i < eset.size(); ++i) int32 mct = get_must_material_list(playerid, EFFECT_MUST_BE_XMATERIAL, &mcset);
mcset.insert(eset[i]->handler);
int32 mct = (int32)mcset.size();
if(mct > 0) { if(mct > 0) {
if(ct == 0 && std::none_of(mcset.begin(), mcset.end(), if(ct == 0 && std::none_of(mcset.begin(), mcset.end(),
[=](card* pcard) { return handover_zone_cards.find(pcard) != handover_zone_cards.end(); })) [=](card* pcard) { return handover_zone_cards.find(pcard) != handover_zone_cards.end(); }))
......
...@@ -480,6 +480,8 @@ public: ...@@ -480,6 +480,8 @@ public:
int32 get_attack_target(card* pcard, card_vector* v, uint8 chain_attack = FALSE, bool select_target = true); int32 get_attack_target(card* pcard, card_vector* v, uint8 chain_attack = FALSE, bool select_target = true);
bool confirm_attack_target(); bool confirm_attack_target();
void attack_all_target_check(); 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);
int32 check_synchro_material(card* pcard, int32 findex1, int32 findex2, int32 min, int32 max, card* smat, group* mg); 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_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); int32 check_other_synchro_material(const card_vector& nsyn, int32 lv, int32 min, int32 max, int32 mcount);
...@@ -720,7 +722,7 @@ public: ...@@ -720,7 +722,7 @@ public:
#define GLOBALFLAG_SCRAP_CHIMERA 0x4 #define GLOBALFLAG_SCRAP_CHIMERA 0x4
//#define GLOBALFLAG_DELAYED_QUICKEFFECT 0x8 //#define GLOBALFLAG_DELAYED_QUICKEFFECT 0x8
#define GLOBALFLAG_DETACH_EVENT 0x10 #define GLOBALFLAG_DETACH_EVENT 0x10
#define GLOBALFLAG_MUST_BE_SMATERIAL 0x20 //#define GLOBALFLAG_MUST_BE_SMATERIAL 0x20
#define GLOBALFLAG_SPSUMMON_COUNT 0x40 #define GLOBALFLAG_SPSUMMON_COUNT 0x40
#define GLOBALFLAG_XMAT_COUNT_LIMIT 0x80 #define GLOBALFLAG_XMAT_COUNT_LIMIT 0x80
#define GLOBALFLAG_SELF_TOGRAVE 0x100 #define GLOBALFLAG_SELF_TOGRAVE 0x100
......
...@@ -1385,6 +1385,15 @@ int32 scriptlib::card_is_not_tuner(lua_State *L) { ...@@ -1385,6 +1385,15 @@ int32 scriptlib::card_is_not_tuner(lua_State *L) {
lua_pushboolean(L, pcard->is_not_tuner(scard)); lua_pushboolean(L, pcard->is_not_tuner(scard));
return 1; return 1;
} }
int32 scriptlib::card_is_tuner(lua_State* L) {
check_param_count(L, 2);
check_param(L, PARAM_TYPE_CARD, 1);
check_param(L, PARAM_TYPE_CARD, 2);
card* pcard = *(card**)lua_touserdata(L, 1);
card* scard = *(card**)lua_touserdata(L, 2);
lua_pushboolean(L, pcard->is_tuner(scard));
return 1;
}
int32 scriptlib::card_set_status(lua_State *L) { int32 scriptlib::card_set_status(lua_State *L) {
check_param_count(L, 3); check_param_count(L, 3);
check_param(L, PARAM_TYPE_CARD, 1); check_param(L, PARAM_TYPE_CARD, 1);
...@@ -3536,6 +3545,7 @@ static const struct luaL_Reg cardlib[] = { ...@@ -3536,6 +3545,7 @@ static const struct luaL_Reg cardlib[] = {
{ "IsSummonPlayer", scriptlib::card_is_summon_player }, { "IsSummonPlayer", scriptlib::card_is_summon_player },
{ "IsStatus", scriptlib::card_is_status }, { "IsStatus", scriptlib::card_is_status },
{ "IsNotTuner", scriptlib::card_is_not_tuner }, { "IsNotTuner", scriptlib::card_is_not_tuner },
{ "IsTuner", scriptlib::card_is_tuner },
{ "SetStatus", scriptlib::card_set_status }, { "SetStatus", scriptlib::card_set_status },
{ "IsDualState", scriptlib::card_is_dual_state }, { "IsDualState", scriptlib::card_is_dual_state },
{ "EnableDualState", scriptlib::card_enable_dual_state }, { "EnableDualState", scriptlib::card_enable_dual_state },
......
...@@ -3148,6 +3148,47 @@ int32 scriptlib::duel_select_target(lua_State *L) { ...@@ -3148,6 +3148,47 @@ int32 scriptlib::duel_select_target(lua_State *L) {
return 1; return 1;
}); });
} }
int32 scriptlib::duel_get_must_material(lua_State *L) {
check_param_count(L, 2);
int32 playerid = (int32)lua_tointeger(L, 1);
if(playerid != 0 && playerid != 1)
return 0;
uint32 limit = (uint32)lua_tointeger(L, 2);
duel* pduel = interpreter::get_duel_info(L);
group* pgroup = pduel->new_group();
pduel->game_field->get_must_material_list(playerid, limit, &pgroup->container);
interpreter::group2value(L, pgroup);
return 1;
}
int32 scriptlib::duel_check_must_material(lua_State *L) {
check_param_count(L, 3);
int32 playerid = (int32)lua_tointeger(L, 1);
if(playerid != 0 && playerid != 1)
return 0;
card* mcard = 0;
group* mgroup = 0;
group* pgroup = 0;
duel* pduel = 0;
if(check_param(L, PARAM_TYPE_CARD, 2, TRUE)) {
mcard = *(card**)lua_touserdata(L, 2);
pduel = mcard->pduel;
} else if(check_param(L, PARAM_TYPE_GROUP, 2, TRUE)) {
mgroup = *(group**)lua_touserdata(L, 2);
pduel = mgroup->pduel;
} else
pduel = interpreter::get_duel_info(L);
if(mgroup) {
pgroup = pduel->new_group(mgroup->container);
pgroup->is_readonly = TRUE;
} else if(mcard) {
pgroup = pduel->new_group(mcard);
pgroup->is_readonly = TRUE;
} else
pgroup = 0;
uint32 limit = (uint32)lua_tointeger(L, 3);
lua_pushboolean(L, pduel->game_field->check_must_material(pgroup, playerid, limit));
return 1;
}
int32 scriptlib::duel_select_fusion_material(lua_State *L) { int32 scriptlib::duel_select_fusion_material(lua_State *L) {
check_action_permission(L); check_action_permission(L);
check_param_count(L, 3); check_param_count(L, 3);
...@@ -3297,14 +3338,6 @@ int32 scriptlib::duel_check_tuner_material(lua_State *L) { ...@@ -3297,14 +3338,6 @@ int32 scriptlib::duel_check_tuner_material(lua_State *L) {
card* pcard = *(card**) lua_touserdata(L, 1); card* pcard = *(card**) lua_touserdata(L, 1);
card* tuner = *(card**) lua_touserdata(L, 2); card* tuner = *(card**) lua_touserdata(L, 2);
duel* pduel = pcard->pduel; duel* pduel = pcard->pduel;
if(pduel->game_field->core.global_flag & GLOBALFLAG_MUST_BE_SMATERIAL) {
effect_set eset;
pduel->game_field->filter_player_effect(pcard->current.controler, EFFECT_MUST_BE_SMATERIAL, &eset);
if(eset.size() && eset[0]->handler != tuner) {
lua_pushboolean(L, false);
return 1;
}
}
if(!lua_isnil(L, 3)) if(!lua_isnil(L, 3))
check_param(L, PARAM_TYPE_FUNCTION, 3); check_param(L, PARAM_TYPE_FUNCTION, 3);
if(!lua_isnil(L, 4)) if(!lua_isnil(L, 4))
...@@ -4940,6 +4973,8 @@ static const struct luaL_Reg duellib[] = { ...@@ -4940,6 +4973,8 @@ static const struct luaL_Reg duellib[] = {
{ "GetTargetCount", scriptlib::duel_get_target_count }, { "GetTargetCount", scriptlib::duel_get_target_count },
{ "IsExistingTarget", scriptlib::duel_is_existing_target }, { "IsExistingTarget", scriptlib::duel_is_existing_target },
{ "SelectTarget", scriptlib::duel_select_target }, { "SelectTarget", scriptlib::duel_select_target },
{ "GetMustMaterial", scriptlib::duel_get_must_material },
{ "CheckMustMaterial", scriptlib::duel_check_must_material },
{ "SelectFusionMaterial", scriptlib::duel_select_fusion_material }, { "SelectFusionMaterial", scriptlib::duel_select_fusion_material },
{ "SetFusionMaterial", scriptlib::duel_set_fusion_material }, { "SetFusionMaterial", scriptlib::duel_set_fusion_material },
{ "SetSynchroMaterial", scriptlib::duel_set_synchro_material }, { "SetSynchroMaterial", scriptlib::duel_set_synchro_material },
......
...@@ -5244,20 +5244,6 @@ int32 field::select_synchro_material(int16 step, uint8 playerid, card* pcard, in ...@@ -5244,20 +5244,6 @@ int32 field::select_synchro_material(int16 step, uint8 playerid, card* pcard, in
switch(step) { switch(step) {
case 0: { case 0: {
core.select_cards.clear(); core.select_cards.clear();
if(core.global_flag & GLOBALFLAG_MUST_BE_SMATERIAL) {
effect_set eset;
filter_player_effect(pcard->current.controler, EFFECT_MUST_BE_SMATERIAL, &eset);
if(eset.size() && (!mg || mg->has_card(eset[0]->handler))) {
core.select_cards.push_back(eset[0]->handler);
pduel->restore_assumes();
pduel->write_buffer8(MSG_HINT);
pduel->write_buffer8(HINT_SELECTMSG);
pduel->write_buffer8(playerid);
pduel->write_buffer32(512);
add_process(PROCESSOR_SELECT_CARD, 0, 0, 0, playerid + ((uint32)core.summon_cancelable << 16), 0x10001);
return FALSE;
}
}
if(mg) { if(mg) {
for(auto& pm : mg->container) { for(auto& pm : mg->container) {
if(check_tuner_material(pcard, pm, -3, -2, min, max, smat, mg)) if(check_tuner_material(pcard, pm, -3, -2, min, max, smat, mg))
...@@ -5343,6 +5329,14 @@ int32 field::select_synchro_material(int16 step, uint8 playerid, card* pcard, in ...@@ -5343,6 +5329,14 @@ int32 field::select_synchro_material(int16 step, uint8 playerid, card* pcard, in
if(pcheck) if(pcheck)
pcheck->get_value(smat); pcheck->get_value(smat);
if(min == 0) { if(min == 0) {
group* pgroup = pduel->new_group();
pgroup->container.insert(tuner);
pgroup->container.insert(smat);
if(!check_must_material(pgroup, playerid, EFFECT_MUST_BE_SMATERIAL)) {
pduel->restore_assumes();
core.limit_tuner = 0;
return TRUE;
}
int32 lv = pcard->get_level(); int32 lv = pcard->get_level();
card_vector nsyn; card_vector nsyn;
nsyn.push_back(tuner); nsyn.push_back(tuner);
...@@ -5370,11 +5364,21 @@ int32 field::select_synchro_material(int16 step, uint8 playerid, card* pcard, in ...@@ -5370,11 +5364,21 @@ int32 field::select_synchro_material(int16 step, uint8 playerid, card* pcard, in
core.must_select_cards.push_back(smat); core.must_select_cards.push_back(smat);
smat->sum_param = smat->get_synchro_level(pcard); smat->sum_param = smat->get_synchro_level(pcard);
} }
card_set must_list;
int32 mct = get_must_material_list(playerid, EFFECT_MUST_BE_SMATERIAL, &must_list);
if(mct > 0) {
for(auto& mcard : must_list) {
if(mcard == tuner || mcard == smat)
continue;
core.must_select_cards.push_back(mcard);
mcard->sum_param = mcard->get_synchro_level(pcard);
}
}
card_vector nsyn(core.must_select_cards); card_vector nsyn(core.must_select_cards);
int32 mcount = (int32)nsyn.size(); int32 mcount = (int32)nsyn.size();
if(mg) { if(mg) {
for(auto& pm : mg->container) { for(auto& pm : mg->container) {
if(pm == tuner || pm == smat || !pm->is_can_be_synchro_material(pcard, tuner)) if(pm == tuner || pm == smat || must_list.find(pm) != must_list.end() || !pm->is_can_be_synchro_material(pcard, tuner))
continue; continue;
if(ptuner && ptuner->target) { if(ptuner && ptuner->target) {
pduel->lua->add_param(ptuner, PARAM_TYPE_EFFECT); pduel->lua->add_param(ptuner, PARAM_TYPE_EFFECT);
...@@ -5400,7 +5404,7 @@ int32 field::select_synchro_material(int16 step, uint8 playerid, card* pcard, in ...@@ -5400,7 +5404,7 @@ int32 field::select_synchro_material(int16 step, uint8 playerid, card* pcard, in
if(location & LOCATION_HAND) if(location & LOCATION_HAND)
cv.insert(cv.end(), player[playerid].list_hand.begin(), player[playerid].list_hand.end()); cv.insert(cv.end(), player[playerid].list_hand.begin(), player[playerid].list_hand.end());
for(auto& pm : cv) { for(auto& pm : cv) {
if(!pm || pm == tuner || pm == smat || !pm->is_can_be_synchro_material(pcard, tuner)) if(!pm || pm == tuner || pm == smat || must_list.find(pm) != must_list.end() || !pm->is_can_be_synchro_material(pcard, tuner))
continue; continue;
if(ptuner && ptuner->target) { if(ptuner && ptuner->target) {
pduel->lua->add_param(ptuner, PARAM_TYPE_EFFECT); pduel->lua->add_param(ptuner, PARAM_TYPE_EFFECT);
...@@ -5613,12 +5617,12 @@ int32 field::select_xyz_material(int16 step, uint8 playerid, uint32 lv, card* sc ...@@ -5613,12 +5617,12 @@ int32 field::select_xyz_material(int16 step, uint8 playerid, uint32 lv, card* sc
core.units.begin()->arg2 = min + (max << 16); core.units.begin()->arg2 = min + (max << 16);
} }
} }
effect_set eset; card_set mcset;
filter_player_effect(playerid, EFFECT_MUST_BE_XMATERIAL, &eset); int32 mct = get_must_material_list(playerid, EFFECT_MUST_BE_XMATERIAL, &mcset);
core.select_cards.clear(); core.select_cards.clear();
for(int i = 0; i < eset.size(); ++i) for(auto& mcard : mcset) {
core.select_cards.push_back(eset[i]->handler); core.select_cards.push_back(mcard);
int32 mct = (int32)core.select_cards.size(); }
if(mct == 0) { if(mct == 0) {
returns.ivalue[0] = 1; returns.ivalue[0] = 1;
core.units.begin()->step = 1; core.units.begin()->step = 1;
......
...@@ -154,6 +154,7 @@ public: ...@@ -154,6 +154,7 @@ public:
static int32 card_is_summon_player(lua_State *L); static int32 card_is_summon_player(lua_State *L);
static int32 card_is_status(lua_State *L); static int32 card_is_status(lua_State *L);
static int32 card_is_not_tuner(lua_State *L); static int32 card_is_not_tuner(lua_State *L);
static int32 card_is_tuner(lua_State* L);
static int32 card_set_status(lua_State *L); static int32 card_set_status(lua_State *L);
static int32 card_is_dual_state(lua_State *L); static int32 card_is_dual_state(lua_State *L);
static int32 card_enable_dual_state(lua_State *L); static int32 card_enable_dual_state(lua_State *L);
...@@ -536,6 +537,8 @@ public: ...@@ -536,6 +537,8 @@ public:
static int32 duel_get_target_count(lua_State *L); static int32 duel_get_target_count(lua_State *L);
static int32 duel_is_existing_target(lua_State *L); static int32 duel_is_existing_target(lua_State *L);
static int32 duel_select_target(lua_State *L); static int32 duel_select_target(lua_State *L);
static int32 duel_get_must_material(lua_State *L);
static int32 duel_check_must_material(lua_State *L);
static int32 duel_select_fusion_material(lua_State *L); static int32 duel_select_fusion_material(lua_State *L);
static int32 duel_set_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_set_synchro_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