Commit 5aae09ff authored by mercury233's avatar mercury233

update CheckUniqueOnField

parent 0c1dbdfd
......@@ -2740,7 +2740,7 @@ int32 card::check_unique_code(card* pcard) {
return TRUE;
return FALSE;
}
void card::get_unique_target(card_set* cset, int32 controler) {
void card::get_unique_target(card_set* cset, int32 controler, card* icard) {
cset->clear();
for(int32 p = 0; p < 2; ++p) {
if(!unique_pos[p])
......@@ -2749,7 +2749,7 @@ void card::get_unique_target(card_set* cset, int32 controler) {
if(unique_location & LOCATION_MZONE) {
for(auto cit = player.list_mzone.begin(); cit != player.list_mzone.end(); ++cit) {
card* pcard = *cit;
if(pcard && pcard->is_position(POS_FACEUP) && !pcard->is_status(STATUS_BATTLE_DESTROYED)
if(pcard && (pcard != icard) && pcard->is_position(POS_FACEUP) && !pcard->is_status(STATUS_BATTLE_DESTROYED)
&& check_unique_code(pcard))
cset->insert(pcard);
}
......@@ -2757,7 +2757,7 @@ void card::get_unique_target(card_set* cset, int32 controler) {
if(unique_location & LOCATION_SZONE) {
for(auto cit = player.list_szone.begin(); cit != player.list_szone.end(); ++cit) {
card* pcard = *cit;
if(pcard && pcard->is_position(POS_FACEUP) && check_unique_code(pcard))
if(pcard && (pcard != icard) && pcard->is_position(POS_FACEUP) && check_unique_code(pcard))
cset->insert(pcard);
}
}
......
......@@ -290,7 +290,7 @@ public:
int32 check_fusion_substitute(card* fcard);
int32 check_unique_code(card* pcard);
void get_unique_target(card_set* cset, int32 controler);
void get_unique_target(card_set* cset, int32 controler, card* icard = 0);
int32 check_cost_condition(int32 ecode, int32 playerid);
int32 check_cost_condition(int32 ecode, int32 playerid, int32 sumtype);
int32 is_summonable_card();
......
......@@ -1900,10 +1900,10 @@ void field::remove_unique_card(card* pcard) {
core.unique_cards[1 - con].erase(pcard);
}
// return: pcard->unique_effect or 0
effect* field::check_unique_onfield(card* pcard, uint8 controler, uint8 location) {
effect* field::check_unique_onfield(card* pcard, uint8 controler, uint8 location, card* icard) {
for(auto iter = core.unique_cards[controler].begin(); iter != core.unique_cards[controler].end(); ++iter) {
card* ucard = *iter;
if((ucard != pcard) && ucard->is_position(POS_FACEUP) && ucard->get_status(STATUS_EFFECT_ENABLED)
if((ucard != pcard) && (ucard != icard) && ucard->is_position(POS_FACEUP) && ucard->get_status(STATUS_EFFECT_ENABLED)
&& !ucard->get_status(STATUS_DISABLED | STATUS_FORBIDDEN)
&& ucard->unique_fieldid && ucard->check_unique_code(pcard) && (ucard->unique_location & location))
return ucard->unique_effect;
......@@ -1911,7 +1911,7 @@ effect* field::check_unique_onfield(card* pcard, uint8 controler, uint8 location
if(!pcard->unique_code || !(pcard->unique_location & location) || pcard->get_status(STATUS_DISABLED | STATUS_FORBIDDEN))
return 0;
card_set cset;
pcard->get_unique_target(&cset, controler);
pcard->get_unique_target(&cset, controler, icard);
if(pcard->check_unique_code(pcard))
cset.insert(pcard);
if(cset.size() >= 2)
......
......@@ -398,7 +398,7 @@ public:
void adjust_self_destroy_set();
void add_unique_card(card* pcard);
void remove_unique_card(card* pcard);
effect* check_unique_onfield(card* pcard, uint8 controler, uint8 location);
effect* check_unique_onfield(card* pcard, uint8 controler, uint8 location, card* icard = 0);
int32 check_spsummon_once(card* pcard, uint8 playerid);
void check_card_counter(card* pcard, int32 counter_type, int32 playerid);
void check_chain_counter(effect* peffect, int32 playerid, int32 chainid, bool cancel = false);
......
......@@ -2588,7 +2588,12 @@ int32 scriptlib::card_check_unique_onfield(lua_State *L) {
uint32 check_location = LOCATION_ONFIELD;
if(lua_gettop(L) > 2)
check_location = lua_tointeger(L, 3) & LOCATION_ONFIELD;
lua_pushboolean(L, pcard->pduel->game_field->check_unique_onfield(pcard, check_player, check_location) ? 0 : 1);
card* icard = 0;
if(lua_gettop(L) > 3) {
if(check_param(L, PARAM_TYPE_CARD, 4, TRUE))
icard = *(card**)lua_touserdata(L, 4);
}
lua_pushboolean(L, pcard->pduel->game_field->check_unique_onfield(pcard, check_player, check_location, icard) ? 0 : 1);
return 1;
}
int32 scriptlib::card_reset_negate_effect(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