Commit a2ddc3df authored by VanillaSalt's avatar VanillaSalt

update

parent ddede2e6
...@@ -1328,22 +1328,28 @@ void field::ritual_release(card_set* material) { ...@@ -1328,22 +1328,28 @@ void field::ritual_release(card_set* material) {
release(&rel, core.reason_effect, REASON_RITUAL + REASON_EFFECT + REASON_MATERIAL, core.reason_player); release(&rel, core.reason_effect, REASON_RITUAL + REASON_EFFECT + REASON_MATERIAL, core.reason_player);
send_to(&rem, core.reason_effect, REASON_RITUAL + REASON_EFFECT + REASON_MATERIAL, core.reason_player, PLAYER_NONE, LOCATION_REMOVED, 0, POS_FACEUP); send_to(&rem, core.reason_effect, REASON_RITUAL + REASON_EFFECT + REASON_MATERIAL, core.reason_player, PLAYER_NONE, LOCATION_REMOVED, 0, POS_FACEUP);
} }
void field::get_xyz_material(card* scard, int32 findex, uint32 lv, int32 maxc) { void field::get_xyz_material(card* scard, int32 findex, uint32 lv, int32 maxc, group* mg) {
card* pcard = 0;
int32 playerid = scard->current.controler;
core.xmaterial_lst.clear(); core.xmaterial_lst.clear();
uint32 xyz_level; uint32 xyz_level;
for(int i = 0; i < 5; ++i) { if(mg) {
pcard = player[playerid].list_mzone[i]; for (auto cit = mg->container.begin(); cit != mg->container.end(); ++cit) {
if(pcard && pcard->is_position(POS_FACEUP) && pcard->is_can_be_xyz_material(scard) && (xyz_level = pcard->check_xyz_level(scard, lv)) if((xyz_level = (*cit)->check_xyz_level(scard, lv)) && (findex == 0 || pduel->lua->check_matching(*cit, findex, 0)))
&& (findex == 0 || pduel->lua->check_matching(pcard, findex, 0))) core.xmaterial_lst.insert(std::make_pair((xyz_level >> 12) & 0xf, *cit));
core.xmaterial_lst.insert(std::make_pair((xyz_level >> 12) & 0xf, pcard)); }
} } else {
for(int i = 0; i < 5; ++i) { int32 playerid = scard->current.controler;
pcard = player[1 - playerid].list_mzone[i]; for(int i = 0; i < 5; ++i) {
if(pcard && pcard->is_position(POS_FACEUP) && pcard->is_can_be_xyz_material(scard) && (xyz_level = pcard->check_xyz_level(scard, lv)) card* pcard = player[playerid].list_mzone[i];
&& pcard->is_affected_by_effect(EFFECT_XYZ_MATERIAL) && (findex == 0 || pduel->lua->check_matching(pcard, findex, 0))) if(pcard && pcard->is_position(POS_FACEUP) && pcard->is_can_be_xyz_material(scard) && (xyz_level = pcard->check_xyz_level(scard, lv))
core.xmaterial_lst.insert(std::make_pair((xyz_level >> 12) & 0xf, pcard)); && (findex == 0 || pduel->lua->check_matching(pcard, findex, 0)))
core.xmaterial_lst.insert(std::make_pair((xyz_level >> 12) & 0xf, pcard));
}
for(int i = 0; i < 5; ++i) {
card* pcard = player[1 - playerid].list_mzone[i];
if(pcard && pcard->is_position(POS_FACEUP) && pcard->is_can_be_xyz_material(scard) && (xyz_level = pcard->check_xyz_level(scard, lv))
&& pcard->is_affected_by_effect(EFFECT_XYZ_MATERIAL) && (findex == 0 || pduel->lua->check_matching(pcard, findex, 0)))
core.xmaterial_lst.insert(std::make_pair((xyz_level >> 12) & 0xf, pcard));
}
} }
if(core.global_flag & GLOBALFLAG_XMAT_COUNT_LIMIT) { if(core.global_flag & GLOBALFLAG_XMAT_COUNT_LIMIT) {
if(maxc > (int32)core.xmaterial_lst.size()) if(maxc > (int32)core.xmaterial_lst.size())
...@@ -1957,21 +1963,7 @@ int32 field::check_with_sum_limit_m(const card_vector& mats, int32 acc, int32 in ...@@ -1957,21 +1963,7 @@ int32 field::check_with_sum_limit_m(const card_vector& mats, int32 acc, int32 in
return FALSE; return FALSE;
} }
int32 field::check_xyz_material(card* scard, int32 findex, int32 lv, int32 min, int32 max, group* mg) { int32 field::check_xyz_material(card* scard, int32 findex, int32 lv, int32 min, int32 max, group* mg) {
if(mg) { get_xyz_material(scard, findex, lv, max, mg);
uint32 xyz_level;
core.xmaterial_lst.clear();
for (auto cit = mg->container.begin(); cit != mg->container.end(); ++cit) {
if((xyz_level = (*cit)->check_xyz_level(scard, lv)) && (findex == 0 || pduel->lua->check_matching(*cit, findex, 0)))
core.xmaterial_lst.insert(std::make_pair((xyz_level >> 12) & 0xf, *cit));
}
if(core.global_flag & GLOBALFLAG_XMAT_COUNT_LIMIT) {
if(max > (int32)core.xmaterial_lst.size())
max = (int32)core.xmaterial_lst.size();
auto iter = core.xmaterial_lst.lower_bound(max);
core.xmaterial_lst.erase(core.xmaterial_lst.begin(), iter);
}
} else
get_xyz_material(scard, findex, lv, max);
return (int32)core.xmaterial_lst.size() >= min; return (int32)core.xmaterial_lst.size() >= min;
} }
int32 field::is_player_can_draw(uint8 playerid) { int32 field::is_player_can_draw(uint8 playerid) {
......
...@@ -361,7 +361,7 @@ public: ...@@ -361,7 +361,7 @@ public:
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 ritual_release(card_set* material); void ritual_release(card_set* material);
void get_xyz_material(card* scard, int32 findex, uint32 lv, int32 maxc); 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);
int32 get_overlay_count(uint8 self, uint8 s, uint8 o); int32 get_overlay_count(uint8 self, uint8 s, uint8 o);
void update_disable_check_list(effect* peffect); void update_disable_check_list(effect* peffect);
......
...@@ -2470,8 +2470,13 @@ int32 scriptlib::duel_select_xyz_material(lua_State *L) { ...@@ -2470,8 +2470,13 @@ int32 scriptlib::duel_select_xyz_material(lua_State *L) {
uint32 lv = lua_tointeger(L, 4); uint32 lv = lua_tointeger(L, 4);
uint32 minc = lua_tointeger(L, 5); uint32 minc = lua_tointeger(L, 5);
uint32 maxc = lua_tointeger(L, 6); uint32 maxc = lua_tointeger(L, 6);
group* mg = 0;
if(lua_gettop(L) >= 7 && !lua_isnil(L, 7)) {
check_param(L, PARAM_TYPE_GROUP, 7);
mg = *(group**) lua_touserdata(L, 7);
}
duel* pduel = scard->pduel; duel* pduel = scard->pduel;
pduel->game_field->get_xyz_material(scard, findex, lv, maxc); pduel->game_field->get_xyz_material(scard, findex, lv, maxc, mg);
scard->pduel->game_field->add_process(PROCESSOR_SELECT_XMATERIAL, 0, 0, (group*)scard, playerid + (lv << 16), minc + (maxc << 16)); scard->pduel->game_field->add_process(PROCESSOR_SELECT_XMATERIAL, 0, 0, (group*)scard, playerid + (lv << 16), minc + (maxc << 16));
return lua_yield(L, 0); return lua_yield(L, 0);
} }
......
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