Commit 06a5e1c4 authored by nanahira's avatar nanahira

Merge remote-tracking branch 'fh/master' of ../../ygopro

parents b919b452 fed41b69
...@@ -141,6 +141,7 @@ public: ...@@ -141,6 +141,7 @@ public:
virtual bool OnCommonEvent(const irr::SEvent& event); virtual bool OnCommonEvent(const irr::SEvent& event);
void GetHoverField(int x, int y); void GetHoverField(int x, int y);
void ShowMenu(int flag, int x, int y); void ShowMenu(int flag, int x, int y);
void HideMenu();
void UpdateChainButtons(); void UpdateChainButtons();
void ShowCancelOrFinishButton(int buttonOp); void ShowCancelOrFinishButton(int buttonOp);
void SetShowMark(ClientCard* pcard, bool enable); void SetShowMark(ClientCard* pcard, bool enable);
......
...@@ -94,7 +94,7 @@ bool DataManager::LoadStrings(const char* file) { ...@@ -94,7 +94,7 @@ bool DataManager::LoadStrings(const char* file) {
ReadStringConfLine(linebuf); ReadStringConfLine(linebuf);
} }
fclose(fp); fclose(fp);
for(int i = 0; i < 255; ++i) for(int i = 0; i < 301; ++i)
myswprintf(numStrings[i], L"%d", i); myswprintf(numStrings[i], L"%d", i);
return true; return true;
} }
......
...@@ -43,7 +43,7 @@ public: ...@@ -43,7 +43,7 @@ public:
std::unordered_map<unsigned int, std::wstring> _setnameStrings; std::unordered_map<unsigned int, std::wstring> _setnameStrings;
std::unordered_map<unsigned int, std::wstring> _sysStrings; std::unordered_map<unsigned int, std::wstring> _sysStrings;
wchar_t numStrings[256][4]; wchar_t numStrings[301][4];
wchar_t numBuffer[6]; wchar_t numBuffer[6];
wchar_t attBuffer[128]; wchar_t attBuffer[128];
wchar_t racBuffer[128]; wchar_t racBuffer[128];
......
...@@ -90,6 +90,7 @@ void DeckBuilder::Initialize() { ...@@ -90,6 +90,7 @@ void DeckBuilder::Initialize() {
prev_deck = mainGame->cbDBDecks->getSelected(); prev_deck = mainGame->cbDBDecks->getSelected();
prev_category = mainGame->cbDBCategory->getSelected(); prev_category = mainGame->cbDBCategory->getSelected();
RefreshReadonly(prev_category); RefreshReadonly(prev_category);
RefreshPackListScroll();
prev_operation = 0; prev_operation = 0;
prev_sel = -1; prev_sel = -1;
is_modified = false; is_modified = false;
...@@ -116,6 +117,7 @@ void DeckBuilder::Terminate() { ...@@ -116,6 +117,7 @@ void DeckBuilder::Terminate() {
mainGame->ClearTextures(); mainGame->ClearTextures();
mainGame->showingcode = 0; mainGame->showingcode = 0;
mainGame->scrFilter->setVisible(false); mainGame->scrFilter->setVisible(false);
mainGame->scrPackCards->setVisible(false);
int catesel = mainGame->cbDBCategory->getSelected(); int catesel = mainGame->cbDBCategory->getSelected();
if(catesel >= 0) if(catesel >= 0)
BufferIO::CopyWStr(mainGame->cbDBCategory->getItem(catesel), mainGame->gameConf.lastcategory, 64); BufferIO::CopyWStr(mainGame->cbDBCategory->getItem(catesel), mainGame->gameConf.lastcategory, 64);
...@@ -999,7 +1001,8 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -999,7 +1001,8 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
wchar_t catepath[256]; wchar_t catepath[256];
deckManager.GetCategoryPath(catepath, mainGame->lstCategories->getSelected(), mainGame->lstCategories->getListItem(mainGame->lstCategories->getSelected())); deckManager.GetCategoryPath(catepath, mainGame->lstCategories->getSelected(), mainGame->lstCategories->getListItem(mainGame->lstCategories->getSelected()));
myswprintf(filepath, L"%ls/%ls.ydk", catepath, mainGame->lstDecks->getListItem(decksel)); myswprintf(filepath, L"%ls/%ls.ydk", catepath, mainGame->lstDecks->getListItem(decksel));
deckManager.LoadDeck(filepath); deckManager.LoadDeck(filepath, showing_pack);
RefreshPackListScroll();
prev_deck = decksel; prev_deck = decksel;
break; break;
} }
...@@ -1021,6 +1024,8 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -1021,6 +1024,8 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
if(hovered_pos == 0 || hovered_seq == -1) if(hovered_pos == 0 || hovered_seq == -1)
break; break;
click_pos = hovered_pos; click_pos = hovered_pos;
if(readonly)
break;
dragx = event.MouseInput.X; dragx = event.MouseInput.X;
dragy = event.MouseInput.Y; dragy = event.MouseInput.Y;
draging_pointer = dataManager.GetCodePointer(hovered_code); draging_pointer = dataManager.GetCodePointer(hovered_code);
...@@ -1102,6 +1107,8 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -1102,6 +1107,8 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
if(!is_draging) { if(!is_draging) {
if(hovered_pos == 0 || hovered_seq == -1) if(hovered_pos == 0 || hovered_seq == -1)
break; break;
if(readonly)
break;
soundManager.PlaySoundEffect(SOUND_CARD_DROP); soundManager.PlaySoundEffect(SOUND_CARD_DROP);
if(hovered_pos == 1) { if(hovered_pos == 1) {
pop_main(hovered_seq); pop_main(hovered_seq);
...@@ -1141,6 +1148,8 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -1141,6 +1148,8 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
break; break;
if (hovered_pos == 0 || hovered_seq == -1) if (hovered_pos == 0 || hovered_seq == -1)
break; break;
if (readonly)
break;
if (is_draging) if (is_draging)
break; break;
auto pointer = dataManager.GetCodePointer(hovered_code); auto pointer = dataManager.GetCodePointer(hovered_code);
...@@ -1224,7 +1233,33 @@ void DeckBuilder::GetHoveredCard() { ...@@ -1224,7 +1233,33 @@ void DeckBuilder::GetHoveredCard() {
int y = pos.Y; int y = pos.Y;
is_lastcard = 0; is_lastcard = 0;
if(x >= 314 && x <= 794) { if(x >= 314 && x <= 794) {
if(y >= 164 && y <= 435) { if(showing_pack) {
if((x <= 772 || !mainGame->scrPackCards->isVisible()) && y >= 164 && y <= 624) {
int mainsize = deckManager.current_deck.main.size();
int lx = 10;
int dy = 68;
if(mainsize > 10 * 7)
lx = 11;
if(mainsize > 11 * 7)
lx = 12;
if(mainsize > 60)
dy = 66;
int px;
int py = (y - 164) / dy;
hovered_pos = 1;
if(x >= 750)
px = lx - 1;
else
px = (x - 314) * (lx - 1) / (mainGame->scrPackCards->isVisible() ? 414.0f : 436.0f);
hovered_seq = py * lx + px + mainGame->scrPackCards->getPos() * lx;
if(hovered_seq >= mainsize) {
hovered_seq = -1;
hovered_code = 0;
} else {
hovered_code = deckManager.current_deck.main[hovered_seq]->first;
}
}
} else if(y >= 164 && y <= 435) {
int lx = 10, px, py = (y - 164) / 68; int lx = 10, px, py = (y - 164) / 68;
hovered_pos = 1; hovered_pos = 1;
if(deckManager.current_deck.main.size() > 40) if(deckManager.current_deck.main.size() > 40)
...@@ -1570,21 +1605,17 @@ void DeckBuilder::RefreshDeckList() { ...@@ -1570,21 +1605,17 @@ void DeckBuilder::RefreshDeckList() {
wchar_t catepath[256]; wchar_t catepath[256];
deckManager.GetCategoryPath(catepath, lstCategories->getSelected(), lstCategories->getListItem(lstCategories->getSelected())); deckManager.GetCategoryPath(catepath, lstCategories->getSelected(), lstCategories->getListItem(lstCategories->getSelected()));
lstDecks->clear(); lstDecks->clear();
FileSystem::TraversalDir(catepath, [lstDecks](const wchar_t* name, bool isdir) { mainGame->RefreshDeck(catepath, [lstDecks](const wchar_t* item) { lstDecks->addItem(item); });
if(!isdir && wcsrchr(name, '.') && !mywcsncasecmp(wcsrchr(name, '.'), L".ydk", 4)) {
size_t len = wcslen(name);
wchar_t deckname[256];
wcsncpy(deckname, name, len - 4);
deckname[len - 4] = 0;
lstDecks->addItem(deckname);
}
});
} }
void DeckBuilder::RefreshReadonly(int catesel) { void DeckBuilder::RefreshReadonly(int catesel) {
bool hasDeck = mainGame->cbDBDecks->getItemCount() != 0; bool hasDeck = mainGame->cbDBDecks->getItemCount() != 0;
readonly = catesel < 2; readonly = catesel < 2;
showing_pack = catesel == 0;
mainGame->btnSaveDeck->setEnabled(!readonly); mainGame->btnSaveDeck->setEnabled(!readonly);
mainGame->btnSaveDeckAs->setEnabled(!readonly); mainGame->btnSaveDeckAs->setEnabled(!readonly);
mainGame->btnClearDeck->setEnabled(!readonly);
mainGame->btnShuffleDeck->setEnabled(!readonly);
mainGame->btnSortDeck->setEnabled(!readonly);
mainGame->btnDeleteDeck->setEnabled(hasDeck && !readonly); mainGame->btnDeleteDeck->setEnabled(hasDeck && !readonly);
mainGame->btnRenameCategory->setEnabled(catesel > 3); mainGame->btnRenameCategory->setEnabled(catesel > 3);
mainGame->btnDeleteCategory->setEnabled(catesel > 3); mainGame->btnDeleteCategory->setEnabled(catesel > 3);
...@@ -1594,11 +1625,25 @@ void DeckBuilder::RefreshReadonly(int catesel) { ...@@ -1594,11 +1625,25 @@ void DeckBuilder::RefreshReadonly(int catesel) {
mainGame->btnMoveDeck->setEnabled(hasDeck && !readonly); mainGame->btnMoveDeck->setEnabled(hasDeck && !readonly);
mainGame->btnCopyDeck->setEnabled(hasDeck); mainGame->btnCopyDeck->setEnabled(hasDeck);
} }
void DeckBuilder::RefreshPackListScroll() {
if(showing_pack) {
mainGame->scrPackCards->setPos(0);
int mainsize = deckManager.current_deck.main.size();
if(mainsize <= 7 * 12) {
mainGame->scrPackCards->setVisible(false);
} else {
mainGame->scrPackCards->setVisible(true);
mainGame->scrPackCards->setMax((int)ceil(((float)mainsize - 7 * 12) / 12.0f));
}
} else {
mainGame->scrPackCards->setVisible(false);
}
}
void DeckBuilder::ChangeCategory(int catesel) { void DeckBuilder::ChangeCategory(int catesel) {
mainGame->RefreshDeck(mainGame->cbDBCategory, mainGame->cbDBDecks); mainGame->RefreshDeck(mainGame->cbDBCategory, mainGame->cbDBDecks);
mainGame->cbDBDecks->setSelected(0); mainGame->cbDBDecks->setSelected(0);
deckManager.LoadDeck(mainGame->cbDBCategory, mainGame->cbDBDecks);
RefreshReadonly(catesel); RefreshReadonly(catesel);
deckManager.LoadDeck(mainGame->cbDBCategory, mainGame->cbDBDecks);
is_modified = false; is_modified = false;
prev_category = catesel; prev_category = catesel;
prev_deck = 0; prev_deck = 0;
......
...@@ -24,6 +24,7 @@ public: ...@@ -24,6 +24,7 @@ public:
void RefreshDeckList(); void RefreshDeckList();
void RefreshReadonly(int catesel); void RefreshReadonly(int catesel);
void RefreshPackListScroll();
void ChangeCategory(int catesel); void ChangeCategory(int catesel);
void ShowDeckManage(); void ShowDeckManage();
void ShowBigCard(int code, float zoom); void ShowBigCard(int code, float zoom);
...@@ -77,11 +78,13 @@ public: ...@@ -77,11 +78,13 @@ public:
int prev_sel; int prev_sel;
bool is_modified; bool is_modified;
bool readonly; bool readonly;
bool showing_pack;
mt19937 rnd; mt19937 rnd;
const 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];
std::vector<std::wstring> expansionPacks;
}; };
} }
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
namespace ygo { namespace ygo {
char DeckManager::deckBuffer[0x10000];
DeckManager deckManager; DeckManager deckManager;
void DeckManager::LoadLFListSingle(const char* path) { void DeckManager::LoadLFListSingle(const char* path) {
...@@ -140,7 +141,7 @@ int DeckManager::CheckDeck(Deck& deck, int lfhash, int rule) { ...@@ -140,7 +141,7 @@ int DeckManager::CheckDeck(Deck& deck, int lfhash, int rule) {
} }
return 0; return 0;
} }
int DeckManager::LoadDeck(Deck& deck, int* dbuf, int mainc, int sidec) { int DeckManager::LoadDeck(Deck& deck, int* dbuf, int mainc, int sidec, bool is_packlist) {
deck.clear(); deck.clear();
int code; int code;
int errorcode = 0; int errorcode = 0;
...@@ -153,6 +154,10 @@ int DeckManager::LoadDeck(Deck& deck, int* dbuf, int mainc, int sidec) { ...@@ -153,6 +154,10 @@ int DeckManager::LoadDeck(Deck& deck, int* dbuf, int mainc, int sidec) {
} }
if(cd.type & TYPE_TOKEN) if(cd.type & TYPE_TOKEN)
continue; continue;
else if(is_packlist) {
deck.main.push_back(dataManager.GetCodePointer(code));
continue;
}
else if(cd.type & (TYPE_FUSION | TYPE_SYNCHRO | TYPE_XYZ | TYPE_LINK)) { else if(cd.type & (TYPE_FUSION | TYPE_SYNCHRO | TYPE_XYZ | TYPE_LINK)) {
if(deck.extra.size() >= 15) if(deck.extra.size() >= 15)
continue; continue;
...@@ -234,7 +239,11 @@ void DeckManager::GetDeckFile(wchar_t* ret, irr::gui::IGUIComboBox* cbCategory, ...@@ -234,7 +239,11 @@ void DeckManager::GetDeckFile(wchar_t* ret, irr::gui::IGUIComboBox* cbCategory,
bool DeckManager::LoadDeck(irr::gui::IGUIComboBox* cbCategory, irr::gui::IGUIComboBox* cbDeck) { bool DeckManager::LoadDeck(irr::gui::IGUIComboBox* cbCategory, irr::gui::IGUIComboBox* cbDeck) {
wchar_t filepath[256]; wchar_t filepath[256];
GetDeckFile(filepath, cbCategory, cbDeck); GetDeckFile(filepath, cbCategory, cbDeck);
return LoadDeck(filepath); bool is_packlist = cbCategory->getSelected() == 0;
bool res = LoadDeck(filepath, is_packlist);
if(res && mainGame->is_building)
mainGame->deckBuilder.RefreshPackListScroll();
return res;
} }
FILE* DeckManager::OpenDeckFile(const wchar_t* file, const char* mode) { FILE* DeckManager::OpenDeckFile(const wchar_t* file, const char* mode) {
#ifdef WIN32 #ifdef WIN32
...@@ -246,20 +255,47 @@ FILE* DeckManager::OpenDeckFile(const wchar_t* file, const char* mode) { ...@@ -246,20 +255,47 @@ FILE* DeckManager::OpenDeckFile(const wchar_t* file, const char* mode) {
#endif #endif
return fp; return fp;
} }
bool DeckManager::LoadDeck(const wchar_t* file) { IReadFile* DeckManager::OpenDeckReader(const wchar_t* file) {
int sp = 0, ct = 0, mainc = 0, sidec = 0, code; #ifdef WIN32
FILE* fp = OpenDeckFile(file, "r"); IReadFile* reader = dataManager.FileSystem->createAndOpenFile(file);
if(!fp) { #else
char file2[256];
BufferIO::EncodeUTF8(file, file2);
IReadFile* reader = dataManager.FileSystem->createAndOpenFile(file2);
#endif
return reader;
}
bool DeckManager::LoadDeck(const wchar_t* file, bool is_packlist) {
IReadFile* reader = OpenDeckReader(file);
if(!reader) {
wchar_t localfile[64]; wchar_t localfile[64];
myswprintf(localfile, L"./deck/%ls.ydk", file); myswprintf(localfile, L"./deck/%ls.ydk", file);
fp = OpenDeckFile(localfile, "r"); reader = OpenDeckReader(localfile);
} }
if(!fp) if(!reader && !mywcsncasecmp(file, L"./pack", 6)) {
wchar_t zipfile[64];
myswprintf(zipfile, L"%ls", file + 2);
reader = OpenDeckReader(zipfile);
}
if(!reader)
return false;
size_t size = reader->getSize();
if(size >= 0x20000) {
reader->drop();
return false; return false;
int cardlist[128]; }
memset(deckBuffer, 0, sizeof(deckBuffer));
reader->read(deckBuffer, size);
reader->drop();
std::istringstream deckStream(deckBuffer);
return LoadDeck(&deckStream, is_packlist);
}
bool DeckManager::LoadDeck(std::istringstream* deckStream, bool is_packlist) {
int sp = 0, ct = 0, mainc = 0, sidec = 0, code;
int cardlist[300];
bool is_side = false; bool is_side = false;
char linebuf[256]; std::string linebuf;
while(fgets(linebuf, 256, fp) && ct < 128) { while(std::getline(*deckStream, linebuf) && ct < 300) {
if(linebuf[0] == '!') { if(linebuf[0] == '!') {
is_side = true; is_side = true;
continue; continue;
...@@ -269,14 +305,13 @@ bool DeckManager::LoadDeck(const wchar_t* file) { ...@@ -269,14 +305,13 @@ bool DeckManager::LoadDeck(const wchar_t* file) {
sp = 0; sp = 0;
while(linebuf[sp] >= '0' && linebuf[sp] <= '9') sp++; while(linebuf[sp] >= '0' && linebuf[sp] <= '9') sp++;
linebuf[sp] = 0; linebuf[sp] = 0;
code = atoi(linebuf); code = std::stoi(linebuf);
cardlist[ct++] = code; cardlist[ct++] = code;
if(is_side) sidec++; if(is_side) sidec++;
else mainc++; else mainc++;
} }
fclose(fp); LoadDeck(current_deck, cardlist, mainc, sidec, is_packlist);
LoadDeck(current_deck, cardlist, mainc, sidec); return true; // the above LoadDeck has return value but we ignore it here for now
return true;
} }
bool DeckManager::SaveDeck(Deck& deck, const wchar_t* file) { bool DeckManager::SaveDeck(Deck& deck, const wchar_t* file) {
if(!FileSystem::IsDirExists(L"./deck") && !FileSystem::MakeDir(L"./deck")) if(!FileSystem::IsDirExists(L"./deck") && !FileSystem::MakeDir(L"./deck"))
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
#include "client_card.h" #include "client_card.h"
#include <unordered_map> #include <unordered_map>
#include <vector> #include <vector>
#include <sstream>
namespace ygo { namespace ygo {
...@@ -35,18 +36,22 @@ public: ...@@ -35,18 +36,22 @@ public:
Deck current_deck; Deck current_deck;
std::vector<LFList> _lfList; std::vector<LFList> _lfList;
static char deckBuffer[0x10000];
void LoadLFListSingle(const char* path); void LoadLFListSingle(const char* path);
void LoadLFList(); void LoadLFList();
const wchar_t* GetLFListName(int lfhash); const wchar_t* GetLFListName(int lfhash);
const std::unordered_map<int, int>* GetLFListContent(int lfhash); const std::unordered_map<int, int>* GetLFListContent(int lfhash);
int CheckDeck(Deck& deck, int lfhash, int rule); int CheckDeck(Deck& deck, int lfhash, int rule);
int LoadDeck(Deck& deck, int* dbuf, int mainc, int sidec); int LoadDeck(Deck& deck, int* dbuf, int mainc, int sidec, bool is_packlist = false);
bool LoadSide(Deck& deck, int* dbuf, int mainc, int sidec); bool LoadSide(Deck& deck, int* dbuf, int mainc, int sidec);
void GetCategoryPath(wchar_t* ret, int index, const wchar_t* text); void GetCategoryPath(wchar_t* ret, int index, const wchar_t* text);
void GetDeckFile(wchar_t* ret, irr::gui::IGUIComboBox* cbCategory, irr::gui::IGUIComboBox* cbDeck); void GetDeckFile(wchar_t* ret, irr::gui::IGUIComboBox* cbCategory, irr::gui::IGUIComboBox* cbDeck);
bool LoadDeck(irr::gui::IGUIComboBox* cbCategory, irr::gui::IGUIComboBox* cbDeck); bool LoadDeck(irr::gui::IGUIComboBox* cbCategory, irr::gui::IGUIComboBox* cbDeck);
FILE* OpenDeckFile(const wchar_t * file, const char * mode); FILE* OpenDeckFile(const wchar_t* file, const char* mode);
bool LoadDeck(const wchar_t* file); IReadFile* OpenDeckReader(const wchar_t* file);
bool LoadDeck(const wchar_t* file, bool is_packlist = false);
bool LoadDeck(std::istringstream* deckStream, bool is_packlist = false);
bool SaveDeck(Deck& deck, const wchar_t* file); bool SaveDeck(Deck& deck, const wchar_t* file);
bool DeleteDeck(const wchar_t* file); bool DeleteDeck(const wchar_t* file);
bool CreateCategory(const wchar_t* name); bool CreateCategory(const wchar_t* name);
......
...@@ -1136,26 +1136,40 @@ void Game::DrawThumb(code_pointer cp, position2di pos, const std::unordered_map< ...@@ -1136,26 +1136,40 @@ void Game::DrawThumb(code_pointer cp, position2di pos, const std::unordered_map<
void Game::DrawDeckBd() { void Game::DrawDeckBd() {
wchar_t textBuffer[64]; wchar_t textBuffer[64];
//main deck //main deck
int mainsize = deckManager.current_deck.main.size();
driver->draw2DRectangle(Resize(310, 137, 410, 157), 0x400000ff, 0x400000ff, 0x40000000, 0x40000000); driver->draw2DRectangle(Resize(310, 137, 410, 157), 0x400000ff, 0x400000ff, 0x40000000, 0x40000000);
driver->draw2DRectangleOutline(Resize(309, 136, 410, 157)); driver->draw2DRectangleOutline(Resize(309, 136, 410, 157));
DrawShadowText(textFont, dataManager.GetSysString(1330), Resize(315, 137, 410, 157), Resize(1, 1, 1, 1), 0xffffffff, 0xff000000, false, true); DrawShadowText(textFont, dataManager.GetSysString(deckBuilder.showing_pack ? 1477 : 1330), Resize(315, 137, 410, 157), Resize(1, 1, 1, 1), 0xffffffff, 0xff000000, false, true);
DrawShadowText(numFont, dataManager.numStrings[deckManager.current_deck.main.size()], Resize(380, 138, 440, 158), Resize(1, 1, 1, 1), 0xffffffff, 0xff000000, false, true); DrawShadowText(numFont, dataManager.numStrings[mainsize], Resize(380, 138, 440, 158), Resize(1, 1, 1, 1), 0xffffffff, 0xff000000, false, true);
driver->draw2DRectangle(Resize(310, 160, 797, 436), 0x400000ff, 0x400000ff, 0x40000000, 0x40000000); driver->draw2DRectangle(Resize(310, 160, 797, deckBuilder.showing_pack ? 630 : 436), 0x400000ff, 0x400000ff, 0x40000000, 0x40000000);
driver->draw2DRectangleOutline(Resize(309, 159, 797, 436)); driver->draw2DRectangleOutline(Resize(309, 159, 797, deckBuilder.showing_pack ? 630 : 436));
int lx; int lx;
int dy = 68;
float dx; float dx;
if(deckManager.current_deck.main.size() <= 40) { if(mainsize <= 40) {
dx = 436.0f / 9; dx = 436.0f / 9;
lx = 10; lx = 10;
} else if(deckBuilder.showing_pack) {
lx = 10;
if(mainsize > 10 * 7)
lx = 11;
if(mainsize > 11 * 7)
lx = 12;
dx = (mainGame->scrPackCards->isVisible() ? 414.0f : 436.0f) / (lx - 1);
if(mainsize > 60)
dy = 66;
} else { } else {
lx = (deckManager.current_deck.main.size() - 41) / 4 + 11; lx = (mainsize - 41) / 4 + 11;
dx = 436.0f / (lx - 1); dx = 436.0f / (lx - 1);
} }
for(size_t i = 0; i < deckManager.current_deck.main.size(); ++i) { int padding = scrPackCards->getPos() * lx;
DrawThumb(deckManager.current_deck.main[i], position2di(314 + (i % lx) * dx, 164 + (i / lx) * 68), deckBuilder.filterList); for(size_t i = 0; i < mainsize - padding && i < 7 * lx; ++i) {
if(deckBuilder.hovered_pos == 1 && deckBuilder.hovered_seq == (int)i) size_t j = i + padding;
driver->draw2DRectangleOutline(Resize(313 + (i % lx) * dx, 163 + (i / lx) * 68, 359 + (i % lx) * dx, 228 + (i / lx) * 68)); DrawThumb(deckManager.current_deck.main[j], position2di(314 + (i % lx) * dx, 164 + (i / lx) * dy), deckBuilder.filterList);
if(deckBuilder.hovered_pos == 1 && deckBuilder.hovered_seq == (int)j)
driver->draw2DRectangleOutline(Resize(313 + (i % lx) * dx, 163 + (i / lx) * dy, 359 + (i % lx) * dx, 228 + (i / lx) * dy));
} }
if(!deckBuilder.showing_pack) {
//extra deck //extra deck
driver->draw2DRectangle(Resize(310, 440, 410, 460), 0x400000ff, 0x400000ff, 0x40000000, 0x40000000); driver->draw2DRectangle(Resize(310, 440, 410, 460), 0x400000ff, 0x400000ff, 0x40000000, 0x40000000);
driver->draw2DRectangleOutline(Resize(309, 439, 410, 460)); driver->draw2DRectangleOutline(Resize(309, 439, 410, 460));
...@@ -1186,6 +1200,7 @@ void Game::DrawDeckBd() { ...@@ -1186,6 +1200,7 @@ void Game::DrawDeckBd() {
if(deckBuilder.hovered_pos == 3 && deckBuilder.hovered_seq == (int)i) if(deckBuilder.hovered_pos == 3 && deckBuilder.hovered_seq == (int)i)
driver->draw2DRectangleOutline(Resize(313 + i * dx, 563, 359 + i * dx, 629)); driver->draw2DRectangleOutline(Resize(313 + i * dx, 563, 359 + i * dx, 629));
} }
}
//search result //search result
driver->draw2DRectangle(Resize(805, 137, 926, 157), 0x400000ff, 0x400000ff, 0x40000000, 0x40000000); driver->draw2DRectangle(Resize(805, 137, 926, 157), 0x400000ff, 0x400000ff, 0x40000000, 0x40000000);
driver->draw2DRectangleOutline(Resize(804, 136, 926, 157)); driver->draw2DRectangleOutline(Resize(804, 136, 926, 157));
......
...@@ -34,7 +34,7 @@ mt19937 DuelClient::rnd; ...@@ -34,7 +34,7 @@ mt19937 DuelClient::rnd;
bool DuelClient::is_refreshing = false; bool DuelClient::is_refreshing = false;
int DuelClient::match_kill = 0; int DuelClient::match_kill = 0;
std::vector<HostPacket> DuelClient::hosts; std::vector<HostPacket> DuelClient::hosts;
std::set<unsigned int> DuelClient::remotes; std::set<std::pair<unsigned int, unsigned short>> DuelClient::remotes;
event* DuelClient::resp_event = 0; event* DuelClient::resp_event = 0;
bool DuelClient::StartClient(unsigned int ip, unsigned short port, bool create_game) { bool DuelClient::StartClient(unsigned int ip, unsigned short port, bool create_game) {
...@@ -391,6 +391,8 @@ void DuelClient::HandleSTOCPacketLan(char* data, unsigned int len) { ...@@ -391,6 +391,8 @@ void DuelClient::HandleSTOCPacketLan(char* data, unsigned int len) {
mainGame->deckBuilder.hovered_code = 0; mainGame->deckBuilder.hovered_code = 0;
mainGame->deckBuilder.is_draging = false; mainGame->deckBuilder.is_draging = false;
mainGame->deckBuilder.is_starting_dragging = false; mainGame->deckBuilder.is_starting_dragging = false;
mainGame->deckBuilder.readonly = false;
mainGame->deckBuilder.showing_pack = false;
mainGame->deckBuilder.pre_mainc = deckManager.current_deck.main.size(); mainGame->deckBuilder.pre_mainc = deckManager.current_deck.main.size();
mainGame->deckBuilder.pre_extrac = deckManager.current_deck.extra.size(); mainGame->deckBuilder.pre_extrac = deckManager.current_deck.extra.size();
mainGame->deckBuilder.pre_sidec = deckManager.current_deck.side.size(); mainGame->deckBuilder.pre_sidec = deckManager.current_deck.side.size();
...@@ -601,6 +603,11 @@ void DuelClient::HandleSTOCPacketLan(char* data, unsigned int len) { ...@@ -601,6 +603,11 @@ void DuelClient::HandleSTOCPacketLan(char* data, unsigned int len) {
mainGame->btnShuffle->setVisible(false); mainGame->btnShuffle->setVisible(false);
if(!mainGame->chkIgnore1->isChecked()) if(!mainGame->chkIgnore1->isChecked())
mainGame->wChat->setVisible(true); mainGame->wChat->setVisible(true);
if(mainGame->chkDefaultShowChain->isChecked()) {
mainGame->always_chain = true;
mainGame->ignore_chain = false;
mainGame->chain_when_avail = false;
}
mainGame->device->setEventReceiver(&mainGame->dField); mainGame->device->setEventReceiver(&mainGame->dField);
if(!mainGame->dInfo.isTag) { if(!mainGame->dInfo.isTag) {
if(selftype > 1) { if(selftype > 1) {
...@@ -872,7 +879,7 @@ int DuelClient::ClientAnalyze(char * msg, unsigned int len) { ...@@ -872,7 +879,7 @@ int DuelClient::ClientAnalyze(char * msg, unsigned int len) {
memcpy(last_successful_msg, msg, len); memcpy(last_successful_msg, msg, len);
last_successful_msg_length = len; last_successful_msg_length = len;
} }
mainGame->wCmdMenu->setVisible(false); mainGame->dField.HideMenu();
if(!mainGame->dInfo.isReplay && mainGame->dInfo.curMsg != MSG_WAITING && mainGame->dInfo.curMsg != MSG_CARD_SELECTED) { if(!mainGame->dInfo.isReplay && mainGame->dInfo.curMsg != MSG_WAITING && mainGame->dInfo.curMsg != MSG_CARD_SELECTED) {
mainGame->waitFrame = -1; mainGame->waitFrame = -1;
mainGame->stHintMsg->setVisible(false); mainGame->stHintMsg->setVisible(false);
...@@ -4031,11 +4038,16 @@ void DuelClient::BroadcastReply(evutil_socket_t fd, short events, void * arg) { ...@@ -4031,11 +4038,16 @@ void DuelClient::BroadcastReply(evutil_socket_t fd, short events, void * arg) {
socklen_t sz = sizeof(sockaddr_in); socklen_t sz = sizeof(sockaddr_in);
char buf[256]; char buf[256];
/*int ret = */recvfrom(fd, buf, 256, 0, (sockaddr*)&bc_addr, &sz); /*int ret = */recvfrom(fd, buf, 256, 0, (sockaddr*)&bc_addr, &sz);
unsigned int ipaddr = bc_addr.sin_addr.s_addr;
HostPacket* pHP = (HostPacket*)buf; HostPacket* pHP = (HostPacket*)buf;
if(!is_closing && pHP->identifier == NETWORK_SERVER_ID && pHP->version == PRO_VERSION && remotes.find(ipaddr) == remotes.end() ) { if(is_closing || pHP->identifier != NETWORK_SERVER_ID)
return;
if(pHP->version != PRO_VERSION)
return;
unsigned int ipaddr = bc_addr.sin_addr.s_addr;
const auto remote = std::make_pair(ipaddr, pHP->port);
if(remotes.find(remote) == remotes.end()) {
mainGame->gMutex.lock(); mainGame->gMutex.lock();
remotes.insert(ipaddr); remotes.insert(remote);
pHP->ipaddr = ipaddr; pHP->ipaddr = ipaddr;
hosts.push_back(*pHP); hosts.push_back(*pHP);
std::wstring hoststr; std::wstring hoststr;
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
#include "config.h" #include "config.h"
#include <vector> #include <vector>
#include <set> #include <set>
#include <utility>
#include <event2/event.h> #include <event2/event.h>
#include <event2/listener.h> #include <event2/listener.h>
#include <event2/bufferevent.h> #include <event2/bufferevent.h>
...@@ -76,7 +77,7 @@ protected: ...@@ -76,7 +77,7 @@ protected:
static bool is_refreshing; static bool is_refreshing;
static int match_kill; static int match_kill;
static event* resp_event; static event* resp_event;
static std::set<unsigned int> remotes; static std::set<std::pair<unsigned int, unsigned short>> remotes;
public: public:
static std::vector<HostPacket> hosts; static std::vector<HostPacket> hosts;
static void BeginRefreshHost(); static void BeginRefreshHost();
......
...@@ -363,7 +363,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) { ...@@ -363,7 +363,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
} }
case BUTTON_CMD_ACTIVATE: case BUTTON_CMD_ACTIVATE:
case BUTTON_CMD_RESET: { case BUTTON_CMD_RESET: {
mainGame->wCmdMenu->setVisible(false); HideMenu();
ShowCancelOrFinishButton(0); ShowCancelOrFinishButton(0);
if(!list_command) { if(!list_command) {
if(!menu_card) if(!menu_card)
...@@ -449,7 +449,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) { ...@@ -449,7 +449,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
break; break;
} }
case BUTTON_CMD_SUMMON: { case BUTTON_CMD_SUMMON: {
mainGame->wCmdMenu->setVisible(false); HideMenu();
if(!menu_card) if(!menu_card)
break; break;
for(size_t i = 0; i < summonable_cards.size(); ++i) { for(size_t i = 0; i < summonable_cards.size(); ++i) {
...@@ -463,7 +463,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) { ...@@ -463,7 +463,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
break; break;
} }
case BUTTON_CMD_SPSUMMON: { case BUTTON_CMD_SPSUMMON: {
mainGame->wCmdMenu->setVisible(false); HideMenu();
if(!list_command) { if(!list_command) {
if(!menu_card) if(!menu_card)
break; break;
...@@ -506,7 +506,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) { ...@@ -506,7 +506,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
break; break;
} }
case BUTTON_CMD_MSET: { case BUTTON_CMD_MSET: {
mainGame->wCmdMenu->setVisible(false); HideMenu();
if(!menu_card) if(!menu_card)
break; break;
for(size_t i = 0; i < msetable_cards.size(); ++i) { for(size_t i = 0; i < msetable_cards.size(); ++i) {
...@@ -519,7 +519,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) { ...@@ -519,7 +519,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
break; break;
} }
case BUTTON_CMD_SSET: { case BUTTON_CMD_SSET: {
mainGame->wCmdMenu->setVisible(false); HideMenu();
if(!menu_card) if(!menu_card)
break; break;
for(size_t i = 0; i < ssetable_cards.size(); ++i) { for(size_t i = 0; i < ssetable_cards.size(); ++i) {
...@@ -532,7 +532,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) { ...@@ -532,7 +532,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
break; break;
} }
case BUTTON_CMD_REPOS: { case BUTTON_CMD_REPOS: {
mainGame->wCmdMenu->setVisible(false); HideMenu();
if(!menu_card) if(!menu_card)
break; break;
for(size_t i = 0; i < reposable_cards.size(); ++i) { for(size_t i = 0; i < reposable_cards.size(); ++i) {
...@@ -545,7 +545,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) { ...@@ -545,7 +545,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
break; break;
} }
case BUTTON_CMD_ATTACK: { case BUTTON_CMD_ATTACK: {
mainGame->wCmdMenu->setVisible(false); HideMenu();
if(!menu_card) if(!menu_card)
break; break;
for(size_t i = 0; i < attackable_cards.size(); ++i) { for(size_t i = 0; i < attackable_cards.size(); ++i) {
...@@ -558,7 +558,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) { ...@@ -558,7 +558,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
break; break;
} }
case BUTTON_CMD_SHOWLIST: { case BUTTON_CMD_SHOWLIST: {
mainGame->wCmdMenu->setVisible(false); HideMenu();
selectable_cards.clear(); selectable_cards.clear();
wchar_t formatBuffer[2048]; wchar_t formatBuffer[2048];
switch(command_location) { switch(command_location) {
...@@ -1074,7 +1074,11 @@ bool ClientField::OnEvent(const irr::SEvent& event) { ...@@ -1074,7 +1074,11 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
UpdateChainButtons(); UpdateChainButtons();
} }
if(mainGame->wCmdMenu->isVisible() && !mainGame->wCmdMenu->getRelativePosition().isPointInside(mousepos)) if(mainGame->wCmdMenu->isVisible() && !mainGame->wCmdMenu->getRelativePosition().isPointInside(mousepos))
mainGame->wCmdMenu->setVisible(false); HideMenu();
if(mainGame->btnBP->isVisible() && mainGame->btnBP->getAbsolutePosition().isPointInside(mousepos))
break;
if(mainGame->btnM2->isVisible() && mainGame->btnM2->getAbsolutePosition().isPointInside(mousepos))
break;
if(panel && panel->isVisible()) if(panel && panel->isVisible())
break; break;
GetHoverField(x, y); GetHoverField(x, y);
...@@ -1480,7 +1484,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) { ...@@ -1480,7 +1484,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
UpdateChainButtons(); UpdateChainButtons();
} }
mainGame->HideElement(mainGame->wSurrender); mainGame->HideElement(mainGame->wSurrender);
mainGame->wCmdMenu->setVisible(false); HideMenu();
if(mainGame->fadingList.size()) if(mainGame->fadingList.size())
break; break;
CancelOrFinish(); CancelOrFinish();
...@@ -1563,7 +1567,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) { ...@@ -1563,7 +1567,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
} }
if(mcard) { if(mcard) {
if(mcard != menu_card) if(mcard != menu_card)
mainGame->wCmdMenu->setVisible(false); HideMenu();
if(hovered_location == LOCATION_HAND) { if(hovered_location == LOCATION_HAND) {
mcard->is_hovered = true; mcard->is_hovered = true;
MoveCard(mcard, 5); MoveCard(mcard, 5);
...@@ -2248,7 +2252,7 @@ void ClientField::GetHoverField(int x, int y) { ...@@ -2248,7 +2252,7 @@ void ClientField::GetHoverField(int x, int y) {
} }
void ClientField::ShowMenu(int flag, int x, int y) { void ClientField::ShowMenu(int flag, int x, int y) {
if(!flag) { if(!flag) {
mainGame->wCmdMenu->setVisible(false); HideMenu();
return; return;
} }
menu_card = clicked_card; menu_card = clicked_card;
...@@ -2316,11 +2320,20 @@ void ClientField::ShowMenu(int flag, int x, int y) { ...@@ -2316,11 +2320,20 @@ void ClientField::ShowMenu(int flag, int x, int y) {
} else mainGame->btnReset->setVisible(false); } else mainGame->btnReset->setVisible(false);
panel = mainGame->wCmdMenu; panel = mainGame->wCmdMenu;
mainGame->wCmdMenu->setVisible(true); mainGame->wCmdMenu->setVisible(true);
mainGame->btnBP->setEnabled(false);
mainGame->btnM2->setEnabled(false);
mainGame->btnEP->setEnabled(false);
if(mainGame->gameConf.resize_popup_menu) if(mainGame->gameConf.resize_popup_menu)
mainGame->wCmdMenu->setRelativePosition(mainGame->Resize(x - 20, y - 20, x + 80, y - 20, 0, -height, 0, 0)); mainGame->wCmdMenu->setRelativePosition(mainGame->Resize(x - 20, y - 20, x + 80, y - 20, 0, -height, 0, 0));
else else
mainGame->wCmdMenu->setRelativePosition(mainGame->Resize(x, y, x, y, -20, -(20 + height), 80, -20)); mainGame->wCmdMenu->setRelativePosition(mainGame->Resize(x, y, x, y, -20, -(20 + height), 80, -20));
} }
void ClientField::HideMenu() {
mainGame->wCmdMenu->setVisible(false);
mainGame->btnBP->setEnabled(true);
mainGame->btnM2->setEnabled(true);
mainGame->btnEP->setEnabled(true);
}
void ClientField::UpdateChainButtons() { void ClientField::UpdateChainButtons() {
if(mainGame->btnChainAlways->isVisible()) { if(mainGame->btnChainAlways->isVisible()) {
mainGame->btnChainIgnore->setPressed(mainGame->ignore_chain); mainGame->btnChainIgnore->setPressed(mainGame->ignore_chain);
......
...@@ -368,6 +368,9 @@ bool Game::Initialize() { ...@@ -368,6 +368,9 @@ bool Game::Initialize() {
chkWaitChain = env->addCheckBox(false, rect<s32>(posX, posY, posX + 260, posY + 25), tabHelper, -1, dataManager.GetSysString(1277)); chkWaitChain = env->addCheckBox(false, rect<s32>(posX, posY, posX + 260, posY + 25), tabHelper, -1, dataManager.GetSysString(1277));
chkWaitChain->setChecked(gameConf.chkWaitChain != 0); chkWaitChain->setChecked(gameConf.chkWaitChain != 0);
posY += 30; posY += 30;
chkDefaultShowChain = env->addCheckBox(false, rect<s32>(posX, posY, posX + 260, posY + 25), tabHelper, -1, dataManager.GetSysString(1354));
chkDefaultShowChain->setChecked(gameConf.chkDefaultShowChain != 0);
posY += 30;
chkQuickAnimation = env->addCheckBox(false, rect<s32>(posX, posY, posX + 260, posY + 25), tabHelper, CHECKBOX_QUICK_ANIMATION, dataManager.GetSysString(1299)); chkQuickAnimation = env->addCheckBox(false, rect<s32>(posX, posY, posX + 260, posY + 25), tabHelper, CHECKBOX_QUICK_ANIMATION, dataManager.GetSysString(1299));
chkQuickAnimation->setChecked(gameConf.quick_animation != 0); chkQuickAnimation->setChecked(gameConf.quick_animation != 0);
posY += 30; posY += 30;
...@@ -644,6 +647,10 @@ bool Game::Initialize() { ...@@ -644,6 +647,10 @@ bool Game::Initialize() {
cbDMCategory->setMaxSelectionRows(10); cbDMCategory->setMaxSelectionRows(10);
btnDMOK = env->addButton(rect<s32>(70, 80, 140, 105), wDMQuery, BUTTON_DM_OK, dataManager.GetSysString(1211)); btnDMOK = env->addButton(rect<s32>(70, 80, 140, 105), wDMQuery, BUTTON_DM_OK, dataManager.GetSysString(1211));
btnDMCancel = env->addButton(rect<s32>(170, 80, 240, 105), wDMQuery, BUTTON_DM_CANCEL, dataManager.GetSysString(1212)); btnDMCancel = env->addButton(rect<s32>(170, 80, 240, 105), wDMQuery, BUTTON_DM_CANCEL, dataManager.GetSysString(1212));
scrPackCards = env->addScrollBar(false, recti(775, 161, 795, 629), 0, SCROLL_FILTER);
scrPackCards->setLargeStep(1);
scrPackCards->setSmallStep(1);
scrPackCards->setVisible(false);
stDBCategory = env->addStaticText(dataManager.GetSysString(1300), rect<s32>(10, 9, 100, 29), false, false, wDeckEdit); stDBCategory = env->addStaticText(dataManager.GetSysString(1300), rect<s32>(10, 9, 100, 29), false, false, wDeckEdit);
cbDBCategory = env->addComboBox(rect<s32>(80, 5, 220, 30), wDeckEdit, COMBOBOX_DBCATEGORY); cbDBCategory = env->addComboBox(rect<s32>(80, 5, 220, 30), wDeckEdit, COMBOBOX_DBCATEGORY);
...@@ -1137,6 +1144,9 @@ void Game::LoadExpansions() { ...@@ -1137,6 +1144,9 @@ void Game::LoadExpansions() {
#endif #endif
dataManager.LoadStrings(reader); dataManager.LoadStrings(reader);
} }
if(wcsrchr(fname, '.') && !mywcsncasecmp(wcsrchr(fname, '.'), L".ydk", 4)) {
deckBuilder.expansionPacks.push_back(fname);
}
} }
} }
} }
...@@ -1171,19 +1181,29 @@ void Game::RefreshCategoryDeck(irr::gui::IGUIComboBox* cbCategory, irr::gui::IGU ...@@ -1171,19 +1181,29 @@ void Game::RefreshCategoryDeck(irr::gui::IGUIComboBox* cbCategory, irr::gui::IGU
} }
} }
void Game::RefreshDeck(irr::gui::IGUIComboBox* cbCategory, irr::gui::IGUIComboBox* cbDeck) { void Game::RefreshDeck(irr::gui::IGUIComboBox* cbCategory, irr::gui::IGUIComboBox* cbDeck) {
if(cbCategory != cbDBCategory && cbCategory->getSelected() == 0) {
// can't use pack list in duel
cbDeck->clear();
return;
}
wchar_t catepath[256]; wchar_t catepath[256];
deckManager.GetCategoryPath(catepath, cbCategory->getSelected(), cbCategory->getText()); deckManager.GetCategoryPath(catepath, cbCategory->getSelected(), cbCategory->getText());
RefreshDeck(catepath, cbDeck);
}
void Game::RefreshDeck(const wchar_t* deckpath, irr::gui::IGUIComboBox* cbDeck) {
cbDeck->clear(); cbDeck->clear();
FileSystem::TraversalDir(deckpath, [cbDeck](const wchar_t* name, bool isdir) { RefreshDeck(catepath, [cbDeck](const wchar_t* item) { cbDeck->addItem(item); });
}
void Game::RefreshDeck(const wchar_t* deckpath, const std::function<void(const wchar_t*)>& additem) {
if(!mywcsncasecmp(deckpath, L"./pack", 6)) {
for(auto pack : deckBuilder.expansionPacks) {
additem(pack.substr(5, pack.size() - 9).c_str());
}
}
FileSystem::TraversalDir(deckpath, [additem](const wchar_t* name, bool isdir) {
if(!isdir && wcsrchr(name, '.') && !mywcsncasecmp(wcsrchr(name, '.'), L".ydk", 4)) { if(!isdir && wcsrchr(name, '.') && !mywcsncasecmp(wcsrchr(name, '.'), L".ydk", 4)) {
size_t len = wcslen(name); size_t len = wcslen(name);
wchar_t deckname[256]; wchar_t deckname[256];
wcsncpy(deckname, name, len - 4); wcsncpy(deckname, name, len - 4);
deckname[len - 4] = 0; deckname[len - 4] = 0;
cbDeck->addItem(deckname); additem(deckname);
} }
}); });
} }
...@@ -1281,6 +1301,7 @@ void Game::LoadConfig() { ...@@ -1281,6 +1301,7 @@ void Game::LoadConfig() {
gameConf.chkRandomPos = 0; gameConf.chkRandomPos = 0;
gameConf.chkAutoChain = 0; gameConf.chkAutoChain = 0;
gameConf.chkWaitChain = 0; gameConf.chkWaitChain = 0;
gameConf.chkDefaultShowChain = 0;
gameConf.chkIgnore1 = 0; gameConf.chkIgnore1 = 0;
gameConf.chkIgnore2 = 0; gameConf.chkIgnore2 = 0;
gameConf.use_lflist = 1; gameConf.use_lflist = 1;
...@@ -1349,6 +1370,8 @@ void Game::LoadConfig() { ...@@ -1349,6 +1370,8 @@ void Game::LoadConfig() {
gameConf.chkAutoChain = atoi(valbuf); gameConf.chkAutoChain = atoi(valbuf);
} else if(!strcmp(strbuf, "waitchain")) { } else if(!strcmp(strbuf, "waitchain")) {
gameConf.chkWaitChain = atoi(valbuf); gameConf.chkWaitChain = atoi(valbuf);
} else if(!strcmp(strbuf, "showchain")) {
gameConf.chkDefaultShowChain = atoi(valbuf);
} else if(!strcmp(strbuf, "mute_opponent")) { } else if(!strcmp(strbuf, "mute_opponent")) {
gameConf.chkIgnore1 = atoi(valbuf); gameConf.chkIgnore1 = atoi(valbuf);
} else if(!strcmp(strbuf, "mute_spectators")) { } else if(!strcmp(strbuf, "mute_spectators")) {
...@@ -1464,6 +1487,7 @@ void Game::SaveConfig() { ...@@ -1464,6 +1487,7 @@ void Game::SaveConfig() {
fprintf(fp, "randompos = %d\n", (chkRandomPos->isChecked() ? 1 : 0)); fprintf(fp, "randompos = %d\n", (chkRandomPos->isChecked() ? 1 : 0));
fprintf(fp, "autochain = %d\n", (chkAutoChain->isChecked() ? 1 : 0)); fprintf(fp, "autochain = %d\n", (chkAutoChain->isChecked() ? 1 : 0));
fprintf(fp, "waitchain = %d\n", (chkWaitChain->isChecked() ? 1 : 0)); fprintf(fp, "waitchain = %d\n", (chkWaitChain->isChecked() ? 1 : 0));
fprintf(fp, "showchain = %d\n", (chkDefaultShowChain->isChecked() ? 1 : 0));
fprintf(fp, "mute_opponent = %d\n", (chkIgnore1->isChecked() ? 1 : 0)); fprintf(fp, "mute_opponent = %d\n", (chkIgnore1->isChecked() ? 1 : 0));
fprintf(fp, "mute_spectators = %d\n", (chkIgnore2->isChecked() ? 1 : 0)); fprintf(fp, "mute_spectators = %d\n", (chkIgnore2->isChecked() ? 1 : 0));
fprintf(fp, "use_lflist = %d\n", gameConf.use_lflist); fprintf(fp, "use_lflist = %d\n", gameConf.use_lflist);
...@@ -1795,6 +1819,7 @@ void Game::OnResize() { ...@@ -1795,6 +1819,7 @@ void Game::OnResize() {
cbDBCategory->setRelativePosition(Resize(80, 5, 220, 30)); cbDBCategory->setRelativePosition(Resize(80, 5, 220, 30));
btnManageDeck->setRelativePosition(Resize(225, 5, 290, 30)); btnManageDeck->setRelativePosition(Resize(225, 5, 290, 30));
wDeckManage->setRelativePosition(ResizeWin(310, 135, 800, 465)); wDeckManage->setRelativePosition(ResizeWin(310, 135, 800, 465));
scrPackCards->setRelativePosition(Resize(775, 161, 795, 629));
wSort->setRelativePosition(Resize(930, 132, 1020, 156)); wSort->setRelativePosition(Resize(930, 132, 1020, 156));
cbSortType->setRelativePosition(Resize(10, 2, 85, 22)); cbSortType->setRelativePosition(Resize(10, 2, 85, 22));
......
...@@ -33,6 +33,7 @@ struct Config { ...@@ -33,6 +33,7 @@ struct Config {
int chkRandomPos; int chkRandomPos;
int chkAutoChain; int chkAutoChain;
int chkWaitChain; int chkWaitChain;
int chkDefaultShowChain;
int chkIgnore1; int chkIgnore1;
int chkIgnore2; int chkIgnore2;
int use_lflist; int use_lflist;
...@@ -123,7 +124,7 @@ public: ...@@ -123,7 +124,7 @@ public:
void LoadExpansions(); void LoadExpansions();
void RefreshCategoryDeck(irr::gui::IGUIComboBox* cbCategory, irr::gui::IGUIComboBox* cbDeck, bool selectlastused = true); void RefreshCategoryDeck(irr::gui::IGUIComboBox* cbCategory, irr::gui::IGUIComboBox* cbDeck, bool selectlastused = true);
void RefreshDeck(irr::gui::IGUIComboBox* cbCategory, irr::gui::IGUIComboBox* cbDeck); void RefreshDeck(irr::gui::IGUIComboBox* cbCategory, irr::gui::IGUIComboBox* cbDeck);
void RefreshDeck(const wchar_t* deckpath, irr::gui::IGUIComboBox* cbDeck); void RefreshDeck(const wchar_t* deckpath, const std::function<void(const wchar_t*)>& additem);
void RefreshReplay(); void RefreshReplay();
void RefreshSingleplay(); void RefreshSingleplay();
void RefreshBot(); void RefreshBot();
...@@ -290,6 +291,7 @@ public: ...@@ -290,6 +291,7 @@ public:
irr::gui::IGUICheckBox* chkRandomPos; irr::gui::IGUICheckBox* chkRandomPos;
irr::gui::IGUICheckBox* chkAutoChain; irr::gui::IGUICheckBox* chkAutoChain;
irr::gui::IGUICheckBox* chkWaitChain; irr::gui::IGUICheckBox* chkWaitChain;
irr::gui::IGUICheckBox* chkDefaultShowChain;
irr::gui::IGUICheckBox* chkQuickAnimation; irr::gui::IGUICheckBox* chkQuickAnimation;
irr::gui::IGUICheckBox* chkAutoSaveReplay; irr::gui::IGUICheckBox* chkAutoSaveReplay;
irr::gui::IGUICheckBox* chkDrawSingleChain; irr::gui::IGUICheckBox* chkDrawSingleChain;
...@@ -525,6 +527,7 @@ public: ...@@ -525,6 +527,7 @@ public:
irr::gui::IGUIComboBox* cbDMCategory; irr::gui::IGUIComboBox* cbDMCategory;
irr::gui::IGUIButton* btnDMOK; irr::gui::IGUIButton* btnDMOK;
irr::gui::IGUIButton* btnDMCancel; irr::gui::IGUIButton* btnDMCancel;
irr::gui::IGUIScrollBar* scrPackCards;
//filter //filter
irr::gui::IGUIStaticText* wFilter; irr::gui::IGUIStaticText* wFilter;
irr::gui::IGUIScrollBar* scrFilter; irr::gui::IGUIScrollBar* scrFilter;
......
...@@ -42,6 +42,7 @@ bool NetServer::StartBroadcast() { ...@@ -42,6 +42,7 @@ bool NetServer::StartBroadcast() {
SOCKET udp = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); SOCKET udp = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
BOOL opt = TRUE; BOOL opt = TRUE;
setsockopt(udp, SOL_SOCKET, SO_BROADCAST, (const char*)&opt, sizeof(BOOL)); setsockopt(udp, SOL_SOCKET, SO_BROADCAST, (const char*)&opt, sizeof(BOOL));
setsockopt(udp, SOL_SOCKET, SO_REUSEADDR, (const char*)&opt, sizeof(BOOL));
sockaddr_in addr; sockaddr_in addr;
memset(&addr, 0, sizeof(addr)); memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET; addr.sin_family = AF_INET;
......
...@@ -401,6 +401,7 @@ ...@@ -401,6 +401,7 @@
!system 1351 投降 !system 1351 投降
!system 1352 主要信息: !system 1352 主要信息:
!system 1353 播放起始于回合: !system 1353 播放起始于回合:
!system 1354 开局默认显示所有时点
!system 1356 此操作将放弃对当前卡组的修改,是否继续? !system 1356 此操作将放弃对当前卡组的修改,是否继续?
!system 1357 不提示保留对卡组的修改 !system 1357 不提示保留对卡组的修改
!system 1358 键入关键字后自动进行搜索 !system 1358 键入关键字后自动进行搜索
...@@ -487,6 +488,7 @@ ...@@ -487,6 +488,7 @@
!system 1474 已存在同名分类 !system 1474 已存在同名分类
!system 1475 已存在同名卡组 !system 1475 已存在同名卡组
!system 1476 删除失败 !system 1476 删除失败
!system 1477 卡片数:
!system 1481 OCG !system 1481 OCG
!system 1482 TCG !system 1482 TCG
!system 1483 简体中文 !system 1483 简体中文
......
...@@ -18,6 +18,7 @@ autospellpos = 0 ...@@ -18,6 +18,7 @@ autospellpos = 0
randompos = 0 randompos = 0
autochain = 0 autochain = 0
waitchain = 0 waitchain = 0
showchain = 0
mute_opponent = 0 mute_opponent = 0
mute_spectators = 0 mute_spectators = 0
use_lflist = 1 use_lflist = 1
......
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