void DeckBuilder::FilterCards() { results.clear(); const wchar_t* pstr = mainGame->ebCardName->getText(); int trycode = BufferIO::GetVal(pstr); if(dataManager.GetData(trycode, 0)) { auto ptr = dataManager.GetCodePointer(trycode); // verified by GetData() results.push_back(ptr); mainGame->scrFilter->setVisible(false); mainGame->scrFilter->setPos(0); myswprintf(result_string, L"%d", results.size()); return; } unsigned int set_code = 0; if (pstr[0] == L'@') set_code = dataManager.GetSetCode(&pstr[1]); else set_code = dataManager.GetSetCode(&pstr[0]); if (pstr[0] == 0 || (pstr[0] == L'$' && pstr[1] == 0) || (pstr[0] == L'@' && pstr[1] == 0)) pstr = 0; auto strpointer = dataManager._strings.begin(); for(code_pointer ptr = dataManager._datas.begin(); ptr != dataManager._datas.end(); ++ptr, ++strpointer) { const CardDataC& data = ptr->second; const CardString& text = strpointer->second; if(data.type & TYPE_TOKEN || (data.ot > 3 && !mainGame->chkAnime->isChecked())) continue; switch(filter_type) { case 1: { if(!(data.type & TYPE_MONSTER) || (data.type & filter_type2) != filter_type2) continue; if(filter_race && data.race != filter_race) continue; if(filter_attrib && data.attribute != filter_attrib) continue; if(filter_atktype) { if((filter_atktype == 1 && data.attack != filter_atk) || (filter_atktype == 2 && data.attack < filter_atk) || (filter_atktype == 3 && data.attack <= filter_atk) || (filter_atktype == 4 && (data.attack > filter_atk || data.attack < 0)) || (filter_atktype == 5 && (data.attack >= filter_atk || data.attack < 0)) || (filter_atktype == 6 && data.attack != -2)) continue; } if(filter_deftype) { if((filter_deftype == 1 && data.defense != filter_def) || (filter_deftype == 2 && data.defense < filter_def) || (filter_deftype == 3 && data.defense <= filter_def) || (filter_deftype == 4 && (data.defense > filter_def || data.defense < 0)) || (filter_deftype == 5 && (data.defense >= filter_def || data.defense < 0)) || (filter_deftype == 6 && data.defense != -2) || (data.type & TYPE_LINK)) continue; } if(filter_lvtype) { if((filter_lvtype == 1 && data.level != filter_lv) || (filter_lvtype == 2 && data.level < filter_lv) || (filter_lvtype == 3 && data.level <= filter_lv) || (filter_lvtype == 4 && data.level > filter_lv) || (filter_lvtype == 5 && data.level >= filter_lv) || filter_lvtype == 6) continue; } if(filter_scltype) { if((filter_scltype == 1 && data.lscale != filter_scl) || (filter_scltype == 2 && data.lscale < filter_scl) || (filter_scltype == 3 && data.lscale <= filter_scl) || (filter_scltype == 4 && (data.lscale > filter_scl || data.lscale == 0)) || (filter_scltype == 5 && (data.lscale >= filter_scl || data.lscale == 0)) || filter_scltype == 6 || !(data.type & TYPE_PENDULUM)) continue; } break; } case 2: { if(!(data.type & TYPE_SPELL)) continue; if(filter_type2 && data.type != filter_type2) continue; break; } case 3: { if(!(data.type & TYPE_TRAP)) continue; if(filter_type2 && data.type != filter_type2) continue; break; } } if(filter_effect && !(data.category & filter_effect)) continue; if(filter_marks && (data.link_marker & filter_marks)!= filter_marks) continue; if(filter_lm) { if(filter_lm <= 3 && (!filterList->count(ptr->first) || (*filterList)[ptr->first] != filter_lm - 1)) continue; if(filter_lm == 4 && data.ot != 1) continue; if(filter_lm == 5 && data.ot != 2) continue; if(filter_lm == 6 && data.ot != 3) continue; if(filter_lm == 7 && data.ot != 4) continue; if(filter_lm == 8 && data.ot != 8) continue; if(filter_lm == 9 && data.ot != 16) continue; if(filter_lm == 10 && data.ot != 32) continue; } if(pstr) { if(pstr[0] == L'$') { if(!CardNameCompare(text.name.c_str(), &pstr[1])) continue; } else if(pstr[0] == L'@' && set_code) { if(!check_set_code(data, set_code)) continue; } else { if(!CardNameCompare(text.name.c_str(), pstr) && !(CardNameCompare(text.text.c_str(), pstr)) && (!set_code || !check_set_code(data, set_code))) continue; } } results.push_back(ptr); } myswprintf(result_string, L"%d", results.size()); if(results.size() > 7) { mainGame->scrFilter->setVisible(true); mainGame->scrFilter->setMax(results.size() - 7); mainGame->scrFilter->setPos(0); } else { mainGame->scrFilter->setVisible(false); mainGame->scrFilter->setPos(0); } SortList(); }
void DeckBuilder::FilterCards() { results.clear(); struct element_t { std::wstring keyword; int setcode; enum class type_t { all, name, setcode } type; bool exclude; element_t(): setcode(0), type(type_t::all), exclude(false) {} }; const wchar_t* pstr = mainGame->ebCardName->getText(); std::wstring str = std::wstring(pstr); std::vector<element_t> query_elements; if(mainGame->gameConf.search_multiple_keywords) { const wchar_t separator = mainGame->gameConf.search_multiple_keywords == 1 ? L' ' : L'+'; const wchar_t minussign = L'-'; const wchar_t quotation = L'\"'; size_t element_start = 0; for(;;) { element_start = str.find_first_not_of(separator, element_start); if(element_start == std::wstring::npos) break; element_t element; if(str[element_start] == minussign) { element.exclude = true; element_start++; } if(element_start >= str.size()) break; if(str[element_start] == L'$') { element.type = element_t::type_t::name; element_start++; } else if(str[element_start] == L'@') { element.type = element_t::type_t::setcode; element_start++; } if(element_start >= str.size()) break; wchar_t delimiter = separator; if(str[element_start] == quotation) { delimiter = quotation; element_start++; } size_t element_end = str.find_first_of(delimiter, element_start); if(element_end != std::wstring::npos) { size_t length = element_end - element_start; element.keyword = str.substr(element_start, length); } else element.keyword = str.substr(element_start); element.setcode = dataManager.GetSetCode(element.keyword.c_str()); query_elements.push_back(element); if(element_end == std::wstring::npos) break; element_start = element_end + 1; } } else { element_t element; size_t element_start = 0; if(str[element_start] == L'$') { element.type = element_t::type_t::name; element_start++; } else if(str[element_start] == L'@') { element.type = element_t::type_t::setcode; element_start++; } if(element_start < str.size()) { element.keyword = str.substr(element_start); element.setcode = dataManager.GetSetCode(element.keyword.c_str()); query_elements.push_back(element); } } auto strpointer = dataManager._strings.begin(); for(code_pointer ptr = dataManager._datas.begin(); ptr != dataManager._datas.end(); ++ptr, ++strpointer) { const CardDataC& data = ptr->second; const CardString& text = strpointer->second; if(data.type & TYPE_TOKEN) continue; switch(filter_type) { case 1: { if(!(data.type & TYPE_MONSTER) || (data.type & filter_type2) != filter_type2) continue; if(filter_race && data.race != filter_race) continue; if(filter_attrib && data.attribute != filter_attrib) continue; if(filter_atktype) { if((filter_atktype == 1 && data.attack != filter_atk) || (filter_atktype == 2 && data.attack < filter_atk) || (filter_atktype == 3 && data.attack <= filter_atk) || (filter_atktype == 4 && (data.attack > filter_atk || data.attack < 0)) || (filter_atktype == 5 && (data.attack >= filter_atk || data.attack < 0)) || (filter_atktype == 6 && data.attack != -2)) continue; } if(filter_deftype) { if((filter_deftype == 1 && data.defense != filter_def) || (filter_deftype == 2 && data.defense < filter_def) || (filter_deftype == 3 && data.defense <= filter_def) || (filter_deftype == 4 && (data.defense > filter_def || data.defense < 0)) || (filter_deftype == 5 && (data.defense >= filter_def || data.defense < 0)) || (filter_deftype == 6 && data.defense != -2) || (data.type & TYPE_LINK)) continue; } if(filter_lvtype) { if((filter_lvtype == 1 && data.level != filter_lv) || (filter_lvtype == 2 && data.level < filter_lv) || (filter_lvtype == 3 && data.level <= filter_lv) || (filter_lvtype == 4 && data.level > filter_lv) || (filter_lvtype == 5 && data.level >= filter_lv) || filter_lvtype == 6) continue; } if(filter_scltype) { if((filter_scltype == 1 && data.lscale != filter_scl) || (filter_scltype == 2 && data.lscale < filter_scl) || (filter_scltype == 3 && data.lscale <= filter_scl) || (filter_scltype == 4 && (data.lscale > filter_scl || data.lscale == 0)) || (filter_scltype == 5 && (data.lscale >= filter_scl || data.lscale == 0)) || filter_scltype == 6 || !(data.type & TYPE_PENDULUM)) continue; } break; } case 2: { if(!(data.type & TYPE_SPELL)) continue; if(filter_type2 && data.type != filter_type2) continue; break; } case 3: { if(!(data.type & TYPE_TRAP)) continue; if(filter_type2 && data.type != filter_type2) continue; break; } } if(filter_effect && !(data.category & filter_effect)) continue; if(filter_marks && (data.link_marker & filter_marks)!= filter_marks) continue; if(filter_lm) { if(filter_lm <= 3 && (!filterList->count(ptr->first) || (*filterList)[ptr->first] != filter_lm - 1)) continue; if(filter_lm == 4 && data.ot != 1) continue; if(filter_lm == 5 && data.ot != 2) continue; if(filter_lm == 6 && data.ot != 3) continue; if(filter_lm == 7 && data.ot != 4) continue; } bool is_target = true; for (auto elements_iterator = query_elements.begin(); elements_iterator != query_elements.end(); ++elements_iterator) { bool match = false; if (elements_iterator->type == element_t::type_t::name) { match = CardNameContains(text.name.c_str(), elements_iterator->keyword.c_str()); } else if (elements_iterator->type == element_t::type_t::setcode) { match = elements_iterator->setcode && check_set_code(data, elements_iterator->setcode); } else { int trycode = BufferIO::GetVal(elements_iterator->keyword.c_str()); bool tryresult = dataManager.GetData(trycode, 0); if(!tryresult) { match = CardNameContains(text.name.c_str(), elements_iterator->keyword.c_str()) || text.text.find(elements_iterator->keyword) != std::wstring::npos || (elements_iterator->setcode && check_set_code(data, elements_iterator->setcode)); } else { match = data.code == trycode || data.alias == trycode; } } if(elements_iterator->exclude) match = !match; if(!match) { is_target = false; break; } } if(is_target) results.push_back(ptr); else continue; } myswprintf(result_string, L"%d", results.size()); if(results.size() > 7) { mainGame->scrFilter->setVisible(true); mainGame->scrFilter->setMax(results.size() - 7); mainGame->scrFilter->setPos(0); } else { mainGame->scrFilter->setVisible(false); mainGame->scrFilter->setPos(0); } SortList(); }