Commit 8e4e8bac authored by VanillaSalt's avatar VanillaSalt

fix

parent 8a15b091
...@@ -76,6 +76,7 @@ card::card(duel* pd) { ...@@ -76,6 +76,7 @@ card::card(duel* pd) {
spsummon_counter[0] = spsummon_counter[1] = 0; spsummon_counter[0] = spsummon_counter[1] = 0;
spsummon_counter_rst[0] = spsummon_counter_rst[1] = 0; spsummon_counter_rst[0] = spsummon_counter_rst[1] = 0;
unique_code = 0; unique_code = 0;
unique_fieldid = 0;
assume_type = 0; assume_type = 0;
assume_value = 0; assume_value = 0;
spsummon_code = 0; spsummon_code = 0;
...@@ -2302,6 +2303,29 @@ int32 card::check_unique_code(card* pcard) { ...@@ -2302,6 +2303,29 @@ int32 card::check_unique_code(card* pcard) {
return TRUE; return TRUE;
return FALSE; return FALSE;
} }
void card::get_unique_target(card_set* cset, int32 controler) {
cset->clear();
for(int32 p = 0; p < 2; ++p) {
if(!unique_pos[p])
continue;
const auto& player = pduel->game_field->player[controler ^ p];
if(unique_location & LOCATION_MZONE) {
for(int32 i = 0; i < 5; ++i) {
card* pcard = player.list_mzone[i];
if(pcard && pcard->is_position(POS_FACEUP) && !pcard->is_status(STATUS_BATTLE_DESTROYED)
&& check_unique_code(pcard))
cset->insert(pcard);
}
}
if(unique_location & LOCATION_SZONE) {
for(int32 i = 0; i < 8; ++i) {
card* pcard = player.list_szone[i];
if(pcard && pcard->is_position(POS_FACEUP) && check_unique_code(pcard))
cset->insert(pcard);
}
}
}
}
// check if this is a normal summonable card // check if this is a normal summonable card
int32 card::is_summonable_card() { int32 card::is_summonable_card() {
if(!(data.type & TYPE_MONSTER)) if(!(data.type & TYPE_MONSTER))
......
...@@ -249,6 +249,7 @@ public: ...@@ -249,6 +249,7 @@ public:
int32 check_fusion_substitute(card* fcard); int32 check_fusion_substitute(card* fcard);
int32 check_unique_code(card* pcard); int32 check_unique_code(card* pcard);
void get_unique_target(card_set* cset, int32 controler);
int32 is_summonable_card(); int32 is_summonable_card();
int32 is_fusion_summonable_card(uint32 summon_type); int32 is_fusion_summonable_card(uint32 summon_type);
int32 is_spsummonable(effect* peffect); int32 is_spsummonable(effect* peffect);
......
...@@ -1489,26 +1489,7 @@ void field::adjust_self_destroy_set() { ...@@ -1489,26 +1489,7 @@ void field::adjust_self_destroy_set() {
card* ucard = *iter; card* ucard = *iter;
if(ucard->is_position(POS_FACEUP) && ucard->get_status(STATUS_EFFECT_ENABLED) if(ucard->is_position(POS_FACEUP) && ucard->get_status(STATUS_EFFECT_ENABLED)
&& !ucard->get_status(STATUS_DISABLED | STATUS_FORBIDDEN)) { && !ucard->get_status(STATUS_DISABLED | STATUS_FORBIDDEN)) {
cset.clear(); ucard->get_unique_target(&cset, p);
for(int32 p2 = 0; p2 < 2; ++p2) {
if(ucard->unique_pos[p2]) {
if(ucard->unique_location & LOCATION_MZONE) {
for(int32 i = 0; i < 5; ++i) {
card* pcard = player[p ^ p2].list_mzone[i];
if(pcard && pcard->is_position(POS_FACEUP) && !pcard->is_status(STATUS_BATTLE_DESTROYED)
&& ucard->check_unique_code(pcard))
cset.insert(pcard);
}
}
if(ucard->unique_location & LOCATION_SZONE) {
for(int32 i = 0; i < 8; ++i) {
card* pcard = player[p ^ p2].list_szone[i];
if(pcard && pcard->is_position(POS_FACEUP) && ucard->check_unique_code(pcard))
cset.insert(pcard);
}
}
}
}
if(cset.size() == 0) if(cset.size() == 0)
ucard->unique_fieldid = 0; ucard->unique_fieldid = 0;
else if(cset.size() == 1) { else if(cset.size() == 1) {
...@@ -1609,26 +1590,14 @@ effect* field::check_unique_onfield(card* pcard, uint8 controler, uint8 location ...@@ -1609,26 +1590,14 @@ effect* field::check_unique_onfield(card* pcard, uint8 controler, uint8 location
&& ucard->unique_fieldid && ucard->check_unique_code(pcard) && (ucard->unique_location & location)) && ucard->unique_fieldid && ucard->check_unique_code(pcard) && (ucard->unique_location & location))
return ucard->unique_effect; return ucard->unique_effect;
} }
if(!pcard->unique_code || !pcard->unique_fieldid || pcard->get_status(STATUS_DISABLED | STATUS_FORBIDDEN)) if(!pcard->unique_code || !(pcard->unique_location & location) || pcard->get_status(STATUS_DISABLED | STATUS_FORBIDDEN))
return 0; return 0;
for(int32 p = 0; p < 2; ++p) { card_set cset;
if(pcard->unique_pos[p]) { pcard->get_unique_target(&cset, controler);
if(pcard->unique_location & LOCATION_MZONE) { if(pcard->check_unique_code(pcard))
for(int32 i = 0; i < 5; ++i) { cset.insert(pcard);
card* ucard = player[controler ^ p].list_mzone[i]; if(cset.size() >= 2)
if(ucard && (ucard != pcard) && ucard->is_position(POS_FACEUP) && pcard->check_unique_code(ucard)) return pcard->unique_effect;
return pcard->unique_effect;
}
}
if(pcard->unique_location & LOCATION_SZONE) {
for(int32 i = 0; i < 8; ++i) {
card* ucard = player[controler ^ p].list_szone[i];
if(ucard && (ucard != pcard) && ucard->is_position(POS_FACEUP) && pcard->check_unique_code(ucard))
return pcard->unique_effect;
}
}
}
}
return 0; return 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