Commit 983c804e authored by AndreOliveiraMendes's avatar AndreOliveiraMendes Committed by DailyShana

check target player for normal summon (#144)

parent 6cfe285b
...@@ -2475,14 +2475,14 @@ int32 card::filter_summon_procedure(uint8 playerid, effect_set* peset, uint8 ign ...@@ -2475,14 +2475,14 @@ int32 card::filter_summon_procedure(uint8 playerid, effect_set* peset, uint8 ign
peset->add_item(eset[i]); peset->add_item(eset[i]);
} }
// ordinary summon // ordinary summon
if(!pduel->game_field->is_player_can_summon(SUMMON_TYPE_NORMAL, playerid, this)) if(!pduel->game_field->is_player_can_summon(SUMMON_TYPE_NORMAL, playerid, this, playerid))
return FALSE; return FALSE;
if(pduel->game_field->check_unique_onfield(this, playerid, LOCATION_MZONE)) if(pduel->game_field->check_unique_onfield(this, playerid, LOCATION_MZONE))
return FALSE; return FALSE;
int32 rcount = get_summon_tribute_count(); int32 rcount = get_summon_tribute_count();
int32 min = rcount & 0xffff; int32 min = rcount & 0xffff;
int32 max = (rcount >> 16) & 0xffff; int32 max = (rcount >> 16) & 0xffff;
if(!pduel->game_field->is_player_can_summon(SUMMON_TYPE_ADVANCE, playerid, this)) if(!pduel->game_field->is_player_can_summon(SUMMON_TYPE_ADVANCE, playerid, this, playerid))
max = 0; max = 0;
if(min < min_tribute) if(min < min_tribute)
min = min_tribute; min = min_tribute;
...@@ -2511,13 +2511,13 @@ int32 card::filter_summon_procedure(uint8 playerid, effect_set* peset, uint8 ign ...@@ -2511,13 +2511,13 @@ int32 card::filter_summon_procedure(uint8 playerid, effect_set* peset, uint8 ign
int32 card::check_summon_procedure(effect* peffect, uint8 playerid, uint8 ignore_count, uint8 min_tribute, uint32 zone) { int32 card::check_summon_procedure(effect* peffect, uint8 playerid, uint8 ignore_count, uint8 min_tribute, uint32 zone) {
if(!peffect->check_count_limit(playerid)) if(!peffect->check_count_limit(playerid))
return FALSE; return FALSE;
if(!pduel->game_field->is_player_can_summon(peffect->get_value(this), playerid, this))
return FALSE;
uint8 toplayer = playerid; uint8 toplayer = playerid;
if(peffect->is_flag(EFFECT_FLAG_SPSUM_PARAM)) { if(peffect->is_flag(EFFECT_FLAG_SPSUM_PARAM)) {
if(peffect->o_range) if(peffect->o_range)
toplayer = 1 - playerid; toplayer = 1 - playerid;
} }
if(!pduel->game_field->is_player_can_summon(peffect->get_value(this), playerid, this, toplayer))
return FALSE;
if(pduel->game_field->check_unique_onfield(this, toplayer, LOCATION_MZONE)) if(pduel->game_field->check_unique_onfield(this, toplayer, LOCATION_MZONE))
return FALSE; return FALSE;
// the script will check min_tribute, Duel.CheckTribute() // the script will check min_tribute, Duel.CheckTribute()
...@@ -2560,12 +2560,12 @@ int32 card::filter_set_procedure(uint8 playerid, effect_set* peset, uint8 ignore ...@@ -2560,12 +2560,12 @@ int32 card::filter_set_procedure(uint8 playerid, effect_set* peset, uint8 ignore
if(check_set_procedure(eset[i], playerid, ignore_count, min_tribute, zone)) if(check_set_procedure(eset[i], playerid, ignore_count, min_tribute, zone))
peset->add_item(eset[i]); peset->add_item(eset[i]);
} }
if(!pduel->game_field->is_player_can_mset(SUMMON_TYPE_NORMAL, playerid, this)) if(!pduel->game_field->is_player_can_mset(SUMMON_TYPE_NORMAL, playerid, this, playerid))
return FALSE; return FALSE;
int32 rcount = get_set_tribute_count(); int32 rcount = get_set_tribute_count();
int32 min = rcount & 0xffff; int32 min = rcount & 0xffff;
int32 max = (rcount >> 16) & 0xffff; int32 max = (rcount >> 16) & 0xffff;
if(!pduel->game_field->is_player_can_mset(SUMMON_TYPE_ADVANCE, playerid, this)) if(!pduel->game_field->is_player_can_mset(SUMMON_TYPE_ADVANCE, playerid, this, playerid))
max = 0; max = 0;
if(min < min_tribute) if(min < min_tribute)
min = min_tribute; min = min_tribute;
...@@ -2594,13 +2594,13 @@ int32 card::filter_set_procedure(uint8 playerid, effect_set* peset, uint8 ignore ...@@ -2594,13 +2594,13 @@ int32 card::filter_set_procedure(uint8 playerid, effect_set* peset, uint8 ignore
int32 card::check_set_procedure(effect* peffect, uint8 playerid, uint8 ignore_count, uint8 min_tribute, uint32 zone) { int32 card::check_set_procedure(effect* peffect, uint8 playerid, uint8 ignore_count, uint8 min_tribute, uint32 zone) {
if(!peffect->check_count_limit(playerid)) if(!peffect->check_count_limit(playerid))
return FALSE; return FALSE;
if(!pduel->game_field->is_player_can_mset(peffect->get_value(this), playerid, this))
return FALSE;
uint8 toplayer = playerid; uint8 toplayer = playerid;
if(peffect->is_flag(EFFECT_FLAG_SPSUM_PARAM)) { if(peffect->is_flag(EFFECT_FLAG_SPSUM_PARAM)) {
if(peffect->o_range) if(peffect->o_range)
toplayer = 1 - playerid; toplayer = 1 - playerid;
} }
if(!pduel->game_field->is_player_can_mset(peffect->get_value(this), playerid, this, toplayer))
return FALSE;
if(!ignore_count && !pduel->game_field->core.extra_summon[playerid] if(!ignore_count && !pduel->game_field->core.extra_summon[playerid]
&& pduel->game_field->core.summon_count[playerid] >= pduel->game_field->get_summon_count_limit(playerid)) { && pduel->game_field->core.summon_count[playerid] >= pduel->game_field->get_summon_count_limit(playerid)) {
effect_set eset; effect_set eset;
...@@ -2974,7 +2974,7 @@ int32 card::is_can_be_summoned(uint8 playerid, uint8 ignore_count, effect* peffe ...@@ -2974,7 +2974,7 @@ int32 card::is_can_be_summoned(uint8 playerid, uint8 ignore_count, effect* peffe
if(is_position(POS_FACEDOWN) if(is_position(POS_FACEDOWN)
|| !is_affected_by_effect(EFFECT_DUAL_SUMMONABLE) || !is_affected_by_effect(EFFECT_DUAL_SUMMONABLE)
|| is_affected_by_effect(EFFECT_DUAL_STATUS) || is_affected_by_effect(EFFECT_DUAL_STATUS)
|| !pduel->game_field->is_player_can_summon(SUMMON_TYPE_DUAL, playerid, this) || !pduel->game_field->is_player_can_summon(SUMMON_TYPE_DUAL, playerid, this, playerid)
|| is_affected_by_effect(EFFECT_CANNOT_SUMMON)) { || is_affected_by_effect(EFFECT_CANNOT_SUMMON)) {
pduel->game_field->restore_lp_cost(); pduel->game_field->restore_lp_cost();
return FALSE; return FALSE;
...@@ -2987,7 +2987,7 @@ int32 card::is_can_be_summoned(uint8 playerid, uint8 ignore_count, effect* peffe ...@@ -2987,7 +2987,7 @@ int32 card::is_can_be_summoned(uint8 playerid, uint8 ignore_count, effect* peffe
effect_set proc; effect_set proc;
int32 res = filter_summon_procedure(playerid, &proc, ignore_count, min_tribute, zone); int32 res = filter_summon_procedure(playerid, &proc, ignore_count, min_tribute, zone);
if(peffect) { if(peffect) {
if(res < 0 || !pduel->game_field->is_player_can_summon(peffect->get_value(), playerid, this)) { if(res < 0 || !pduel->game_field->is_player_can_summon(peffect->get_value(), playerid, this, playerid)) {
pduel->game_field->restore_lp_cost(); pduel->game_field->restore_lp_cost();
return FALSE; return FALSE;
} }
...@@ -3180,7 +3180,7 @@ int32 card::is_setable_mzone(uint8 playerid, uint8 ignore_count, effect* peffect ...@@ -3180,7 +3180,7 @@ int32 card::is_setable_mzone(uint8 playerid, uint8 ignore_count, effect* peffect
effect_set eset; effect_set eset;
int32 res = filter_set_procedure(playerid, &eset, ignore_count, min_tribute, zone); int32 res = filter_set_procedure(playerid, &eset, ignore_count, min_tribute, zone);
if(peffect) { if(peffect) {
if(res < 0 || !pduel->game_field->is_player_can_mset(peffect->get_value(), playerid, this)) { if(res < 0 || !pduel->game_field->is_player_can_mset(peffect->get_value(), playerid, this, playerid)) {
pduel->game_field->restore_lp_cost(); pduel->game_field->restore_lp_cost();
return FALSE; return FALSE;
} }
......
...@@ -2890,7 +2890,7 @@ int32 field::is_player_can_summon(uint8 playerid) { ...@@ -2890,7 +2890,7 @@ int32 field::is_player_can_summon(uint8 playerid) {
} }
return TRUE; return TRUE;
} }
int32 field::is_player_can_summon(uint32 sumtype, uint8 playerid, card * pcard) { int32 field::is_player_can_summon(uint32 sumtype, uint8 playerid, card * pcard, uint8 toplayer) {
effect_set eset; effect_set eset;
sumtype |= SUMMON_TYPE_NORMAL; sumtype |= SUMMON_TYPE_NORMAL;
filter_player_effect(playerid, EFFECT_CANNOT_SUMMON, &eset); filter_player_effect(playerid, EFFECT_CANNOT_SUMMON, &eset);
...@@ -2901,12 +2901,13 @@ int32 field::is_player_can_summon(uint32 sumtype, uint8 playerid, card * pcard) ...@@ -2901,12 +2901,13 @@ int32 field::is_player_can_summon(uint32 sumtype, uint8 playerid, card * pcard)
pduel->lua->add_param(pcard, PARAM_TYPE_CARD); pduel->lua->add_param(pcard, PARAM_TYPE_CARD);
pduel->lua->add_param(playerid, PARAM_TYPE_INT); pduel->lua->add_param(playerid, PARAM_TYPE_INT);
pduel->lua->add_param(sumtype, PARAM_TYPE_INT); pduel->lua->add_param(sumtype, PARAM_TYPE_INT);
if(pduel->lua->check_condition(eset[i]->target, 4)) pduel->lua->add_param(toplayer, PARAM_TYPE_INT);
if(pduel->lua->check_condition(eset[i]->target, 5))
return FALSE; return FALSE;
} }
return TRUE; return TRUE;
} }
int32 field::is_player_can_mset(uint32 sumtype, uint8 playerid, card * pcard) { int32 field::is_player_can_mset(uint32 sumtype, uint8 playerid, card * pcard, uint8 toplayer) {
effect_set eset; effect_set eset;
sumtype |= SUMMON_TYPE_NORMAL; sumtype |= SUMMON_TYPE_NORMAL;
filter_player_effect(playerid, EFFECT_CANNOT_MSET, &eset); filter_player_effect(playerid, EFFECT_CANNOT_MSET, &eset);
...@@ -2917,7 +2918,8 @@ int32 field::is_player_can_mset(uint32 sumtype, uint8 playerid, card * pcard) { ...@@ -2917,7 +2918,8 @@ int32 field::is_player_can_mset(uint32 sumtype, uint8 playerid, card * pcard) {
pduel->lua->add_param(pcard, PARAM_TYPE_CARD); pduel->lua->add_param(pcard, PARAM_TYPE_CARD);
pduel->lua->add_param(playerid, PARAM_TYPE_INT); pduel->lua->add_param(playerid, PARAM_TYPE_INT);
pduel->lua->add_param(sumtype, PARAM_TYPE_INT); pduel->lua->add_param(sumtype, PARAM_TYPE_INT);
if (pduel->lua->check_condition(eset[i]->target, 4)) pduel->lua->add_param(toplayer, PARAM_TYPE_INT);
if (pduel->lua->check_condition(eset[i]->target, 5))
return FALSE; return FALSE;
} }
return TRUE; return TRUE;
......
...@@ -447,8 +447,8 @@ public: ...@@ -447,8 +447,8 @@ public:
int32 is_player_can_discard_deck_as_cost(uint8 playerid, int32 count); int32 is_player_can_discard_deck_as_cost(uint8 playerid, int32 count);
int32 is_player_can_discard_hand(uint8 playerid, card* pcard, effect* peffect, uint32 reason); int32 is_player_can_discard_hand(uint8 playerid, card* pcard, effect* peffect, uint32 reason);
int32 is_player_can_summon(uint8 playerid); int32 is_player_can_summon(uint8 playerid);
int32 is_player_can_summon(uint32 sumtype, uint8 playerid, card* pcard); int32 is_player_can_summon(uint32 sumtype, uint8 playerid, card* pcard, uint8 toplayer);
int32 is_player_can_mset(uint32 sumtype, uint8 playerid, card* pcard); int32 is_player_can_mset(uint32 sumtype, uint8 playerid, card* pcard, uint8 toplayer);
int32 is_player_can_sset(uint8 playerid, card* pcard); int32 is_player_can_sset(uint8 playerid, card* pcard);
int32 is_player_can_spsummon(uint8 playerid); int32 is_player_can_spsummon(uint8 playerid);
int32 is_player_can_spsummon(effect* peffect, uint32 sumtype, uint8 sumpos, uint8 playerid, uint8 toplayer, card* pcard); int32 is_player_can_spsummon(effect* peffect, uint32 sumtype, uint8 sumpos, uint8 playerid, uint8 toplayer, card* pcard);
......
...@@ -3454,7 +3454,8 @@ int32 scriptlib::duel_is_player_can_summon(lua_State * L) { ...@@ -3454,7 +3454,8 @@ int32 scriptlib::duel_is_player_can_summon(lua_State * L) {
check_param(L, PARAM_TYPE_CARD, 3); check_param(L, PARAM_TYPE_CARD, 3);
int32 sumtype = lua_tointeger(L, 2); int32 sumtype = lua_tointeger(L, 2);
card* pcard = *(card**) lua_touserdata(L, 3); card* pcard = *(card**) lua_touserdata(L, 3);
lua_pushboolean(L, pduel->game_field->is_player_can_summon(sumtype, playerid, pcard)); int32 toplayer = playerid;
lua_pushboolean(L, pduel->game_field->is_player_can_summon(sumtype, playerid, pcard, toplayer));
} }
return 1; return 1;
} }
......
...@@ -1449,7 +1449,7 @@ int32 field::summon(uint16 step, uint8 sumplayer, card* target, effect* proc, ui ...@@ -1449,7 +1449,7 @@ int32 field::summon(uint16 step, uint8 sumplayer, card* target, effect* proc, ui
return TRUE; return TRUE;
if(target->is_affected_by_effect(EFFECT_DUAL_STATUS)) if(target->is_affected_by_effect(EFFECT_DUAL_STATUS))
return TRUE; return TRUE;
if(!is_player_can_summon(SUMMON_TYPE_DUAL, sumplayer, target)) if(!is_player_can_summon(SUMMON_TYPE_DUAL, sumplayer, target, sumplayer))
return TRUE; return TRUE;
} else { } else {
effect_set eset; effect_set eset;
...@@ -1536,7 +1536,7 @@ int32 field::summon(uint16 step, uint8 sumplayer, card* target, effect* proc, ui ...@@ -1536,7 +1536,7 @@ int32 field::summon(uint16 step, uint8 sumplayer, card* target, effect* proc, ui
int32 rcount = target->get_summon_tribute_count(); int32 rcount = target->get_summon_tribute_count();
int32 min = rcount & 0xffff; int32 min = rcount & 0xffff;
int32 max = (rcount >> 16) & 0xffff; int32 max = (rcount >> 16) & 0xffff;
if(!is_player_can_summon(SUMMON_TYPE_ADVANCE, sumplayer, target)) if(!is_player_can_summon(SUMMON_TYPE_ADVANCE, sumplayer, target, sumplayer))
max = 0; max = 0;
if(min < (int32)min_tribute) if(min < (int32)min_tribute)
min = min_tribute; min = min_tribute;
...@@ -1583,7 +1583,7 @@ int32 field::summon(uint16 step, uint8 sumplayer, card* target, effect* proc, ui ...@@ -1583,7 +1583,7 @@ int32 field::summon(uint16 step, uint8 sumplayer, card* target, effect* proc, ui
if(min < min_tribute) { if(min < min_tribute) {
min = min_tribute; min = min_tribute;
} }
uint32 adv = is_player_can_summon(SUMMON_TYPE_ADVANCE, sumplayer, target); uint32 adv = is_player_can_summon(SUMMON_TYPE_ADVANCE, sumplayer, target, sumplayer);
if(max == 0 || !adv) { if(max == 0 || !adv) {
returns.bvalue[0] = 0; returns.bvalue[0] = 0;
core.units.begin()->step = 3; core.units.begin()->step = 3;
...@@ -2069,7 +2069,7 @@ int32 field::mset(uint16 step, uint8 setplayer, card* target, effect* proc, uint ...@@ -2069,7 +2069,7 @@ int32 field::mset(uint16 step, uint8 setplayer, card* target, effect* proc, uint
int32 rcount = target->get_set_tribute_count(); int32 rcount = target->get_set_tribute_count();
int32 min = rcount & 0xffff; int32 min = rcount & 0xffff;
int32 max = (rcount >> 16) & 0xffff; int32 max = (rcount >> 16) & 0xffff;
if(!is_player_can_summon(SUMMON_TYPE_ADVANCE, setplayer, target)) if(!is_player_can_summon(SUMMON_TYPE_ADVANCE, setplayer, target, setplayer))
max = 0; max = 0;
if(min < (int32)min_tribute) if(min < (int32)min_tribute)
min = min_tribute; min = min_tribute;
...@@ -2116,7 +2116,7 @@ int32 field::mset(uint16 step, uint8 setplayer, card* target, effect* proc, uint ...@@ -2116,7 +2116,7 @@ int32 field::mset(uint16 step, uint8 setplayer, card* target, effect* proc, uint
if(min < min_tribute) { if(min < min_tribute) {
min = min_tribute; min = min_tribute;
} }
uint32 adv = is_player_can_mset(SUMMON_TYPE_ADVANCE, setplayer, target); uint32 adv = is_player_can_mset(SUMMON_TYPE_ADVANCE, setplayer, target, setplayer);
if(max == 0 || !adv) { if(max == 0 || !adv) {
returns.bvalue[0] = 0; returns.bvalue[0] = 0;
core.units.begin()->step = 3; core.units.begin()->step = 3;
......
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