Commit 34e9abd9 authored by fallenstardust's avatar fallenstardust

update gframe

parent 8a717caf
......@@ -27,6 +27,7 @@ ClientField::ClientField() {
hovered_card = 0;
clicked_card = 0;
highlighting_card = 0;
menu_card = 0;
hovered_controler = 0;
hovered_location = 0;
hovered_sequence = 0;
......@@ -41,6 +42,7 @@ ClientField::ClientField() {
conti_act = false;
deck_reversed = false;
conti_selecting = false;
cant_check_grave = false;
for(int p = 0; p < 2; ++p) {
mzone[p].resize(7, 0);
szone[p].resize(8, 0);
......@@ -94,6 +96,7 @@ void ClientField::Clear() {
hovered_card = 0;
clicked_card = 0;
highlighting_card = 0;
menu_card = 0;
hovered_controler = 0;
hovered_location = 0;
hovered_sequence = 0;
......@@ -105,7 +108,7 @@ void ClientField::Clear() {
pzone_act[1] = false;
conti_act = false;
deck_reversed = false;
RefreshCardCountDisplay();
cant_check_grave = false;
}
void ClientField::Initial(int player, int deckc, int extrac) {
ClientCard* pcard;
......@@ -402,6 +405,18 @@ void ClientField::ClearChainSelect() {
}
// needs to be synchronized with EGET_SCROLL_BAR_CHANGED
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;
size_t ct;
if(selectable_cards.size() <= 5) {
......@@ -428,6 +443,8 @@ void ClientField::ShowSelectCard(bool buttonok, bool chain) {
wchar_t formatBuffer[2048];
if(conti_selecting)
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)
myswprintf(formatBuffer, L"%ls[%d](%d)",
dataManager.FormatLocation(selectable_cards[i]->overlayTarget->location, selectable_cards[i]->overlayTarget->sequence),
......@@ -447,7 +464,8 @@ void ClientField::ShowSelectCard(bool buttonok, bool chain) {
mainGame->stCardPos[i]->setOverrideColor(0xff0000ff);
if(selectable_cards[i]->overlayTarget->controler)
mainGame->stCardPos[i]->setBackgroundColor(0xff5a5a5a);
else mainGame->stCardPos[i]->setBackgroundColor(0xff56649f);
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);
......@@ -467,7 +485,8 @@ void ClientField::ShowSelectCard(bool buttonok, bool chain) {
wchar_t formatBuffer[2048];
myswprintf(formatBuffer, L"%d", sort_list[i]);
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]->setVisible(true);
......@@ -648,12 +667,12 @@ void ClientField::ShowSelectOption(int select_hint) {
mainGame->wOptions->setRelativePosition(pos);
mainGame->bgOptions->setRelativePosition(rect<s32>(0, 0, (scrollbar ? 405 : 390) * mainGame->xScale, pos.LowerRightCorner.Y - pos.UpperLeftCorner.Y));
} 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->btnOptionp->setVisible(false);
mainGame->btnOptionn->setVisible(count > 1);
mainGame->btnOptionOK->setVisible(true);
mainGame->scrOption->setVisible(false);
for(int i = 0; i < 5; i++)
mainGame->btnOption[i]->setVisible(false);
recti pos = mainGame->wOptions->getRelativePosition();
......
......@@ -46,6 +46,7 @@ public:
std::vector<ClientCard*> conti_cards;
std::vector<std::pair<int,int>> activatable_descs;
std::vector<int> select_options;
std::vector<int> select_options_index;
std::vector<ChainInfo> chains;
int extra_p_count[2];
......@@ -85,6 +86,7 @@ public:
bool last_chain;
bool deck_reversed;
bool conti_selecting;
bool cant_check_grave;
ClientField();
void Clear();
......@@ -145,6 +147,7 @@ public:
ClientCard* clicked_card;
ClientCard* command_card;
ClientCard* highlighting_card;
ClientCard* menu_card;
int list_command;
virtual bool OnEvent(const irr::SEvent& event);
......@@ -165,5 +168,6 @@ public:
//special cards
#define CARD_MARINE_DOLPHIN 78734254
#define CARD_TWINKLE_MOSS 13857930
#define CARD_QUESTION 38723936
#endif //CLIENT_FIELD_H
......@@ -59,69 +59,10 @@ static bool check_set_code(const CardDataC& data, int set_code) {
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();
}
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() {
mainGame->is_building = true;
mainGame->is_siding = false;
......@@ -151,9 +92,7 @@ void DeckBuilder::Initialize() {
is_starting_dragging = false;
prev_deck = mainGame->cbDBDecks->getSelected();
prev_category = mainGame->cbDBCategory->getSelected();
readonly = prev_category < 2;
mainGame->btnSaveDeck->setEnabled(!readonly);
mainGame->btnDeleteDeck->setEnabled(!readonly);
RefreshReadonly(prev_category);
prev_operation = 0;
prev_sel = -1;
is_modified = false;
......@@ -211,7 +150,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
(mainGame->wQuery->isVisible() && id != BUTTON_YES && id != BUTTON_NO) ||
(mainGame->wLinkMarks->isVisible() && id != BUTTON_MARKERS_OK) ||
(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_COMBO_BOX_CHANGED) {
if(mainGame->wDMQuery->isVisible())
......@@ -277,14 +216,24 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
mainGame->cbDBDecks->addItem(dname);
mainGame->cbDBDecks->setSelected(mainGame->cbDBDecks->getItemCount() - 1);
}
int catesel = mainGame->cbDBCategory->getSelected();
wchar_t catepath[256];
deckManager.GetCategoryPath(catepath, mainGame->cbDBCategory->getSelected(), mainGame->cbDBCategory->getText());
deckManager.GetCategoryPath(catepath, catesel, mainGame->cbDBCategory->getText());
wchar_t filepath[256];
myswprintf(filepath, L"%ls/%ls.ydk", catepath, dname);
if(deckManager.SaveDeck(deckManager.current_deck, filepath)) {
mainGame->stACMessage->setText(dataManager.GetSysString(1335));
mainGame->PopupElement(mainGame->wACMessage, 20);
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;
}
......@@ -395,7 +344,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
prev_operation = id;
break;
}
showDeckManage();
ShowDeckManage();
break;
}
case BUTTON_NEW_CATEGORY: {
......@@ -414,7 +363,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
mainGame->gMutex.lock();
mainGame->stDMMessage->setText(dataManager.GetSysString(1469));
mainGame->ebDMName->setVisible(true);
mainGame->ebDMName->setText(L"");
mainGame->ebDMName->setText(mainGame->lstCategories->getListItem(mainGame->lstCategories->getSelected()));
mainGame->PopupElement(mainGame->wDMQuery);
mainGame->gMutex.unlock();
prev_operation = id;
......@@ -444,7 +393,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
mainGame->gMutex.lock();
mainGame->stDMMessage->setText(dataManager.GetSysString(1471));
mainGame->ebDMName->setVisible(true);
mainGame->ebDMName->setText(L"");
mainGame->ebDMName->setText(mainGame->lstDecks->getListItem(mainGame->lstDecks->getSelected()));
mainGame->PopupElement(mainGame->wDMQuery);
mainGame->gMutex.unlock();
prev_operation = id;
......@@ -468,7 +417,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
int catesel = mainGame->lstCategories->getSelected();
if(catesel != 2)
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)
mainGame->cbDMCategory->addItem(mainGame->lstCategories->getListItem(i));
}
......@@ -485,7 +434,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
int catesel = mainGame->lstCategories->getSelected();
if(catesel != 2)
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)
mainGame->cbDMCategory->addItem(mainGame->lstCategories->getListItem(i));
}
......@@ -503,9 +452,8 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
mainGame->cbDBCategory->addItem(catename);
mainGame->lstCategories->addItem(catename);
catesel = mainGame->lstCategories->getItemCount() - 1;
}
else {
for(int i = 3;i < mainGame->lstCategories->getItemCount();i++) {
} else {
for(int i = 3; i < mainGame->lstCategories->getItemCount(); i++) {
if(!wcsncasecmp(mainGame->lstCategories->getListItem(i), catename, 256)) {
catesel = i;
mainGame->stACMessage->setText(dataManager.GetSysString(1474));
......@@ -516,10 +464,10 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
}
if(catesel > 0) {
mainGame->lstCategories->setSelected(catesel);
refreshDeckList();
RefreshDeckList();
mainGame->lstDecks->setSelected(0);
mainGame->cbDBCategory->setSelected(catesel);
changeCategory(catesel);
ChangeCategory(catesel);
}
break;
}
......@@ -535,7 +483,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
catesel = mainGame->lstCategories->getItemCount() - 1;
} else {
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)) {
catesel = i;
mainGame->stACMessage->setText(dataManager.GetSysString(1474));
......@@ -546,10 +494,10 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
}
if(catesel > 0) {
mainGame->lstCategories->setSelected(catesel);
refreshDeckList();
RefreshDeckList();
mainGame->lstDecks->setSelected(0);
mainGame->cbDBCategory->setSelected(catesel);
changeCategory(catesel);
ChangeCategory(catesel);
}
break;
}
......@@ -561,10 +509,10 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
mainGame->lstCategories->removeItem(catesel);
catesel = 2;
mainGame->lstCategories->setSelected(catesel);
refreshDeckList();
RefreshDeckList();
mainGame->lstDecks->setSelected(0);
mainGame->cbDBCategory->setSelected(catesel);
changeCategory(catesel);
ChangeCategory(catesel);
} else {
mainGame->stACMessage->setText(dataManager.GetSysString(1476));
mainGame->PopupElement(mainGame->wACMessage, 20);
......@@ -583,10 +531,10 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
deckManager.current_deck.extra.clear();
deckManager.current_deck.side.clear();
res = deckManager.SaveDeck(deckManager.current_deck, filepath);
refreshDeckList();
changeCategory(mainGame->lstCategories->getSelected());
RefreshDeckList();
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)) {
deckManager.LoadDeck(filepath);
prev_deck = i;
......@@ -618,9 +566,9 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
if(!FileSystem::IsFileExists(newfilepath)) {
res = FileSystem::Rename(oldfilepath, newfilepath);
}
refreshDeckList();
changeCategory(catesel);
for(int i = 0;i < mainGame->lstDecks->getItemCount();i++) {
RefreshDeckList();
ChangeCategory(catesel);
for(int i = 0; i < mainGame->lstDecks->getItemCount(); i++) {
if(!wcsncasecmp(mainGame->lstDecks->getListItem(i), newdeckname, 256)) {
deckManager.LoadDeck(newfilepath);
prev_deck = i;
......@@ -651,7 +599,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
mainGame->cbDBDecks->setSelected(decksel);
deckManager.LoadDeck(mainGame->cbDBCategory, mainGame->cbDBDecks);
}
refreshReadonly(prev_category);
RefreshReadonly(prev_category);
prev_deck = decksel;
} else {
mainGame->stACMessage->setText(dataManager.GetSysString(1476));
......@@ -681,10 +629,10 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
}
mainGame->lstCategories->setSelected(newcatename);
int catesel = mainGame->lstCategories->getSelected();
refreshDeckList();
RefreshDeckList();
mainGame->cbDBCategory->setSelected(catesel);
changeCategory(catesel);
for(int i = 0;i < mainGame->lstDecks->getItemCount();i++) {
ChangeCategory(catesel);
for(int i = 0; i < mainGame->lstDecks->getItemCount(); i++) {
if(!wcsncasecmp(mainGame->lstDecks->getListItem(i), deckname, 256)) {
deckManager.LoadDeck(newfilepath);
prev_deck = i;
......@@ -719,10 +667,10 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
}
mainGame->lstCategories->setSelected(newcatename);
int catesel = mainGame->lstCategories->getSelected();
refreshDeckList();
RefreshDeckList();
mainGame->cbDBCategory->setSelected(catesel);
changeCategory(catesel);
for(int i = 0;i < mainGame->lstDecks->getItemCount();i++) {
ChangeCategory(catesel);
for(int i = 0; i < mainGame->lstDecks->getItemCount(); i++) {
if(!wcsncasecmp(mainGame->lstDecks->getListItem(i), deckname, 256)) {
deckManager.LoadDeck(newfilepath);
prev_deck = i;
......@@ -759,7 +707,8 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
break;
}
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.extra.size() != pre_extrac
|| deckManager.current_deck.side.size() != pre_sidec) {
mainGame->soundManager->PlaySoundEffect(SoundManager::SFX::INFO);
mainGame->env->addMessageBox(L"", dataManager.GetSysString(1410));
......@@ -820,14 +769,14 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
Terminate();
} else if(prev_operation == COMBOBOX_DBCATEGORY) {
int catesel = mainGame->cbDBCategory->getSelected();
changeCategory(catesel);
ChangeCategory(catesel);
} else if(prev_operation == COMBOBOX_DBDECKS) {
int decksel = mainGame->cbDBDecks->getSelected();
deckManager.LoadDeck(mainGame->cbDBCategory, mainGame->cbDBDecks);
prev_deck = decksel;
is_modified = false;
} else if(prev_operation == BUTTON_MANAGE_DECK) {
showDeckManage();
ShowDeckManage();
}
prev_operation = 0;
break;
......@@ -836,8 +785,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
mainGame->HideElement(mainGame->wQuery);
if(prev_operation == COMBOBOX_DBCATEGORY) {
mainGame->cbDBCategory->setSelected(prev_category);
}
else if(prev_operation == COMBOBOX_DBDECKS) {
} else if(prev_operation == COMBOBOX_DBDECKS) {
mainGame->cbDBDecks->setSelected(prev_deck);
}
prev_operation = 0;
......@@ -927,7 +875,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
prev_operation = id;
break;
}
changeCategory(catesel);
ChangeCategory(catesel);
break;
}
case COMBOBOX_DBDECKS: {
......@@ -1068,6 +1016,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
case COMBOBOX_LIMIT:
mainGame->env->setFocus(0);
InstantSearch();
break;
}
}
case irr::gui::EGET_LISTBOX_CHANGED: {
......@@ -1084,10 +1033,10 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
if(prev_category == catesel)
break;
}
refreshDeckList();
RefreshDeckList();
mainGame->lstDecks->setSelected(0);
mainGame->cbDBCategory->setSelected(catesel);
changeCategory(catesel);
ChangeCategory(catesel);
break;
}
case LISTBOX_DECKS: {
......@@ -1533,7 +1482,7 @@ void DeckBuilder::FilterCards() {
}
if(filter_effect && !(data.category & filter_effect))
continue;
if(filter_marks && (data.link_marker & filter_marks)!= filter_marks)
if(filter_marks && (data.link_marker & filter_marks) != filter_marks)
continue;
if(filter_lm) {
if(filter_lm <= 3 && (!filterList->count(ptr->first) || (*filterList).at(ptr->first) != filter_lm - 1))
......@@ -1650,6 +1599,68 @@ void DeckBuilder::SortList() {
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) {
/*
// Convert all symbols and punctuations to space.
......@@ -1670,22 +1681,21 @@ static inline wchar_t NormalizeChar(wchar_t c) {
}
return c;
}
bool DeckBuilder::CardNameContains(const wchar_t *haystack, const wchar_t *needle)
{
if (!needle[0]) {
bool DeckBuilder::CardNameContains(const wchar_t* haystack, const wchar_t* needle) {
if(!needle[0]) {
return true;
}
if (!haystack) {
if(!haystack) {
return false;
}
int i = 0;
int j = 0;
while (haystack[i]) {
while(haystack[i]) {
wchar_t ca = NormalizeChar(haystack[i]);
wchar_t cb = NormalizeChar(needle[j]);
if (ca == cb) {
if(ca == cb) {
j++;
if (!needle[j]) {
if(!needle[j]) {
return true;
}
} else {
......
......@@ -27,6 +27,11 @@ public:
void ClearSearch();
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 push_main(code_pointer pointer, int seq = -1);
......
......@@ -374,11 +374,13 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
int step = mainGame->scrOption->isVisible() ? mainGame->scrOption->getPos() : 0;
selected_option = id - BUTTON_OPTION_0 + step;
SetResponseSelectedOption();
ShowCancelOrFinishButton(0);
break;
}
case BUTTON_OPTION_OK: {
mainGame->soundManager->PlaySoundEffect(SoundManager::SFX::BUTTON);
SetResponseSelectedOption();
ShowCancelOrFinishButton(0);
break;
}
case BUTTON_ANNUMBER_1:
......@@ -432,22 +434,25 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
mainGame->wCmdMenu->setVisible(false);
ShowCancelOrFinishButton(0);
if(!list_command) {
int index = -1;
if(!menu_card)
break;
select_options.clear();
select_options_index.clear();
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)
continue;
if(activatable_descs[i].second == EDESC_RESET) {
else if(activatable_descs[i].second == EDESC_RESET) {
if(id == BUTTON_CMD_ACTIVATE) continue;
} else {
if(id == BUTTON_CMD_RESET) continue;
}
select_options.push_back(activatable_descs[i].first);
if (index == -1) index = i;
select_options_index.push_back(i);
}
}
if (select_options.size() == 1) {
int index = select_options_index[0];
if (mainGame->dInfo.curMsg == MSG_SELECT_IDLECMD) {
DuelClient::SetResponseI((index << 16) + 5);
} else if (mainGame->dInfo.curMsg == MSG_SELECT_BATTLECMD) {
......@@ -457,8 +462,10 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
}
DuelClient::SendResponse();
} else {
command_card = clicked_card;
command_card = menu_card;
ShowSelectOption();
select_ready = false;
ShowCancelOrFinishButton(1);
}
} else {
selectable_cards.clear();
......@@ -511,10 +518,10 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
}
case BUTTON_CMD_SUMMON: {
mainGame->wCmdMenu->setVisible(false);
if(!clicked_card)
if(!menu_card)
break;
for(size_t i = 0; i < summonable_cards.size(); ++i) {
if(summonable_cards[i] == clicked_card) {
if(summonable_cards[i] == menu_card) {
ClearCommandFlag();
DuelClient::SetResponseI(i << 16);
DuelClient::SendResponse();
......@@ -526,10 +533,10 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
case BUTTON_CMD_SPSUMMON: {
mainGame->wCmdMenu->setVisible(false);
if(!list_command) {
if(!clicked_card)
if(!menu_card)
break;
for(size_t i = 0; i < spsummonable_cards.size(); ++i) {
if(spsummonable_cards[i] == clicked_card) {
if(spsummonable_cards[i] == menu_card) {
ClearCommandFlag();
DuelClient::SetResponseI((i << 16) + 1);
DuelClient::SendResponse();
......@@ -568,10 +575,10 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
}
case BUTTON_CMD_MSET: {
mainGame->wCmdMenu->setVisible(false);
if(!clicked_card)
if(!menu_card)
break;
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::SendResponse();
break;
......@@ -581,10 +588,10 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
}
case BUTTON_CMD_SSET: {
mainGame->wCmdMenu->setVisible(false);
if(!clicked_card)
if(!menu_card)
break;
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::SendResponse();
break;
......@@ -594,10 +601,10 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
}
case BUTTON_CMD_REPOS: {
mainGame->wCmdMenu->setVisible(false);
if(!clicked_card)
if(!menu_card)
break;
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::SendResponse();
break;
......@@ -607,10 +614,10 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
}
case BUTTON_CMD_ATTACK: {
mainGame->wCmdMenu->setVisible(false);
if(!clicked_card)
if(!menu_card)
break;
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::SendResponse();
break;
......@@ -717,9 +724,9 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
break;
}
if(list_command == COMMAND_ACTIVATE || list_command == COMMAND_OPERATION) {
int index = -1;
command_card = selectable_cards[id - BUTTON_CARD_0 + mainGame->scrCardList->getPos() / 10];
select_options.clear();
select_options_index.clear();
for (size_t i = 0; i < activatable_cards.size(); ++i) {
if (activatable_cards[i] == command_card) {
if(activatable_descs[i].second == EDESC_OPERATION) {
......@@ -728,10 +735,11 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
if(list_command == COMMAND_OPERATION) continue;
}
select_options.push_back(activatable_descs[i].first);
if (index == -1) index = i;
select_options_index.push_back(i);
}
}
if (select_options.size() == 1) {
int index = select_options_index[0];
if (mainGame->dInfo.curMsg == MSG_SELECT_IDLECMD) {
DuelClient::SetResponseI((index << 16) + 5);
} else if (mainGame->dInfo.curMsg == MSG_SELECT_BATTLECMD) {
......@@ -959,6 +967,8 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
} else {
if(conti_selecting)
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)
myswprintf(formatBuffer, L"%ls[%d](%d)",
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) {
case LOCATION_GRAVE: {
if(grave[hovered_controler].size() == 0)
break;
if(cant_check_grave)
break;
ShowMenu(COMMAND_LIST, x, y);
break;
}
......@@ -1308,6 +1320,8 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
int command_flag = 0;
if(grave[hovered_controler].size() == 0)
break;
if(cant_check_grave)
break;
for(size_t i = 0; i < grave[hovered_controler].size(); ++i)
command_flag |= grave[hovered_controler][i]->cmdFlag;
command_flag |= COMMAND_LIST;
......@@ -1404,6 +1418,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
selected_field = 0;
DuelClient::SetResponseB(respbuf, p);
DuelClient::SendResponse();
ShowCancelOrFinishButton(0);
}
}
}
......@@ -1615,7 +1630,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
SetShowMark(hovered_card, false);
}
if(mcard) {
if(mcard != clicked_card)
if(mcard != menu_card)
mainGame->wCmdMenu->setVisible(false);
if(hovered_location == LOCATION_HAND) {
mcard->is_hovered = true;
......@@ -1753,6 +1768,8 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
case LOCATION_GRAVE: {
if(grave[hovered_controler].size() == 0)
break;
if(cant_check_grave)
break;
loc_id = 1004;
for(auto it = grave[hovered_controler].rbegin(); it != grave[hovered_controler].rend(); ++it)
display_cards.push_back(*it);
......@@ -1843,6 +1860,8 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
display_cards.clear();
switch(event.KeyInput.Key) {
case irr::KEY_F1:
if(cant_check_grave)
break;
loc_id = 1004;
for(auto it = grave[0].rbegin(); it != grave[0].rend(); ++it)
display_cards.push_back(*it);
......@@ -1867,6 +1886,8 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
}
break;
case irr::KEY_F5:
if(cant_check_grave)
break;
loc_id = 1004;
for(auto it = grave[1].rbegin(); it != grave[1].rend(); ++it)
display_cards.push_back(*it);
......@@ -2077,15 +2098,19 @@ bool ClientField::OnCommonEvent(const irr::SEvent& event) {
switch(event.KeyInput.Key) {
case irr::KEY_KEY_R: {
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->guiFont->setTransparency(true);
}
return true;
break;
}
case irr::KEY_F9: {
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->guiFont->setTransparency(true);
}
return true;
break;
}
......@@ -2499,6 +2524,7 @@ void ClientField::ShowMenu(int flag, int x, int y) {
mainGame->wCmdMenu->setVisible(false);
return;
}
menu_card = clicked_card;
int height = 0;
if(flag & COMMAND_ACTIVATE) {
mainGame->btnActivate->setVisible(true);
......@@ -2684,8 +2710,7 @@ void ClientField::SetResponseSelectedOption() const {
if(mainGame->dInfo.curMsg == MSG_SELECT_OPTION) {
DuelClient::SetResponseI(selected_option);
} else {
int index = 0;
while(activatable_cards[index] != command_card || activatable_descs[index].first != select_options[selected_option]) index++;
int index = select_options_index[selected_option];
if(mainGame->dInfo.curMsg == MSG_SELECT_IDLECMD) {
DuelClient::SetResponseI((index << 16) + 5);
} else if(mainGame->dInfo.curMsg == MSG_SELECT_BATTLECMD) {
......
......@@ -157,6 +157,7 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
break;
}
case BUTTON_HP_DUELIST: {
mainGame->cbCategorySelect->setEnabled(true);
mainGame->cbDeckSelect->setEnabled(true);
DuelClient::SendPacketToServer(CTOS_HS_TODUELIST);
break;
......@@ -604,6 +605,32 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
}
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: {
switch(id) {
case COMBOBOX_BOT_RULE: {
......@@ -637,32 +664,6 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
}
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;
}
break;
......
......@@ -182,7 +182,6 @@ public:
return success;
}
struct file_unit {
std::string filename;
bool is_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