Commit d0abf558 authored by DailyShana's avatar DailyShana

update struct LFList

use std::wstring and std::unordered_map directly
parent f23019eb
...@@ -74,7 +74,7 @@ void DeckBuilder::Initialize() { ...@@ -74,7 +74,7 @@ void DeckBuilder::Initialize() {
mainGame->btnSideShuffle->setVisible(false); mainGame->btnSideShuffle->setVisible(false);
mainGame->btnSideSort->setVisible(false); mainGame->btnSideSort->setVisible(false);
mainGame->btnSideReload->setVisible(false); mainGame->btnSideReload->setVisible(false);
filterList = deckManager._lfList[0].content; filterList = &deckManager._lfList[0].content;
mainGame->cbDBLFList->setSelected(0); mainGame->cbDBLFList->setSelected(0);
ClearSearch(); ClearSearch();
mouse_pos.set(0, 0); mouse_pos.set(0, 0);
...@@ -363,7 +363,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -363,7 +363,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
case irr::gui::EGET_COMBO_BOX_CHANGED: { case irr::gui::EGET_COMBO_BOX_CHANGED: {
switch(id) { switch(id) {
case COMBOBOX_DBLFLIST: { case COMBOBOX_DBLFLIST: {
filterList = deckManager._lfList[mainGame->cbDBLFList->getSelected()].content; filterList = &deckManager._lfList[mainGame->cbDBLFList->getSelected()].content;
break; break;
} }
case COMBOBOX_DBDECKS: { case COMBOBOX_DBDECKS: {
...@@ -917,7 +917,7 @@ void DeckBuilder::FilterCards() { ...@@ -917,7 +917,7 @@ void DeckBuilder::FilterCards() {
if(filter_marks && (data.link_marker & filter_marks)!= filter_marks) if(filter_marks && (data.link_marker & filter_marks)!= filter_marks)
continue; continue;
if(filter_lm) { if(filter_lm) {
if(filter_lm <= 3 && (!filterList->count(ptr->first) || (*filterList)[ptr->first] != filter_lm - 1)) if(filter_lm <= 3 && (!filterList->count(ptr->first) || (*filterList).at(ptr->first) != filter_lm - 1))
continue; continue;
if(filter_lm == 4 && data.ot != 1) if(filter_lm == 4 && data.ot != 1)
continue; continue;
......
...@@ -65,7 +65,7 @@ public: ...@@ -65,7 +65,7 @@ public:
int prev_sel; int prev_sel;
bool is_modified; bool is_modified;
std::unordered_map<int, int>* filterList; const std::unordered_map<int, int>* filterList;
std::vector<code_pointer> results; std::vector<code_pointer> results;
wchar_t result_string[8]; wchar_t result_string[8];
}; };
......
...@@ -9,7 +9,7 @@ namespace ygo { ...@@ -9,7 +9,7 @@ namespace ygo {
DeckManager deckManager; DeckManager deckManager;
void DeckManager::LoadLFListSingle(const char* path) { void DeckManager::LoadLFListSingle(const char* path) {
LFList* cur = NULL; LFList* cur = nullptr;
FILE* fp = fopen(path, "r"); FILE* fp = fopen(path, "r");
char linebuf[256]; char linebuf[256];
wchar_t strBuffer[256]; wchar_t strBuffer[256];
...@@ -17,33 +17,32 @@ void DeckManager::LoadLFListSingle(const char* path) { ...@@ -17,33 +17,32 @@ void DeckManager::LoadLFListSingle(const char* path) {
while(fgets(linebuf, 256, fp)) { while(fgets(linebuf, 256, fp)) {
if(linebuf[0] == '#') if(linebuf[0] == '#')
continue; continue;
int p = 0, sa = 0, code, count;
if(linebuf[0] == '!') { if(linebuf[0] == '!') {
sa = BufferIO::DecodeUTF8((const char*)(&linebuf[1]), strBuffer); int sa = BufferIO::DecodeUTF8(&linebuf[1], strBuffer);
while(strBuffer[sa - 1] == L'\r' || strBuffer[sa - 1] == L'\n' ) sa--; while(strBuffer[sa - 1] == L'\r' || strBuffer[sa - 1] == L'\n' ) sa--;
strBuffer[sa] = 0;
LFList newlist; LFList newlist;
_lfList.push_back(newlist); _lfList.push_back(newlist);
cur = &_lfList[_lfList.size() - 1]; cur = &_lfList[_lfList.size() - 1];
memcpy(cur->listName, (const void*)strBuffer, 20 * sizeof(wchar_t)); cur->listName = strBuffer;
cur->listName[sa] = 0;
cur->content = new std::unordered_map<int, int>;
cur->hash = 0x7dfcee6a; cur->hash = 0x7dfcee6a;
continue; continue;
} }
int p = 0;
while(linebuf[p] != ' ' && linebuf[p] != '\t' && linebuf[p] != 0) p++; while(linebuf[p] != ' ' && linebuf[p] != '\t' && linebuf[p] != 0) p++;
if(linebuf[p] == 0) if(linebuf[p] == 0)
continue; continue;
linebuf[p++] = 0; linebuf[p++] = 0;
sa = p; int sa = p;
code = atoi(linebuf); int code = atoi(linebuf);
if(code == 0) if(code == 0)
continue; continue;
while(linebuf[p] == ' ' || linebuf[p] == '\t') p++; while(linebuf[p] == ' ' || linebuf[p] == '\t') p++;
while(linebuf[p] != ' ' && linebuf[p] != '\t' && linebuf[p] != 0) p++; while(linebuf[p] != ' ' && linebuf[p] != '\t' && linebuf[p] != 0) p++;
linebuf[p] = 0; linebuf[p] = 0;
count = atoi(&linebuf[sa]); int count = atoi(&linebuf[sa]);
if(cur == NULL) continue; if(!cur) continue;
(*cur->content)[code] = count; cur->content[code] = count;
cur->hash = cur->hash ^ ((code << 18) | (code >> 14)) ^ ((code << (27 + count)) | (code >> (5 - count))); cur->hash = cur->hash ^ ((code << 18) | (code >> 14)) ^ ((code << (27 + count)) | (code >> (5 - count)));
} }
fclose(fp); fclose(fp);
...@@ -53,28 +52,29 @@ void DeckManager::LoadLFList() { ...@@ -53,28 +52,29 @@ void DeckManager::LoadLFList() {
LoadLFListSingle("expansions/lflist.conf"); LoadLFListSingle("expansions/lflist.conf");
LoadLFListSingle("lflist.conf"); LoadLFListSingle("lflist.conf");
LFList nolimit; LFList nolimit;
myswprintf(nolimit.listName, L"N/A"); nolimit.listName = L"N/A";
nolimit.hash = 0; nolimit.hash = 0;
nolimit.content = new std::unordered_map<int, int>;
_lfList.push_back(nolimit); _lfList.push_back(nolimit);
} }
wchar_t* DeckManager::GetLFListName(int lfhash) { const wchar_t* DeckManager::GetLFListName(int lfhash) {
for(size_t i = 0; i < _lfList.size(); ++i) { auto lit = std::find_if(_lfList.begin(), _lfList.end(), [lfhash](const ygo::LFList& list) {
if(_lfList[i].hash == (unsigned int)lfhash) { return list.hash == lfhash;
return _lfList[i].listName; });
} if(lit != _lfList.end())
} return lit->listName.c_str();
return (wchar_t*)dataManager.unknown_string; return dataManager.unknown_string;
}
const std::unordered_map<int, int>* DeckManager::GetLFListContent(int lfhash) {
auto lit = std::find_if(_lfList.begin(), _lfList.end(), [lfhash](const ygo::LFList& list) {
return list.hash == lfhash;
});
if(lit != _lfList.end())
return &lit->content;
return nullptr;
} }
int DeckManager::CheckDeck(Deck& deck, int lfhash, bool allow_ocg, bool allow_tcg) { int DeckManager::CheckDeck(Deck& deck, int lfhash, bool allow_ocg, bool allow_tcg) {
std::unordered_map<int, int> ccount; std::unordered_map<int, int> ccount;
std::unordered_map<int, int>* list = 0; auto list = GetLFListContent(lfhash);
for(size_t i = 0; i < _lfList.size(); ++i) {
if(_lfList[i].hash == (unsigned int)lfhash) {
list = _lfList[i].content;
break;
}
}
if(!list) if(!list)
return 0; return 0;
int dc = 0; int dc = 0;
......
...@@ -10,8 +10,8 @@ namespace ygo { ...@@ -10,8 +10,8 @@ namespace ygo {
struct LFList { struct LFList {
unsigned int hash; unsigned int hash;
wchar_t listName[20]; std::wstring listName;
std::unordered_map<int, int>* content; std::unordered_map<int, int> content;
}; };
struct Deck { struct Deck {
std::vector<code_pointer> main; std::vector<code_pointer> main;
...@@ -37,7 +37,8 @@ public: ...@@ -37,7 +37,8 @@ public:
void LoadLFListSingle(const char* path); void LoadLFListSingle(const char* path);
void LoadLFList(); void LoadLFList();
wchar_t* GetLFListName(int lfhash); const wchar_t* GetLFListName(int lfhash);
const std::unordered_map<int, int>* GetLFListContent(int lfhash);
int CheckDeck(Deck& deck, int lfhash, bool allow_ocg, bool allow_tcg); int CheckDeck(Deck& deck, int lfhash, bool allow_ocg, bool allow_tcg);
int LoadDeck(Deck& deck, int* dbuf, int mainc, int sidec); int LoadDeck(Deck& deck, int* dbuf, int mainc, int sidec);
bool LoadSide(Deck& deck, int* dbuf, int mainc, int sidec); bool LoadSide(Deck& deck, int* dbuf, int mainc, int sidec);
......
...@@ -1037,7 +1037,7 @@ void Game::WaitFrameSignal(int frame) { ...@@ -1037,7 +1037,7 @@ void Game::WaitFrameSignal(int frame) {
signalFrame = (gameConf.quick_animation && frame >= 12) ? 12 : frame; signalFrame = (gameConf.quick_animation && frame >= 12) ? 12 : frame;
frameSignal.Wait(); frameSignal.Wait();
} }
void Game::DrawThumb(code_pointer cp, position2di pos, std::unordered_map<int, int>* lflist, bool drag) { void Game::DrawThumb(code_pointer cp, position2di pos, const std::unordered_map<int,int>* lflist, bool drag) {
int code = cp->first; int code = cp->first;
int lcode = cp->second.alias; int lcode = cp->second.alias;
if(lcode == 0) if(lcode == 0)
...@@ -1056,7 +1056,7 @@ void Game::DrawThumb(code_pointer cp, position2di pos, std::unordered_map<int, i ...@@ -1056,7 +1056,7 @@ void Game::DrawThumb(code_pointer cp, position2di pos, std::unordered_map<int, i
} }
driver->draw2DImage(img, dragloc, rect<s32>(0, 0, size.Width, size.Height)); driver->draw2DImage(img, dragloc, rect<s32>(0, 0, size.Width, size.Height));
if(lflist->count(lcode)) { if(lflist->count(lcode)) {
switch((*lflist)[lcode]) { switch((*lflist).at(lcode)) {
case 0: case 0:
driver->draw2DImage(imageManager.tLim, limitloc, recti(0, 0, 64, 64), 0, 0, true); driver->draw2DImage(imageManager.tLim, limitloc, recti(0, 0, 64, 64), 0, 0, true);
break; break;
......
...@@ -463,12 +463,9 @@ void DuelClient::HandleSTOCPacketLan(char* data, unsigned int len) { ...@@ -463,12 +463,9 @@ void DuelClient::HandleSTOCPacketLan(char* data, unsigned int len) {
mainGame->dInfo.time_limit = pkt->info.time_limit; mainGame->dInfo.time_limit = pkt->info.time_limit;
mainGame->dInfo.time_left[0] = 0; mainGame->dInfo.time_left[0] = 0;
mainGame->dInfo.time_left[1] = 0; mainGame->dInfo.time_left[1] = 0;
mainGame->deckBuilder.filterList = 0; mainGame->deckBuilder.filterList = deckManager.GetLFListContent(pkt->info.lflist);
for(auto lit = deckManager._lfList.begin(); lit != deckManager._lfList.end(); ++lit) if(mainGame->deckBuilder.filterList == nullptr)
if(lit->hash == pkt->info.lflist) mainGame->deckBuilder.filterList = &deckManager._lfList[0].content;
mainGame->deckBuilder.filterList = lit->content;
if(mainGame->deckBuilder.filterList == 0)
mainGame->deckBuilder.filterList = deckManager._lfList[0].content;
mainGame->stHostPrepDuelist[0]->setText(L""); mainGame->stHostPrepDuelist[0]->setText(L"");
mainGame->stHostPrepDuelist[1]->setText(L""); mainGame->stHostPrepDuelist[1]->setText(L"");
mainGame->stHostPrepDuelist[2]->setText(L""); mainGame->stHostPrepDuelist[2]->setText(L"");
......
...@@ -131,7 +131,7 @@ bool Game::Initialize() { ...@@ -131,7 +131,7 @@ bool Game::Initialize() {
env->addStaticText(dataManager.GetSysString(1226), rect<s32>(20, 30, 220, 50), false, false, wCreateHost); env->addStaticText(dataManager.GetSysString(1226), rect<s32>(20, 30, 220, 50), false, false, wCreateHost);
cbLFlist = env->addComboBox(rect<s32>(140, 25, 300, 50), wCreateHost); cbLFlist = env->addComboBox(rect<s32>(140, 25, 300, 50), wCreateHost);
for(unsigned int i = 0; i < deckManager._lfList.size(); ++i) for(unsigned int i = 0; i < deckManager._lfList.size(); ++i)
cbLFlist->addItem(deckManager._lfList[i].listName, deckManager._lfList[i].hash); cbLFlist->addItem(deckManager._lfList[i].listName.c_str(), deckManager._lfList[i].hash);
env->addStaticText(dataManager.GetSysString(1225), rect<s32>(20, 60, 220, 80), false, false, wCreateHost); env->addStaticText(dataManager.GetSysString(1225), rect<s32>(20, 60, 220, 80), false, false, wCreateHost);
cbRule = env->addComboBox(rect<s32>(140, 55, 300, 80), wCreateHost); cbRule = env->addComboBox(rect<s32>(140, 55, 300, 80), wCreateHost);
cbRule->addItem(dataManager.GetSysString(1240)); cbRule->addItem(dataManager.GetSysString(1240));
...@@ -510,7 +510,7 @@ bool Game::Initialize() { ...@@ -510,7 +510,7 @@ bool Game::Initialize() {
cbDBDecks = env->addComboBox(rect<s32>(80, 35, 220, 60), wDeckEdit, COMBOBOX_DBDECKS); cbDBDecks = env->addComboBox(rect<s32>(80, 35, 220, 60), wDeckEdit, COMBOBOX_DBDECKS);
cbDBDecks->setMaxSelectionRows(15); cbDBDecks->setMaxSelectionRows(15);
for(unsigned int i = 0; i < deckManager._lfList.size(); ++i) for(unsigned int i = 0; i < deckManager._lfList.size(); ++i)
cbDBLFList->addItem(deckManager._lfList[i].listName); cbDBLFList->addItem(deckManager._lfList[i].listName.c_str());
btnSaveDeck = env->addButton(rect<s32>(225, 35, 290, 60), wDeckEdit, BUTTON_SAVE_DECK, dataManager.GetSysString(1302)); btnSaveDeck = env->addButton(rect<s32>(225, 35, 290, 60), wDeckEdit, BUTTON_SAVE_DECK, dataManager.GetSysString(1302));
ebDeckname = env->addEditBox(L"", rect<s32>(80, 65, 220, 90), true, wDeckEdit, -1); ebDeckname = env->addEditBox(L"", rect<s32>(80, 65, 220, 90), true, wDeckEdit, -1);
ebDeckname->setTextAlignment(irr::gui::EGUIA_CENTER, irr::gui::EGUIA_CENTER); ebDeckname->setTextAlignment(irr::gui::EGUIA_CENTER, irr::gui::EGUIA_CENTER);
......
...@@ -134,7 +134,7 @@ public: ...@@ -134,7 +134,7 @@ public:
void HideElement(irr::gui::IGUIElement* element, bool set_action = false); void HideElement(irr::gui::IGUIElement* element, bool set_action = false);
void PopupElement(irr::gui::IGUIElement* element, int hideframe = 0); void PopupElement(irr::gui::IGUIElement* element, int hideframe = 0);
void WaitFrameSignal(int frame); void WaitFrameSignal(int frame);
void DrawThumb(code_pointer cp, position2di pos, std::unordered_map<int, int>* lflist, bool drag = false); void DrawThumb(code_pointer cp, position2di pos, const std::unordered_map<int,int>* lflist, bool drag = false);
void DrawDeckBd(); void DrawDeckBd();
void LoadConfig(); void LoadConfig();
void SaveConfig(); void SaveConfig();
......
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