Commit 53e59d45 authored by mercury233's avatar mercury233

Merge brancht push 'master' of https://github.com/Fluorohydride/ygopro-core

parents f79332d7 f9004164
...@@ -2949,13 +2949,14 @@ int32 card::is_spsummonable(effect* peffect) { ...@@ -2949,13 +2949,14 @@ int32 card::is_spsummonable(effect* peffect) {
} }
if(pduel->lua->check_condition(peffect->condition, param_count)) if(pduel->lua->check_condition(peffect->condition, param_count))
result = TRUE; result = TRUE;
} else if(pduel->game_field->core.limit_link) { } else if(pduel->game_field->core.limit_link || pduel->game_field->core.limit_link_card) {
pduel->lua->add_param(pduel->game_field->core.limit_link, PARAM_TYPE_GROUP); pduel->lua->add_param(pduel->game_field->core.limit_link, PARAM_TYPE_GROUP);
uint32 param_count = 3; pduel->lua->add_param(pduel->game_field->core.limit_link_card, PARAM_TYPE_CARD);
uint32 param_count = 4;
if(pduel->game_field->core.limit_link_minc) { if(pduel->game_field->core.limit_link_minc) {
pduel->lua->add_param(pduel->game_field->core.limit_link_minc, PARAM_TYPE_INT); pduel->lua->add_param(pduel->game_field->core.limit_link_minc, PARAM_TYPE_INT);
pduel->lua->add_param(pduel->game_field->core.limit_link_maxc, PARAM_TYPE_INT); pduel->lua->add_param(pduel->game_field->core.limit_link_maxc, PARAM_TYPE_INT);
param_count = 5; param_count = 6;
} }
if(pduel->lua->check_condition(peffect->condition, param_count)) if(pduel->lua->check_condition(peffect->condition, param_count))
result = TRUE; result = TRUE;
...@@ -3137,6 +3138,7 @@ int32 card::is_special_summonable(uint8 playerid, uint32 summon_type) { ...@@ -3137,6 +3138,7 @@ int32 card::is_special_summonable(uint8 playerid, uint32 summon_type) {
pduel->game_field->core.limit_xyz_minc = 0; pduel->game_field->core.limit_xyz_minc = 0;
pduel->game_field->core.limit_xyz_maxc = 0; pduel->game_field->core.limit_xyz_maxc = 0;
pduel->game_field->core.limit_link = 0; pduel->game_field->core.limit_link = 0;
pduel->game_field->core.limit_link_card = 0;
pduel->game_field->core.limit_link_minc = 0; pduel->game_field->core.limit_link_minc = 0;
pduel->game_field->core.limit_link_maxc = 0; pduel->game_field->core.limit_link_maxc = 0;
pduel->game_field->restore_lp_cost(); pduel->game_field->restore_lp_cost();
......
...@@ -99,6 +99,7 @@ field::field(duel* pduel) { ...@@ -99,6 +99,7 @@ field::field(duel* pduel) {
core.limit_xyz_minc = 0; core.limit_xyz_minc = 0;
core.limit_xyz_maxc = 0; core.limit_xyz_maxc = 0;
core.limit_link = 0; core.limit_link = 0;
core.limit_link_card = 0;
core.limit_link_minc = 0; core.limit_link_minc = 0;
core.limit_link_maxc = 0; core.limit_link_maxc = 0;
core.last_control_changed_id = 0; core.last_control_changed_id = 0;
......
...@@ -270,6 +270,7 @@ struct processor { ...@@ -270,6 +270,7 @@ struct processor {
int32 limit_xyz_minc; int32 limit_xyz_minc;
int32 limit_xyz_maxc; int32 limit_xyz_maxc;
group* limit_link; group* limit_link;
card* limit_link_card;
int32 limit_link_minc; int32 limit_link_minc;
int32 limit_link_maxc; int32 limit_link_maxc;
uint8 attack_cancelable; uint8 attack_cancelable;
......
...@@ -1347,7 +1347,7 @@ int32 scriptlib::card_remove_overlay_card(lua_State *L) { ...@@ -1347,7 +1347,7 @@ int32 scriptlib::card_remove_overlay_card(lua_State *L) {
pduel->game_field->remove_overlay_card(reason, pcard, playerid, 0, 0, min, max); pduel->game_field->remove_overlay_card(reason, pcard, playerid, 0, 0, min, max);
return lua_yieldk(L, 0, (lua_KContext)pduel, [](lua_State *L, int32 status, lua_KContext ctx) { return lua_yieldk(L, 0, (lua_KContext)pduel, [](lua_State *L, int32 status, lua_KContext ctx) {
duel* pduel = (duel*)ctx; duel* pduel = (duel*)ctx;
lua_pushboolean(L, pduel->game_field->returns.ivalue[0]); lua_pushinteger(L, pduel->game_field->returns.ivalue[0]);
return 1; return 1;
}); });
} }
...@@ -2032,18 +2032,26 @@ int32 scriptlib::card_is_link_summonable(lua_State *L) { ...@@ -2032,18 +2032,26 @@ int32 scriptlib::card_is_link_summonable(lua_State *L) {
if(!(pcard->data.type & TYPE_LINK)) if(!(pcard->data.type & TYPE_LINK))
return 0; return 0;
group* materials = 0; group* materials = 0;
card* lcard = 0;
if(!lua_isnil(L, 2)) { if(!lua_isnil(L, 2)) {
check_param(L, PARAM_TYPE_GROUP, 2); check_param(L, PARAM_TYPE_GROUP, 2);
materials = *(group**)lua_touserdata(L, 2); materials = *(group**)lua_touserdata(L, 2);
} }
if(lua_gettop(L) >= 3) {
if(!lua_isnil(L, 3)) {
check_param(L, PARAM_TYPE_CARD, 3);
lcard = *(card**)lua_touserdata(L, 3);
}
}
int32 minc = 0; int32 minc = 0;
if(lua_gettop(L) >= 3)
minc = lua_tointeger(L, 3);
int32 maxc = 0;
if(lua_gettop(L) >= 4) if(lua_gettop(L) >= 4)
maxc = lua_tointeger(L, 4); minc = lua_tointeger(L, 4);
int32 maxc = 0;
if(lua_gettop(L) >= 5)
maxc = lua_tointeger(L, 5);
uint32 p = pcard->pduel->game_field->core.reason_player; uint32 p = pcard->pduel->game_field->core.reason_player;
pcard->pduel->game_field->core.limit_link = materials; pcard->pduel->game_field->core.limit_link = materials;
pcard->pduel->game_field->core.limit_link_card = lcard;
pcard->pduel->game_field->core.limit_link_minc = minc; pcard->pduel->game_field->core.limit_link_minc = minc;
pcard->pduel->game_field->core.limit_link_maxc = maxc; pcard->pduel->game_field->core.limit_link_maxc = maxc;
lua_pushboolean(L, pcard->is_special_summonable(p, SUMMON_TYPE_LINK)); lua_pushboolean(L, pcard->is_special_summonable(p, SUMMON_TYPE_LINK));
......
...@@ -368,18 +368,26 @@ int32 scriptlib::duel_link_summon(lua_State *L) { ...@@ -368,18 +368,26 @@ int32 scriptlib::duel_link_summon(lua_State *L) {
return 0; return 0;
card* pcard = *(card**)lua_touserdata(L, 2); card* pcard = *(card**)lua_touserdata(L, 2);
group* materials = 0; group* materials = 0;
card* lcard = 0;
if(!lua_isnil(L, 3)) { if(!lua_isnil(L, 3)) {
check_param(L, PARAM_TYPE_GROUP, 3); check_param(L, PARAM_TYPE_GROUP, 3);
materials = *(group**)lua_touserdata(L, 3); materials = *(group**)lua_touserdata(L, 3);
} }
if(lua_gettop(L) >= 4) {
if(!lua_isnil(L, 4)) {
check_param(L, PARAM_TYPE_CARD, 4);
lcard = *(card**)lua_touserdata(L, 4);
}
}
int32 minc = 0; int32 minc = 0;
if(lua_gettop(L) >= 4)
minc = lua_tointeger(L, 4);
int32 maxc = 0;
if(lua_gettop(L) >= 5) if(lua_gettop(L) >= 5)
maxc = lua_tointeger(L, 5); minc = lua_tointeger(L, 5);
int32 maxc = 0;
if(lua_gettop(L) >= 6)
maxc = lua_tointeger(L, 6);
duel* pduel = pcard->pduel; duel* pduel = pcard->pduel;
pduel->game_field->core.limit_link = materials; pduel->game_field->core.limit_link = materials;
pduel->game_field->core.limit_link_card = lcard;
pduel->game_field->core.limit_link_minc = minc; pduel->game_field->core.limit_link_minc = minc;
pduel->game_field->core.limit_link_maxc = maxc; pduel->game_field->core.limit_link_maxc = maxc;
pduel->game_field->core.summon_cancelable = FALSE; pduel->game_field->core.summon_cancelable = FALSE;
...@@ -3314,7 +3322,7 @@ int32 scriptlib::duel_remove_overlay_card(lua_State *L) { ...@@ -3314,7 +3322,7 @@ int32 scriptlib::duel_remove_overlay_card(lua_State *L) {
pduel->game_field->remove_overlay_card(reason, 0, playerid, s, o, min, max); pduel->game_field->remove_overlay_card(reason, 0, playerid, s, o, min, max);
return lua_yieldk(L, 0, (lua_KContext)pduel, [](lua_State *L, int32 status, lua_KContext ctx) { return lua_yieldk(L, 0, (lua_KContext)pduel, [](lua_State *L, int32 status, lua_KContext ctx) {
duel* pduel = (duel*)ctx; duel* pduel = (duel*)ctx;
lua_pushboolean(L, pduel->game_field->returns.ivalue[0]); lua_pushinteger(L, pduel->game_field->returns.ivalue[0]);
return 1; return 1;
}); });
} }
......
...@@ -765,8 +765,7 @@ int32 field::remove_overlay_card(uint16 step, uint32 reason, card* pcard, uint8 ...@@ -765,8 +765,7 @@ int32 field::remove_overlay_card(uint16 step, uint32 reason, card* pcard, uint8
return FALSE; return FALSE;
} }
case 1: { case 1: {
effect* peffect = core.select_effects[returns.ivalue[0]]; if(effect* peffect = core.select_effects[returns.ivalue[0]]) {
if(peffect) {
tevent e; tevent e;
e.event_cards = 0; e.event_cards = 0;
e.event_player = rplayer; e.event_player = rplayer;
...@@ -775,9 +774,24 @@ int32 field::remove_overlay_card(uint16 step, uint32 reason, card* pcard, uint8 ...@@ -775,9 +774,24 @@ int32 field::remove_overlay_card(uint16 step, uint32 reason, card* pcard, uint8
e.reason_effect = core.reason_effect; e.reason_effect = core.reason_effect;
e.reason_player = rplayer; e.reason_player = rplayer;
solve_continuous(rplayer, peffect, e); solve_continuous(rplayer, peffect, e);
core.units.begin()->step = 3; core.units.begin()->peffect = peffect;
}
return FALSE; return FALSE;
} }
case 2: {
uint16 cancelable = FALSE;
if(core.units.begin()->peffect) {
int32 replace_count = returns.ivalue[0];
if(replace_count >= max)
return TRUE;
min -= replace_count;
max -= replace_count;
if(min <= 0) {
cancelable = TRUE;
min = 0;
}
core.units.begin()->arg4 = replace_count;
}
core.select_cards.clear(); core.select_cards.clear();
if(pcard) { if(pcard) {
for(auto& mcard : pcard->xyz_materials) for(auto& mcard : pcard->xyz_materials)
...@@ -792,21 +806,18 @@ int32 field::remove_overlay_card(uint16 step, uint32 reason, card* pcard, uint8 ...@@ -792,21 +806,18 @@ int32 field::remove_overlay_card(uint16 step, uint32 reason, card* pcard, uint8
pduel->write_buffer8(HINT_SELECTMSG); pduel->write_buffer8(HINT_SELECTMSG);
pduel->write_buffer8(rplayer); pduel->write_buffer8(rplayer);
pduel->write_buffer32(519); pduel->write_buffer32(519);
add_process(PROCESSOR_SELECT_CARD, 0, 0, 0, rplayer, min + (max << 16)); add_process(PROCESSOR_SELECT_CARD, 0, 0, 0, rplayer + (cancelable << 16), min + (max << 16));
return FALSE; return FALSE;
} }
case 2: { case 3: {
card_set cset; card_set cset;
for(int32 i = 0; i < returns.bvalue[0]; ++i) for(int32 i = 0; i < returns.bvalue[0]; ++i)
cset.insert(core.select_cards[returns.bvalue[i + 1]]); cset.insert(core.select_cards[returns.bvalue[i + 1]]);
send_to(&cset, core.reason_effect, reason, rplayer, PLAYER_NONE, LOCATION_GRAVE, 0, POS_FACEUP); send_to(&cset, core.reason_effect, reason, rplayer, PLAYER_NONE, LOCATION_GRAVE, 0, POS_FACEUP);
return FALSE; return FALSE;
} }
case 3: {
return FALSE;
}
case 4: { case 4: {
returns.ivalue[0] = 1; returns.ivalue[0] += core.units.begin()->arg4;
return TRUE; return TRUE;
} }
} }
...@@ -2522,6 +2533,7 @@ int32 field::special_summon_rule(uint16 step, uint8 sumplayer, card* target, uin ...@@ -2522,6 +2533,7 @@ int32 field::special_summon_rule(uint16 step, uint8 sumplayer, card* target, uin
int32 xminc = core.limit_xyz_minc; int32 xminc = core.limit_xyz_minc;
int32 xmaxc = core.limit_xyz_maxc; int32 xmaxc = core.limit_xyz_maxc;
group* lmaterials = core.limit_link; group* lmaterials = core.limit_link;
card* lcard = core.limit_link_card;
int32 lminc = core.limit_link_minc; int32 lminc = core.limit_link_minc;
int32 lmaxc = core.limit_link_maxc; int32 lmaxc = core.limit_link_maxc;
target->filter_spsummon_procedure(sumplayer, &eset, summon_type); target->filter_spsummon_procedure(sumplayer, &eset, summon_type);
...@@ -2534,6 +2546,7 @@ int32 field::special_summon_rule(uint16 step, uint8 sumplayer, card* target, uin ...@@ -2534,6 +2546,7 @@ int32 field::special_summon_rule(uint16 step, uint8 sumplayer, card* target, uin
core.limit_xyz_minc = xminc; core.limit_xyz_minc = xminc;
core.limit_xyz_maxc = xmaxc; core.limit_xyz_maxc = xmaxc;
core.limit_link = lmaterials; core.limit_link = lmaterials;
core.limit_link_card = lcard;
core.limit_link_minc = lminc; core.limit_link_minc = lminc;
core.limit_link_maxc = lmaxc; core.limit_link_maxc = lmaxc;
if(!eset.size()) if(!eset.size())
...@@ -2573,8 +2586,9 @@ int32 field::special_summon_rule(uint16 step, uint8 sumplayer, card* target, uin ...@@ -2573,8 +2586,9 @@ int32 field::special_summon_rule(uint16 step, uint8 sumplayer, card* target, uin
pduel->lua->add_param(core.limit_xyz_minc, PARAM_TYPE_INT); pduel->lua->add_param(core.limit_xyz_minc, PARAM_TYPE_INT);
pduel->lua->add_param(core.limit_xyz_maxc, PARAM_TYPE_INT); pduel->lua->add_param(core.limit_xyz_maxc, PARAM_TYPE_INT);
} }
} else if(core.limit_link) { } else if(core.limit_link || core.limit_link_card) {
pduel->lua->add_param(core.limit_link, PARAM_TYPE_GROUP); pduel->lua->add_param(core.limit_link, PARAM_TYPE_GROUP);
pduel->lua->add_param(core.limit_link_card, PARAM_TYPE_CARD);
if(core.limit_link_minc) { if(core.limit_link_minc) {
pduel->lua->add_param(core.limit_link_minc, PARAM_TYPE_INT); pduel->lua->add_param(core.limit_link_minc, PARAM_TYPE_INT);
pduel->lua->add_param(core.limit_link_maxc, PARAM_TYPE_INT); pduel->lua->add_param(core.limit_link_maxc, PARAM_TYPE_INT);
...@@ -2625,9 +2639,11 @@ int32 field::special_summon_rule(uint16 step, uint8 sumplayer, card* target, uin ...@@ -2625,9 +2639,11 @@ int32 field::special_summon_rule(uint16 step, uint8 sumplayer, card* target, uin
core.limit_xyz_maxc = 0; core.limit_xyz_maxc = 0;
} }
} }
if(core.limit_link) { if(core.limit_link || core.limit_link_card) {
pduel->lua->add_param(core.limit_link, PARAM_TYPE_GROUP); pduel->lua->add_param(core.limit_link, PARAM_TYPE_GROUP);
pduel->lua->add_param(core.limit_link_card, PARAM_TYPE_CARD);
core.limit_link = 0; core.limit_link = 0;
core.limit_link_card = 0;
if(core.limit_link_minc) { if(core.limit_link_minc) {
pduel->lua->add_param(core.limit_link_minc, PARAM_TYPE_INT); pduel->lua->add_param(core.limit_link_minc, PARAM_TYPE_INT);
pduel->lua->add_param(core.limit_link_maxc, PARAM_TYPE_INT); pduel->lua->add_param(core.limit_link_maxc, PARAM_TYPE_INT);
......
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