Commit 14c55c6e authored by mercury233's avatar mercury233

Merge branch 'master' of https://github.com/Fluorohydride/ygopro into server

parents c31b4e4f bd2d00f2
...@@ -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);
} }
......
...@@ -676,14 +676,14 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -676,14 +676,14 @@ 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;
int x = mouse_pos.X; int x = mouse_pos.X;
int y = mouse_pos.Y; int y = mouse_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) {
...@@ -775,42 +775,78 @@ void DeckBuilder::StartFilter() { ...@@ -775,42 +775,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;
...@@ -885,33 +921,29 @@ void DeckBuilder::FilterCards() { ...@@ -885,33 +921,29 @@ 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) {
&& (!set_code_map[*elements_iterator] || !check_set_code(data, set_code_map[*elements_iterator]))) { match = CardNameContains(text.name.c_str(), elements_iterator->keyword.c_str())
is_target = false; || text.text.find(elements_iterator->keyword) != std::wstring::npos
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);
......
...@@ -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;
...@@ -1452,7 +1453,9 @@ int DuelClient::ClientAnalyze(char * msg, unsigned int len) { ...@@ -1452,7 +1453,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:
......
...@@ -2243,7 +2243,8 @@ void ClientField::ShowCardInfoInList(ClientCard* pcard, irr::gui::IGUIElement* e ...@@ -2243,7 +2243,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];
......
...@@ -5,10 +5,7 @@ ...@@ -5,10 +5,7 @@
#include <functional> #include <functional>
#include "bufferio.h" #include "bufferio.h"
#ifdef _WIN32 #ifndef _WIN32
#include <direct.h>
#include <sys/stat.h>
#else
#include <dirent.h> #include <dirent.h>
#include <sys/stat.h> #include <sys/stat.h>
#endif #endif
...@@ -20,8 +17,8 @@ ...@@ -20,8 +17,8 @@
class FileSystem { class FileSystem {
public: public:
static bool IsFileExists(const wchar_t* wfile) { static bool IsFileExists(const wchar_t* wfile) {
struct _stat fileStat; DWORD attr = GetFileAttributesW(wfile);
return (_wstat(wfile, &fileStat) == 0) && !(fileStat.st_mode & _S_IFDIR); return attr != INVALID_FILE_ATTRIBUTES && !(attr & FILE_ATTRIBUTE_DIRECTORY);
} }
static bool IsFileExists(const char* file) { static bool IsFileExists(const char* file) {
...@@ -31,8 +28,8 @@ public: ...@@ -31,8 +28,8 @@ public:
} }
static bool IsDirExists(const wchar_t* wdir) { static bool IsDirExists(const wchar_t* wdir) {
struct _stat fileStat; DWORD attr = GetFileAttributesW(wdir);
return (_wstat(wdir, &fileStat) == 0) && (fileStat.st_mode & _S_IFDIR); return attr != INVALID_FILE_ATTRIBUTES && (attr & FILE_ATTRIBUTE_DIRECTORY);
} }
static bool IsDirExists(const char* dir) { static bool IsDirExists(const char* dir) {
...@@ -42,7 +39,7 @@ public: ...@@ -42,7 +39,7 @@ public:
} }
static bool MakeDir(const wchar_t* wdir) { static bool MakeDir(const wchar_t* wdir) {
return _wmkdir(wdir) == 0; return CreateDirectoryW(wdir, NULL);
} }
static bool MakeDir(const char* dir) { static bool MakeDir(const char* dir) {
......
...@@ -752,7 +752,7 @@ ...@@ -752,7 +752,7 @@
#setname 0x8c 德鲁伊 ドルイド #setname 0x8c 德鲁伊 ドルイド
!setname 0x8d 鬼计 ゴーストリック !setname 0x8d 鬼计 ゴーストリック
!setname 0x8e 吸血鬼 ヴァンパイア !setname 0x8e 吸血鬼 ヴァンパイア
!setname 0x8f啦啦 ズババ !setname 0x8f拉拉 ズババ
!setname 0x90 森罗 森羅 !setname 0x90 森罗 森羅
!setname 0x91 王家长眠之谷 ネクロバレー !setname 0x91 王家长眠之谷 ネクロバレー
!setname 0x92 纹章 メダリオン !setname 0x92 纹章 メダリオン
......
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