Commit 34e9abd9 authored by fallenstardust's avatar fallenstardust

update gframe

parent 8a717caf
...@@ -27,6 +27,7 @@ ClientField::ClientField() { ...@@ -27,6 +27,7 @@ ClientField::ClientField() {
hovered_card = 0; hovered_card = 0;
clicked_card = 0; clicked_card = 0;
highlighting_card = 0; highlighting_card = 0;
menu_card = 0;
hovered_controler = 0; hovered_controler = 0;
hovered_location = 0; hovered_location = 0;
hovered_sequence = 0; hovered_sequence = 0;
...@@ -41,6 +42,7 @@ ClientField::ClientField() { ...@@ -41,6 +42,7 @@ ClientField::ClientField() {
conti_act = false; conti_act = false;
deck_reversed = false; deck_reversed = false;
conti_selecting = false; conti_selecting = false;
cant_check_grave = false;
for(int p = 0; p < 2; ++p) { for(int p = 0; p < 2; ++p) {
mzone[p].resize(7, 0); mzone[p].resize(7, 0);
szone[p].resize(8, 0); szone[p].resize(8, 0);
...@@ -94,6 +96,7 @@ void ClientField::Clear() { ...@@ -94,6 +96,7 @@ void ClientField::Clear() {
hovered_card = 0; hovered_card = 0;
clicked_card = 0; clicked_card = 0;
highlighting_card = 0; highlighting_card = 0;
menu_card = 0;
hovered_controler = 0; hovered_controler = 0;
hovered_location = 0; hovered_location = 0;
hovered_sequence = 0; hovered_sequence = 0;
...@@ -105,7 +108,7 @@ void ClientField::Clear() { ...@@ -105,7 +108,7 @@ void ClientField::Clear() {
pzone_act[1] = false; pzone_act[1] = false;
conti_act = false; conti_act = false;
deck_reversed = false; deck_reversed = false;
RefreshCardCountDisplay(); cant_check_grave = false;
} }
void ClientField::Initial(int player, int deckc, int extrac) { void ClientField::Initial(int player, int deckc, int extrac) {
ClientCard* pcard; ClientCard* pcard;
...@@ -402,6 +405,18 @@ void ClientField::ClearChainSelect() { ...@@ -402,6 +405,18 @@ void ClientField::ClearChainSelect() {
} }
// needs to be synchronized with EGET_SCROLL_BAR_CHANGED // needs to be synchronized with EGET_SCROLL_BAR_CHANGED
void ClientField::ShowSelectCard(bool buttonok, bool chain) { void ClientField::ShowSelectCard(bool buttonok, bool chain) {
if(cant_check_grave) {
bool has_card_in_grave = false;
for(size_t i = 0; i < selectable_cards.size(); ++i) {
if(selectable_cards[i]->location == LOCATION_GRAVE) {
has_card_in_grave = true;
break;
}
}
if(has_card_in_grave) {
std::random_shuffle(selectable_cards.begin(), selectable_cards.end());
}
}
int startpos; int startpos;
size_t ct; size_t ct;
if(selectable_cards.size() <= 5) { if(selectable_cards.size() <= 5) {
...@@ -428,6 +443,8 @@ void ClientField::ShowSelectCard(bool buttonok, bool chain) { ...@@ -428,6 +443,8 @@ void ClientField::ShowSelectCard(bool buttonok, bool chain) {
wchar_t formatBuffer[2048]; wchar_t formatBuffer[2048];
if(conti_selecting) if(conti_selecting)
myswprintf(formatBuffer, L"%ls", DataManager::unknown_string); myswprintf(formatBuffer, L"%ls", DataManager::unknown_string);
else if(cant_check_grave && selectable_cards[i]->location == LOCATION_GRAVE)
myswprintf(formatBuffer, L"%ls", dataManager.FormatLocation(selectable_cards[i]->location, 0));
else if(selectable_cards[i]->location == LOCATION_OVERLAY) else if(selectable_cards[i]->location == LOCATION_OVERLAY)
myswprintf(formatBuffer, L"%ls[%d](%d)", myswprintf(formatBuffer, L"%ls[%d](%d)",
dataManager.FormatLocation(selectable_cards[i]->overlayTarget->location, selectable_cards[i]->overlayTarget->sequence), dataManager.FormatLocation(selectable_cards[i]->overlayTarget->location, selectable_cards[i]->overlayTarget->sequence),
...@@ -440,26 +457,27 @@ void ClientField::ShowSelectCard(bool buttonok, bool chain) { ...@@ -440,26 +457,27 @@ void ClientField::ShowSelectCard(bool buttonok, bool chain) {
if (selectable_cards[i]->is_selected) if (selectable_cards[i]->is_selected)
mainGame->stCardPos[i]->setBackgroundColor(0xffa2d8f4); mainGame->stCardPos[i]->setBackgroundColor(0xffa2d8f4);
else { else {
if(conti_selecting) if(conti_selecting)
mainGame->stCardPos[i]->setBackgroundColor(0xff56649f);
else if(selectable_cards[i]->location == LOCATION_OVERLAY) {
if(selectable_cards[i]->owner != selectable_cards[i]->overlayTarget->controler)
mainGame->stCardPos[i]->setOverrideColor(0xff0000ff);
if(selectable_cards[i]->overlayTarget->controler)
mainGame->stCardPos[i]->setBackgroundColor(0xff5a5a5a);
else mainGame->stCardPos[i]->setBackgroundColor(0xff56649f);
} else if(selectable_cards[i]->location == LOCATION_DECK || selectable_cards[i]->location == LOCATION_EXTRA || selectable_cards[i]->location == LOCATION_REMOVED) {
if(selectable_cards[i]->position & POS_FACEDOWN)
mainGame->stCardPos[i]->setOverrideColor(0xff0000ff);
if(selectable_cards[i]->controler)
mainGame->stCardPos[i]->setBackgroundColor(0xff5a5a5a);
else
mainGame->stCardPos[i]->setBackgroundColor(0xff56649f); mainGame->stCardPos[i]->setBackgroundColor(0xff56649f);
} else { else if(selectable_cards[i]->location == LOCATION_OVERLAY) {
if(selectable_cards[i]->controler) if(selectable_cards[i]->owner != selectable_cards[i]->overlayTarget->controler)
mainGame->stCardPos[i]->setBackgroundColor(0xff5a5a5a); mainGame->stCardPos[i]->setOverrideColor(0xff0000ff);
else if(selectable_cards[i]->overlayTarget->controler)
mainGame->stCardPos[i]->setBackgroundColor(0xff5a5a5a);
else
mainGame->stCardPos[i]->setBackgroundColor(0xff56649f); mainGame->stCardPos[i]->setBackgroundColor(0xff56649f);
} else if(selectable_cards[i]->location == LOCATION_DECK || selectable_cards[i]->location == LOCATION_EXTRA || selectable_cards[i]->location == LOCATION_REMOVED) {
if(selectable_cards[i]->position & POS_FACEDOWN)
mainGame->stCardPos[i]->setOverrideColor(0xff0000ff);
if(selectable_cards[i]->controler)
mainGame->stCardPos[i]->setBackgroundColor(0xff5a5a5a);
else
mainGame->stCardPos[i]->setBackgroundColor(0xff56649f);
} else {
if(selectable_cards[i]->controler)
mainGame->stCardPos[i]->setBackgroundColor(0xff5a5a5a);
else
mainGame->stCardPos[i]->setBackgroundColor(0xff56649f);
} }
} }
} else { } else {
...@@ -467,7 +485,8 @@ void ClientField::ShowSelectCard(bool buttonok, bool chain) { ...@@ -467,7 +485,8 @@ void ClientField::ShowSelectCard(bool buttonok, bool chain) {
wchar_t formatBuffer[2048]; wchar_t formatBuffer[2048];
myswprintf(formatBuffer, L"%d", sort_list[i]); myswprintf(formatBuffer, L"%d", sort_list[i]);
mainGame->stCardPos[i]->setText(formatBuffer); mainGame->stCardPos[i]->setText(formatBuffer);
} else mainGame->stCardPos[i]->setText(L""); } else
mainGame->stCardPos[i]->setText(L"");
mainGame->stCardPos[i]->setBackgroundColor(0xff56649f); mainGame->stCardPos[i]->setBackgroundColor(0xff56649f);
} }
mainGame->stCardPos[i]->setVisible(true); mainGame->stCardPos[i]->setVisible(true);
...@@ -648,12 +667,12 @@ void ClientField::ShowSelectOption(int select_hint) { ...@@ -648,12 +667,12 @@ void ClientField::ShowSelectOption(int select_hint) {
mainGame->wOptions->setRelativePosition(pos); mainGame->wOptions->setRelativePosition(pos);
mainGame->bgOptions->setRelativePosition(rect<s32>(0, 0, (scrollbar ? 405 : 390) * mainGame->xScale, pos.LowerRightCorner.Y - pos.UpperLeftCorner.Y)); mainGame->bgOptions->setRelativePosition(rect<s32>(0, 0, (scrollbar ? 405 : 390) * mainGame->xScale, pos.LowerRightCorner.Y - pos.UpperLeftCorner.Y));
} else { } else {
mainGame->SetStaticText(mainGame->stOptions, 350 * mainGame->xScale, mainGame->guiFont,(wchar_t*)dataManager.GetDesc(select_options[0])); mainGame->SetStaticText(mainGame->stOptions, 350 * mainGame->xScale, mainGame->guiFont,
(wchar_t*)dataManager.GetDesc(select_options[0]));
mainGame->stOptions->setVisible(true); mainGame->stOptions->setVisible(true);
mainGame->btnOptionp->setVisible(false); mainGame->btnOptionp->setVisible(false);
mainGame->btnOptionn->setVisible(count > 1); mainGame->btnOptionn->setVisible(count > 1);
mainGame->btnOptionOK->setVisible(true); mainGame->btnOptionOK->setVisible(true);
mainGame->scrOption->setVisible(false);
for(int i = 0; i < 5; i++) for(int i = 0; i < 5; i++)
mainGame->btnOption[i]->setVisible(false); mainGame->btnOption[i]->setVisible(false);
recti pos = mainGame->wOptions->getRelativePosition(); recti pos = mainGame->wOptions->getRelativePosition();
......
...@@ -46,6 +46,7 @@ public: ...@@ -46,6 +46,7 @@ public:
std::vector<ClientCard*> conti_cards; std::vector<ClientCard*> conti_cards;
std::vector<std::pair<int,int>> activatable_descs; std::vector<std::pair<int,int>> activatable_descs;
std::vector<int> select_options; std::vector<int> select_options;
std::vector<int> select_options_index;
std::vector<ChainInfo> chains; std::vector<ChainInfo> chains;
int extra_p_count[2]; int extra_p_count[2];
...@@ -85,6 +86,7 @@ public: ...@@ -85,6 +86,7 @@ public:
bool last_chain; bool last_chain;
bool deck_reversed; bool deck_reversed;
bool conti_selecting; bool conti_selecting;
bool cant_check_grave;
ClientField(); ClientField();
void Clear(); void Clear();
...@@ -145,6 +147,7 @@ public: ...@@ -145,6 +147,7 @@ public:
ClientCard* clicked_card; ClientCard* clicked_card;
ClientCard* command_card; ClientCard* command_card;
ClientCard* highlighting_card; ClientCard* highlighting_card;
ClientCard* menu_card;
int list_command; int list_command;
virtual bool OnEvent(const irr::SEvent& event); virtual bool OnEvent(const irr::SEvent& event);
...@@ -165,5 +168,6 @@ public: ...@@ -165,5 +168,6 @@ public:
//special cards //special cards
#define CARD_MARINE_DOLPHIN 78734254 #define CARD_MARINE_DOLPHIN 78734254
#define CARD_TWINKLE_MOSS 13857930 #define CARD_TWINKLE_MOSS 13857930
#define CARD_QUESTION 38723936
#endif //CLIENT_FIELD_H #endif //CLIENT_FIELD_H
...@@ -59,69 +59,10 @@ static bool check_set_code(const CardDataC& data, int set_code) { ...@@ -59,69 +59,10 @@ static bool check_set_code(const CardDataC& data, int set_code) {
return res; return res;
} }
inline bool havePopupWindow() { static inline bool havePopupWindow() {
return mainGame->wQuery->isVisible() || mainGame->wCategories->isVisible() || mainGame->wLinkMarks->isVisible() || mainGame->wDeckManage->isVisible() || mainGame->wDMQuery->isVisible(); return mainGame->wQuery->isVisible() || mainGame->wCategories->isVisible() || mainGame->wLinkMarks->isVisible() || mainGame->wDeckManage->isVisible() || mainGame->wDMQuery->isVisible();
} }
inline void refreshDeckList() {
irr::gui::IGUIListBox* lstCategories = mainGame->lstCategories;
irr::gui::IGUIListBox* lstDecks = mainGame->lstDecks;
wchar_t catepath[256];
deckManager.GetCategoryPath(catepath, lstCategories->getSelected(), lstCategories->getListItem(lstCategories->getSelected()));
lstDecks->clear();
FileSystem::TraversalDir(catepath, [lstDecks](const wchar_t* name, bool isdir) {
if(!isdir && wcsrchr(name, '.') && !wcsncasecmp(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);
}
});
}
inline void refreshReadonly(int catesel) {
bool hasDeck = mainGame->lstDecks->getItemCount() != 0;
mainGame->deckBuilder.readonly = catesel < 2;
mainGame->btnSaveDeck->setEnabled(!mainGame->deckBuilder.readonly);
mainGame->btnDeleteDeck->setEnabled(hasDeck && !mainGame->deckBuilder.readonly);
mainGame->btnRenameCategory->setEnabled(catesel > 3);
mainGame->btnDeleteCategory->setEnabled(catesel > 3);
mainGame->btnNewDeck->setEnabled(!mainGame->deckBuilder.readonly);
mainGame->btnRenameDeck->setEnabled(hasDeck && !mainGame->deckBuilder.readonly);
mainGame->btnDMDeleteDeck->setEnabled(hasDeck && !mainGame->deckBuilder.readonly);
mainGame->btnMoveDeck->setEnabled(hasDeck && !mainGame->deckBuilder.readonly);
mainGame->btnCopyDeck->setEnabled(hasDeck);
}
inline void changeCategory(int catesel) {
refreshReadonly(catesel);
mainGame->RefreshDeck(mainGame->cbDBCategory, mainGame->cbDBDecks);
mainGame->cbDBDecks->setSelected(0);
deckManager.LoadDeck(mainGame->cbDBCategory, mainGame->cbDBDecks);
mainGame->deckBuilder.is_modified = false;
mainGame->deckBuilder.prev_category = catesel;
mainGame->deckBuilder.prev_deck = 0;
}
inline void showDeckManage() {
mainGame->RefreshCategoryDeck(mainGame->cbDBCategory, mainGame->cbDBDecks, false);
mainGame->cbDBCategory->setSelected(mainGame->deckBuilder.prev_category);
mainGame->RefreshDeck(mainGame->cbDBCategory, mainGame->cbDBDecks);
mainGame->cbDBDecks->setSelected(mainGame->deckBuilder.prev_deck);
irr::gui::IGUIListBox* lstCategories = mainGame->lstCategories;
lstCategories->clear();
lstCategories->addItem(dataManager.GetSysString(1450));
lstCategories->addItem(dataManager.GetSysString(1451));
lstCategories->addItem(dataManager.GetSysString(1452));
lstCategories->addItem(dataManager.GetSysString(1453));
FileSystem::TraversalDir(L"./deck", [lstCategories](const wchar_t* name, bool isdir) {
if(isdir) {
lstCategories->addItem(name);
}
});
lstCategories->setSelected(mainGame->deckBuilder.prev_category);
refreshDeckList();
refreshReadonly(mainGame->deckBuilder.prev_category);
mainGame->lstDecks->setSelected(mainGame->deckBuilder.prev_deck);
mainGame->PopupElement(mainGame->wDeckManage);
}
void DeckBuilder::Initialize() { void DeckBuilder::Initialize() {
mainGame->is_building = true; mainGame->is_building = true;
mainGame->is_siding = false; mainGame->is_siding = false;
...@@ -151,9 +92,7 @@ void DeckBuilder::Initialize() { ...@@ -151,9 +92,7 @@ void DeckBuilder::Initialize() {
is_starting_dragging = false; is_starting_dragging = false;
prev_deck = mainGame->cbDBDecks->getSelected(); prev_deck = mainGame->cbDBDecks->getSelected();
prev_category = mainGame->cbDBCategory->getSelected(); prev_category = mainGame->cbDBCategory->getSelected();
readonly = prev_category < 2; RefreshReadonly(prev_category);
mainGame->btnSaveDeck->setEnabled(!readonly);
mainGame->btnDeleteDeck->setEnabled(!readonly);
prev_operation = 0; prev_operation = 0;
prev_sel = -1; prev_sel = -1;
is_modified = false; is_modified = false;
...@@ -181,13 +120,13 @@ void DeckBuilder::Terminate() { ...@@ -181,13 +120,13 @@ void DeckBuilder::Terminate() {
int catesel = mainGame->cbDBCategory->getSelected(); int catesel = mainGame->cbDBCategory->getSelected();
char linebuf[256]; char linebuf[256];
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);
BufferIO::EncodeUTF8(mainGame->gameConf.lastcategory, linebuf); BufferIO::EncodeUTF8(mainGame->gameConf.lastcategory, linebuf);
android::setLastCategory(mainGame->appMain, linebuf); android::setLastCategory(mainGame->appMain, linebuf);
//irr:os::Printer::log("setLastCategory", linebuf); //irr:os::Printer::log("setLastCategory", linebuf);
int decksel = mainGame->cbDBDecks->getSelected(); int decksel = mainGame->cbDBDecks->getSelected();
if(decksel >= 0) if(decksel >= 0)
BufferIO::CopyWStr(mainGame->cbDBDecks->getItem(decksel), mainGame->gameConf.lastdeck, 64); BufferIO::CopyWStr(mainGame->cbDBDecks->getItem(decksel), mainGame->gameConf.lastdeck, 64);
BufferIO::EncodeUTF8(mainGame->gameConf.lastdeck, linebuf); BufferIO::EncodeUTF8(mainGame->gameConf.lastdeck, linebuf);
android::setLastDeck(mainGame->appMain, linebuf); android::setLastDeck(mainGame->appMain, linebuf);
//os::Printer::log("setLastDeck", linebuf); //os::Printer::log("setLastDeck", linebuf);
...@@ -211,7 +150,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -211,7 +150,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
(mainGame->wQuery->isVisible() && id != BUTTON_YES && id != BUTTON_NO) || (mainGame->wQuery->isVisible() && id != BUTTON_YES && id != BUTTON_NO) ||
(mainGame->wLinkMarks->isVisible() && id != BUTTON_MARKERS_OK) || (mainGame->wLinkMarks->isVisible() && id != BUTTON_MARKERS_OK) ||
(mainGame->wDMQuery->isVisible() && id != BUTTON_DM_OK && id != BUTTON_DM_CANCEL) || (mainGame->wDMQuery->isVisible() && id != BUTTON_DM_OK && id != BUTTON_DM_CANCEL) ||
(mainGame->wDeckManage->isVisible() && !(id >= WINDOW_DECK_MANAGE && id <= COMBOBOX_LFLIST))) (mainGame->wDeckManage->isVisible() && !(id >= WINDOW_DECK_MANAGE && id < COMBOBOX_LFLIST)))
&& event.GUIEvent.EventType != irr::gui::EGET_LISTBOX_CHANGED && event.GUIEvent.EventType != irr::gui::EGET_LISTBOX_CHANGED
&& event.GUIEvent.EventType != irr::gui::EGET_COMBO_BOX_CHANGED) { && event.GUIEvent.EventType != irr::gui::EGET_COMBO_BOX_CHANGED) {
if(mainGame->wDMQuery->isVisible()) if(mainGame->wDMQuery->isVisible())
...@@ -277,14 +216,24 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -277,14 +216,24 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
mainGame->cbDBDecks->addItem(dname); mainGame->cbDBDecks->addItem(dname);
mainGame->cbDBDecks->setSelected(mainGame->cbDBDecks->getItemCount() - 1); mainGame->cbDBDecks->setSelected(mainGame->cbDBDecks->getItemCount() - 1);
} }
int catesel = mainGame->cbDBCategory->getSelected();
wchar_t catepath[256]; wchar_t catepath[256];
deckManager.GetCategoryPath(catepath, mainGame->cbDBCategory->getSelected(), mainGame->cbDBCategory->getText()); deckManager.GetCategoryPath(catepath, catesel, mainGame->cbDBCategory->getText());
wchar_t filepath[256]; wchar_t filepath[256];
myswprintf(filepath, L"%ls/%ls.ydk", catepath, dname); myswprintf(filepath, L"%ls/%ls.ydk", catepath, dname);
if(deckManager.SaveDeck(deckManager.current_deck, filepath)) { if(deckManager.SaveDeck(deckManager.current_deck, filepath)) {
mainGame->stACMessage->setText(dataManager.GetSysString(1335)); mainGame->stACMessage->setText(dataManager.GetSysString(1335));
mainGame->PopupElement(mainGame->wACMessage, 20); mainGame->PopupElement(mainGame->wACMessage, 20);
is_modified = false; is_modified = false;
if(catesel == -1) {
catesel = 2;
prev_category = catesel;
RefreshReadonly(catesel);
mainGame->cbDBCategory->setSelected(catesel);
mainGame->btnManageDeck->setEnabled(true);
mainGame->cbDBCategory->setEnabled(true);
mainGame->cbDBDecks->setEnabled(true);
}
} }
break; break;
} }
...@@ -359,7 +308,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -359,7 +308,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
} }
mainGame->chkEnableMusic->setChecked(mainGame->gameConf.enable_music); mainGame->chkEnableMusic->setChecked(mainGame->gameConf.enable_music);
mainGame->soundManager->EnableMusic(mainGame->chkEnableMusic->isChecked()); mainGame->soundManager->EnableMusic(mainGame->chkEnableMusic->isChecked());
break; break;
} }
case BUTTON_EFFECT_FILTER: { case BUTTON_EFFECT_FILTER: {
mainGame->PopupElement(mainGame->wCategories); mainGame->PopupElement(mainGame->wCategories);
...@@ -395,7 +344,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -395,7 +344,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
prev_operation = id; prev_operation = id;
break; break;
} }
showDeckManage(); ShowDeckManage();
break; break;
} }
case BUTTON_NEW_CATEGORY: { case BUTTON_NEW_CATEGORY: {
...@@ -414,7 +363,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -414,7 +363,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
mainGame->gMutex.lock(); mainGame->gMutex.lock();
mainGame->stDMMessage->setText(dataManager.GetSysString(1469)); mainGame->stDMMessage->setText(dataManager.GetSysString(1469));
mainGame->ebDMName->setVisible(true); mainGame->ebDMName->setVisible(true);
mainGame->ebDMName->setText(L""); mainGame->ebDMName->setText(mainGame->lstCategories->getListItem(mainGame->lstCategories->getSelected()));
mainGame->PopupElement(mainGame->wDMQuery); mainGame->PopupElement(mainGame->wDMQuery);
mainGame->gMutex.unlock(); mainGame->gMutex.unlock();
prev_operation = id; prev_operation = id;
...@@ -444,7 +393,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -444,7 +393,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
mainGame->gMutex.lock(); mainGame->gMutex.lock();
mainGame->stDMMessage->setText(dataManager.GetSysString(1471)); mainGame->stDMMessage->setText(dataManager.GetSysString(1471));
mainGame->ebDMName->setVisible(true); mainGame->ebDMName->setVisible(true);
mainGame->ebDMName->setText(L""); mainGame->ebDMName->setText(mainGame->lstDecks->getListItem(mainGame->lstDecks->getSelected()));
mainGame->PopupElement(mainGame->wDMQuery); mainGame->PopupElement(mainGame->wDMQuery);
mainGame->gMutex.unlock(); mainGame->gMutex.unlock();
prev_operation = id; prev_operation = id;
...@@ -468,7 +417,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -468,7 +417,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
int catesel = mainGame->lstCategories->getSelected(); int catesel = mainGame->lstCategories->getSelected();
if(catesel != 2) if(catesel != 2)
mainGame->cbDMCategory->addItem(dataManager.GetSysString(1452)); mainGame->cbDMCategory->addItem(dataManager.GetSysString(1452));
for(int i = 4;i < mainGame->lstCategories->getItemCount();i++) { for(int i = 4; i < mainGame->lstCategories->getItemCount(); i++) {
if(i != catesel) if(i != catesel)
mainGame->cbDMCategory->addItem(mainGame->lstCategories->getListItem(i)); mainGame->cbDMCategory->addItem(mainGame->lstCategories->getListItem(i));
} }
...@@ -485,7 +434,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -485,7 +434,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
int catesel = mainGame->lstCategories->getSelected(); int catesel = mainGame->lstCategories->getSelected();
if(catesel != 2) if(catesel != 2)
mainGame->cbDMCategory->addItem(dataManager.GetSysString(1452)); mainGame->cbDMCategory->addItem(dataManager.GetSysString(1452));
for(int i = 4;i < mainGame->lstCategories->getItemCount();i++) { for(int i = 4; i < mainGame->lstCategories->getItemCount(); i++) {
if(i != catesel) if(i != catesel)
mainGame->cbDMCategory->addItem(mainGame->lstCategories->getListItem(i)); mainGame->cbDMCategory->addItem(mainGame->lstCategories->getListItem(i));
} }
...@@ -503,9 +452,8 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -503,9 +452,8 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
mainGame->cbDBCategory->addItem(catename); mainGame->cbDBCategory->addItem(catename);
mainGame->lstCategories->addItem(catename); mainGame->lstCategories->addItem(catename);
catesel = mainGame->lstCategories->getItemCount() - 1; catesel = mainGame->lstCategories->getItemCount() - 1;
} } else {
else { for(int i = 3; i < mainGame->lstCategories->getItemCount(); i++) {
for(int i = 3;i < mainGame->lstCategories->getItemCount();i++) {
if(!wcsncasecmp(mainGame->lstCategories->getListItem(i), catename, 256)) { if(!wcsncasecmp(mainGame->lstCategories->getListItem(i), catename, 256)) {
catesel = i; catesel = i;
mainGame->stACMessage->setText(dataManager.GetSysString(1474)); mainGame->stACMessage->setText(dataManager.GetSysString(1474));
...@@ -516,10 +464,10 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -516,10 +464,10 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
} }
if(catesel > 0) { if(catesel > 0) {
mainGame->lstCategories->setSelected(catesel); mainGame->lstCategories->setSelected(catesel);
refreshDeckList(); RefreshDeckList();
mainGame->lstDecks->setSelected(0); mainGame->lstDecks->setSelected(0);
mainGame->cbDBCategory->setSelected(catesel); mainGame->cbDBCategory->setSelected(catesel);
changeCategory(catesel); ChangeCategory(catesel);
} }
break; break;
} }
...@@ -535,7 +483,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -535,7 +483,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
catesel = mainGame->lstCategories->getItemCount() - 1; catesel = mainGame->lstCategories->getItemCount() - 1;
} else { } else {
catesel = 0; catesel = 0;
for(int i = 3;i < mainGame->lstCategories->getItemCount();i++) { for(int i = 3; i < mainGame->lstCategories->getItemCount(); i++) {
if(!wcsncasecmp(mainGame->lstCategories->getListItem(i), newcatename, 256)) { if(!wcsncasecmp(mainGame->lstCategories->getListItem(i), newcatename, 256)) {
catesel = i; catesel = i;
mainGame->stACMessage->setText(dataManager.GetSysString(1474)); mainGame->stACMessage->setText(dataManager.GetSysString(1474));
...@@ -546,10 +494,10 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -546,10 +494,10 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
} }
if(catesel > 0) { if(catesel > 0) {
mainGame->lstCategories->setSelected(catesel); mainGame->lstCategories->setSelected(catesel);
refreshDeckList(); RefreshDeckList();
mainGame->lstDecks->setSelected(0); mainGame->lstDecks->setSelected(0);
mainGame->cbDBCategory->setSelected(catesel); mainGame->cbDBCategory->setSelected(catesel);
changeCategory(catesel); ChangeCategory(catesel);
} }
break; break;
} }
...@@ -561,13 +509,13 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -561,13 +509,13 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
mainGame->lstCategories->removeItem(catesel); mainGame->lstCategories->removeItem(catesel);
catesel = 2; catesel = 2;
mainGame->lstCategories->setSelected(catesel); mainGame->lstCategories->setSelected(catesel);
refreshDeckList(); RefreshDeckList();
mainGame->lstDecks->setSelected(0); mainGame->lstDecks->setSelected(0);
mainGame->cbDBCategory->setSelected(catesel); mainGame->cbDBCategory->setSelected(catesel);
changeCategory(catesel); ChangeCategory(catesel);
} else { } else {
mainGame->stACMessage->setText(dataManager.GetSysString(1476)); mainGame->stACMessage->setText(dataManager.GetSysString(1476));
mainGame->PopupElement(mainGame->wACMessage, 20); mainGame->PopupElement(mainGame->wACMessage, 20);
} }
break; break;
} }
...@@ -583,10 +531,10 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -583,10 +531,10 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
deckManager.current_deck.extra.clear(); deckManager.current_deck.extra.clear();
deckManager.current_deck.side.clear(); deckManager.current_deck.side.clear();
res = deckManager.SaveDeck(deckManager.current_deck, filepath); res = deckManager.SaveDeck(deckManager.current_deck, filepath);
refreshDeckList(); RefreshDeckList();
changeCategory(mainGame->lstCategories->getSelected()); ChangeCategory(mainGame->lstCategories->getSelected());
} }
for(int i = 0;i < mainGame->lstDecks->getItemCount();i++) { for(int i = 0; i < mainGame->lstDecks->getItemCount(); i++) {
if(!wcsncasecmp(mainGame->lstDecks->getListItem(i), deckname, 256)) { if(!wcsncasecmp(mainGame->lstDecks->getListItem(i), deckname, 256)) {
deckManager.LoadDeck(filepath); deckManager.LoadDeck(filepath);
prev_deck = i; prev_deck = i;
...@@ -618,9 +566,9 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -618,9 +566,9 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
if(!FileSystem::IsFileExists(newfilepath)) { if(!FileSystem::IsFileExists(newfilepath)) {
res = FileSystem::Rename(oldfilepath, newfilepath); res = FileSystem::Rename(oldfilepath, newfilepath);
} }
refreshDeckList(); RefreshDeckList();
changeCategory(catesel); ChangeCategory(catesel);
for(int i = 0;i < mainGame->lstDecks->getItemCount();i++) { for(int i = 0; i < mainGame->lstDecks->getItemCount(); i++) {
if(!wcsncasecmp(mainGame->lstDecks->getListItem(i), newdeckname, 256)) { if(!wcsncasecmp(mainGame->lstDecks->getListItem(i), newdeckname, 256)) {
deckManager.LoadDeck(newfilepath); deckManager.LoadDeck(newfilepath);
prev_deck = i; prev_deck = i;
...@@ -651,7 +599,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -651,7 +599,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
mainGame->cbDBDecks->setSelected(decksel); mainGame->cbDBDecks->setSelected(decksel);
deckManager.LoadDeck(mainGame->cbDBCategory, mainGame->cbDBDecks); deckManager.LoadDeck(mainGame->cbDBCategory, mainGame->cbDBDecks);
} }
refreshReadonly(prev_category); RefreshReadonly(prev_category);
prev_deck = decksel; prev_deck = decksel;
} else { } else {
mainGame->stACMessage->setText(dataManager.GetSysString(1476)); mainGame->stACMessage->setText(dataManager.GetSysString(1476));
...@@ -681,10 +629,10 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -681,10 +629,10 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
} }
mainGame->lstCategories->setSelected(newcatename); mainGame->lstCategories->setSelected(newcatename);
int catesel = mainGame->lstCategories->getSelected(); int catesel = mainGame->lstCategories->getSelected();
refreshDeckList(); RefreshDeckList();
mainGame->cbDBCategory->setSelected(catesel); mainGame->cbDBCategory->setSelected(catesel);
changeCategory(catesel); ChangeCategory(catesel);
for(int i = 0;i < mainGame->lstDecks->getItemCount();i++) { for(int i = 0; i < mainGame->lstDecks->getItemCount(); i++) {
if(!wcsncasecmp(mainGame->lstDecks->getListItem(i), deckname, 256)) { if(!wcsncasecmp(mainGame->lstDecks->getListItem(i), deckname, 256)) {
deckManager.LoadDeck(newfilepath); deckManager.LoadDeck(newfilepath);
prev_deck = i; prev_deck = i;
...@@ -719,10 +667,10 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -719,10 +667,10 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
} }
mainGame->lstCategories->setSelected(newcatename); mainGame->lstCategories->setSelected(newcatename);
int catesel = mainGame->lstCategories->getSelected(); int catesel = mainGame->lstCategories->getSelected();
refreshDeckList(); RefreshDeckList();
mainGame->cbDBCategory->setSelected(catesel); mainGame->cbDBCategory->setSelected(catesel);
changeCategory(catesel); ChangeCategory(catesel);
for(int i = 0;i < mainGame->lstDecks->getItemCount();i++) { for(int i = 0; i < mainGame->lstDecks->getItemCount(); i++) {
if(!wcsncasecmp(mainGame->lstDecks->getListItem(i), deckname, 256)) { if(!wcsncasecmp(mainGame->lstDecks->getListItem(i), deckname, 256)) {
deckManager.LoadDeck(newfilepath); deckManager.LoadDeck(newfilepath);
prev_deck = i; prev_deck = i;
...@@ -759,8 +707,9 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -759,8 +707,9 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
break; break;
} }
case BUTTON_SIDE_OK: { case BUTTON_SIDE_OK: {
if(deckManager.current_deck.main.size() != pre_mainc || deckManager.current_deck.extra.size() != pre_extrac if(deckManager.current_deck.main.size() != pre_mainc
|| deckManager.current_deck.side.size() != pre_sidec) { || deckManager.current_deck.extra.size() != pre_extrac
|| deckManager.current_deck.side.size() != pre_sidec) {
mainGame->soundManager->PlaySoundEffect(SoundManager::SFX::INFO); mainGame->soundManager->PlaySoundEffect(SoundManager::SFX::INFO);
mainGame->env->addMessageBox(L"", dataManager.GetSysString(1410)); mainGame->env->addMessageBox(L"", dataManager.GetSysString(1410));
break; break;
...@@ -820,14 +769,14 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -820,14 +769,14 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
Terminate(); Terminate();
} else if(prev_operation == COMBOBOX_DBCATEGORY) { } else if(prev_operation == COMBOBOX_DBCATEGORY) {
int catesel = mainGame->cbDBCategory->getSelected(); int catesel = mainGame->cbDBCategory->getSelected();
changeCategory(catesel); ChangeCategory(catesel);
} else if(prev_operation == COMBOBOX_DBDECKS) { } else if(prev_operation == COMBOBOX_DBDECKS) {
int decksel = mainGame->cbDBDecks->getSelected(); int decksel = mainGame->cbDBDecks->getSelected();
deckManager.LoadDeck(mainGame->cbDBCategory, mainGame->cbDBDecks); deckManager.LoadDeck(mainGame->cbDBCategory, mainGame->cbDBDecks);
prev_deck = decksel; prev_deck = decksel;
is_modified = false; is_modified = false;
} else if(prev_operation == BUTTON_MANAGE_DECK) { } else if(prev_operation == BUTTON_MANAGE_DECK) {
showDeckManage(); ShowDeckManage();
} }
prev_operation = 0; prev_operation = 0;
break; break;
...@@ -836,8 +785,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -836,8 +785,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
mainGame->HideElement(mainGame->wQuery); mainGame->HideElement(mainGame->wQuery);
if(prev_operation == COMBOBOX_DBCATEGORY) { if(prev_operation == COMBOBOX_DBCATEGORY) {
mainGame->cbDBCategory->setSelected(prev_category); mainGame->cbDBCategory->setSelected(prev_category);
} } else if(prev_operation == COMBOBOX_DBDECKS) {
else if(prev_operation == COMBOBOX_DBDECKS) {
mainGame->cbDBDecks->setSelected(prev_deck); mainGame->cbDBDecks->setSelected(prev_deck);
} }
prev_operation = 0; prev_operation = 0;
...@@ -927,7 +875,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -927,7 +875,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
prev_operation = id; prev_operation = id;
break; break;
} }
changeCategory(catesel); ChangeCategory(catesel);
break; break;
} }
case COMBOBOX_DBDECKS: { case COMBOBOX_DBDECKS: {
...@@ -1068,6 +1016,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -1068,6 +1016,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
case COMBOBOX_LIMIT: case COMBOBOX_LIMIT:
mainGame->env->setFocus(0); mainGame->env->setFocus(0);
InstantSearch(); InstantSearch();
break;
} }
} }
case irr::gui::EGET_LISTBOX_CHANGED: { case irr::gui::EGET_LISTBOX_CHANGED: {
...@@ -1084,10 +1033,10 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -1084,10 +1033,10 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
if(prev_category == catesel) if(prev_category == catesel)
break; break;
} }
refreshDeckList(); RefreshDeckList();
mainGame->lstDecks->setSelected(0); mainGame->lstDecks->setSelected(0);
mainGame->cbDBCategory->setSelected(catesel); mainGame->cbDBCategory->setSelected(catesel);
changeCategory(catesel); ChangeCategory(catesel);
break; break;
} }
case LISTBOX_DECKS: { case LISTBOX_DECKS: {
...@@ -1533,7 +1482,7 @@ void DeckBuilder::FilterCards() { ...@@ -1533,7 +1482,7 @@ void DeckBuilder::FilterCards() {
} }
if(filter_effect && !(data.category & filter_effect)) if(filter_effect && !(data.category & filter_effect))
continue; continue;
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).at(ptr->first) != filter_lm - 1)) if(filter_lm <= 3 && (!filterList->count(ptr->first) || (*filterList).at(ptr->first) != filter_lm - 1))
...@@ -1650,6 +1599,68 @@ void DeckBuilder::SortList() { ...@@ -1650,6 +1599,68 @@ void DeckBuilder::SortList() {
break; break;
} }
} }
void DeckBuilder::RefreshDeckList() {
irr::gui::IGUIListBox* lstCategories = mainGame->lstCategories;
irr::gui::IGUIListBox* lstDecks = mainGame->lstDecks;
wchar_t catepath[256];
deckManager.GetCategoryPath(catepath, lstCategories->getSelected(), lstCategories->getListItem(lstCategories->getSelected()));
lstDecks->clear();
FileSystem::TraversalDir(catepath, [lstDecks](const wchar_t* name, bool isdir) {
if(!isdir && wcsrchr(name, '.') && !wcsncasecmp(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) {
bool hasDeck = mainGame->cbDBDecks->getItemCount() != 0;
readonly = catesel < 2;
mainGame->btnSaveDeck->setEnabled(!readonly);
mainGame->btnSaveDeckAs->setEnabled(!readonly);
mainGame->btnDeleteDeck->setEnabled(hasDeck && !readonly);
mainGame->btnRenameCategory->setEnabled(catesel > 3);
mainGame->btnDeleteCategory->setEnabled(catesel > 3);
mainGame->btnNewDeck->setEnabled(!readonly);
mainGame->btnRenameDeck->setEnabled(hasDeck && !readonly);
mainGame->btnDMDeleteDeck->setEnabled(hasDeck && !readonly);
mainGame->btnMoveDeck->setEnabled(hasDeck && !readonly);
mainGame->btnCopyDeck->setEnabled(hasDeck);
}
void DeckBuilder::ChangeCategory(int catesel) {
mainGame->RefreshDeck(mainGame->cbDBCategory, mainGame->cbDBDecks);
mainGame->cbDBDecks->setSelected(0);
deckManager.LoadDeck(mainGame->cbDBCategory, mainGame->cbDBDecks);
RefreshReadonly(catesel);
is_modified = false;
prev_category = catesel;
prev_deck = 0;
}
void DeckBuilder::ShowDeckManage() {
mainGame->RefreshCategoryDeck(mainGame->cbDBCategory, mainGame->cbDBDecks, false);
mainGame->cbDBCategory->setSelected(prev_category);
mainGame->RefreshDeck(mainGame->cbDBCategory, mainGame->cbDBDecks);
mainGame->cbDBDecks->setSelected(prev_deck);
irr::gui::IGUIListBox* lstCategories = mainGame->lstCategories;
lstCategories->clear();
lstCategories->addItem(dataManager.GetSysString(1450));
lstCategories->addItem(dataManager.GetSysString(1451));
lstCategories->addItem(dataManager.GetSysString(1452));
lstCategories->addItem(dataManager.GetSysString(1453));
FileSystem::TraversalDir(L"./deck", [lstCategories](const wchar_t* name, bool isdir) {
if(isdir) {
lstCategories->addItem(name);
}
});
lstCategories->setSelected(prev_category);
RefreshDeckList();
RefreshReadonly(prev_category);
mainGame->lstDecks->setSelected(prev_deck);
mainGame->PopupElement(mainGame->wDeckManage);
}
static inline wchar_t NormalizeChar(wchar_t c) { static inline wchar_t NormalizeChar(wchar_t c) {
/* /*
// Convert all symbols and punctuations to space. // Convert all symbols and punctuations to space.
...@@ -1670,22 +1681,21 @@ static inline wchar_t NormalizeChar(wchar_t c) { ...@@ -1670,22 +1681,21 @@ static inline wchar_t NormalizeChar(wchar_t c) {
} }
return c; return c;
} }
bool DeckBuilder::CardNameContains(const wchar_t *haystack, const wchar_t *needle) bool DeckBuilder::CardNameContains(const wchar_t* haystack, const wchar_t* needle) {
{ if(!needle[0]) {
if (!needle[0]) {
return true; return true;
} }
if (!haystack) { if(!haystack) {
return false; return false;
} }
int i = 0; int i = 0;
int j = 0; int j = 0;
while (haystack[i]) { while(haystack[i]) {
wchar_t ca = NormalizeChar(haystack[i]); wchar_t ca = NormalizeChar(haystack[i]);
wchar_t cb = NormalizeChar(needle[j]); wchar_t cb = NormalizeChar(needle[j]);
if (ca == cb) { if(ca == cb) {
j++; j++;
if (!needle[j]) { if(!needle[j]) {
return true; return true;
} }
} else { } else {
......
...@@ -27,6 +27,11 @@ public: ...@@ -27,6 +27,11 @@ public:
void ClearSearch(); void ClearSearch();
void SortList(); void SortList();
void RefreshDeckList();
void RefreshReadonly(int catesel);
void ChangeCategory(int catesel);
void ShowDeckManage();
bool CardNameContains(const wchar_t *haystack, const wchar_t *needle); bool CardNameContains(const wchar_t *haystack, const wchar_t *needle);
bool push_main(code_pointer pointer, int seq = -1); bool push_main(code_pointer pointer, int seq = -1);
......
...@@ -366,19 +366,21 @@ bool ClientField::OnEvent(const irr::SEvent& event) { ...@@ -366,19 +366,21 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
break; break;
} }
case BUTTON_OPTION_0: case BUTTON_OPTION_0:
case BUTTON_OPTION_1: case BUTTON_OPTION_1:
case BUTTON_OPTION_2: case BUTTON_OPTION_2:
case BUTTON_OPTION_3: case BUTTON_OPTION_3:
case BUTTON_OPTION_4: { case BUTTON_OPTION_4: {
mainGame->soundManager->PlaySoundEffect(SoundManager::SFX::BUTTON); mainGame->soundManager->PlaySoundEffect(SoundManager::SFX::BUTTON);
int step = mainGame->scrOption->isVisible() ? mainGame->scrOption->getPos() : 0; int step = mainGame->scrOption->isVisible() ? mainGame->scrOption->getPos() : 0;
selected_option = id - BUTTON_OPTION_0 + step; selected_option = id - BUTTON_OPTION_0 + step;
SetResponseSelectedOption(); SetResponseSelectedOption();
ShowCancelOrFinishButton(0);
break; break;
} }
case BUTTON_OPTION_OK: { case BUTTON_OPTION_OK: {
mainGame->soundManager->PlaySoundEffect(SoundManager::SFX::BUTTON); mainGame->soundManager->PlaySoundEffect(SoundManager::SFX::BUTTON);
SetResponseSelectedOption(); SetResponseSelectedOption();
ShowCancelOrFinishButton(0);
break; break;
} }
case BUTTON_ANNUMBER_1: case BUTTON_ANNUMBER_1:
...@@ -432,22 +434,25 @@ bool ClientField::OnEvent(const irr::SEvent& event) { ...@@ -432,22 +434,25 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
mainGame->wCmdMenu->setVisible(false); mainGame->wCmdMenu->setVisible(false);
ShowCancelOrFinishButton(0); ShowCancelOrFinishButton(0);
if(!list_command) { if(!list_command) {
int index = -1; if(!menu_card)
break;
select_options.clear(); select_options.clear();
select_options_index.clear();
for (size_t i = 0; i < activatable_cards.size(); ++i) { for (size_t i = 0; i < activatable_cards.size(); ++i) {
if (activatable_cards[i] == clicked_card) { if (activatable_cards[i] == menu_card) {
if(activatable_descs[i].second == EDESC_OPERATION) if(activatable_descs[i].second == EDESC_OPERATION)
continue; continue;
if(activatable_descs[i].second == EDESC_RESET) { else if(activatable_descs[i].second == EDESC_RESET) {
if(id == BUTTON_CMD_ACTIVATE) continue; if(id == BUTTON_CMD_ACTIVATE) continue;
} else { } else {
if(id == BUTTON_CMD_RESET) continue; if(id == BUTTON_CMD_RESET) continue;
} }
select_options.push_back(activatable_descs[i].first); select_options.push_back(activatable_descs[i].first);
if (index == -1) index = i; select_options_index.push_back(i);
} }
} }
if (select_options.size() == 1) { if (select_options.size() == 1) {
int index = select_options_index[0];
if (mainGame->dInfo.curMsg == MSG_SELECT_IDLECMD) { if (mainGame->dInfo.curMsg == MSG_SELECT_IDLECMD) {
DuelClient::SetResponseI((index << 16) + 5); DuelClient::SetResponseI((index << 16) + 5);
} else if (mainGame->dInfo.curMsg == MSG_SELECT_BATTLECMD) { } else if (mainGame->dInfo.curMsg == MSG_SELECT_BATTLECMD) {
...@@ -457,8 +462,10 @@ bool ClientField::OnEvent(const irr::SEvent& event) { ...@@ -457,8 +462,10 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
} }
DuelClient::SendResponse(); DuelClient::SendResponse();
} else { } else {
command_card = clicked_card; command_card = menu_card;
ShowSelectOption(); ShowSelectOption();
select_ready = false;
ShowCancelOrFinishButton(1);
} }
} else { } else {
selectable_cards.clear(); selectable_cards.clear();
...@@ -511,10 +518,10 @@ bool ClientField::OnEvent(const irr::SEvent& event) { ...@@ -511,10 +518,10 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
} }
case BUTTON_CMD_SUMMON: { case BUTTON_CMD_SUMMON: {
mainGame->wCmdMenu->setVisible(false); mainGame->wCmdMenu->setVisible(false);
if(!clicked_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) {
if(summonable_cards[i] == clicked_card) { if(summonable_cards[i] == menu_card) {
ClearCommandFlag(); ClearCommandFlag();
DuelClient::SetResponseI(i << 16); DuelClient::SetResponseI(i << 16);
DuelClient::SendResponse(); DuelClient::SendResponse();
...@@ -526,10 +533,10 @@ bool ClientField::OnEvent(const irr::SEvent& event) { ...@@ -526,10 +533,10 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
case BUTTON_CMD_SPSUMMON: { case BUTTON_CMD_SPSUMMON: {
mainGame->wCmdMenu->setVisible(false); mainGame->wCmdMenu->setVisible(false);
if(!list_command) { if(!list_command) {
if(!clicked_card) if(!menu_card)
break; break;
for(size_t i = 0; i < spsummonable_cards.size(); ++i) { for(size_t i = 0; i < spsummonable_cards.size(); ++i) {
if(spsummonable_cards[i] == clicked_card) { if(spsummonable_cards[i] == menu_card) {
ClearCommandFlag(); ClearCommandFlag();
DuelClient::SetResponseI((i << 16) + 1); DuelClient::SetResponseI((i << 16) + 1);
DuelClient::SendResponse(); DuelClient::SendResponse();
...@@ -568,10 +575,10 @@ bool ClientField::OnEvent(const irr::SEvent& event) { ...@@ -568,10 +575,10 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
} }
case BUTTON_CMD_MSET: { case BUTTON_CMD_MSET: {
mainGame->wCmdMenu->setVisible(false); mainGame->wCmdMenu->setVisible(false);
if(!clicked_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) {
if(msetable_cards[i] == clicked_card) { if(msetable_cards[i] == menu_card) {
DuelClient::SetResponseI((i << 16) + 3); DuelClient::SetResponseI((i << 16) + 3);
DuelClient::SendResponse(); DuelClient::SendResponse();
break; break;
...@@ -581,10 +588,10 @@ bool ClientField::OnEvent(const irr::SEvent& event) { ...@@ -581,10 +588,10 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
} }
case BUTTON_CMD_SSET: { case BUTTON_CMD_SSET: {
mainGame->wCmdMenu->setVisible(false); mainGame->wCmdMenu->setVisible(false);
if(!clicked_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) {
if(ssetable_cards[i] == clicked_card) { if(ssetable_cards[i] == menu_card) {
DuelClient::SetResponseI((i << 16) + 4); DuelClient::SetResponseI((i << 16) + 4);
DuelClient::SendResponse(); DuelClient::SendResponse();
break; break;
...@@ -594,10 +601,10 @@ bool ClientField::OnEvent(const irr::SEvent& event) { ...@@ -594,10 +601,10 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
} }
case BUTTON_CMD_REPOS: { case BUTTON_CMD_REPOS: {
mainGame->wCmdMenu->setVisible(false); mainGame->wCmdMenu->setVisible(false);
if(!clicked_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) {
if(reposable_cards[i] == clicked_card) { if(reposable_cards[i] == menu_card) {
DuelClient::SetResponseI((i << 16) + 2); DuelClient::SetResponseI((i << 16) + 2);
DuelClient::SendResponse(); DuelClient::SendResponse();
break; break;
...@@ -607,10 +614,10 @@ bool ClientField::OnEvent(const irr::SEvent& event) { ...@@ -607,10 +614,10 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
} }
case BUTTON_CMD_ATTACK: { case BUTTON_CMD_ATTACK: {
mainGame->wCmdMenu->setVisible(false); mainGame->wCmdMenu->setVisible(false);
if(!clicked_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) {
if(attackable_cards[i] == clicked_card) { if(attackable_cards[i] == menu_card) {
DuelClient::SetResponseI((i << 16) + 1); DuelClient::SetResponseI((i << 16) + 1);
DuelClient::SendResponse(); DuelClient::SendResponse();
break; break;
...@@ -717,9 +724,9 @@ bool ClientField::OnEvent(const irr::SEvent& event) { ...@@ -717,9 +724,9 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
break; break;
} }
if(list_command == COMMAND_ACTIVATE || list_command == COMMAND_OPERATION) { if(list_command == COMMAND_ACTIVATE || list_command == COMMAND_OPERATION) {
int index = -1;
command_card = selectable_cards[id - BUTTON_CARD_0 + mainGame->scrCardList->getPos() / 10]; command_card = selectable_cards[id - BUTTON_CARD_0 + mainGame->scrCardList->getPos() / 10];
select_options.clear(); select_options.clear();
select_options_index.clear();
for (size_t i = 0; i < activatable_cards.size(); ++i) { for (size_t i = 0; i < activatable_cards.size(); ++i) {
if (activatable_cards[i] == command_card) { if (activatable_cards[i] == command_card) {
if(activatable_descs[i].second == EDESC_OPERATION) { if(activatable_descs[i].second == EDESC_OPERATION) {
...@@ -728,10 +735,11 @@ bool ClientField::OnEvent(const irr::SEvent& event) { ...@@ -728,10 +735,11 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
if(list_command == COMMAND_OPERATION) continue; if(list_command == COMMAND_OPERATION) continue;
} }
select_options.push_back(activatable_descs[i].first); select_options.push_back(activatable_descs[i].first);
if (index == -1) index = i; select_options_index.push_back(i);
} }
} }
if (select_options.size() == 1) { if (select_options.size() == 1) {
int index = select_options_index[0];
if (mainGame->dInfo.curMsg == MSG_SELECT_IDLECMD) { if (mainGame->dInfo.curMsg == MSG_SELECT_IDLECMD) {
DuelClient::SetResponseI((index << 16) + 5); DuelClient::SetResponseI((index << 16) + 5);
} else if (mainGame->dInfo.curMsg == MSG_SELECT_BATTLECMD) { } else if (mainGame->dInfo.curMsg == MSG_SELECT_BATTLECMD) {
...@@ -959,6 +967,8 @@ bool ClientField::OnEvent(const irr::SEvent& event) { ...@@ -959,6 +967,8 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
} else { } else {
if(conti_selecting) if(conti_selecting)
myswprintf(formatBuffer, L"%ls", DataManager::unknown_string); myswprintf(formatBuffer, L"%ls", DataManager::unknown_string);
else if(cant_check_grave && selectable_cards[i]->location == LOCATION_GRAVE)
myswprintf(formatBuffer, L"%ls", dataManager.FormatLocation(selectable_cards[i]->location, 0));
else if(selectable_cards[i + pos]->location == LOCATION_OVERLAY) else if(selectable_cards[i + pos]->location == LOCATION_OVERLAY)
myswprintf(formatBuffer, L"%ls[%d](%d)", myswprintf(formatBuffer, L"%ls[%d](%d)",
dataManager.FormatLocation(selectable_cards[i + pos]->overlayTarget->location, selectable_cards[i + pos]->overlayTarget->sequence), dataManager.FormatLocation(selectable_cards[i + pos]->overlayTarget->location, selectable_cards[i + pos]->overlayTarget->sequence),
...@@ -1258,6 +1268,8 @@ bool ClientField::OnEvent(const irr::SEvent& event) { ...@@ -1258,6 +1268,8 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
case LOCATION_GRAVE: { case LOCATION_GRAVE: {
if(grave[hovered_controler].size() == 0) if(grave[hovered_controler].size() == 0)
break; break;
if(cant_check_grave)
break;
ShowMenu(COMMAND_LIST, x, y); ShowMenu(COMMAND_LIST, x, y);
break; break;
} }
...@@ -1308,6 +1320,8 @@ bool ClientField::OnEvent(const irr::SEvent& event) { ...@@ -1308,6 +1320,8 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
int command_flag = 0; int command_flag = 0;
if(grave[hovered_controler].size() == 0) if(grave[hovered_controler].size() == 0)
break; break;
if(cant_check_grave)
break;
for(size_t i = 0; i < grave[hovered_controler].size(); ++i) for(size_t i = 0; i < grave[hovered_controler].size(); ++i)
command_flag |= grave[hovered_controler][i]->cmdFlag; command_flag |= grave[hovered_controler][i]->cmdFlag;
command_flag |= COMMAND_LIST; command_flag |= COMMAND_LIST;
...@@ -1404,6 +1418,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) { ...@@ -1404,6 +1418,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
selected_field = 0; selected_field = 0;
DuelClient::SetResponseB(respbuf, p); DuelClient::SetResponseB(respbuf, p);
DuelClient::SendResponse(); DuelClient::SendResponse();
ShowCancelOrFinishButton(0);
} }
} }
} }
...@@ -1615,7 +1630,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) { ...@@ -1615,7 +1630,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
SetShowMark(hovered_card, false); SetShowMark(hovered_card, false);
} }
if(mcard) { if(mcard) {
if(mcard != clicked_card) if(mcard != menu_card)
mainGame->wCmdMenu->setVisible(false); mainGame->wCmdMenu->setVisible(false);
if(hovered_location == LOCATION_HAND) { if(hovered_location == LOCATION_HAND) {
mcard->is_hovered = true; mcard->is_hovered = true;
...@@ -1753,6 +1768,8 @@ bool ClientField::OnEvent(const irr::SEvent& event) { ...@@ -1753,6 +1768,8 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
case LOCATION_GRAVE: { case LOCATION_GRAVE: {
if(grave[hovered_controler].size() == 0) if(grave[hovered_controler].size() == 0)
break; break;
if(cant_check_grave)
break;
loc_id = 1004; loc_id = 1004;
for(auto it = grave[hovered_controler].rbegin(); it != grave[hovered_controler].rend(); ++it) for(auto it = grave[hovered_controler].rbegin(); it != grave[hovered_controler].rend(); ++it)
display_cards.push_back(*it); display_cards.push_back(*it);
...@@ -1843,6 +1860,8 @@ bool ClientField::OnEvent(const irr::SEvent& event) { ...@@ -1843,6 +1860,8 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
display_cards.clear(); display_cards.clear();
switch(event.KeyInput.Key) { switch(event.KeyInput.Key) {
case irr::KEY_F1: case irr::KEY_F1:
if(cant_check_grave)
break;
loc_id = 1004; loc_id = 1004;
for(auto it = grave[0].rbegin(); it != grave[0].rend(); ++it) for(auto it = grave[0].rbegin(); it != grave[0].rend(); ++it)
display_cards.push_back(*it); display_cards.push_back(*it);
...@@ -1867,6 +1886,8 @@ bool ClientField::OnEvent(const irr::SEvent& event) { ...@@ -1867,6 +1886,8 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
} }
break; break;
case irr::KEY_F5: case irr::KEY_F5:
if(cant_check_grave)
break;
loc_id = 1004; loc_id = 1004;
for(auto it = grave[1].rbegin(); it != grave[1].rend(); ++it) for(auto it = grave[1].rbegin(); it != grave[1].rend(); ++it)
display_cards.push_back(*it); display_cards.push_back(*it);
...@@ -2077,15 +2098,19 @@ bool ClientField::OnCommonEvent(const irr::SEvent& event) { ...@@ -2077,15 +2098,19 @@ bool ClientField::OnCommonEvent(const irr::SEvent& event) {
switch(event.KeyInput.Key) { switch(event.KeyInput.Key) {
case irr::KEY_KEY_R: { case irr::KEY_KEY_R: {
if(mainGame->gameConf.control_mode == 0 if(mainGame->gameConf.control_mode == 0
&& !event.KeyInput.PressedDown && !mainGame->HasFocus(EGUIET_EDIT_BOX)) && !event.KeyInput.PressedDown && !mainGame->HasFocus(EGUIET_EDIT_BOX)) {
mainGame->textFont->setTransparency(true); mainGame->textFont->setTransparency(true);
mainGame->guiFont->setTransparency(true);
}
return true; return true;
break; break;
} }
case irr::KEY_F9: { case irr::KEY_F9: {
if(mainGame->gameConf.control_mode == 1 if(mainGame->gameConf.control_mode == 1
&& !event.KeyInput.PressedDown && !mainGame->HasFocus(EGUIET_EDIT_BOX)) && !event.KeyInput.PressedDown && !mainGame->HasFocus(EGUIET_EDIT_BOX)) {
mainGame->textFont->setTransparency(true); mainGame->textFont->setTransparency(true);
mainGame->guiFont->setTransparency(true);
}
return true; return true;
break; break;
} }
...@@ -2499,6 +2524,7 @@ void ClientField::ShowMenu(int flag, int x, int y) { ...@@ -2499,6 +2524,7 @@ void ClientField::ShowMenu(int flag, int x, int y) {
mainGame->wCmdMenu->setVisible(false); mainGame->wCmdMenu->setVisible(false);
return; return;
} }
menu_card = clicked_card;
int height = 0; int height = 0;
if(flag & COMMAND_ACTIVATE) { if(flag & COMMAND_ACTIVATE) {
mainGame->btnActivate->setVisible(true); mainGame->btnActivate->setVisible(true);
...@@ -2684,8 +2710,7 @@ void ClientField::SetResponseSelectedOption() const { ...@@ -2684,8 +2710,7 @@ void ClientField::SetResponseSelectedOption() const {
if(mainGame->dInfo.curMsg == MSG_SELECT_OPTION) { if(mainGame->dInfo.curMsg == MSG_SELECT_OPTION) {
DuelClient::SetResponseI(selected_option); DuelClient::SetResponseI(selected_option);
} else { } else {
int index = 0; int index = select_options_index[selected_option];
while(activatable_cards[index] != command_card || activatable_descs[index].first != select_options[selected_option]) index++;
if(mainGame->dInfo.curMsg == MSG_SELECT_IDLECMD) { if(mainGame->dInfo.curMsg == MSG_SELECT_IDLECMD) {
DuelClient::SetResponseI((index << 16) + 5); DuelClient::SetResponseI((index << 16) + 5);
} else if(mainGame->dInfo.curMsg == MSG_SELECT_BATTLECMD) { } else if(mainGame->dInfo.curMsg == MSG_SELECT_BATTLECMD) {
......
...@@ -157,6 +157,7 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) { ...@@ -157,6 +157,7 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
break; break;
} }
case BUTTON_HP_DUELIST: { case BUTTON_HP_DUELIST: {
mainGame->cbCategorySelect->setEnabled(true);
mainGame->cbDeckSelect->setEnabled(true); mainGame->cbDeckSelect->setEnabled(true);
DuelClient::SendPacketToServer(CTOS_HS_TODUELIST); DuelClient::SendPacketToServer(CTOS_HS_TODUELIST);
break; break;
...@@ -494,7 +495,7 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) { ...@@ -494,7 +495,7 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
case BUTTON_CLOSE_SETTINGS: { case BUTTON_CLOSE_SETTINGS: {
mainGame->HideElement(mainGame->wSettings); mainGame->HideElement(mainGame->wSettings);
mainGame->ShowElement(mainGame->wMainMenu); mainGame->ShowElement(mainGame->wMainMenu);
break; break;
} }
} }
break; break;
...@@ -604,6 +605,32 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) { ...@@ -604,6 +605,32 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
} }
break; break;
} }
case irr::gui::EGET_CHECKBOX_CHANGED: {
switch(id) {
case CHECKBOX_HP_READY: {
if(!caller->isEnabled())
break;
mainGame->env->setFocus(mainGame->wHostPrepare);
if(static_cast<irr::gui::IGUICheckBox*>(caller)->isChecked()) {
if(mainGame->cbCategorySelect->getSelected() == -1 || mainGame->cbDeckSelect->getSelected() == -1 ||
!deckManager.LoadDeck(mainGame->cbCategorySelect, mainGame->cbDeckSelect)) {
static_cast<irr::gui::IGUICheckBox*>(caller)->setChecked(false);
break;
}
UpdateDeck();
DuelClient::SendPacketToServer(CTOS_HS_READY);
mainGame->cbCategorySelect->setEnabled(false);
mainGame->cbDeckSelect->setEnabled(false);
} else {
DuelClient::SendPacketToServer(CTOS_HS_NOTREADY);
mainGame->cbCategorySelect->setEnabled(true);
mainGame->cbDeckSelect->setEnabled(true);
}
break;
}
}
break;
}
case irr::gui::EGET_COMBO_BOX_CHANGED: { case irr::gui::EGET_COMBO_BOX_CHANGED: {
switch(id) { switch(id) {
case COMBOBOX_BOT_RULE: { case COMBOBOX_BOT_RULE: {
...@@ -637,32 +664,6 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) { ...@@ -637,32 +664,6 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
} }
break; break;
} }
case irr::gui::EGET_CHECKBOX_CHANGED: {
switch(id) {
case CHECKBOX_HP_READY: {
if(!caller->isEnabled())
break;
mainGame->env->setFocus(mainGame->wHostPrepare);
if(static_cast<irr::gui::IGUICheckBox*>(caller)->isChecked()) {
if(mainGame->cbCategorySelect->getSelected() == -1 || mainGame->cbDeckSelect->getSelected() == -1 ||
!deckManager.LoadDeck(mainGame->cbCategorySelect, mainGame->cbDeckSelect)) {
static_cast<irr::gui::IGUICheckBox*>(caller)->setChecked(false);
break;
}
UpdateDeck();
DuelClient::SendPacketToServer(CTOS_HS_READY);
mainGame->cbCategorySelect->setEnabled(false);
mainGame->cbDeckSelect->setEnabled(false);
} else {
DuelClient::SendPacketToServer(CTOS_HS_NOTREADY);
mainGame->cbCategorySelect->setEnabled(true);
mainGame->cbDeckSelect->setEnabled(true);
}
break;
}
}
break;
}
default: break; default: break;
} }
break; break;
......
...@@ -74,12 +74,12 @@ public: ...@@ -74,12 +74,12 @@ public:
lpFileOp.fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMATION | FOF_NOERRORUI | FOF_SILENT; lpFileOp.fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMATION | FOF_NOERRORUI | FOF_SILENT;
return SHFileOperationW(&lpFileOp) == 0; return SHFileOperationW(&lpFileOp) == 0;
} }
static bool DeleteDir(const char* dir) { static bool DeleteDir(const char* dir) {
wchar_t wdir[1024]; wchar_t wdir[1024];
BufferIO::DecodeUTF8(dir, wdir); BufferIO::DecodeUTF8(dir, wdir);
return DeleteDir(wdir); return DeleteDir(wdir);
} }
static void TraversalDir(const wchar_t* wpath, const std::function<void(const wchar_t*, bool)>& cb) { static void TraversalDir(const wchar_t* wpath, const std::function<void(const wchar_t*, bool)>& cb) {
wchar_t findstr[1024]; wchar_t findstr[1024];
...@@ -142,46 +142,45 @@ public: ...@@ -142,46 +142,45 @@ public:
BufferIO::EncodeUTF8(wdir, dir); BufferIO::EncodeUTF8(wdir, dir);
return MakeDir(dir); return MakeDir(dir);
} }
static bool Rename(const wchar_t* woldname, const wchar_t* wnewname) { static bool Rename(const wchar_t* woldname, const wchar_t* wnewname) {
char oldname[1024]; char oldname[1024];
char newname[1024]; char newname[1024];
BufferIO::EncodeUTF8(woldname, oldname); BufferIO::EncodeUTF8(woldname, oldname);
BufferIO::EncodeUTF8(wnewname, newname); BufferIO::EncodeUTF8(wnewname, newname);
return Rename(oldname, newname); return Rename(oldname, newname);
} }
static bool Rename(const char* oldname, const char* newname) { static bool Rename(const char* oldname, const char* newname) {
return rename(oldname, newname) == 0; return rename(oldname, newname) == 0;
} }
static bool DeleteDir(const wchar_t* wdir) {
char dir[1024];
BufferIO::EncodeUTF8(wdir, dir);
return DeleteDir(dir);
}
static bool DeleteDir(const char* dir) {
bool success = true;
TraversalDir(dir, [dir, &success](const char *name, bool isdir) {
char full_path[256];
sprintf(full_path, "%s/%s", dir, name);
if (isdir)
{
if(!DeleteDir(full_path))
success = false;
}
else
{
if(unlink(full_path) != 0)
success = false;
}
});
if (rmdir(dir) != 0)
success = false;
return success;
}
static bool DeleteDir(const wchar_t* wdir) {
char dir[1024];
BufferIO::EncodeUTF8(wdir, dir);
return DeleteDir(dir);
}
static bool DeleteDir(const char* dir) {
bool success = true;
TraversalDir(dir, [dir, &success](const char *name, bool isdir) {
char full_path[256];
sprintf(full_path, "%s/%s", dir, name);
if (isdir)
{
if(!DeleteDir(full_path))
success = false;
}
else
{
if(unlink(full_path) != 0)
success = false;
}
});
if (rmdir(dir) != 0)
success = false;
return success;
}
struct file_unit { struct file_unit {
std::string filename; std::string filename;
...@@ -205,7 +204,7 @@ public: ...@@ -205,7 +204,7 @@ public:
funit.filename = std::string(dirp->d_name); funit.filename = std::string(dirp->d_name);
funit.is_dir = S_ISDIR(fileStat.st_mode); funit.is_dir = S_ISDIR(fileStat.st_mode);
if(funit.is_dir && (strcmp(dirp->d_name, ".") == 0 || strcmp(dirp->d_name, "..") == 0)) if(funit.is_dir && (strcmp(dirp->d_name, ".") == 0 || strcmp(dirp->d_name, "..") == 0))
continue; continue;
file_list.push_back(funit); file_list.push_back(funit);
} }
closedir(dir); closedir(dir);
......
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