Commit 17bd4520 authored by fallenstardust's avatar fallenstardust

add search operator " and -

only show proc complete for spsummon monsters
parent 63f1a25e
...@@ -834,14 +834,78 @@ void DeckBuilder::StartFilter() { ...@@ -834,14 +834,78 @@ void DeckBuilder::StartFilter() {
} }
void DeckBuilder::FilterCards() { void DeckBuilder::FilterCards() {
results.clear(); 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(); const wchar_t* pstr = mainGame->ebCardName->getText();
unsigned int set_code = 0; std::wstring str = std::wstring(pstr);
if(pstr[0] == L'@') std::vector<element_t> query_elements;
set_code = dataManager.GetSetCode(&pstr[1]); if(mainGame->gameConf.search_multiple_keywords) {
else const wchar_t separator = mainGame->gameConf.search_multiple_keywords == 1 ? L' ' : L'+';
set_code = dataManager.GetSetCode(&pstr[0]); const wchar_t minussign = L'-';
if(pstr[0] == 0 || (pstr[0] == L'$' && pstr[1] == 0) || (pstr[0] == L'@' && pstr[1] == 0)) const wchar_t quotation = L'\"';
pstr = 0; 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.setcode = dataManager.GetSetCode(element.keyword.c_str());
element.keyword = str.substr(element_start);
query_elements.push_back(element);
}
}
auto strpointer = dataManager._strings.begin(); auto strpointer = dataManager._strings.begin();
for(code_pointer ptr = dataManager._datas.begin(); ptr != dataManager._datas.end(); ++ptr, ++strpointer) { for(code_pointer ptr = dataManager._datas.begin(); ptr != dataManager._datas.end(); ++ptr, ++strpointer) {
const CardDataC& data = ptr->second; const CardDataC& data = ptr->second;
...@@ -915,24 +979,35 @@ void DeckBuilder::FilterCards() { ...@@ -915,24 +979,35 @@ void DeckBuilder::FilterCards() {
if(filter_lm == 7 && data.ot != 4) if(filter_lm == 7 && data.ot != 4)
continue; continue;
} }
if(pstr) { bool is_target = true;
if(pstr[0] == L'$') { for (auto elements_iterator = query_elements.begin(); elements_iterator != query_elements.end(); ++elements_iterator) {
if(!CardNameContains(text.name.c_str(), &pstr[1])) bool match = false;
continue; if (elements_iterator->type == element_t::type_t::name) {
} else if(pstr[0] == L'@' && set_code) { match = CardNameContains(text.name.c_str(), elements_iterator->keyword.c_str());
if(!check_set_code(data, set_code)) continue; } else if (elements_iterator->type == element_t::type_t::setcode) {
match = elements_iterator->setcode && check_set_code(data, elements_iterator->setcode);
} else { } else {
int trycode = BufferIO::GetVal(pstr); int trycode = BufferIO::GetVal(elements_iterator->keyword.c_str());
bool tryresult = dataManager.GetData(trycode, 0); bool tryresult = dataManager.GetData(trycode, 0);
if(!tryresult && !CardNameContains(text.name.c_str(), pstr) && text.text.find(pstr) == std::wstring::npos if(!tryresult) {
&& (!set_code || !check_set_code(data, set_code))) match = CardNameContains(text.name.c_str(), elements_iterator->keyword.c_str())
continue; || text.text.find(elements_iterator->keyword) != std::wstring::npos
if (tryresult && data.code != trycode || (elements_iterator->setcode && check_set_code(data, elements_iterator->setcode));
&& !(data.alias == trycode && (data.alias - data.code < CARD_ARTWORK_VERSIONS_OFFSET || data.code - data.alias < CARD_ARTWORK_VERSIONS_OFFSET))) } else {
continue; 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); results.push_back(ptr);
else
continue;
} }
myswprintf(result_string, L"%d", results.size()); myswprintf(result_string, L"%d", results.size());
if(results.size() > 7) { if(results.size() > 7) {
......
...@@ -2261,7 +2261,8 @@ void ClientField::ShowCardInfoInList(ClientCard* pcard, irr::gui::IGUIElement* e ...@@ -2261,7 +2261,8 @@ void ClientField::ShowCardInfoInList(ClientCard* pcard, irr::gui::IGUIElement* e
if(pcard->code) { if(pcard->code) {
str.append(dataManager.GetName(pcard->code)); str.append(dataManager.GetName(pcard->code));
} }
if(pcard->status & STATUS_PROC_COMPLETE) if((pcard->status & STATUS_PROC_COMPLETE)
&& (pcard->type & (TYPE_RITUAL | TYPE_FUSION | TYPE_SYNCHRO | TYPE_XYZ | TYPE_LINK | TYPE_SPSUMMON)))
str.append(L"\n").append(dataManager.GetSysString(224)); str.append(L"\n").append(dataManager.GetSysString(224));
for(size_t i = 0; i < chains.size(); ++i) { for(size_t i = 0; i < chains.size(); ++i) {
wchar_t formatBuffer[2048]; wchar_t formatBuffer[2048];
......
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