Commit 12c0bc27 authored by mercury233's avatar mercury233 Committed by GitHub

update Duel.GetFusionMaterial (#361)

parent f0a8eb49
...@@ -1847,18 +1847,64 @@ void field::get_ritual_material(uint8 playerid, effect* peffect, card_set* mater ...@@ -1847,18 +1847,64 @@ void field::get_ritual_material(uint8 playerid, effect* peffect, card_set* mater
if((pcard->data.type & TYPE_MONSTER) && pcard->is_affected_by_effect(EFFECT_EXTRA_RITUAL_MATERIAL) && pcard->is_removeable(playerid, POS_FACEUP, REASON_EFFECT)) if((pcard->data.type & TYPE_MONSTER) && pcard->is_affected_by_effect(EFFECT_EXTRA_RITUAL_MATERIAL) && pcard->is_removeable(playerid, POS_FACEUP, REASON_EFFECT))
material->insert(pcard); material->insert(pcard);
} }
void field::get_fusion_material(uint8 playerid, card_set* material) { void field::get_fusion_material(uint8 playerid, card_set* material_all, card_set* material_base, uint32 location) {
for(auto& pcard : player[playerid].list_mzone) { if(location & LOCATION_MZONE) {
if(pcard) for(auto& pcard : player[playerid].list_mzone) {
material->insert(pcard); if(pcard)
material_base->insert(pcard);
}
}
if(location & LOCATION_HAND) {
for(auto& pcard : player[playerid].list_hand) {
if(pcard->data.type & TYPE_MONSTER)
material_base->insert(pcard);
}
}
if(location & LOCATION_GRAVE) {
for(auto& pcard : player[playerid].list_grave) {
if(pcard->data.type & TYPE_MONSTER)
material_base->insert(pcard);
}
}
if(location & LOCATION_REMOVED) {
for(auto& pcard : player[playerid].list_remove) {
if(pcard->data.type & TYPE_MONSTER)
material_base->insert(pcard);
}
}
if(location & LOCATION_DECK) {
for(auto& pcard : player[playerid].list_main) {
if(pcard->data.type & TYPE_MONSTER)
material_base->insert(pcard);
}
}
if(location & LOCATION_EXTRA) {
for(auto& pcard : player[playerid].list_extra) {
if(pcard->data.type & TYPE_MONSTER)
material_base->insert(pcard);
}
}
if(location & LOCATION_SZONE) {
for(auto& pcard : player[playerid].list_szone) {
if(pcard && pcard->data.type & TYPE_MONSTER)
material_base->insert(pcard);
}
}
if(location & LOCATION_PZONE) {
for(auto& pcard : player[playerid].list_szone) {
if(pcard && pcard->current.pzone && pcard->data.type & TYPE_MONSTER)
material_base->insert(pcard);
}
} }
for(auto& pcard : player[playerid].list_szone) { for(auto& pcard : player[playerid].list_szone) {
if(pcard && pcard->is_affected_by_effect(EFFECT_EXTRA_FUSION_MATERIAL)) if(pcard && pcard->is_affected_by_effect(EFFECT_EXTRA_FUSION_MATERIAL))
material->insert(pcard); material_all->insert(pcard);
} }
for(auto& pcard : player[playerid].list_hand) for(auto& pcard : player[playerid].list_grave) {
if(pcard->data.type & TYPE_MONSTER) if(pcard->is_affected_by_effect(EFFECT_EXTRA_FUSION_MATERIAL))
material->insert(pcard); material_all->insert(pcard);
}
material_all->insert(material_base->begin(), material_base->end());
} }
void field::ritual_release(card_set* material) { void field::ritual_release(card_set* material) {
card_set rel; card_set rel;
......
...@@ -447,7 +447,7 @@ public: ...@@ -447,7 +447,7 @@ public:
int32 get_summon_count_limit(uint8 playerid); int32 get_summon_count_limit(uint8 playerid);
int32 get_draw_count(uint8 playerid); int32 get_draw_count(uint8 playerid);
void get_ritual_material(uint8 playerid, effect* peffect, card_set* material); void get_ritual_material(uint8 playerid, effect* peffect, card_set* material);
void get_fusion_material(uint8 playerid, card_set* material); void get_fusion_material(uint8 playerid, card_set* material_all, card_set* material_base, uint32 location);
void ritual_release(card_set* material); void ritual_release(card_set* material);
void get_xyz_material(card* scard, int32 findex, uint32 lv, int32 maxc, group* mg); void get_xyz_material(card* scard, int32 findex, uint32 lv, int32 maxc, group* mg);
void get_overlay_group(uint8 self, uint8 s, uint8 o, card_set* pset); void get_overlay_group(uint8 self, uint8 s, uint8 o, card_set* pset);
......
...@@ -3108,11 +3108,16 @@ int32 scriptlib::duel_get_fusion_material(lua_State *L) { ...@@ -3108,11 +3108,16 @@ int32 scriptlib::duel_get_fusion_material(lua_State *L) {
int32 playerid = (int32)lua_tointeger(L, 1); int32 playerid = (int32)lua_tointeger(L, 1);
if(playerid != 0 && playerid != 1) if(playerid != 0 && playerid != 1)
return 0; return 0;
uint32 location = LOCATION_HAND + LOCATION_MZONE;
if(lua_gettop(L) >= 2)
location = (uint32)lua_tointeger(L, 2);
duel* pduel = interpreter::get_duel_info(L); duel* pduel = interpreter::get_duel_info(L);
group* pgroup = pduel->new_group(); group* pgroupall = pduel->new_group();
pduel->game_field->get_fusion_material(playerid, &pgroup->container); group* pgroupbase = pduel->new_group();
interpreter::group2value(L, pgroup); pduel->game_field->get_fusion_material(playerid, &pgroupall->container, &pgroupbase->container, location);
return 1; interpreter::group2value(L, pgroupall);
interpreter::group2value(L, pgroupbase);
return 2;
} }
int32 scriptlib::duel_is_summon_cancelable(lua_State *L) { int32 scriptlib::duel_is_summon_cancelable(lua_State *L) {
duel* pduel = interpreter::get_duel_info(L); duel* pduel = interpreter::get_duel_info(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