Commit e5a9ad93 authored by VanillaSalt's avatar VanillaSalt

simplify is_extra_link_state

parent 8439bbdc
...@@ -1371,72 +1371,39 @@ int32 card::is_link_state() { ...@@ -1371,72 +1371,39 @@ int32 card::is_link_state() {
int32 card::is_extra_link_state() { int32 card::is_extra_link_state() {
if(current.location != LOCATION_MZONE) if(current.location != LOCATION_MZONE)
return FALSE; return FALSE;
card_set cset; uint32 checked = 1u << current.sequence;
card_set excset; uint32 linked_zone = get_mutual_linked_zone();
for(int32 p = 0; p < 2; ++p) { const auto& list_mzone0 = pduel->game_field->player[current.controler].list_mzone;
card* pcard1 = pduel->game_field->player[p].list_mzone[5]; const auto& list_mzone1 = pduel->game_field->player[1 - current.controler].list_mzone;
if(pcard1) while(true) {
excset.insert(pcard1); if(((linked_zone >> 5) | (linked_zone >> (16 + 6))) & ((linked_zone >> 6) | (linked_zone >> (16 + 5))) & 1)
card* pcard2 = pduel->game_field->player[p].list_mzone[6]; return TRUE;
if(pcard2) int32 checking = (int32)(linked_zone & ~checked);
excset.insert(pcard2); if(!checking)
card* pcard3 = pduel->game_field->player[1 - p].list_mzone[5]; return FALSE;
if(pcard3) int32 rightmost = checking & (-checking);
excset.insert(pcard3); checked |= (uint32)rightmost;
card* pcard4 = pduel->game_field->player[1 - p].list_mzone[6]; if(rightmost < 0x10000) {
if(pcard4) for(int32 i = 0; i < 7; ++i) {
excset.insert(pcard4); if(rightmost & 1) {
} card* pcard = list_mzone0[i];
if(excset.size() < 2) linked_zone |= pcard->get_mutual_linked_zone();
return FALSE; break;
auto cit = excset.begin(); }
card* pcard = *cit; rightmost >>= 1;
excset.erase(pcard); }
card_set linked_group1; } else {
pcard->get_mutual_linked_cards(&linked_group1); rightmost >>= 16;
if(!linked_group1.size()) for(int32 i = 0; i < 7; ++i) {
return FALSE; if(rightmost & 1) {
cset.insert(pcard); card* pcard = list_mzone1[i];
return check_extra_link(&cset, &excset, &linked_group1); uint32 zone = pcard->get_mutual_linked_zone();
} linked_zone |= (zone << 16) | (zone >> 16);
int32 card::check_extra_link(card_set* cset, card_set* excset, card_set* linked_group1) { break;
for(auto cit = linked_group1->begin(); cit != linked_group1->end(); ++cit) { }
card* pcard = *cit; rightmost >>= 1;
if(cset->find(pcard) != cset->end())
continue;
if(excset->find(pcard) != excset->end()) {
card_set omitted;
if(check_extra_link_finish(cset, &omitted))
return TRUE;
} }
card_set linked_group2;
pcard->get_mutual_linked_cards(&linked_group2);
if(!linked_group2.size())
continue;
cset->insert(pcard);
int32 result = check_extra_link(cset, excset, &linked_group2);
cset->erase(pcard);
if(result)
return TRUE;
} }
return FALSE;
}
int32 card::check_extra_link_finish(card_set* cset, card_set* omitted) {
if(cset->find(this) != cset->end())
return TRUE;
for(auto cit = cset->begin(); cit != cset->end(); ++cit) {
card* pcard = *cit;
if(omitted->find(pcard) != omitted->end())
continue;
card_set linked_group3;
pcard->get_mutual_linked_cards(&linked_group3);
if(!linked_group3.size())
continue;
omitted->insert(pcard);
int32 result = check_extra_link_finish(&linked_group3, omitted);
omitted->erase(pcard);
if(result)
return TRUE;
} }
return FALSE; return FALSE;
} }
......
...@@ -228,8 +228,6 @@ public: ...@@ -228,8 +228,6 @@ public:
void get_mutual_linked_cards(card_set * cset); void get_mutual_linked_cards(card_set * cset);
int32 is_link_state(); int32 is_link_state();
int32 is_extra_link_state(); int32 is_extra_link_state();
int32 check_extra_link(card_set* cset, card_set* excset, card_set* linked_group1);
int32 check_extra_link_finish(card_set* cset, card_set* omitted);
int32 is_position(int32 pos); int32 is_position(int32 pos);
void set_status(uint32 status, int32 enabled); void set_status(uint32 status, int32 enabled);
int32 get_status(uint32 status); int32 get_status(uint32 status);
......
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