Commit a8dee7d3 authored by nanahira's avatar nanahira

Merge branch 'server' of https://github.com/purerosefallen/ygopro

parents 98d62434 ecdf0e7c
...@@ -132,7 +132,7 @@ void ClientCard::UpdateInfo(char* buf) { ...@@ -132,7 +132,7 @@ void ClientCard::UpdateInfo(char* buf) {
int l = BufferIO::ReadInt8(buf); int l = BufferIO::ReadInt8(buf);
int s = BufferIO::ReadInt8(buf); int s = BufferIO::ReadInt8(buf);
BufferIO::ReadInt8(buf); BufferIO::ReadInt8(buf);
ClientCard* ecard = mainGame->dField.GetCard(c, l, s); ClientCard* ecard = mainGame->dField.GetCard(mainGame->LocalPlayer(c), l, s);
equipTarget = ecard; equipTarget = ecard;
ecard->equipped.insert(this); ecard->equipped.insert(this);
} }
...@@ -143,7 +143,7 @@ void ClientCard::UpdateInfo(char* buf) { ...@@ -143,7 +143,7 @@ void ClientCard::UpdateInfo(char* buf) {
int l = BufferIO::ReadInt8(buf); int l = BufferIO::ReadInt8(buf);
int s = BufferIO::ReadInt8(buf); int s = BufferIO::ReadInt8(buf);
BufferIO::ReadInt8(buf); BufferIO::ReadInt8(buf);
ClientCard* tcard = mainGame->dField.GetCard(c, l, s); ClientCard* tcard = mainGame->dField.GetCard(mainGame->LocalPlayer(c), l, s);
cardTarget.insert(tcard); cardTarget.insert(tcard);
tcard->ownerTarget.insert(this); tcard->ownerTarget.insert(this);
} }
......
...@@ -717,15 +717,15 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -717,15 +717,15 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
return false; return false;
} }
void DeckBuilder::GetHoveredCard() { void DeckBuilder::GetHoveredCard() {
int pre_code = hovered_code;
hovered_pos = 0;
hovered_code = 0;
irr::gui::IGUIElement* root = mainGame->env->getRootGUIElement(); irr::gui::IGUIElement* root = mainGame->env->getRootGUIElement();
if(root->getElementFromPoint(mouse_pos) != root) if(root->getElementFromPoint(mouse_pos) != root)
return; return;
position2di pos = mainGame->ResizeReverse(mouse_pos.X, mouse_pos.Y); position2di pos = mainGame->ResizeReverse(mouse_pos.X, mouse_pos.Y);
int x = pos.X; int x = pos.X;
int y = pos.Y; int y = pos.Y;
int pre_code = hovered_code;
hovered_pos = 0;
hovered_code = 0;
is_lastcard = 0; is_lastcard = 0;
if(x >= 314 && x <= 794) { if(x >= 314 && x <= 794) {
if(y >= 164 && y <= 435) { if(y >= 164 && y <= 435) {
...@@ -817,42 +817,78 @@ void DeckBuilder::StartFilter() { ...@@ -817,42 +817,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();
std::wstring str = std::wstring(pstr); std::wstring str = std::wstring(pstr);
std::vector<std::wstring> query_elements; std::vector<element_t> query_elements;
std::vector<std::vector<std::wstring>::iterator> query_elements_track; if(mainGame->gameConf.search_multiple_keywords) {
size_t element_start = 0; const wchar_t separator = mainGame->gameConf.search_multiple_keywords == 1 ? L' ' : L'+';
while(mainGame->gameConf.search_multiple_keywords) { const wchar_t minussign = L'-';
size_t element_end = str.find_first_of(mainGame->gameConf.search_multiple_keywords == 1 ? L' ' : L'+', element_start); const wchar_t quotation = L'\"';
if(element_end == std::wstring::npos) size_t element_start = 0;
break; for(;;) {
size_t length = element_end - element_start; element_start = str.find_first_not_of(separator, element_start);
if(length > 0) { if(element_start == std::wstring::npos)
query_elements.push_back(str.substr(element_start, length)); 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; element_start = element_end + 1;
} else }
} else {
element_t element;
size_t element_start = 0;
if(str[element_start] == L'$') {
element.type = element_t::type_t::name;
element_start++; 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);
}
} }
query_elements.push_back(str.substr(element_start));
std::unordered_map<std::wstring, unsigned int> set_code_map;
for(auto elements_iterator = query_elements.begin(); elements_iterator != query_elements.end(); elements_iterator++) {
const wchar_t* element_pointer = elements_iterator->c_str();
if(element_pointer[0] == L'@')
set_code_map[*elements_iterator] = dataManager.GetSetCode(&element_pointer[1]);
else
set_code_map[*elements_iterator] = dataManager.GetSetCode(&element_pointer[0]);
if(element_pointer[0] == 0 || (element_pointer[0] == L'$' && element_pointer[1] == 0) || (element_pointer[0] == L'@' && element_pointer[1] == 0))
query_elements_track.push_back(elements_iterator);
}
for(auto elements_track_iterator = query_elements_track.begin(); elements_track_iterator != query_elements_track.end(); elements_track_iterator++)
query_elements.erase(*elements_track_iterator);
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(); 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;
...@@ -927,34 +963,30 @@ void DeckBuilder::FilterCards() { ...@@ -927,34 +963,30 @@ void DeckBuilder::FilterCards() {
continue; continue;
} }
bool is_target = true; bool is_target = true;
for (auto elements_iterator = query_elements.begin(); elements_iterator != query_elements.end(); elements_iterator++) { for (auto elements_iterator = query_elements.begin(); elements_iterator != query_elements.end(); ++elements_iterator) {
const wchar_t* element_pointer = elements_iterator->c_str(); bool match = false;
if (element_pointer[0] == L'$') { if (elements_iterator->type == element_t::type_t::name) {
if(!CardNameContains(text.name.c_str(), &element_pointer[1])){ match = CardNameContains(text.name.c_str(), elements_iterator->keyword.c_str());
is_target = false; } else if (elements_iterator->type == element_t::type_t::setcode) {
break; match = elements_iterator->setcode && check_set_code(data, elements_iterator->setcode);
}
}
else if (element_pointer[0] == L'@' && set_code_map[*elements_iterator]) {
if(!check_set_code(data, set_code_map[*elements_iterator])) {
is_target = false;
break;
}
} else { } else {
int trycode = BufferIO::GetVal(elements_iterator->c_str()); 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(), elements_iterator->c_str()) && text.text.find(elements_iterator->c_str()) == std::wstring::npos if(!tryresult) {
&& !mainGame->CheckRegEx(text.text, *elements_iterator) match = CardNameContains(text.name.c_str(), elements_iterator->keyword.c_str())
&& (!set_code_map[*elements_iterator] || !check_set_code(data, set_code_map[*elements_iterator]))) { || text.text.find(elements_iterator->keyword) != std::wstring::npos
is_target = false; || mainGame->CheckRegEx(text.text, elements_iterator->keyword)
break; || (elements_iterator->setcode && check_set_code(data, elements_iterator->setcode));
} } else {
if(tryresult && data.code != trycode match = data.code == trycode || data.alias == trycode;
&& !(data.alias == trycode && (data.alias - data.code < CARD_ARTWORK_VERSIONS_OFFSET || data.code - data.alias < CARD_ARTWORK_VERSIONS_OFFSET))) {
is_target = false;
break;
} }
} }
if(elements_iterator->exclude)
match = !match;
if(!match) {
is_target = false;
break;
}
} }
if(is_target) if(is_target)
results.push_back(ptr); results.push_back(ptr);
......
...@@ -58,7 +58,7 @@ void DeckManager::LoadLFListSingle(const char* path) { ...@@ -58,7 +58,7 @@ void DeckManager::LoadLFListSingle(const char* path) {
void DeckManager::LoadLFList() { void DeckManager::LoadLFList() {
LoadLFListSingle("expansions/lflist.conf"); LoadLFListSingle("expansions/lflist.conf");
FileSystem::TraversalDir("./expansions", [this](const char* name, bool isdir) { FileSystem::TraversalDir("./expansions", [this](const char* name, bool isdir) {
if(isdir && strcmp(name, ".") && strcmp(name, "..")) { if(isdir && strcmp(name, ".") && strcmp(name, "..") && strcmp(name, "pics") && strcmp(name, "script")) {
char fpath[1024]; char fpath[1024];
sprintf(fpath, "./expansions/%s/lflist.conf", name); sprintf(fpath, "./expansions/%s/lflist.conf", name);
LoadLFListSingle(fpath); LoadLFListSingle(fpath);
......
...@@ -24,6 +24,7 @@ char DuelClient::duel_client_read[0x2000]; ...@@ -24,6 +24,7 @@ char DuelClient::duel_client_read[0x2000];
char DuelClient::duel_client_write[0x2000]; char DuelClient::duel_client_write[0x2000];
bool DuelClient::is_closing = false; bool DuelClient::is_closing = false;
int DuelClient::select_hint = 0; int DuelClient::select_hint = 0;
int DuelClient::select_unselect_hint = 0;
wchar_t DuelClient::event_string[256]; wchar_t DuelClient::event_string[256];
mtrandom DuelClient::rnd; mtrandom DuelClient::rnd;
...@@ -1545,7 +1546,9 @@ int DuelClient::ClientAnalyze(char * msg, unsigned int len) { ...@@ -1545,7 +1546,9 @@ int DuelClient::ClientAnalyze(char * msg, unsigned int len) {
} }
std::sort(mainGame->dField.selectable_cards.begin(), mainGame->dField.selectable_cards.end(), ClientCard::client_card_sort); std::sort(mainGame->dField.selectable_cards.begin(), mainGame->dField.selectable_cards.end(), ClientCard::client_card_sort);
if(select_hint) if(select_hint)
myswprintf(textBuffer, L"%ls(%d-%d)", dataManager.GetDesc(select_hint), select_unselect_hint = select_hint;
if(select_unselect_hint)
myswprintf(textBuffer, L"%ls(%d-%d)", dataManager.GetDesc(select_unselect_hint),
mainGame->dField.select_min, mainGame->dField.select_max); mainGame->dField.select_min, mainGame->dField.select_max);
else myswprintf(textBuffer, L"%ls(%d-%d)", dataManager.GetSysString(560), mainGame->dField.select_min, mainGame->dField.select_max); else myswprintf(textBuffer, L"%ls(%d-%d)", dataManager.GetSysString(560), mainGame->dField.select_min, mainGame->dField.select_max);
select_hint = 0; select_hint = 0;
......
...@@ -30,6 +30,7 @@ private: ...@@ -30,6 +30,7 @@ private:
static char duel_client_write[0x2000]; static char duel_client_write[0x2000];
static bool is_closing; static bool is_closing;
static int select_hint; static int select_hint;
static int select_unselect_hint;
static wchar_t event_string[256]; static wchar_t event_string[256];
static mtrandom rnd; static mtrandom rnd;
public: public:
......
...@@ -1050,7 +1050,7 @@ void Game::SetStaticText(irr::gui::IGUIStaticText* pControl, u32 cWidth, irr::gu ...@@ -1050,7 +1050,7 @@ void Game::SetStaticText(irr::gui::IGUIStaticText* pControl, u32 cWidth, irr::gu
void Game::LoadExpansionDB() { void Game::LoadExpansionDB() {
LoadExpansionDBDirectry("./expansions"); LoadExpansionDBDirectry("./expansions");
FileSystem::TraversalDir("./expansions", [this](const char* name, bool isdir) { FileSystem::TraversalDir("./expansions", [this](const char* name, bool isdir) {
if(isdir && strcmp(name, ".") && strcmp(name, "..")) { if(isdir && strcmp(name, ".") && strcmp(name, "..") && strcmp(name, "pics") && strcmp(name, "script")) {
char subdir[1024]; char subdir[1024];
sprintf(subdir, "./expansions/%s", name); sprintf(subdir, "./expansions/%s", name);
LoadExpansionDBDirectry(subdir); LoadExpansionDBDirectry(subdir);
...@@ -1070,7 +1070,7 @@ void Game::LoadExpansionDBDirectry(const char* path) { ...@@ -1070,7 +1070,7 @@ void Game::LoadExpansionDBDirectry(const char* path) {
void Game::LoadExpansionStrings() { void Game::LoadExpansionStrings() {
dataManager.LoadStrings("./expansions/strings.conf"); dataManager.LoadStrings("./expansions/strings.conf");
FileSystem::TraversalDir("./expansions", [](const char* name, bool isdir) { FileSystem::TraversalDir("./expansions", [](const char* name, bool isdir) {
if(isdir && strcmp(name, ".") && strcmp(name, "..")) { if(isdir && strcmp(name, ".") && strcmp(name, "..") && strcmp(name, "pics") && strcmp(name, "script")) {
char fpath[1024]; char fpath[1024];
sprintf(fpath, "./expansions/%s/strings.conf", name); sprintf(fpath, "./expansions/%s/strings.conf", name);
dataManager.LoadStrings(fpath); dataManager.LoadStrings(fpath);
......
...@@ -308,7 +308,7 @@ irr::video::ITexture* ImageManager::GetTextureExpansions(char* file, s32 width, ...@@ -308,7 +308,7 @@ irr::video::ITexture* ImageManager::GetTextureExpansions(char* file, s32 width,
return img; return img;
bool find = false; bool find = false;
FileSystem::TraversalDir("./expansions", [this, file, width, height, &img, &find](const char* name, bool isdir) { FileSystem::TraversalDir("./expansions", [this, file, width, height, &img, &find](const char* name, bool isdir) {
if(!find && isdir && strcmp(name, ".") && strcmp(name, "..")) { if(!find && isdir && strcmp(name, ".") && strcmp(name, "..") && strcmp(name, "pics") && strcmp(name, "script")) {
char subdir[1024]; char subdir[1024];
sprintf(subdir, "./expansions/%s", name); sprintf(subdir, "./expansions/%s", name);
img = GetTextureExpansionsDirectry(subdir, file, width, height); img = GetTextureExpansionsDirectry(subdir, file, width, height);
......
...@@ -954,7 +954,7 @@ byte* ReplayMode::ScriptReaderEx(const char* script_name, int* slen) { ...@@ -954,7 +954,7 @@ byte* ReplayMode::ScriptReaderEx(const char* script_name, int* slen) {
return buffer; return buffer;
bool find = false; bool find = false;
FileSystem::TraversalDir("./expansions", [script_name, slen, &buffer, &find](const char* name, bool isdir) { FileSystem::TraversalDir("./expansions", [script_name, slen, &buffer, &find](const char* name, bool isdir) {
if(!find && isdir && strcmp(name, ".") && strcmp(name, "..")) { if(!find && isdir && strcmp(name, ".") && strcmp(name, "..") && strcmp(name, "pics") && strcmp(name, "script")) {
char subdir[1024]; char subdir[1024];
sprintf(subdir, "./expansions/%s", name); sprintf(subdir, "./expansions/%s", name);
buffer = ScriptReaderExDirectry(subdir, script_name, slen); buffer = ScriptReaderExDirectry(subdir, script_name, slen);
......
...@@ -2199,7 +2199,7 @@ byte* SingleDuel::ScriptReaderEx(const char* script_name, int* slen) { ...@@ -2199,7 +2199,7 @@ byte* SingleDuel::ScriptReaderEx(const char* script_name, int* slen) {
return buffer; return buffer;
bool find = false; bool find = false;
FileSystem::TraversalDir("./expansions", [script_name, slen, &buffer, &find](const char* name, bool isdir) { FileSystem::TraversalDir("./expansions", [script_name, slen, &buffer, &find](const char* name, bool isdir) {
if(!find && isdir && strcmp(name, ".") && strcmp(name, "..")) { if(!find && isdir && strcmp(name, ".") && strcmp(name, "..") && strcmp(name, "pics") && strcmp(name, "script")) {
char subdir[1024]; char subdir[1024];
sprintf(subdir, "./expansions/%s", name); sprintf(subdir, "./expansions/%s", name);
buffer = ScriptReaderExDirectry(subdir, script_name, slen); buffer = ScriptReaderExDirectry(subdir, script_name, slen);
......
...@@ -871,7 +871,7 @@ byte* SingleMode::ScriptReaderEx(const char* script_name, int* slen) { ...@@ -871,7 +871,7 @@ byte* SingleMode::ScriptReaderEx(const char* script_name, int* slen) {
return buffer; return buffer;
bool find = false; bool find = false;
FileSystem::TraversalDir("./expansions", [script_name, slen, &buffer, &find](const char* name, bool isdir) { FileSystem::TraversalDir("./expansions", [script_name, slen, &buffer, &find](const char* name, bool isdir) {
if(!find && isdir && strcmp(name, ".") && strcmp(name, "..")) { if(!find && isdir && strcmp(name, ".") && strcmp(name, "..") && strcmp(name, "pics") && strcmp(name, "script")) {
char subdir[1024]; char subdir[1024];
sprintf(subdir, "./expansions/%s", name); sprintf(subdir, "./expansions/%s", name);
buffer = ScriptReaderExDirectry(subdir, script_name, slen); buffer = ScriptReaderExDirectry(subdir, script_name, slen);
......
...@@ -2296,7 +2296,7 @@ byte* TagDuel::ScriptReaderEx(const char* script_name, int* slen) { ...@@ -2296,7 +2296,7 @@ byte* TagDuel::ScriptReaderEx(const char* script_name, int* slen) {
return buffer; return buffer;
bool find = false; bool find = false;
FileSystem::TraversalDir("./expansions", [script_name, slen, &buffer, &find](const char* name, bool isdir) { FileSystem::TraversalDir("./expansions", [script_name, slen, &buffer, &find](const char* name, bool isdir) {
if(!find && isdir && strcmp(name, ".") && strcmp(name, "..")) { if(!find && isdir && strcmp(name, ".") && strcmp(name, "..") && strcmp(name, "pics") && strcmp(name, "script")) {
char subdir[1024]; char subdir[1024];
sprintf(subdir, "./expansions/%s", name); sprintf(subdir, "./expansions/%s", name);
buffer = ScriptReaderExDirectry(subdir, script_name, slen); buffer = ScriptReaderExDirectry(subdir, script_name, slen);
......
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