Commit 8439bbdc authored by nanahira's avatar nanahira

fix card::is_extra_link_state

parent ead52a92
...@@ -1404,21 +1404,42 @@ int32 card::check_extra_link(card_set* cset, card_set* excset, card_set* linked_ ...@@ -1404,21 +1404,42 @@ int32 card::check_extra_link(card_set* cset, card_set* excset, card_set* linked_
card* pcard = *cit; card* pcard = *cit;
if(cset->find(pcard) != cset->end()) if(cset->find(pcard) != cset->end())
continue; continue;
if(excset->find(pcard) != excset->end()) if(excset->find(pcard) != excset->end()) {
if(cset->find(this) != cset->end()) card_set omitted;
if(check_extra_link_finish(cset, &omitted))
return TRUE; return TRUE;
}
card_set linked_group2; card_set linked_group2;
pcard->get_mutual_linked_cards(&linked_group2); pcard->get_mutual_linked_cards(&linked_group2);
if(!linked_group2.size()) if(!linked_group2.size())
continue; continue;
cset->insert(pcard); cset->insert(pcard);
int32 result = check_extra_link(cset, excset, &linked_group2); int32 result = check_extra_link(cset, excset, &linked_group2);
cset->erase(pcard); cset->erase(pcard);
if(result) if(result)
return TRUE; return TRUE;
} }
return FALSE; 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;
}
int32 card::is_position(int32 pos) { int32 card::is_position(int32 pos) {
return current.position & pos; return current.position & pos;
} }
......
...@@ -229,6 +229,7 @@ public: ...@@ -229,6 +229,7 @@ public:
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(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